summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1994-10-03 16:45:35 (GMT)
committerGuido van Rossum <guido@python.org>1994-10-03 16:45:35 (GMT)
commit07c9645413543acbf6dff349c02e3be2bf2bc5a4 (patch)
treec40f9b1d06695b410be453362b37aa9671762154 /Tools
parent011813444cc1cae2d60a29750e719743edaa4b14 (diff)
downloadcpython-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')
-rwxr-xr-xTools/scripts/fixcid.py7
-rwxr-xr-xTools/scripts/h2py.py80
-rwxr-xr-xTools/scripts/sum5.py97
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))