Initial release (+ 1 bugfix in setup.py)
diff --git a/PC/setup_nt/setup.py b/PC/setup_nt/setup.py
new file mode 100644
index 0000000..3f8b117
--- /dev/null
+++ b/PC/setup_nt/setup.py
@@ -0,0 +1,254 @@
+"""Setup script for Windows NT 3.5 until we have a proper installer.
+
+Run this with the current directory set to the Python ``root''.
+"""
+
+import sys
+import strop
+
+del sys.path[1:]
+
+try:
+    import nt
+except ImportError:
+    print "This script should only be run on a Windows (NT or '95) system."
+    sys.exit(1)
+
+try:
+    sys.winver
+    print "This Python version appears to be", sys.winver
+except NameError:
+    print "Huh?  sys.winver is not defined!"
+    sys.exit(1)
+
+# Try to import a common module that *should* work.
+print "Looking for Python root directory..."
+while 1:
+    pwd = nt.getcwd()
+    ##print "Could it be", `pwd`, "?"
+    try:
+	open("Lib\\os.py").close()
+	##print "It appears so."
+	break
+    except IOError:
+	##print "Hm, it doesn't appear to be.  Try the parent directory."
+	try:
+	    opwd = pwd
+	    nt.chdir("..")
+	    pwd = nt.getcwd()
+	    if opwd == pwd:
+		##print "Seems like we're in the root already."
+		raise nt.error
+	except nt.error:
+	    ##print "Can't chdir to the parent -- we're stuck."
+	    pass
+	else:
+	    ##print "Try again one level higher."
+	    continue
+	print "Hey, would you like to help?"
+	print "Please enter the pathname of the Python root."
+	while 1:
+	    try:
+		dirname = raw_input("Python root: ")
+	    except EOFError:
+		print "OK, I give up."
+		sys.exit(1)
+	    if not dirname:
+		continue
+	    try:
+		nt.chdir(dirname)
+	    except nt.error:
+		print "That directory doesn't seem to exist."
+		print "Please try again."
+	    else:
+		break
+pwd = nt.getcwd()
+print "Python root directory is", pwd
+sys.path[1:] = [".\\Lib", ".\\Lib\win", ".\\Bin", ".\\vc40"]
+
+# Now we should be in a position to import win32api and win32con
+
+try:
+    import win32api
+except ImportError:
+    print "Blech.  We *still* can't import win32api."
+    print "Giving up."
+    sys.exit(1)
+try:
+    import win32con
+except ImportError:
+    print "Beh.  We have win32api but not win32con."
+    print "Making do with a dummy."
+    class win32con:
+	REG_NOTIFY_CHANGE_ATTRIBUTES = 0x00000002L
+	REG_NOTIFY_CHANGE_SECURITY = 0x00000008L
+	REG_RESOURCE_REQUIREMENTS_LIST = 10
+	REG_NONE = 0
+	REG_SZ = 1
+	REG_EXPAND_SZ = 2
+	REG_BINARY = 3
+	REG_DWORD = 4
+	REG_DWORD_LITTLE_ENDIAN = 4
+	REG_DWORD_BIG_ENDIAN = 5
+	REG_LINK = 6
+	REG_MULTI_SZ = 7
+	REG_RESOURCE_LIST = 8
+	REG_FULL_RESOURCE_DESCRIPTOR = 9
+	HKEY_CLASSES_ROOT = 0x80000000
+	HKEY_CURRENT_USER = 0x80000001
+	HKEY_LOCAL_MACHINE = 0x80000002
+	HKEY_USERS = 0x80000003
+	HKEY_PERFORMANCE_DATA = 0x80000004
+	HKEY_PERFORMANCE_TEXT = 0x80000050
+	HKEY_PERFORMANCE_NLSTEXT = 0x80000060
+
+
+def listtree(handle, level=0):
+    i = 0
+    while 1:
+	try:
+	    key = win32api.RegEnumKey(handle, i)
+	except win32api.error:
+	    break
+	try:
+	    value = win32api.RegQueryValue(handle, key)
+	except win32api.error, msg:
+	    try:
+		msg = msg[2]
+	    except:
+		pass
+	    value = "*** Error: %s" % str(msg)
+	print "    "*level + "%s: %s" % (key, value)
+	subhandle = win32api.RegOpenKey(handle, key)
+	listtree(subhandle, level+1)
+	win32api.RegCloseKey(subhandle)
+	i = i+1
+
+roothandle = win32con.HKEY_LOCAL_MACHINE
+pythonkey = "Software\\Python"
+try:
+    pythonhandle = win32api.RegOpenKey(roothandle, pythonkey)
+except win32api.error:
+    pythonhandle = win32api.RegCreateKey(roothandle, pythonkey)
+
+## listtree(pythonhandle)
+## try:
+##     handle = win32api.RegOpenKey(pythonhandle, "JustTesting")
+## except win32api.error, msg:
+##     try: msg = msg[2]
+##     except: pass
+##     ##print "Error opening, try creating instead:", msg
+##     handle = win32api.RegCreateKey(pythonhandle, "JustTesting")
+## win32api.RegSetValue(handle, "test1", win32con.REG_SZ, "NO!")
+## win32api.RegSetValue(handle, "test2", win32con.REG_SZ, "YES!")
+## win32api.RegDeleteKey(handle, "test1")
+## win32api.RegDeleteKey(handle, "test2")
+## win32api.RegCloseKey(handle)
+## win32api.RegDeleteKey(pythonhandle, "JustTesting")
+## listtree(pythonhandle)
+
+print "Setting PythonPath..."
+corekey = "PythonCore\\%s" % sys.winver
+try:
+    corehandle = win32api.RegOpenKey(pythonhandle, corekey)
+except win32api.error, msg:
+    corehandle = win32api.RegCreateKey(pythonhandle, corekey)
+path = []
+pwd = nt.getcwd()
+for i in ["Bin",
+	  "Lib",
+	  "Lib\\win",
+	  "Lib\\tkinter",
+	  "Lib\\test",
+	  "Lib\\dos_8x3"]:
+    i = pwd + "\\" + i
+    path.append(i)
+sys.path[1:] = path
+pathvalue = strop.join(path, ";")
+#print "Setting PythonPath to", pathvalue
+win32api.RegSetValue(corehandle, "PythonPath", win32con.REG_SZ, pathvalue)
+win32api.RegCloseKey(corehandle)
+#listtree(pythonhandle)
+win32api.RegCloseKey(pythonhandle)
+
+print "Registering Python Interpreter as shell for *.py files..."
+pwd = nt.getcwd()
+interpreter = '"' + pwd + '\\Bin\\python.exe" -i %1'
+print "Interpreter command is", interpreter
+root = win32con.HKEY_CLASSES_ROOT
+sz = win32con.REG_SZ
+win32api.RegSetValue(root, ".py", sz, "Python.Script")
+win32api.RegSetValue(root , "Python.Script", sz, "Python Script")
+win32api.RegSetValue(root , "Python.Script\\Shell\\Open\\Command", sz,
+		     interpreter)
+
+import compileall
+print "Compiling all library modules..."
+compileall.main()
+
+print "Installation complete."
+
+envkeys = map(strop.upper, nt.environ.keys())
+if 'PYTHONPATH' in envkeys:
+    print """
+**********************************************************************
+WARNING!
+You have set the environment variable PYTHONPATH.
+This will override the default Python module search path
+and probably cause you to use an old or broken Python installation.
+Go into your control panel *now* and delete PYTHONPATH!
+**********************************************************************
+"""
+
+raw_input("Press Enter to exit: ")
+sys.exit(0)
+
+
+registry_doc = """Summary of the Win32 API Registry interfaces.
+
+Concepts:
+    A _directory_ is a collection of key/value pairs.
+    You need a _handle_ for a directory to do anything with it.
+    There are some predefined keys, e.g. HKEY_LOCAL_MACHINE.
+    A _key_ is an ASCII string; NT file system conventions apply.
+    A _value_ has a type and some data; there are predefined types
+    (e.g. REG_SZ is a string, REG_DWORD is a 4-byte integer).
+    There's some fishiness in that in fact multiple, named values
+    can appear under each key, but this seems little used (in this
+    case, the value is best seen as a structured value).
+    A key can also refer to a _subdirectory_.  In this case the
+    associated value is typically empty.  To get a handle for a
+    subdirectory, use RegOpenKey(handle, key).  The key can also
+    be a backslash-separated path, so you can go directly from one of
+    the predefined keys to the directory you are interested in.
+
+Most common functions:
+    RegOpenKey(handle, keypath) -> handle
+        Get a handle for an existing subdirectory
+    RegCreateKey(handle, keypath) -> handle
+        Get a handle for a new subdirectory
+    RegCloseKey(handle)
+        Close a handle
+    RegGetValue(handle, subkey) -> string
+        Get the (unnamed) value stored as key in handle
+    RegSetValue(handle, subkey, type, value)
+        Set the (unnamed) value stored as key in handle, with given
+	type; type should be REG_SZ
+    RegSetValueEx(handle, name, reserved, type, value)
+        Set the value with given name to the given type and value;
+	currently reserved is ignored and type should be REG_SZ
+
+Functions to list directory contents (start counting at 0, fail if done):
+    RegEnumKey(handle, i)
+        Return the i'th subkey
+    RegEnumValue(handle, i)
+        Return the i'th name and value
+
+Lesser used functions:
+    RegFlushKey(handle)
+        Flush the changes to the handle to disk (like Unix sync())
+    RegSaveKey(handle, filename, reserved)
+        Save the contents to a disk file (broken?!)
+    RegLoadKey(handle, keypath, filename)
+        Load the contents from a disk file (lots of restrictions!)
+"""