adding XInclude support to the reader interface. Lot of testing of the

* xinclude.c xmlreader.c include/libxml/xinclude.h: adding XInclude
  support to the reader interface. Lot of testing of the walker,
  various bug fixes.
* xmllint.c: added --walker and made sure --xinclude --stream --debug
  works as expected
* Makefile.am result/dtd11.rdr result/ent6.rdr test/dtd11 test/ent6
  result/XInclude/*.rdr: added regression tests for the walker and
  XInclude xmlReader support, had to slightly change a couple of tests
  because the walker can't distinguish <foo/> from <foo></foo>
Daniel
diff --git a/ChangeLog b/ChangeLog
index 38386a7..aaccd9b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Mon Nov  3 13:26:32 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+	* xinclude.c xmlreader.c include/libxml/xinclude.h: adding XInclude
+	  support to the reader interface. Lot of testing of the walker,
+	  various bug fixes.
+	* xmllint.c: added --walker and made sure --xinclude --stream --debug
+	  works as expected
+	* Makefile.am result/dtd11.rdr result/ent6.rdr test/dtd11 test/ent6
+	  result/XInclude/*.rdr: added regression tests for the walker and
+	  XInclude xmlReader support, had to slightly change a couple of tests
+	  because the walker can't distinguish <foo/> from <foo></foo>
+
 Sat Nov  1 17:42:27 CET 2003 Daniel Veillard <daniel@veillard.com>
 
 	* tree.c nanohttp.c threads.c: second BeOS patch from 
diff --git a/Makefile.am b/Makefile.am
index c501ad1..2e2e445 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -414,6 +414,22 @@
 	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
+	@(echo > .memdump)
+	@echo "## XInclude xmlReader regression tests"
+	-@(for i in $(srcdir)/test/XInclude/docs/* ; do \
+	  name=`basename $$i`; \
+	  if [ ! -d $$i ] ; then \
+	  if [ ! -f $(srcdir)/result/XInclude/$$name.rdr ] ; then \
+	      echo New test file $$name ; \
+	      $(CHECKER) $(top_builddir)/xmllint --nowarning --xinclude --walker --debug $$i > $(srcdir)/result/XInclude/$$name.rdr ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	  else \
+	      log=`$(CHECKER) $(top_builddir)/xmllint --nowarning --xinclude --stream --debug $$i 2>&1 > result.$$name | grep -v 'failed to load external entity' ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	      diff $(srcdir)/result/XInclude/$$name.rdr result.$$name` ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      rm result.$$name ; \
+	  fi ; fi ; done)
 
 Scripttests : xmllint$(EXEEXT)
 	@(echo > .memdump)
@@ -547,7 +563,22 @@
 	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
-
+	@(echo > .memdump)
+	@echo "## Walker regression tests"
+	-@(for i in $(srcdir)/test/* ; do \
+	  name=`basename $$i`; \
+	  if [ ! -d $$i ] ; then \
+	  if [ ! -f $(srcdir)/result/$$name.rdr ] ; then \
+	      echo New test file $$name ; \
+	      $(CHECKER) $(top_builddir)/xmllint --nonet --debug --walker $$i > $(srcdir)/result/$$name.rdr 2>/dev/null ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	  else \
+	      log=`$(CHECKER) $(top_builddir)/xmllint --nonet --debug --walker $$i > result.$$name 2>/dev/null ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	      diff $(srcdir)/result/$$name.rdr result.$$name` ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      rm result.$$name ; \
+	  fi ; fi ; done)
 SAXtests : testSAX$(EXEEXT)
 	@(echo > .memdump)
 	@echo "## SAX callbacks regression tests"
diff --git a/include/libxml/xinclude.h b/include/libxml/xinclude.h
index 3c4b787..c952d3a 100644
--- a/include/libxml/xinclude.h
+++ b/include/libxml/xinclude.h
@@ -19,11 +19,35 @@
 extern "C" {
 #endif
 
-XMLPUBFUN int XMLCALL	
-		xmlXIncludeProcess	    (xmlDocPtr doc);
-XMLPUBFUN int XMLCALL	
-		xmlXIncludeProcessTree	    (xmlNodePtr tree);
+#define XINCLUDE_NS (const xmlChar *) "http://www.w3.org/2001/XInclude"
+#define XINCLUDE_NODE (const xmlChar *) "include"
+#define XINCLUDE_FALLBACK (const xmlChar *) "fallback"
+#define XINCLUDE_HREF (const xmlChar *) "href"
+#define XINCLUDE_PARSE (const xmlChar *) "parse"
+#define XINCLUDE_PARSE_XML (const xmlChar *) "xml"
+#define XINCLUDE_PARSE_TEXT (const xmlChar *) "text"
+#define XINCLUDE_PARSE_ENCODING (const xmlChar *) "encoding"
 
+typedef struct _xmlXIncludeCtxt xmlXIncludeCtxt;
+typedef xmlXIncludeCtxt *xmlXIncludeCtxtPtr;
+
+/*
+ * standalone processing
+ */
+XMLPUBFUN int XMLCALL	
+		xmlXIncludeProcess	(xmlDocPtr doc);
+XMLPUBFUN int XMLCALL	
+		xmlXIncludeProcessTree	(xmlNodePtr tree);
+/*
+ * contextual processing
+ */
+XMLPUBFUN xmlXIncludeCtxtPtr XMLCALL
+		xmlXIncludeNewContext	(xmlDocPtr doc);
+XMLPUBFUN void XMLCALL
+		xmlXIncludeFreeContext	(xmlXIncludeCtxtPtr ctxt);
+XMLPUBFUN int XMLCALL
+		xmlXIncludeProcessNode	(xmlXIncludeCtxtPtr ctxt,
+					 xmlNodePtr tree);
 #ifdef __cplusplus
 }
 #endif
diff --git a/result/XInclude/docids.xml.rdr b/result/XInclude/docids.xml.rdr
new file mode 100644
index 0000000..dedeb67
--- /dev/null
+++ b/result/XInclude/docids.xml.rdr
@@ -0,0 +1,35 @@
+0 10 book 0 0
+0 1 book 0 0
+1 14 #text 0 1 
+
+1 1 doc 0 0
+2 14 #text 0 1 
+
+2 1 isid 1 0
+2 14 #text 0 1 
+
+2 1 isid 1 0
+2 14 #text 0 1 
+
+1 15 doc 0 0
+1 14 #text 0 1 
+
+1 8 #comment 0 1  including another XML document with IDs 
+1 14 #text 0 1 
+
+1 1 doc 0 0
+2 14 #text 0 1 
+
+2 1 isid 1 0
+2 14 #text 0 1 
+
+2 1 isid 1 0
+2 14 #text 0 1 
+
+2 1 isid 1 0
+2 14 #text 0 1 
+
+1 15 doc 0 0
+1 14 #text 0 1 
+
+0 15 book 0 0
diff --git a/result/XInclude/fallback.xml.rdr b/result/XInclude/fallback.xml.rdr
new file mode 100644
index 0000000..82072f7
--- /dev/null
+++ b/result/XInclude/fallback.xml.rdr
@@ -0,0 +1,12 @@
+0 1 x 0 0
+1 14 #text 0 1 
+   
+1 8 #comment 0 1  Simple test of a fallback on unavailble URI 
+1 14 #text 0 1 
+   
+1 1 warning 0 0
+2 3 #text 0 1 Inclusion failed
+1 15 warning 0 0
+1 14 #text 0 1 
+
+0 15 x 0 0
diff --git a/result/XInclude/include.xml.rdr b/result/XInclude/include.xml.rdr
new file mode 100644
index 0000000..66135a4
--- /dev/null
+++ b/result/XInclude/include.xml.rdr
@@ -0,0 +1,28 @@
+0 1 x 0 0
+1 14 #text 0 1 
+   
+1 8 #comment 0 1  Simple test of including another XML document 
+1 14 #text 0 1 
+   
+1 1 doc 0 0
+2 14 #text 0 1 
+
+2 1 p 0 0
+3 3 #text 0 1 something
+2 15 p 0 0
+2 14 #text 0 1 
+
+2 1 p 0 0
+3 3 #text 0 1 really
+2 15 p 0 0
+2 14 #text 0 1 
+
+2 1 p 0 0
+3 3 #text 0 1 simple
+2 15 p 0 0
+2 14 #text 0 1 
+
+1 15 doc 0 0
+1 14 #text 0 1 
+
+0 15 x 0 0
diff --git a/result/XInclude/nodes.xml.rdr b/result/XInclude/nodes.xml.rdr
new file mode 100644
index 0000000..0e53878
--- /dev/null
+++ b/result/XInclude/nodes.xml.rdr
@@ -0,0 +1,18 @@
+0 1 x 0 0
+1 14 #text 0 1 
+   
+1 8 #comment 0 1  Simple test of including a set of nodes from an XML document 
+1 14 #text 0 1 
+   
+1 1 p 0 0
+2 3 #text 0 1 something
+1 15 p 0 0
+1 1 p 0 0
+2 3 #text 0 1 really
+1 15 p 0 0
+1 1 p 0 0
+2 3 #text 0 1 simple
+1 15 p 0 0
+1 14 #text 0 1 
+
+0 15 x 0 0
diff --git a/result/XInclude/recursive.xml.rdr b/result/XInclude/recursive.xml.rdr
new file mode 100644
index 0000000..cafce16
--- /dev/null
+++ b/result/XInclude/recursive.xml.rdr
@@ -0,0 +1,6 @@
+0 1 this 0 0
+1 1 sub-inc 0 0
+2 3 #text 0 1 is a test
+
+1 15 sub-inc 0 0
+0 15 this 0 0
diff --git a/result/XInclude/tstencoding.xml.rdr b/result/XInclude/tstencoding.xml.rdr
new file mode 100644
index 0000000..a0cc69b
--- /dev/null
+++ b/result/XInclude/tstencoding.xml.rdr
@@ -0,0 +1,11 @@
+0 1 x 0 0
+1 14 #text 0 1 
+   
+1 8 #comment 0 1  Simple test of including another text document 
+1 14 #text 0 1 
+   
+1 3 #text 0 1 test with accents in ISO-8859-1: À Á é è
+
+1 14 #text 0 1 
+
+0 15 x 0 0
diff --git a/result/XInclude/txtinclude.xml.rdr b/result/XInclude/txtinclude.xml.rdr
new file mode 100644
index 0000000..a4cc3b4
--- /dev/null
+++ b/result/XInclude/txtinclude.xml.rdr
@@ -0,0 +1,11 @@
+0 1 x 0 0
+1 14 #text 0 1 
+   
+1 8 #comment 0 1  Simple test of including another text document 
+1 14 #text 0 1 
+   
+1 3 #text 0 1 this is some text in ASCII
+
+1 14 #text 0 1 
+
+0 15 x 0 0
diff --git a/result/dtd11.rdr b/result/dtd11.rdr
index f00971d..9b0a34d 100644
--- a/result/dtd11.rdr
+++ b/result/dtd11.rdr
@@ -1,3 +1,2 @@
 0 10 doc 0 0
-0 1 doc 0 0
-0 15 doc 0 0
+0 1 doc 1 0
diff --git a/result/ent6.rdr b/result/ent6.rdr
index f00971d..9b0a34d 100644
--- a/result/ent6.rdr
+++ b/result/ent6.rdr
@@ -1,3 +1,2 @@
 0 10 doc 0 0
-0 1 doc 0 0
-0 15 doc 0 0
+0 1 doc 1 0
diff --git a/test/dtd11 b/test/dtd11
index b32675f..bdd512b 100644
--- a/test/dtd11
+++ b/test/dtd11
@@ -2,4 +2,4 @@
 <!ELEMENT doc (#PCDATA)>
 <!ATTLIST doc val CDATA #IMPLIED>
 ]>
-<doc val="v1"></doc>
+<doc val="v1"/>
diff --git a/test/ent6 b/test/ent6
index 2c880fd..40b2f12 100644
--- a/test/ent6
+++ b/test/ent6
@@ -5,4 +5,4 @@
 <!ENTITY apos   "&#39;"> 
 <!ENTITY quot   "&#34;"> 
 ]>
-<doc></doc>
+<doc/>
diff --git a/xinclude.c b/xinclude.c
index c992b58..6358f1e 100644
--- a/xinclude.c
+++ b/xinclude.c
@@ -26,14 +26,6 @@
 #ifdef LIBXML_XINCLUDE_ENABLED
 #include <libxml/xinclude.h>
 
-#define XINCLUDE_NS (const xmlChar *) "http://www.w3.org/2001/XInclude"
-#define XINCLUDE_NODE (const xmlChar *) "include"
-#define XINCLUDE_FALLBACK (const xmlChar *) "fallback"
-#define XINCLUDE_HREF (const xmlChar *) "href"
-#define XINCLUDE_PARSE (const xmlChar *) "parse"
-#define XINCLUDE_PARSE_XML (const xmlChar *) "xml"
-#define XINCLUDE_PARSE_TEXT (const xmlChar *) "text"
-#define XINCLUDE_PARSE_ENCODING (const xmlChar *) "encoding"
 
 #define XINCLUDE_MAX_DEPTH 40
 
@@ -68,8 +60,6 @@
     xmlXPathObjectPtr    xptr; /* the xpointer if needed */
 };
 
-typedef struct _xmlXIncludeCtxt xmlXIncludeCtxt;
-typedef xmlXIncludeCtxt *xmlXIncludeCtxtPtr;
 struct _xmlXIncludeCtxt {
     xmlDocPtr             doc; /* the source document */
     int               incBase; /* the first include for this document */
@@ -232,7 +222,7 @@
  *
  * Returns the new set
  */
-static xmlXIncludeCtxtPtr
+xmlXIncludeCtxtPtr
 xmlXIncludeNewContext(xmlDocPtr doc) {
     xmlXIncludeCtxtPtr ret;
 
@@ -330,7 +320,7 @@
  *
  * Free an XInclude context
  */
-static void
+void
 xmlXIncludeFreeContext(xmlXIncludeCtxtPtr ctxt) {
     int i;
 
@@ -2118,5 +2108,28 @@
     return(ret);
 }
 
+/**
+ * xmlXIncludeProcessNode:
+ * @ctxt: an existing XInclude context
+ * @node: a node in an XML document
+ *
+ * Implement the XInclude substitution for the given subtree reusing
+ * the informations and data coming from the given context.
+ *
+ * Returns 0 if no substitution were done, -1 if some processing failed
+ *    or the number of substitutions done.
+ */
+int
+xmlXIncludeProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) {
+    int ret = 0;
+
+    if ((node == NULL) || (node->doc == NULL) || (ctxt == NULL))
+	return(-1);
+    ret = xmlXIncludeDoProcess(ctxt, node->doc, node);
+    if ((ret >= 0) && (ctxt->nbErrors > 0))
+	ret = -1;
+    return(ret);
+}
+
 #else /* !LIBXML_XINCLUDE_ENABLED */
 #endif
diff --git a/xmllint.c b/xmllint.c
index 8b91fff..f8556d0 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -153,6 +153,7 @@
 #endif
 #ifdef LIBXML_READER_ENABLED
 static int stream = 0;
+static int walker = 0;
 #endif /* LIBXML_READER_ENABLED */
 static int chkregister = 0;
 #ifdef LIBXML_SAX1_ENABLED
@@ -603,7 +604,7 @@
 
     name = xmlTextReaderConstName(reader);
     if (name == NULL)
-	name = xmlStrdup(BAD_CAST "--");
+	name = BAD_CAST "--";
 
     value = xmlTextReaderConstValue(reader);
 
@@ -638,12 +639,12 @@
 	if (base == (void *) MAP_FAILED)
 	    return;
 
-	input = xmlParserInputBufferCreateStatic((char *) base, info.st_size,
-	                                      XML_CHAR_ENCODING_NONE);
-	reader = xmlNewTextReader(input, filename);
+	reader = xmlReaderForMemory(base, info.st_size, filename,
+	                            NULL, options);
     } else
 #endif
-	reader = xmlNewTextReaderFilename(filename);
+	reader = xmlReaderForFile(filename, NULL, options);
+
 
     if (reader != NULL) {
 #ifdef LIBXML_VALID_ENABLED
@@ -734,6 +735,35 @@
     }
 #endif
 }
+
+static void walkDoc(xmlDocPtr doc) {
+    xmlTextReaderPtr reader;
+    int ret;
+
+    reader = xmlReaderWalker(doc);
+    if (reader != NULL) {
+	if ((timing) && (!repeat)) {
+	    startTimer();
+	}
+	ret = xmlTextReaderRead(reader);
+	while (ret == 1) {
+	    if (debug)
+		processNode(reader);
+	    ret = xmlTextReaderRead(reader);
+	}
+	if ((timing) && (!repeat)) {
+	    endTimer("walking through the doc");
+	}
+	xmlFreeTextReader(reader);
+	if (ret != 0) {
+	    printf("failed to walk through the doc\n");
+	    progresult = 1;
+	}
+    } else {
+	fprintf(stderr, "Failed to crate a reader from the document\n");
+	progresult = 1;
+    }
+}
 #endif /* LIBXML_READER_ENABLED */
 
 /************************************************************************
@@ -1006,6 +1036,11 @@
 	}    
     }else
 #endif /* LIBXML_VALID_ENABLED */
+#ifdef LIBXML_READER_ENABLED
+    if (walker) {
+        walkDoc(doc);
+    }
+#endif /* LIBXML_READER_ENABLED */
 #ifdef LIBXML_OUTPUT_ENABLED
     if (noout == 0) {
 	/*
@@ -1386,6 +1421,7 @@
     printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n");
 #ifdef LIBXML_READER_ENABLED
     printf("\t--stream : use the streaming interface to process very large files\n");
+    printf("\t--walker : create a reader and walk though the resulting doc\n");
 #endif /* LIBXML_READER_ENABLED */
     printf("\t--chkregister : verify the node registration code\n");
 #ifdef LIBXML_SCHEMAS_ENABLED
@@ -1553,7 +1589,7 @@
 	else if ((!strcmp(argv[i], "-xinclude")) ||
 	         (!strcmp(argv[i], "--xinclude"))) {
 	    xinclude++;
-	    /* options |= XML_PARSE_XINCLUDE; */
+	    options |= XML_PARSE_XINCLUDE;
 	}
 #endif
 #ifdef LIBXML_OUTPUT_ENABLED
@@ -1620,6 +1656,11 @@
 	         (!strcmp(argv[i], "--stream"))) {
 	     stream++;
 	}
+	else if ((!strcmp(argv[i], "-walker")) ||
+	         (!strcmp(argv[i], "--walker"))) {
+	     walker++;
+             noout++;
+	}
 #endif /* LIBXML_READER_ENABLED */
 #ifdef LIBXML_SAX1_ENABLED
 	else if ((!strcmp(argv[i], "-sax1")) ||
diff --git a/xmlreader.c b/xmlreader.c
index 60b73f5..c464335 100644
--- a/xmlreader.c
+++ b/xmlreader.c
@@ -38,6 +38,9 @@
 #include <libxml/parserInternals.h>
 #include <libxml/relaxng.h>
 #include <libxml/uri.h>
+#ifdef LIBXML_XINCLUDE_ENABLED
+#include <libxml/xinclude.h>
+#endif
 
 /* #define DEBUG_CALLBACKS */
 /* #define DEBUG_READER */
@@ -132,10 +135,17 @@
 
 #ifdef LIBXML_SCHEMAS_ENABLED
     /* Handling of RelaxNG validation */
-    xmlRelaxNGPtr          rngSchemas;   /* The Relax NG schemas */
-    xmlRelaxNGValidCtxtPtr rngValidCtxt; /* The Relax NG validation context */
-    int                  rngValidErrors; /* The number of errors detected */
-    xmlNodePtr             rngFullNode;  /* the node if RNG not progressive */
+    xmlRelaxNGPtr          rngSchemas;	/* The Relax NG schemas */
+    xmlRelaxNGValidCtxtPtr rngValidCtxt;/* The Relax NG validation context */
+    int                  rngValidErrors;/* The number of errors detected */
+    xmlNodePtr             rngFullNode;	/* the node if RNG not progressive */
+#endif
+#ifdef LIBXML_XINCLUDE_ENABLED
+    /* Handling of XInclude processing */
+    int                xinclude;	/* is xinclude asked for */
+    const xmlChar *    xinclude_name;	/* the xinclude name from dict */
+    xmlXIncludeCtxtPtr xincctxt;	/* the xinclude context */
+    int                in_xinclude;	/* counts for xinclude */
 #endif
 };
 
@@ -1155,6 +1165,7 @@
     if (oldstate != XML_TEXTREADER_BACKTRACK) {
 	if ((reader->node->children != NULL) &&
 	    (reader->node->type != XML_ENTITY_REF_NODE) &&
+	    (reader->node->type != XML_XINCLUDE_START) &&
 	    (reader->node->type != XML_DTD_NODE)) {
 	    reader->node = reader->node->children;
 	    reader->depth++;
@@ -1166,7 +1177,8 @@
 	if ((oldstate == XML_TEXTREADER_ELEMENT) &&
             (reader->node->type == XML_ELEMENT_NODE) &&
 	    (reader->node->children == NULL) &&
-	    ((reader->node->extra & NODE_IS_EMPTY) == 0)) {
+	    ((reader->node->extra & NODE_IS_EMPTY) == 0) &&
+	    (reader->in_xinclude <= 0)) {
 	    reader->state = XML_TEXTREADER_END;
 	    goto node_found;
 	}
@@ -1246,6 +1258,32 @@
             xmlTextReaderExpand(reader);
     }
 
+#ifdef LIBXML_XINCLUDE_ENABLED
+    /*
+     * Handle XInclude if asked for
+     */
+    if ((reader->xinclude) && (reader->node != NULL) &&
+	(reader->node->type == XML_ELEMENT_NODE) &&
+	(reader->node->ns != NULL) &&
+	(xmlStrEqual(reader->node->ns->href, XINCLUDE_NS))) {
+	if (reader->xincctxt == NULL) {
+	    reader->xincctxt = xmlXIncludeNewContext(reader->ctxt->myDoc);
+	}
+	/*
+	 * expand that node and process it
+	 */
+	xmlTextReaderExpand(reader);
+	xmlXIncludeProcessNode(reader->xincctxt, reader->node);
+    }
+    if (reader->node->type == XML_XINCLUDE_START) {
+        reader->in_xinclude++;
+	goto get_next_node;
+    } 
+    if (reader->node->type == XML_XINCLUDE_END) {
+        reader->in_xinclude--;
+	goto get_next_node;
+    }
+#endif
     /*
      * Handle entities enter and exit when in entity replacement mode
      */
@@ -1491,14 +1529,14 @@
 static int
 xmlTextReaderNextTree(xmlTextReaderPtr reader)
 {
-    if (reader == 0)
+    if (reader == NULL)
         return(-1);
 
     if (reader->state == XML_TEXTREADER_END)
         return(0);
 
-    if (reader->node == 0) {
-        if (reader->doc->children == 0) {
+    if (reader->node == NULL) {
+        if (reader->doc->children == NULL) {
             reader->state = XML_TEXTREADER_END;
             return(0);
         }
@@ -1561,6 +1599,7 @@
     if (reader->state == XML_TEXTREADER_END)
         return(0);
 
+next_node:
     if (reader->node == NULL) {
         if (reader->doc->children == NULL) {
             reader->state = XML_TEXTREADER_END;
@@ -1569,31 +1608,33 @@
 
         reader->node = reader->doc->children;
         reader->state = XML_TEXTREADER_START;
-        return(1);
+        goto found_node;
     }
 
-    if (reader->state != XML_TEXTREADER_BACKTRACK) {
-        if (reader->node->children != 0) {
+    if ((reader->state != XML_TEXTREADER_BACKTRACK) &&
+        (reader->node->type != XML_DTD_NODE) &&
+        (reader->node->type != XML_XINCLUDE_START) &&
+	(reader->node->type != XML_ENTITY_REF_NODE)) {
+        if (reader->node->children != NULL) {
             reader->node = reader->node->children;
             reader->depth++;
             reader->state = XML_TEXTREADER_START;
-            return(1);
+            goto found_node;
         }
 
-        if ((reader->node->type == XML_ELEMENT_NODE) ||
-            (reader->node->type == XML_ATTRIBUTE_NODE)) {
+        if (reader->node->type == XML_ATTRIBUTE_NODE) {
             reader->state = XML_TEXTREADER_BACKTRACK;
-            return(1);
+            goto found_node;
         }
     }
 
-    if (reader->node->next != 0) {
+    if (reader->node->next != NULL) {
         reader->node = reader->node->next;
         reader->state = XML_TEXTREADER_START;
-        return(1);
+        goto found_node;
     }
 
-    if (reader->node->parent != 0) {
+    if (reader->node->parent != NULL) {
         if ((reader->node->parent->type == XML_DOCUMENT_NODE) ||
 	    (reader->node->parent->type == XML_HTML_DOCUMENT_NODE)) {
             reader->state = XML_TEXTREADER_END;
@@ -1603,11 +1644,16 @@
         reader->node = reader->node->parent;
         reader->depth--;
         reader->state = XML_TEXTREADER_BACKTRACK;
-        return(1);
+        goto found_node;
     }
 
     reader->state = XML_TEXTREADER_END;
 
+found_node:
+    if ((reader->node->type == XML_XINCLUDE_START) ||
+        (reader->node->type == XML_XINCLUDE_END))
+	goto next_node;
+
     return(1);
 }
 
@@ -1634,10 +1680,10 @@
     if (reader->state == XML_TEXTREADER_END)
         return(0);
 
-    if (reader->node == 0)
+    if (reader->node == NULL)
         return(xmlTextReaderNextTree(reader));
 
-    if (reader->node->next != 0) {
+    if (reader->node->next != NULL) {
         reader->node = reader->node->next;
         reader->state = XML_TEXTREADER_START;
         return(1);
@@ -1742,6 +1788,9 @@
      */
     ret->ctxt->docdict = 1;
     ret->dict = ret->ctxt->dict;
+#ifdef LIBXML_XINCLUDE_ENABLED
+    ret->xinclude = 0;
+#endif
     return(ret);
 }
 
@@ -1797,6 +1846,10 @@
 	reader->rngValidCtxt = NULL;
     }
 #endif
+#ifdef LIBXML_XINCLUDE_ENABLED
+    if (reader->xincctxt != NULL)
+	xmlXIncludeFreeContext(reader->xincctxt);
+#endif
     if (reader->ctxt != NULL) {
         if (reader->dict == reader->ctxt->dict)
 	    reader->dict = NULL;
@@ -2552,6 +2605,10 @@
 	return(0);
     if (reader->state == XML_TEXTREADER_END)
 	return(0);
+    if (reader->doc != NULL)
+        return(1);
+    if (reader->in_xinclude > 0)
+        return(1);
     return((reader->node->extra & NODE_IS_EMPTY) != 0);
 }
 
@@ -3916,6 +3973,19 @@
      */
     reader->ctxt->docdict = 1;
 
+#ifdef LIBXML_XINCLUDE_ENABLED
+    if (reader->xincctxt != NULL) {
+	xmlXIncludeFreeContext(reader->xincctxt);
+	reader->xincctxt = NULL;
+    }
+    if (options & XML_PARSE_XINCLUDE) {
+        reader->xinclude = 1;
+	reader->xinclude_name = xmlDictLookup(reader->dict, XINCLUDE_NODE, -1);
+	options -= XML_PARSE_XINCLUDE;
+    } else
+        reader->xinclude = 0;
+    reader->in_xinclude = 0;
+#endif
     xmlCtxtUseOptions(reader->ctxt, options);
     if (encoding != NULL) {
         xmlCharEncodingHandlerPtr hdlr;