Get rid of freeze (now its own directory).
Added some new demos.  Fixed a few others.
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 @@
 
 # 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 @@
 			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 @@
 			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 @@
 			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))