diff options
author | Guido van Rossum <guido@python.org> | 1994-10-03 16:45:35 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1994-10-03 16:45:35 (GMT) |
commit | 07c9645413543acbf6dff349c02e3be2bf2bc5a4 (patch) | |
tree | c40f9b1d06695b410be453362b37aa9671762154 /Tools/scripts | |
parent | 011813444cc1cae2d60a29750e719743edaa4b14 (diff) | |
download | cpython-07c9645413543acbf6dff349c02e3be2bf2bc5a4.zip cpython-07c9645413543acbf6dff349c02e3be2bf2bc5a4.tar.gz cpython-07c9645413543acbf6dff349c02e3be2bf2bc5a4.tar.bz2 |
Get rid of freeze (now its own directory).
Added some new demos. Fixed a few others.
Diffstat (limited to 'Tools/scripts')
-rwxr-xr-x | Tools/scripts/fixcid.py | 7 | ||||
-rwxr-xr-x | Tools/scripts/h2py.py | 80 | ||||
-rwxr-xr-x | Tools/scripts/sum5.py | 97 |
3 files changed, 160 insertions, 24 deletions
diff --git a/Tools/scripts/fixcid.py b/Tools/scripts/fixcid.py index ce3f1f3..3b37bb8 100755 --- a/Tools/scripts/fixcid.py +++ b/Tools/scripts/fixcid.py @@ -194,7 +194,7 @@ def fix(filename): # Tokenizing ANSI C (partly) -Identifier = '[a-zA-Z_][a-zA-Z0-9_]+' +Identifier = '\(struct \)?[a-zA-Z_][a-zA-Z0-9_]+' String = '"\([^\n\\"]\|\\\\.\)*"' Char = '\'\([^\n\\\']\|\\\\.\)*\'' CommentStart = '/\*' @@ -246,6 +246,7 @@ def fixline(line): if Program is InsideCommentProgram: if not Docomments: print 'Found in comment:', found + i = i + n continue if NotInComment.has_key(found): ## print 'Ignored in comment:', @@ -290,7 +291,9 @@ def addsubst(substfile): i = -1 # Happens to delete trailing \n words = string.split(line[:i]) if not words: continue - if len(words) <> 2: + if len(words) == 3 and words[0] == 'struct': + words[:2] == [words[0] + ' ' + words[1]] + elif len(words) <> 2: err(substfile + ':' + `lineno` + ': warning: bad line: ' + line) continue diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py index 3d7a851..db0dbd8 100755 --- a/Tools/scripts/h2py.py +++ b/Tools/scripts/h2py.py @@ -1,32 +1,43 @@ #! /usr/local/bin/python -# Read #define's from stdin and translate to Python code on stdout. -# Very primitive: non-#define's are ignored, as is anything that isn't -# valid Python as it stands. +# Read #define's and translate to Python code. +# Handle #include statements. +# Handle #define macros with one argument. +# Anything that isn't recognized or doesn't translate into valid +# Python is ignored. + +# Without filename arguments, acts as a filter. # 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". + # By passing one or more options of the form "-i regular_expression" # you can specify additional strings to be ignored. This is useful # e.g. to ignore casts to u_long: simply specify "-i '(u_long)'". # 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 #include? -# - what to do about macros with parameters? -# - reject definitions with semicolons in them +# - what to do about macros with multiple parameters? -import sys, regex, string, getopt, os +import sys, regex, regsub, string, getopt, os p_define = regex.compile('^#[\t ]*define[\t ]+\([a-zA-Z0-9_]+\)[\t ]+') +p_macro = regex.compile( + '^#[\t ]*define[\t ]+\([a-zA-Z0-9_]+\)(\([_a-zA-Z][_a-zA-Z0-9]*\))[\t ]+') + +p_include = regex.compile('^#[\t ]*include[\t ]+<\([a-zA-Z0-9_/\.]+\)') + p_comment = regex.compile('/\*\([^*]+\|\*+[^/]\)*\(\*+/\)?') ignores = [p_comment] +p_char = regex.compile("'\(\\\\.[^\\\\]*\|[^\\\\]\)'") + +filedict = {} + def main(): opts, args = getopt.getopt(sys.argv[1:], 'i:') for o, a in opts: @@ -47,40 +58,65 @@ def main(): outfile = outfile + '.py' outfp = open(outfile, 'w') outfp.write('# Generated by h2py from %s\n' % filename) + filedict = {} + if filename[:13] == '/usr/include/': + filedict[filename[13:]] = None process(fp, outfp) outfp.close() fp.close() -def process(fp, outfp): - env = {} +def process(fp, outfp, env = {}): lineno = 0 while 1: line = fp.readline() if not line: break lineno = lineno + 1 - # gobble up continuation lines - while line[-2:] == '\\\n': - nextline = fp.readline() - if not nextline: break - lineno = lineno + 1 - line = line + nextline n = p_define.match(line) if n >= 0: + # gobble up continuation lines + while line[-2:] == '\\\n': + nextline = fp.readline() + if not nextline: break + lineno = lineno + 1 + line = line + nextline name = p_define.group(1) body = line[n:] # replace ignored patterns by spaces for p in ignores: - while p.search(body) >= 0: - a, b = p.regs[0] - body = body[:a] + ' ' + body[b:] + body = regsub.gsub(p, ' ', body) + # replace char literals by ord(...) + body = regsub.gsub(p_char, 'ord(\\0)', 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: + else: outfp.write(stmt) - + n =p_macro.match(line) + if n >= 0: + macro, arg = p_macro.group(1, 2) + body = line[n:] + for p in ignores: + body = regsub.gsub(p, ' ', body) + body = regsub.gsub(p_char, 'ord(\\0)', body) + stmt = 'def %s(%s): return %s\n' % (macro, arg, body) + try: + exec stmt in env + except: + sys.stderr.write('Skipping: %s' % stmt) + else: + outfp.write(stmt) + if p_include.match(line) >= 0: + regs = p_include.regs + a, b = regs[1] + filename = line[a:b] + if not filedict.has_key(filename): + filedict[filename] = None + outfp.write( + '\n# Included from %s\n' % filename) + inclfp = open('/usr/include/' + filename, 'r') + process(inclfp, outfp, env) main() + diff --git a/Tools/scripts/sum5.py b/Tools/scripts/sum5.py new file mode 100755 index 0000000..fdb83fa --- /dev/null +++ b/Tools/scripts/sum5.py @@ -0,0 +1,97 @@ +#! /usr/local/bin/python + +# print md5 checksum for files + +bufsize = 8096 +fnfilter = None +rmode = 'r' + +usage = """ +usage: sum5 [-b] [-t] [-l] [-s bufsize] [file ...] +-b : read files in binary mode +-t : read files in text mode (default) +-l : print last pathname component only +-s bufsize: read buffer size (default %d) +file ... : files to sum; '-' or no files means stdin +""" % bufsize + +import sys +import string +import os +import md5 +import regsub + +StringType = type('') +FileType = type(sys.stdin) + +def sum(*files): + sts = 0 + if files and type(files[-1]) == FileType: + out, files = files[-1], files[:-1] + else: + out = sys.stdout + if len(files) == 1 and type(files[0]) != StringType: + files = files[0] + for f in files: + if type(f) == StringType: + if f == '-': + sts = printsumfp(sys.stdin, '<stdin>', out) or sts + else: + sts = printsum(f, out) or sts + else: + sts = sum(f, out) or sts + return sts + +def printsum(file, out = sys.stdout): + try: + fp = open(file, rmode) + except IOError, msg: + sys.stderr.write('%s: Can\'t open: %s\n' % (file, msg)) + return 1 + if fnfilter: + file = fnfilter(file) + sts = printsumfp(fp, file, out) + fp.close() + return sts + +def printsumfp(fp, file, out = sys.stdout): + m = md5.md5() + try: + while 1: + data = fp.read(bufsize) + if not data: break + m.update(data) + except IOError, msg: + sys.stderr.write('%s: I/O error: %s\n' % (file, msg)) + return 1 + out.write('%s %s\n' % (hexify(m.digest()), file)) + return 0 + +def hexify(s): + res = '' + for c in s: + res = res + '%02x' % ord(c) + return res + +def main(args = sys.argv[1:], out = sys.stdout): + global fnfilter, rmode, bufsize + import getopt + try: + opts, args = getopt.getopt(args, 'blts:') + except getopt.error, msg: + sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage)) + return 2 + for o, a in opts: + if o == '-l': + fnfilter = os.path.basename + if o == '-b': + rmode = 'rb' + if o == '-t': + rmode = 'r' + if o == '-s': + bufsize = string.atoi(a) + if not args: args = ['-'] + return sum(args, out) + +if __name__ == '__main__' or __name__ == sys.argv[0]: + sys.exit(main(sys.argv[1:], sys.stdout)) |