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/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;