applied an old patch from Lukas Schroeder to track node creation and

* global.data globals.c tree.c include/libxml/globals.h: applied
  an old patch from Lukas Schroeder to track node creation and
  destruction. Probably missing a lot of references at the moment
  and not usable reliably.
Daniel
diff --git a/tree.c b/tree.c
index 67b7d16..7df24d5 100644
--- a/tree.c
+++ b/tree.c
@@ -338,6 +338,8 @@
 	doc->extSubset = cur;
     cur->doc = doc;
 
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
 
@@ -463,6 +465,10 @@
 #endif
 	return;
     }
+
+    if (xmlDeregisterNodeDefaultValue)
+	xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
+
     if (cur->children != NULL) {
 	xmlNodePtr next, c = cur->children;
 
@@ -530,6 +536,9 @@
     cur->compression = -1; /* not initialized */
     cur->doc = cur;
     cur->charset = XML_CHAR_ENCODING_UTF8;
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
 
@@ -550,6 +559,10 @@
 #endif
 	return;
     }
+
+    if (xmlDeregisterNodeDefaultValue)
+	xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
+
     /*
      * Do this before freeing the children list to avoid ID lookups
      */
@@ -1127,6 +1140,9 @@
 	    cur->prev = prev;
 	}
     }
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
 
@@ -1204,6 +1220,9 @@
 	    cur->prev = prev;
 	}
     }
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
 
@@ -1333,6 +1352,9 @@
 	    tmp = tmp->next;
 	}
     }
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
 
@@ -1374,6 +1396,10 @@
 #endif
 	return;
     }
+
+    if (xmlDeregisterNodeDefaultValue)
+	xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
+
     /* Check for ID removal -> leading to invalid references ! */
     if ((cur->parent != NULL) && (cur->parent->doc != NULL) &&
 	((cur->parent->doc->intSubset != NULL) ||
@@ -1471,6 +1497,9 @@
     if (content != NULL) {
 	cur->content = xmlStrdup(content);
     }
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
     return(cur);
 }
 
@@ -1509,6 +1538,9 @@
     
     cur->name = xmlStrdup(name);
     cur->ns = ns;
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
 
@@ -1579,6 +1611,7 @@
 	    UPDATE_LAST_CHILD_AND_PARENT(cur)
 	}
     }
+
     return(cur);
 }
 
@@ -1667,6 +1700,9 @@
     cur->type = XML_DOCUMENT_FRAG_NODE;
 
     cur->doc = doc;
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
 
@@ -1697,6 +1733,9 @@
     if (content != NULL) {
 	cur->content = xmlStrdup(content);
     }
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
 
@@ -1797,6 +1836,9 @@
 	    cur->name = xmlStrndup(name, len);
     } else
 	cur->name = xmlStrdup(name);
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
 
@@ -1848,6 +1890,9 @@
 	cur->children = (xmlNodePtr) ent;
 	cur->last = (xmlNodePtr) ent;
     }
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
 
@@ -1896,6 +1941,9 @@
     if (content != NULL) {
 	cur->content = xmlStrndup(content, len);
     }
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
 
@@ -1945,6 +1993,9 @@
     if (content != NULL) {
 	cur->content = xmlStrdup(content);
     }
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
 
@@ -1977,6 +2028,9 @@
     if (content != NULL) {
 	cur->content = xmlStrndup(content, len);
     }
+
+    if (xmlRegisterNodeDefaultValue)
+	xmlRegisterNodeDefaultValue(cur);
     return(cur);
 }
 
@@ -2398,6 +2452,9 @@
     /*
      * add the first element at the end of the children list.
      */
+    if (cur->parent == parent)
+	return(cur);
+
     if (parent->children == NULL) {
         parent->children = cur;
     } else {
@@ -2407,7 +2464,7 @@
 	if ((cur->type == XML_TEXT_NODE) && 
 	    (parent->last->type == XML_TEXT_NODE) &&
 	    (cur->name == parent->last->name)) {
-	    xmlNodeAddContent(parent->last, cur->content);
+    	    xmlNodeAddContent(parent->last, cur->content);
 	    /*
 	     * if it's the only child, nothing more to be done.
 	     */
@@ -2477,13 +2534,15 @@
      */
     if (cur->type == XML_TEXT_NODE) {
 	if ((parent->type == XML_TEXT_NODE) &&
-	    (parent->content != NULL)) {
+	    (parent->content != NULL) &&
+	    (parent != cur)) {
 	    xmlNodeAddContent(parent, cur->content);
 	    xmlFreeNode(cur);
 	    return(parent);
 	}
 	if ((parent->last != NULL) && (parent->last->type == XML_TEXT_NODE) &&
-	    (parent->last->name == cur->name)) {
+	    (parent->last->name == cur->name) &&
+	    (parent->last != cur)) {
 	    xmlNodeAddContent(parent->last, cur->content);
 	    xmlFreeNode(cur);
 	    return(parent->last);
@@ -2493,16 +2552,23 @@
     /*
      * add the new element at the end of the children list.
      */
+    prev = cur->parent;
     cur->parent = parent;
     if (cur->doc != parent->doc) {
 	xmlSetTreeDoc(cur, parent->doc);
     }
+    /* this check prevents a loop on tree-traversions if a developer
+     * tries to add a node to its parent multiple times
+     */
+    if (prev == parent)
+	return(cur);
 
     /*
      * Coalescing
      */
     if ((parent->type == XML_TEXT_NODE) &&
-	(parent->content != NULL)) {
+	(parent->content != NULL) &&
+	(parent != cur)) {
 	xmlNodeAddContent(parent, cur->content);
 	xmlFreeNode(cur);
 	return(parent);
@@ -2588,6 +2654,10 @@
         next = cur->next;
 	/* unroll to speed up freeing the document */
 	if (cur->type != XML_DTD_NODE) {
+
+	    if (xmlDeregisterNodeDefaultValue)
+		xmlDeregisterNodeDefaultValue(cur);
+
 	    if ((cur->children != NULL) &&
 		(cur->type != XML_ENTITY_REF_NODE))
 		xmlFreeNodeList(cur->children);
@@ -2655,6 +2725,7 @@
 #endif
 	return;
     }
+
     /* use xmlFreeDtd for DTD nodes */
     if (cur->type == XML_DTD_NODE) {
 	xmlFreeDtd((xmlDtdPtr) cur);
@@ -2668,6 +2739,10 @@
 	xmlFreeProp((xmlAttrPtr) cur);
 	return;
     }
+
+    if (xmlDeregisterNodeDefaultValue)
+	xmlDeregisterNodeDefaultValue(cur);
+
     if ((cur->children != NULL) &&
 	(cur->type != XML_ENTITY_REF_NODE))
 	xmlFreeNodeList(cur->children);