⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 output.py

📁 编译工具
💻 PY
字号:
# -*- python -*-#                           Package   : omniidl# output.py                 Created on: 2000/8/10#			    Author    : David Scott (djs)##    Copyright (C) 1999 AT&T Laboratories Cambridge##  This file is part of omniidl.##  omniidl is free software; you can redistribute it and/or modify it#  under the terms of the GNU General Public License as published by#  the Free Software Foundation; either version 2 of the License, or#  (at your option) any later version.##  This program is distributed in the hope that it will be useful,#  but WITHOUT ANY WARRANTY; without even the implied warranty of#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU#  General Public License for more details.##  You should have received a copy of the GNU General Public License#  along with this program; if not, write to the Free Software#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA#  02111-1307, USA.## Description:#   #   Routines for managing output# $Id: output.py,v 1.1.4.6 2002/11/25 21:10:08 dgrisby Exp $# $Log: output.py,v $# Revision 1.1.4.6  2002/11/25 21:10:08  dgrisby# Friendly error messages if can't create files.## Revision 1.1.4.5  2001/08/15 10:29:53  dpg1# Update DSI to use Current, inProcessIdentity.## Revision 1.1.4.4  2001/04/10 10:55:31  dpg1# Minor fix to new output routine.## Revision 1.1.4.3  2001/03/26 11:11:54  dpg1# Python clean-ups. Output routine optimised.## Revision 1.1.4.2  2001/03/13 10:34:01  dpg1# Minor Python clean-ups## Revision 1.1.4.1  2000/10/12 15:37:48  sll# Updated from omni3_1_develop.## Revision 1.1.2.1  2000/08/21 11:34:35  djs# Lots of omniidl/C++ backend changes#"""Routines for managing output"""import string# Wrapper around the standard library file opening routines, keeps track of# which files have been created by the backend so they can be cleaned up on# error.createdFiles = []def createFile(filename):    try:        if filename in createdFiles:            file = open(filename, "a")        else:            file = open(filename, "w")            createdFiles.append(filename)        return file    except IOError:        import sys        sys.stderr.write("omniidl: Cannot open file '%s' for writing.\n" %                         filename)        sys.exit(1)def listAllCreatedFiles():    return createdFiles# Stream is a wrapper around a python file stream# StringStream is a string buffer with a stream interface## Holes in output template string can consist of:#   Strings - inserted as is#   StringStreams - converted into strings and inserted#   Integers - converted into strings (using str) and inserted#   Functions - stream is updated to reflect the current indent level#      and the function is applied (permitting template driven code#      rather than code-driving-template style)## Multiline strings are inserted at the same indent level eg## ~~~~~          ~~~~~#   @foo@   ->     ~~~~~~#                  ~~~~~~# ~~~~~          ~~~~~              ## Entire lines are buffered and if they consist of a preprocessor# directive ( ^\s*# ) the preceeding whitespace is trimmed.## Note that a line which is empty apart from a hole is still a complete# line even if the hole itself is empty. This commonly causes large blocks of# empty lines in the output. For aesthetic effect, runs of more than 1 empty# line are removed.def dummy(): passStringType = type("")FuncType   = type(dummy)class Stream:    def __init__(self, file, indent_size = 2):        self.file        = file        self.indent_size = indent_size        self.indent      = 0        self.do_indent   = 1    def inc_indent(self):   self.indent = self.indent + self.indent_size    def dec_indent(self):   self.indent = self.indent - self.indent_size    def reset_indent(self):        self.indent = 0    def out(self, text, ldict={}, **dict):        """Output a multi-line string with indentation and @@ substitution."""        dict.update(ldict)        pos    = 0        tlist  = string.split(text, "@")        ltlist = len(tlist)        i      = 0        while i < ltlist:            # Output plain text            pos = self.olines(pos, self.indent, tlist[i])            i = i + 1            if i == ltlist: break            # Evaluate @ expression            try:                expr = dict[tlist[i]]            except:                # If a straight look-up failed, try evaluating it                if tlist[i] == "":                    expr = "@"                else:                    expr = eval(tlist[i], globals(), dict)            if type(expr) is StringType:                pos = self.olines(pos, pos, expr)            elif type(expr) is FuncType:                oindent = self.indent                self.indent = pos                apply(expr)                self.indent = oindent            else:                pos = self.olines(pos, pos, str(expr))            i = i + 1        self.odone()    def niout(self, text, ldict={}, **dict):        """Output a multi-line string without indentation."""        dict.update(ldict)        pos    = 0        tlist  = string.split(text, "@")        ltlist = len(tlist)        i      = 0        while i < ltlist:            # Output plain text            pos = self.olines(pos, 0, tlist[i])            i = i + 1            if i == ltlist: break            # Evaluate @ expression            try:                expr = dict[tlist[i]]            except:                # If a straight look-up failed, try evaluating it                if tlist[i] == "":                    expr = "@"                else:                    expr = eval(tlist[i], globals(), dict)            if type(expr) is StringType:                pos = self.olines(pos, pos, expr)            elif type(expr) is FuncType:                oindent = self.indent                self.indent = pos                apply(expr)                self.indent = oindent            else:                pos = self.olines(pos, pos, str(expr))            i = i + 1        self.odone()    def olines(self, pos, indent, text):        istr  = " " * indent        write = self.file.write        stext = string.split(text, "\n")        lines = len(stext)        line  = stext[0]        if self.do_indent:            if line and line[0] == "#":                pos = 0            else:                pos = indent                write(istr)        write(line)        for i in range(1, lines):            line = stext[i]            write("\n")            if line:                if line[0] == "#":                    pos = 0                else:                    pos = indent                    write(istr)                write(line)        if lines > 1 and not line: # Newline at end of text            self.do_indent = 1            return self.indent        self.do_indent = 0        return pos + len(line)    def odone(self):        self.file.write("\n")        self.do_indent = 1    def close(self):        self.file.close()class StringStream(Stream):    """Writes to a string buffer rather than a file."""    def __init__(self, indent_size = 2):        Stream.__init__(self, self, indent_size)        self.buffer = []    def write(self, text):        self.buffer.append(text)    def __str__(self):        return string.join(self.buffer, "")

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -