home *** CD-ROM | disk | FTP | other *** search
- #! /usr/local/bin/python
-
- # Read #define's from stdin and translate to Python code on stdout.
- # Very primitive: non-#define's are ignored.
- # You will have to edit the output in some cases.
- # If one or more filenames are given, output is written to corresponding
- # filenames in the local directory, translated to all uppercase, with
- # the extension replaced by ".py".
-
- # XXX To do:
- # - turn trailing C comments into Python comments
- # - turn C string quotes into Python comments
- # - turn C Boolean operators "&& || !" into Python "and or not"
- # - what to do about #if(def)?
- # - what to do about macros with parameters?
- # - reject definitions with semicolons in them
-
- import sys, regex, string, getopt, os
-
- p_define = regex.compile('^#[\t ]*define[\t ]+\([a-zA-Z0-9_]+\)[\t ]+')
-
- p_comment = regex.compile('/\*\([^*]+\|\*+[^/]\)*\(\*+/\)?')
-
- def main():
- opts, args = getopt.getopt(sys.argv[1:], '')
- if not args:
- args = ['-']
- for filename in args:
- if filename == '-':
- sys.stdout.write('# Generated by h2py from stdin\n')
- process(sys.stdin, sys.stdout)
- else:
- fp = open(filename, 'r')
- outfile = os.path.basename(filename)
- i = string.rfind(outfile, '.')
- if i > 0: outfile = outfile[:i]
- outfile = string.upper(outfile)
- outfile = outfile + '.py'
- outfp = open(outfile, 'w')
- outfp.write('# Generated by h2py from %s\n' % filename)
- process(fp, outfp)
- outfp.close()
- fp.close()
-
- def process(fp, outfp):
- env = {}
- lineno = 0
- while 1:
- line = fp.readline()
- if not line: break
- lineno = lineno + 1
- if p_define.match(line) >= 0:
- # gobble up continuation lines
- while line[-2:] == '\\\n':
- nextline = fp.readline()
- if not nextline: break
- lineno = lineno + 1
- line = line + nextline
- regs = p_define.regs
- a, b = regs[1] # where the macro name is
- name = line[a:b]
- a, b = regs[0] # the whole match
- body = line[b:]
- # replace comments by spaces
- while p_comment.search(body) >= 0:
- a, b = p_comment.regs[0]
- body = body[:a] + ' ' + body[b:]
- stmt = '%s = %s\n' % (name, string.strip(body))
- ok = 0
- try:
- exec stmt in env
- ok = 1
- except:
- sys.stderr.write('Skipping: %s' % stmt)
- if ok:
- outfp.write(stmt)
-
- main()
-