applied patch from Stéphane Bidoul to fix some Python bindings

* python/libxml.c python/generator.py python/libxml.py
  python/libxml2-python-api.xml python/libxml2class.txt:
  applied patch from Stéphane Bidoul to fix some Python bindings
  initialization, then had to change the parserCleanup()
  to handle memory released there.
* xmlmemory.c: added more debugging comments.
Daniel
diff --git a/python/libxml.c b/python/libxml.c
index 4ab69fb..eb44a2b 100644
--- a/python/libxml.c
+++ b/python/libxml.c
@@ -75,6 +75,9 @@
 static xmlReallocFunc reallocFunc = NULL;
 static xmlStrdupFunc strdupFunc = NULL;
 
+static void
+libxml_xmlErrorInitialize(void); /* forward declare */
+
 PyObject *
 libxml_xmlDebugMemory(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
 {
@@ -104,13 +107,21 @@
                 (strdupFunc == xmlMemoryStrdup)) {
                 libxmlMemoryAllocatedBase = xmlMemUsed();
             } else {
+                /* 
+                 * cleanup first, because some memory has been
+                 * allocated with the non-debug malloc in xmlInitParser
+                 * when the python module was imported
+                 */
+                xmlCleanupParser();
                 ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc,
                                          xmlMemRealloc, xmlMemoryStrdup);
                 if (ret < 0)
                     goto error;
                 libxmlMemoryAllocatedBase = xmlMemUsed();
+                /* reinitialize */
+                xmlInitParser();
+                libxml_xmlErrorInitialize();
             }
-            xmlInitParser();
             ret = 0;
         } else if (libxmlMemoryDebugActivated == 0) {
             libxmlMemoryAllocatedBase = xmlMemUsed();
@@ -133,6 +144,29 @@
 }
 
 PyObject *
+libxml_xmlPythonCleanupParser(PyObject *self ATTRIBUTE_UNUSED,
+                              PyObject *args ATTRIBUTE_UNUSED) {
+
+    long freed;
+
+    if (libxmlMemoryDebug) {
+        freed = xmlMemUsed();
+    }
+
+    xmlCleanupParser();
+
+    if (libxmlMemoryDebug) {
+        freed -= xmlMemUsed();
+	libxmlMemoryAllocatedBase -= freed;
+	if (libxmlMemoryAllocatedBase < 0)
+	    libxmlMemoryAllocatedBase = 0;
+    }
+
+    Py_INCREF(Py_None);
+    return(Py_None);
+}
+
+PyObject *
 libxml_xmlDumpMemory(ATTRIBUTE_UNUSED PyObject * self,
                      ATTRIBUTE_UNUSED PyObject * args)
 {
@@ -3228,20 +3262,19 @@
 initlibxml2mod(void)
 {
     static int initialized = 0;
-    PyObject *m;
 
     if (initialized != 0)
         return;
-    /* XXX xmlInitParser does much more than this */
-    xmlInitGlobals();
-#ifdef LIBXML_OUTPUT_ENABLED
-    xmlRegisterDefaultOutputCallbacks();
-#endif /* LIBXML_OUTPUT_ENABLED */
-    xmlRegisterDefaultInputCallbacks();
-    m = Py_InitModule((char *) "libxml2mod", libxmlMethods);
-    initialized = 1;
+    
+    /* intialize the python extension module */
+    Py_InitModule((char *) "libxml2mod", libxmlMethods);
+
+    /* initialize libxml2 */
+    xmlInitParser();
     libxml_xmlErrorInitialize();
 
+    initialized = 1;
+
 #ifdef MERGED_MODULES
     initlibxsltmod();
 #endif