Whitespace normalization.  Ran reindent.py over the entire source tree.
diff --git a/Demo/scripts/eqfix.py b/Demo/scripts/eqfix.py
index 2139d2b..deac4f8 100755
--- a/Demo/scripts/eqfix.py
+++ b/Demo/scripts/eqfix.py
@@ -1,9 +1,9 @@
 #! /usr/bin/env python
 
 # Fix Python source files to use the new equality test operator, i.e.,
-#	if x = y: ...
+#       if x = y: ...
 # is changed to
-#	if x == y: ...
+#       if x == y: ...
 # The script correctly tokenizes the Python program to reliably
 # distinguish between assignments and equality tests.
 #
@@ -39,160 +39,160 @@
 rep = sys.stdout.write
 
 def main():
-	bad = 0
-	if not sys.argv[1:]: # No arguments
-		err('usage: ' + sys.argv[0] + ' file-or-directory ...\n')
-		sys.exit(2)
-	for arg in sys.argv[1:]:
-		if os.path.isdir(arg):
-			if recursedown(arg): bad = 1
-		elif os.path.islink(arg):
-			err(arg + ': will not process symbolic links\n')
-			bad = 1
-		else:
-			if fix(arg): bad = 1
-	sys.exit(bad)
+    bad = 0
+    if not sys.argv[1:]: # No arguments
+        err('usage: ' + sys.argv[0] + ' file-or-directory ...\n')
+        sys.exit(2)
+    for arg in sys.argv[1:]:
+        if os.path.isdir(arg):
+            if recursedown(arg): bad = 1
+        elif os.path.islink(arg):
+            err(arg + ': will not process symbolic links\n')
+            bad = 1
+        else:
+            if fix(arg): bad = 1
+    sys.exit(bad)
 
 ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
 def ispython(name):
-	return ispythonprog.match(name) >= 0
+    return ispythonprog.match(name) >= 0
 
 def recursedown(dirname):
-	dbg('recursedown(%r)\n' % (dirname,))
-	bad = 0
-	try:
-		names = os.listdir(dirname)
-	except os.error, msg:
-		err('%s: cannot list directory: %r\n' % (dirname, msg))
-		return 1
-	names.sort()
-	subdirs = []
-	for name in names:
-		if name in (os.curdir, os.pardir): continue
-		fullname = os.path.join(dirname, name)
-		if os.path.islink(fullname): pass
-		elif os.path.isdir(fullname):
-			subdirs.append(fullname)
-		elif ispython(name):
-			if fix(fullname): bad = 1
-	for fullname in subdirs:
-		if recursedown(fullname): bad = 1
-	return bad
+    dbg('recursedown(%r)\n' % (dirname,))
+    bad = 0
+    try:
+        names = os.listdir(dirname)
+    except os.error, msg:
+        err('%s: cannot list directory: %r\n' % (dirname, msg))
+        return 1
+    names.sort()
+    subdirs = []
+    for name in names:
+        if name in (os.curdir, os.pardir): continue
+        fullname = os.path.join(dirname, name)
+        if os.path.islink(fullname): pass
+        elif os.path.isdir(fullname):
+            subdirs.append(fullname)
+        elif ispython(name):
+            if fix(fullname): bad = 1
+    for fullname in subdirs:
+        if recursedown(fullname): bad = 1
+    return bad
 
 def fix(filename):
-##	dbg('fix(%r)\n' % (dirname,))
-	try:
-		f = open(filename, 'r')
-	except IOError, msg:
-		err('%s: cannot open: %r\n' % (filename, msg))
-		return 1
-	head, tail = os.path.split(filename)
-	tempname = os.path.join(head, '@' + tail)
-	g = None
-	# If we find a match, we rewind the file and start over but
-	# now copy everything to a temp file.
-	lineno = 0
-	while 1:
-		line = f.readline()
-		if not line: break
-		lineno = lineno + 1
-		if g is None and '\0' in line:
-			# Check for binary files
-			err(filename + ': contains null bytes; not fixed\n')
-			f.close()
-			return 1
-		if lineno == 1 and g is None and line[:2] == '#!':
-			# Check for non-Python scripts
-			words = string.split(line[2:])
-			if words and regex.search('[pP]ython', words[0]) < 0:
-				msg = filename + ': ' + words[0]
-				msg = msg + ' script; not fixed\n'
-				err(msg)
-				f.close()
-				return 1
-		while line[-2:] == '\\\n':
-			nextline = f.readline()
-			if not nextline: break
-			line = line + nextline
-			lineno = lineno + 1
-		newline = fixline(line)
-		if newline != line:
-			if g is None:
-				try:
-					g = open(tempname, 'w')
-				except IOError, msg:
-					f.close()
-					err('%s: cannot create: %r\n' % (tempname, msg))
-					return 1
-				f.seek(0)
-				lineno = 0
-				rep(filename + ':\n')
-				continue # restart from the beginning
-			rep(repr(lineno) + '\n')
-			rep('< ' + line)
-			rep('> ' + newline)
-		if g is not None:
-			g.write(newline)
+##      dbg('fix(%r)\n' % (dirname,))
+    try:
+        f = open(filename, 'r')
+    except IOError, msg:
+        err('%s: cannot open: %r\n' % (filename, msg))
+        return 1
+    head, tail = os.path.split(filename)
+    tempname = os.path.join(head, '@' + tail)
+    g = None
+    # If we find a match, we rewind the file and start over but
+    # now copy everything to a temp file.
+    lineno = 0
+    while 1:
+        line = f.readline()
+        if not line: break
+        lineno = lineno + 1
+        if g is None and '\0' in line:
+            # Check for binary files
+            err(filename + ': contains null bytes; not fixed\n')
+            f.close()
+            return 1
+        if lineno == 1 and g is None and line[:2] == '#!':
+            # Check for non-Python scripts
+            words = string.split(line[2:])
+            if words and regex.search('[pP]ython', words[0]) < 0:
+                msg = filename + ': ' + words[0]
+                msg = msg + ' script; not fixed\n'
+                err(msg)
+                f.close()
+                return 1
+        while line[-2:] == '\\\n':
+            nextline = f.readline()
+            if not nextline: break
+            line = line + nextline
+            lineno = lineno + 1
+        newline = fixline(line)
+        if newline != line:
+            if g is None:
+                try:
+                    g = open(tempname, 'w')
+                except IOError, msg:
+                    f.close()
+                    err('%s: cannot create: %r\n' % (tempname, msg))
+                    return 1
+                f.seek(0)
+                lineno = 0
+                rep(filename + ':\n')
+                continue # restart from the beginning
+            rep(repr(lineno) + '\n')
+            rep('< ' + line)
+            rep('> ' + newline)
+        if g is not None:
+            g.write(newline)
 
-	# End of file
-	f.close()
-	if not g: return 0 # No changes
-	
-	# Finishing touch -- move files
+    # End of file
+    f.close()
+    if not g: return 0 # No changes
 
-	# First copy the file's mode to the temp file
-	try:
-		statbuf = os.stat(filename)
-		os.chmod(tempname, statbuf[ST_MODE] & 07777)
-	except os.error, msg:
-		err('%s: warning: chmod failed (%r)\n' % (tempname, msg))
-	# Then make a backup of the original file as filename~
-	try:
-		os.rename(filename, filename + '~')
-	except os.error, msg:
-		err('%s: warning: backup failed (%r)\n' % (filename, msg))
-	# Now move the temp file to the original file
-	try:
-		os.rename(tempname, filename)
-	except os.error, msg:
-		err('%s: rename failed (%r)\n' % (filename, msg))
-		return 1
-	# Return succes
-	return 0
+    # Finishing touch -- move files
+
+    # First copy the file's mode to the temp file
+    try:
+        statbuf = os.stat(filename)
+        os.chmod(tempname, statbuf[ST_MODE] & 07777)
+    except os.error, msg:
+        err('%s: warning: chmod failed (%r)\n' % (tempname, msg))
+    # Then make a backup of the original file as filename~
+    try:
+        os.rename(filename, filename + '~')
+    except os.error, msg:
+        err('%s: warning: backup failed (%r)\n' % (filename, msg))
+    # Now move the temp file to the original file
+    try:
+        os.rename(tempname, filename)
+    except os.error, msg:
+        err('%s: rename failed (%r)\n' % (filename, msg))
+        return 1
+    # Return succes
+    return 0
 
 
 from tokenize import tokenprog
 
 match = {'if':':', 'elif':':', 'while':':', 'return':'\n', \
-	 '(':')', '[':']', '{':'}', '`':'`'}
+         '(':')', '[':']', '{':'}', '`':'`'}
 
 def fixline(line):
-	# Quick check for easy case
-	if '=' not in line: return line
-	
-	i, n = 0, len(line)
-	stack = []
-	while i < n:
-		j = tokenprog.match(line, i)
-		if j < 0:
-			# A bad token; forget about the rest of this line
-			print '(Syntax error:)'
-			print line,
-			return line
-		a, b = tokenprog.regs[3] # Location of the token proper
-		token = line[a:b]
-		i = i+j
-		if stack and token == stack[-1]:
-			del stack[-1]
-		elif match.has_key(token):
-			stack.append(match[token])
-		elif token == '=' and stack:
-			line = line[:a] + '==' + line[b:]
-			i, n = a + len('=='), len(line)
-		elif token == '==' and not stack:
-			print '(Warning: \'==\' at top level:)'
-			print line,
-	return line
+    # Quick check for easy case
+    if '=' not in line: return line
+
+    i, n = 0, len(line)
+    stack = []
+    while i < n:
+        j = tokenprog.match(line, i)
+        if j < 0:
+            # A bad token; forget about the rest of this line
+            print '(Syntax error:)'
+            print line,
+            return line
+        a, b = tokenprog.regs[3] # Location of the token proper
+        token = line[a:b]
+        i = i+j
+        if stack and token == stack[-1]:
+            del stack[-1]
+        elif match.has_key(token):
+            stack.append(match[token])
+        elif token == '=' and stack:
+            line = line[:a] + '==' + line[b:]
+            i, n = a + len('=='), len(line)
+        elif token == '==' and not stack:
+            print '(Warning: \'==\' at top level:)'
+            print line,
+    return line
 
 
 main()
diff --git a/Demo/scripts/fact.py b/Demo/scripts/fact.py
index 6cc389e..5497f66 100755
--- a/Demo/scripts/fact.py
+++ b/Demo/scripts/fact.py
@@ -8,41 +8,41 @@
 import sys
 from math import sqrt
 
-error = 'fact.error'		# exception
+error = 'fact.error'            # exception
 
 def fact(n):
-	if n < 1: raise error	# fact() argument should be >= 1
-	if n == 1: return []	# special case
-	res = []
-	# Treat even factors special, so we can use i = i+2 later
-	while n%2 == 0:
-		res.append(2)
-		n = n/2
-	# Try odd numbers up to sqrt(n)
-	limit = sqrt(float(n+1))
-	i = 3
-	while i <= limit:
-		if n%i == 0:
-			res.append(i)
-			n = n/i
-			limit = sqrt(n+1)
-		else:
-			i = i+2
-	if n != 1:
-		res.append(n)
-	return res
+    if n < 1: raise error   # fact() argument should be >= 1
+    if n == 1: return []    # special case
+    res = []
+    # Treat even factors special, so we can use i = i+2 later
+    while n%2 == 0:
+        res.append(2)
+        n = n/2
+    # Try odd numbers up to sqrt(n)
+    limit = sqrt(float(n+1))
+    i = 3
+    while i <= limit:
+        if n%i == 0:
+            res.append(i)
+            n = n/i
+            limit = sqrt(n+1)
+        else:
+            i = i+2
+    if n != 1:
+        res.append(n)
+    return res
 
 def main():
-	if len(sys.argv) > 1:
-		for arg in sys.argv[1:]:
-			n = eval(arg)
-			print n, fact(n)
-	else:
-		try:
-			while 1:
-				n = input()
-				print n, fact(n)
-		except EOFError:
-			pass
+    if len(sys.argv) > 1:
+        for arg in sys.argv[1:]:
+            n = eval(arg)
+            print n, fact(n)
+    else:
+        try:
+            while 1:
+                n = input()
+                print n, fact(n)
+        except EOFError:
+            pass
 
 main()
diff --git a/Demo/scripts/ftpstats.py b/Demo/scripts/ftpstats.py
index 8af72b5..13d0553 100755
--- a/Demo/scripts/ftpstats.py
+++ b/Demo/scripts/ftpstats.py
@@ -21,124 +21,124 @@
 prog = regex.compile(pat)
 
 def main():
-	maxitems = 25
-	search = None
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'm:s:')
-	except getopt.error, msg:
-		print msg
-		print 'usage: ftpstats [-m maxitems] [file]'
-		sys.exit(2)
-	for o, a in opts:
-		if o == '-m':
-			maxitems = string.atoi(a)
-		if o == '-s':
-			search = a
-	file = '/usr/adm/ftpd'
-	if args: file = args[0]
-	if file == '-':
-		f = sys.stdin
-	else:
-		try:
-			f = open(file, 'r')
-		except IOError, msg:
-			print file, ':', msg
-			sys.exit(1)
-	bydate = {}
-	bytime = {}
-	byfile = {}
-	bydir = {}
-	byhost = {}
-	byuser = {}
-	bytype = {}
-	lineno = 0
-	try:
-		while 1:
-			line = f.readline()
-			if not line: break
-			lineno = lineno + 1
-			if search and string.find(line, search) < 0:
-				continue
-			if prog.match(line) < 0:
-				print 'Bad line', lineno, ':', repr(line)
-				continue
-			items = prog.group(1, 2, 3, 4, 5, 6)
-			(logtime, loguser, loghost, logfile, logbytes,
-			 logxxx2) = items
-## 			print logtime
-## 			print '-->', loguser
-## 			print '--> -->', loghost
-## 			print '--> --> -->', logfile
-## 			print '--> --> --> -->', logbytes
-## 			print '--> --> --> --> -->', logxxx2
-## 			for i in logtime, loghost, logbytes, logxxx2:
-## 				if '!' in i: print '???', i
-			add(bydate, logtime[-4:] + ' ' + logtime[:6], items)
-			add(bytime, logtime[7:9] + ':00-59', items)
-			direction, logfile = logfile[0], logfile[1:]
-			# The real path probably starts at the last //...
-			while 1:
-				i = string.find(logfile, '//')
-				if i < 0: break
-				logfile = logfile[i+1:]
-			add(byfile, logfile + ' ' + direction, items)
-			logdir = os.path.dirname(logfile)
-##		logdir = os.path.normpath(logdir) + '/.'
-			while 1:
-				add(bydir, logdir + ' ' + direction, items)
-				dirhead = os.path.dirname(logdir)
-				if dirhead == logdir: break
-				logdir = dirhead
-			add(byhost, loghost, items)
-			add(byuser, loguser, items)
-			add(bytype, direction, items)
-	except KeyboardInterrupt:
-		print 'Interrupted at line', lineno
-	show(bytype, 'by transfer direction', maxitems)
-	show(bydir, 'by directory', maxitems)
-	show(byfile, 'by file', maxitems)
-	show(byhost, 'by host', maxitems)
-	show(byuser, 'by user', maxitems)
-	showbar(bydate, 'by date')
-	showbar(bytime, 'by time of day')
+    maxitems = 25
+    search = None
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], 'm:s:')
+    except getopt.error, msg:
+        print msg
+        print 'usage: ftpstats [-m maxitems] [file]'
+        sys.exit(2)
+    for o, a in opts:
+        if o == '-m':
+            maxitems = string.atoi(a)
+        if o == '-s':
+            search = a
+    file = '/usr/adm/ftpd'
+    if args: file = args[0]
+    if file == '-':
+        f = sys.stdin
+    else:
+        try:
+            f = open(file, 'r')
+        except IOError, msg:
+            print file, ':', msg
+            sys.exit(1)
+    bydate = {}
+    bytime = {}
+    byfile = {}
+    bydir = {}
+    byhost = {}
+    byuser = {}
+    bytype = {}
+    lineno = 0
+    try:
+        while 1:
+            line = f.readline()
+            if not line: break
+            lineno = lineno + 1
+            if search and string.find(line, search) < 0:
+                continue
+            if prog.match(line) < 0:
+                print 'Bad line', lineno, ':', repr(line)
+                continue
+            items = prog.group(1, 2, 3, 4, 5, 6)
+            (logtime, loguser, loghost, logfile, logbytes,
+             logxxx2) = items
+##                      print logtime
+##                      print '-->', loguser
+##                      print '--> -->', loghost
+##                      print '--> --> -->', logfile
+##                      print '--> --> --> -->', logbytes
+##                      print '--> --> --> --> -->', logxxx2
+##                      for i in logtime, loghost, logbytes, logxxx2:
+##                              if '!' in i: print '???', i
+            add(bydate, logtime[-4:] + ' ' + logtime[:6], items)
+            add(bytime, logtime[7:9] + ':00-59', items)
+            direction, logfile = logfile[0], logfile[1:]
+            # The real path probably starts at the last //...
+            while 1:
+                i = string.find(logfile, '//')
+                if i < 0: break
+                logfile = logfile[i+1:]
+            add(byfile, logfile + ' ' + direction, items)
+            logdir = os.path.dirname(logfile)
+##              logdir = os.path.normpath(logdir) + '/.'
+            while 1:
+                add(bydir, logdir + ' ' + direction, items)
+                dirhead = os.path.dirname(logdir)
+                if dirhead == logdir: break
+                logdir = dirhead
+            add(byhost, loghost, items)
+            add(byuser, loguser, items)
+            add(bytype, direction, items)
+    except KeyboardInterrupt:
+        print 'Interrupted at line', lineno
+    show(bytype, 'by transfer direction', maxitems)
+    show(bydir, 'by directory', maxitems)
+    show(byfile, 'by file', maxitems)
+    show(byhost, 'by host', maxitems)
+    show(byuser, 'by user', maxitems)
+    showbar(bydate, 'by date')
+    showbar(bytime, 'by time of day')
 
 def showbar(dict, title):
-	n = len(title)
-	print '='*((70-n)/2), title, '='*((71-n)/2)
-	list = []
-	keys = dict.keys()
-	keys.sort()
-	for key in keys:
-		n = len(str(key))
-		list.append((len(dict[key]), key))
-	maxkeylength = 0
-	maxcount = 0
-	for count, key in list:
-		maxkeylength = max(maxkeylength, len(key))
-		maxcount = max(maxcount, count)
-	maxbarlength = 72 - maxkeylength - 7
-	for count, key in list:
-		barlength = int(round(maxbarlength*float(count)/maxcount))
-		bar = '*'*barlength
-		print '%5d %-*s %s' % (count, maxkeylength, key, bar)
+    n = len(title)
+    print '='*((70-n)/2), title, '='*((71-n)/2)
+    list = []
+    keys = dict.keys()
+    keys.sort()
+    for key in keys:
+        n = len(str(key))
+        list.append((len(dict[key]), key))
+    maxkeylength = 0
+    maxcount = 0
+    for count, key in list:
+        maxkeylength = max(maxkeylength, len(key))
+        maxcount = max(maxcount, count)
+    maxbarlength = 72 - maxkeylength - 7
+    for count, key in list:
+        barlength = int(round(maxbarlength*float(count)/maxcount))
+        bar = '*'*barlength
+        print '%5d %-*s %s' % (count, maxkeylength, key, bar)
 
 def show(dict, title, maxitems):
-	if len(dict) > maxitems:
-		title = title + ' (first %d)'%maxitems
-	n = len(title)
-	print '='*((70-n)/2), title, '='*((71-n)/2)
-	list = []
-	keys = dict.keys()
-	for key in keys:
-		list.append((-len(dict[key]), key))
-	list.sort()
-	for count, key in list[:maxitems]:
-		print '%5d %s' % (-count, key)
+    if len(dict) > maxitems:
+        title = title + ' (first %d)'%maxitems
+    n = len(title)
+    print '='*((70-n)/2), title, '='*((71-n)/2)
+    list = []
+    keys = dict.keys()
+    for key in keys:
+        list.append((-len(dict[key]), key))
+    list.sort()
+    for count, key in list[:maxitems]:
+        print '%5d %s' % (-count, key)
 
 def add(dict, key, item):
-	if dict.has_key(key):
-		dict[key].append(item)
-	else:
-		dict[key] = [item]
+    if dict.has_key(key):
+        dict[key].append(item)
+    else:
+        dict[key] = [item]
 
 main()
diff --git a/Demo/scripts/lpwatch.py b/Demo/scripts/lpwatch.py
index 00afba9..0af3cbd 100755
--- a/Demo/scripts/lpwatch.py
+++ b/Demo/scripts/lpwatch.py
@@ -12,98 +12,98 @@
 DEF_DELAY = 10
 
 def main():
-	delay = DEF_DELAY # XXX Use getopt() later
-	try:
-		thisuser = posix.environ['LOGNAME']
-	except:
-		thisuser = posix.environ['USER']
-	printers = sys.argv[1:]
-	if printers:
-		# Strip '-P' from printer names just in case
-		# the user specified it...
-		for i in range(len(printers)):
-			if printers[i][:2] == '-P':
-				printers[i] = printers[i][2:]
-	else:
-		if posix.environ.has_key('PRINTER'):
-			printers = [posix.environ['PRINTER']]
-		else:
-			printers = [DEF_PRINTER]
-	#
-	clearhome = posix.popen('clear', 'r').read()
-	#
-	while 1:
-		text = clearhome
-		for name in printers:
-			text = text + makestatus(name, thisuser) + '\n'
-		print text
-		time.sleep(delay)
+    delay = DEF_DELAY # XXX Use getopt() later
+    try:
+        thisuser = posix.environ['LOGNAME']
+    except:
+        thisuser = posix.environ['USER']
+    printers = sys.argv[1:]
+    if printers:
+        # Strip '-P' from printer names just in case
+        # the user specified it...
+        for i in range(len(printers)):
+            if printers[i][:2] == '-P':
+                printers[i] = printers[i][2:]
+    else:
+        if posix.environ.has_key('PRINTER'):
+            printers = [posix.environ['PRINTER']]
+        else:
+            printers = [DEF_PRINTER]
+    #
+    clearhome = posix.popen('clear', 'r').read()
+    #
+    while 1:
+        text = clearhome
+        for name in printers:
+            text = text + makestatus(name, thisuser) + '\n'
+        print text
+        time.sleep(delay)
 
 def makestatus(name, thisuser):
-	pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
-	lines = []
-	users = {}
-	aheadbytes = 0
-	aheadjobs = 0
-	userseen = 0
-	totalbytes = 0
-	totaljobs = 0
-	while 1:
-		line = pipe.readline()
-		if not line: break
-		fields = string.split(line)
-		n = len(fields)
-		if len(fields) >= 6 and fields[n-1] == 'bytes':
-			rank = fields[0]
-			user = fields[1]
-			job = fields[2]
-			files = fields[3:-2]
-			bytes = eval(fields[n-2])
-			if user == thisuser:
-				userseen = 1
-			elif not userseen:
-				aheadbytes = aheadbytes + bytes
-				aheadjobs = aheadjobs + 1
-			totalbytes = totalbytes + bytes
-			totaljobs = totaljobs + 1
-			if users.has_key(user):
-				ujobs, ubytes = users[user]
-			else:
-				ujobs, ubytes = 0, 0
-			ujobs = ujobs + 1
-			ubytes = ubytes + bytes
-			users[user] = ujobs, ubytes
-		else:
-			if fields and fields[0] <> 'Rank':
-				line = string.strip(line)
-				if line == 'no entries':
-					line = name + ': idle'
-				elif line[-22:] == ' is ready and printing':
-					line = name
-				lines.append(line)
-	#
-	if totaljobs:
-		line = '%d K' % ((totalbytes+1023)/1024)
-		if totaljobs <> len(users):
-			line = line + ' (%d jobs)' % totaljobs
-		if len(users) == 1:
-			line = line + ' for %s' % (users.keys()[0],)
-		else:
-			line = line + ' for %d users' % len(users)
-			if userseen:
-				if aheadjobs == 0:
-					line =  line + ' (%s first)' % thisuser
-				else:
-					line = line + ' (%d K before %s)' % (
-					               (aheadbytes+1023)/1024, thisuser)
-		lines.append(line)
-	#
-	sts = pipe.close()
-	if sts:
-		lines.append('lpq exit status %r' % (sts,))
-	return string.joinfields(lines, ': ')
+    pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
+    lines = []
+    users = {}
+    aheadbytes = 0
+    aheadjobs = 0
+    userseen = 0
+    totalbytes = 0
+    totaljobs = 0
+    while 1:
+        line = pipe.readline()
+        if not line: break
+        fields = string.split(line)
+        n = len(fields)
+        if len(fields) >= 6 and fields[n-1] == 'bytes':
+            rank = fields[0]
+            user = fields[1]
+            job = fields[2]
+            files = fields[3:-2]
+            bytes = eval(fields[n-2])
+            if user == thisuser:
+                userseen = 1
+            elif not userseen:
+                aheadbytes = aheadbytes + bytes
+                aheadjobs = aheadjobs + 1
+            totalbytes = totalbytes + bytes
+            totaljobs = totaljobs + 1
+            if users.has_key(user):
+                ujobs, ubytes = users[user]
+            else:
+                ujobs, ubytes = 0, 0
+            ujobs = ujobs + 1
+            ubytes = ubytes + bytes
+            users[user] = ujobs, ubytes
+        else:
+            if fields and fields[0] <> 'Rank':
+                line = string.strip(line)
+                if line == 'no entries':
+                    line = name + ': idle'
+                elif line[-22:] == ' is ready and printing':
+                    line = name
+                lines.append(line)
+    #
+    if totaljobs:
+        line = '%d K' % ((totalbytes+1023)/1024)
+        if totaljobs <> len(users):
+            line = line + ' (%d jobs)' % totaljobs
+        if len(users) == 1:
+            line = line + ' for %s' % (users.keys()[0],)
+        else:
+            line = line + ' for %d users' % len(users)
+            if userseen:
+                if aheadjobs == 0:
+                    line =  line + ' (%s first)' % thisuser
+                else:
+                    line = line + ' (%d K before %s)' % (
+                                   (aheadbytes+1023)/1024, thisuser)
+        lines.append(line)
+    #
+    sts = pipe.close()
+    if sts:
+        lines.append('lpq exit status %r' % (sts,))
+    return string.joinfields(lines, ': ')
 
 try:
-	main()
+    main()
 except KeyboardInterrupt:
-	pass
+    pass
diff --git a/Demo/scripts/makedir.py b/Demo/scripts/makedir.py
index 4c00d88..209f6c4 100755
--- a/Demo/scripts/makedir.py
+++ b/Demo/scripts/makedir.py
@@ -8,13 +8,13 @@
 import sys, os
 
 def main():
-	for p in sys.argv[1:]:
-		makedirs(p)
+    for p in sys.argv[1:]:
+        makedirs(p)
 
 def makedirs(p):
-	if p and not os.path.isdir(p):
-		head, tail = os.path.split(p)
-		makedirs(head)
-		os.mkdir(p, 0777)
+    if p and not os.path.isdir(p):
+        head, tail = os.path.split(p)
+        makedirs(head)
+        os.mkdir(p, 0777)
 
 main()
diff --git a/Demo/scripts/markov.py b/Demo/scripts/markov.py
index b0583d1..3329351 100755
--- a/Demo/scripts/markov.py
+++ b/Demo/scripts/markov.py
@@ -1,116 +1,116 @@
 #! /usr/bin/env python
 
 class Markov:
-	def __init__(self, histsize, choice):
-		self.histsize = histsize
-		self.choice = choice
-		self.trans = {}
-	def add(self, state, next):
-		if not self.trans.has_key(state):
-			self.trans[state] = [next]
-		else:
-			self.trans[state].append(next)
-	def put(self, seq):
-		n = self.histsize
-		add = self.add
-		add(None, seq[:0])
-		for i in range(len(seq)):
-			add(seq[max(0, i-n):i], seq[i:i+1])
-		add(seq[len(seq)-n:], None)
-	def get(self):
-		choice = self.choice
-		trans = self.trans
-		n = self.histsize
-		seq = choice(trans[None])
-		while 1:
-			subseq = seq[max(0, len(seq)-n):]
-			options = trans[subseq]
-			next = choice(options)
-			if not next: break
-			seq = seq + next
-		return seq
+    def __init__(self, histsize, choice):
+        self.histsize = histsize
+        self.choice = choice
+        self.trans = {}
+    def add(self, state, next):
+        if not self.trans.has_key(state):
+            self.trans[state] = [next]
+        else:
+            self.trans[state].append(next)
+    def put(self, seq):
+        n = self.histsize
+        add = self.add
+        add(None, seq[:0])
+        for i in range(len(seq)):
+            add(seq[max(0, i-n):i], seq[i:i+1])
+        add(seq[len(seq)-n:], None)
+    def get(self):
+        choice = self.choice
+        trans = self.trans
+        n = self.histsize
+        seq = choice(trans[None])
+        while 1:
+            subseq = seq[max(0, len(seq)-n):]
+            options = trans[subseq]
+            next = choice(options)
+            if not next: break
+            seq = seq + next
+        return seq
 
 def test():
-	import sys, string, random, getopt
-	args = sys.argv[1:]
-	try:
-		opts, args = getopt.getopt(args, '0123456789cdw')
-	except getopt.error:
-		print 'Usage: markov [-#] [-cddqw] [file] ...'
-		print 'Options:'
-		print '-#: 1-digit history size (default 2)'
-		print '-c: characters (default)'
-		print '-w: words'
-		print '-d: more debugging output'
-		print '-q: no debugging output'
-		print 'Input files (default stdin) are split in paragraphs'
-		print 'separated blank lines and each paragraph is split'
-		print 'in words by whitespace, then reconcatenated with'
-		print 'exactly one space separating words.'
-		print 'Output consists of paragraphs separated by blank'
-		print 'lines, where lines are no longer than 72 characters.'
-	histsize = 2
-	do_words = 0
-	debug = 1
-	for o, a in opts:
-		if '-0' <= o <= '-9': histsize = eval(o[1:])
-		if o == '-c': do_words = 0
-		if o == '-d': debug = debug + 1
-		if o == '-q': debug = 0
-		if o == '-w': do_words = 1
-	if not args: args = ['-']
-	m = Markov(histsize, random.choice)
-	try:
-	    for filename in args:
-		    if filename == '-':
-			    f = sys.stdin
-			    if f.isatty():
-				    print 'Sorry, need stdin from file'
-				    continue
-		    else:
-			    f = open(filename, 'r')
-		    if debug: print 'processing', filename, '...'
-		    text = f.read()
-		    f.close()
-		    paralist = string.splitfields(text, '\n\n')
-		    for para in paralist:
-			    if debug > 1: print 'feeding ...'
-			    words = string.split(para)
-			    if words:
-				    if do_words: data = tuple(words)
-				    else: data = string.joinfields(words, ' ')
-				    m.put(data)
-	except KeyboardInterrupt:
-		print 'Interrupted -- continue with data read so far'
-	if not m.trans:
-		print 'No valid input files'
-		return
-	if debug: print 'done.'
-	if debug > 1:
-		for key in m.trans.keys():
-			if key is None or len(key) < histsize:
-				print repr(key), m.trans[key]
-		if histsize == 0: print repr(''), m.trans['']
-		print
-	while 1:
-		data = m.get()
-		if do_words: words = data
-		else: words = string.split(data)
-		n = 0
-		limit = 72
-		for w in words:
-			if n + len(w) > limit:
-				print
-				n = 0
-			print w,
-			n = n + len(w) + 1
-		print
-		print
+    import sys, string, random, getopt
+    args = sys.argv[1:]
+    try:
+        opts, args = getopt.getopt(args, '0123456789cdw')
+    except getopt.error:
+        print 'Usage: markov [-#] [-cddqw] [file] ...'
+        print 'Options:'
+        print '-#: 1-digit history size (default 2)'
+        print '-c: characters (default)'
+        print '-w: words'
+        print '-d: more debugging output'
+        print '-q: no debugging output'
+        print 'Input files (default stdin) are split in paragraphs'
+        print 'separated blank lines and each paragraph is split'
+        print 'in words by whitespace, then reconcatenated with'
+        print 'exactly one space separating words.'
+        print 'Output consists of paragraphs separated by blank'
+        print 'lines, where lines are no longer than 72 characters.'
+    histsize = 2
+    do_words = 0
+    debug = 1
+    for o, a in opts:
+        if '-0' <= o <= '-9': histsize = eval(o[1:])
+        if o == '-c': do_words = 0
+        if o == '-d': debug = debug + 1
+        if o == '-q': debug = 0
+        if o == '-w': do_words = 1
+    if not args: args = ['-']
+    m = Markov(histsize, random.choice)
+    try:
+        for filename in args:
+            if filename == '-':
+                f = sys.stdin
+                if f.isatty():
+                    print 'Sorry, need stdin from file'
+                    continue
+            else:
+                f = open(filename, 'r')
+            if debug: print 'processing', filename, '...'
+            text = f.read()
+            f.close()
+            paralist = string.splitfields(text, '\n\n')
+            for para in paralist:
+                if debug > 1: print 'feeding ...'
+                words = string.split(para)
+                if words:
+                    if do_words: data = tuple(words)
+                    else: data = string.joinfields(words, ' ')
+                    m.put(data)
+    except KeyboardInterrupt:
+        print 'Interrupted -- continue with data read so far'
+    if not m.trans:
+        print 'No valid input files'
+        return
+    if debug: print 'done.'
+    if debug > 1:
+        for key in m.trans.keys():
+            if key is None or len(key) < histsize:
+                print repr(key), m.trans[key]
+        if histsize == 0: print repr(''), m.trans['']
+        print
+    while 1:
+        data = m.get()
+        if do_words: words = data
+        else: words = string.split(data)
+        n = 0
+        limit = 72
+        for w in words:
+            if n + len(w) > limit:
+                print
+                n = 0
+            print w,
+            n = n + len(w) + 1
+        print
+        print
 
 def tuple(list):
-	if len(list) == 0: return ()
-	if len(list) == 1: return (list[0],)
-	i = len(list)/2
-	return tuple(list[:i]) + tuple(list[i:])
+    if len(list) == 0: return ()
+    if len(list) == 1: return (list[0],)
+    i = len(list)/2
+    return tuple(list[:i]) + tuple(list[i:])
 
 test()
diff --git a/Demo/scripts/mboxconvert.py b/Demo/scripts/mboxconvert.py
index 996537d..ba1f734 100755
--- a/Demo/scripts/mboxconvert.py
+++ b/Demo/scripts/mboxconvert.py
@@ -13,111 +13,111 @@
 import regex
 
 def main():
-	dofile = mmdf
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'f')
-	except getopt.error, msg:
-		sys.stderr.write('%s\n' % msg)
-		sys.exit(2)
-	for o, a in opts:
-		if o == '-f':
-			dofile = message
-	if not args:
-		args = ['-']
-	sts = 0
-	for arg in args:
-		if arg == '-' or arg == '':
-			sts = dofile(sys.stdin) or sts
-		elif os.path.isdir(arg):
-			sts = mh(arg) or sts
-		elif os.path.isfile(arg):
-			try:
-				f = open(arg)
-			except IOError, msg:
-				sys.stderr.write('%s: %s\n' % (arg, msg))
-				sts = 1
-				continue
-			sts = dofile(f) or sts
-			f.close()
-		else:
-			sys.stderr.write('%s: not found\n' % arg)
-			sts = 1
-	if sts:
-		sys.exit(sts)
+    dofile = mmdf
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], 'f')
+    except getopt.error, msg:
+        sys.stderr.write('%s\n' % msg)
+        sys.exit(2)
+    for o, a in opts:
+        if o == '-f':
+            dofile = message
+    if not args:
+        args = ['-']
+    sts = 0
+    for arg in args:
+        if arg == '-' or arg == '':
+            sts = dofile(sys.stdin) or sts
+        elif os.path.isdir(arg):
+            sts = mh(arg) or sts
+        elif os.path.isfile(arg):
+            try:
+                f = open(arg)
+            except IOError, msg:
+                sys.stderr.write('%s: %s\n' % (arg, msg))
+                sts = 1
+                continue
+            sts = dofile(f) or sts
+            f.close()
+        else:
+            sys.stderr.write('%s: not found\n' % arg)
+            sts = 1
+    if sts:
+        sys.exit(sts)
 
 numeric = regex.compile('[1-9][0-9]*')
 
 def mh(dir):
-	sts = 0
-	msgs = os.listdir(dir)
-	for msg in msgs:
-		if numeric.match(msg) != len(msg):
-			continue
-		fn = os.path.join(dir, msg)
-		try:
-			f = open(fn)
-		except IOError, msg:
-			sys.stderr.write('%s: %s\n' % (fn, msg))
-			sts = 1
-			continue
-		sts = message(f) or sts
-	return sts
+    sts = 0
+    msgs = os.listdir(dir)
+    for msg in msgs:
+        if numeric.match(msg) != len(msg):
+            continue
+        fn = os.path.join(dir, msg)
+        try:
+            f = open(fn)
+        except IOError, msg:
+            sys.stderr.write('%s: %s\n' % (fn, msg))
+            sts = 1
+            continue
+        sts = message(f) or sts
+    return sts
 
 def mmdf(f):
-	sts = 0
-	while 1:
-		line = f.readline()
-		if not line:
-			break
-		if line == '\1\1\1\1\n':
-			sts = message(f, line) or sts
-		else:
-			sys.stderr.write(
-				'Bad line in MMFD mailbox: %r\n' % (line,))
-	return sts
+    sts = 0
+    while 1:
+        line = f.readline()
+        if not line:
+            break
+        if line == '\1\1\1\1\n':
+            sts = message(f, line) or sts
+        else:
+            sys.stderr.write(
+                    'Bad line in MMFD mailbox: %r\n' % (line,))
+    return sts
 
 counter = 0 # for generating unique Message-ID headers
 
 def message(f, delimiter = ''):
-	sts = 0
-	# Parse RFC822 header
-	m = rfc822.Message(f)
-	# Write unix header line
-	fullname, email = m.getaddr('From')
-	tt = m.getdate('Date')
-	if tt:
-		t = time.mktime(tt)
-	else:
-		sys.stderr.write(
-			'Unparseable date: %r\n' % (m.getheader('Date'),))
-		t = os.fstat(f.fileno())[stat.ST_MTIME]
-	print 'From', email, time.ctime(t)
-	# Copy RFC822 header
-	for line in m.headers:
-		print line,
-	# Invent Message-ID header if none is present
-	if not m.has_key('message-id'):
-		global counter
-		counter = counter + 1
-		msgid = "<%s.%d>" % (hex(t), counter)
-		sys.stderr.write("Adding Message-ID %s (From %s)\n" %
-				 (msgid, email))
-		print "Message-ID:", msgid
-	print
-	# Copy body
-	while 1:
-		line = f.readline()
-		if line == delimiter:
-			break
-		if not line:
-			sys.stderr.write('Unexpected EOF in message\n')
-			sts = 1
-			break
-		if line[:5] == 'From ':
-			line = '>' + line
-		print line,
-	# Print trailing newline
-	print
-	return sts
+    sts = 0
+    # Parse RFC822 header
+    m = rfc822.Message(f)
+    # Write unix header line
+    fullname, email = m.getaddr('From')
+    tt = m.getdate('Date')
+    if tt:
+        t = time.mktime(tt)
+    else:
+        sys.stderr.write(
+                'Unparseable date: %r\n' % (m.getheader('Date'),))
+        t = os.fstat(f.fileno())[stat.ST_MTIME]
+    print 'From', email, time.ctime(t)
+    # Copy RFC822 header
+    for line in m.headers:
+        print line,
+    # Invent Message-ID header if none is present
+    if not m.has_key('message-id'):
+        global counter
+        counter = counter + 1
+        msgid = "<%s.%d>" % (hex(t), counter)
+        sys.stderr.write("Adding Message-ID %s (From %s)\n" %
+                         (msgid, email))
+        print "Message-ID:", msgid
+    print
+    # Copy body
+    while 1:
+        line = f.readline()
+        if line == delimiter:
+            break
+        if not line:
+            sys.stderr.write('Unexpected EOF in message\n')
+            sts = 1
+            break
+        if line[:5] == 'From ':
+            line = '>' + line
+        print line,
+    # Print trailing newline
+    print
+    return sts
 
 main()
diff --git a/Demo/scripts/mkrcs.py b/Demo/scripts/mkrcs.py
index 917b4fe..45a68b9 100755
--- a/Demo/scripts/mkrcs.py
+++ b/Demo/scripts/mkrcs.py
@@ -9,52 +9,52 @@
 import os
 
 def main():
-	rcstree = 'RCStree'
-	rcs = 'RCS'
-	if os.path.islink(rcs):
-		print '%r is a symlink to %r' % (rcs, os.readlink(rcs))
-		return
-	if os.path.isdir(rcs):
-		print '%r is an ordinary directory' % (rcs,)
-		return
-	if os.path.exists(rcs):
-		print '%r is a file?!?!' % (rcs,)
-		return
-	#
-	p = os.getcwd()
-	up = ''
-	down = ''
-	# Invariants:
-	# (1) join(p, down) is the current directory
-	# (2) up is the same directory as p
-	# Ergo:
-	# (3) join(up, down) is the current directory
-	#print 'p =', repr(p)
-	while not os.path.isdir(os.path.join(p, rcstree)):
-		head, tail = os.path.split(p)
-		#print 'head = %r; tail = %r' % (head, tail)
-		if not tail:
-			print 'Sorry, no ancestor dir contains %r' % (rcstree,)
-			return
-		p = head
-		up = os.path.join(os.pardir, up)
-		down = os.path.join(tail, down)
-		#print 'p = %r; up = %r; down = %r' % (p, up, down)
-	there = os.path.join(up, rcstree)
-	there = os.path.join(there, down)
-	there = os.path.join(there, rcs)
-	if os.path.isdir(there):
-		print '%r already exists' % (there, )
-	else:
-		print 'making %r' % (there,)
-		makedirs(there)
-	print 'making symlink %r -> %r' % (rcs, there)
-	os.symlink(there, rcs)
+    rcstree = 'RCStree'
+    rcs = 'RCS'
+    if os.path.islink(rcs):
+        print '%r is a symlink to %r' % (rcs, os.readlink(rcs))
+        return
+    if os.path.isdir(rcs):
+        print '%r is an ordinary directory' % (rcs,)
+        return
+    if os.path.exists(rcs):
+        print '%r is a file?!?!' % (rcs,)
+        return
+    #
+    p = os.getcwd()
+    up = ''
+    down = ''
+    # Invariants:
+    # (1) join(p, down) is the current directory
+    # (2) up is the same directory as p
+    # Ergo:
+    # (3) join(up, down) is the current directory
+    #print 'p =', repr(p)
+    while not os.path.isdir(os.path.join(p, rcstree)):
+        head, tail = os.path.split(p)
+        #print 'head = %r; tail = %r' % (head, tail)
+        if not tail:
+            print 'Sorry, no ancestor dir contains %r' % (rcstree,)
+            return
+        p = head
+        up = os.path.join(os.pardir, up)
+        down = os.path.join(tail, down)
+        #print 'p = %r; up = %r; down = %r' % (p, up, down)
+    there = os.path.join(up, rcstree)
+    there = os.path.join(there, down)
+    there = os.path.join(there, rcs)
+    if os.path.isdir(there):
+        print '%r already exists' % (there, )
+    else:
+        print 'making %r' % (there,)
+        makedirs(there)
+    print 'making symlink %r -> %r' % (rcs, there)
+    os.symlink(there, rcs)
 
 def makedirs(p):
-	if not os.path.isdir(p):
-		head, tail = os.path.split(p)
-		makedirs(head)
-		os.mkdir(p, 0777)
+    if not os.path.isdir(p):
+        head, tail = os.path.split(p)
+        makedirs(head)
+        os.mkdir(p, 0777)
 
 main()
diff --git a/Demo/scripts/morse.py b/Demo/scripts/morse.py
index 2cea83e..3da49da 100755
--- a/Demo/scripts/morse.py
+++ b/Demo/scripts/morse.py
@@ -7,57 +7,57 @@
 
 DOT = 30
 DAH = 3 * DOT
-OCTAVE = 2				# 1 == 441 Hz, 2 == 882 Hz, ...
+OCTAVE = 2                              # 1 == 441 Hz, 2 == 882 Hz, ...
 
 morsetab = {
-	'A': '.-',		'a': '.-',
-	'B': '-...',		'b': '-...',
-	'C': '-.-.',		'c': '-.-.',
-	'D': '-..',		'd': '-..',
-	'E': '.',		'e': '.',
-	'F': '..-.',		'f': '..-.',
-	'G': '--.',		'g': '--.',
-	'H': '....',		'h': '....',
-	'I': '..',		'i': '..',
-	'J': '.---',		'j': '.---',
-	'K': '-.-',		'k': '-.-',
-	'L': '.-..',		'l': '.-..',
-	'M': '--',		'm': '--',
-	'N': '-.',		'n': '-.',
-	'O': '---',		'o': '---',
-	'P': '.--.',		'p': '.--.',
-	'Q': '--.-',		'q': '--.-',
-	'R': '.-.',		'r': '.-.',
-	'S': '...',		's': '...',
-	'T': '-',		't': '-',
-	'U': '..-',		'u': '..-',
-	'V': '...-',		'v': '...-',
-	'W': '.--',		'w': '.--',
-	'X': '-..-',		'x': '-..-',
-	'Y': '-.--',		'y': '-.--',
-	'Z': '--..',		'z': '--..',
-	'0': '-----',
-	'1': '.----',
-	'2': '..---',
-	'3': '...--',
-	'4': '....-',
-	'5': '.....',
-	'6': '-....',
-	'7': '--...',
-	'8': '---..',
-	'9': '----.',
-	',': '--..--',
-	'.': '.-.-.-',
-	'?': '..--..',
-	';': '-.-.-.',
-	':': '---...',
-	"'": '.----.',
-	'-': '-....-',
-	'/': '-..-.',
-	'(': '-.--.-',
-	')': '-.--.-',
-	'_': '..--.-',
-	' ': ' '
+        'A': '.-',              'a': '.-',
+        'B': '-...',            'b': '-...',
+        'C': '-.-.',            'c': '-.-.',
+        'D': '-..',             'd': '-..',
+        'E': '.',               'e': '.',
+        'F': '..-.',            'f': '..-.',
+        'G': '--.',             'g': '--.',
+        'H': '....',            'h': '....',
+        'I': '..',              'i': '..',
+        'J': '.---',            'j': '.---',
+        'K': '-.-',             'k': '-.-',
+        'L': '.-..',            'l': '.-..',
+        'M': '--',              'm': '--',
+        'N': '-.',              'n': '-.',
+        'O': '---',             'o': '---',
+        'P': '.--.',            'p': '.--.',
+        'Q': '--.-',            'q': '--.-',
+        'R': '.-.',             'r': '.-.',
+        'S': '...',             's': '...',
+        'T': '-',               't': '-',
+        'U': '..-',             'u': '..-',
+        'V': '...-',            'v': '...-',
+        'W': '.--',             'w': '.--',
+        'X': '-..-',            'x': '-..-',
+        'Y': '-.--',            'y': '-.--',
+        'Z': '--..',            'z': '--..',
+        '0': '-----',
+        '1': '.----',
+        '2': '..---',
+        '3': '...--',
+        '4': '....-',
+        '5': '.....',
+        '6': '-....',
+        '7': '--...',
+        '8': '---..',
+        '9': '----.',
+        ',': '--..--',
+        '.': '.-.-.-',
+        '?': '..--..',
+        ';': '-.-.-.',
+        ':': '---...',
+        "'": '.----.',
+        '-': '-....-',
+        '/': '-..-.',
+        '(': '-.--.-',
+        ')': '-.--.-',
+        '_': '..--.-',
+        ' ': ' '
 }
 
 # If we play at 44.1 kHz (which we do), then if we produce one sine
@@ -65,85 +65,85 @@
 # sine waves in these 100 samples, we get a tone of 882 Hz.  882 Hz
 # appears to be a nice one for playing morse code.
 def mkwave(octave):
-	global sinewave, nowave
-	sinewave = ''
-	for i in range(100):
-		val = int(math.sin(math.pi * float(i) * octave / 50.0) * 30000)
-		sinewave = sinewave + chr((val >> 8) & 255) + chr(val & 255)
-	nowave = '\0' * 200
+    global sinewave, nowave
+    sinewave = ''
+    for i in range(100):
+        val = int(math.sin(math.pi * float(i) * octave / 50.0) * 30000)
+        sinewave = sinewave + chr((val >> 8) & 255) + chr(val & 255)
+    nowave = '\0' * 200
 
 mkwave(OCTAVE)
 
 def main():
-	import getopt, string
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'o:p:')
-	except getopt.error:
-		sys.stderr.write('Usage ' + sys.argv[0] +
-				 ' [ -o outfile ] [ args ] ...\n')
-		sys.exit(1)
-	dev = None
-	for o, a in opts:
-		if o == '-o':
-			import aifc
-			dev = aifc.open(a, 'w')
-			dev.setframerate(44100)
-			dev.setsampwidth(2)
-			dev.setnchannels(1)
-		if o == '-p':
-			mkwave(string.atoi(a))
-	if not dev:
-		import audiodev
-		dev = audiodev.AudioDev()
-		dev.setoutrate(44100)
-		dev.setsampwidth(2)
-		dev.setnchannels(1)
-		dev.close = dev.stop
-		dev.writeframesraw = dev.writeframes
-	if args:
-		line = string.join(args)
-	else:
-		line = sys.stdin.readline()
-	while line:
-		mline = morse(line)
-		play(mline, dev)
-		if hasattr(dev, 'wait'):
-			dev.wait()
-		if not args:
-			line = sys.stdin.readline()
-		else:
-			line = ''
-	dev.close()
+    import getopt, string
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], 'o:p:')
+    except getopt.error:
+        sys.stderr.write('Usage ' + sys.argv[0] +
+                         ' [ -o outfile ] [ args ] ...\n')
+        sys.exit(1)
+    dev = None
+    for o, a in opts:
+        if o == '-o':
+            import aifc
+            dev = aifc.open(a, 'w')
+            dev.setframerate(44100)
+            dev.setsampwidth(2)
+            dev.setnchannels(1)
+        if o == '-p':
+            mkwave(string.atoi(a))
+    if not dev:
+        import audiodev
+        dev = audiodev.AudioDev()
+        dev.setoutrate(44100)
+        dev.setsampwidth(2)
+        dev.setnchannels(1)
+        dev.close = dev.stop
+        dev.writeframesraw = dev.writeframes
+    if args:
+        line = string.join(args)
+    else:
+        line = sys.stdin.readline()
+    while line:
+        mline = morse(line)
+        play(mline, dev)
+        if hasattr(dev, 'wait'):
+            dev.wait()
+        if not args:
+            line = sys.stdin.readline()
+        else:
+            line = ''
+    dev.close()
 
 # Convert a string to morse code with \001 between the characters in
 # the string.
 def morse(line):
-	res = ''
-	for c in line:
-		try:
-			res = res + morsetab[c] + '\001'
-		except KeyError:
-			pass
-	return res
+    res = ''
+    for c in line:
+        try:
+            res = res + morsetab[c] + '\001'
+        except KeyError:
+            pass
+    return res
 
 # Play a line of morse code.
 def play(line, dev):
-	for c in line:
-		if c == '.':
-			sine(dev, DOT)
-		elif c == '-':
-			sine(dev, DAH)
-		else:			# space
-			pause(dev, DAH + DOT)
-		pause(dev, DOT)
+    for c in line:
+        if c == '.':
+            sine(dev, DOT)
+        elif c == '-':
+            sine(dev, DAH)
+        else:                   # space
+            pause(dev, DAH + DOT)
+        pause(dev, DOT)
 
 def sine(dev, length):
-	for i in range(length):
-		dev.writeframesraw(sinewave)
+    for i in range(length):
+        dev.writeframesraw(sinewave)
 
 def pause(dev, length):
-	for i in range(length):
-		dev.writeframesraw(nowave)
+    for i in range(length):
+        dev.writeframesraw(nowave)
 
 if __name__ == '__main__' or sys.argv[0] == __name__:
-	main()
+    main()
diff --git a/Demo/scripts/mpzpi.py b/Demo/scripts/mpzpi.py
index ccf591d..70b1a51 100755
--- a/Demo/scripts/mpzpi.py
+++ b/Demo/scripts/mpzpi.py
@@ -11,24 +11,24 @@
 from mpz import mpz
 
 def main():
-	mpzone, mpztwo, mpzten = mpz(1), mpz(2), mpz(10)
-	k, a, b, a1, b1 = mpz(2), mpz(4), mpz(1), mpz(12), mpz(4)
-	while 1:
-		# Next approximation
-		p, q, k = k*k, mpztwo*k+mpzone, k+mpzone
-		a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
-		# Print common digits
-		d, d1 = a/b, a1/b1
-		while d == d1:
-			output(d)
-			a, a1 = mpzten*(a%b), mpzten*(a1%b1)
-			d, d1 = a/b, a1/b1
+    mpzone, mpztwo, mpzten = mpz(1), mpz(2), mpz(10)
+    k, a, b, a1, b1 = mpz(2), mpz(4), mpz(1), mpz(12), mpz(4)
+    while 1:
+        # Next approximation
+        p, q, k = k*k, mpztwo*k+mpzone, k+mpzone
+        a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
+        # Print common digits
+        d, d1 = a/b, a1/b1
+        while d == d1:
+            output(d)
+            a, a1 = mpzten*(a%b), mpzten*(a1%b1)
+            d, d1 = a/b, a1/b1
 
 def output(d):
-	# Use write() to avoid spaces between the digits
-	# Use int(d) to avoid a trailing L after each digit
-	sys.stdout.write(repr(int(d)))
-	# Flush so the output is seen immediately
-	sys.stdout.flush()
+    # Use write() to avoid spaces between the digits
+    # Use int(d) to avoid a trailing L after each digit
+    sys.stdout.write(repr(int(d)))
+    # Flush so the output is seen immediately
+    sys.stdout.flush()
 
 main()
diff --git a/Demo/scripts/newslist.py b/Demo/scripts/newslist.py
index b06b452..b9f9c0e 100755
--- a/Demo/scripts/newslist.py
+++ b/Demo/scripts/newslist.py
@@ -5,27 +5,27 @@
 # Syntax:
 #    newslist [ -a ]
 #
-# This is a program to create a directory full of HTML pages 
+# This is a program to create a directory full of HTML pages
 # which between them contain links to all the newsgroups available
 # on your server.
 #
-# The -a option causes a complete list of all groups to be read from 
+# The -a option causes a complete list of all groups to be read from
 # the server rather than just the ones which have appeared since last
 # execution. This recreates the local list from scratch. Use this on
 # the first invocation of the program, and from time to time thereafter.
-#   When new groups are first created they may appear on your server as 
+#   When new groups are first created they may appear on your server as
 # empty groups. By default, empty groups are ignored by the -a option.
 # However, these new groups will not be created again, and so will not
 # appear in the server's list of 'new groups' at a later date. Hence it
 # won't appear until you do a '-a' after some articles have appeared.
-# 
+#
 # I should really keep a list of ignored empty groups and re-check them
 # for articles on every run, but I haven't got around to it yet.
 #
 # This assumes an NNTP news feed.
 #
-# Feel free to copy, distribute and modify this code for 
-# non-commercial use. If you make any useful modifications, let me 
+# Feel free to copy, distribute and modify this code for
+# non-commercial use. If you make any useful modifications, let me
 # know!
 #
 # (c) Quentin Stafford-Fraser 1994
@@ -42,9 +42,9 @@
 topdir='/anfs/qsbigdisc/web/html/newspage'
 
 # The name of your NNTP host
-# eg. 
+# eg.
 #    newshost = 'nntp-serv.cl.cam.ac.uk'
-# or use following to get the name from the NNTPSERVER environment 
+# or use following to get the name from the NNTPSERVER environment
 # variable:
 #    newshost = posix.environ['NNTPSERVER']
 newshost = 'nntp-serv.cl.cam.ac.uk'
@@ -60,17 +60,17 @@
 # The directory in which HTML pages should be created
 # eg.
 #   pagedir  = '/usr/local/lib/html/newspage'
-#   pagedir  = 'pages' 
+#   pagedir  = 'pages'
 pagedir  = topdir
 
 # The html prefix which will refer to this directory
-# eg. 
-#   httppref = '/newspage/', 
+# eg.
+#   httppref = '/newspage/',
 # or leave blank for relative links between pages: (Recommended)
 #   httppref = ''
 httppref = ''
 
-# The name of the 'root' news page in this directory. 
+# The name of the 'root' news page in this directory.
 # A .html suffix will be added.
 rootpage = 'root'
 
@@ -88,7 +88,7 @@
 
 # Sublistsize controls the maximum number of items the will appear as
 # an indented sub-list before the whole thing is moved onto a different
-# page. The smaller this is, the more pages you will have, but the 
+# page. The smaller this is, the more pages you will have, but the
 # shorter each will be.
 sublistsize = 4
 
@@ -118,246 +118,246 @@
 
 # Addtotree creates/augments a tree from a list of group names
 def addtotree(tree, groups):
-   print 'Updating tree...'
-   for i in groups:
+    print 'Updating tree...'
+    for i in groups:
         parts = string.splitfields(i,'.')
         makeleaf(tree, parts)
 
 # Makeleaf makes a leaf and the branch leading to it if necessary
 def makeleaf(tree,path):
-   j = path[0]
-   l = len(path)
+    j = path[0]
+    l = len(path)
 
-   if not tree.has_key(j):
-      tree[j] = {}
-   if l == 1:
-      tree[j]['.'] = '.'
-   if l > 1:
-      makeleaf(tree[j],path[1:])
+    if not tree.has_key(j):
+        tree[j] = {}
+    if l == 1:
+        tree[j]['.'] = '.'
+    if l > 1:
+        makeleaf(tree[j],path[1:])
 
-# Then the bits for outputting trees as pages ----------------  
+# Then the bits for outputting trees as pages ----------------
 
 # Createpage creates an HTML file named <root>.html containing links
 # to those groups beginning with <root>.
 
 def createpage(root, tree, p):
-   filename = os.path.join(pagedir,root+'.html')
-   if root == rootpage:
-      detail = ''
-   else:
-      detail = ' under ' + root
-   f = open(filename,'w')
-   # f.write('Content-Type: text/html\n')
-   f.write('<TITLE>Newsgroups available' + detail + '</TITLE>\n')
-   f.write('<H1>Newsgroups available' + detail +'</H1>\n')
-   f.write('<A HREF="'+httppref+rootpage+'.html">Back to top level</A><P>\n')
-   printtree(f,tree,0,p)
-   f.write('<I>This page automatically created by \'newslist\' v. '+rcsrev+'.')
-   f.write(time.ctime(time.time()) + '</I><P>')
-   f.close()
+    filename = os.path.join(pagedir,root+'.html')
+    if root == rootpage:
+        detail = ''
+    else:
+        detail = ' under ' + root
+    f = open(filename,'w')
+    # f.write('Content-Type: text/html\n')
+    f.write('<TITLE>Newsgroups available' + detail + '</TITLE>\n')
+    f.write('<H1>Newsgroups available' + detail +'</H1>\n')
+    f.write('<A HREF="'+httppref+rootpage+'.html">Back to top level</A><P>\n')
+    printtree(f,tree,0,p)
+    f.write('<I>This page automatically created by \'newslist\' v. '+rcsrev+'.')
+    f.write(time.ctime(time.time()) + '</I><P>')
+    f.close()
 
 # Printtree prints the groups as a bulleted list.  Groups with
 # more than <sublistsize> subgroups will be put on a separate page.
 # Other sets of subgroups are just indented.
 
 def printtree(f, tree, indent, p):
-   global desc
-   l = len(tree)
+    global desc
+    l = len(tree)
 
-   if l > sublistsize and indent>0:
-      # Create a new page and a link to it
-      f.write('<LI><B><A HREF="'+httppref+p[1:]+'.html">')
-      f.write(p[1:]+'.*')
-      f.write('</A></B>'+pagelinkicon+'\n')
-      createpage(p[1:], tree, p)
-      return
+    if l > sublistsize and indent>0:
+        # Create a new page and a link to it
+        f.write('<LI><B><A HREF="'+httppref+p[1:]+'.html">')
+        f.write(p[1:]+'.*')
+        f.write('</A></B>'+pagelinkicon+'\n')
+        createpage(p[1:], tree, p)
+        return
 
-   kl = tree.keys()
+    kl = tree.keys()
 
-   if l > 1:
-      kl.sort()
-      if indent > 0:
-         # Create a sub-list
-         f.write('<LI>'+p[1:]+'\n<UL>')
-      else:
-         # Create a main list
-         f.write('<UL>')
-      indent = indent + 1
-   
-   for i in kl:
-      if i == '.':
-         # Output a newsgroup
-         f.write('<LI><A HREF="news:' + p[1:] + '">'+ p[1:] + '</A> ')
-         if desc.has_key(p[1:]):
-            f.write('     <I>'+desc[p[1:]]+'</I>\n')
-         else:
-            f.write('\n')
-      else:
-         # Output a hierarchy
-         printtree(f,tree[i], indent, p+'.'+i)
+    if l > 1:
+        kl.sort()
+        if indent > 0:
+            # Create a sub-list
+            f.write('<LI>'+p[1:]+'\n<UL>')
+        else:
+            # Create a main list
+            f.write('<UL>')
+        indent = indent + 1
 
-   if l > 1:
-      f.write('\n</UL>')
+    for i in kl:
+        if i == '.':
+            # Output a newsgroup
+            f.write('<LI><A HREF="news:' + p[1:] + '">'+ p[1:] + '</A> ')
+            if desc.has_key(p[1:]):
+                f.write('     <I>'+desc[p[1:]]+'</I>\n')
+            else:
+                f.write('\n')
+        else:
+            # Output a hierarchy
+            printtree(f,tree[i], indent, p+'.'+i)
+
+    if l > 1:
+        f.write('\n</UL>')
 
 # Reading descriptions file ---------------------------------------
 
 # This returns an array mapping group name to its description
 
 def readdesc(descfile):
-   global desc
+    global desc
 
-   desc = {}
+    desc = {}
 
-   if descfile == '':
+    if descfile == '':
         return
 
-   try:
-      d = open(descfile, 'r')
-      print 'Reading descriptions...'
-   except (IOError):
-      print 'Failed to open description file ' + descfile
-      return
-   l = d.readline()
-   while l != '':
-      bits = string.split(l)
-      try:
-         grp = bits[0]
-         dsc = string.join(bits[1:])
-         if len(dsc)>1:
-            desc[grp] = dsc
-      except (IndexError):
-         pass
-      l = d.readline()
+    try:
+        d = open(descfile, 'r')
+        print 'Reading descriptions...'
+    except (IOError):
+        print 'Failed to open description file ' + descfile
+        return
+    l = d.readline()
+    while l != '':
+        bits = string.split(l)
+        try:
+            grp = bits[0]
+            dsc = string.join(bits[1:])
+            if len(dsc)>1:
+                desc[grp] = dsc
+        except (IndexError):
+            pass
+        l = d.readline()
 
 # Check that ouput directory exists, ------------------------------
 # and offer to create it if not
 
 def checkopdir(pagedir):
-   if not os.path.isdir(pagedir):
-      print 'Directory '+pagedir+' does not exist.'
-      print 'Shall I create it for you? (y/n)'
-      if sys.stdin.readline()[0] == 'y':
-         try:
-            os.mkdir(pagedir,0777)
-         except:
-            print 'Sorry - failed!'
+    if not os.path.isdir(pagedir):
+        print 'Directory '+pagedir+' does not exist.'
+        print 'Shall I create it for you? (y/n)'
+        if sys.stdin.readline()[0] == 'y':
+            try:
+                os.mkdir(pagedir,0777)
+            except:
+                print 'Sorry - failed!'
+                sys.exit(1)
+        else:
+            print 'OK. Exiting.'
             sys.exit(1)
-      else:
-         print 'OK. Exiting.'
-         sys.exit(1)
 
 # Read and write current local tree ----------------------------------
 
 def readlocallist(treefile):
-      print 'Reading current local group list...'
-      tree = {}
-      try:
-         treetime = time.localtime(os.stat(treefile)[ST_MTIME])
-      except:
-         print '\n*** Failed to open local group cache '+treefile
-         print 'If this is the first time you have run newslist, then'
-         print 'use the -a option to create it.'
-         sys.exit(1)
-      treedate = '%02d%02d%02d' % (treetime[0] % 100 ,treetime[1], treetime[2])
-      try:
-         dump = open(treefile,'r')
-         tree = marshal.load(dump)
-         dump.close()
-      except (IOError):
-         print 'Cannot open local group list ' + treefile
-      return (tree, treedate)
+    print 'Reading current local group list...'
+    tree = {}
+    try:
+        treetime = time.localtime(os.stat(treefile)[ST_MTIME])
+    except:
+        print '\n*** Failed to open local group cache '+treefile
+        print 'If this is the first time you have run newslist, then'
+        print 'use the -a option to create it.'
+        sys.exit(1)
+    treedate = '%02d%02d%02d' % (treetime[0] % 100 ,treetime[1], treetime[2])
+    try:
+        dump = open(treefile,'r')
+        tree = marshal.load(dump)
+        dump.close()
+    except (IOError):
+        print 'Cannot open local group list ' + treefile
+    return (tree, treedate)
 
 def writelocallist(treefile, tree):
-   try:
-      dump = open(treefile,'w')
-      groups = marshal.dump(tree,dump)
-      dump.close()
-      print 'Saved list to '+treefile+'\n'
-   except:
-      print 'Sorry - failed to write to local group cache '+treefile
-      print 'Does it (or its directory) have the correct permissions?'
-      sys.exit(1)
+    try:
+        dump = open(treefile,'w')
+        groups = marshal.dump(tree,dump)
+        dump.close()
+        print 'Saved list to '+treefile+'\n'
+    except:
+        print 'Sorry - failed to write to local group cache '+treefile
+        print 'Does it (or its directory) have the correct permissions?'
+        sys.exit(1)
 
 # Return list of all groups on server -----------------------------
 
 def getallgroups(server):
-   print 'Getting list of all groups...'
-   treedate='010101'
-   info = server.list()[1]
-   groups = []
-   print 'Processing...'
-   if skipempty:
-      print '\nIgnoring following empty groups:'
-   for i in info:
-      grpname = string.split(i[0])[0]
-      if skipempty and string.atoi(i[1]) < string.atoi(i[2]):
-         print grpname+' ',
-      else:
-         groups.append(grpname)
-   print '\n'
-   if skipempty:
-      print '(End of empty groups)'
-   return groups
+    print 'Getting list of all groups...'
+    treedate='010101'
+    info = server.list()[1]
+    groups = []
+    print 'Processing...'
+    if skipempty:
+        print '\nIgnoring following empty groups:'
+    for i in info:
+        grpname = string.split(i[0])[0]
+        if skipempty and string.atoi(i[1]) < string.atoi(i[2]):
+            print grpname+' ',
+        else:
+            groups.append(grpname)
+    print '\n'
+    if skipempty:
+        print '(End of empty groups)'
+    return groups
 
 # Return list of new groups on server -----------------------------
 
 def getnewgroups(server, treedate):
-   print 'Getting list of new groups since start of '+treedate+'...',
-   info = server.newgroups(treedate,'000001')[1]
-   print 'got %d.' % len(info)
-   print 'Processing...',
-   groups = []
-   for i in info:
-      grpname = string.split(i)[0]
-      groups.append(grpname)
-   print 'Done'
-   return groups
+    print 'Getting list of new groups since start of '+treedate+'...',
+    info = server.newgroups(treedate,'000001')[1]
+    print 'got %d.' % len(info)
+    print 'Processing...',
+    groups = []
+    for i in info:
+        grpname = string.split(i)[0]
+        groups.append(grpname)
+    print 'Done'
+    return groups
 
 # Now the main program --------------------------------------------
 
 def main():
-   global desc
+    global desc
 
-   tree={}
+    tree={}
 
-   # Check that the output directory exists
-   checkopdir(pagedir);
+    # Check that the output directory exists
+    checkopdir(pagedir);
 
-   try:
-      print 'Connecting to '+newshost+'...'
-      if sys.version[0] == '0':
-         s = NNTP.init(newshost)
-      else:
-         s = NNTP(newshost)
-      connected = 1
-   except (nntplib.error_temp, nntplib.error_perm), x:
-      print 'Error connecting to host:', x
-      print 'I\'ll try to use just the local list.'
-      connected = 0
+    try:
+        print 'Connecting to '+newshost+'...'
+        if sys.version[0] == '0':
+            s = NNTP.init(newshost)
+        else:
+            s = NNTP(newshost)
+        connected = 1
+    except (nntplib.error_temp, nntplib.error_perm), x:
+        print 'Error connecting to host:', x
+        print 'I\'ll try to use just the local list.'
+        connected = 0
 
-   # If -a is specified, read the full list of groups from server   
-   if connected and len(sys.argv) > 1 and sys.argv[1] == '-a':
+    # If -a is specified, read the full list of groups from server
+    if connected and len(sys.argv) > 1 and sys.argv[1] == '-a':
 
-     groups = getallgroups(s)
+        groups = getallgroups(s)
 
-   # Otherwise just read the local file and then add
-   # groups created since local file last modified.
-   else:
+    # Otherwise just read the local file and then add
+    # groups created since local file last modified.
+    else:
 
-      (tree, treedate) = readlocallist(treefile)
-      if connected:
-         groups = getnewgroups(s, treedate)
-      
-   if connected:
-      addtotree(tree, groups)
-      writelocallist(treefile,tree)
+        (tree, treedate) = readlocallist(treefile)
+        if connected:
+            groups = getnewgroups(s, treedate)
 
-   # Read group descriptions
-   readdesc(descfile)
+    if connected:
+        addtotree(tree, groups)
+        writelocallist(treefile,tree)
 
-   print 'Creating pages...'
-   createpage(rootpage, tree, '')
-   print 'Done'
+    # Read group descriptions
+    readdesc(descfile)
+
+    print 'Creating pages...'
+    createpage(rootpage, tree, '')
+    print 'Done'
 
 
 main()
diff --git a/Demo/scripts/pp.py b/Demo/scripts/pp.py
index 92a1104..0491fa9 100755
--- a/Demo/scripts/pp.py
+++ b/Demo/scripts/pp.py
@@ -34,89 +34,89 @@
 PFLAG = 0
 
 try:
-	optlist, ARGS = getopt.getopt(sys.argv[1:], 'acde:F:np')
+    optlist, ARGS = getopt.getopt(sys.argv[1:], 'acde:F:np')
 except getopt.error, msg:
-	sys.stderr.write(sys.argv[0] + ': ' + msg + '\n')
-	sys.exit(2)
+    sys.stderr.write(sys.argv[0] + ': ' + msg + '\n')
+    sys.exit(2)
 
 for option, optarg in optlist:
-	if option == '-a':
-		AFLAG = 1
-	elif option == '-c':
-		CFLAG = 1
-	elif option == '-d':
-		DFLAG = 1
-	elif option == '-e':
-		for line in string.splitfields(optarg, '\n'):
-			SCRIPT.append(line)
-	elif option == '-F':
-		FS = optarg
-	elif option == '-n':
-		NFLAG = 1
-		PFLAG = 0
-	elif option == '-p':
-		NFLAG = 1
-		PFLAG = 1
-	else:
-		print option, 'not recognized???'
+    if option == '-a':
+        AFLAG = 1
+    elif option == '-c':
+        CFLAG = 1
+    elif option == '-d':
+        DFLAG = 1
+    elif option == '-e':
+        for line in string.splitfields(optarg, '\n'):
+            SCRIPT.append(line)
+    elif option == '-F':
+        FS = optarg
+    elif option == '-n':
+        NFLAG = 1
+        PFLAG = 0
+    elif option == '-p':
+        NFLAG = 1
+        PFLAG = 1
+    else:
+        print option, 'not recognized???'
 
 if not ARGS: ARGS.append('-')
 
 if not SCRIPT:
-	if ARGS[0] == '-':
-		fp = sys.stdin
-	else:
-		fp = open(ARGS[0], 'r')
-	while 1:
-		line = fp.readline()
-		if not line: break
-		SCRIPT.append(line[:-1])
-	del fp
-	del ARGS[0]
-	if not ARGS: ARGS.append('-')
+    if ARGS[0] == '-':
+        fp = sys.stdin
+    else:
+        fp = open(ARGS[0], 'r')
+    while 1:
+        line = fp.readline()
+        if not line: break
+        SCRIPT.append(line[:-1])
+    del fp
+    del ARGS[0]
+    if not ARGS: ARGS.append('-')
 
 if CFLAG:
-	prologue = ['if 0:']
-	epilogue = []
+    prologue = ['if 0:']
+    epilogue = []
 elif NFLAG:
-	# Note that it is on purpose that AFLAG and PFLAG are
-	# tested dynamically each time through the loop
-	prologue = [ \
-		'LINECOUNT = 0', \
-		'for FILE in ARGS:', \
-		'   \tif FILE == \'-\':', \
-		'   \t   \tFP = sys.stdin', \
-		'   \telse:', \
-		'   \t   \tFP = open(FILE, \'r\')', \
-		'   \tLINENO = 0', \
-		'   \twhile 1:', \
-		'   \t   \tLINE = FP.readline()', \
-		'   \t   \tif not LINE: break', \
-		'   \t   \tLINENO = LINENO + 1', \
-		'   \t   \tLINECOUNT = LINECOUNT + 1', \
-		'   \t   \tL = LINE[:-1]', \
-		'   \t   \taflag = AFLAG', \
-		'   \t   \tif aflag:', \
-		'   \t   \t   \tif FS: F = string.splitfields(L, FS)', \
-		'   \t   \t   \telse: F = string.split(L)' \
-		]
-	epilogue = [ \
-		'   \t   \tif not PFLAG: continue', \
-		'   \t   \tif aflag:', \
-		'   \t   \t   \tif FS: print string.joinfields(F, FS)', \
-		'   \t   \t   \telse: print string.join(F)', \
-		'   \t   \telse: print L', \
-		]
+    # Note that it is on purpose that AFLAG and PFLAG are
+    # tested dynamically each time through the loop
+    prologue = [ \
+            'LINECOUNT = 0', \
+            'for FILE in ARGS:', \
+            '   \tif FILE == \'-\':', \
+            '   \t   \tFP = sys.stdin', \
+            '   \telse:', \
+            '   \t   \tFP = open(FILE, \'r\')', \
+            '   \tLINENO = 0', \
+            '   \twhile 1:', \
+            '   \t   \tLINE = FP.readline()', \
+            '   \t   \tif not LINE: break', \
+            '   \t   \tLINENO = LINENO + 1', \
+            '   \t   \tLINECOUNT = LINECOUNT + 1', \
+            '   \t   \tL = LINE[:-1]', \
+            '   \t   \taflag = AFLAG', \
+            '   \t   \tif aflag:', \
+            '   \t   \t   \tif FS: F = string.splitfields(L, FS)', \
+            '   \t   \t   \telse: F = string.split(L)' \
+            ]
+    epilogue = [ \
+            '   \t   \tif not PFLAG: continue', \
+            '   \t   \tif aflag:', \
+            '   \t   \t   \tif FS: print string.joinfields(F, FS)', \
+            '   \t   \t   \telse: print string.join(F)', \
+            '   \t   \telse: print L', \
+            ]
 else:
-	prologue = ['if 1:']
-	epilogue = []
+    prologue = ['if 1:']
+    epilogue = []
 
 # Note that we indent using tabs only, so that any indentation style
 # used in 'command' will come out right after re-indentation.
 
 program = string.joinfields(prologue, '\n') + '\n'
 for line in SCRIPT:
-	program = program + ('   \t   \t' + line + '\n')
+    program = program + ('   \t   \t' + line + '\n')
 program = program + (string.joinfields(epilogue, '\n') + '\n')
 
 import tempfile
@@ -124,7 +124,7 @@
 fp.write(program)
 fp.flush()
 if DFLAG:
-	import pdb
-	pdb.run('execfile(%r)' % (tfn,))
+    import pdb
+    pdb.run('execfile(%r)' % (tfn,))
 else:
-	execfile(tfn)
+    execfile(tfn)
diff --git a/Demo/scripts/primes.py b/Demo/scripts/primes.py
index 477c57b..00eb05f 100755
--- a/Demo/scripts/primes.py
+++ b/Demo/scripts/primes.py
@@ -3,24 +3,24 @@
 # Print prime numbers in a given range
 
 def main():
-	import sys
-	min, max = 2, 0x7fffffff
-	if sys.argv[1:]:
-		min = int(eval(sys.argv[1]))
-		if sys.argv[2:]:
-			max = int(eval(sys.argv[2]))
-	primes(min, max)
+    import sys
+    min, max = 2, 0x7fffffff
+    if sys.argv[1:]:
+        min = int(eval(sys.argv[1]))
+        if sys.argv[2:]:
+            max = int(eval(sys.argv[2]))
+    primes(min, max)
 
 def primes(min, max):
-	if 2 >= min: print 2
-	primes = [2]
-	i = 3
-	while i <= max:
-		for p in primes:
-			if i%p == 0 or p*p > i: break
-		if i%p <> 0:
-			primes.append(i)
-			if i >= min: print i
-		i = i+2
+    if 2 >= min: print 2
+    primes = [2]
+    i = 3
+    while i <= max:
+        for p in primes:
+            if i%p == 0 or p*p > i: break
+        if i%p <> 0:
+            primes.append(i)
+            if i >= min: print i
+        i = i+2
 
 main()
diff --git a/Demo/scripts/script.py b/Demo/scripts/script.py
index cbad367..6eaa7ae 100755
--- a/Demo/scripts/script.py
+++ b/Demo/scripts/script.py
@@ -1,8 +1,8 @@
 #! /usr/bin/env python
 # script.py -- Make typescript of terminal session.
 # Usage:
-#	-a	Append to typescript.
-#	-p	Use Python as shell.
+#       -a      Append to typescript.
+#       -p      Use Python as shell.
 # Author: Steen Lumholt.
 
 
@@ -10,19 +10,19 @@
 import pty
 
 def read(fd):
-	data = os.read(fd, 1024)
-	file.write(data)
-	return data
+    data = os.read(fd, 1024)
+    file.write(data)
+    return data
 
 shell = 'sh'
 filename = 'typescript'
 mode = 'w'
 if os.environ.has_key('SHELL'):
-	shell = os.environ['SHELL']
+    shell = os.environ['SHELL']
 if '-a' in sys.argv:
-	mode = 'a'
+    mode = 'a'
 if '-p' in sys.argv:
-	shell = 'python'
+    shell = 'python'
 
 file = open(filename, mode)
 
diff --git a/Demo/scripts/update.py b/Demo/scripts/update.py
index 2db65dc..67a0783 100755
--- a/Demo/scripts/update.py
+++ b/Demo/scripts/update.py
@@ -4,7 +4,7 @@
 # The input file contains lines of the form <filename>:<lineno>:<text>,
 # meaning that the given line of the given file is to be replaced
 # by the given text.  This is useful for performing global substitutions
-# on grep output: 
+# on grep output:
 
 import os
 import sys
@@ -14,78 +14,78 @@
 prog = regex.compile(pat)
 
 class FileObj:
-	def __init__(self, filename):
-		self.filename = filename
-		self.changed = 0
-		try:
-			self.lines = open(filename, 'r').readlines()
-		except IOError, msg:
-			print '*** Can\'t open "%s":' % filename, msg
-			self.lines = None
-			return
-		print 'diffing', self.filename
+    def __init__(self, filename):
+        self.filename = filename
+        self.changed = 0
+        try:
+            self.lines = open(filename, 'r').readlines()
+        except IOError, msg:
+            print '*** Can\'t open "%s":' % filename, msg
+            self.lines = None
+            return
+        print 'diffing', self.filename
 
-	def finish(self):
-		if not self.changed:
-			print 'no changes to', self.filename
-			return
-		try:
-			os.rename(self.filename, self.filename + '~')
-			fp = open(self.filename, 'w')
-		except (os.error, IOError), msg:
-			print '*** Can\'t rewrite "%s":' % self.filename, msg
-			return
-		print 'writing', self.filename
-		for line in self.lines:
-			fp.write(line)
-		fp.close()
-		self.changed = 0
+    def finish(self):
+        if not self.changed:
+            print 'no changes to', self.filename
+            return
+        try:
+            os.rename(self.filename, self.filename + '~')
+            fp = open(self.filename, 'w')
+        except (os.error, IOError), msg:
+            print '*** Can\'t rewrite "%s":' % self.filename, msg
+            return
+        print 'writing', self.filename
+        for line in self.lines:
+            fp.write(line)
+        fp.close()
+        self.changed = 0
 
-	def process(self, lineno, rest):
-		if self.lines is None:
-			print '(not processed): %s:%s:%s' % (
-				  self.filename, lineno, rest),
-			return
-		i = eval(lineno) - 1
-		if not 0 <= i < len(self.lines):
-			print '*** Line number out of range: %s:%s:%s' % (
-				  self.filename, lineno, rest),
-			return
-		if self.lines[i] == rest:
-			print '(no change): %s:%s:%s' % (
-				  self.filename, lineno, rest),
-			return
-		if not self.changed:
-			self.changed = 1
-		print '%sc%s' % (lineno, lineno)
-		print '<', self.lines[i],
-		print '---'
-		self.lines[i] = rest
-		print '>', self.lines[i],
+    def process(self, lineno, rest):
+        if self.lines is None:
+            print '(not processed): %s:%s:%s' % (
+                      self.filename, lineno, rest),
+            return
+        i = eval(lineno) - 1
+        if not 0 <= i < len(self.lines):
+            print '*** Line number out of range: %s:%s:%s' % (
+                      self.filename, lineno, rest),
+            return
+        if self.lines[i] == rest:
+            print '(no change): %s:%s:%s' % (
+                      self.filename, lineno, rest),
+            return
+        if not self.changed:
+            self.changed = 1
+        print '%sc%s' % (lineno, lineno)
+        print '<', self.lines[i],
+        print '---'
+        self.lines[i] = rest
+        print '>', self.lines[i],
 
 def main():
-	if sys.argv[1:]:
-		try:
-			fp = open(sys.argv[1], 'r')
-		except IOError, msg:
-			print 'Can\'t open "%s":' % sys.argv[1], msg
-			sys.exit(1)
-	else:
-		fp = sys.stdin
-	curfile = None
-	while 1:
-		line = fp.readline()
-		if not line:
-			if curfile: curfile.finish()
-			break
-		n = prog.match(line)
-		if n < 0:
-			print 'Funny line:', line,
-			continue
-		filename, lineno = prog.group(1, 2)
-		if not curfile or filename <> curfile.filename:
-			if curfile: curfile.finish()
-			curfile = FileObj(filename)
-		curfile.process(lineno, line[n:])
+    if sys.argv[1:]:
+        try:
+            fp = open(sys.argv[1], 'r')
+        except IOError, msg:
+            print 'Can\'t open "%s":' % sys.argv[1], msg
+            sys.exit(1)
+    else:
+        fp = sys.stdin
+    curfile = None
+    while 1:
+        line = fp.readline()
+        if not line:
+            if curfile: curfile.finish()
+            break
+        n = prog.match(line)
+        if n < 0:
+            print 'Funny line:', line,
+            continue
+        filename, lineno = prog.group(1, 2)
+        if not curfile or filename <> curfile.filename:
+            if curfile: curfile.finish()
+            curfile = FileObj(filename)
+        curfile.process(lineno, line[n:])
 
 main()