fixing bug #141384 where the reader didn't call the deregistering

* xmllint.c xmlreader.c: fixing bug #141384 where the reader didn't
  call the deregistering functions. Also added the check to
  xmllint --stream --chkregister .
Daniel
diff --git a/ChangeLog b/ChangeLog
index 15f31fc..d9d117a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Apr 30 18:12:31 CEST 2004 Daniel Veillard <daniel@veillard.com>
+
+	* xmllint.c xmlreader.c: fixing bug #141384 where the reader didn't
+	  call the deregistering functions. Also added the check to
+	  xmllint --stream --chkregister .
+
 Fri Apr 30 08:57:47 CEST 2004 Daniel Veillard <daniel@veillard.com>
 
 	* win32/Makefile.msvc: applied a second patch from Mark Vakoc for
diff --git a/xmllint.c b/xmllint.c
index 31fc262..d474d20 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -160,6 +160,7 @@
 static int walker = 0;
 #endif /* LIBXML_READER_ENABLED */
 static int chkregister = 0;
+static int nbregister = 0;
 #ifdef LIBXML_SAX1_ENABLED
 static int sax1 = 0;
 #endif /* LIBXML_SAX1_ENABLED */
@@ -1517,6 +1518,7 @@
 {
     node->_private = malloc(sizeof(long));
     *(long*)node->_private = (long) 0x81726354;
+    nbregister++;
 }
 
 static void deregisterNode(xmlNodePtr node)
@@ -1524,6 +1526,7 @@
     assert(node->_private != NULL);
     assert(*(long*)node->_private == (long) 0x81726354);
     free(node->_private);
+    nbregister--;
 }
 
 int
@@ -1975,12 +1978,19 @@
 		if (ctxt != NULL)
 		    xmlFreeParserCtxt(ctxt);
 	    } else {
+		nbregister = 0;
+
 #ifdef LIBXML_READER_ENABLED
 		if (stream != 0)
 		    streamFile(argv[i]);
 		else
 #endif /* LIBXML_READER_ENABLED */
 		    parseAndPrintFile(argv[i], NULL);
+
+                if ((chkregister) && (nbregister != 0)) {
+		    fprintf(stderr, "Registration count off: %d\n", nbregister);
+		    progresult = 8;
+		}
 	    }
 	    files ++;
 	    if ((timing) && (repeat)) {
diff --git a/xmlreader.c b/xmlreader.c
index 2c03b0b..f3225aa 100644
--- a/xmlreader.c
+++ b/xmlreader.c
@@ -255,6 +255,9 @@
     dict = reader->ctxt->dict;
     if (cur == NULL) return;
 
+    if ((__xmlRegisterCallbacks) && (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) ||
@@ -329,6 +332,10 @@
 		    xmlTextReaderFreeNodeList(reader, cur->children);
 		cur->children = NULL;
 	    }
+
+	    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
+		xmlDeregisterNodeDefaultValue(cur);
+
 	    if (((cur->type == XML_ELEMENT_NODE) ||
 		 (cur->type == XML_XINCLUDE_START) ||
 		 (cur->type == XML_XINCLUDE_END)) &&
@@ -399,6 +406,10 @@
 	    xmlTextReaderFreeNodeList(reader, cur->children);
 	cur->children = NULL;
     }
+
+    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
+	xmlDeregisterNodeDefaultValue(cur);
+
     if (((cur->type == XML_ELEMENT_NODE) ||
 	 (cur->type == XML_XINCLUDE_START) ||
 	 (cur->type == XML_XINCLUDE_END)) &&
@@ -422,6 +433,7 @@
     if ((cur->type != XML_TEXT_NODE) &&
         (cur->type != XML_COMMENT_NODE))
 	DICT_FREE(cur->name);
+
     if (((cur->type == XML_ELEMENT_NODE) ||
 	 (cur->type == XML_TEXT_NODE)) &&
 	(reader != NULL) && (reader->ctxt != NULL) &&
@@ -458,6 +470,9 @@
 
     if (cur == NULL) return;
 
+    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
+	xmlDeregisterNodeDefaultValue((xmlNodePtr) cur);
+
     /*
      * Do this before freeing the children list to avoid ID lookups
      */
@@ -488,6 +503,7 @@
     if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs);
     if (cur->URL != NULL) xmlFree((char *) cur->URL);
     if (cur->dict != NULL) xmlDictFree(cur->dict);
+
     xmlFree(cur);
 }