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 015cd34342..0b260c1f2c 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() | 
