Patch derived from Trent's 101162: a Python/C API testing framework.
STILL NEEDS UNIX BUILD CHANGES.
diff --git a/Lib/test/output/test_capi b/Lib/test/output/test_capi
new file mode 100644
index 0000000..c095219
--- /dev/null
+++ b/Lib/test/output/test_capi
@@ -0,0 +1 @@
+test_capi
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
new file mode 100644
index 0000000..8b39829
--- /dev/null
+++ b/Lib/test/test_capi.py
@@ -0,0 +1,16 @@
+# Run the _test module tests (tests for the Python/C API):  by defn, these
+# are all functions _test exports whose name begins with 'test_'.
+
+import sys
+import test_support
+import _test
+
+for name in dir(_test):
+    if name.startswith('test_'):
+        test = getattr(_test, name)
+        if test_support.verbose:
+            print "internal", name
+        try:
+            test()
+        except _test.error:
+            raise test_support.TestFailed, sys.exc_info()[1]
diff --git a/Misc/NEWS b/Misc/NEWS
index 86cb703..0e7a1ff 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -60,7 +60,7 @@
 
 - A 'continue' statement can now appear in a try block within the body
   of a loop.  It is still not possible to use continue in a finally
-  clause. 
+  clause.
 
 Standard library
 
@@ -94,12 +94,21 @@
 - The socket module now supports raw packets on Linux.  The socket
   family is AF_PACKET.
 
+- test_capi.py is a start at running tests of the Python C API.  The tests
+  are implemented by the new Modules/_testmodule.c.
+
 Windows changes
 
 - Build procedure:  the zlib project is built in a different way that
   ensures the zlib header files used can no longer get out of synch with
-  the zlib binary used.  See PCbuild\readme.txt for details.
+  the zlib binary used.  See PCbuild\readme.txt for details.  Your old
+  zlib-related directories can be deleted; you'll need to download fresh
+  source for zlib and unpack it into a new directory.
 
+- Build:  New subproject _test for the benefit of test_capi.py (see above).
+
+- Build:  subproject ucnhash is gone, since the code was folded into the
+  unicodedata subproject.
 
 What's New in Python 2.1 alpha 1?
 =================================
diff --git a/Modules/_testmodule.c b/Modules/_testmodule.c
new file mode 100644
index 0000000..e4c9c75
--- /dev/null
+++ b/Modules/_testmodule.c
@@ -0,0 +1,68 @@
+/*
+ * C Extension module to test Python interpreter C APIs.
+ *
+ * The 'test_*' functions exported by this module are run as part of the
+ * standard Python regression test, via Lib/test/test_capi.py.
+ */
+
+#include "Python.h"
+
+static PyObject *TestError;	/* set to exception object in init */
+
+/* Test #defines from config.h (particularly the SIZEOF_* defines).
+
+   The ones derived from autoconf on the UNIX-like OSes can be relied
+   upon (in the absence of sloppy cross-compiling), but the Windows
+   platforms have these hardcoded.  Better safe than sorry.
+*/
+static PyObject*
+sizeof_error(const char* fatname, const char* typename,
+        int expected, int got)
+{
+	char buf[1024];
+	sprintf(buf, "%s #define == %d but sizeof(%s) == %d",
+		fatname, expected, typename, got);
+	PyErr_SetString(TestError, buf);
+	return (PyObject*)NULL;
+}
+
+static PyObject*
+test_config(PyObject *self, PyObject *args)
+{
+        if (!PyArg_ParseTuple(args, ":test_config"))
+                return NULL;
+
+#define CHECK_SIZEOF(FATNAME, TYPE) \
+	    if (FATNAME != sizeof(TYPE)) \
+    	    	return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
+
+	CHECK_SIZEOF(SIZEOF_INT, int);
+	CHECK_SIZEOF(SIZEOF_LONG, long);
+	CHECK_SIZEOF(SIZEOF_VOID_P, void*);
+	CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
+#ifdef HAVE_LONG_LONG
+	CHECK_SIZEOF(SIZEOF_LONG_LONG, LONG_LONG);
+#endif
+
+#undef CHECK_SIZEOF
+
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static PyMethodDef TestMethods[] = {
+	{"test_config", test_config, METH_VARARGS},
+	{NULL, NULL} /* sentinel */
+};
+
+DL_EXPORT(void)
+init_test(void)
+{
+	PyObject *m, *d;
+
+	m = Py_InitModule("_test", TestMethods);
+
+	TestError = PyErr_NewException("_test.error", NULL, NULL);
+	d = PyModule_GetDict(m);
+	PyDict_SetItemString(d, "error", TestError);
+}
diff --git a/PCbuild/_test.dsp b/PCbuild/_test.dsp
new file mode 100644
index 0000000..6bf5666
--- /dev/null
+++ b/PCbuild/_test.dsp
@@ -0,0 +1,99 @@
+# Microsoft Developer Studio Project File - Name="_test" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=_test - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "_test.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "_test.mak" CFG="_test - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "_test - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "_test - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName "_test"
+# PROP Scc_LocalPath ".."
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "_test - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "."
+# PROP Intermediate_Dir "x86-temp-release\_test"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+F90=df.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\Include" /I "..\PC" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0xc09 /d "NDEBUG"
+# ADD RSC /l 0xc09 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1e1F0000" /dll /machine:I386 /out:"./_test.pyd" /export:init_test
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "_test - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "."
+# PROP Intermediate_Dir "x86-temp-debug\_test"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+F90=df.exe
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\Include" /I "..\PC" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0xc09 /d "_DEBUG"
+# ADD RSC /l 0xc09 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1e1F0000" /dll /debug /machine:I386 /out:"./_test_d.pyd" /pdbtype:sept /export:init_test
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "_test - Win32 Release"
+# Name "_test - Win32 Debug"
+# Begin Source File
+
+SOURCE=..\Modules\_testmodule.c
+# End Source File
+# End Target
+# End Project
diff --git a/PCbuild/pcbuild.dsw b/PCbuild/pcbuild.dsw
index 1e521ad..87c9ad9 100644
--- a/PCbuild/pcbuild.dsw
+++ b/PCbuild/pcbuild.dsw
@@ -33,6 +33,18 @@
 

 ###############################################################################

 

+Project: "_test"=.\_test.dsp - Package Owner=<4>

+

+Package=<5>

+{{{

+}}}

+

+Package=<4>

+{{{

+}}}

+

+###############################################################################

+

 Project: "_tkinter"=.\_tkinter.dsp - Package Owner=<4>

 

 Package=<5>

diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt
index 255a53b..f7a6e8c 100644
--- a/PCbuild/readme.txt
+++ b/PCbuild/readme.txt
@@ -55,6 +55,9 @@
     Windows registry API
 winsound
     play sounds (typically .wav files) under Windows
+_test
+    tests of the Python C API, run via Lib/test/test_capi.py, and
+    implemented by module Modules/_testmodule.c
 
 The following subprojects will generally NOT build out of the box.  They
 wrap code Python doesn't control, and you'll need to download the base