Initial revision
diff --git a/Demo/scripts/README b/Demo/scripts/README
new file mode 100644
index 0000000..7a2b837
--- /dev/null
+++ b/Demo/scripts/README
@@ -0,0 +1,18 @@
+Contents of this directory:
+
+byteyears.py		Print product of a file's size and age
+eptags.py		Create Emacs TAGS file for Python modules
+fact.py			Factorize numbers
+findlinksto.py		Find symbolic links to a given path (prefix)
+from.py			Summarize mailbox
+lfact.py		Factorize long numbers
+lpwatch.py		Watch BSD line printer queues
+mkreal.py		Turn a symbolic link into a real file or directory
+objgraph.py		Print object graph from nm output on a library
+pdeps.py		Print dependencies between Python modules
+pi.py			Print digits of pi (uses arbitrary precision integers)
+primes.py		Print prime numbers
+ptags.py		Create vi tags file for Python modules
+suff.py			Sort a list of files by suffix
+which.py		Find a program in $PATH
+xxci.py			Wrapper for rcsdiff and ci
diff --git a/Demo/scripts/fact.py b/Demo/scripts/fact.py
new file mode 100755
index 0000000..ba75a04
--- /dev/null
+++ b/Demo/scripts/fact.py
@@ -0,0 +1,45 @@
+#! /usr/local/python
+
+# Factorize numbers, slowly.
+# This version uses plain integers and is thus limited to 2**31-1.
+
+import sys
+from math import sqrt
+
+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 = int(sqrt(float(n+1)))
+	i = 3
+	while i <= limit:
+		if n%i = 0:
+			res.append(i)
+			n = n/i
+			limit = int(sqrt(float(n+1)))
+		else:
+			i = i+2
+	res.append(n)
+	return res
+
+def main():
+	if len(sys.argv) > 1:
+		for arg in sys.argv[1:]:
+			n = int(eval(arg))
+			print n, fact(n)
+	else:
+		try:
+			while 1:
+				n = int(input())
+				print n, fact(n)
+		except EOFError:
+			pass
+
+main()
diff --git a/Demo/scripts/from.py b/Demo/scripts/from.py
new file mode 100755
index 0000000..20771a0
--- /dev/null
+++ b/Demo/scripts/from.py
@@ -0,0 +1,25 @@
+#! /usr/local/python
+
+# Print From and Subject of messages in $MAIL.
+# Extension to multiple mailboxes and other bells & whistles are left
+# as exercises for the reader.
+
+import posix
+
+# Open mailbox file.  Exits with exception when this fails.
+
+mail = open(posix.environ['MAIL'], 'r')
+
+while 1:
+	line = mail.readline()
+	if not line: break # EOF
+	if line[:5] = 'From ':
+		# Start of message found
+		print line[:-1],
+		while 1:
+			line = mail.readline()
+			if not line: break # EOF
+			if line = '\n': break # Blank line ends headers
+			if line[:8] = 'Subject:':
+				print `line[9:-1]`,
+		print
diff --git a/Demo/scripts/lpwatch.py b/Demo/scripts/lpwatch.py
new file mode 100755
index 0000000..294028f
--- /dev/null
+++ b/Demo/scripts/lpwatch.py
@@ -0,0 +1,111 @@
+#! /ufs/guido/bin/sgi/python
+#! /usr/local/python
+
+# Watch line printer queue(s).
+# Intended for BSD 4.3 lpq.
+
+import posix
+import sys
+import time
+import string
+
+DEF_PRINTER = 'psc'
+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 not printers:
+		if posix.environ.has_key('PRINTER'):
+			printers = [posix.environ['PRINTER']]
+		else:
+			printers = [DEF_PRINTER]
+	#
+	clearhome = posix.popen('clear', 'r').read()
+	#
+	while 1:
+		# Pipe output through cat for extra buffering,
+		# so the output (which overwrites the previous)
+		# appears instantaneous.
+		sys.stdout = posix.popen('exec cat', 'w')
+		sys.stdout.write(clearhome)
+		for name in printers:
+			pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
+			showstatus(name, pipe, thisuser)
+			sts = pipe.close()
+			if sts:
+				print name + ': *** lpq exit status', sts
+		sts = sys.stdout.close()
+		time.sleep(delay)
+
+def showstatus(name, pipe, thisuser):
+	lines = 0
+	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':
+				if line[-1:] = '\n':
+					line = line[:-1]
+				if not lines:
+					print name + ':',
+				else:
+					print
+				print line,
+				lines = lines + 1
+	if totaljobs:
+		if lines > 1:
+			print
+			lines = lines+1
+		print (totalbytes+1023)/1024, 'K',
+		if totaljobs <> len(users):
+			print '(' + `totaljobs` + ' jobs)',
+		if len(users) = 1:
+			print 'for', users.keys()[0],
+		else:
+			print 'for', len(users), 'users',
+		if userseen:
+			if aheadjobs = 0:
+				print '(' + thisuser + ' first)',
+			else:
+				print '(' + `(aheadbytes+1023)/1024`,
+				print 'K before', thisuser + ')'
+	if lines:
+		print
+
+try:
+	main()
+except KeyboardInterrupt:
+	pass
diff --git a/Demo/scripts/pi.py b/Demo/scripts/pi.py
new file mode 100755
index 0000000..5e19db6
--- /dev/null
+++ b/Demo/scripts/pi.py
@@ -0,0 +1,30 @@
+#! /usr/local/python
+
+# Print digits of pi forever.
+#
+# The algorithm, using Python's 'long' integers ("bignums"), works
+# with continued fractions, and was conceived by Lambert Meertens.
+#
+# See also the ABC Programmer's Handbook, by Geurts, Meertens & Pemberton,
+# published by Prentice-Hall (UK) Ltd., 1990.
+
+import sys
+
+def main():
+	k, a, b, a1, b1 = 2l, 4l, 1l, 12l, 4l
+	while 1:
+		# Next approximation
+		p, q, k = k*k, 2l*k+1l, k+1l
+		a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
+		# Print common digits
+		d, d1 = a/b, a1/b1
+		#print a, b, a1, b1
+		while d = d1:
+			# Use write() to avoid spaces between the digits
+			sys.stdout.write(`int(d)`)
+			# Flush so the output is seen immediately
+			sys.stdout.flush()
+			a, a1 = 10l*(a%b), 10l*(a1%b1)
+			d, d1 = a/b, a1/b1
+
+main()
diff --git a/Demo/scripts/primes.py b/Demo/scripts/primes.py
new file mode 100755
index 0000000..487acef
--- /dev/null
+++ b/Demo/scripts/primes.py
@@ -0,0 +1,26 @@
+#! /usr/local/python
+
+# 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)
+
+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
+
+main()