diff options
Diffstat (limited to 'Tools/scripts/h2py.py')
-rwxr-xr-x | Tools/scripts/h2py.py | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py index 015cd34..0b260c1 100755 --- a/Tools/scripts/h2py.py +++ b/Tools/scripts/h2py.py @@ -1,11 +1,13 @@ #! /usr/local/bin/python # Read #define's from stdin and translate to Python code on stdout. -# Very primitive: non-#define's are ignored, no check for valid Python -# syntax is made -- you will have to edit the output in most cases. +# 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: -# - accept filename arguments # - turn trailing C comments into Python comments # - turn C string quotes into Python comments # - turn C Boolean operators "&& || !" into Python "and or not" @@ -13,16 +15,35 @@ # - what to do about macros with parameters? # - reject definitions with semicolons in them -import sys, regex, string +import sys, regex, string, getopt, os p_define = regex.compile('^#[\t ]*define[\t ]+\([a-zA-Z0-9_]+\)[\t ]+') p_comment = regex.compile('/\*\([^*]+\|\*+[^/]\)*\(\*+/\)?') def main(): - process(sys.stdin) + 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): +def process(fp, outfp): + env = {} lineno = 0 while 1: line = fp.readline() @@ -44,6 +65,14 @@ def process(fp): while p_comment.search(body) >= 0: a, b = p_comment.regs[0] body = body[:a] + ' ' + body[b:] - print name, '=', string.strip(body) + 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() |