Commits

Guido van Rossum  committed 907c5dd

Process command line arguments; skip #defines that generate invalid
Python

  • Participants
  • Parent commits 57b9b77
  • Branches legacy-trunk

Comments (0)

Files changed (1)

File Tools/scripts/h2py.py

 #! /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"
 # - 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()
 			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()