File: class/Workbook/Exercises/Lab10/cheader.py
#! /usr/local/bin/python
import sys, regex, string
# patt_define matches: "#define name ..."
# patt_macro matches: "#define name(arg) ..."
# patt_include matches: "#include (<|")name/name/name.name..."
patt_define = regex.compile(
'^#[\t ]*define[\t ]+\([a-zA-Z0-9_]+\)[\t ]*')
patt_macro = regex.compile(
'^#[\t ]*define[\t ]+\([a-zA-Z0-9_]+\)(\([_a-zA-Z][_a-zA-Z0-9]*\))[\t ]+')
patt_include = regex.compile(
'^#[\t ]*include[\t ]+[<"]\([a-zA-Z0-9_/\.]+\)')
def scan(file):
lineno = 0
while 1: # scan input file line-by-line
line = file.readline()
if not line: break
lineno = lineno + 1
n = patt_macro.match(line)
if n >= 0:
line, lineno = cont(file, line, lineno)
name, arg = patt_macro.group(1, 2) # two matched substrings
body = line[n:]
print '%d) %s[%s] = %s' % (lineno, name, arg, string.strip(body))
continue
n = patt_define.match(line) # save length-of-match
if n >= 0:
line, lineno = cont(file, line, lineno)
name = patt_define.group(1) # substring for \(...\)
body = line[n:]
print '%d) %s = %s' % (lineno, name, string.strip(body) or None)
continue
if patt_include.match(line) >= 0:
regs = patt_include.regs # start/stop indexes
a, b = regs[1] # for nested patterns
filename = line[a:b] # slice out of line
print '%d) include %s' % (lineno, filename)
def cont(file, line, lineno):
while line[-2:] == '\\\n':
next = file.readline() # merge continuation lines
if not next: break
line, lineno = line[:-2]+next, lineno+1
return line, lineno
if len(sys.argv) == 1:
scan(sys.stdin) # no args: read stdin
else:
scan(open(sys.argv[1], 'r')) # arg: input file name