Added memory debug wrappers, killed all detected memory leaks, Daniel
diff --git a/tree.c b/tree.c
index 34c927a..9e622ff 100644
--- a/tree.c
+++ b/tree.c
@@ -16,6 +16,7 @@
 #include <zlib.h>
 #endif
 
+#include "xmlmemory.h"
 #include "tree.h"
 #include "entities.h"
 #include "valid.h"
@@ -89,7 +90,7 @@
     /*
      * Allocate a new DTD and fill the fields.
      */
-    cur = (xmlNsPtr) malloc(sizeof(xmlNs));
+    cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewNs : malloc failed\n");
 	return(NULL);
@@ -139,7 +140,7 @@
     /*
      * Allocate a new DTD and fill the fields.
      */
-    cur = (xmlNsPtr) malloc(sizeof(xmlNs));
+    cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewGlobalNs : malloc failed\n");
 	return(NULL);
@@ -201,10 +202,10 @@
         fprintf(stderr, "xmlFreeNs : ns == NULL\n");
 	return;
     }
-    if (cur->href != NULL) free((char *) cur->href);
-    if (cur->prefix != NULL) free((char *) cur->prefix);
+    if (cur->href != NULL) xmlFree((char *) cur->href);
+    if (cur->prefix != NULL) xmlFree((char *) cur->prefix);
     memset(cur, -1, sizeof(xmlNs));
-    free(cur);
+    xmlFree(cur);
 }
 
 /**
@@ -251,7 +252,7 @@
     /*
      * Allocate a new DTD and fill the fields.
      */
-    cur = (xmlDtdPtr) malloc(sizeof(xmlDtd));
+    cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewDtd : malloc failed\n");
 	return(NULL);
@@ -304,7 +305,7 @@
     /*
      * Allocate a new DTD and fill the fields.
      */
-    cur = (xmlDtdPtr) malloc(sizeof(xmlDtd));
+    cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewDtd : malloc failed\n");
 	return(NULL);
@@ -344,9 +345,9 @@
         fprintf(stderr, "xmlFreeDtd : DTD == NULL\n");
 	return;
     }
-    if (cur->name != NULL) free((char *) cur->name);
-    if (cur->SystemID != NULL) free((char *) cur->SystemID);
-    if (cur->ExternalID != NULL) free((char *) cur->ExternalID);
+    if (cur->name != NULL) xmlFree((char *) cur->name);
+    if (cur->SystemID != NULL) xmlFree((char *) cur->SystemID);
+    if (cur->ExternalID != NULL) xmlFree((char *) cur->ExternalID);
     if (cur->notations != NULL)
         xmlFreeNotationTable((xmlNotationTablePtr) cur->notations);
     if (cur->elements != NULL)
@@ -356,7 +357,7 @@
     if (cur->entities != NULL)
         xmlFreeEntitiesTable((xmlEntitiesTablePtr) cur->entities);
     memset(cur, -1, sizeof(xmlDtd));
-    free(cur);
+    xmlFree(cur);
 }
 
 /**
@@ -377,7 +378,7 @@
     /*
      * Allocate a new document and fill the fields.
      */
-    cur = (xmlDocPtr) malloc(sizeof(xmlDoc));
+    cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewDoc : malloc failed\n");
 	return(NULL);
@@ -416,16 +417,16 @@
 #endif
 	return;
     }
-    if (cur->version != NULL) free((char *) cur->version);
-    if (cur->name != NULL) free((char *) cur->name);
-    if (cur->encoding != NULL) free((char *) cur->encoding);
-    if (cur->root != NULL) xmlFreeNode(cur->root);
+    if (cur->version != NULL) xmlFree((char *) cur->version);
+    if (cur->name != NULL) xmlFree((char *) cur->name);
+    if (cur->encoding != NULL) xmlFree((char *) cur->encoding);
+    if (cur->root != NULL) xmlFreeNodeList(cur->root);
     if (cur->intSubset != NULL) xmlFreeDtd(cur->intSubset);
     if (cur->extSubset != NULL) xmlFreeDtd(cur->extSubset);
     if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs);
     if (cur->ids != NULL) xmlFreeIDTable((xmlIDTablePtr) cur->ids);
     memset(cur, -1, sizeof(xmlDoc));
-    free(cur);
+    xmlFree(cur);
 }
 
 /**
@@ -501,7 +502,7 @@
 		     */
 		    node = xmlNewReference(doc, val);
 		    if (node == NULL) {
-			if (val != NULL) free(val);
+			if (val != NULL) xmlFree(val);
 		        return(ret);
 		    }
 		    if (last == NULL)
@@ -512,7 +513,7 @@
 			last = node;
 		    }
 		}
-		free(val);
+		xmlFree(val);
 	    }
 	    cur++;
 	    q = cur;
@@ -612,7 +613,7 @@
 		     */
 		    node = xmlNewReference(doc, val);
 		    if (node == NULL) {
-			if (val != NULL) free(val);
+			if (val != NULL) xmlFree(val);
 		        return(ret);
 		    }
 		    if (last == NULL)
@@ -623,7 +624,7 @@
 			last = node;
 		    }
 		}
-		free(val);
+		xmlFree(val);
 	    }
 	    cur++;
 	    q = cur;
@@ -679,7 +680,7 @@
 		buffer = xmlEncodeEntitiesReentrant(doc, node->content);
 		if (buffer != NULL) {
 		    ret = xmlStrcat(ret, buffer);
-		    free(buffer);
+		    xmlFree(buffer);
 		}
             }
 	} else if (node->type == XML_ENTITY_REF_NODE) {
@@ -730,7 +731,7 @@
     /*
      * Allocate a new property and fill the fields.
      */
-    cur = (xmlAttrPtr) malloc(sizeof(xmlAttr));
+    cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewProp : malloc failed\n");
 	return(NULL);
@@ -789,7 +790,7 @@
     /*
      * Allocate a new property and fill the fields.
      */
-    cur = (xmlAttrPtr) malloc(sizeof(xmlAttr));
+    cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewProp : malloc failed\n");
 	return(NULL);
@@ -846,7 +847,7 @@
     /*
      * Allocate a new property and fill the fields.
      */
-    cur = (xmlAttrPtr) malloc(sizeof(xmlAttr));
+    cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewProp : malloc failed\n");
 	return(NULL);
@@ -900,10 +901,10 @@
         fprintf(stderr, "xmlFreeProp : property == NULL\n");
 	return;
     }
-    if (cur->name != NULL) free((char *) cur->name);
+    if (cur->name != NULL) xmlFree((char *) cur->name);
     if (cur->val != NULL) xmlFreeNodeList(cur->val);
     memset(cur, -1, sizeof(xmlAttr));
-    free(cur);
+    xmlFree(cur);
 }
 
 /**
@@ -926,7 +927,7 @@
     /*
      * Allocate a new node and fill the fields.
      */
-    cur = (xmlNodePtr) malloc(sizeof(xmlNode));
+    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewPI : malloc failed\n");
 	return(NULL);
@@ -976,7 +977,7 @@
     /*
      * Allocate a new node and fill the fields.
      */
-    cur = (xmlNodePtr) malloc(sizeof(xmlNode));
+    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewNode : malloc failed\n");
 	return(NULL);
@@ -1043,7 +1044,7 @@
     /*
      * Allocate a new node and fill the fields.
      */
-    cur = (xmlNodePtr) malloc(sizeof(xmlNode));
+    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewText : malloc failed\n");
 	return(NULL);
@@ -1084,7 +1085,7 @@
     /*
      * Allocate a new node and fill the fields.
      */
-    cur = (xmlNodePtr) malloc(sizeof(xmlNode));
+    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewText : malloc failed\n");
 	return(NULL);
@@ -1151,7 +1152,7 @@
     /*
      * Allocate a new node and fill the fields.
      */
-    cur = (xmlNodePtr) malloc(sizeof(xmlNode));
+    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewText : malloc failed\n");
 	return(NULL);
@@ -1209,7 +1210,7 @@
     /*
      * Allocate a new node and fill the fields.
      */
-    cur = (xmlNodePtr) malloc(sizeof(xmlNode));
+    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewComment : malloc failed\n");
 	return(NULL);
@@ -1250,7 +1251,7 @@
     /*
      * Allocate a new node and fill the fields.
      */
-    cur = (xmlNodePtr) malloc(sizeof(xmlNode));
+    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
     if (cur == NULL) {
         fprintf(stderr, "xmlNewCDataBlock : malloc failed\n");
 	return(NULL);
@@ -1438,7 +1439,7 @@
 		text->next->prev = text;
 	    parent->childs = text;
 	    UPDATE_LAST_CHILD(parent)
-	    free(parent->content);
+	    xmlFree(parent->content);
 	    parent->content = NULL;
 	}
     }
@@ -1511,11 +1512,11 @@
     if (cur->childs != NULL) xmlFreeNodeList(cur->childs);
     if (cur->properties != NULL) xmlFreePropList(cur->properties);
     if (cur->type != XML_ENTITY_REF_NODE)
-	if (cur->content != NULL) free(cur->content);
-    if (cur->name != NULL) free((char *) cur->name);
+	if (cur->content != NULL) xmlFree(cur->content);
+    if (cur->name != NULL) xmlFree((char *) cur->name);
     if (cur->nsDef != NULL) xmlFreeNsList(cur->nsDef);
     memset(cur, -1, sizeof(xmlNode));
-    free(cur);
+    xmlFree(cur);
 }
 
 /**
@@ -1688,7 +1689,7 @@
     /*
      * Allocate a new node and fill the fields.
      */
-    ret = (xmlNodePtr) malloc(sizeof(xmlNode));
+    ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
     if (ret == NULL) {
         fprintf(stderr, "xmlStaticCopyNode : malloc failed\n");
 	return(NULL);
@@ -1883,7 +1884,7 @@
     ret = xmlNewDoc(doc->version);
     if (ret == NULL) return(NULL);
     if (doc->name != NULL)
-        ret->name = strdup(doc->name);
+        ret->name = xmlMemStrdup(doc->name);
     if (doc->encoding != NULL)
         ret->encoding = xmlStrdup(doc->encoding);
     ret->compression = doc->compression;
@@ -2007,10 +2008,10 @@
         case XML_DOCUMENT_FRAG_NODE:
         case XML_ELEMENT_NODE:
 	    if (cur->content != NULL) {
-	        free(cur->content);
+	        xmlFree(cur->content);
 		cur->content = NULL;
 	    }
-	    if (cur->childs != NULL) xmlFreeNode(cur->childs);
+	    if (cur->childs != NULL) xmlFreeNodeList(cur->childs);
 	    cur->childs = xmlStringGetNodeList(cur->doc, content);
 	    UPDATE_LAST_CHILD(cur)
 	    break;
@@ -2022,8 +2023,8 @@
         case XML_ENTITY_NODE:
         case XML_PI_NODE:
         case XML_COMMENT_NODE:
-	    if (cur->content != NULL) free(cur->content);
-	    if (cur->childs != NULL) xmlFreeNode(cur->childs);
+	    if (cur->content != NULL) xmlFree(cur->content);
+	    if (cur->childs != NULL) xmlFreeNodeList(cur->childs);
 	    cur->last = cur->childs = NULL;
 	    if (content != NULL)
 		cur->content = xmlStrdup(content);
@@ -2056,10 +2057,10 @@
         case XML_DOCUMENT_FRAG_NODE:
         case XML_ELEMENT_NODE:
 	    if (cur->content != NULL) {
-	        free(cur->content);
+	        xmlFree(cur->content);
 		cur->content = NULL;
 	    }
-	    if (cur->childs != NULL) xmlFreeNode(cur->childs);
+	    if (cur->childs != NULL) xmlFreeNodeList(cur->childs);
 	    cur->childs = xmlStringLenGetNodeList(cur->doc, content, len);
 	    UPDATE_LAST_CHILD(cur)
 	    break;
@@ -2071,8 +2072,8 @@
         case XML_ENTITY_NODE:
         case XML_PI_NODE:
         case XML_COMMENT_NODE:
-	    if (cur->content != NULL) free(cur->content);
-	    if (cur->childs != NULL) xmlFreeNode(cur->childs);
+	    if (cur->content != NULL) xmlFree(cur->content);
+	    if (cur->childs != NULL) xmlFreeNodeList(cur->childs);
 	    cur->childs = cur->last = NULL;
 	    if (content != NULL)
 		cur->content = xmlStrndup(content, len);
@@ -2083,8 +2084,8 @@
         case XML_DOCUMENT_TYPE_NODE:
 	    break;
         case XML_NOTATION_NODE:
-	    if (cur->content != NULL) free(cur->content);
-	    if (cur->childs != NULL) xmlFreeNode(cur->childs);
+	    if (cur->content != NULL) xmlFree(cur->content);
+	    if (cur->childs != NULL) xmlFreeNodeList(cur->childs);
 	    cur->childs = cur->last = NULL;
 	    if (content != NULL)
 		cur->content = xmlStrndup(content, len);
@@ -2120,7 +2121,7 @@
 	        if (cur->content != NULL) {
 		    cur->childs = xmlStringGetNodeList(cur->doc, cur->content);
 		    UPDATE_LAST_CHILD(cur)
-		    free(cur->content);
+		    xmlFree(cur->content);
 		    cur->content = NULL;
 		    last = cur->last;
 		}
@@ -2216,7 +2217,7 @@
 	cur = node->nsDef;
 	while (cur != NULL) {
 	    if (ret == NULL) {
-	        ret = (xmlNsPtr *) malloc((maxns + 1) * sizeof(xmlNsPtr));
+	        ret = (xmlNsPtr *) xmlMalloc((maxns + 1) * sizeof(xmlNsPtr));
 		if (ret == NULL) {
 		    fprintf(stderr, "xmlGetNsList : out of memory!\n");
 		    return(NULL);
@@ -2230,7 +2231,7 @@
 	    if (i >= nbns) {
 	        if (nbns >= maxns) {
 		    maxns *= 2;
-		    ret = (xmlNsPtr *) realloc(ret,
+		    ret = (xmlNsPtr *) xmlRealloc(ret,
 		                         (maxns + 1) * sizeof(xmlNsPtr));
 		    if (ret == NULL) {
 			fprintf(stderr, "xmlGetNsList : realloc failed!\n");
@@ -2365,7 +2366,7 @@
     while (prop != NULL) {
         if (!xmlStrcmp(prop->name, name)) {
 	    if (prop->val != NULL) 
-	        xmlFreeNode(prop->val);
+	        xmlFreeNodeList(prop->val);
 	    prop->val = NULL;
 	    if (value != NULL)
 		prop->val = xmlStringGetNodeList(node->doc, value);
@@ -2430,17 +2431,17 @@
 xmlBufferCreate(void) {
     xmlBufferPtr ret;
 
-    ret = (xmlBufferPtr) malloc(sizeof(xmlBuffer));
+    ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer));
     if (ret == NULL) {
 	fprintf(stderr, "xmlBufferCreate : out of memory!\n");
         return(NULL);
     }
     ret->use = 0;
     ret->size = BASE_BUFFER_SIZE;
-    ret->content = (CHAR *) malloc(ret->size * sizeof(CHAR));
+    ret->content = (CHAR *) xmlMalloc(ret->size * sizeof(CHAR));
     if (ret->content == NULL) {
 	fprintf(stderr, "xmlBufferCreate : out of memory!\n");
-	free(ret);
+	xmlFree(ret);
         return(NULL);
     }
     ret->content[0] = 0;
@@ -2463,10 +2464,10 @@
         fprintf(stderr, "xmlBufferFree: buf->content == NULL\n");
     } else {
         memset(buf->content, -1, BASE_BUFFER_SIZE);
-        free(buf->content);
+        xmlFree(buf->content);
     }
     memset(buf, -1, sizeof(xmlBuffer));
-    free(buf);
+    xmlFree(buf);
 }
 
 /**
@@ -2553,7 +2554,7 @@
         buf->size *= 2;
 	if (buf->use + len + 10 > buf->size)
 	    buf->size = buf->use + len + 10;
-	rebuf = (CHAR *) realloc(buf->content, buf->size * sizeof(CHAR));
+	rebuf = (CHAR *) xmlRealloc(buf->content, buf->size * sizeof(CHAR));
 	if (rebuf == NULL) {
 	    fprintf(stderr, "xmlBufferAdd : out of memory!\n");
 	    return;
@@ -2585,7 +2586,7 @@
 	    CHAR *rebuf;
 
 	    buf->size *= 2;
-	    rebuf = (CHAR *) realloc(buf->content, buf->size * sizeof(CHAR));
+	    rebuf = (CHAR *) xmlRealloc(buf->content, buf->size * sizeof(CHAR));
 	    if (rebuf == NULL) {
 	        fprintf(stderr, "xmlBufferAdd : out of memory!\n");
 		return;
@@ -2616,7 +2617,7 @@
 	    CHAR *rebuf;
 
 	    buf->size *= 2;
-	    rebuf = (CHAR *) realloc(buf->content, buf->size * sizeof(CHAR));
+	    rebuf = (CHAR *) xmlRealloc(buf->content, buf->size * sizeof(CHAR));
 	    if (rebuf == NULL) {
 	        fprintf(stderr, "xmlBufferAdd : out of memory!\n");
 		return;
@@ -2836,7 +2837,7 @@
     if (value) {
 	xmlBufferWriteChar(buf, "=");
 	xmlBufferWriteQuotedString(buf, value);
-	free(value);
+	xmlFree(value);
     } else  {
 	xmlBufferWriteChar(buf, "=\"\"");
     }
@@ -2922,7 +2923,7 @@
             buffer = xmlEncodeEntitiesReentrant(doc, cur->content);
 	    if (buffer != NULL) {
 		xmlBufferWriteCHAR(buf, buffer);
-		free(buffer);
+		xmlFree(buffer);
 	    }
 	}
 	return;
@@ -2987,7 +2988,7 @@
 	buffer = xmlEncodeEntitiesReentrant(doc, cur->content);
 	if (buffer != NULL) {
 	    xmlBufferWriteCHAR(buf, buffer);
-	    free(buffer);
+	    xmlFree(buffer);
 	}
     }
     if (cur->childs != NULL) {