summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2001-09-07 18:20:04 (GMT)
committerBarry Warsaw <barry@python.org>2001-09-07 18:20:04 (GMT)
commitb5b786505eafd7eb6e152ecc268e14bb08f400e4 (patch)
tree3d1a1317e96703255eb46adb0af0690d68daaf76
parentd6c8ca65363ecc8fc6d65311d77e0105d2b4af92 (diff)
downloadcpython-b5b786505eafd7eb6e152ecc268e14bb08f400e4.zip
cpython-b5b786505eafd7eb6e152ecc268e14bb08f400e4.tar.gz
cpython-b5b786505eafd7eb6e152ecc268e14bb08f400e4.tar.bz2
Merging in removal of this file from branch to trunk.
-rw-r--r--Lib/compilerlike.py163
1 files changed, 0 insertions, 163 deletions
diff --git a/Lib/compilerlike.py b/Lib/compilerlike.py
deleted file mode 100644
index 52fe4a2..0000000
--- a/Lib/compilerlike.py
+++ /dev/null
@@ -1,163 +0,0 @@
-"""
-compilerlike -- framework code for building compiler-like programs.
-
-There is a common `compiler-like' pattern in Unix scripts which is useful
-for translation utilities of all sorts. A program following this pattern
-behaves as a filter when no argument files are specified on the command
-line, but otherwise transforms each file individually into a corresponding
-output file.
-
-This module provides framework and glue code to make such programs
-easy to write. You supply a function to massage the file data. It
-always takes initial name and filename arguments; depending on which
-entry point you use, it can also take input and output file pointers,
-or it can take a string consisting of the entire file's data and
-return a replacement, or it can take in succession strings consisting
-of each of the file's lines and return a translated line for each.
-
-The fourth, optional argument of each entry point is a name
-transformation function or name suffix string. If it is of string
-type, the shortest suffix of each filename beginning with the first
-character of the argument string is stripped off. If the first
-character of the argument does not occur in the filename, no suffix is
-removed. Then the name suffix argument is concatenated to the end of
-the stripped filename. (Thus, a name suffix argument of ".x" will
-cause the filenames foo.c and bar.d to be transformed to foo.x and
-bar.x respectively.)
-
-Argument files are transformed in left to right order in the argument list.
-A filename consisting of a dash is interpreted as a directive to read from
-standard input (this can be useful in pipelines).
-
-Replacement of each file is atomic and doesn't occur until the
-translation of that file has completed. Any tempfiles are removed
-automatically on any exception thrown by the translation function,
-and the exception is then passed upwards.
-"""
-
-# Requires Python 2.
-import sys, os, filecmp, traceback
-
-def filefilter(name, arguments, trans_data, trans_filename=None):
- "Filter stdin to stdout, or file arguments to renamed files."
- if not arguments:
- trans_data(name, "stdin", sys.stdin, sys.stdout)
- else:
- for file in arguments:
- if file == '-': # - is conventional for stdin
- file = "stdin"
- infp = sys.stdin
- else:
- infp = open(file)
- tempfile = file + ".~%s-%d~" % (name, os.getpid())
- outfp = open(tempfile, "w")
- try:
- trans_data(name, file, infp, outfp)
- except:
- os.remove(tempfile)
- # Pass the exception upwards
- (exc_type, exc_value, exc_traceback) = sys.exc_info()
- raise exc_type, exc_value, exc_traceback
- if filecmp.cmp(file, tempfile):
- os.remove(tempfile)
- else:
- if not trans_filename:
- os.rename(tempfile, file)
- elif type(trans_filename) == type(""):
- i = file.rfind(trans_filename[0])
- if i > -1:
- file = file[:i]
- os.rename(tempfile, stem + trans_filename)
- else:
- os.rename(tempfile, trans_filename(file))
-
-def line_by_line(name, file, infp, outfp, translate_line):
- "Hook to do line-by-line translation for filters."
- while 1:
- line = infp.readline()
- if line == "":
- break
- elif line: # None returns are skipped
- outfp.write(translate_line(name, file, line))
-
-def linefilter(name, arguments, trans_data, trans_filename=None):
- "Filter framework for line-by-line transformation."
- return filefilter(name,
- arguments,
- lambda name, file, infp, outfp: line_by_line(name, file, infp, outfp, trans_data),
- trans_filename)
-
-def sponge(name, arguments, trans_data, trans_filename=None):
- "Read input sources entire and transform them in memory."
- if not arguments:
- sys.stdout.write(trans_data(name, "stdin", sys.stdin.read()))
- else:
- for file in arguments:
- infp = open(file)
- indoc = infp.read()
- infp.close()
- tempfile = file + ".~%s-%d~" % (name, os.getpid())
- try:
- outfp = open(tempfile, "w")
- except OSError:
- sys.stderr.write("%s: can't open tempfile" % name)
- return 1
- try:
- outdoc = trans_data(name, file, indoc)
- except:
- os.remove(tempfile)
- # Pass the exception upwards
- (exc_type, exc_value, exc_traceback) = sys.exc_info()
- raise exc_type, exc_value, exc_traceback
- if outdoc == indoc:
- os.remove(tempfile)
- else:
- outfp.write(outdoc)
- if not trans_filename:
- os.rename(tempfile, file)
- elif type(trans_filename) == type(""):
- i = file.rfind(trans_filename[0])
- if i > -1:
- file = file[:i]
- os.rename(tempfile, file + trans_filename)
- else:
- os.rename(tempfile, trans_filename(file))
-
-if __name__ == '__main__':
- import getopt
-
- def nametrans(name):
- return name + ".out"
-
- def filefilter_test(name, file, infp, outfp):
- "Test hook for filefilter entry point -- put dashes before blank lines."
- while 1:
- line = infp.readline()
- if not line:
- break
- if line == "\n":
- outfp.write("------------------------------------------\n")
- outfp.write(line)
-
- def linefilter_test(name, file, data):
- "Test hook for linefilter entry point -- wrap lines in brackets."
- return "<" + data[:-1] + ">\n"
-
- def sponge_test(name, file, data):
- "Test hook for the sponge entry point -- reverse file lines."
- lines = data.split("\n")
- lines.reverse()
- return "\n".join(lines)
-
- (options, arguments) = getopt.getopt(sys.argv[1:], "fls")
- for (switch, val) in options:
- if switch == '-f':
- filefilter("filefilter_test", arguments, filefilter_test,nametrans)
- elif switch == '-l':
- linefilter("linefilter_test", arguments, linefilter_test,nametrans)
- elif switch == '-s':
- sponge("sponge_test", arguments, sponge_test, ".foo")
- else:
- print "Unknown option."
-
-# End