patch from Vladimir (move Py_Mem* interface to Include/pymem.h)
diff --git a/Include/Python.h b/Include/Python.h
index f89f3e7..b994401 100644
--- a/Include/Python.h
+++ b/Include/Python.h
@@ -54,6 +54,8 @@
 
 #include "pyport.h"
 
+#include "pymem.h"
+
 #include "object.h"
 #include "objimpl.h"
 
diff --git a/Include/mymalloc.h b/Include/mymalloc.h
index 2af58e4..8dadb66 100644
--- a/Include/mymalloc.h
+++ b/Include/mymalloc.h
@@ -1,5 +1,3 @@
-#ifndef Py_MYMALLOC_H
-#define Py_MYMALLOC_H
 /***********************************************************
 Copyright (c) 2000, BeOpen.com.
 Copyright (c) 1995-2000, Corporation for National Research Initiatives.
@@ -15,6 +13,9 @@
 USE "pyport.h" INSTEAD
 ***************************************/
 
+#ifndef Py_MYMALLOC_H
+#define Py_MYMALLOC_H
+
 /* Lowest-level memory allocation interface */
 
 #define ANY void /* For API compatibility only. Obsolete, do not use. */
diff --git a/Include/mymath.h b/Include/mymath.h
index 1bfd6dd..27f301d 100644
--- a/Include/mymath.h
+++ b/Include/mymath.h
@@ -1,3 +1,13 @@
+/***********************************************************
+Copyright (c) 2000, BeOpen.com.
+Copyright (c) 1995-2000, Corporation for National Research Initiatives.
+Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
+All rights reserved.
+
+See the file "Misc/COPYRIGHT" for information on usage and
+redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+******************************************************************/
+
 /***************************************
 THIS FILE IS OBSOLETE
 USE "pyport.h" INSTEAD
diff --git a/Include/myproto.h b/Include/myproto.h
index 94be8df..5d25d2c 100644
--- a/Include/myproto.h
+++ b/Include/myproto.h
@@ -1,9 +1,3 @@
-#ifndef Py_PROTO_H
-#define Py_PROTO_H
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /***********************************************************
 Copyright (c) 2000, BeOpen.com.
 Copyright (c) 1995-2000, Corporation for National Research Initiatives.
@@ -19,6 +13,12 @@
 DON'T USE Py_PROTO or Py_FPROTO anymore.
 ***************************************/
 
+#ifndef Py_PROTO_H
+#define Py_PROTO_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #ifdef HAVE_PROTOTYPES
 #define Py_PROTO(x) x
 #else
diff --git a/Include/myselect.h b/Include/myselect.h
index 53e924d..3562af8 100644
--- a/Include/myselect.h
+++ b/Include/myselect.h
@@ -1,9 +1,3 @@
-#ifndef Py_MYSELECT_H
-#define Py_MYSELECT_H
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /***********************************************************
 Copyright (c) 2000, BeOpen.com.
 Copyright (c) 1995-2000, Corporation for National Research Initiatives.
@@ -19,6 +13,12 @@
 USE "pyport.h" INSTEAD
 ***************************************/
 
+#ifndef Py_MYSELECT_H
+#define Py_MYSELECT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* Include file for users of select() */
 
 /* NB caller must include <sys/types.h> */
diff --git a/Include/mytime.h b/Include/mytime.h
index bfad575..07a2480 100644
--- a/Include/mytime.h
+++ b/Include/mytime.h
@@ -1,9 +1,3 @@
-#ifndef Py_MYTIME_H
-#define Py_MYTIME_H
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /***********************************************************
 Copyright (c) 2000, BeOpen.com.
 Copyright (c) 1995-2000, Corporation for National Research Initiatives.
@@ -19,6 +13,12 @@
 USE "pyport.h" INSTEAD
 ***************************************/
 
+#ifndef Py_MYTIME_H
+#define Py_MYTIME_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* Include file instead of <time.h> and/or <sys/time.h> */
 
 #ifdef TIME_WITH_SYS_TIME
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 3c0c7fc..0fd813d 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -10,12 +10,13 @@
 
 #ifndef Py_OBJIMPL_H
 #define Py_OBJIMPL_H
+
+#include "pymem.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#include "pyport.h"
-
 /*
 Functions and macros for modules that implement new object types.
 You must first include "object.h".
diff --git a/Include/pgenheaders.h b/Include/pgenheaders.h
index 15e9861..0b2e4ce 100644
--- a/Include/pgenheaders.h
+++ b/Include/pgenheaders.h
@@ -30,7 +30,7 @@
 #include <stdlib.h>
 #endif
 
-#include "pyport.h"
+#include "pymem.h"
 
 #include "pydebug.h"
 
diff --git a/Include/pymem.h b/Include/pymem.h
new file mode 100644
index 0000000..adcc739
--- /dev/null
+++ b/Include/pymem.h
@@ -0,0 +1,179 @@
+/***********************************************************
+Copyright (c) 2000, BeOpen.com.
+Copyright (c) 1995-2000, Corporation for National Research Initiatives.
+Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
+All rights reserved.
+
+See the file "Misc/COPYRIGHT" for information on usage and
+redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+******************************************************************/
+
+/* Lowest-level memory allocation interface */
+
+#ifndef Py_PYMEM_H
+#define Py_PYMEM_H
+
+#include "pyport.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Core memory allocator
+ * =====================
+ */
+
+/* To make sure the interpreter is user-malloc friendly, all memory
+   APIs are implemented on top of this one.
+
+   The PyCore_* macros can be defined to make the interpreter use a
+   custom allocator. Note that they are for internal use only. Both
+   the core and extension modules should use the PyMem_* API.
+
+   See the comment block at the end of this file for two scenarios
+   showing how to use this to use a different allocator. */
+
+#ifndef PyCore_MALLOC_FUNC
+#undef PyCore_REALLOC_FUNC
+#undef PyCore_FREE_FUNC
+#define PyCore_MALLOC_FUNC      malloc
+#define PyCore_REALLOC_FUNC     realloc
+#define PyCore_FREE_FUNC        free
+#endif
+
+#ifndef PyCore_MALLOC_PROTO
+#undef PyCore_REALLOC_PROTO
+#undef PyCore_FREE_PROTO
+#define PyCore_MALLOC_PROTO    (size_t)
+#define PyCore_REALLOC_PROTO   (void *, size_t)
+#define PyCore_FREE_PROTO      (void *)
+#endif
+
+#ifdef NEED_TO_DECLARE_MALLOC_AND_FRIEND
+extern void *PyCore_MALLOC_FUNC PyCore_MALLOC_PROTO;
+extern void *PyCore_REALLOC_FUNC PyCore_REALLOC_PROTO;
+extern void PyCore_FREE_FUNC PyCore_FREE_PROTO;
+#endif
+
+#ifndef PyCore_MALLOC
+#undef PyCore_REALLOC
+#undef PyCore_FREE
+#define PyCore_MALLOC(n)        PyCore_MALLOC_FUNC(n)
+#define PyCore_REALLOC(p, n)    PyCore_REALLOC_FUNC((p), (n))
+#define PyCore_FREE(p)          PyCore_FREE_FUNC(p)
+#endif
+
+/* BEWARE:
+
+   Each interface exports both functions and macros. Extension modules
+   should normally use the functions for ensuring binary compatibility
+   of the user's code across Python versions. Subsequently, if the
+   Python runtime switches to its own malloc (different from standard
+   malloc), no recompilation is required for the extensions.
+
+   The macro versions trade compatibility for speed. They can be used
+   whenever there is a performance problem, but their use implies
+   recompilation of the code for each new Python release. The Python
+   core uses the macros because it *is* compiled on every upgrade.
+   This might not be the case with 3rd party extensions in a custom
+   setup (for example, a customer does not always have access to the
+   source of 3rd party deliverables). You have been warned! */
+
+/*
+ * Raw memory interface
+ * ====================
+ */
+
+/* Functions */
+
+/* Function wrappers around PyCore_MALLOC and friends; useful if you
+   need to be sure that you are using the same memory allocator as
+   Python.  Note that the wrappers make sure that allocating 0 bytes
+   returns a non-NULL pointer, even if the underlying malloc
+   doesn't. Returned pointers must be checked for NULL explicitly.
+   No action is performed on failure. */
+extern DL_IMPORT(void *) PyMem_Malloc(size_t);
+extern DL_IMPORT(void *) PyMem_Realloc(void *, size_t);
+extern DL_IMPORT(void) PyMem_Free(void *);
+
+/* Starting from Python 1.6, the wrappers Py_{Malloc,Realloc,Free} are
+   no longer supported. They used to call PyErr_NoMemory() on failure. */
+
+/* Macros */
+#define PyMem_MALLOC(n)         PyCore_MALLOC(n)
+#define PyMem_REALLOC(p, n)     PyCore_REALLOC((void *)(p), (n))
+#define PyMem_FREE(p)           PyCore_FREE((void *)(p))
+
+/*
+ * Type-oriented memory interface
+ * ==============================
+ */
+
+/* Functions */
+#define PyMem_New(type, n) \
+	( (type *) PyMem_Malloc((n) * sizeof(type)) )
+#define PyMem_Resize(p, type, n) \
+	( (p) = (type *) PyMem_Realloc((n) * sizeof(type)) )
+#define PyMem_Del(p) PyMem_Free(p)
+
+/* Macros */
+#define PyMem_NEW(type, n) \
+	( (type *) PyMem_MALLOC(_PyMem_EXTRA + (n) * sizeof(type)) )
+#define PyMem_RESIZE(p, type, n) \
+	if ((p) == NULL) \
+		(p) = (type *)(PyMem_MALLOC( \
+				    _PyMem_EXTRA + (n) * sizeof(type))); \
+	else \
+		(p) = (type *)(PyMem_REALLOC((p), \
+				    _PyMem_EXTRA + (n) * sizeof(type)))
+#define PyMem_DEL(p) PyMem_FREE(p)
+
+/* PyMem_XDEL is deprecated. To avoid the call when p is NULL,
+   it is recommended to write the test explicitly in the code.
+   Note that according to ANSI C, free(NULL) has no effect. */
+
+#ifdef __cplusplus
+}
+#endif
+
+/* SCENARIOS
+
+   Here are two scenarios by Vladimir Marangozov (the author of the
+   memory allocation redesign).
+
+   1) Scenario A
+
+   Suppose you want to use a debugging malloc library that collects info on
+   where the malloc calls originate from. Assume the interface is:
+
+   d_malloc(size_t n, char* src_file, unsigned long src_line) c.s.
+
+   In this case, you would define (for example in config.h) :
+
+   #define PyCore_MALLOC_FUNC      d_malloc
+   ...
+   #define PyCore_MALLOC_PROTO	(size_t, char *, unsigned long)
+   ...
+   #define NEED_TO_DECLARE_MALLOC_AND_FRIEND
+
+   #define PyCore_MALLOC(n)	PyCore_MALLOC_FUNC((n), __FILE__, __LINE__)
+   ...
+
+   2) Scenario B
+
+   Suppose you want to use malloc hooks (defined & initialized in a 3rd party
+   malloc library) instead of malloc functions.  In this case, you would
+   define:
+
+   #define PyCore_MALLOC_FUNC	(*malloc_hook)
+   ...
+   #define NEED_TO_DECLARE_MALLOC_AND_FRIEND
+
+   and ignore the previous definitions about PyCore_MALLOC_FUNC, etc.
+
+
+*/
+
+
+#endif /* !Py_PYMEM_H */
diff --git a/Include/pyport.h b/Include/pyport.h
index 6026a2b..f635703 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -9,6 +9,8 @@
 #ifndef Py_PYPORT_H
 #define Py_PYPORT_H
 
+#include "config.h" /* include for defines */
+
 /**************************************************************************
 Symbols and macros to supply platform-independent interfaces to basic
 C language & library operations whose spellings vary across platforms.
@@ -220,9 +222,9 @@
 #endif 
 
 
-/***********************************
- * WRAPPER FOR malloc/realloc/free *
- ***********************************/
+/************************************
+ * MALLOC COMPATIBILITY FOR pymem.h *
+ ************************************/
 
 #ifndef DL_IMPORT       /* declarations for DLL import */
 #define DL_IMPORT(RTYPE) RTYPE
@@ -240,157 +242,6 @@
 #define _PyMem_EXTRA 0
 #endif
 
-/*
- * Core memory allocator
- * =====================
- */
-
-/* To make sure the interpreter is user-malloc friendly, all memory
-   APIs are implemented on top of this one.
-
-   The PyCore_* macros can be defined to make the interpreter use a
-   custom allocator. Note that they are for internal use only. Both
-   the core and extension modules should use the PyMem_* API.
-
-   See the comment block at the end of this file for two scenarios
-   showing how to use this to use a different allocator. */
-
-#ifndef PyCore_MALLOC_FUNC
-#undef PyCore_REALLOC_FUNC
-#undef PyCore_FREE_FUNC
-#define PyCore_MALLOC_FUNC      malloc
-#define PyCore_REALLOC_FUNC     realloc
-#define PyCore_FREE_FUNC        free
-#endif
-
-#ifndef PyCore_MALLOC_PROTO
-#undef PyCore_REALLOC_PROTO
-#undef PyCore_FREE_PROTO
-#define PyCore_MALLOC_PROTO    (size_t)
-#define PyCore_REALLOC_PROTO   (void *, size_t)
-#define PyCore_FREE_PROTO      (void *)
-#endif
-
-#ifdef NEED_TO_DECLARE_MALLOC_AND_FRIEND
-extern void *PyCore_MALLOC_FUNC PyCore_MALLOC_PROTO;
-extern void *PyCore_REALLOC_FUNC PyCore_REALLOC_PROTO;
-extern void PyCore_FREE_FUNC PyCore_FREE_PROTO;
-#endif
-
-#ifndef PyCore_MALLOC
-#undef PyCore_REALLOC
-#undef PyCore_FREE
-#define PyCore_MALLOC(n)        PyCore_MALLOC_FUNC(n)
-#define PyCore_REALLOC(p, n)    PyCore_REALLOC_FUNC((p), (n))
-#define PyCore_FREE(p)          PyCore_FREE_FUNC(p)
-#endif
-
-/* BEWARE:
-
-   Each interface exports both functions and macros. Extension modules
-   should normally use the functions for ensuring binary compatibility
-   of the user's code across Python versions. Subsequently, if the
-   Python runtime switches to its own malloc (different from standard
-   malloc), no recompilation is required for the extensions.
-
-   The macro versions trade compatibility for speed. They can be used
-   whenever there is a performance problem, but their use implies
-   recompilation of the code for each new Python release. The Python
-   core uses the macros because it *is* compiled on every upgrade.
-   This might not be the case with 3rd party extensions in a custom
-   setup (for example, a customer does not always have access to the
-   source of 3rd party deliverables). You have been warned! */
-
-/*
- * Raw memory interface
- * ====================
- */
-
-/* Functions */
-
-/* Function wrappers around PyCore_MALLOC and friends; useful if you
-   need to be sure that you are using the same memory allocator as
-   Python.  Note that the wrappers make sure that allocating 0 bytes
-   returns a non-NULL pointer, even if the underlying malloc
-   doesn't. Returned pointers must be checked for NULL explicitly.
-   No action is performed on failure. */
-extern DL_IMPORT(void *) PyMem_Malloc(size_t);
-extern DL_IMPORT(void *) PyMem_Realloc(void *, size_t);
-extern DL_IMPORT(void) PyMem_Free(void *);
-
-/* Starting from Python 1.6, the wrappers Py_{Malloc,Realloc,Free} are
-   no longer supported. They used to call PyErr_NoMemory() on failure. */
-
-/* Macros */
-#define PyMem_MALLOC(n)         PyCore_MALLOC(n)
-#define PyMem_REALLOC(p, n)     PyCore_REALLOC((void *)(p), (n))
-#define PyMem_FREE(p)           PyCore_FREE((void *)(p))
-
-/*
- * Type-oriented memory interface
- * ==============================
- */
-
-/* Functions */
-#define PyMem_New(type, n) \
-	( (type *) PyMem_Malloc((n) * sizeof(type)) )
-#define PyMem_Resize(p, type, n) \
-	( (p) = (type *) PyMem_Realloc((n) * sizeof(type)) )
-#define PyMem_Del(p) PyMem_Free(p)
-
-/* Macros */
-#define PyMem_NEW(type, n) \
-	( (type *) PyMem_MALLOC(_PyMem_EXTRA + (n) * sizeof(type)) )
-#define PyMem_RESIZE(p, type, n) \
-	if ((p) == NULL) \
-		(p) = (type *)(PyMem_MALLOC( \
-				    _PyMem_EXTRA + (n) * sizeof(type))); \
-	else \
-		(p) = (type *)(PyMem_REALLOC((p), \
-				    _PyMem_EXTRA + (n) * sizeof(type)))
-#define PyMem_DEL(p) PyMem_FREE(p)
-
-/* PyMem_XDEL is deprecated. To avoid the call when p is NULL,
-   it is recommended to write the test explicitly in the code.
-   Note that according to ANSI C, free(NULL) has no effect. */
-
-/* SCENARIOS
-
-   Here are two scenarios by Vladimir Marangozov (the author of the
-   memory allocation redesign).
-
-   1) Scenario A
-
-   Suppose you want to use a debugging malloc library that collects info on
-   where the malloc calls originate from. Assume the interface is:
-
-   d_malloc(size_t n, char* src_file, unsigned long src_line) c.s.
-
-   In this case, you would define (for example in config.h) :
-
-   #define PyCore_MALLOC_FUNC      d_malloc
-   ...
-   #define PyCore_MALLOC_PROTO	(size_t, char *, unsigned long)
-   ...
-   #define NEED_TO_DECLARE_MALLOC_AND_FRIEND
-
-   #define PyCore_MALLOC(n)	PyCore_MALLOC_FUNC((n), __FILE__, __LINE__)
-   ...
-
-   2) Scenario B
-
-   Suppose you want to use malloc hooks (defined & initialized in a 3rd party
-   malloc library) instead of malloc functions.  In this case, you would
-   define:
-
-   #define PyCore_MALLOC_FUNC	(*malloc_hook)
-   ...
-   #define NEED_TO_DECLARE_MALLOC_AND_FRIEND
-
-   and ignore the previous definitions about PyCore_MALLOC_FUNC, etc.
-
-
-*/
 
 /********************************************
  * WRAPPER FOR <time.h> and/or <sys/time.h> *