changing the way the .c is generated, extending the tests coverage fixing

* gentest.py testapi.c: changing the way the .c is generated,
  extending the tests coverage
* include/libxml/nanoftp.h nanoftp.c elfgcchack.h doc/*: fixing some
  function signatures, regenerating stuff
* SAX2.c parser.c xmlIO.c: another set of bug fixes and API hardening
Daniel
diff --git a/ChangeLog b/ChangeLog
index bd65790..3f9d85a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu Nov  4 18:32:22 CET 2004 Daniel Veillard <daniel@veillard.com>
+
+	* gentest.py testapi.c: changing the way the .c is generated,
+	  extending the tests coverage
+	* include/libxml/nanoftp.h nanoftp.c elfgcchack.h doc/*: fixing some
+	  function signatures, regenerating stuff
+	* SAX2.c parser.c xmlIO.c: another set of bug fixes and API hardening
+
 Thu Nov  4 13:32:19 CET 2004 Daniel Veillard <daniel@veillard.com>
 
 	* gentest.py testapi.c: extending the tests coverage
diff --git a/SAX2.c b/SAX2.c
index f392660..289f296 100644
--- a/SAX2.c
+++ b/SAX2.c
@@ -51,11 +51,13 @@
  */
 static void
 xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt, const char *msg) {
-    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-        ctxt->sax->error(ctxt->userData, "%s: out of memory\n", msg);
-    ctxt->errNo = XML_ERR_NO_MEMORY;
-    ctxt->instate = XML_PARSER_EOF;
-    ctxt->disableSAX = 1;
+    if (ctxt != NULL) {
+	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
+	    ctxt->sax->error(ctxt->userData, "%s: out of memory\n", msg);
+	ctxt->errNo = XML_ERR_NO_MEMORY;
+	ctxt->instate = XML_PARSER_EOF;
+	ctxt->disableSAX = 1;
+    }
 }
 
 /**
@@ -77,16 +79,19 @@
     if ((ctxt != NULL) && (ctxt->disableSAX != 0) &&
         (ctxt->instate == XML_PARSER_EOF))
 	return;
-    ctxt->errNo = error;
-    if ((ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC))
-        schannel = ctxt->sax->serror;
+    if (ctxt != NULL) {
+	ctxt->errNo = error;
+	if ((ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC))
+	    schannel = ctxt->sax->serror;
+    }
     __xmlRaiseError(schannel,
                     ctxt->vctxt.error, ctxt->vctxt.userData,
                     ctxt, NULL, XML_FROM_DTD, error,
                     XML_ERR_ERROR, NULL, 0, (const char *) str1,
 		    (const char *) str2, NULL, 0, 0,
 		    msg, (const char *) str1, (const char *) str2);
-    ctxt->valid = 0;
+    if (ctxt != NULL)
+	ctxt->valid = 0;
 }
 
 /**
@@ -117,6 +122,7 @@
 xmlSAX2GetSystemId(void *ctx)
 {
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+    if ((ctx == NULL) || (ctxt->input == NULL)) return(0);
     return((const xmlChar *) ctxt->input->filename); 
 }
 
@@ -132,6 +138,7 @@
 xmlSAX2GetLineNumber(void *ctx)
 {
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+    if ((ctx == NULL) || (ctxt->input == NULL)) return(0);
     return(ctxt->input->line);
 }
 
@@ -147,6 +154,7 @@
 xmlSAX2GetColumnNumber(void *ctx)
 {
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+    if ((ctx == NULL) || (ctxt->input == NULL)) return(0);
     return(ctxt->input->col);
 }
 
@@ -162,6 +170,7 @@
 xmlSAX2IsStandalone(void *ctx)
 {
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+    if ((ctx == NULL) || (ctxt->myDoc == NULL)) return(0);
     return(ctxt->myDoc->standalone == 1);
 }
 
@@ -210,6 +219,7 @@
 {
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlDtdPtr dtd;
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2InternalSubset(%s, %s, %s)\n",
@@ -246,6 +256,7 @@
 	       const xmlChar *ExternalID, const xmlChar *SystemID)
 {
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2ExternalSubset(%s, %s, %s)\n",
@@ -366,6 +377,7 @@
     xmlChar *URI;
     const char *base = NULL;
 
+    if (ctx == NULL) return(NULL);
     if (ctxt->input != NULL)
 	base = ctxt->input->filename;
     if (base == NULL)
@@ -400,6 +412,7 @@
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlEntityPtr ret = NULL;
 
+    if (ctx == NULL) return(NULL);
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2GetEntity(%s)\n", name);
@@ -479,6 +492,7 @@
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlEntityPtr ret;
 
+    if (ctx == NULL) return(NULL);
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2GetParameterEntity(%s)\n", name);
@@ -507,6 +521,7 @@
     xmlEntityPtr ent;
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
 
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2EntityDecl(%s, %d, %s, %s, %s)\n",
@@ -578,6 +593,7 @@
     xmlAttributePtr attr;
     xmlChar *name = NULL, *prefix = NULL;
 
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2AttributeDecl(%s, %s, %d, %d, %s, ...)\n",
@@ -641,6 +657,7 @@
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlElementPtr elem = NULL;
 
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
                     "SAX.xmlSAX2ElementDecl(%s, %d, ...)\n", name, type);
@@ -685,6 +702,7 @@
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlNotationPtr nota = NULL;
 
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2NotationDecl(%s, %s, %s)\n", name, publicId, systemId);
@@ -735,6 +753,7 @@
 {
     xmlEntityPtr ent;
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2UnparsedEntityDecl(%s, %s, %s, %s)\n",
@@ -817,6 +836,8 @@
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlDocPtr doc;
 
+    if (ctx == NULL) return;
+
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2StartDocument()\n");
@@ -876,6 +897,7 @@
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2EndDocument()\n");
 #endif
+    if (ctx == NULL) return;
 #ifdef LIBXML_VALID_ENABLED
     if (ctxt->validate && ctxt->wellFormed &&
         ctxt->myDoc && ctxt->myDoc->intSubset)
@@ -1401,6 +1423,7 @@
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2StartElement(%s)\n", fullname);
 #endif
+    if (ctx == NULL) return;
 
     /*
      * First check on validity:
@@ -1596,6 +1619,7 @@
     xmlParserNodeInfo node_info;
     xmlNodePtr cur = ctxt->node;
 
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     if (name == NULL)
         xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(NULL)\n");
@@ -1990,6 +2014,7 @@
     const xmlChar *uri, *pref;
     int i, j;
 
+    if (ctx == NULL) return;
     /*
      * First check on validity:
      */
@@ -2168,6 +2193,7 @@
     xmlParserNodeInfo node_info;
     xmlNodePtr cur = ctxt->node;
 
+    if (ctx == NULL) return;
     /* Capture end position and add node */
     if ((ctxt->record_info) && (cur != NULL)) {
         node_info.end_pos = ctxt->input->cur - ctxt->input->base;
@@ -2202,6 +2228,7 @@
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlNodePtr ret;
 
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2Reference(%s)\n", name);
@@ -2231,6 +2258,7 @@
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlNodePtr lastChild;
 
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2Characters(%.30s, %d)\n", ch, len);
@@ -2361,6 +2389,7 @@
     xmlNodePtr ret;
     xmlNodePtr parent = ctxt->node;
 
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2ProcessingInstruction(%s, %s)\n", target, data);
@@ -2413,8 +2442,10 @@
 {
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlNodePtr ret;
-    xmlNodePtr parent = ctxt->node;
+    xmlNodePtr parent;
 
+    if (ctx == NULL) return;
+    parent = ctxt->node;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2Comment(%s)\n", value);
 #endif
@@ -2466,6 +2497,7 @@
     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
     xmlNodePtr ret, lastChild;
 
+    if (ctx == NULL) return;
 #ifdef DEBUG_SAX
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.pcdata(%.10s, %d)\n", value, len);
diff --git a/doc/APIchunk10.html b/doc/APIchunk10.html
index a107993..8981369 100644
--- a/doc/APIchunk10.html
+++ b/doc/APIchunk10.html
@@ -48,6 +48,7 @@
 <a href="html/libxml-parserInternals.html#xmlParseReference">xmlParseReference</a><br />
 <a href="html/libxml-parser.html#xmlSAXUserParseFile">xmlSAXUserParseFile</a><br />
 <a href="html/libxml-parser.html#xmlSAXUserParseMemory">xmlSAXUserParseMemory</a><br />
+<a href="html/libxml-tree.html#xmlSaveFileTo">xmlSaveFileTo</a><br />
 <a href="html/libxml-tree.html#xmlSaveFormatFileTo">xmlSaveFormatFileTo</a><br />
 <a href="html/libxml-parserInternals.html#xmlSetEntityReferenceFunc">xmlSetEntityReferenceFunc</a><br />
 <a href="html/libxml-xmlreader.html#xmlTextReaderCurrentDoc">xmlTextReaderCurrentDoc</a><br />
@@ -293,7 +294,6 @@
 <a href="html/libxml-parser.html#xmlReadFd">xmlReadFd</a><br />
 <a href="html/libxml-xmlreader.html#xmlReaderForFd">xmlReaderForFd</a><br />
 <a href="html/libxml-xmlreader.html#xmlReaderNewFd">xmlReaderNewFd</a><br />
-<a href="html/libxml-tree.html#xmlSaveFormatFileTo">xmlSaveFormatFileTo</a><br />
 <a href="html/libxml-xmlwriter.html#xmlTextWriterEndDocument">xmlTextWriterEndDocument</a><br />
 </dd><dt>closes</dt><dd><a href="html/libxml-nanohttp.html#xmlNanoHTTPClose">xmlNanoHTTPClose</a><br />
 <a href="html/libxml-nanohttp.html#xmlNanoHTTPSave">xmlNanoHTTPSave</a><br />
diff --git a/doc/APIchunk16.html b/doc/APIchunk16.html
index 214b8e1..bfea7cf 100644
--- a/doc/APIchunk16.html
+++ b/doc/APIchunk16.html
@@ -188,6 +188,7 @@
 <a href="html/libxml-tree.html#xmlValidateQName">xmlValidateQName</a><br />
 </dd><dt>lib</dt><dd><a href="html/libxml-xmlversion.html#xmlCheckVersion">xmlCheckVersion</a><br />
 </dd><dt>libc</dt><dd><a href="html/libxml-xmlmemory.html#DEBUG_MEMORY">DEBUG_MEMORY</a><br />
+</dd><dt>libraries</dt><dd><a href="html/libxml-relaxng.html#xmlRelaxNGInitTypes">xmlRelaxNGInitTypes</a><br />
 </dd><dt>library</dt><dd><a href="html/libxml-xmlerror.html#_xmlError">_xmlError</a><br />
 <a href="html/libxml-schemasInternals.html#_xmlSchema">_xmlSchema</a><br />
 <a href="html/libxml-parser.html#xmlCleanupParser">xmlCleanupParser</a><br />
diff --git a/doc/APIchunk26.html b/doc/APIchunk26.html
index 1f4f8d7..7f88fd3 100644
--- a/doc/APIchunk26.html
+++ b/doc/APIchunk26.html
@@ -278,6 +278,8 @@
 <a href="html/libxml-tree.html#xmlCopyNamespace">xmlCopyNamespace</a><br />
 <a href="html/libxml-tree.html#xmlCopyNamespaceList">xmlCopyNamespaceList</a><br />
 <a href="html/libxml-tree.html#xmlGetNsList">xmlGetNsList</a><br />
+</dd><dt>xmlOutputBufferClose</dt><dd><a href="html/libxml-tree.html#xmlSaveFileTo">xmlSaveFileTo</a><br />
+<a href="html/libxml-tree.html#xmlSaveFormatFileTo">xmlSaveFormatFileTo</a><br />
 </dd><dt>xmlOutputBufferPtr</dt><dd><a href="html/libxml-xmlwriter.html#xmlNewTextWriter">xmlNewTextWriter</a><br />
 </dd><dt>xmlOutputCloseCallback</dt><dd><a href="html/libxml-xmlIO.html#xmlRegisterOutputCallbacks">xmlRegisterOutputCallbacks</a><br />
 </dd><dt>xmlOutputMatchCallback</dt><dd><a href="html/libxml-xmlIO.html#xmlRegisterOutputCallbacks">xmlRegisterOutputCallbacks</a><br />
diff --git a/doc/APIchunk3.html b/doc/APIchunk3.html
index 5849049..0ac8f21 100644
--- a/doc/APIchunk3.html
+++ b/doc/APIchunk3.html
@@ -308,6 +308,7 @@
 <a href="html/libxml-xpathInternals.html#xmlXPathRoot">xmlXPathRoot</a><br />
 </dd><dt>Initially</dt><dd><a href="html/libxml-parser.html#xmlSubstituteEntitiesDefault">xmlSubstituteEntitiesDefault</a><br />
 </dd><dt>Initiate</dt><dd><a href="html/libxml-nanoftp.html#xmlNanoFTPGetSocket">xmlNanoFTPGetSocket</a><br />
+</dd><dt>Initilize</dt><dd><a href="html/libxml-relaxng.html#xmlRelaxNGInitTypes">xmlRelaxNGInitTypes</a><br />
 </dd><dt>Input</dt><dd><a href="html/libxml-parser.html#_xmlParserCtxt">_xmlParserCtxt</a><br />
 <a href="html/libxml-parser.html#xmlIOParseDTD">xmlIOParseDTD</a><br />
 <a href="html/libxml-xmlIO.html#xmlInputCloseCallback">xmlInputCloseCallback</a><br />
diff --git a/doc/APIchunk4.html b/doc/APIchunk4.html
index 6558fd0..87416e9 100644
--- a/doc/APIchunk4.html
+++ b/doc/APIchunk4.html
@@ -200,7 +200,6 @@
 <a href="html/libxml-parserInternals.html#xmlParseExternalID">xmlParseExternalID</a><br />
 <a href="html/libxml-parserInternals.html#xmlParsePEReference">xmlParsePEReference</a><br />
 <a href="html/libxml-parserInternals.html#xmlParserHandlePEReference">xmlParserHandlePEReference</a><br />
-<a href="html/libxml-tree.html#xmlSaveFormatFileTo">xmlSaveFormatFileTo</a><br />
 <a href="html/libxml-xmlreader.html#xmlTextReaderCurrentDoc">xmlTextReaderCurrentDoc</a><br />
 </dd><dt>NRK</dt><dd><a href="html/libxml-HTMLparser.html#_htmlElemDesc">_htmlElemDesc</a><br />
 </dd><dt>NSDef</dt><dd><a href="html/libxml-parserInternals.html#xmlNamespaceParseNSDef">xmlNamespaceParseNSDef</a><br />
diff --git a/doc/APIchunk8.html b/doc/APIchunk8.html
index f13f591..4287db3 100644
--- a/doc/APIchunk8.html
+++ b/doc/APIchunk8.html
@@ -85,6 +85,8 @@
 </dd><dt>WWW-Authenticate</dt><dd><a href="html/libxml-nanohttp.html#xmlNanoHTTPAuthHeader">xmlNanoHTTPAuthHeader</a><br />
 </dd><dt>Walk</dt><dd><a href="html/libxml-list.html#xmlListReverseWalk">xmlListReverseWalk</a><br />
 <a href="html/libxml-list.html#xmlListWalk">xmlListWalk</a><br />
+</dd><dt>Warning</dt><dd><a href="html/libxml-tree.html#xmlSaveFileTo">xmlSaveFileTo</a><br />
+<a href="html/libxml-tree.html#xmlSaveFormatFileTo">xmlSaveFormatFileTo</a><br />
 </dd><dt>Was</dt><dd><a href="html/libxml-parser.html#_xmlParserInput">_xmlParserInput</a><br />
 </dd><dt>Well</dt><dd><a href="html/libxml-parser.html#xmlParseBalancedChunkMemory">xmlParseBalancedChunkMemory</a><br />
 <a href="html/libxml-parser.html#xmlParseBalancedChunkMemoryRecover">xmlParseBalancedChunkMemoryRecover</a><br />
@@ -397,6 +399,8 @@
 <a href="html/libxml-nanoftp.html#xmlNanoFTPFreeCtxt">xmlNanoFTPFreeCtxt</a><br />
 <a href="html/libxml-nanoftp.html#xmlNanoFTPGetResponse">xmlNanoFTPGetResponse</a><br />
 <a href="html/libxml-tree.html#xmlReconciliateNs">xmlReconciliateNs</a><br />
+<a href="html/libxml-tree.html#xmlSaveFileTo">xmlSaveFileTo</a><br />
+<a href="html/libxml-tree.html#xmlSaveFormatFileTo">xmlSaveFormatFileTo</a><br />
 <a href="html/libxml-valid.html#xmlValidGetValidElements">xmlValidGetValidElements</a><br />
 <a href="html/libxml-xpathInternals.html#xmlXPathNextFollowing">xmlXPathNextFollowing</a><br />
 <a href="html/libxml-xpathInternals.html#xmlXPathStringFunction">xmlXPathStringFunction</a><br />
diff --git a/doc/APIchunk9.html b/doc/APIchunk9.html
index 1a0c75b..2ba5141 100644
--- a/doc/APIchunk9.html
+++ b/doc/APIchunk9.html
@@ -187,6 +187,8 @@
 </dd><dt>breaks</dt><dd><a href="html/libxml-parserInternals.html#xmlCurrentChar">xmlCurrentChar</a><br />
 </dd><dt>broken</dt><dd><a href="html/libxml-parser.html#xmlParseBalancedChunkMemoryRecover">xmlParseBalancedChunkMemoryRecover</a><br />
 <a href="html/libxml-xmlreader.html#xmlTextReaderNormalization">xmlTextReaderNormalization</a><br />
+</dd><dt>buf</dt><dd><a href="html/libxml-tree.html#xmlSaveFileTo">xmlSaveFileTo</a><br />
+<a href="html/libxml-tree.html#xmlSaveFormatFileTo">xmlSaveFormatFileTo</a><br />
 </dd><dt>buffered</dt><dd><a href="html/libxml-xmlIO.html#xmlAllocOutputBuffer">xmlAllocOutputBuffer</a><br />
 <a href="html/libxml-xmlIO.html#xmlAllocParserInputBuffer">xmlAllocParserInputBuffer</a><br />
 <a href="html/libxml-xmlIO.html#xmlFreeParserInputBuffer">xmlFreeParserInputBuffer</a><br />
diff --git a/doc/APIfiles.html b/doc/APIfiles.html
index e6ac90c..ee07bd4 100644
--- a/doc/APIfiles.html
+++ b/doc/APIfiles.html
@@ -910,6 +910,7 @@
 <a href="html/libxml-relaxng.html#xmlRelaxNGFreeValidCtxt">xmlRelaxNGFreeValidCtxt</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGGetParserErrors">xmlRelaxNGGetParserErrors</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGGetValidErrors">xmlRelaxNGGetValidErrors</a><br />
+<a href="html/libxml-relaxng.html#xmlRelaxNGInitTypes">xmlRelaxNGInitTypes</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGNewDocParserCtxt">xmlRelaxNGNewDocParserCtxt</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGNewMemParserCtxt">xmlRelaxNGNewMemParserCtxt</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGNewParserCtxt">xmlRelaxNGNewParserCtxt</a><br />
@@ -1858,6 +1859,7 @@
 <a href="html/libxml-xmlerror.html#XML_FROM_SCHEMASV">XML_FROM_SCHEMASV</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_TREE">XML_FROM_TREE</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_VALID">XML_FROM_VALID</a><br />
+<a href="html/libxml-xmlerror.html#XML_FROM_WRITER">XML_FROM_WRITER</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_XINCLUDE">XML_FROM_XINCLUDE</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_XPATH">XML_FROM_XPATH</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_XPOINTER">XML_FROM_XPOINTER</a><br />
diff --git a/doc/APIsymbols.html b/doc/APIsymbols.html
index aff50ba..bed8441 100644
--- a/doc/APIsymbols.html
+++ b/doc/APIsymbols.html
@@ -415,6 +415,7 @@
 <a href="html/libxml-xmlerror.html#XML_FROM_SCHEMASV">XML_FROM_SCHEMASV</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_TREE">XML_FROM_TREE</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_VALID">XML_FROM_VALID</a><br />
+<a href="html/libxml-xmlerror.html#XML_FROM_WRITER">XML_FROM_WRITER</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_XINCLUDE">XML_FROM_XINCLUDE</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_XPATH">XML_FROM_XPATH</a><br />
 <a href="html/libxml-xmlerror.html#XML_FROM_XPOINTER">XML_FROM_XPOINTER</a><br />
@@ -2367,6 +2368,7 @@
 <a href="html/libxml-relaxng.html#xmlRelaxNGFreeValidCtxt">xmlRelaxNGFreeValidCtxt</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGGetParserErrors">xmlRelaxNGGetParserErrors</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGGetValidErrors">xmlRelaxNGGetValidErrors</a><br />
+<a href="html/libxml-relaxng.html#xmlRelaxNGInitTypes">xmlRelaxNGInitTypes</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGNewDocParserCtxt">xmlRelaxNGNewDocParserCtxt</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGNewMemParserCtxt">xmlRelaxNGNewMemParserCtxt</a><br />
 <a href="html/libxml-relaxng.html#xmlRelaxNGNewParserCtxt">xmlRelaxNGNewParserCtxt</a><br />
diff --git a/doc/html/libxml-list.html b/doc/html/libxml-list.html
index 627047d..004a7a7 100644
--- a/doc/html/libxml-list.html
+++ b/doc/html/libxml-list.html
@@ -78,7 +78,7 @@
 </pre><p>Duplicate the list</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>old</tt></i>:</span></td><td>the list</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>a new copy of the list or NULL in case of error</td></tr></tbody></table></div><h3><a name="xmlListEmpty" id="xmlListEmpty"></a>Function: xmlListEmpty</h3><pre class="programlisting">int	xmlListEmpty			(<a href="libxml-list.html#xmlListPtr">xmlListPtr</a> l)<br />
 </pre><p>Is the list empty ?</p>
-<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>l</tt></i>:</span></td><td>a list</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>1 if the list is empty, 0 otherwise</td></tr></tbody></table></div><h3><a name="xmlListEnd" id="xmlListEnd"></a>Function: xmlListEnd</h3><pre class="programlisting"><a href="libxml-list.html#xmlLinkPtr">xmlLinkPtr</a>	xmlListEnd		(<a href="libxml-list.html#xmlListPtr">xmlListPtr</a> l)<br />
+<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>l</tt></i>:</span></td><td>a list</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>1 if the list is empty, 0 if not empty and -1 in case of error</td></tr></tbody></table></div><h3><a name="xmlListEnd" id="xmlListEnd"></a>Function: xmlListEnd</h3><pre class="programlisting"><a href="libxml-list.html#xmlLinkPtr">xmlLinkPtr</a>	xmlListEnd		(<a href="libxml-list.html#xmlListPtr">xmlListPtr</a> l)<br />
 </pre><p>Get the last element in the list</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>l</tt></i>:</span></td><td>a list</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the last element in the list, or NULL</td></tr></tbody></table></div><h3><a name="xmlListFront" id="xmlListFront"></a>Function: xmlListFront</h3><pre class="programlisting"><a href="libxml-list.html#xmlLinkPtr">xmlLinkPtr</a>	xmlListFront		(<a href="libxml-list.html#xmlListPtr">xmlListPtr</a> l)<br />
 </pre><p>Get the first element in the list</p>
@@ -110,7 +110,7 @@
 </pre><p>Search the list for an existing value of @data</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>l</tt></i>:</span></td><td>a list</td></tr><tr><td><span class="term"><i><tt>data</tt></i>:</span></td><td>a search value</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the value associated to @data or NULL in case of error</td></tr></tbody></table></div><h3><a name="xmlListSize" id="xmlListSize"></a>Function: xmlListSize</h3><pre class="programlisting">int	xmlListSize			(<a href="libxml-list.html#xmlListPtr">xmlListPtr</a> l)<br />
 </pre><p>Get the number of elements in the list</p>
-<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>l</tt></i>:</span></td><td>a list</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of elements in the list</td></tr></tbody></table></div><h3><a name="xmlListSort" id="xmlListSort"></a>Function: xmlListSort</h3><pre class="programlisting">void	xmlListSort			(<a href="libxml-list.html#xmlListPtr">xmlListPtr</a> l)<br />
+<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>l</tt></i>:</span></td><td>a list</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of elements in the list or -1 in case of error</td></tr></tbody></table></div><h3><a name="xmlListSort" id="xmlListSort"></a>Function: xmlListSort</h3><pre class="programlisting">void	xmlListSort			(<a href="libxml-list.html#xmlListPtr">xmlListPtr</a> l)<br />
 </pre><p>Sort all the elements in the list</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>l</tt></i>:</span></td><td>a list</td></tr></tbody></table></div><h3><a name="xmlListWalk" id="xmlListWalk"></a>Function: xmlListWalk</h3><pre class="programlisting">void	xmlListWalk			(<a href="libxml-list.html#xmlListPtr">xmlListPtr</a> l, <br />					 <a href="libxml-list.html#xmlListWalker">xmlListWalker</a> walker, <br />					 const void * user)<br />
 </pre><p>Walk all the element of the first from first to last and apply the walker function to it</p>
diff --git a/doc/html/libxml-nanoftp.html b/doc/html/libxml-nanoftp.html
index 9fc521b..7c71162 100644
--- a/doc/html/libxml-nanoftp.html
+++ b/doc/html/libxml-nanoftp.html
@@ -22,15 +22,15 @@
 <pre class="programlisting">int	<a href="#xmlNanoFTPCloseConnection">xmlNanoFTPCloseConnection</a>	(void * ctx)</pre>
 <pre class="programlisting">int	<a href="#xmlNanoFTPConnect">xmlNanoFTPConnect</a>		(void * ctx)</pre>
 <pre class="programlisting">void *	<a href="#xmlNanoFTPConnectTo">xmlNanoFTPConnectTo</a>		(const char * server, <br />					 int port)</pre>
-<pre class="programlisting">int	<a href="#xmlNanoFTPCwd">xmlNanoFTPCwd</a>			(void * ctx, <br />					 char * directory)</pre>
-<pre class="programlisting">int	<a href="#xmlNanoFTPDele">xmlNanoFTPDele</a>			(void * ctx, <br />					 char * file)</pre>
+<pre class="programlisting">int	<a href="#xmlNanoFTPCwd">xmlNanoFTPCwd</a>			(void * ctx, <br />					 const char * directory)</pre>
+<pre class="programlisting">int	<a href="#xmlNanoFTPDele">xmlNanoFTPDele</a>			(void * ctx, <br />					 const char * file)</pre>
 <pre class="programlisting">void	<a href="#xmlNanoFTPFreeCtxt">xmlNanoFTPFreeCtxt</a>		(void * ctx)</pre>
 <pre class="programlisting">int	<a href="#xmlNanoFTPGet">xmlNanoFTPGet</a>			(void * ctx, <br />					 <a href="libxml-nanoftp.html#ftpDataCallback">ftpDataCallback</a> callback, <br />					 void * userData, <br />					 const char * filename)</pre>
 <pre class="programlisting">int	<a href="#xmlNanoFTPGetConnection">xmlNanoFTPGetConnection</a>		(void * ctx)</pre>
 <pre class="programlisting">int	<a href="#xmlNanoFTPGetResponse">xmlNanoFTPGetResponse</a>		(void * ctx)</pre>
 <pre class="programlisting">int	<a href="#xmlNanoFTPGetSocket">xmlNanoFTPGetSocket</a>		(void * ctx, <br />					 const char * filename)</pre>
 <pre class="programlisting">void	<a href="#xmlNanoFTPInit">xmlNanoFTPInit</a>			(void)</pre>
-<pre class="programlisting">int	<a href="#xmlNanoFTPList">xmlNanoFTPList</a>			(void * ctx, <br />					 <a href="libxml-nanoftp.html#ftpListCallback">ftpListCallback</a> callback, <br />					 void * userData, <br />					 char * filename)</pre>
+<pre class="programlisting">int	<a href="#xmlNanoFTPList">xmlNanoFTPList</a>			(void * ctx, <br />					 <a href="libxml-nanoftp.html#ftpListCallback">ftpListCallback</a> callback, <br />					 void * userData, <br />					 const char * filename)</pre>
 <pre class="programlisting">void *	<a href="#xmlNanoFTPNewCtxt">xmlNanoFTPNewCtxt</a>		(const char * URL)</pre>
 <pre class="programlisting">void *	<a href="#xmlNanoFTPOpen">xmlNanoFTPOpen</a>			(const char * URL)</pre>
 <pre class="programlisting">void	<a href="#xmlNanoFTPProxy">xmlNanoFTPProxy</a>			(const char * host, <br />					 int port, <br />					 const char * user, <br />					 const char * passwd, <br />					 int type)</pre>
@@ -57,9 +57,9 @@
 </pre><p>Tries to open a control connection</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>ctx</tt></i>:</span></td><td>an FTP context</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>-1 in case of error, 0 otherwise</td></tr></tbody></table></div><h3><a name="xmlNanoFTPConnectTo" id="xmlNanoFTPConnectTo"></a>Function: xmlNanoFTPConnectTo</h3><pre class="programlisting">void *	xmlNanoFTPConnectTo		(const char * server, <br />					 int port)<br />
 </pre><p>Tries to open a control connection to the given server/port</p>
-<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>server</tt></i>:</span></td><td>an FTP server name</td></tr><tr><td><span class="term"><i><tt>port</tt></i>:</span></td><td>the port (use 21 if 0)</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>an fTP context or NULL if it failed</td></tr></tbody></table></div><h3><a name="xmlNanoFTPCwd" id="xmlNanoFTPCwd"></a>Function: xmlNanoFTPCwd</h3><pre class="programlisting">int	xmlNanoFTPCwd			(void * ctx, <br />					 char * directory)<br />
+<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>server</tt></i>:</span></td><td>an FTP server name</td></tr><tr><td><span class="term"><i><tt>port</tt></i>:</span></td><td>the port (use 21 if 0)</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>an fTP context or NULL if it failed</td></tr></tbody></table></div><h3><a name="xmlNanoFTPCwd" id="xmlNanoFTPCwd"></a>Function: xmlNanoFTPCwd</h3><pre class="programlisting">int	xmlNanoFTPCwd			(void * ctx, <br />					 const char * directory)<br />
 </pre><p>Tries to change the remote directory</p>
-<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>ctx</tt></i>:</span></td><td>an FTP context</td></tr><tr><td><span class="term"><i><tt>directory</tt></i>:</span></td><td>a directory on the server</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>-1 incase of error, 1 if CWD worked, 0 if it failed</td></tr></tbody></table></div><h3><a name="xmlNanoFTPDele" id="xmlNanoFTPDele"></a>Function: xmlNanoFTPDele</h3><pre class="programlisting">int	xmlNanoFTPDele			(void * ctx, <br />					 char * file)<br />
+<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>ctx</tt></i>:</span></td><td>an FTP context</td></tr><tr><td><span class="term"><i><tt>directory</tt></i>:</span></td><td>a directory on the server</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>-1 incase of error, 1 if CWD worked, 0 if it failed</td></tr></tbody></table></div><h3><a name="xmlNanoFTPDele" id="xmlNanoFTPDele"></a>Function: xmlNanoFTPDele</h3><pre class="programlisting">int	xmlNanoFTPDele			(void * ctx, <br />					 const char * file)<br />
 </pre><p>Tries to delete an item (file or directory) from server</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>ctx</tt></i>:</span></td><td>an FTP context</td></tr><tr><td><span class="term"><i><tt>file</tt></i>:</span></td><td>a file or directory on the server</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>-1 incase of error, 1 if DELE worked, 0 if it failed</td></tr></tbody></table></div><h3><a name="xmlNanoFTPFreeCtxt" id="xmlNanoFTPFreeCtxt"></a>Function: xmlNanoFTPFreeCtxt</h3><pre class="programlisting">void	xmlNanoFTPFreeCtxt		(void * ctx)<br />
 </pre><p>Frees the context after closing the connection.</p>
@@ -73,7 +73,7 @@
 </pre><p>Initiate fetch of the given file from the server.</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>ctx</tt></i>:</span></td><td>an FTP context</td></tr><tr><td><span class="term"><i><tt>filename</tt></i>:</span></td><td>the file to retrieve (or NULL if path is in context).</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the socket for the data connection, or &lt;0 in case of error</td></tr></tbody></table></div><h3><a name="xmlNanoFTPInit" id="xmlNanoFTPInit"></a>Function: xmlNanoFTPInit</h3><pre class="programlisting">void	xmlNanoFTPInit			(void)<br />
 </pre><p>Initialize the FTP protocol layer. Currently it just checks for proxy informations, and get the hostname</p>
-<h3><a name="xmlNanoFTPList" id="xmlNanoFTPList"></a>Function: xmlNanoFTPList</h3><pre class="programlisting">int	xmlNanoFTPList			(void * ctx, <br />					 <a href="libxml-nanoftp.html#ftpListCallback">ftpListCallback</a> callback, <br />					 void * userData, <br />					 char * filename)<br />
+<h3><a name="xmlNanoFTPList" id="xmlNanoFTPList"></a>Function: xmlNanoFTPList</h3><pre class="programlisting">int	xmlNanoFTPList			(void * ctx, <br />					 <a href="libxml-nanoftp.html#ftpListCallback">ftpListCallback</a> callback, <br />					 void * userData, <br />					 const char * filename)<br />
 </pre><p>Do a listing on the server. All files info are passed back in the callbacks.</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>ctx</tt></i>:</span></td><td>an FTP context</td></tr><tr><td><span class="term"><i><tt>callback</tt></i>:</span></td><td>the user callback</td></tr><tr><td><span class="term"><i><tt>userData</tt></i>:</span></td><td>the user callback data</td></tr><tr><td><span class="term"><i><tt>filename</tt></i>:</span></td><td>optional files to list</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>-1 incase of error, 0 otherwise</td></tr></tbody></table></div><h3><a name="xmlNanoFTPNewCtxt" id="xmlNanoFTPNewCtxt"></a>Function: xmlNanoFTPNewCtxt</h3><pre class="programlisting">void *	xmlNanoFTPNewCtxt		(const char * URL)<br />
 </pre><p>Allocate and initialize a new FTP context.</p>
diff --git a/doc/html/libxml-relaxng.html b/doc/html/libxml-relaxng.html
index 6e20a12..d611ce1 100644
--- a/doc/html/libxml-relaxng.html
+++ b/doc/html/libxml-relaxng.html
@@ -29,6 +29,7 @@
 <pre class="programlisting">void	<a href="#xmlRelaxNGFreeValidCtxt">xmlRelaxNGFreeValidCtxt</a>		(<a href="libxml-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt)</pre>
 <pre class="programlisting">int	<a href="#xmlRelaxNGGetParserErrors">xmlRelaxNGGetParserErrors</a>	(<a href="libxml-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a> ctxt, <br />					 <a href="libxml-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> * err, <br />					 <a href="libxml-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> * warn, <br />					 void ** ctx)</pre>
 <pre class="programlisting">int	<a href="#xmlRelaxNGGetValidErrors">xmlRelaxNGGetValidErrors</a>	(<a href="libxml-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br />					 <a href="libxml-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> * err, <br />					 <a href="libxml-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> * warn, <br />					 void ** ctx)</pre>
+<pre class="programlisting">int	<a href="#xmlRelaxNGInitTypes">xmlRelaxNGInitTypes</a>		(void)</pre>
 <pre class="programlisting"><a href="libxml-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	<a href="#xmlRelaxNGNewDocParserCtxt">xmlRelaxNGNewDocParserCtxt</a>	(<a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> doc)</pre>
 <pre class="programlisting"><a href="libxml-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	<a href="#xmlRelaxNGNewMemParserCtxt">xmlRelaxNGNewMemParserCtxt</a>	(const char * buffer, <br />							 int size)</pre>
 <pre class="programlisting"><a href="libxml-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	<a href="#xmlRelaxNGNewParserCtxt">xmlRelaxNGNewParserCtxt</a>	(const char * URL)</pre>
@@ -118,7 +119,9 @@
 </pre><p>Get the callback information used to handle errors for a validation context</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>ctxt</tt></i>:</span></td><td>a Relax-NG validation context</td></tr><tr><td><span class="term"><i><tt>err</tt></i>:</span></td><td>the error callback result</td></tr><tr><td><span class="term"><i><tt>warn</tt></i>:</span></td><td>the warning callback result</td></tr><tr><td><span class="term"><i><tt>ctx</tt></i>:</span></td><td>contextual data for the callbacks result</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>-1 in case of failure, 0 otherwise.</td></tr></tbody></table></div><h3><a name="xmlRelaxNGGetValidErrors" id="xmlRelaxNGGetValidErrors"></a>Function: xmlRelaxNGGetValidErrors</h3><pre class="programlisting">int	xmlRelaxNGGetValidErrors	(<a href="libxml-relaxng.html#xmlRelaxNGValidCtxtPtr">xmlRelaxNGValidCtxtPtr</a> ctxt, <br />					 <a href="libxml-relaxng.html#xmlRelaxNGValidityErrorFunc">xmlRelaxNGValidityErrorFunc</a> * err, <br />					 <a href="libxml-relaxng.html#xmlRelaxNGValidityWarningFunc">xmlRelaxNGValidityWarningFunc</a> * warn, <br />					 void ** ctx)<br />
 </pre><p>Get the error and warning callback informations</p>
-<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>ctxt</tt></i>:</span></td><td>a Relax-NG validation context</td></tr><tr><td><span class="term"><i><tt>err</tt></i>:</span></td><td>the error function result</td></tr><tr><td><span class="term"><i><tt>warn</tt></i>:</span></td><td>the warning function result</td></tr><tr><td><span class="term"><i><tt>ctx</tt></i>:</span></td><td>the functions context result</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>-1 in case of error and 0 otherwise</td></tr></tbody></table></div><h3><a name="xmlRelaxNGNewDocParserCtxt" id="xmlRelaxNGNewDocParserCtxt"></a>Function: xmlRelaxNGNewDocParserCtxt</h3><pre class="programlisting"><a href="libxml-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	xmlRelaxNGNewDocParserCtxt	(<a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br />
+<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>ctxt</tt></i>:</span></td><td>a Relax-NG validation context</td></tr><tr><td><span class="term"><i><tt>err</tt></i>:</span></td><td>the error function result</td></tr><tr><td><span class="term"><i><tt>warn</tt></i>:</span></td><td>the warning function result</td></tr><tr><td><span class="term"><i><tt>ctx</tt></i>:</span></td><td>the functions context result</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>-1 in case of error and 0 otherwise</td></tr></tbody></table></div><h3><a name="xmlRelaxNGInitTypes" id="xmlRelaxNGInitTypes"></a>Function: xmlRelaxNGInitTypes</h3><pre class="programlisting">int	xmlRelaxNGInitTypes		(void)<br />
+</pre><p>Initilize the default type libraries.</p>
+<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>0 in case of success and -1 in case of error.</td></tr></tbody></table></div><h3><a name="xmlRelaxNGNewDocParserCtxt" id="xmlRelaxNGNewDocParserCtxt"></a>Function: xmlRelaxNGNewDocParserCtxt</h3><pre class="programlisting"><a href="libxml-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	xmlRelaxNGNewDocParserCtxt	(<a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> doc)<br />
 </pre><p>Create an XML RelaxNGs parser context for that document. Note: since the process of compiling a RelaxNG schemas modifies the document, the @doc parameter is duplicated internally.</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>doc</tt></i>:</span></td><td>a preparsed document tree</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the parser context or NULL in case of error</td></tr></tbody></table></div><h3><a name="xmlRelaxNGNewMemParserCtxt" id="xmlRelaxNGNewMemParserCtxt"></a>Function: xmlRelaxNGNewMemParserCtxt</h3><pre class="programlisting"><a href="libxml-relaxng.html#xmlRelaxNGParserCtxtPtr">xmlRelaxNGParserCtxtPtr</a>	xmlRelaxNGNewMemParserCtxt	(const char * buffer, <br />							 int size)<br />
 </pre><p>Create an XML RelaxNGs parse context for that memory buffer expected to contain an XML RelaxNGs file.</p>
diff --git a/doc/html/libxml-tree.html b/doc/html/libxml-tree.html
index 99c4bd9..f5d4241 100644
--- a/doc/html/libxml-tree.html
+++ b/doc/html/libxml-tree.html
@@ -833,13 +833,13 @@
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>filename</tt></i>:</span></td><td>the filename (or URL)</td></tr><tr><td><span class="term"><i><tt>cur</tt></i>:</span></td><td>the document</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of bytes written or -1 in case of failure.</td></tr></tbody></table></div><h3><a name="xmlSaveFileEnc" id="xmlSaveFileEnc"></a>Function: xmlSaveFileEnc</h3><pre class="programlisting">int	xmlSaveFileEnc			(const char * filename, <br />					 <a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br />					 const char * encoding)<br />
 </pre><p>Dump an XML document, converting it to the given encoding</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>filename</tt></i>:</span></td><td>the filename (or URL)</td></tr><tr><td><span class="term"><i><tt>cur</tt></i>:</span></td><td>the document</td></tr><tr><td><span class="term"><i><tt>encoding</tt></i>:</span></td><td>the name of an encoding (or NULL)</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of bytes written or -1 in case of failure.</td></tr></tbody></table></div><h3><a name="xmlSaveFileTo" id="xmlSaveFileTo"></a>Function: xmlSaveFileTo</h3><pre class="programlisting">int	xmlSaveFileTo			(<a href="libxml-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br />					 <a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br />					 const char * encoding)<br />
-</pre><p>Dump an XML document to an I/O buffer.</p>
+</pre><p>Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>buf</tt></i>:</span></td><td>an output I/O buffer</td></tr><tr><td><span class="term"><i><tt>cur</tt></i>:</span></td><td>the document</td></tr><tr><td><span class="term"><i><tt>encoding</tt></i>:</span></td><td>the encoding if any assuming the I/O layer handles the trancoding</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of bytes written or -1 in case of failure.</td></tr></tbody></table></div><h3><a name="xmlSaveFormatFile" id="xmlSaveFormatFile"></a>Function: xmlSaveFormatFile</h3><pre class="programlisting">int	xmlSaveFormatFile		(const char * filename, <br />					 <a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br />					 int format)<br />
 </pre><p>Dump an XML document to a file. Will use compression if compiled in and enabled. If @filename is "-" the stdout file is used. If @format is set then the document will be indented on output. Note that @format = 1 provide node indenting only if <a href="libxml-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>filename</tt></i>:</span></td><td>the filename (or URL)</td></tr><tr><td><span class="term"><i><tt>cur</tt></i>:</span></td><td>the document</td></tr><tr><td><span class="term"><i><tt>format</tt></i>:</span></td><td>should formatting spaces been added</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of bytes written or -1 in case of failure.</td></tr></tbody></table></div><h3><a name="xmlSaveFormatFileEnc" id="xmlSaveFormatFileEnc"></a>Function: xmlSaveFormatFileEnc</h3><pre class="programlisting">int	xmlSaveFormatFileEnc		(const char * filename, <br />					 <a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br />					 const char * encoding, <br />					 int format)<br />
 </pre><p>Dump an XML document to a file or an URL.</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>filename</tt></i>:</span></td><td>the filename or URL to output</td></tr><tr><td><span class="term"><i><tt>cur</tt></i>:</span></td><td>the document being saved</td></tr><tr><td><span class="term"><i><tt>encoding</tt></i>:</span></td><td>the name of the encoding to use or NULL.</td></tr><tr><td><span class="term"><i><tt>format</tt></i>:</span></td><td>should formatting spaces be added.</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of bytes written or -1 in case of error. Note that @format = 1 provide node indenting only if <a href="libxml-globals.html#xmlIndentTreeOutput">xmlIndentTreeOutput</a> = 1 or xmlKeepBlanksDefault(0) was called</td></tr></tbody></table></div><h3><a name="xmlSaveFormatFileTo" id="xmlSaveFormatFileTo"></a>Function: xmlSaveFormatFileTo</h3><pre class="programlisting">int	xmlSaveFormatFileTo		(<a href="libxml-tree.html#xmlOutputBufferPtr">xmlOutputBufferPtr</a> buf, <br />					 <a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> cur, <br />					 const char * encoding, <br />					 int format)<br />
-</pre><p>Dump an XML document to an I/O buffer. NOTE: the I/O buffer is closed as part of the call.</p>
+</pre><p>Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>buf</tt></i>:</span></td><td>an output I/O buffer</td></tr><tr><td><span class="term"><i><tt>cur</tt></i>:</span></td><td>the document</td></tr><tr><td><span class="term"><i><tt>encoding</tt></i>:</span></td><td>the encoding if any assuming the I/O layer handles the trancoding</td></tr><tr><td><span class="term"><i><tt>format</tt></i>:</span></td><td>should formatting spaces been added</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of bytes written or -1 in case of failure.</td></tr></tbody></table></div><h3><a name="xmlSearchNs" id="xmlSearchNs"></a>Function: xmlSearchNs</h3><pre class="programlisting"><a href="libxml-tree.html#xmlNsPtr">xmlNsPtr</a>	xmlSearchNs		(<a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br />					 <a href="libxml-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br />					 const <a href="libxml-xmlstring.html#xmlChar">xmlChar</a> * nameSpace)<br />
 </pre><p>Search a Ns registered under a given name space for a document. recurse on the parents until it finds the defined namespace or return NULL otherwise. @nameSpace can be NULL, this is a search for the default namespace. We don't allow to cross entities boundaries. If you don't declare the namespace within those you will be in troubles !!! A warning is generated to cover this case.</p>
 <div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>doc</tt></i>:</span></td><td>the document</td></tr><tr><td><span class="term"><i><tt>node</tt></i>:</span></td><td>the current node</td></tr><tr><td><span class="term"><i><tt>nameSpace</tt></i>:</span></td><td>the namespace prefix</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the namespace pointer or NULL.</td></tr></tbody></table></div><h3><a name="xmlSearchNsByHref" id="xmlSearchNsByHref"></a>Function: xmlSearchNsByHref</h3><pre class="programlisting"><a href="libxml-tree.html#xmlNsPtr">xmlNsPtr</a>	xmlSearchNsByHref	(<a href="libxml-tree.html#xmlDocPtr">xmlDocPtr</a> doc, <br />					 <a href="libxml-tree.html#xmlNodePtr">xmlNodePtr</a> node, <br />					 const <a href="libxml-xmlstring.html#xmlChar">xmlChar</a> * href)<br />
diff --git a/doc/html/libxml-xmlerror.html b/doc/html/libxml-xmlerror.html
index 93aaa79..a0bfb49 100644
--- a/doc/html/libxml-xmlerror.html
+++ b/doc/html/libxml-xmlerror.html
@@ -77,6 +77,7 @@
     <a name="XML_FROM_XSLT" id="XML_FROM_XSLT">XML_FROM_XSLT</a> = 22 : The XSLT engine from libxslt
     <a name="XML_FROM_VALID" id="XML_FROM_VALID">XML_FROM_VALID</a> = 23 : The XML DTD validation with valid context
     <a name="XML_FROM_CHECK" id="XML_FROM_CHECK">XML_FROM_CHECK</a> = 24 : The error checking module
+    <a name="XML_FROM_WRITER" id="XML_FROM_WRITER">XML_FROM_WRITER</a> = 25 : The xmlwriter module
 }
 </pre><h3>Enum <a name="xmlErrorLevel" id="xmlErrorLevel">xmlErrorLevel</a></h3><pre class="programlisting">Enum xmlErrorLevel {
     <a name="XML_ERR_NONE" id="XML_ERR_NONE">XML_ERR_NONE</a> = 0
diff --git a/doc/libxml2-api.xml b/doc/libxml2-api.xml
index e65e13d..daae1d2 100644
--- a/doc/libxml2-api.xml
+++ b/doc/libxml2-api.xml
@@ -1023,6 +1023,7 @@
      <exports symbol='xmlRelaxNGGetValidErrors' type='function'/>
      <exports symbol='xmlRelaxNGNewMemParserCtxt' type='function'/>
      <exports symbol='xmlRelaxNGDump' type='function'/>
+     <exports symbol='xmlRelaxNGInitTypes' type='function'/>
      <exports symbol='xmlRelaxNGValidityErrorFunc' type='function'/>
      <exports symbol='xmlRelaxNGParse' type='function'/>
      <exports symbol='xmlRelaxNGDumpTree' type='function'/>
@@ -1994,6 +1995,7 @@
      <exports symbol='XML_SCHEMAP_INVALID_ATTR_COMBINATION' type='enum'/>
      <exports symbol='XML_RNGP_PARAM_FORBIDDEN' type='enum'/>
      <exports symbol='XML_SCHEMAP_UNKNOWN_PROCESSCONTENT_CHILD' type='enum'/>
+     <exports symbol='XML_FROM_WRITER' type='enum'/>
      <exports symbol='XML_ERR_UNSUPPORTED_ENCODING' type='enum'/>
      <exports symbol='XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME' type='enum'/>
      <exports symbol='XML_ERR_ENTITYREF_IN_PROLOG' type='enum'/>
@@ -4474,7 +4476,7 @@
     <enum name='XML_EXTERNAL_PARAMETER_ENTITY' file='entities' value='5' type='xmlEntityType'/>
     <enum name='XML_FROM_C14N' file='xmlerror' value='21' type='xmlErrorDomain' info='The Canonicalization module'/>
     <enum name='XML_FROM_CATALOG' file='xmlerror' value='20' type='xmlErrorDomain' info='The Catalog module'/>
-    <enum name='XML_FROM_CHECK' file='xmlerror' value='24' type='xmlErrorDomain' info=' The error checking module'/>
+    <enum name='XML_FROM_CHECK' file='xmlerror' value='24' type='xmlErrorDomain' info='The error checking module'/>
     <enum name='XML_FROM_DATATYPE' file='xmlerror' value='15' type='xmlErrorDomain' info='The W3C XML Schemas Datatype module'/>
     <enum name='XML_FROM_DTD' file='xmlerror' value='4' type='xmlErrorDomain' info='The XML DTD validation with parser contex'/>
     <enum name='XML_FROM_FTP' file='xmlerror' value='9' type='xmlErrorDomain' info='The FTP module'/>
@@ -4493,6 +4495,7 @@
     <enum name='XML_FROM_SCHEMASV' file='xmlerror' value='17' type='xmlErrorDomain' info='The W3C XML Schemas validation module'/>
     <enum name='XML_FROM_TREE' file='xmlerror' value='2' type='xmlErrorDomain' info='The tree module'/>
     <enum name='XML_FROM_VALID' file='xmlerror' value='23' type='xmlErrorDomain' info='The XML DTD validation with valid context'/>
+    <enum name='XML_FROM_WRITER' file='xmlerror' value='25' type='xmlErrorDomain' info=' The xmlwriter module'/>
     <enum name='XML_FROM_XINCLUDE' file='xmlerror' value='11' type='xmlErrorDomain' info='The XInclude processing'/>
     <enum name='XML_FROM_XPATH' file='xmlerror' value='12' type='xmlErrorDomain' info='The XPath module'/>
     <enum name='XML_FROM_XPOINTER' file='xmlerror' value='13' type='xmlErrorDomain' info='The XPointer module'/>
@@ -9744,7 +9747,7 @@
     </function>
     <function name='xmlListEmpty' file='list'>
       <info>Is the list empty ?</info>
-      <return type='int' info='1 if the list is empty, 0 otherwise'/>
+      <return type='int' info='1 if the list is empty, 0 if not empty and -1 in case of error'/>
       <arg name='l' type='xmlListPtr' info='a list'/>
     </function>
     <function name='xmlListEnd' file='list'>
@@ -9835,7 +9838,7 @@
     </function>
     <function name='xmlListSize' file='list'>
       <info>Get the number of elements in the list</info>
-      <return type='int' info='the number of elements in the list'/>
+      <return type='int' info='the number of elements in the list or -1 in case of error'/>
       <arg name='l' type='xmlListPtr' info='a list'/>
     </function>
     <function name='xmlListSort' file='list'>
@@ -10057,14 +10060,14 @@
       <info>Tries to change the remote directory</info>
       <return type='int' info='-1 incase of error, 1 if CWD worked, 0 if it failed'/>
       <arg name='ctx' type='void *' info='an FTP context'/>
-      <arg name='directory' type='char *' info='a directory on the server'/>
+      <arg name='directory' type='const char *' info='a directory on the server'/>
     </function>
     <function name='xmlNanoFTPDele' file='nanoftp'>
       <cond>LIBXML_FTP_ENABLED</cond>
       <info>Tries to delete an item (file or directory) from server</info>
       <return type='int' info='-1 incase of error, 1 if DELE worked, 0 if it failed'/>
       <arg name='ctx' type='void *' info='an FTP context'/>
-      <arg name='file' type='char *' info='a file or directory on the server'/>
+      <arg name='file' type='const char *' info='a file or directory on the server'/>
     </function>
     <function name='xmlNanoFTPFreeCtxt' file='nanoftp'>
       <cond>LIBXML_FTP_ENABLED</cond>
@@ -10112,7 +10115,7 @@
       <arg name='ctx' type='void *' info='an FTP context'/>
       <arg name='callback' type='ftpListCallback' info='the user callback'/>
       <arg name='userData' type='void *' info='the user callback data'/>
-      <arg name='filename' type='char *' info='optional files to list'/>
+      <arg name='filename' type='const char *' info='optional files to list'/>
     </function>
     <function name='xmlNanoFTPNewCtxt' file='nanoftp'>
       <cond>LIBXML_FTP_ENABLED</cond>
@@ -11780,6 +11783,11 @@
       <arg name='warn' type='xmlRelaxNGValidityWarningFunc *' info='the warning function result'/>
       <arg name='ctx' type='void **' info='the functions context result'/>
     </function>
+    <function name='xmlRelaxNGInitTypes' file='relaxng'>
+      <cond>LIBXML_SCHEMAS_ENABLED</cond>
+      <info>Initilize the default type libraries.</info>
+      <return type='int' info='0 in case of success and -1 in case of error.'/>
+    </function>
     <function name='xmlRelaxNGNewDocParserCtxt' file='relaxng'>
       <cond>LIBXML_SCHEMAS_ENABLED</cond>
       <info>Create an XML RelaxNGs parser context for that document. Note: since the process of compiling a RelaxNG schemas modifies the document, the @doc parameter is duplicated internally.</info>
@@ -12257,7 +12265,7 @@
     </function>
     <function name='xmlSaveFileTo' file='tree'>
       <cond>LIBXML_OUTPUT_ENABLED</cond>
-      <info>Dump an XML document to an I/O buffer.</info>
+      <info>Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.</info>
       <return type='int' info='the number of bytes written or -1 in case of failure.'/>
       <arg name='buf' type='xmlOutputBufferPtr' info='an output I/O buffer'/>
       <arg name='cur' type='xmlDocPtr' info='the document'/>
@@ -12288,7 +12296,7 @@
     </function>
     <function name='xmlSaveFormatFileTo' file='tree'>
       <cond>LIBXML_OUTPUT_ENABLED</cond>
-      <info>Dump an XML document to an I/O buffer. NOTE: the I/O buffer is closed as part of the call.</info>
+      <info>Dump an XML document to an I/O buffer. Warning ! This call xmlOutputBufferClose() on buf which is not available after this call.</info>
       <return type='int' info='the number of bytes written or -1 in case of failure.'/>
       <arg name='buf' type='xmlOutputBufferPtr' info='an output I/O buffer'/>
       <arg name='cur' type='xmlDocPtr' info='the document'/>
diff --git a/doc/libxml2-refs.xml b/doc/libxml2-refs.xml
index dfa100b..4d0ecfb 100644
--- a/doc/libxml2-refs.xml
+++ b/doc/libxml2-refs.xml
@@ -409,6 +409,7 @@
     <reference name='XML_FROM_SCHEMASV' href='html/libxml-xmlerror.html#XML_FROM_SCHEMASV'/>
     <reference name='XML_FROM_TREE' href='html/libxml-xmlerror.html#XML_FROM_TREE'/>
     <reference name='XML_FROM_VALID' href='html/libxml-xmlerror.html#XML_FROM_VALID'/>
+    <reference name='XML_FROM_WRITER' href='html/libxml-xmlerror.html#XML_FROM_WRITER'/>
     <reference name='XML_FROM_XINCLUDE' href='html/libxml-xmlerror.html#XML_FROM_XINCLUDE'/>
     <reference name='XML_FROM_XPATH' href='html/libxml-xmlerror.html#XML_FROM_XPATH'/>
     <reference name='XML_FROM_XPOINTER' href='html/libxml-xmlerror.html#XML_FROM_XPOINTER'/>
@@ -2361,6 +2362,7 @@
     <reference name='xmlRelaxNGFreeValidCtxt' href='html/libxml-relaxng.html#xmlRelaxNGFreeValidCtxt'/>
     <reference name='xmlRelaxNGGetParserErrors' href='html/libxml-relaxng.html#xmlRelaxNGGetParserErrors'/>
     <reference name='xmlRelaxNGGetValidErrors' href='html/libxml-relaxng.html#xmlRelaxNGGetValidErrors'/>
+    <reference name='xmlRelaxNGInitTypes' href='html/libxml-relaxng.html#xmlRelaxNGInitTypes'/>
     <reference name='xmlRelaxNGNewDocParserCtxt' href='html/libxml-relaxng.html#xmlRelaxNGNewDocParserCtxt'/>
     <reference name='xmlRelaxNGNewMemParserCtxt' href='html/libxml-relaxng.html#xmlRelaxNGNewMemParserCtxt'/>
     <reference name='xmlRelaxNGNewParserCtxt' href='html/libxml-relaxng.html#xmlRelaxNGNewParserCtxt'/>
@@ -3662,6 +3664,7 @@
       <ref name='XML_FROM_SCHEMASV'/>
       <ref name='XML_FROM_TREE'/>
       <ref name='XML_FROM_VALID'/>
+      <ref name='XML_FROM_WRITER'/>
       <ref name='XML_FROM_XINCLUDE'/>
       <ref name='XML_FROM_XPATH'/>
       <ref name='XML_FROM_XPOINTER'/>
@@ -5650,6 +5653,7 @@
       <ref name='xmlRelaxNGFreeValidCtxt'/>
       <ref name='xmlRelaxNGGetParserErrors'/>
       <ref name='xmlRelaxNGGetValidErrors'/>
+      <ref name='xmlRelaxNGInitTypes'/>
       <ref name='xmlRelaxNGNewDocParserCtxt'/>
       <ref name='xmlRelaxNGNewMemParserCtxt'/>
       <ref name='xmlRelaxNGNewParserCtxt'/>
@@ -10658,6 +10662,7 @@
       <ref name='xmlRelaxNGFreeValidCtxt'/>
       <ref name='xmlRelaxNGGetParserErrors'/>
       <ref name='xmlRelaxNGGetValidErrors'/>
+      <ref name='xmlRelaxNGInitTypes'/>
       <ref name='xmlRelaxNGNewDocParserCtxt'/>
       <ref name='xmlRelaxNGNewMemParserCtxt'/>
       <ref name='xmlRelaxNGNewParserCtxt'/>
@@ -11626,6 +11631,7 @@
       <ref name='XML_FROM_SCHEMASV'/>
       <ref name='XML_FROM_TREE'/>
       <ref name='XML_FROM_VALID'/>
+      <ref name='XML_FROM_WRITER'/>
       <ref name='XML_FROM_XINCLUDE'/>
       <ref name='XML_FROM_XPATH'/>
       <ref name='XML_FROM_XPOINTER'/>
@@ -14912,6 +14918,9 @@
         <word name='Initiate'>
           <ref name='xmlNanoFTPGetSocket'/>
         </word>
+        <word name='Initilize'>
+          <ref name='xmlRelaxNGInitTypes'/>
+        </word>
         <word name='Input'>
           <ref name='_xmlParserCtxt'/>
           <ref name='xmlIOParseDTD'/>
@@ -15278,7 +15287,6 @@
           <ref name='xmlParseExternalID'/>
           <ref name='xmlParsePEReference'/>
           <ref name='xmlParserHandlePEReference'/>
-          <ref name='xmlSaveFormatFileTo'/>
           <ref name='xmlTextReaderCurrentDoc'/>
         </word>
         <word name='NRK'>
@@ -16917,6 +16925,10 @@
           <ref name='xmlListReverseWalk'/>
           <ref name='xmlListWalk'/>
         </word>
+        <word name='Warning'>
+          <ref name='xmlSaveFileTo'/>
+          <ref name='xmlSaveFormatFileTo'/>
+        </word>
         <word name='Was'>
           <ref name='_xmlParserInput'/>
         </word>
@@ -17432,6 +17444,8 @@
           <ref name='xmlNanoFTPFreeCtxt'/>
           <ref name='xmlNanoFTPGetResponse'/>
           <ref name='xmlReconciliateNs'/>
+          <ref name='xmlSaveFileTo'/>
+          <ref name='xmlSaveFormatFileTo'/>
           <ref name='xmlValidGetValidElements'/>
           <ref name='xmlXPathNextFollowing'/>
           <ref name='xmlXPathStringFunction'/>
@@ -18127,6 +18141,10 @@
           <ref name='xmlParseBalancedChunkMemoryRecover'/>
           <ref name='xmlTextReaderNormalization'/>
         </word>
+        <word name='buf'>
+          <ref name='xmlSaveFileTo'/>
+          <ref name='xmlSaveFormatFileTo'/>
+        </word>
         <word name='buffered'>
           <ref name='xmlAllocOutputBuffer'/>
           <ref name='xmlAllocParserInputBuffer'/>
@@ -18227,6 +18245,7 @@
           <ref name='xmlParseReference'/>
           <ref name='xmlSAXUserParseFile'/>
           <ref name='xmlSAXUserParseMemory'/>
+          <ref name='xmlSaveFileTo'/>
           <ref name='xmlSaveFormatFileTo'/>
           <ref name='xmlSetEntityReferenceFunc'/>
           <ref name='xmlTextReaderCurrentDoc'/>
@@ -18580,7 +18599,6 @@
           <ref name='xmlReadFd'/>
           <ref name='xmlReaderForFd'/>
           <ref name='xmlReaderNewFd'/>
-          <ref name='xmlSaveFormatFileTo'/>
           <ref name='xmlTextWriterEndDocument'/>
         </word>
         <word name='closes'>
@@ -22499,6 +22517,9 @@
         <word name='libc'>
           <ref name='DEBUG_MEMORY'/>
         </word>
+        <word name='libraries'>
+          <ref name='xmlRelaxNGInitTypes'/>
+        </word>
         <word name='library'>
           <ref name='_xmlError'/>
           <ref name='_xmlSchema'/>
@@ -28343,6 +28364,10 @@
           <ref name='xmlCopyNamespaceList'/>
           <ref name='xmlGetNsList'/>
         </word>
+        <word name='xmlOutputBufferClose'>
+          <ref name='xmlSaveFileTo'/>
+          <ref name='xmlSaveFormatFileTo'/>
+        </word>
         <word name='xmlOutputBufferPtr'>
           <ref name='xmlNewTextWriter'/>
         </word>
diff --git a/elfgcchack.h b/elfgcchack.h
index 3f02445..c72afad 100644
--- a/elfgcchack.h
+++ b/elfgcchack.h
@@ -3483,6 +3483,12 @@
 #endif
 
 #ifdef LIBXML_SCHEMAS_ENABLED
+extern __typeof (xmlRelaxNGInitTypes) xmlRelaxNGInitTypes__internal_alias __attribute((visibility("hidden")));
+extern __typeof (xmlRelaxNGInitTypes) xmlRelaxNGInitTypes __attribute((alias("xmlRelaxNGInitTypes__internal_alias")));
+#define xmlRelaxNGInitTypes xmlRelaxNGInitTypes__internal_alias
+#endif
+
+#ifdef LIBXML_SCHEMAS_ENABLED
 extern __typeof (xmlRelaxNGNewDocParserCtxt) xmlRelaxNGNewDocParserCtxt__internal_alias __attribute((visibility("hidden")));
 extern __typeof (xmlRelaxNGNewDocParserCtxt) xmlRelaxNGNewDocParserCtxt __attribute((alias("xmlRelaxNGNewDocParserCtxt__internal_alias")));
 #define xmlRelaxNGNewDocParserCtxt xmlRelaxNGNewDocParserCtxt__internal_alias
diff --git a/gentest.py b/gentest.py
index 9244a90..a0f435b 100755
--- a/gentest.py
+++ b/gentest.py
@@ -3,6 +3,7 @@
 # generate a tester program for the API
 #
 import sys
+import os
 import string
 try:
     import libxml2
@@ -64,6 +65,12 @@
 #
 # Extra code needed for some test cases
 #
+extra_pre_call = {
+   "xmlSAXUserParseFile":
+       "if (sax == &xmlDefaultSAXHandler) user_data = NULL;",
+   "xmlSAXUserParseMemory":
+       "if (sax == &xmlDefaultSAXHandler) user_data = NULL;",
+}
 extra_post_call = {
    "xmlAddChild": 
        "if (ret_val == NULL) { xmlFreeNode(cur) ; cur = NULL ; }",
@@ -94,7 +101,8 @@
    "xmlXPathConvertNumber": """val = NULL;""",
    "xmlXPathConvertString": """val = NULL;""",
    "xmlSaveFileTo": """buf = NULL;""",
-   "xmlSaveFormatFileTo": """buf = NULL;"""
+   "xmlSaveFormatFileTo": """buf = NULL;""",
+   "xmlIOParseDTD": "input = NULL;",
 }
 
 modules = []
@@ -128,109 +136,13 @@
     except:
         missing_types[name] = [func]
 
-#
-# Open the input API description and the C test program result
-#
-doc = libxml2.readFile('doc/libxml2-api.xml', None, 0)
-if doc == None:
-    print "Failed to load doc/libxml2-api.xml"
-    sys.exit(1)
-test = open('testapi.c', 'w')
-ctxt = doc.xpathNewContext()
-headers = ctxt.xpathEval("/api/files/file")
-
-#
-# Generate the test header
-#
-test.write("""/*
- * testapi.c: libxml2 API tester program.
- *
- * Automatically generated by gentest.py from libxml2-api.xml
- *
- * See Copyright for the status of this software.
- *
- * daniel@veillard.com
- */
-
-#include <stdio.h>
-#include <libxml/xmlerror.h>
-#include <libxml/relaxng.h>
-
-static int testlibxml2(void);
-
-static int generic_errors = 0;
-static int call_tests = 0;
-static int function_tests = 0;
-
-static xmlChar chartab[1024] = "  chartab\\n";
-static int inttab[1024];
-static unsigned long longtab[1024];
-
-static void
-structured_errors(void *userData ATTRIBUTE_UNUSED,
-                  xmlErrorPtr error ATTRIBUTE_UNUSED) {
-    generic_errors++;
-}
-
-int main(void) {
-    int ret;
-    int blocks, mem;
-
-    xmlInitParser();
-#ifdef LIBXML_SCHEMAS_ENABLED
-    xmlRelaxNGInitTypes();
-#endif
-
-    LIBXML_TEST_VERSION
-
-    xmlSetStructuredErrorFunc(NULL, structured_errors);
-
-    ret = testlibxml2();
-
-    xmlCleanupParser();
-    blocks = xmlMemBlocks();
-    mem = xmlMemUsed();
-    if ((blocks != 0) || (mem != 0)) {
-        printf("testapi leaked %d bytes in %d blocks\\n", mem, blocks);
-    }
-    xmlMemoryDump();
-
-    return (ret != 0);
-}
-
-""");
-
-#
-# Load the interfaces
-# 
-for file in headers:
-    name = file.xpathEval('string(@name)')
-    if (name == None) or (name == ''):
-        continue
-
-    #
-    # Some module may be skipped because they don't really consists
-    # of user callable APIs
-    #
-    if is_skipped_module(name):
-        continue
-
-    #
-    # do not test deprecated APIs
-    #
-    desc = file.xpathEval('string(description)')
-    if string.find(desc, 'DEPRECATED') != -1:
-        print "Skipping deprecated interface %s" % name
-	continue;
-
-    test.write("#include <libxml/%s.h>\n" % name)
-    modules.append(name)
-        
-#
-# Generate the callers signatures
-# 
-for module in modules:
-    test.write("static int test_%s(void);\n" % module);
+missing_functions = {}
+def add_missing_functions(name, module):
+    try:
+        list = missing_functions[module]
+	list.append(name)
+    except:
+        missing_functions[module] = [name]
 
 #
 # Provide the type generators and destructors for the parameters
@@ -281,18 +193,12 @@
            (function == 'xmlTextMerge') or \
 	   (function == 'xmlAddPrevSibling' and pos == 2):
 	    return('xmlNodePtr_in');
+    if res == 'const xmlBufferPtr':
+        res = 'xmlBufferPtr';
         
     return res
 
-known_param_types = [ "int", "const_char_ptr", "const_xmlChar_ptr",
-   "xmlParserCtxtPtr", "xmlDocPtr", "filepath", "fileoutput",
-   "xmlNodePtr", "xmlNodePtr_in", "userdata", "xmlChar_ptr",
-   "xmlTextWriterPtr", "xmlTextReaderPtr", "xmlBufferPtr",
-   "xmlListPtr", "xmlXPathObjectPtr", "xmlHashTablePtr", "xmlValidCtxtPtr",
-   "void_ptr", "xmlOutputBufferPtr", "xmlCharEncoding",
-   "unsigned_int", "long", "unsigned_long", "const_void_ptr",
-   "unsigned_long_ptr", "int_ptr", "FILE_ptr", "xmlDictPtr",
-]
+known_param_types = []
 
 def is_known_param_type(name):
     for type in known_param_types:
@@ -300,339 +206,11 @@
 	    return 1
     return 0
 
-test.write("""
-#define gen_nb_void_ptr 2
-
-static void *gen_void_ptr(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-    return(NULL);
-}
-static void des_void_ptr(int no ATTRIBUTE_UNUSED, void *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_const_void_ptr 2
-
-static const void *gen_const_void_ptr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return((const void *) "immutable string");
-    return(NULL);
-}
-static void des_const_void_ptr(int no ATTRIBUTE_UNUSED, const void *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_userdata 3
-
-static void *gen_userdata(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return((void *) &call_tests);
-    if (no == 1) return((void *) -1);
-    return(NULL);
-}
-static void des_userdata(int no ATTRIBUTE_UNUSED, void *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-
-#define gen_nb_int 4
-
-static int gen_int(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(0);
-    if (no == 1) return(1);
-    if (no == 1) return(-1);
-    if (no == 2) return(122);
-    return(-1);
-}
-
-static void des_int(int no ATTRIBUTE_UNUSED, int val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_long 4
-
-static long gen_long(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(0);
-    if (no == 1) return(1);
-    if (no == 1) return(-1);
-    if (no == 2) return(122);
-    return(-1);
-}
-
-static void des_long(int no ATTRIBUTE_UNUSED, long val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_unsigned_int 3
-
-static unsigned int gen_unsigned_int(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(0);
-    if (no == 1) return(1);
-    if (no == 2) return(122);
-    return(-1);
-}
-
-static void des_unsigned_int(int no ATTRIBUTE_UNUSED, unsigned int val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_unsigned_long 3
-
-static unsigned long gen_unsigned_long(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(0);
-    if (no == 1) return(1);
-    if (no == 2) return(122);
-    return(-1);
-}
-
-static void des_unsigned_long(int no ATTRIBUTE_UNUSED, unsigned long val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_unsigned_long_ptr 2
-
-static unsigned long *gen_unsigned_long_ptr(int no, int nr) {
-    if (no == 0) return(&longtab[nr]);
-    return(NULL);
-}
-
-static void des_unsigned_long_ptr(int no ATTRIBUTE_UNUSED, unsigned long *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_int_ptr 2
-
-static int *gen_int_ptr(int no, int nr) {
-    if (no == 0) return(&inttab[nr]);
-    return(NULL);
-}
-
-static void des_int_ptr(int no ATTRIBUTE_UNUSED, int *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_const_char_ptr 4
-
-static const char *gen_const_char_ptr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return("foo");
-    if (no == 1) return("<foo/>");
-    if (no == 2) return("test/ent2");
-    return(NULL);
-}
-static void des_const_char_ptr(int no ATTRIBUTE_UNUSED, const char *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_xmlChar_ptr 2
-
-static xmlChar *gen_xmlChar_ptr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(&chartab[0]);
-    return(NULL);
-}
-static void des_xmlChar_ptr(int no ATTRIBUTE_UNUSED, xmlChar *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_FILE_ptr 2
-
-static FILE *gen_FILE_ptr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(fopen("test.out", "a+"));
-    return(NULL);
-}
-static void des_FILE_ptr(int no ATTRIBUTE_UNUSED, FILE *val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL) fclose(val);
-}
-
-#define gen_nb_const_xmlChar_ptr 5
-
-static const xmlChar *gen_const_xmlChar_ptr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return((const xmlChar *) "foo");
-    if (no == 1) return((const xmlChar *) "<foo/>");
-    if (no == 2) return((const xmlChar *) "nøne");
-    if (no == 3) return((const xmlChar *) " 2ab ");
-    return(NULL);
-}
-static void des_const_xmlChar_ptr(int no ATTRIBUTE_UNUSED, const xmlChar *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_filepath 8
-
-static const char *gen_filepath(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return("missing.xml");
-    if (no == 1) return("<foo/>");
-    if (no == 2) return("test/ent2");
-    if (no == 3) return("test/valid/REC-xml-19980210.xml");
-    if (no == 4) return("test/valid/dtds/xhtml1-strict.dtd");
-    if (no == 5) return("http://missing.example.org/");
-    if (no == 6) return("http://missing. example.org/");
-    return(NULL);
-}
-static void des_filepath(int no ATTRIBUTE_UNUSED, const char *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_fileoutput 6
-
-static const char *gen_fileoutput(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return("/missing.xml");
-    if (no == 1) return("<foo/>");
-    if (no == 2) return("ftp://missing.example.org/foo");
-    if (no == 3) return("http://missing.example.org/");
-    if (no == 4) return("http://missing. example.org/");
-    return(NULL);
-}
-static void des_fileoutput(int no ATTRIBUTE_UNUSED, const char *val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_xmlParserCtxtPtr 2
-static xmlParserCtxtPtr gen_xmlParserCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlNewParserCtxt());
-    return(NULL);
-}
-static void des_xmlParserCtxtPtr(int no ATTRIBUTE_UNUSED, xmlParserCtxtPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL)
-        xmlFreeParserCtxt(val);
-}
-
-#define gen_nb_xmlValidCtxtPtr 2
-static xmlValidCtxtPtr gen_xmlValidCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlNewValidCtxt());
-    return(NULL);
-}
-static void des_xmlValidCtxtPtr(int no ATTRIBUTE_UNUSED, xmlValidCtxtPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL)
-        xmlFreeValidCtxt(val);
-}
-
-#define gen_nb_xmlDocPtr 3
-static xmlDocPtr gen_xmlDocPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlNewDoc(BAD_CAST "1.0"));
-    if (no == 1) return(xmlReadMemory("<foo/>", 6, "test", NULL, 0));
-    return(NULL);
-}
-static void des_xmlDocPtr(int no ATTRIBUTE_UNUSED, xmlDocPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL)
-        xmlFreeDoc(val);
-}
-
-#define gen_nb_xmlDictPtr 2
-static xmlDictPtr gen_xmlDictPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlDictCreate());
-    return(NULL);
-}
-static void des_xmlDictPtr(int no ATTRIBUTE_UNUSED, xmlDictPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL)
-        xmlDictFree(val);
-}
-
-#define gen_nb_xmlNodePtr 2
-static xmlNodePtr gen_xmlNodePtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlNewPI(BAD_CAST "test", NULL));
-    return(NULL);
-}
-static void des_xmlNodePtr(int no ATTRIBUTE_UNUSED, xmlNodePtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL) {
-        xmlUnlinkNode(val);
-        xmlFreeNode(val);
-    }
-}
-
-#define gen_nb_xmlNodePtr_in 3
-static xmlNodePtr gen_xmlNodePtr_in(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlNewPI(BAD_CAST "test", NULL));
-    if (no == 0) return(xmlNewText(BAD_CAST "text"));
-    return(NULL);
-}
-static void des_xmlNodePtr_in(int no ATTRIBUTE_UNUSED, xmlNodePtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-#define gen_nb_xmlTextWriterPtr 2
-static xmlTextWriterPtr gen_xmlTextWriterPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlNewTextWriterFilename("test.out", 0));
-    return(NULL);
-}
-static void des_xmlTextWriterPtr(int no ATTRIBUTE_UNUSED, xmlTextWriterPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL) xmlFreeTextWriter(val);
-}
-
-#define gen_nb_xmlTextReaderPtr 4
-static xmlTextReaderPtr gen_xmlTextReaderPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlNewTextReaderFilename("test/ent2"));
-    if (no == 1) return(xmlNewTextReaderFilename("test/valid/REC-xml-19980210.xml"));
-    if (no == 2) return(xmlNewTextReaderFilename("test/valid/dtds/xhtml1-strict.dtd"));
-    return(NULL);
-}
-static void des_xmlTextReaderPtr(int no ATTRIBUTE_UNUSED, xmlTextReaderPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL) xmlFreeTextReader(val);
-}
-
-#define gen_nb_xmlBufferPtr 2
-static xmlBufferPtr gen_xmlBufferPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlBufferCreate());
-    return(NULL);
-}
-static void des_xmlBufferPtr(int no ATTRIBUTE_UNUSED, xmlBufferPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL) {
-        xmlBufferFree(val);
-    }
-}
-
-#define gen_nb_xmlListPtr 2
-static xmlListPtr gen_xmlListPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlListCreate(NULL, NULL));
-    return(NULL);
-}
-static void des_xmlListPtr(int no ATTRIBUTE_UNUSED, xmlListPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL) {
-        xmlListDelete(val);
-    }
-}
-
-#define gen_nb_xmlHashTablePtr 2
-static xmlHashTablePtr gen_xmlHashTablePtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlHashCreate(10));
-    return(NULL);
-}
-static void des_xmlHashTablePtr(int no ATTRIBUTE_UNUSED, xmlHashTablePtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL) {
-        xmlHashFree(val, NULL);
-    }
-}
-
-#include <libxml/xpathInternals.h>
-
-#define gen_nb_xmlXPathObjectPtr 5
-static xmlXPathObjectPtr gen_xmlXPathObjectPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlXPathNewString(BAD_CAST "string object"));
-    if (no == 1) return(xmlXPathNewFloat(1.1));
-    if (no == 2) return(xmlXPathNewBoolean(1));
-    if (no == 3) return(xmlXPathNewNodeSet(NULL));
-    return(NULL);
-}
-static void des_xmlXPathObjectPtr(int no ATTRIBUTE_UNUSED, xmlXPathObjectPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL) {
-        xmlXPathFreeObject(val);
-    }
-}
-
-#define gen_nb_xmlOutputBufferPtr 2
-static xmlOutputBufferPtr gen_xmlOutputBufferPtr(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(xmlOutputBufferCreateFilename("test.out", NULL, 0));
-    return(NULL);
-}
-static void des_xmlOutputBufferPtr(int no ATTRIBUTE_UNUSED, xmlOutputBufferPtr val, int nr ATTRIBUTE_UNUSED) {
-    if (val != NULL) {
-        xmlOutputBufferClose(val);
-    }
-}
-
-#define gen_nb_xmlCharEncoding 4
-static xmlCharEncoding gen_xmlCharEncoding(int no, int nr ATTRIBUTE_UNUSED) {
-    if (no == 0) return(XML_CHAR_ENCODING_UTF8);
-    if (no == 1) return(XML_CHAR_ENCODING_NONE);
-    if (no == 0) return(XML_CHAR_ENCODING_8859_1);
-    return(XML_CHAR_ENCODING_ERROR);
-}
-static void des_xmlCharEncoding(int no ATTRIBUTE_UNUSED, xmlCharEncoding val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
-}
-
-""");
-
 #
 # Provide the type destructors for the return values
 #
 
-known_return_types = [ "int", "const_char_ptr", "xmlDocPtr", "xmlNodePtr",
-                       "xmlChar_ptr", "const_xmlChar_ptr", "void_ptr",
-		       "xmlXPathObjectPtr", "xmlCharEncoding", "long",
-		       "const_void_ptr", "double", "xmlTextReaderPtr",
-		       "xmlDictPtr",
-]
+known_return_types = []
 
 def is_known_return_type(name):
     for type in known_return_types:
@@ -640,44 +218,90 @@
 	    return 1
     return 0
 
-test.write("""
-static void desret_int(int val ATTRIBUTE_UNUSED) {
-}
-static void desret_long(long val ATTRIBUTE_UNUSED) {
-}
-static void desret_double(double val ATTRIBUTE_UNUSED) {
-}
-static void desret_xmlCharEncoding(xmlCharEncoding val ATTRIBUTE_UNUSED) {
-}
-static void desret_const_void_ptr(void *val ATTRIBUTE_UNUSED) {
-}
-static void desret_void_ptr(void *val ATTRIBUTE_UNUSED) {
-}
-static void desret_const_char_ptr(const char *val ATTRIBUTE_UNUSED) {
-}
-static void desret_const_xmlChar_ptr(const xmlChar *val ATTRIBUTE_UNUSED) {
-}
-static void desret_xmlChar_ptr(xmlChar *val) {
-    if (val != NULL)
-	xmlFree(val);
-}
-static void desret_xmlDocPtr(xmlDocPtr val) {
-    xmlFreeDoc(val);
-}
-static void desret_xmlDictPtr(xmlDictPtr val) {
-    xmlDictFree(val);
-}
-static void desret_xmlTextReaderPtr(xmlTextReaderPtr val) {
-    xmlFreeTextReader(val);
-}
-static void desret_xmlNodePtr(xmlNodePtr val) {
-    xmlUnlinkNode(val);
-    xmlFreeNode(val);
-}
-static void desret_xmlXPathObjectPtr(xmlXPathObjectPtr val) {
-    xmlXPathFreeObject(val);
-}
-""");
+#
+# Copy the beginning of the C test program result
+#
+
+input = open("testapi.c", "r")
+test = open('testapi.c.new', 'w')
+
+def compare_and_save():
+    global test
+
+    test.close()
+    input = open("testapi.c", "r").read()
+    test = open('testapi.c.new', "r").read()
+    if input != test:
+        os.system("rm testapi.c ; mv testapi.c.new testapi.c")
+        print("Updated testapi.c")
+    else:
+        print("Generated testapi.c is identical")
+
+line = input.readline()
+while line != "":
+    if line == "/* CUT HERE: everything below that line is generated */\n":
+        break;
+    if line[0:15] == "#define gen_nb_":
+        type = string.split(line[15:])[0]
+	known_param_types.append(type)
+    if line[0:19] == "static void desret_":
+        type = string.split(line[19:], '(')[0]
+	known_return_types.append(type)
+    test.write(line)
+    line = input.readline()
+input.close()
+
+if line == "":
+    print "Could not find the CUT marker in testapi.c skipping generation"
+    test.close()
+    sys.exit(0)
+
+print("Scanned testapi.c: found %d parameters types and %d return types\n" % (
+      len(known_param_types), len(known_return_types)))
+test.write("/* CUT HERE: everything below that line is generated */\n")
+
+
+#
+# Open the input API description
+#
+doc = libxml2.readFile('doc/libxml2-api.xml', None, 0)
+if doc == None:
+    print "Failed to load doc/libxml2-api.xml"
+    sys.exit(1)
+ctxt = doc.xpathNewContext()
+headers = ctxt.xpathEval("/api/files/file")
+
+#
+# Load the interfaces
+# 
+for file in headers:
+    name = file.xpathEval('string(@name)')
+    if (name == None) or (name == ''):
+        continue
+
+    #
+    # Some module may be skipped because they don't really consists
+    # of user callable APIs
+    #
+    if is_skipped_module(name):
+        continue
+
+    #
+    # do not test deprecated APIs
+    #
+    desc = file.xpathEval('string(description)')
+    if string.find(desc, 'DEPRECATED') != -1:
+        print "Skipping deprecated interface %s" % name
+	continue;
+
+    test.write("#include <libxml/%s.h>\n" % name)
+    modules.append(name)
+        
+#
+# Generate the callers signatures
+# 
+for module in modules:
+    test.write("static int test_%s(void);\n" % module);
 
 #
 # Generate the top caller
@@ -773,6 +397,7 @@
 	break
 
     if no_gen == 1:
+        add_missing_functions(name, module)
 	test.write("""
     /* missing type support */
     return(ret);
@@ -826,6 +451,8 @@
 	i = i + 1;
 
     # do the call, and clanup the result
+    if extra_pre_call.has_key(name):
+	test.write("        %s\n"% (extra_pre_call[name]))
     if t_ret != None:
 	test.write("\n        ret_val = %s(" % (name))
 	need = 0
@@ -940,6 +567,8 @@
 
 print "Generated test for %d modules and %d functions" %(len(modules), nb_tests)
 
+compare_and_save()
+
 missing_list = []
 for missing in missing_types.keys():
     if missing == 'va_list' or missing == '...':
@@ -954,6 +583,8 @@
 missing_list.sort(compare_missing)
 print "Missing support for %d types see missing.lst" % (len(missing_list))
 lst = open("missing.lst", "w")
+lst.write("Missing support for %d types" % (len(missing_list)))
+lst.write("\n")
 for miss in missing_list:
     lst.write("%s: %d :" % (miss[1], miss[0]))
     i = 0
@@ -964,8 +595,12 @@
 	    break
 	lst.write(" %s" % (n))
     lst.write("\n")
+lst.write("\n")
+lst.write("\n")
+lst.write("Missing support per module");
+for module in missing_functions.keys():
+    lst.write("module %s:\n   %s\n" % (module, missing_functions[module]))
 
 lst.close()
-test.close()
 
 
diff --git a/include/libxml/nanoftp.h b/include/libxml/nanoftp.h
index 95280db..e3c28a0 100644
--- a/include/libxml/nanoftp.h
+++ b/include/libxml/nanoftp.h
@@ -109,10 +109,10 @@
  */
 XMLPUBFUN int XMLCALL	
 	xmlNanoFTPCwd		(void *ctx,
-				 char *directory);
+				 const char *directory);
 XMLPUBFUN int XMLCALL	
 	xmlNanoFTPDele		(void *ctx,
-				 char *file);
+				 const char *file);
 
 XMLPUBFUN int XMLCALL	
 	xmlNanoFTPGetConnection	(void *ctx);
@@ -122,7 +122,7 @@
 	xmlNanoFTPList		(void *ctx,
 				 ftpListCallback callback,
 				 void *userData,
-				 char *filename);
+				 const char *filename);
 XMLPUBFUN int XMLCALL	
 	xmlNanoFTPGetSocket	(void *ctx,
 				 const char *filename);
diff --git a/nanoftp.c b/nanoftp.c
index 0002226..5870936 100644
--- a/nanoftp.c
+++ b/nanoftp.c
@@ -1471,7 +1471,7 @@
  */
 
 int
-xmlNanoFTPCwd(void *ctx, char *directory) {
+xmlNanoFTPCwd(void *ctx, const char *directory) {
     xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx;
     char buf[400];
     int len;
@@ -1517,7 +1517,7 @@
  */
 
 int
-xmlNanoFTPDele(void *ctx, char *file) {
+xmlNanoFTPDele(void *ctx, const char *file) {
     xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx;
     char buf[400];
     int len;
@@ -1913,7 +1913,7 @@
 
 int
 xmlNanoFTPList(void *ctx, ftpListCallback callback, void *userData,
-	       char *filename) {
+	       const char *filename) {
     xmlNanoFTPCtxtPtr ctxt = (xmlNanoFTPCtxtPtr) ctx;
     char buf[4096 + 1];
     int len, res;
diff --git a/parser.c b/parser.c
index 22c4f6a..d8d3681 100644
--- a/parser.c
+++ b/parser.c
@@ -1416,7 +1416,7 @@
  */
 xmlChar
 xmlPopInput(xmlParserCtxtPtr ctxt) {
-    if (ctxt->inputNr == 1) return(0); /* End of main Input */
+    if (ctxt->inputNr <= 1) return(0); /* End of main Input */
     if (xmlParserDebugEntities)
 	xmlGenericError(xmlGenericErrorContext,
 		"Popping input %d\n", ctxt->inputNr);
@@ -3203,15 +3203,17 @@
 		    const xmlChar *tmp = ctxt->input->cur;
 		    ctxt->input->cur = in;
 
-		    if (ctxt->sax->ignorableWhitespace !=
-		        ctxt->sax->characters) {
+		    if ((ctxt->sax != NULL) &&
+		        (ctxt->sax->ignorableWhitespace !=
+		         ctxt->sax->characters)) {
 			if (areBlanks(ctxt, tmp, nbchar, 1)) {
 			    ctxt->sax->ignorableWhitespace(ctxt->userData,
 						   tmp, nbchar);
 			} else if (ctxt->sax->characters != NULL)
 			    ctxt->sax->characters(ctxt->userData,
 						  tmp, nbchar);
-		    } else if (ctxt->sax->characters != NULL) {
+		    } else if ((ctxt->sax != NULL) &&
+		               (ctxt->sax->characters != NULL)) {
 			ctxt->sax->characters(ctxt->userData,
 					      tmp, nbchar);
 		    }
@@ -3245,7 +3247,8 @@
 	    }
 	    nbchar = in - ctxt->input->cur;
 	    if (nbchar > 0) {
-		if ((ctxt->sax->ignorableWhitespace !=
+		if ((ctxt->sax != NULL) &&
+		    (ctxt->sax->ignorableWhitespace !=
 		     ctxt->sax->characters) &&
 		    (IS_BLANK_CH(*ctxt->input->cur))) {
 		    const xmlChar *tmp = ctxt->input->cur;
@@ -3259,7 +3262,7 @@
 					      tmp, nbchar);
                     line = ctxt->input->line;
                     col = ctxt->input->col;
-		} else {
+		} else if (ctxt->sax != NULL) {
 		    if (ctxt->sax->characters != NULL)
 			ctxt->sax->characters(ctxt->userData,
 					      ctxt->input->cur, nbchar);
@@ -10271,7 +10274,8 @@
     if (input == NULL) {
         if (sax != NULL) ctxt->sax = NULL;
 	xmlFreeParserCtxt(ctxt);
-	xmlFree(systemIdCanonic);
+	if (systemIdCanonic != NULL)
+	    xmlFree(systemIdCanonic);
 	return(NULL);
     }
 
@@ -11716,6 +11720,10 @@
     }
     if (sax != NULL)
 	ctxt->sax = NULL;
+    if (ctxt->myDoc != NULL) {
+        xmlFreeDoc(ctxt->myDoc);
+	ctxt->myDoc = NULL;
+    }
     xmlFreeParserCtxt(ctxt);
     
     return ret;
@@ -11918,6 +11926,10 @@
 	    ret = -1;
     }
     ctxt->sax = oldsax;
+    if (ctxt->myDoc != NULL) {
+        xmlFreeDoc(ctxt->myDoc);
+	ctxt->myDoc = NULL;
+    }
     xmlFreeParserCtxt(ctxt);
     
     return ret;
@@ -11962,12 +11974,14 @@
     xmlDocPtr ret;
     xmlParserCtxtPtr ctxt;
 
-    if (cur == NULL) return(NULL);
+    if ((cur == NULL) || (sax == NULL)) return(NULL);
 
 
     ctxt = xmlCreateDocParserCtxt(cur);
     if (ctxt == NULL) return(NULL);
     if (sax != NULL) { 
+        if (ctxt->sax != NULL)
+	    xmlFree(ctxt->sax);
         ctxt->sax = sax;
         ctxt->userData = NULL;
     }
@@ -11980,7 +11994,7 @@
        xmlFreeDoc(ctxt->myDoc);
        ctxt->myDoc = NULL;
     }
-    if (sax != NULL) 
+    if (sax != NULL)
 	ctxt->sax = NULL;
     xmlFreeParserCtxt(ctxt);
     
diff --git a/python/libxml2class.txt b/python/libxml2class.txt
index e9e447d..972074c 100644
--- a/python/libxml2class.txt
+++ b/python/libxml2class.txt
@@ -156,6 +156,7 @@
 
 # functions from module relaxng
 relaxNGCleanupTypes()
+relaxNGInitTypes()
 relaxNGNewMemParserCtxt()
 relaxNGNewParserCtxt()
 
diff --git a/testapi.c b/testapi.c
index 49f6d60..352ad7e 100644
--- a/testapi.c
+++ b/testapi.c
@@ -83,35 +83,6 @@
 #include <libxml/xmlwriter.h>
 #include <libxml/xpath.h>
 #include <libxml/xpointer.h>
-static int test_HTMLparser(void);
-static int test_HTMLtree(void);
-static int test_catalog(void);
-static int test_chvalid(void);
-static int test_dict(void);
-static int test_encoding(void);
-static int test_entities(void);
-static int test_hash(void);
-static int test_list(void);
-static int test_nanoftp(void);
-static int test_nanohttp(void);
-static int test_parser(void);
-static int test_pattern(void);
-static int test_relaxng(void);
-static int test_schemasInternals(void);
-static int test_tree(void);
-static int test_uri(void);
-static int test_valid(void);
-static int test_xinclude(void);
-static int test_xmlIO(void);
-static int test_xmlerror(void);
-static int test_xmlreader(void);
-static int test_xmlsave(void);
-static int test_xmlschemas(void);
-static int test_xmlschemastypes(void);
-static int test_xmlstring(void);
-static int test_xmlwriter(void);
-static int test_xpath(void);
-static int test_xpointer(void);
 
 #define gen_nb_void_ptr 2
 
@@ -291,6 +262,14 @@
         xmlFreeParserCtxt(val);
 }
 
+#define gen_nb_xmlSAXHandlerPtr 2
+static xmlSAXHandlerPtr gen_xmlSAXHandlerPtr(int no, int nr ATTRIBUTE_UNUSED) {
+    if (no == 0) return((xmlSAXHandlerPtr) &xmlDefaultSAXHandler);
+    return(NULL);
+}
+static void des_xmlSAXHandlerPtr(int no ATTRIBUTE_UNUSED, xmlSAXHandlerPtr val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
+}
+
 #define gen_nb_xmlValidCtxtPtr 2
 static xmlValidCtxtPtr gen_xmlValidCtxtPtr(int no, int nr ATTRIBUTE_UNUSED) {
     if (no == 0) return(xmlNewValidCtxt());
@@ -301,6 +280,22 @@
         xmlFreeValidCtxt(val);
 }
 
+#define gen_nb_xmlParserInputBufferPtr 8
+
+static xmlParserInputBufferPtr gen_xmlParserInputBufferPtr(int no, int nr ATTRIBUTE_UNUSED) {
+    if (no == 0) return(xmlParserInputBufferCreateFilename("missing.xml", XML_CHAR_ENCODING_NONE));
+    if (no == 1) return(xmlParserInputBufferCreateFilename("<foo/>", XML_CHAR_ENCODING_NONE));
+    if (no == 2) return(xmlParserInputBufferCreateFilename("test/ent2", XML_CHAR_ENCODING_NONE));
+    if (no == 3) return(xmlParserInputBufferCreateFilename("test/valid/REC-xml-19980210.xml", XML_CHAR_ENCODING_NONE));
+    if (no == 4) return(xmlParserInputBufferCreateFilename("test/valid/dtds/xhtml1-strict.dtd", XML_CHAR_ENCODING_NONE));
+    if (no == 5) return(xmlParserInputBufferCreateFilename("http://missing.example.org/", XML_CHAR_ENCODING_NONE));
+    if (no == 6) return(xmlParserInputBufferCreateFilename("http://missing. example.org/", XML_CHAR_ENCODING_NONE));
+    return(NULL);
+}
+static void des_xmlParserInputBufferPtr(int no ATTRIBUTE_UNUSED, xmlParserInputBufferPtr val, int nr ATTRIBUTE_UNUSED) {
+    xmlFreeParserInputBuffer(val);
+}
+
 #define gen_nb_xmlDocPtr 3
 static xmlDocPtr gen_xmlDocPtr(int no, int nr ATTRIBUTE_UNUSED) {
     if (no == 0) return(xmlNewDoc(BAD_CAST "1.0"));
@@ -363,9 +358,10 @@
     if (val != NULL) xmlFreeTextReader(val);
 }
 
-#define gen_nb_xmlBufferPtr 2
+#define gen_nb_xmlBufferPtr 3
 static xmlBufferPtr gen_xmlBufferPtr(int no, int nr ATTRIBUTE_UNUSED) {
     if (no == 0) return(xmlBufferCreate());
+    if (no == 1) return(xmlBufferCreateStatic((void *)"static buffer", 13));
     return(NULL);
 }
 static void des_xmlBufferPtr(int no ATTRIBUTE_UNUSED, xmlBufferPtr val, int nr ATTRIBUTE_UNUSED) {
@@ -467,9 +463,75 @@
     xmlUnlinkNode(val);
     xmlFreeNode(val);
 }
+static void desret_xmlDtdPtr(xmlDtdPtr val) {
+    desret_xmlNodePtr((xmlNodePtr)val);
+}
 static void desret_xmlXPathObjectPtr(xmlXPathObjectPtr val) {
     xmlXPathFreeObject(val);
 }
+static void desret_xmlParserCtxtPtr(xmlParserCtxtPtr val) {
+    xmlFreeParserCtxt(val);
+}
+
+/* CUT HERE: everything below that line is generated */
+#include <libxml/HTMLparser.h>
+#include <libxml/HTMLtree.h>
+#include <libxml/catalog.h>
+#include <libxml/chvalid.h>
+#include <libxml/dict.h>
+#include <libxml/encoding.h>
+#include <libxml/entities.h>
+#include <libxml/hash.h>
+#include <libxml/list.h>
+#include <libxml/nanoftp.h>
+#include <libxml/nanohttp.h>
+#include <libxml/parser.h>
+#include <libxml/pattern.h>
+#include <libxml/relaxng.h>
+#include <libxml/schemasInternals.h>
+#include <libxml/tree.h>
+#include <libxml/uri.h>
+#include <libxml/valid.h>
+#include <libxml/xinclude.h>
+#include <libxml/xmlIO.h>
+#include <libxml/xmlerror.h>
+#include <libxml/xmlreader.h>
+#include <libxml/xmlsave.h>
+#include <libxml/xmlschemas.h>
+#include <libxml/xmlschemastypes.h>
+#include <libxml/xmlstring.h>
+#include <libxml/xmlwriter.h>
+#include <libxml/xpath.h>
+#include <libxml/xpointer.h>
+static int test_HTMLparser(void);
+static int test_HTMLtree(void);
+static int test_catalog(void);
+static int test_chvalid(void);
+static int test_dict(void);
+static int test_encoding(void);
+static int test_entities(void);
+static int test_hash(void);
+static int test_list(void);
+static int test_nanoftp(void);
+static int test_nanohttp(void);
+static int test_parser(void);
+static int test_pattern(void);
+static int test_relaxng(void);
+static int test_schemasInternals(void);
+static int test_tree(void);
+static int test_uri(void);
+static int test_valid(void);
+static int test_xinclude(void);
+static int test_xmlIO(void);
+static int test_xmlerror(void);
+static int test_xmlreader(void);
+static int test_xmlsave(void);
+static int test_xmlschemas(void);
+static int test_xmlschemastypes(void);
+static int test_xmlstring(void);
+static int test_xmlwriter(void);
+static int test_xpath(void);
+static int test_xpointer(void);
 
 /**
  * testlibxml2:
@@ -592,8 +654,39 @@
 test_htmlCreateMemoryParserCtxt(void) {
     int ret = 0;
 
+#ifdef LIBXML_HTML_ENABLED
+    int mem_base;
+    htmlParserCtxtPtr ret_val;
+    const char * buffer; /* a pointer to a char array */
+    int n_buffer;
+    int size; /* the size of the array */
+    int n_size;
 
-    /* missing type support */
+    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
+    for (n_size = 0;n_size < gen_nb_int;n_size++) {
+        mem_base = xmlMemBlocks();
+        buffer = gen_const_char_ptr(n_buffer, 0);
+        size = gen_int(n_size, 1);
+
+        ret_val = htmlCreateMemoryParserCtxt(buffer, size);
+        desret_xmlParserCtxtPtr(ret_val);
+        call_tests++;
+        des_const_char_ptr(n_buffer, buffer, 0);
+        des_int(n_size, size, 1);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in htmlCreateMemoryParserCtxt",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_buffer);
+            printf(" %d", n_size);
+            printf("\n");
+        }
+    }
+    }
+#endif
+
+    function_tests++;
     return(ret);
 }
 
@@ -1473,7 +1566,7 @@
 test_HTMLparser(void) {
     int ret = 0;
 
-    printf("Testing HTMLparser : 18 of 37 functions ...\n");
+    printf("Testing HTMLparser : 19 of 37 functions ...\n");
     ret += test_UTF8ToHtml();
     ret += test_htmlAttrAllowed();
     ret += test_htmlAutoCloseTag();
@@ -6277,8 +6370,30 @@
 test_xmlCreateDocParserCtxt(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlParserCtxtPtr ret_val;
+    const xmlChar * cur; /* a pointer to an array of xmlChar */
+    int n_cur;
 
-    /* missing type support */
+    for (n_cur = 0;n_cur < gen_nb_const_xmlChar_ptr;n_cur++) {
+        mem_base = xmlMemBlocks();
+        cur = gen_const_xmlChar_ptr(n_cur, 0);
+
+        ret_val = xmlCreateDocParserCtxt(cur);
+        desret_xmlParserCtxtPtr(ret_val);
+        call_tests++;
+        des_const_xmlChar_ptr(n_cur, cur, 0);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlCreateDocParserCtxt",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_cur);
+            printf("\n");
+        }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -6297,8 +6412,60 @@
 test_xmlCreatePushParserCtxt(void) {
     int ret = 0;
 
+#ifdef LIBXML_PUSH_ENABLED
+    int mem_base;
+    xmlParserCtxtPtr ret_val;
+    xmlSAXHandlerPtr sax; /* a SAX handler */
+    int n_sax;
+    void * user_data; /* The user data returned on SAX callbacks */
+    int n_user_data;
+    const char * chunk; /* a pointer to an array of chars */
+    int n_chunk;
+    int size; /* number of chars in the array */
+    int n_size;
+    const char * filename; /* an optional file name or URI */
+    int n_filename;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
+    for (n_chunk = 0;n_chunk < gen_nb_const_char_ptr;n_chunk++) {
+    for (n_size = 0;n_size < gen_nb_int;n_size++) {
+    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        user_data = gen_userdata(n_user_data, 1);
+        chunk = gen_const_char_ptr(n_chunk, 2);
+        size = gen_int(n_size, 3);
+        filename = gen_filepath(n_filename, 4);
+
+        ret_val = xmlCreatePushParserCtxt(sax, user_data, chunk, size, filename);
+        desret_xmlParserCtxtPtr(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_userdata(n_user_data, user_data, 1);
+        des_const_char_ptr(n_chunk, chunk, 2);
+        des_int(n_size, size, 3);
+        des_filepath(n_filename, filename, 4);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlCreatePushParserCtxt",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_user_data);
+            printf(" %d", n_chunk);
+            printf(" %d", n_size);
+            printf(" %d", n_filename);
+            printf("\n");
+        }
+    }
+    }
+    }
+    }
+    }
+#endif
+
+    function_tests++;
     return(ret);
 }
 
@@ -6682,8 +6849,45 @@
 test_xmlIOParseDTD(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDtdPtr ret_val;
+    xmlSAXHandlerPtr sax; /* the SAX handler block or NULL */
+    int n_sax;
+    xmlParserInputBufferPtr input; /* an Input Buffer */
+    int n_input;
+    xmlCharEncoding enc; /* the charset encoding if known */
+    int n_enc;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) {
+    for (n_enc = 0;n_enc < gen_nb_xmlCharEncoding;n_enc++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        input = gen_xmlParserInputBufferPtr(n_input, 1);
+        enc = gen_xmlCharEncoding(n_enc, 2);
+
+        ret_val = xmlIOParseDTD(sax, input, enc);
+        input = NULL;
+        desret_xmlDtdPtr(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_xmlParserInputBufferPtr(n_input, input, 1);
+        des_xmlCharEncoding(n_enc, enc, 2);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlIOParseDTD",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_input);
+            printf(" %d", n_enc);
+            printf("\n");
+        }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -6841,8 +7045,23 @@
 test_xmlNewParserCtxt(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlParserCtxtPtr ret_val;
 
-    /* missing type support */
+        mem_base = xmlMemBlocks();
+
+        ret_val = xmlNewParserCtxt();
+        desret_xmlParserCtxtPtr(ret_val);
+        call_tests++;
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlNewParserCtxt",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf("\n");
+        }
+
+    function_tests++;
     return(ret);
 }
 
@@ -6936,8 +7155,37 @@
 test_xmlParseDTD(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDtdPtr ret_val;
+    const xmlChar * ExternalID; /* a NAME* containing the External ID of the DTD */
+    int n_ExternalID;
+    const xmlChar * SystemID; /* a NAME* containing the URL to the DTD */
+    int n_SystemID;
 
-    /* missing type support */
+    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
+    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
+        mem_base = xmlMemBlocks();
+        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 0);
+        SystemID = gen_const_xmlChar_ptr(n_SystemID, 1);
+
+        ret_val = xmlParseDTD(ExternalID, SystemID);
+        desret_xmlDtdPtr(ret_val);
+        call_tests++;
+        des_const_xmlChar_ptr(n_ExternalID, ExternalID, 0);
+        des_const_xmlChar_ptr(n_SystemID, SystemID, 1);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlParseDTD",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_ExternalID);
+            printf(" %d", n_SystemID);
+            printf("\n");
+        }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7509,8 +7757,44 @@
 test_xmlSAXParseDTD(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDtdPtr ret_val;
+    xmlSAXHandlerPtr sax; /* the SAX handler block */
+    int n_sax;
+    const xmlChar * ExternalID; /* a NAME* containing the External ID of the DTD */
+    int n_ExternalID;
+    const xmlChar * SystemID; /* a NAME* containing the URL to the DTD */
+    int n_SystemID;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
+    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 1);
+        SystemID = gen_const_xmlChar_ptr(n_SystemID, 2);
+
+        ret_val = xmlSAXParseDTD(sax, ExternalID, SystemID);
+        desret_xmlDtdPtr(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_const_xmlChar_ptr(n_ExternalID, ExternalID, 1);
+        des_const_xmlChar_ptr(n_SystemID, SystemID, 2);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlSAXParseDTD",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_ExternalID);
+            printf(" %d", n_SystemID);
+            printf("\n");
+        }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7519,8 +7803,44 @@
 test_xmlSAXParseDoc(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDocPtr ret_val;
+    xmlSAXHandlerPtr sax; /* the SAX handler block */
+    int n_sax;
+    xmlChar * cur; /* a pointer to an array of xmlChar */
+    int n_cur;
+    int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */
+    int n_recovery;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_cur = 0;n_cur < gen_nb_xmlChar_ptr;n_cur++) {
+    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        cur = gen_xmlChar_ptr(n_cur, 1);
+        recovery = gen_int(n_recovery, 2);
+
+        ret_val = xmlSAXParseDoc(sax, cur, recovery);
+        desret_xmlDocPtr(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_xmlChar_ptr(n_cur, cur, 1);
+        des_int(n_recovery, recovery, 2);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlSAXParseDoc",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_cur);
+            printf(" %d", n_recovery);
+            printf("\n");
+        }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7529,8 +7849,37 @@
 test_xmlSAXParseEntity(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDocPtr ret_val;
+    xmlSAXHandlerPtr sax; /* the SAX handler block */
+    int n_sax;
+    const char * filename; /* the filename */
+    int n_filename;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        filename = gen_filepath(n_filename, 1);
+
+        ret_val = xmlSAXParseEntity(sax, filename);
+        desret_xmlDocPtr(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_filepath(n_filename, filename, 1);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlSAXParseEntity",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_filename);
+            printf("\n");
+        }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7539,8 +7888,44 @@
 test_xmlSAXParseFile(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDocPtr ret_val;
+    xmlSAXHandlerPtr sax; /* the SAX handler block */
+    int n_sax;
+    const char * filename; /* the filename */
+    int n_filename;
+    int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */
+    int n_recovery;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
+    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        filename = gen_filepath(n_filename, 1);
+        recovery = gen_int(n_recovery, 2);
+
+        ret_val = xmlSAXParseFile(sax, filename, recovery);
+        desret_xmlDocPtr(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_filepath(n_filename, filename, 1);
+        des_int(n_recovery, recovery, 2);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlSAXParseFile",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_filename);
+            printf(" %d", n_recovery);
+            printf("\n");
+        }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7549,8 +7934,51 @@
 test_xmlSAXParseFileWithData(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDocPtr ret_val;
+    xmlSAXHandlerPtr sax; /* the SAX handler block */
+    int n_sax;
+    const char * filename; /* the filename */
+    int n_filename;
+    int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */
+    int n_recovery;
+    void * data; /* the userdata */
+    int n_data;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
+    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
+    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        filename = gen_filepath(n_filename, 1);
+        recovery = gen_int(n_recovery, 2);
+        data = gen_userdata(n_data, 3);
+
+        ret_val = xmlSAXParseFileWithData(sax, filename, recovery, data);
+        desret_xmlDocPtr(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_filepath(n_filename, filename, 1);
+        des_int(n_recovery, recovery, 2);
+        des_userdata(n_data, data, 3);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlSAXParseFileWithData",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_filename);
+            printf(" %d", n_recovery);
+            printf(" %d", n_data);
+            printf("\n");
+        }
+    }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7559,8 +7987,51 @@
 test_xmlSAXParseMemory(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDocPtr ret_val;
+    xmlSAXHandlerPtr sax; /* the SAX handler block */
+    int n_sax;
+    const char * buffer; /* an pointer to a char array */
+    int n_buffer;
+    int size; /* the size of the array */
+    int n_size;
+    int recovery; /* work in recovery mode, i.e. tries to read not Well Formed documents */
+    int n_recovery;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
+    for (n_size = 0;n_size < gen_nb_int;n_size++) {
+    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        buffer = gen_const_char_ptr(n_buffer, 1);
+        size = gen_int(n_size, 2);
+        recovery = gen_int(n_recovery, 3);
+
+        ret_val = xmlSAXParseMemory(sax, buffer, size, recovery);
+        desret_xmlDocPtr(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_const_char_ptr(n_buffer, buffer, 1);
+        des_int(n_size, size, 2);
+        des_int(n_recovery, recovery, 3);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlSAXParseMemory",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_buffer);
+            printf(" %d", n_size);
+            printf(" %d", n_recovery);
+            printf("\n");
+        }
+    }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7569,8 +8040,58 @@
 test_xmlSAXParseMemoryWithData(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDocPtr ret_val;
+    xmlSAXHandlerPtr sax; /* the SAX handler block */
+    int n_sax;
+    const char * buffer; /* an pointer to a char array */
+    int n_buffer;
+    int size; /* the size of the array */
+    int n_size;
+    int recovery; /* work in recovery mode, i.e. tries to read no Well Formed documents */
+    int n_recovery;
+    void * data; /* the userdata */
+    int n_data;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
+    for (n_size = 0;n_size < gen_nb_int;n_size++) {
+    for (n_recovery = 0;n_recovery < gen_nb_int;n_recovery++) {
+    for (n_data = 0;n_data < gen_nb_userdata;n_data++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        buffer = gen_const_char_ptr(n_buffer, 1);
+        size = gen_int(n_size, 2);
+        recovery = gen_int(n_recovery, 3);
+        data = gen_userdata(n_data, 4);
+
+        ret_val = xmlSAXParseMemoryWithData(sax, buffer, size, recovery, data);
+        desret_xmlDocPtr(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_const_char_ptr(n_buffer, buffer, 1);
+        des_int(n_size, size, 2);
+        des_int(n_recovery, recovery, 3);
+        des_userdata(n_data, data, 4);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlSAXParseMemoryWithData",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_buffer);
+            printf(" %d", n_size);
+            printf(" %d", n_recovery);
+            printf(" %d", n_data);
+            printf("\n");
+        }
+    }
+    }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7579,8 +8100,45 @@
 test_xmlSAXUserParseFile(void) {
     int ret = 0;
 
+    int mem_base;
+    int ret_val;
+    xmlSAXHandlerPtr sax; /* a SAX handler */
+    int n_sax;
+    void * user_data; /* The user data returned on SAX callbacks */
+    int n_user_data;
+    const char * filename; /* a file name */
+    int n_filename;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
+    for (n_filename = 0;n_filename < gen_nb_filepath;n_filename++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        user_data = gen_userdata(n_user_data, 1);
+        filename = gen_filepath(n_filename, 2);
+        if (sax == &xmlDefaultSAXHandler) user_data = NULL;
+
+        ret_val = xmlSAXUserParseFile(sax, user_data, filename);
+        desret_int(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_userdata(n_user_data, user_data, 1);
+        des_filepath(n_filename, filename, 2);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlSAXUserParseFile",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_user_data);
+            printf(" %d", n_filename);
+            printf("\n");
+        }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7589,8 +8147,52 @@
 test_xmlSAXUserParseMemory(void) {
     int ret = 0;
 
+    int mem_base;
+    int ret_val;
+    xmlSAXHandlerPtr sax; /* a SAX handler */
+    int n_sax;
+    void * user_data; /* The user data returned on SAX callbacks */
+    int n_user_data;
+    const char * buffer; /* an in-memory XML document input */
+    int n_buffer;
+    int size; /* the length of the XML document in bytes */
+    int n_size;
 
-    /* missing type support */
+    for (n_sax = 0;n_sax < gen_nb_xmlSAXHandlerPtr;n_sax++) {
+    for (n_user_data = 0;n_user_data < gen_nb_userdata;n_user_data++) {
+    for (n_buffer = 0;n_buffer < gen_nb_const_char_ptr;n_buffer++) {
+    for (n_size = 0;n_size < gen_nb_int;n_size++) {
+        mem_base = xmlMemBlocks();
+        sax = gen_xmlSAXHandlerPtr(n_sax, 0);
+        user_data = gen_userdata(n_user_data, 1);
+        buffer = gen_const_char_ptr(n_buffer, 2);
+        size = gen_int(n_size, 3);
+        if (sax == &xmlDefaultSAXHandler) user_data = NULL;
+
+        ret_val = xmlSAXUserParseMemory(sax, user_data, buffer, size);
+        desret_int(ret_val);
+        call_tests++;
+        des_xmlSAXHandlerPtr(n_sax, sax, 0);
+        des_userdata(n_user_data, user_data, 1);
+        des_const_char_ptr(n_buffer, buffer, 2);
+        des_int(n_size, size, 3);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlSAXUserParseMemory",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_sax);
+            printf(" %d", n_user_data);
+            printf(" %d", n_buffer);
+            printf(" %d", n_size);
+            printf("\n");
+        }
+    }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -7760,7 +8362,7 @@
 test_parser(void) {
     int ret = 0;
 
-    printf("Testing parser : 31 of 69 functions ...\n");
+    printf("Testing parser : 45 of 69 functions ...\n");
     ret += test_xmlByteConsumed();
     ret += test_xmlClearNodeInfoSeq();
     ret += test_xmlClearParserCtxt();
@@ -7903,6 +8505,33 @@
 
 
 static int
+test_xmlRelaxNGInitTypes(void) {
+    int ret = 0;
+
+#ifdef LIBXML_SCHEMAS_ENABLED
+    int mem_base;
+    int ret_val;
+
+        mem_base = xmlMemBlocks();
+
+        ret_val = xmlRelaxNGInitTypes();
+        desret_int(ret_val);
+        call_tests++;
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlRelaxNGInitTypes",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf("\n");
+        }
+#endif
+
+    function_tests++;
+    return(ret);
+}
+
+
+static int
 test_xmlRelaxNGNewDocParserCtxt(void) {
     int ret = 0;
 
@@ -8035,11 +8664,12 @@
 test_relaxng(void) {
     int ret = 0;
 
-    printf("Testing relaxng : 0 of 21 functions ...\n");
+    printf("Testing relaxng : 1 of 22 functions ...\n");
     ret += test_xmlRelaxNGDump();
     ret += test_xmlRelaxNGDumpTree();
     ret += test_xmlRelaxNGGetParserErrors();
     ret += test_xmlRelaxNGGetValidErrors();
+    ret += test_xmlRelaxNGInitTypes();
     ret += test_xmlRelaxNGNewDocParserCtxt();
     ret += test_xmlRelaxNGNewMemParserCtxt();
     ret += test_xmlRelaxNGNewParserCtxt();
@@ -8980,8 +9610,51 @@
 test_xmlCreateIntSubset(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDtdPtr ret_val;
+    xmlDocPtr doc; /* the document pointer */
+    int n_doc;
+    const xmlChar * name; /* the DTD name */
+    int n_name;
+    const xmlChar * ExternalID; /* the external (PUBLIC) ID */
+    int n_ExternalID;
+    const xmlChar * SystemID; /* the system ID */
+    int n_SystemID;
 
-    /* missing type support */
+    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
+    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
+    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
+    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
+        mem_base = xmlMemBlocks();
+        doc = gen_xmlDocPtr(n_doc, 0);
+        name = gen_const_xmlChar_ptr(n_name, 1);
+        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2);
+        SystemID = gen_const_xmlChar_ptr(n_SystemID, 3);
+
+        ret_val = xmlCreateIntSubset(doc, name, ExternalID, SystemID);
+        desret_xmlDtdPtr(ret_val);
+        call_tests++;
+        des_xmlDocPtr(n_doc, doc, 0);
+        des_const_xmlChar_ptr(n_name, name, 1);
+        des_const_xmlChar_ptr(n_ExternalID, ExternalID, 2);
+        des_const_xmlChar_ptr(n_SystemID, SystemID, 3);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlCreateIntSubset",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_doc);
+            printf(" %d", n_name);
+            printf(" %d", n_ExternalID);
+            printf(" %d", n_SystemID);
+            printf("\n");
+        }
+    }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -9326,8 +9999,30 @@
 test_xmlGetIntSubset(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDtdPtr ret_val;
+    xmlDocPtr doc; /* the document pointer */
+    int n_doc;
 
-    /* missing type support */
+    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
+        mem_base = xmlMemBlocks();
+        doc = gen_xmlDocPtr(n_doc, 0);
+
+        ret_val = xmlGetIntSubset(doc);
+        desret_xmlDtdPtr(ret_val);
+        call_tests++;
+        des_xmlDocPtr(n_doc, doc, 0);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlGetIntSubset",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_doc);
+            printf("\n");
+        }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -10062,8 +10757,51 @@
 test_xmlNewDtd(void) {
     int ret = 0;
 
+    int mem_base;
+    xmlDtdPtr ret_val;
+    xmlDocPtr doc; /* the document pointer */
+    int n_doc;
+    const xmlChar * name; /* the DTD name */
+    int n_name;
+    const xmlChar * ExternalID; /* the external ID */
+    int n_ExternalID;
+    const xmlChar * SystemID; /* the system ID */
+    int n_SystemID;
 
-    /* missing type support */
+    for (n_doc = 0;n_doc < gen_nb_xmlDocPtr;n_doc++) {
+    for (n_name = 0;n_name < gen_nb_const_xmlChar_ptr;n_name++) {
+    for (n_ExternalID = 0;n_ExternalID < gen_nb_const_xmlChar_ptr;n_ExternalID++) {
+    for (n_SystemID = 0;n_SystemID < gen_nb_const_xmlChar_ptr;n_SystemID++) {
+        mem_base = xmlMemBlocks();
+        doc = gen_xmlDocPtr(n_doc, 0);
+        name = gen_const_xmlChar_ptr(n_name, 1);
+        ExternalID = gen_const_xmlChar_ptr(n_ExternalID, 2);
+        SystemID = gen_const_xmlChar_ptr(n_SystemID, 3);
+
+        ret_val = xmlNewDtd(doc, name, ExternalID, SystemID);
+        desret_xmlDtdPtr(ret_val);
+        call_tests++;
+        des_xmlDocPtr(n_doc, doc, 0);
+        des_const_xmlChar_ptr(n_name, name, 1);
+        des_const_xmlChar_ptr(n_ExternalID, ExternalID, 2);
+        des_const_xmlChar_ptr(n_SystemID, SystemID, 3);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlNewDtd",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_doc);
+            printf(" %d", n_name);
+            printf(" %d", n_ExternalID);
+            printf(" %d", n_SystemID);
+            printf("\n");
+        }
+    }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -12097,7 +12835,7 @@
 test_tree(void) {
     int ret = 0;
 
-    printf("Testing tree : 88 of 146 functions ...\n");
+    printf("Testing tree : 91 of 146 functions ...\n");
     ret += test_xmlAddChild();
     ret += test_xmlAddChildList();
     ret += test_xmlAddNextSibling();
@@ -14697,8 +15435,37 @@
 test_xmlParserInputBufferGrow(void) {
     int ret = 0;
 
+    int mem_base;
+    int ret_val;
+    xmlParserInputBufferPtr in; /* a buffered parser input */
+    int n_in;
+    int len; /* indicative value of the amount of chars to read */
+    int n_len;
 
-    /* missing type support */
+    for (n_in = 0;n_in < gen_nb_xmlParserInputBufferPtr;n_in++) {
+    for (n_len = 0;n_len < gen_nb_int;n_len++) {
+        mem_base = xmlMemBlocks();
+        in = gen_xmlParserInputBufferPtr(n_in, 0);
+        len = gen_int(n_len, 1);
+
+        ret_val = xmlParserInputBufferGrow(in, len);
+        desret_int(ret_val);
+        call_tests++;
+        des_xmlParserInputBufferPtr(n_in, in, 0);
+        des_int(n_len, len, 1);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlParserInputBufferGrow",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_in);
+            printf(" %d", n_len);
+            printf("\n");
+        }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -14707,8 +15474,44 @@
 test_xmlParserInputBufferPush(void) {
     int ret = 0;
 
+    int mem_base;
+    int ret_val;
+    xmlParserInputBufferPtr in; /* a buffered parser input */
+    int n_in;
+    int len; /* the size in bytes of the array. */
+    int n_len;
+    const char * buf; /* an char array */
+    int n_buf;
 
-    /* missing type support */
+    for (n_in = 0;n_in < gen_nb_xmlParserInputBufferPtr;n_in++) {
+    for (n_len = 0;n_len < gen_nb_int;n_len++) {
+    for (n_buf = 0;n_buf < gen_nb_const_char_ptr;n_buf++) {
+        mem_base = xmlMemBlocks();
+        in = gen_xmlParserInputBufferPtr(n_in, 0);
+        len = gen_int(n_len, 1);
+        buf = gen_const_char_ptr(n_buf, 2);
+
+        ret_val = xmlParserInputBufferPush(in, len, buf);
+        desret_int(ret_val);
+        call_tests++;
+        des_xmlParserInputBufferPtr(n_in, in, 0);
+        des_int(n_len, len, 1);
+        des_const_char_ptr(n_buf, buf, 2);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlParserInputBufferPush",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_in);
+            printf(" %d", n_len);
+            printf(" %d", n_buf);
+            printf("\n");
+        }
+    }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -14717,8 +15520,37 @@
 test_xmlParserInputBufferRead(void) {
     int ret = 0;
 
+    int mem_base;
+    int ret_val;
+    xmlParserInputBufferPtr in; /* a buffered parser input */
+    int n_in;
+    int len; /* indicative value of the amount of chars to read */
+    int n_len;
 
-    /* missing type support */
+    for (n_in = 0;n_in < gen_nb_xmlParserInputBufferPtr;n_in++) {
+    for (n_len = 0;n_len < gen_nb_int;n_len++) {
+        mem_base = xmlMemBlocks();
+        in = gen_xmlParserInputBufferPtr(n_in, 0);
+        len = gen_int(n_len, 1);
+
+        ret_val = xmlParserInputBufferRead(in, len);
+        desret_int(ret_val);
+        call_tests++;
+        des_xmlParserInputBufferPtr(n_in, in, 0);
+        des_int(n_len, len, 1);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlParserInputBufferRead",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_in);
+            printf(" %d", n_len);
+            printf("\n");
+        }
+    }
+    }
+
+    function_tests++;
     return(ret);
 }
 
@@ -14844,7 +15676,7 @@
 test_xmlIO(void) {
     int ret = 0;
 
-    printf("Testing xmlIO : 20 of 47 functions ...\n");
+    printf("Testing xmlIO : 23 of 47 functions ...\n");
     ret += test_xmlAllocOutputBuffer();
     ret += test_xmlAllocParserInputBuffer();
     ret += test_xmlCheckFilename();
@@ -15100,8 +15932,39 @@
 test_xmlNewTextReader(void) {
     int ret = 0;
 
+#ifdef LIBXML_READER_ENABLED
+    int mem_base;
+    xmlTextReaderPtr ret_val;
+    xmlParserInputBufferPtr input; /* the xmlParserInputBufferPtr used to read data */
+    int n_input;
+    const char * URI; /* the URI information for the source if available */
+    int n_URI;
 
-    /* missing type support */
+    for (n_input = 0;n_input < gen_nb_xmlParserInputBufferPtr;n_input++) {
+    for (n_URI = 0;n_URI < gen_nb_filepath;n_URI++) {
+        mem_base = xmlMemBlocks();
+        input = gen_xmlParserInputBufferPtr(n_input, 0);
+        URI = gen_filepath(n_URI, 1);
+
+        ret_val = xmlNewTextReader(input, URI);
+        desret_xmlTextReaderPtr(ret_val);
+        call_tests++;
+        des_xmlParserInputBufferPtr(n_input, input, 0);
+        des_filepath(n_URI, URI, 1);
+        xmlResetLastError();
+        if (mem_base != xmlMemBlocks()) {
+            printf("Leak of %d blocks found in xmlNewTextReader",
+	           xmlMemBlocks() - mem_base);
+	    ret++;
+            printf(" %d", n_input);
+            printf(" %d", n_URI);
+            printf("\n");
+        }
+    }
+    }
+#endif
+
+    function_tests++;
     return(ret);
 }
 
@@ -17527,7 +18390,7 @@
 test_xmlreader(void) {
     int ret = 0;
 
-    printf("Testing xmlreader : 61 of 78 functions ...\n");
+    printf("Testing xmlreader : 62 of 78 functions ...\n");
     ret += test_xmlNewTextReader();
     ret += test_xmlNewTextReaderFilename();
     ret += test_xmlReaderForDoc();
diff --git a/win32/libxml2.def.src b/win32/libxml2.def.src
index 05850f2..7f35a58 100644
--- a/win32/libxml2.def.src
+++ b/win32/libxml2.def.src
@@ -1380,6 +1380,9 @@
 xmlRelaxNGGetValidErrors
 #endif
 #ifdef LIBXML_SCHEMAS_ENABLED
+xmlRelaxNGInitTypes
+#endif
+#ifdef LIBXML_SCHEMAS_ENABLED
 xmlRelaxNGNewDocParserCtxt
 #endif
 #ifdef LIBXML_SCHEMAS_ENABLED
diff --git a/xmlIO.c b/xmlIO.c
index a0701e2..2c73f61 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -551,12 +551,12 @@
 int
 xmlCheckFilename (const char *path)
 {
-    if (path == NULL)
-        return(0);
-
 #ifdef HAVE_STAT
     struct stat stat_buffer;
 
+    if (path == NULL)
+        return(0);
+
     if (stat(path, &stat_buffer) == -1)
         return 0;
 
@@ -566,6 +566,9 @@
     }
 #endif
 #endif
+    if (path == NULL)
+        return(0);
+
     return 1;
 }