diff options
Diffstat (limited to 'Demo')
-rwxr-xr-x | Demo/scripts/pp.py | 156 |
1 files changed, 123 insertions, 33 deletions
diff --git a/Demo/scripts/pp.py b/Demo/scripts/pp.py index c3be091..fd942af 100755 --- a/Demo/scripts/pp.py +++ b/Demo/scripts/pp.py @@ -1,48 +1,138 @@ #! /usr/local/python -# Wrapper around Python to emulate the Perl -ae options: -# (1) first argument is a Python command -# (2) rest of arguments are input to the command in an implied loop -# (3) each line is put into the string L with trailing '\n' stripped -# (4) the fields of the line are put in the list F -# (5) also: FILE: full filename; LINE: full line; FP: open file object -# The command line option "-f FS" sets the field separator; -# this is available to the program as FS. +# Emulate some Perl command line options. +# Usage: pp [-a] [-c] [-d] [-e scriptline] [-F fieldsep] [-n] [-p] [file] ... +# Where the options mean the following: +# -a : together with -n or -p, splits each line into list F +# -c : check syntax only, do not execute any code +# -d : run the script under the debugger, pdb +# -e scriptline : gives one line of the Python script; may be repeated +# -F fieldsep : sets the field separator for the -a option [not in Perl] +# -n : runs the script for each line of input +# -p : prints the line after the script has run +# When no script lines have been passed, the first file argument +# contains the script. With -n or -p, the remaining arguments are +# read as input to the script, line by line. If a file is '-' +# or missing, standard input is read. + +# XXX To do: +# - add -i extension option (change files in place) +# - make a single loop over the files and lines (changes effect of 'break')? +# - add an option to specify the record separator +# - except for -n/-p, run directly from the file if at all possible import sys import string import getopt FS = '' +SCRIPT = [] +AFLAG = 0 +CFLAG = 0 +DFLAG = 0 +NFLAG = 0 +PFLAG = 0 + +try: + optlist, ARGS = getopt.getopt(sys.argv[1:], 'acde:F:np') +except getopt.error, msg: + sys.stderr.write(sys.argv[0] + ': ' + msg + '\n') + sys.exit(2) -optlist, args = getopt.getopt(sys.argv[1:], 'f:') for option, optarg in optlist: - if option == '-f': FS = optarg - -command = args[0] - -if not args[1:]: args.append('-') - -prologue = [ \ - 'for FILE in args[1:]:', \ - '\tif FILE == \'-\':', \ - '\t\tFP = sys.stdin', \ - '\telse:', \ - '\t\tFP = open(FILE, \'r\')', \ - '\twhile 1:', \ - '\t\tLINE = FP.readline()', \ - '\t\tif not LINE: break', \ - '\t\tL = LINE[:-1]', \ - '\t\tif FS: F = string.splitfields(L, FS)', \ - '\t\telse: F = string.split(L)' \ - ] + if option == '-a': + AFLAG = 1 + elif option == '-c': + CFLAG = 1 + elif option == '-d': + DFLAG = 1 + elif option == '-e': + for line in string.splitfields(optarg, '\n'): + SCRIPT.append(line) + elif option == '-F': + FS = optarg + elif option == '-n': + NFLAG = 1 + PFLAG = 0 + elif option == '-p': + NFLAG = 1 + PFLAG = 1 + else: + print option, 'not recognized???' + +if not ARGS: ARGS.append('-') + +if not SCRIPT: + if ARGS[0] == '-': + fp = sys.stdin + else: + fp = open(ARGS[0], 'r') + while 1: + line = fp.readline() + if not line: break + SCRIPT.append(line[:-1]) + del fp + del ARGS[0] + if not ARGS: ARGS.append('-') + +if CFLAG: + prologue = ['if 0:'] + epilogue = [] +elif NFLAG: + # Note that it is on purpose that AFLAG and PFLAG are + # tested dynamically each time through the loop + prologue = [ \ + 'LINECOUNT = 0', \ + 'for FILE in ARGS:', \ + ' \tif FILE == \'-\':', \ + ' \t \tFP = sys.stdin', \ + ' \telse:', \ + ' \t \tFP = open(FILE, \'r\')', \ + ' \tLINENO = 0', \ + ' \twhile 1:', \ + ' \t \tLINE = FP.readline()', \ + ' \t \tif not LINE: break', \ + ' \t \tLINENO = LINENO + 1', \ + ' \t \tLINECOUNT = LINECOUNT + 1', \ + ' \t \tL = LINE[:-1]', \ + ' \t \taflag = AFLAG', \ + ' \t \tif aflag:', \ + ' \t \t \tif FS: F = string.splitfields(L, FS)', \ + ' \t \t \telse: F = string.split(L)' \ + ] + epilogue = [ \ + ' \t \tif not PFLAG: continue', \ + ' \t \tif aflag:', \ + ' \t \t \tif FS: print string.joinfields(F, FS)', \ + ' \t \t \telse: print string.join(F)', \ + ' \t \telse: print L', \ + ] +else: + prologue = ['if 1:'] + epilogue = [] # Note that we indent using tabs only, so that any indentation style # used in 'command' will come out right after re-indentation. -program = string.joinfields(prologue, '\n') -for line in string.splitfields(command, '\n'): - program = program + ('\n\t\t' + line) -program = program + '\n' +program = string.joinfields(prologue, '\n') + '\n' +for line in SCRIPT: + program = program + (' \t \t' + line + '\n') +program = program + (string.joinfields(epilogue, '\n') + '\n') -exec(program) +import tempfile +tfn = tempfile.mktemp() +try: + fp = open(tfn, 'w') + fp.write(program) + fp.close() + if DFLAG: + import pdb + pdb.run('execfile(' + `tfn` + ')') + else: + execfile(tfn) +finally: + import os + try: + os.unlink(tfn) + except: + pass |