summaryrefslogtreecommitdiffstats
path: root/Demo/scripts/pp.py
blob: 0491fa9bf8bc8e3e6755e9c10354243c7801d86b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#! /usr/bin/env python

# 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)

for option, optarg in optlist:
    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') + '\n'
for line in SCRIPT:
    program = program + ('   \t   \t' + line + '\n')
program = program + (string.joinfields(epilogue, '\n') + '\n')

import tempfile
fp = tempfile.NamedTemporaryFile()
fp.write(program)
fp.flush()
if DFLAG:
    import pdb
    pdb.run('execfile(%r)' % (tfn,))
else:
    execfile(tfn)