diff options
Diffstat (limited to 'doc/sample_html/cogapp_cogapp.html')
-rw-r--r-- | doc/sample_html/cogapp_cogapp.html | 1418 |
1 files changed, 709 insertions, 709 deletions
diff --git a/doc/sample_html/cogapp_cogapp.html b/doc/sample_html/cogapp_cogapp.html index 6930fb5e..555756f3 100644 --- a/doc/sample_html/cogapp_cogapp.html +++ b/doc/sample_html/cogapp_cogapp.html @@ -749,715 +749,715 @@ function toggle_lines(btn, cls) { </td>
<td class='text' valign='top'>
-<p class='pln'>""" Cog code generation tool.</p>
-<p class='pln'> http://nedbatchelder.com/code/cog</p>
-<p class='pln'> </p>
-<p class='pln'> Copyright 2004-2009, Ned Batchelder.</p>
-<p class='pln'>"""</p>
-<p class='pln'> </p>
-<p class='stm run hide'>import copy, getopt, imp, os, re, shlex, string, sys, traceback</p>
-<p class='stm run hide'>from cStringIO import StringIO</p>
-<p class='pln'> </p>
-<p class='pln'># The recommended way to compute md5's changed in Python 2.5</p>
-<p class='stm run hide'>try:</p>
-<p class='stm run hide'> import hashlib</p>
-<p class='stm run hide'> hash_factory = hashlib.md5</p>
-<p class='stm mis'>except ImportError:</p>
-<p class='stm mis'> import md5</p>
-<p class='stm mis'> hash_factory = md5.new</p>
-<p class='pln'> </p>
-<p class='stm run hide'>__all__ = ['Cog', 'CogUsageError']</p>
-<p class='pln'> </p>
-<p class='stm run hide'>__version__ = '2.2' # History at the end of the file.</p>
-<p class='pln'> </p>
-<p class='stm run hide'>usage = """\</p>
-<p class='pln'>cog - generate code with inlined Python code.</p>
-<p class='pln'> </p>
-<p class='pln'>cog [OPTIONS] [INFILE | @FILELIST] ...</p>
-<p class='pln'> </p>
-<p class='pln'>INFILE is the name of an input file.</p>
-<p class='pln'>FILELIST is the name of a text file containing file names or</p>
-<p class='pln'> other @FILELISTs.</p>
-<p class='pln'> </p>
-<p class='pln'>OPTIONS:</p>
-<p class='pln'> -c Checksum the output to protect it against accidental change.</p>
-<p class='pln'> -d Delete the generator code from the output file.</p>
-<p class='pln'> -D name=val Define a global string available to your generator code.</p>
-<p class='pln'> -e Warn if a file has no cog code in it.</p>
-<p class='pln'> -I PATH Add PATH to the list of directories for data files and modules.</p>
-<p class='pln'> -o OUTNAME Write the output to OUTNAME.</p>
-<p class='pln'> -r Replace the input file with the output.</p>
-<p class='pln'> -s STRING Suffix all generated output lines with STRING.</p>
-<p class='pln'> -U Write the output with Unix newlines (only LF line-endings).</p>
-<p class='pln'> -w CMD Use CMD if the output file needs to be made writable.</p>
-<p class='pln'> A %s in the CMD will be filled with the filename.</p>
-<p class='pln'> -x Excise all the generated output without running the generators.</p>
-<p class='pln'> -z The [[[end]]] marker can be omitted, and is assumed at eof.</p>
-<p class='pln'> -v Print the version of cog and exit.</p>
-<p class='pln'> -h Print this help.</p>
-<p class='pln'>"""</p>
-<p class='pln'> </p>
-<p class='pln'># Other package modules</p>
-<p class='stm run hide'>from whiteutils import *</p>
-<p class='pln'> </p>
-<p class='stm run hide'>class CogError(Exception):</p>
-<p class='pln'> """ Any exception raised by Cog.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> def __init__(self, msg, file='', line=0):</p>
-<p class='stm run hide'> if file:</p>
-<p class='stm run hide'> Exception.__init__(self, "%s(%d): %s" % (file, line, msg))</p>
-<p class='pln'> else:</p>
-<p class='stm mis'> Exception.__init__(self, msg)</p>
-<p class='pln'> </p>
-<p class='stm run hide'>class CogUsageError(CogError):</p>
-<p class='pln'> """ An error in usage of command-line arguments in cog.</p>
-<p class='pln'> """</p>
-<p class='exc'> pass #pragma: no cover</p>
-<p class='pln'> </p>
-<p class='stm run hide'>class CogInternalError(CogError):</p>
-<p class='pln'> """ An error in the coding of Cog. Should never happen.</p>
-<p class='pln'> """</p>
-<p class='exc'> pass #pragma: no cover</p>
-<p class='pln'> </p>
-<p class='stm run hide'>class CogGeneratedError(CogError):</p>
-<p class='pln'> """ An error raised by a user's cog generator.</p>
-<p class='pln'> """</p>
-<p class='exc'> pass #pragma: no cover</p>
-<p class='pln'> </p>
-<p class='stm run hide'>class Redirectable:</p>
-<p class='pln'> """ An object with its own stdout and stderr files.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> def __init__(self):</p>
-<p class='stm run hide'> self.stdout = sys.stdout</p>
-<p class='stm run hide'> self.stderr = sys.stderr</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def setOutput(self, stdout=None, stderr=None):</p>
-<p class='pln'> """ Assign new files for standard out and/or standard error.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> if stdout:</p>
-<p class='stm run hide'> self.stdout = stdout</p>
-<p class='stm run hide'> if stderr:</p>
-<p class='stm mis'> self.stderr = stderr</p>
-<p class='pln'> </p>
-<p class='stm run hide'>class CogGenerator(Redirectable):</p>
-<p class='pln'> """ A generator pulled from a source file.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> def __init__(self):</p>
-<p class='stm run hide'> Redirectable.__init__(self)</p>
-<p class='stm run hide'> self.markers = []</p>
-<p class='stm run hide'> self.lines = []</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def parseMarker(self, l):</p>
-<p class='stm run hide'> self.markers.append(l)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def parseLine(self, l):</p>
-<p class='stm run hide'> self.lines.append(l.strip('\n'))</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def getCode(self):</p>
-<p class='pln'> """ Extract the executable Python code from the generator.</p>
-<p class='pln'> """</p>
-<p class='pln'> # If the markers and lines all have the same prefix</p>
-<p class='pln'> # (end-of-line comment chars, for example),</p>
-<p class='pln'> # then remove it from all the lines.</p>
-<p class='stm run hide'> prefIn = commonPrefix(self.markers + self.lines)</p>
-<p class='stm run hide'> if prefIn:</p>
-<p class='stm run hide'> self.markers = [ l.replace(prefIn, '', 1) for l in self.markers ]</p>
-<p class='stm run hide'> self.lines = [ l.replace(prefIn, '', 1) for l in self.lines ]</p>
-<p class='pln'> </p>
-<p class='stm run hide'> return reindentBlock(self.lines, '')</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def evaluate(self, cog, globals, fname='cog generator'):</p>
-<p class='pln'> # figure out the right whitespace prefix for the output</p>
-<p class='stm run hide'> prefOut = whitePrefix(self.markers)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> intext = self.getCode()</p>
-<p class='stm run hide'> if not intext:</p>
-<p class='stm run hide'> return ''</p>
-<p class='pln'> </p>
-<p class='pln'> # In Python 2.2, the last line has to end in a newline.</p>
-<p class='stm run hide'> intext = "import cog\n" + intext + "\n"</p>
-<p class='stm run hide'> code = compile(intext, str(fname), 'exec')</p>
-<p class='pln'> </p>
-<p class='pln'> # Make sure the "cog" module has our state.</p>
-<p class='stm run hide'> cog.cogmodule.msg = self.msg</p>
-<p class='stm run hide'> cog.cogmodule.out = self.out</p>
-<p class='stm run hide'> cog.cogmodule.outl = self.outl</p>
-<p class='stm run hide'> cog.cogmodule.error = self.error</p>
-<p class='pln'> </p>
-<p class='stm run hide'> self.outstring = ''</p>
-<p class='stm run hide'> eval(code, globals)</p>
-<p class='pln'> </p>
-<p class='pln'> # We need to make sure that the last line in the output</p>
-<p class='pln'> # ends with a newline, or it will be joined to the</p>
-<p class='pln'> # end-output line, ruining cog's idempotency.</p>
-<p class='stm run hide'> if self.outstring and self.outstring[-1] != '\n':</p>
-<p class='stm run hide'> self.outstring += '\n'</p>
-<p class='pln'> </p>
-<p class='stm run hide'> return reindentBlock(self.outstring, prefOut)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def msg(self, s):</p>
-<p class='stm mis'> print >>self.stdout, "Message: "+s</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def out(self, sOut='', dedent=False, trimblanklines=False):</p>
-<p class='pln'> """ The cog.out function.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> if trimblanklines and ('\n' in sOut):</p>
-<p class='stm run hide'> lines = sOut.split('\n')</p>
-<p class='stm run hide'> if lines[0].strip() == '':</p>
-<p class='stm run hide'> del lines[0]</p>
-<p class='stm run hide'> if lines and lines[-1].strip() == '':</p>
-<p class='stm run hide'> del lines[-1]</p>
-<p class='stm run hide'> sOut = '\n'.join(lines)+'\n'</p>
-<p class='stm run hide'> if dedent:</p>
-<p class='stm run hide'> sOut = reindentBlock(sOut)</p>
-<p class='stm run hide'> self.outstring += sOut</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def outl(self, sOut='', **kw):</p>
-<p class='pln'> """ The cog.outl function.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> self.out(sOut, **kw)</p>
-<p class='stm run hide'> self.out('\n')</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def error(self, msg='Error raised by cog generator.'):</p>
-<p class='pln'> """ The cog.error function.</p>
-<p class='pln'> Instead of raising standard python errors, cog generators can use</p>
-<p class='pln'> this function. It will display the error without a scary Python</p>
-<p class='pln'> traceback.</p>
-<p class='pln'> """</p>
-<p class='stm mis'> raise CogGeneratedError(msg)</p>
-<p class='pln'> </p>
-<p class='pln'> </p>
-<p class='stm run hide'>class NumberedFileReader:</p>
-<p class='pln'> """ A decorator for files that counts the readline()'s called.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> def __init__(self, f):</p>
-<p class='stm run hide'> self.f = f</p>
-<p class='stm run hide'> self.n = 0</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def readline(self):</p>
-<p class='stm run hide'> l = self.f.readline()</p>
-<p class='stm run hide'> if l:</p>
-<p class='stm run hide'> self.n += 1</p>
-<p class='stm run hide'> return l</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def linenumber(self):</p>
-<p class='stm run hide'> return self.n</p>
-<p class='pln'> </p>
-<p class='pln'> </p>
-<p class='stm run hide'>class CogOptions:</p>
-<p class='pln'> """ Options for a run of cog.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> def __init__(self):</p>
-<p class='pln'> # Defaults for argument values.</p>
-<p class='stm run hide'> self.args = []</p>
-<p class='stm run hide'> self.includePath = []</p>
-<p class='stm run hide'> self.defines = {}</p>
-<p class='stm run hide'> self.bShowVersion = False</p>
-<p class='stm run hide'> self.sMakeWritableCmd = None</p>
-<p class='stm run hide'> self.bReplace = False</p>
-<p class='stm run hide'> self.bNoGenerate = False</p>
-<p class='stm run hide'> self.sOutputName = None</p>
-<p class='stm run hide'> self.bWarnEmpty = False</p>
-<p class='stm run hide'> self.bHashOutput = False</p>
-<p class='stm run hide'> self.bDeleteCode = False</p>
-<p class='stm run hide'> self.bEofCanBeEnd = False</p>
-<p class='stm run hide'> self.sSuffix = None</p>
-<p class='stm run hide'> self.bNewlines = False</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def __cmp__(self, other):</p>
-<p class='pln'> """ Comparison operator for tests to use.</p>
-<p class='pln'> """</p>
-<p class='stm mis'> return self.__dict__.__cmp__(other.__dict__)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def clone(self):</p>
-<p class='pln'> """ Make a clone of these options, for further refinement.</p>
-<p class='pln'> """</p>
-<p class='stm mis'> return copy.deepcopy(self)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def addToIncludePath(self, dirs):</p>
-<p class='pln'> """ Add directories to the include path.</p>
-<p class='pln'> """</p>
-<p class='stm mis'> dirs = dirs.split(os.pathsep)</p>
-<p class='stm mis'> self.includePath.extend(dirs)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def parseArgs(self, argv):</p>
-<p class='pln'> # Parse the command line arguments.</p>
-<p class='stm mis'> try:</p>
-<p class='stm mis'> opts, self.args = getopt.getopt(argv, 'cdD:eI:o:rs:Uvw:xz')</p>
-<p class='stm mis'> except getopt.error, msg:</p>
-<p class='stm mis'> raise CogUsageError(msg)</p>
-<p class='pln'> </p>
-<p class='pln'> # Handle the command line arguments.</p>
-<p class='stm mis'> for o, a in opts:</p>
-<p class='stm mis'> if o == '-c':</p>
-<p class='stm mis'> self.bHashOutput = True</p>
-<p class='stm mis'> elif o == '-d':</p>
-<p class='stm mis'> self.bDeleteCode = True</p>
-<p class='stm mis'> elif o == '-D':</p>
-<p class='stm mis'> if a.count('=') < 1:</p>
-<p class='stm mis'> raise CogUsageError("-D takes a name=value argument")</p>
-<p class='stm mis'> name, value = a.split('=', 1)</p>
-<p class='stm mis'> self.defines[name] = value</p>
-<p class='stm mis'> elif o == '-e':</p>
-<p class='stm mis'> self.bWarnEmpty = True</p>
-<p class='stm mis'> elif o == '-I':</p>
-<p class='stm mis'> self.addToIncludePath(a)</p>
-<p class='stm mis'> elif o == '-o':</p>
-<p class='stm mis'> self.sOutputName = a</p>
-<p class='stm mis'> elif o == '-r':</p>
-<p class='stm mis'> self.bReplace = True</p>
-<p class='stm mis'> elif o == '-s':</p>
-<p class='stm mis'> self.sSuffix = a</p>
-<p class='stm mis'> elif o == '-U':</p>
-<p class='stm mis'> self.bNewlines = True</p>
-<p class='stm mis'> elif o == '-v':</p>
-<p class='stm mis'> self.bShowVersion = True</p>
-<p class='stm mis'> elif o == '-w':</p>
-<p class='stm mis'> self.sMakeWritableCmd = a</p>
-<p class='stm mis'> elif o == '-x':</p>
-<p class='stm mis'> self.bNoGenerate = True</p>
-<p class='stm mis'> elif o == '-z':</p>
-<p class='stm mis'> self.bEofCanBeEnd = True</p>
-<p class='pln'> else:</p>
-<p class='pln'> # Since getopt.getopt is given a list of possible flags,</p>
-<p class='pln'> # this is an internal error.</p>
-<p class='stm mis'> raise CogInternalError("Don't understand argument %s" % o)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def validate(self):</p>
-<p class='pln'> """ Does nothing if everything is OK, raises CogError's if it's not.</p>
-<p class='pln'> """</p>
-<p class='stm mis'> if self.bReplace and self.bDeleteCode:</p>
-<p class='stm mis'> raise CogUsageError("Can't use -d with -r (or you would delete all your source!)")</p>
-<p class='pln'> </p>
-<p class='stm mis'> if self.bReplace and self.sOutputName:</p>
-<p class='stm mis'> raise CogUsageError("Can't use -o with -r (they are opposites)")</p>
-<p class='pln'> </p>
-<p class='pln'> </p>
-<p class='stm run hide'>class Cog(Redirectable):</p>
-<p class='pln'> """ The Cog engine.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> def __init__(self):</p>
-<p class='stm run hide'> Redirectable.__init__(self)</p>
-<p class='stm run hide'> self.sBeginSpec = '[[[cog'</p>
-<p class='stm run hide'> self.sEndSpec = ']]]'</p>
-<p class='stm run hide'> self.sEndOutput = '[[[end]]]'</p>
-<p class='stm run hide'> self.reEndOutput = re.compile(r'\[\[\[end]]](?P<hashsect> *\(checksum: (?P<hash>[a-f0-9]+)\))')</p>
-<p class='stm run hide'> self.sEndFormat = '[[[end]]] (checksum: %s)'</p>
-<p class='pln'> </p>
-<p class='stm run hide'> self.options = CogOptions()</p>
-<p class='stm run hide'> self.sOutputMode = 'w'</p>
-<p class='pln'> </p>
-<p class='stm run hide'> self.installCogModule()</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def showWarning(self, msg):</p>
-<p class='stm mis'> print >>self.stdout, "Warning:", msg</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def isBeginSpecLine(self, s):</p>
-<p class='stm run hide'> return string.find(s, self.sBeginSpec) >= 0</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def isEndSpecLine(self, s):</p>
-<p class='stm run hide'> return string.find(s, self.sEndSpec) >= 0 and \</p>
-<p class='pln'> not self.isEndOutputLine(s)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def isEndOutputLine(self, s):</p>
-<p class='stm run hide'> return string.find(s, self.sEndOutput) >= 0</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def installCogModule(self):</p>
-<p class='pln'> """ Magic mumbo-jumbo so that imported Python modules</p>
-<p class='pln'> can say "import cog" and get our state.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> self.cogmodule = imp.new_module('cog')</p>
-<p class='stm run hide'> self.cogmodule.path = []</p>
-<p class='stm run hide'> sys.modules['cog'] = self.cogmodule</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def processFile(self, fIn, fOut, fname=None, globals=None):</p>
-<p class='pln'> """ Process an input file object to an output file object.</p>
-<p class='pln'> fIn and fOut can be file objects, or file names.</p>
-<p class='pln'> """</p>
-<p class='pln'> </p>
-<p class='stm run hide'> sFileIn = fname or ''</p>
-<p class='stm run hide'> sFileOut = fname or ''</p>
-<p class='stm run hide'> fInToClose = fOutToClose = None</p>
-<p class='pln'> # Convert filenames to files.</p>
-<p class='stm run hide'> if isinstance(fIn, basestring):</p>
-<p class='pln'> # Open the input file.</p>
-<p class='stm mis'> sFileIn = fIn</p>
-<p class='stm mis'> fIn = fInToClose = open(fIn, 'r')</p>
-<p class='stm run hide'> if isinstance(fOut, basestring):</p>
-<p class='pln'> # Open the output file.</p>
-<p class='stm mis'> sFileOut = fOut</p>
-<p class='stm mis'> fOut = fOutToClose = open(fOut, self.sOutputMode)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> try:</p>
-<p class='stm run hide'> fIn = NumberedFileReader(fIn)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> bSawCog = False</p>
-<p class='pln'> </p>
-<p class='stm run hide'> self.cogmodule.inFile = sFileIn</p>
-<p class='stm run hide'> self.cogmodule.outFile = sFileOut</p>
-<p class='pln'> </p>
-<p class='pln'> # The globals dict we'll use for this file.</p>
-<p class='stm run hide'> if globals is None:</p>
-<p class='stm run hide'> globals = {}</p>
-<p class='pln'> </p>
-<p class='pln'> # If there are any global defines, put them in the globals.</p>
-<p class='stm run hide'> globals.update(self.options.defines)</p>
-<p class='pln'> </p>
-<p class='pln'> # loop over generator chunks</p>
-<p class='stm run hide'> l = fIn.readline()</p>
-<p class='stm run hide'> while l:</p>
-<p class='pln'> # Find the next spec begin</p>
-<p class='stm run hide'> while l and not self.isBeginSpecLine(l):</p>
-<p class='stm run hide'> if self.isEndSpecLine(l):</p>
-<p class='stm mis'> raise CogError("Unexpected '%s'" % self.sEndSpec,</p>
-<p class='pln'> file=sFileIn, line=fIn.linenumber())</p>
-<p class='stm run hide'> if self.isEndOutputLine(l):</p>
-<p class='stm mis'> raise CogError("Unexpected '%s'" % self.sEndOutput,</p>
-<p class='pln'> file=sFileIn, line=fIn.linenumber())</p>
-<p class='stm run hide'> fOut.write(l)</p>
-<p class='stm run hide'> l = fIn.readline()</p>
-<p class='stm run hide'> if not l:</p>
-<p class='stm run hide'> break</p>
-<p class='stm run hide'> if not self.options.bDeleteCode:</p>
-<p class='stm run hide'> fOut.write(l)</p>
-<p class='pln'> </p>
-<p class='pln'> # l is the begin spec</p>
-<p class='stm run hide'> gen = CogGenerator()</p>
-<p class='stm run hide'> gen.setOutput(stdout=self.stdout)</p>
-<p class='stm run hide'> gen.parseMarker(l)</p>
-<p class='stm run hide'> firstLineNum = fIn.linenumber()</p>
-<p class='stm run hide'> self.cogmodule.firstLineNum = firstLineNum</p>
-<p class='pln'> </p>
-<p class='pln'> # If the spec begin is also a spec end, then process the single</p>
-<p class='pln'> # line of code inside.</p>
-<p class='stm run hide'> if self.isEndSpecLine(l):</p>
-<p class='stm run hide'> beg = string.find(l, self.sBeginSpec)</p>
-<p class='stm run hide'> end = string.find(l, self.sEndSpec)</p>
-<p class='stm run hide'> if beg > end:</p>
-<p class='stm run hide'> raise CogError("Cog code markers inverted",</p>
-<p class='pln'> file=sFileIn, line=firstLineNum)</p>
-<p class='pln'> else:</p>
-<p class='stm run hide'> sCode = l[beg+len(self.sBeginSpec):end].strip()</p>
-<p class='stm run hide'> gen.parseLine(sCode)</p>
-<p class='pln'> else:</p>
-<p class='pln'> # Deal with an ordinary code block.</p>
-<p class='stm run hide'> l = fIn.readline()</p>
-<p class='pln'> </p>
-<p class='pln'> # Get all the lines in the spec</p>
-<p class='stm run hide'> while l and not self.isEndSpecLine(l):</p>
-<p class='stm run hide'> if self.isBeginSpecLine(l):</p>
-<p class='stm mis'> raise CogError("Unexpected '%s'" % self.sBeginSpec,</p>
-<p class='pln'> file=sFileIn, line=fIn.linenumber())</p>
-<p class='stm run hide'> if self.isEndOutputLine(l):</p>
-<p class='stm mis'> raise CogError("Unexpected '%s'" % self.sEndOutput,</p>
-<p class='pln'> file=sFileIn, line=fIn.linenumber())</p>
-<p class='stm run hide'> if not self.options.bDeleteCode:</p>
-<p class='stm run hide'> fOut.write(l)</p>
-<p class='stm run hide'> gen.parseLine(l)</p>
-<p class='stm run hide'> l = fIn.readline()</p>
-<p class='stm run hide'> if not l:</p>
-<p class='stm mis'> raise CogError(</p>
-<p class='pln'> "Cog block begun but never ended.",</p>
-<p class='pln'> file=sFileIn, line=firstLineNum)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> if not self.options.bDeleteCode:</p>
-<p class='stm run hide'> fOut.write(l)</p>
-<p class='stm run hide'> gen.parseMarker(l)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> l = fIn.readline()</p>
-<p class='pln'> </p>
-<p class='pln'> # Eat all the lines in the output section. While reading past</p>
-<p class='pln'> # them, compute the md5 hash of the old output.</p>
-<p class='stm run hide'> hasher = hash_factory()</p>
-<p class='stm run hide'> while l and not self.isEndOutputLine(l):</p>
-<p class='stm run hide'> if self.isBeginSpecLine(l):</p>
-<p class='stm mis'> raise CogError("Unexpected '%s'" % self.sBeginSpec,</p>
-<p class='pln'> file=sFileIn, line=fIn.linenumber())</p>
-<p class='stm run hide'> if self.isEndSpecLine(l):</p>
-<p class='stm mis'> raise CogError("Unexpected '%s'" % self.sEndSpec,</p>
-<p class='pln'> file=sFileIn, line=fIn.linenumber())</p>
-<p class='stm run hide'> hasher.update(l)</p>
-<p class='stm run hide'> l = fIn.readline()</p>
-<p class='stm run hide'> curHash = hasher.hexdigest()</p>
-<p class='pln'> </p>
-<p class='stm run hide'> if not l and not self.options.bEofCanBeEnd:</p>
-<p class='pln'> # We reached end of file before we found the end output line.</p>
-<p class='stm mis'> raise CogError("Missing '%s' before end of file." % self.sEndOutput,</p>
-<p class='pln'> file=sFileIn, line=fIn.linenumber())</p>
-<p class='pln'> </p>
-<p class='pln'> # Write the output of the spec to be the new output if we're</p>
-<p class='pln'> # supposed to generate code.</p>
-<p class='stm run hide'> hasher = hash_factory()</p>
-<p class='stm run hide'> if not self.options.bNoGenerate:</p>
-<p class='stm run hide'> sFile = "%s+%d" % (sFileIn, firstLineNum)</p>
-<p class='stm run hide'> sGen = gen.evaluate(cog=self, globals=globals, fname=sFile)</p>
-<p class='stm run hide'> sGen = self.suffixLines(sGen)</p>
-<p class='stm run hide'> hasher.update(sGen)</p>
-<p class='stm run hide'> fOut.write(sGen)</p>
-<p class='stm run hide'> newHash = hasher.hexdigest()</p>
-<p class='pln'> </p>
-<p class='stm run hide'> bSawCog = True</p>
-<p class='pln'> </p>
-<p class='pln'> # Write the ending output line</p>
-<p class='stm run hide'> hashMatch = self.reEndOutput.search(l)</p>
-<p class='stm run hide'> if self.options.bHashOutput:</p>
-<p class='stm mis'> if hashMatch:</p>
-<p class='stm mis'> oldHash = hashMatch.groupdict()['hash']</p>
-<p class='stm mis'> if oldHash != curHash:</p>
-<p class='stm mis'> raise CogError("Output has been edited! Delete old checksum to unprotect.",</p>
-<p class='pln'> file=sFileIn, line=fIn.linenumber())</p>
-<p class='pln'> # Create a new end line with the correct hash.</p>
-<p class='stm mis'> endpieces = l.split(hashMatch.group(0), 1)</p>
-<p class='pln'> else:</p>
-<p class='pln'> # There was no old hash, but we want a new hash.</p>
-<p class='stm mis'> endpieces = l.split(self.sEndOutput, 1)</p>
-<p class='stm mis'> l = (self.sEndFormat % newHash).join(endpieces)</p>
-<p class='pln'> else:</p>
-<p class='pln'> # We don't want hashes output, so if there was one, get rid of</p>
-<p class='pln'> # it.</p>
-<p class='stm run hide'> if hashMatch:</p>
-<p class='stm mis'> l = l.replace(hashMatch.groupdict()['hashsect'], '', 1)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> if not self.options.bDeleteCode:</p>
-<p class='stm run hide'> fOut.write(l)</p>
-<p class='stm run hide'> l = fIn.readline()</p>
-<p class='pln'> </p>
-<p class='stm run hide'> if not bSawCog and self.options.bWarnEmpty:</p>
-<p class='stm mis'> self.showWarning("no cog code found in %s" % sFileIn)</p>
-<p class='pln'> finally:</p>
-<p class='stm run hide'> if fInToClose:</p>
-<p class='stm mis'> fInToClose.close()</p>
-<p class='stm run hide'> if fOutToClose:</p>
-<p class='stm mis'> fOutToClose.close()</p>
-<p class='pln'> </p>
-<p class='pln'> </p>
-<p class='pln'> # A regex for non-empty lines, used by suffixLines.</p>
-<p class='stm run hide'> reNonEmptyLines = re.compile("^\s*\S+.*$", re.MULTILINE)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def suffixLines(self, text):</p>
-<p class='pln'> """ Add suffixes to the lines in text, if our options desire it.</p>
-<p class='pln'> text is many lines, as a single string.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> if self.options.sSuffix:</p>
-<p class='pln'> # Find all non-blank lines, and add the suffix to the end.</p>
-<p class='stm mis'> repl = r"\g<0>" + self.options.sSuffix.replace('\\', '\\\\')</p>
-<p class='stm mis'> text = self.reNonEmptyLines.sub(repl, text)</p>
-<p class='stm run hide'> return text</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def processString(self, sInput, fname=None):</p>
-<p class='pln'> """ Process sInput as the text to cog.</p>
-<p class='pln'> Return the cogged output as a string.</p>
-<p class='pln'> """</p>
-<p class='stm run hide'> fOld = StringIO(sInput)</p>
-<p class='stm run hide'> fNew = StringIO()</p>
-<p class='stm run hide'> self.processFile(fOld, fNew, fname=fname)</p>
-<p class='stm run hide'> return fNew.getvalue()</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def replaceFile(self, sOldPath, sNewText):</p>
-<p class='pln'> """ Replace file sOldPath with the contents sNewText</p>
-<p class='pln'> """</p>
-<p class='stm mis'> if not os.access(sOldPath, os.W_OK):</p>
-<p class='pln'> # Need to ensure we can write.</p>
-<p class='stm mis'> if self.options.sMakeWritableCmd:</p>
-<p class='pln'> # Use an external command to make the file writable.</p>
-<p class='stm mis'> cmd = self.options.sMakeWritableCmd.replace('%s', sOldPath)</p>
-<p class='stm mis'> self.stdout.write(os.popen(cmd).read())</p>
-<p class='stm mis'> if not os.access(sOldPath, os.W_OK):</p>
-<p class='stm mis'> raise CogError("Couldn't make %s writable" % sOldPath)</p>
-<p class='pln'> else:</p>
-<p class='pln'> # Can't write!</p>
-<p class='stm mis'> raise CogError("Can't overwrite %s" % sOldPath)</p>
-<p class='stm mis'> f = open(sOldPath, self.sOutputMode)</p>
-<p class='stm mis'> f.write(sNewText)</p>
-<p class='stm mis'> f.close()</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def saveIncludePath(self):</p>
-<p class='stm mis'> self.savedInclude = self.options.includePath[:]</p>
-<p class='stm mis'> self.savedSysPath = sys.path[:]</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def restoreIncludePath(self):</p>
-<p class='stm mis'> self.options.includePath = self.savedInclude</p>
-<p class='stm mis'> self.cogmodule.path = self.options.includePath</p>
-<p class='stm mis'> sys.path = self.savedSysPath</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def addToIncludePath(self, includePath):</p>
-<p class='stm mis'> self.cogmodule.path.extend(includePath)</p>
-<p class='stm mis'> sys.path.extend(includePath)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def processOneFile(self, sFile):</p>
-<p class='pln'> """ Process one filename through cog.</p>
-<p class='pln'> """</p>
-<p class='pln'> </p>
-<p class='stm mis'> self.saveIncludePath()</p>
-<p class='pln'> </p>
-<p class='stm mis'> try:</p>
-<p class='stm mis'> self.addToIncludePath(self.options.includePath)</p>
-<p class='pln'> # Since we know where the input file came from,</p>
-<p class='pln'> # push its directory onto the include path.</p>
-<p class='stm mis'> self.addToIncludePath([os.path.dirname(sFile)])</p>
-<p class='pln'> </p>
-<p class='pln'> # Set the file output mode based on whether we want \n or native</p>
-<p class='pln'> # line endings.</p>
-<p class='stm mis'> self.sOutputMode = 'w'</p>
-<p class='stm mis'> if self.options.bNewlines:</p>
-<p class='stm mis'> self.sOutputMode = 'wb'</p>
-<p class='pln'> </p>
-<p class='pln'> # How we process the file depends on where the output is going.</p>
-<p class='stm mis'> if self.options.sOutputName:</p>
-<p class='stm mis'> self.processFile(sFile, self.options.sOutputName, sFile)</p>
-<p class='stm mis'> elif self.options.bReplace:</p>
-<p class='pln'> # We want to replace the cog file with the output,</p>
-<p class='pln'> # but only if they differ.</p>
-<p class='stm mis'> print >>self.stdout, "Cogging %s" % sFile,</p>
-<p class='stm mis'> bNeedNewline = True</p>
-<p class='pln'> </p>
-<p class='stm mis'> try:</p>
-<p class='stm mis'> fOldFile = open(sFile)</p>
-<p class='stm mis'> sOldText = fOldFile.read()</p>
-<p class='stm mis'> fOldFile.close()</p>
-<p class='stm mis'> sNewText = self.processString(sOldText, fname=sFile)</p>
-<p class='stm mis'> if sOldText != sNewText:</p>
-<p class='stm mis'> print >>self.stdout, " (changed)"</p>
-<p class='stm mis'> bNeedNewline = False</p>
-<p class='stm mis'> self.replaceFile(sFile, sNewText)</p>
-<p class='pln'> finally:</p>
-<p class='pln'> # The try-finally block is so we can print a partial line</p>
-<p class='pln'> # with the name of the file, and print (changed) on the</p>
-<p class='pln'> # same line, but also make sure to break the line before</p>
-<p class='pln'> # any traceback.</p>
-<p class='stm mis'> if bNeedNewline:</p>
-<p class='stm mis'> print >>self.stdout</p>
-<p class='pln'> else:</p>
-<p class='stm mis'> self.processFile(sFile, self.stdout, sFile)</p>
-<p class='pln'> finally:</p>
-<p class='stm mis'> self.restoreIncludePath()</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def processFileList(self, sFileList):</p>
-<p class='pln'> """ Process the files in a file list.</p>
-<p class='pln'> """</p>
-<p class='stm mis'> flist = open(sFileList)</p>
-<p class='stm mis'> lines = flist.readlines()</p>
-<p class='stm mis'> flist.close()</p>
-<p class='stm mis'> for l in lines:</p>
-<p class='pln'> # Use shlex to parse the line like a shell.</p>
-<p class='stm mis'> lex = shlex.shlex(l, posix=True)</p>
-<p class='stm mis'> lex.whitespace_split = True</p>
-<p class='stm mis'> lex.commenters = '#'</p>
-<p class='pln'> # No escapes, so that backslash can be part of the path</p>
-<p class='stm mis'> lex.escape = ''</p>
-<p class='stm mis'> args = list(lex)</p>
-<p class='stm mis'> if args:</p>
-<p class='stm mis'> self.processArguments(args)</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def processArguments(self, args):</p>
-<p class='pln'> """ Process one command-line.</p>
-<p class='pln'> """</p>
-<p class='stm mis'> saved_options = self.options</p>
-<p class='stm mis'> self.options = self.options.clone()</p>
-<p class='pln'> </p>
-<p class='stm mis'> self.options.parseArgs(args[1:])</p>
-<p class='stm mis'> self.options.validate()</p>
-<p class='pln'> </p>
-<p class='stm mis'> if args[0][0] == '@':</p>
-<p class='stm mis'> if self.options.sOutputName:</p>
-<p class='stm mis'> raise CogUsageError("Can't use -o with @file")</p>
-<p class='stm mis'> self.processFileList(args[0][1:])</p>
-<p class='pln'> else:</p>
-<p class='stm mis'> self.processOneFile(args[0])</p>
-<p class='pln'> </p>
-<p class='stm mis'> self.options = saved_options</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def callableMain(self, argv):</p>
-<p class='pln'> """ All of command-line cog, but in a callable form.</p>
-<p class='pln'> This is used by main.</p>
-<p class='pln'> argv is the equivalent of sys.argv.</p>
-<p class='pln'> """</p>
-<p class='stm mis'> argv0 = argv.pop(0)</p>
-<p class='pln'> </p>
-<p class='pln'> # Provide help if asked for anywhere in the command line.</p>
-<p class='stm mis'> if '-?' in argv or '-h' in argv:</p>
-<p class='stm mis'> print >>self.stderr, usage,</p>
-<p class='stm mis'> return</p>
-<p class='pln'> </p>
-<p class='stm mis'> self.options.parseArgs(argv)</p>
-<p class='stm mis'> self.options.validate()</p>
-<p class='pln'> </p>
-<p class='stm mis'> if self.options.bShowVersion:</p>
-<p class='stm mis'> print >>self.stdout, "Cog version %s" % __version__</p>
-<p class='stm mis'> return</p>
-<p class='pln'> </p>
-<p class='stm mis'> if self.options.args:</p>
-<p class='stm mis'> for a in self.options.args:</p>
-<p class='stm mis'> self.processArguments([a])</p>
-<p class='pln'> else:</p>
-<p class='stm mis'> raise CogUsageError("No files to process")</p>
-<p class='pln'> </p>
-<p class='stm run hide'> def main(self, argv):</p>
-<p class='pln'> """ Handle the command-line execution for cog.</p>
-<p class='pln'> """</p>
-<p class='pln'> </p>
-<p class='stm mis'> try:</p>
-<p class='stm mis'> self.callableMain(argv)</p>
-<p class='stm mis'> return 0</p>
-<p class='stm mis'> except CogUsageError, err:</p>
-<p class='stm mis'> print >>self.stderr, err</p>
-<p class='stm mis'> print >>self.stderr, "(for help use -?)"</p>
-<p class='stm mis'> return 2</p>
-<p class='stm mis'> except CogGeneratedError, err:</p>
-<p class='stm mis'> print >>self.stderr, "Error: %s" % err</p>
-<p class='stm mis'> return 3</p>
-<p class='stm mis'> except CogError, err:</p>
-<p class='stm mis'> print >>self.stderr, err</p>
-<p class='stm mis'> return 1</p>
-<p class='stm mis'> except:</p>
-<p class='stm mis'> traceback.print_exc(None, self.stderr)</p>
-<p class='stm mis'> return 1</p>
-<p class='pln'> </p>
-<p class='pln'># History:</p>
-<p class='pln'># 20040210: First public version.</p>
-<p class='pln'># 20040220: Text preceding the start and end marker are removed from Python lines.</p>
-<p class='pln'># -v option on the command line shows the version.</p>
-<p class='pln'># 20040311: Make sure the last line of output is properly ended with a newline.</p>
-<p class='pln'># 20040605: Fixed some blank line handling in cog.</p>
-<p class='pln'># Fixed problems with assigning to xml elements in handyxml.</p>
-<p class='pln'># 20040621: Changed all line-ends to LF from CRLF.</p>
-<p class='pln'># 20041002: Refactor some option handling to simplify unittesting the options.</p>
-<p class='pln'># 20041118: cog.out and cog.outl have optional string arguments.</p>
-<p class='pln'># 20041119: File names weren't being properly passed around for warnings, etc.</p>
-<p class='pln'># 20041122: Added cog.firstLineNum: a property with the line number of the [[[cog line.</p>
-<p class='pln'># Added cog.inFile and cog.outFile: the names of the input and output file.</p>
-<p class='pln'># 20041218: Single-line cog generators, with start marker and end marker on</p>
-<p class='pln'># the same line.</p>
-<p class='pln'># 20041230: Keep a single globals dict for all the code fragments in a single</p>
-<p class='pln'># file so they can share state.</p>
-<p class='pln'># 20050206: Added the -x switch to remove all generated output.</p>
-<p class='pln'># 20050218: Now code can be on the marker lines as well.</p>
-<p class='pln'># 20050219: Added -c switch to checksum the output so that edits can be</p>
-<p class='pln'># detected before they are obliterated.</p>
-<p class='pln'># 20050521: Added cog.error, contributed by Alexander Belchenko.</p>
-<p class='pln'># 20050720: Added code deletion and settable globals contributed by Blake Winton.</p>
-<p class='pln'># 20050724: Many tweaks to improve code coverage.</p>
-<p class='pln'># 20050726: Error messages are now printed with no traceback.</p>
-<p class='pln'># Code can no longer appear on the marker lines,</p>
-<p class='pln'># except for single-line style.</p>
-<p class='pln'># -z allows omission of the [[[end]]] marker, and it will be assumed</p>
-<p class='pln'># at the end of the file.</p>
-<p class='pln'># 20050729: Refactor option parsing into a separate class, in preparation for</p>
-<p class='pln'># future features.</p>
-<p class='pln'># 20050805: The cogmodule.path wasn't being properly maintained.</p>
-<p class='pln'># 20050808: Added the -D option to define a global value.</p>
-<p class='pln'># 20050810: The %s in the -w command is dealt with more robustly.</p>
-<p class='pln'># Added the -s option to suffix output lines with a marker.</p>
-<p class='pln'># 20050817: Now @files can have arguments on each line to change the cog's</p>
-<p class='pln'># behavior for that line.</p>
-<p class='pln'># 20051006: Version 2.0</p>
-<p class='pln'># 20080521: -U options lets you create Unix newlines on Windows. Thanks,</p>
-<p class='pln'># Alexander Belchenko.</p>
-<p class='pln'># 20080522: It's now ok to have -d with output to stdout, and now we validate</p>
-<p class='pln'># the args after each line of an @file.</p>
-<p class='pln'># 20090520: Use hashlib where it's available, to avoid a warning.</p>
-<p class='pln'># Use the builtin compile() instead of compiler, for Jython.</p>
-<p class='pln'># Explicitly close files we opened, Jython likes this.</p>
+<p class='pln'><span class='str'>""" Cog code generation tool.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> http://nedbatchelder.com/code/cog</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> </span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> Copyright 2004-2009, Ned Batchelder.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'>"""</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>import</span> <span class='nam'>copy</span><span class='op'>,</span> <span class='nam'>getopt</span><span class='op'>,</span> <span class='nam'>imp</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>,</span> <span class='nam'>shlex</span><span class='op'>,</span> <span class='nam'>string</span><span class='op'>,</span> <span class='nam'>sys</span><span class='op'>,</span> <span class='nam'>traceback</span><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>from</span> <span class='nam'>cStringIO</span> <span class='key'>import</span> <span class='nam'>StringIO</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class='com'># The recommended way to compute md5's changed in Python 2.5</span><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>import</span> <span class='nam'>hashlib</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>hash_factory</span> <span class='op'>=</span> <span class='nam'>hashlib</span><span class='op'>.</span><span class='nam'>md5</span><span class="strut"> </span></p>
+<p class='stm mis'><span class='key'>except</span> <span class='nam'>ImportError</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>import</span> <span class='nam'>md5</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>hash_factory</span> <span class='op'>=</span> <span class='nam'>md5</span><span class='op'>.</span><span class='nam'>new</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='nam'>__all__</span> <span class='op'>=</span> <span class='op'>[</span><span class='str'>'Cog'</span><span class='op'>,</span> <span class='str'>'CogUsageError'</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='nam'>__version__</span> <span class='op'>=</span> <span class='str'>'2.2'</span> <span class='com'># History at the end of the file.</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='nam'>usage</span> <span class='op'>=</span> <span class='str'>"""\</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'>cog - generate code with inlined Python code.</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class='str'>cog [OPTIONS] [INFILE | @FILELIST] ...</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class='str'>INFILE is the name of an input file.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'>FILELIST is the name of a text file containing file names or</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> other @FILELISTs.</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class='str'>OPTIONS:</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -c Checksum the output to protect it against accidental change.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -d Delete the generator code from the output file.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -D name=val Define a global string available to your generator code.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -e Warn if a file has no cog code in it.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -I PATH Add PATH to the list of directories for data files and modules.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -o OUTNAME Write the output to OUTNAME.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -r Replace the input file with the output.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -s STRING Suffix all generated output lines with STRING.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -U Write the output with Unix newlines (only LF line-endings).</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -w CMD Use CMD if the output file needs to be made writable.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> A %s in the CMD will be filled with the filename.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -x Excise all the generated output without running the generators.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -z The [[[end]]] marker can be omitted, and is assumed at eof.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -v Print the version of cog and exit.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> -h Print this help.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'>"""</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class='com'># Other package modules</span><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>from</span> <span class='nam'>whiteutils</span> <span class='key'>import</span> <span class='op'>*</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='nam'>Exception</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Any exception raised by Cog.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>,</span> <span class='nam'>file</span><span class='op'>=</span><span class='str'>''</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='num'>0</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>file</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>Exception</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='str'>"%s(%d): %s"</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>file</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>Exception</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" An error in usage of command-line arguments in cog.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogInternalError</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" An error in the coding of Cog. Should never happen.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogGeneratedError</span><span class='op'>(</span><span class='nam'>CogError</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" An error raised by a user's cog generator.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='exc'> <span class='key'>pass</span> <span class='com'>#pragma: no cover</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>class</span> <span class='nam'>Redirectable</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" An object with its own stdout and stderr files.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>stdout</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>stderr</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>stderr</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Assign new files for standard out and/or standard error.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>stdout</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span> <span class='op'>=</span> <span class='nam'>stdout</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>stderr</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span> <span class='op'>=</span> <span class='nam'>stderr</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogGenerator</span><span class='op'>(</span><span class='nam'>Redirectable</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" A generator pulled from a source file.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>Redirectable</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>parseMarker</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>parseLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span><span class='op'>.</span><span class='nam'>append</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>getCode</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Extract the executable Python code from the generator.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># If the markers and lines all have the same prefix</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># (end-of-line comment chars, for example),</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># then remove it from all the lines.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>prefIn</span> <span class='op'>=</span> <span class='nam'>commonPrefix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>+</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>prefIn</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>=</span> <span class='op'>[</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>prefIn</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span> <span class='op'>]</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span> <span class='op'>=</span> <span class='op'>[</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>prefIn</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span> <span class='op'>]</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>lines</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>evaluate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>cog</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='str'>'cog generator'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># figure out the right whitespace prefix for the output</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>prefOut</span> <span class='op'>=</span> <span class='nam'>whitePrefix</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>markers</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>intext</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>getCode</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>intext</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='str'>''</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># In Python 2.2, the last line has to end in a newline.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>intext</span> <span class='op'>=</span> <span class='str'>"import cog\n"</span> <span class='op'>+</span> <span class='nam'>intext</span> <span class='op'>+</span> <span class='str'>"\n"</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>code</span> <span class='op'>=</span> <span class='nam'>compile</span><span class='op'>(</span><span class='nam'>intext</span><span class='op'>,</span> <span class='nam'>str</span><span class='op'>(</span><span class='nam'>fname</span><span class='op'>)</span><span class='op'>,</span> <span class='str'>'exec'</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Make sure the "cog" module has our state.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>msg</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>msg</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>out</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>out</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>outl</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outl</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>cog</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>error</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>error</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='op'>=</span> <span class='str'>''</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>eval</span><span class='op'>(</span><span class='nam'>code</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># We need to make sure that the last line in the output</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># ends with a newline, or it will be joined to the</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># end-output line, ruining cog's idempotency.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span> <span class='op'>!=</span> <span class='str'>'\n'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='op'>+=</span> <span class='str'>'\n'</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span><span class='op'>,</span> <span class='nam'>prefOut</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>msg</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Message: "</span><span class='op'>+</span><span class='nam'>s</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>out</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sOut</span><span class='op'>=</span><span class='str'>''</span><span class='op'>,</span> <span class='nam'>dedent</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>,</span> <span class='nam'>trimblanklines</span><span class='op'>=</span><span class='nam'>False</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" The cog.out function.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>trimblanklines</span> <span class='key'>and</span> <span class='op'>(</span><span class='str'>'\n'</span> <span class='key'>in</span> <span class='nam'>sOut</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>lines</span> <span class='op'>=</span> <span class='nam'>sOut</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>lines</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>''</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>del</span> <span class='nam'>lines</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>lines</span> <span class='key'>and</span> <span class='nam'>lines</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span> <span class='op'>==</span> <span class='str'>''</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>del</span> <span class='nam'>lines</span><span class='op'>[</span><span class='op'>-</span><span class='num'>1</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>sOut</span> <span class='op'>=</span> <span class='str'>'\n'</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>lines</span><span class='op'>)</span><span class='op'>+</span><span class='str'>'\n'</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>dedent</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>sOut</span> <span class='op'>=</span> <span class='nam'>reindentBlock</span><span class='op'>(</span><span class='nam'>sOut</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>outstring</span> <span class='op'>+=</span> <span class='nam'>sOut</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>outl</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sOut</span><span class='op'>=</span><span class='str'>''</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kw</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" The cog.outl function.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>out</span><span class='op'>(</span><span class='nam'>sOut</span><span class='op'>,</span> <span class='op'>**</span><span class='nam'>kw</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>out</span><span class='op'>(</span><span class='str'>'\n'</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>error</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>=</span><span class='str'>'Error raised by cog generator.'</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" The cog.error function.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> Instead of raising standard python errors, cog generators can use</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> this function. It will display the error without a scary Python</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> traceback.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogGeneratedError</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>class</span> <span class='nam'>NumberedFileReader</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" A decorator for files that counts the readline()'s called.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>f</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>f</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>n</span> <span class='op'>=</span> <span class='num'>0</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>readline</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>f</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>l</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>n</span> <span class='op'>+=</span> <span class='num'>1</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>l</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>linenumber</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>n</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>class</span> <span class='nam'>CogOptions</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Options for a run of cog.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Defaults for argument values.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>args</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>includePath</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>defines</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bShowVersion</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span> <span class='op'>=</span> <span class='nam'>None</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNoGenerate</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputName</span> <span class='op'>=</span> <span class='nam'>None</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bWarnEmpty</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bHashOutput</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bDeleteCode</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bEofCanBeEnd</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sSuffix</span> <span class='op'>=</span> <span class='nam'>None</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNewlines</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__cmp__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>other</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Comparison operator for tests to use.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>return</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>__dict__</span><span class='op'>.</span><span class='nam'>__cmp__</span><span class='op'>(</span><span class='nam'>other</span><span class='op'>.</span><span class='nam'>__dict__</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>clone</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Make a clone of these options, for further refinement.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>return</span> <span class='nam'>copy</span><span class='op'>.</span><span class='nam'>deepcopy</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>dirs</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Add directories to the include path.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>dirs</span> <span class='op'>=</span> <span class='nam'>dirs</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>pathsep</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>includePath</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>dirs</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>parseArgs</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>argv</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Parse the command line arguments.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>opts</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>args</span> <span class='op'>=</span> <span class='nam'>getopt</span><span class='op'>.</span><span class='nam'>getopt</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>,</span> <span class='str'>'cdD:eI:o:rs:Uvw:xz'</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>except</span> <span class='nam'>getopt</span><span class='op'>.</span><span class='nam'>error</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='nam'>msg</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Handle the command line arguments.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>for</span> <span class='nam'>o</span><span class='op'>,</span> <span class='nam'>a</span> <span class='key'>in</span> <span class='nam'>opts</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-c'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bHashOutput</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-d'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bDeleteCode</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-D'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>a</span><span class='op'>.</span><span class='nam'>count</span><span class='op'>(</span><span class='str'>'='</span><span class='op'>)</span> <span class='op'><</span> <span class='num'>1</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"-D takes a name=value argument"</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>name</span><span class='op'>,</span> <span class='nam'>value</span> <span class='op'>=</span> <span class='nam'>a</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='str'>'='</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>defines</span><span class='op'>[</span><span class='nam'>name</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>value</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-e'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bWarnEmpty</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-I'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>a</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-o'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputName</span> <span class='op'>=</span> <span class='nam'>a</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-r'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-s'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sSuffix</span> <span class='op'>=</span> <span class='nam'>a</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-U'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNewlines</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-v'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bShowVersion</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-w'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span> <span class='op'>=</span> <span class='nam'>a</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-x'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bNoGenerate</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>o</span> <span class='op'>==</span> <span class='str'>'-z'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bEofCanBeEnd</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Since getopt.getopt is given a list of possible flags,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># this is an internal error.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogInternalError</span><span class='op'>(</span><span class='str'>"Don't understand argument %s"</span> <span class='op'>%</span> <span class='nam'>o</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>validate</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Does nothing if everything is OK, raises CogError's if it's not.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"Can't use -d with -r (or you would delete all your source!)"</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>bReplace</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"Can't use -o with -r (they are opposites)"</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'><span class='key'>class</span> <span class='nam'>Cog</span><span class='op'>(</span><span class='nam'>Redirectable</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" The Cog engine.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>Redirectable</span><span class='op'>.</span><span class='nam'>__init__</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span> <span class='op'>=</span> <span class='str'>'[[[cog'</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span> <span class='op'>=</span> <span class='str'>']]]'</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span> <span class='op'>=</span> <span class='str'>'[[[end]]]'</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>reEndOutput</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>compile</span><span class='op'>(</span><span class='str'>r'\[\[\[end]]](?P<hashsect> *\(checksum: (?P<hash>[a-f0-9]+)\))'</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndFormat</span> <span class='op'>=</span> <span class='str'>'[[[end]]] (checksum: %s)'</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span> <span class='op'>=</span> <span class='nam'>CogOptions</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>installCogModule</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>showWarning</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>msg</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Warning:"</span><span class='op'>,</span> <span class='nam'>msg</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span> <span class='key'>and</span> <span class='xx'>\</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>s</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>s</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>)</span> <span class='op'>>=</span> <span class='num'>0</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>installCogModule</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Magic mumbo-jumbo so that imported Python modules</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> can say "import cog" and get our state.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span> <span class='op'>=</span> <span class='nam'>imp</span><span class='op'>.</span><span class='nam'>new_module</span><span class='op'>(</span><span class='str'>'cog'</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>path</span> <span class='op'>=</span> <span class='op'>[</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>modules</span><span class='op'>[</span><span class='str'>'cog'</span><span class='op'>]</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>fIn</span><span class='op'>,</span> <span class='nam'>fOut</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Process an input file object to an output file object.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> fIn and fOut can be file objects, or file names.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>sFileIn</span> <span class='op'>=</span> <span class='nam'>fname</span> <span class='key'>or</span> <span class='str'>''</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>sFileOut</span> <span class='op'>=</span> <span class='nam'>fname</span> <span class='key'>or</span> <span class='str'>''</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fInToClose</span> <span class='op'>=</span> <span class='nam'>fOutToClose</span> <span class='op'>=</span> <span class='nam'>None</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Convert filenames to files.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Open the input file.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>sFileIn</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>fIn</span> <span class='op'>=</span> <span class='nam'>fInToClose</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>,</span> <span class='str'>'r'</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>isinstance</span><span class='op'>(</span><span class='nam'>fOut</span><span class='op'>,</span> <span class='nam'>basestring</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Open the output file.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>sFileOut</span> <span class='op'>=</span> <span class='nam'>fOut</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>fOut</span> <span class='op'>=</span> <span class='nam'>fOutToClose</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>fOut</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fIn</span> <span class='op'>=</span> <span class='nam'>NumberedFileReader</span><span class='op'>(</span><span class='nam'>fIn</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>bSawCog</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>inFile</span> <span class='op'>=</span> <span class='nam'>sFileIn</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>outFile</span> <span class='op'>=</span> <span class='nam'>sFileOut</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># The globals dict we'll use for this file.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>globals</span> <span class='key'>is</span> <span class='nam'>None</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>globals</span> <span class='op'>=</span> <span class='op'>{</span><span class='op'>}</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># If there are any global defines, put them in the globals.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>globals</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>defines</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># loop over generator chunks</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>while</span> <span class='nam'>l</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Find the next spec begin</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>while</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>l</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>break</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># l is the begin spec</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>gen</span> <span class='op'>=</span> <span class='nam'>CogGenerator</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>setOutput</span><span class='op'>(</span><span class='nam'>stdout</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseMarker</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>firstLineNum</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>firstLineNum</span> <span class='op'>=</span> <span class='nam'>firstLineNum</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># If the spec begin is also a spec end, then process the single</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># line of code inside.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>beg</span> <span class='op'>=</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>end</span> <span class='op'>=</span> <span class='nam'>string</span><span class='op'>.</span><span class='nam'>find</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>beg</span> <span class='op'>></span> <span class='nam'>end</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Cog code markers inverted"</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>firstLineNum</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>sCode</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>[</span><span class='nam'>beg</span><span class='op'>+</span><span class='nam'>len</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>)</span><span class='op'>:</span><span class='nam'>end</span><span class='op'>]</span><span class='op'>.</span><span class='nam'>strip</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseLine</span><span class='op'>(</span><span class='nam'>sCode</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Deal with an ordinary code block.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Get all the lines in the spec</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>while</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>l</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>"Cog block begun but never ended."</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>firstLineNum</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>parseMarker</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Eat all the lines in the output section. While reading past</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># them, compute the md5 hash of the old output.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>hasher</span> <span class='op'>=</span> <span class='nam'>hash_factory</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>while</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndOutputLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isBeginSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sBeginSpec</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>isEndSpecLine</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Unexpected '%s'"</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndSpec</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>curHash</span> <span class='op'>=</span> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>hexdigest</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>l</span> <span class='key'>and</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bEofCanBeEnd</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># We reached end of file before we found the end output line.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Missing '%s' before end of file."</span> <span class='op'>%</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Write the output of the spec to be the new output if we're </span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># supposed to generate code.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>hasher</span> <span class='op'>=</span> <span class='nam'>hash_factory</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bNoGenerate</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>sFile</span> <span class='op'>=</span> <span class='str'>"%s+%d"</span> <span class='op'>%</span> <span class='op'>(</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>firstLineNum</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>sGen</span> <span class='op'>=</span> <span class='nam'>gen</span><span class='op'>.</span><span class='nam'>evaluate</span><span class='op'>(</span><span class='nam'>cog</span><span class='op'>=</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>globals</span><span class='op'>=</span><span class='nam'>globals</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>sGen</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>suffixLines</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>update</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>sGen</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>newHash</span> <span class='op'>=</span> <span class='nam'>hasher</span><span class='op'>.</span><span class='nam'>hexdigest</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>bSawCog</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Write the ending output line</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>hashMatch</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>reEndOutput</span><span class='op'>.</span><span class='nam'>search</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bHashOutput</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>hashMatch</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>oldHash</span> <span class='op'>=</span> <span class='nam'>hashMatch</span><span class='op'>.</span><span class='nam'>groupdict</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='str'>'hash'</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>oldHash</span> <span class='op'>!=</span> <span class='nam'>curHash</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Output has been edited! Delete old checksum to unprotect."</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='nam'>file</span><span class='op'>=</span><span class='nam'>sFileIn</span><span class='op'>,</span> <span class='nam'>line</span><span class='op'>=</span><span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>linenumber</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Create a new end line with the correct hash.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>endpieces</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>hashMatch</span><span class='op'>.</span><span class='nam'>group</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># There was no old hash, but we want a new hash.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>endpieces</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>split</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndOutput</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>l</span> <span class='op'>=</span> <span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>sEndFormat</span> <span class='op'>%</span> <span class='nam'>newHash</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>join</span><span class='op'>(</span><span class='nam'>endpieces</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># We don't want hashes output, so if there was one, get rid of</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># it.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>hashMatch</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>l</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='nam'>hashMatch</span><span class='op'>.</span><span class='nam'>groupdict</span><span class='op'>(</span><span class='op'>)</span><span class='op'>[</span><span class='str'>'hashsect'</span><span class='op'>]</span><span class='op'>,</span> <span class='str'>''</span><span class='op'>,</span> <span class='num'>1</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bDeleteCode</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fOut</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>l</span> <span class='op'>=</span> <span class='nam'>fIn</span><span class='op'>.</span><span class='nam'>readline</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>bSawCog</span> <span class='key'>and</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bWarnEmpty</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>showWarning</span><span class='op'>(</span><span class='str'>"no cog code found in %s"</span> <span class='op'>%</span> <span class='nam'>sFileIn</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>fInToClose</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>fInToClose</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>fOutToClose</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>fOutToClose</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># A regex for non-empty lines, used by suffixLines.</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>reNonEmptyLines</span> <span class='op'>=</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>compile</span><span class='op'>(</span><span class='str'>"^\s*\S+.*$"</span><span class='op'>,</span> <span class='nam'>re</span><span class='op'>.</span><span class='nam'>MULTILINE</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>suffixLines</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>text</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Add suffixes to the lines in text, if our options desire it.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> text is many lines, as a single string.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sSuffix</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Find all non-blank lines, and add the suffix to the end.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>repl</span> <span class='op'>=</span> <span class='str'>r"\g<0>"</span> <span class='op'>+</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sSuffix</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>'\\'</span><span class='op'>,</span> <span class='str'>'\\\\'</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>text</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>reNonEmptyLines</span><span class='op'>.</span><span class='nam'>sub</span><span class='op'>(</span><span class='nam'>repl</span><span class='op'>,</span> <span class='nam'>text</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>text</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processString</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sInput</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>None</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Process sInput as the text to cog.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> Return the cogged output as a string.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fOld</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>(</span><span class='nam'>sInput</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>fNew</span> <span class='op'>=</span> <span class='nam'>StringIO</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>fOld</span><span class='op'>,</span> <span class='nam'>fNew</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>fname</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>return</span> <span class='nam'>fNew</span><span class='op'>.</span><span class='nam'>getvalue</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>replaceFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>sNewText</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Replace file sOldPath with the contents sNewText</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Need to ensure we can write.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Use an external command to make the file writable.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>cmd</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sMakeWritableCmd</span><span class='op'>.</span><span class='nam'>replace</span><span class='op'>(</span><span class='str'>'%s'</span><span class='op'>,</span> <span class='nam'>sOldPath</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>popen</span><span class='op'>(</span><span class='nam'>cmd</span><span class='op'>)</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='key'>not</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>access</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>os</span><span class='op'>.</span><span class='nam'>W_OK</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Couldn't make %s writable"</span> <span class='op'>%</span> <span class='nam'>sOldPath</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Can't write!</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogError</span><span class='op'>(</span><span class='str'>"Can't overwrite %s"</span> <span class='op'>%</span> <span class='nam'>sOldPath</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>f</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sOldPath</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>write</span><span class='op'>(</span><span class='nam'>sNewText</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>f</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>saveIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedInclude</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedSysPath</span> <span class='op'>=</span> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>[</span><span class='op'>:</span><span class='op'>]</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>restoreIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedInclude</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>path</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>savedSysPath</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>includePath</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>cogmodule</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>includePath</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>sys</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>extend</span><span class='op'>(</span><span class='nam'>includePath</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processOneFile</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFile</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Process one filename through cog.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>saveIncludePath</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>includePath</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Since we know where the input file came from,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># push its directory onto the include path.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>addToIncludePath</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>os</span><span class='op'>.</span><span class='nam'>path</span><span class='op'>.</span><span class='nam'>dirname</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>)</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Set the file output mode based on whether we want \n or native</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># line endings.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span> <span class='op'>=</span> <span class='str'>'w'</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bNewlines</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>sOutputMode</span> <span class='op'>=</span> <span class='str'>'wb'</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># How we process the file depends on where the output is going.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>,</span> <span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>elif</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bReplace</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># We want to replace the cog file with the output,</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># but only if they differ.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Cogging %s"</span> <span class='op'>%</span> <span class='nam'>sFile</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>bNeedNewline</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>fOldFile</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>sOldText</span> <span class='op'>=</span> <span class='nam'>fOldFile</span><span class='op'>.</span><span class='nam'>read</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>fOldFile</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>sNewText</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processString</span><span class='op'>(</span><span class='nam'>sOldText</span><span class='op'>,</span> <span class='nam'>fname</span><span class='op'>=</span><span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>sOldText</span> <span class='op'>!=</span> <span class='nam'>sNewText</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>" (changed)"</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>bNeedNewline</span> <span class='op'>=</span> <span class='nam'>False</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>replaceFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>,</span> <span class='nam'>sNewText</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># The try-finally block is so we can print a partial line</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># with the name of the file, and print (changed) on the</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># same line, but also make sure to break the line before</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># any traceback.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>bNeedNewline</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFile</span><span class='op'>(</span><span class='nam'>sFile</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='nam'>sFile</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>finally</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>restoreIncludePath</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processFileList</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>sFileList</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Process the files in a file list.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>flist</span> <span class='op'>=</span> <span class='nam'>open</span><span class='op'>(</span><span class='nam'>sFileList</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>lines</span> <span class='op'>=</span> <span class='nam'>flist</span><span class='op'>.</span><span class='nam'>readlines</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>flist</span><span class='op'>.</span><span class='nam'>close</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>for</span> <span class='nam'>l</span> <span class='key'>in</span> <span class='nam'>lines</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Use shlex to parse the line like a shell.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>lex</span> <span class='op'>=</span> <span class='nam'>shlex</span><span class='op'>.</span><span class='nam'>shlex</span><span class='op'>(</span><span class='nam'>l</span><span class='op'>,</span> <span class='nam'>posix</span><span class='op'>=</span><span class='nam'>True</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>lex</span><span class='op'>.</span><span class='nam'>whitespace_split</span> <span class='op'>=</span> <span class='nam'>True</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>lex</span><span class='op'>.</span><span class='nam'>commenters</span> <span class='op'>=</span> <span class='str'>'#'</span><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># No escapes, so that backslash can be part of the path</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>lex</span><span class='op'>.</span><span class='nam'>escape</span> <span class='op'>=</span> <span class='str'>''</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>args</span> <span class='op'>=</span> <span class='nam'>list</span><span class='op'>(</span><span class='nam'>lex</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>args</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processArguments</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>processArguments</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>args</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Process one command-line.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>saved_options</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span> <span class='op'>=</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>clone</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>validate</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>args</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span> <span class='op'>==</span> <span class='str'>'@'</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>sOutputName</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"Can't use -o with @file"</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processFileList</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>[</span><span class='num'>1</span><span class='op'>:</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processOneFile</span><span class='op'>(</span><span class='nam'>args</span><span class='op'>[</span><span class='num'>0</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span> <span class='op'>=</span> <span class='nam'>saved_options</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>callableMain</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>argv</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" All of command-line cog, but in a callable form.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> This is used by main.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> argv is the equivalent of sys.argv.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>argv0</span> <span class='op'>=</span> <span class='nam'>argv</span><span class='op'>.</span><span class='nam'>pop</span><span class='op'>(</span><span class='num'>0</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'> <span class='com'># Provide help if asked for anywhere in the command line.</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='str'>'-?'</span> <span class='key'>in</span> <span class='nam'>argv</span> <span class='key'>or</span> <span class='str'>'-h'</span> <span class='key'>in</span> <span class='nam'>argv</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='nam'>usage</span><span class='op'>,</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>return</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>parseArgs</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>validate</span><span class='op'>(</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>bShowVersion</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stdout</span><span class='op'>,</span> <span class='str'>"Cog version %s"</span> <span class='op'>%</span> <span class='nam'>__version__</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>return</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>if</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>args</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>for</span> <span class='nam'>a</span> <span class='key'>in</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>options</span><span class='op'>.</span><span class='nam'>args</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>processArguments</span><span class='op'>(</span><span class='op'>[</span><span class='nam'>a</span><span class='op'>]</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'> <span class='key'>else</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>raise</span> <span class='nam'>CogUsageError</span><span class='op'>(</span><span class='str'>"No files to process"</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm run hide'> <span class='key'>def</span> <span class='nam'>main</span><span class='op'>(</span><span class='nam'>self</span><span class='op'>,</span> <span class='nam'>argv</span><span class='op'>)</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='pln'> <span class='str'>""" Handle the command-line execution for cog.</span><span class="strut"> </span></p>
+<p class='pln'><span class='str'> """</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>try</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>callableMain</span><span class='op'>(</span><span class='nam'>argv</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>return</span> <span class='num'>0</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>except</span> <span class='nam'>CogUsageError</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='nam'>err</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='str'>"(for help use -?)"</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>return</span> <span class='num'>2</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>except</span> <span class='nam'>CogGeneratedError</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='str'>"Error: %s"</span> <span class='op'>%</span> <span class='nam'>err</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>return</span> <span class='num'>3</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>except</span> <span class='nam'>CogError</span><span class='op'>,</span> <span class='nam'>err</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>print</span> <span class='op'>>></span><span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>,</span> <span class='nam'>err</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>return</span> <span class='num'>1</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>except</span><span class='op'>:</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='nam'>traceback</span><span class='op'>.</span><span class='nam'>print_exc</span><span class='op'>(</span><span class='nam'>None</span><span class='op'>,</span> <span class='nam'>self</span><span class='op'>.</span><span class='nam'>stderr</span><span class='op'>)</span><span class="strut"> </span></p>
+<p class='stm mis'> <span class='key'>return</span> <span class='num'>1</span><span class="strut"> </span></p>
+<p class='pln'><span class="strut"> </span></p>
+<p class='pln'><span class='com'># History:</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20040210: First public version.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20040220: Text preceding the start and end marker are removed from Python lines.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># -v option on the command line shows the version.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20040311: Make sure the last line of output is properly ended with a newline.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20040605: Fixed some blank line handling in cog.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># Fixed problems with assigning to xml elements in handyxml.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20040621: Changed all line-ends to LF from CRLF.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20041002: Refactor some option handling to simplify unittesting the options.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20041118: cog.out and cog.outl have optional string arguments.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20041119: File names weren't being properly passed around for warnings, etc.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20041122: Added cog.firstLineNum: a property with the line number of the [[[cog line.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># Added cog.inFile and cog.outFile: the names of the input and output file.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20041218: Single-line cog generators, with start marker and end marker on</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># the same line.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20041230: Keep a single globals dict for all the code fragments in a single</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># file so they can share state.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050206: Added the -x switch to remove all generated output.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050218: Now code can be on the marker lines as well.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050219: Added -c switch to checksum the output so that edits can be</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># detected before they are obliterated.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050521: Added cog.error, contributed by Alexander Belchenko.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050720: Added code deletion and settable globals contributed by Blake Winton.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050724: Many tweaks to improve code coverage.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050726: Error messages are now printed with no traceback.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># Code can no longer appear on the marker lines,</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># except for single-line style.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># -z allows omission of the [[[end]]] marker, and it will be assumed</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># at the end of the file.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050729: Refactor option parsing into a separate class, in preparation for</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># future features.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050805: The cogmodule.path wasn't being properly maintained.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050808: Added the -D option to define a global value.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050810: The %s in the -w command is dealt with more robustly.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># Added the -s option to suffix output lines with a marker.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20050817: Now @files can have arguments on each line to change the cog's</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># behavior for that line.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20051006: Version 2.0</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20080521: -U options lets you create Unix newlines on Windows. Thanks,</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># Alexander Belchenko.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20080522: It's now ok to have -d with output to stdout, and now we validate</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># the args after each line of an @file.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># 20090520: Use hashlib where it's available, to avoid a warning.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># Use the builtin compile() instead of compiler, for Jython.</span><span class="strut"> </span></p>
+<p class='pln'><span class='com'># Explicitly close files we opened, Jython likes this.</span><span class="strut"> </span></p>
</td>
</tr>
|