Get rid of freeze (now its own directory).

Added some new demos.  Fixed a few others.
This commit is contained in:
Guido van Rossum 1994-10-03 16:45:35 +00:00
parent 011813444c
commit 07c9645413
6 changed files with 345 additions and 25 deletions

View file

@ -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

View file

@ -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()

97
Tools/scripts/sum5.py Executable file
View file

@ -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))