applied patch from Mark Vakoc except the API change, preserved it. updated

* debugXML.c: applied patch from Mark Vakoc except the API
  change, preserved it.
* doc/*: updated the docs to point to the search engine for
  information lookup or before bug/help reports.
Daniel
diff --git a/debugXML.c b/debugXML.c
index 22bbb56..fabcd12 100644
--- a/debugXML.c
+++ b/debugXML.c
@@ -1346,38 +1346,53 @@
 
 
 /**
- * xmlShellPrintNode:
- * @node : a non-null node to print to stdout
+ * xmlShellPrintNodeCtxt:
+ * @ctxt : a non-null shell context
+ * @node : a non-null node to print to the output FILE
  *
- * Print node to stdout
+ * Print node to the output FILE
+ */
+static void
+xmlShellPrintNodeCtxt(xmlShellCtxtPtr ctxt,xmlNodePtr node)
+{
+    if (!ctxt || !node)
+        return;
+
+    if (node->type == XML_DOCUMENT_NODE)
+        xmlDocDump(ctxt->output, (xmlDocPtr) node);
+    else if (node->type == XML_ATTRIBUTE_NODE)
+        xmlDebugDumpAttrList(ctxt->output, (xmlAttrPtr) node, 0);
+    else
+        xmlElemDump(ctxt->output, node->doc, node);
+
+    fprintf(ctxt->output, "\n");
+}
+
+/**
+ * xmlShellPrintNode:
+ * @node : a non-null node to print to the output FILE
+ *
+ * Print node to the output FILE
  */
 void
 xmlShellPrintNode(xmlNodePtr node)
 {
-    if (!node)
-        return;
-
-    if (node->type == XML_DOCUMENT_NODE)
-        xmlDocDump(stdout, (xmlDocPtr) node);
-    else if (node->type == XML_ATTRIBUTE_NODE)
-        xmlDebugDumpAttrList(stdout, (xmlAttrPtr) node, 0);
-    else
-        xmlElemDump(stdout, node->doc, node);
-
-    fprintf(stdout, "\n");
+    xmlShellPrintNodeCtxt(NULL, node);
 }
 
-
 /**
- * xmlShellPrintXPathResult:
+ * xmlShellPrintXPathResultCtxt:
+ * @ctxt: a valid shell context
  * @list: a valid result generated by an xpath evaluation
  *
- * Prints result to stdout
+ * Prints result to the output FILE
  */
-void
-xmlShellPrintXPathResult(xmlXPathObjectPtr list)
+static void
+xmlShellPrintXPathResultCtxt(xmlShellCtxtPtr ctxt,xmlXPathObjectPtr list)
 {
     int i = 0;
+    if (!ctxt)
+       return;
 
     if (list != NULL) {
         switch (list->type) {
@@ -1389,8 +1404,8 @@
                              indx++) {
                             if (i > 0)
                                 fprintf(stderr, " -------\n");
-                            xmlShellPrintNode(list->nodesetval->
-                                              nodeTab[indx]);
+                            xmlShellPrintNodeCtxt(ctxt,
+				    list->nodesetval->nodeTab[indx]);
                         }
                     } else {
                         xmlGenericError(xmlGenericErrorContext,
@@ -1419,6 +1434,18 @@
 }
 
 /**
+ * xmlShellPrintXPathResult:
+ * @list: a valid result generated by an xpath evaluation
+ *
+ * Prints result to the output FILE
+ */
+void
+xmlShellPrintXPathResult(xmlXPathObjectPtr list)
+{
+    xmlShellPrintXPathResultCtxt(NULL, list);
+}
+
+/**
  * xmlShellList:
  * @ctxt:  the shell context
  * @arg:  unused
@@ -1431,29 +1458,31 @@
  * Returns 0
  */
 int
-xmlShellList(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED,
+xmlShellList(xmlShellCtxtPtr ctxt,
              char *arg ATTRIBUTE_UNUSED, xmlNodePtr node,
              xmlNodePtr node2 ATTRIBUTE_UNUSED)
 {
     xmlNodePtr cur;
+    if (!ctxt)
+        return (0);
     if (node == NULL) {
-	fprintf(stdout, "NULL\n");
+	fprintf(ctxt->output, "NULL\n");
 	return (0);
     }
     if ((node->type == XML_DOCUMENT_NODE) ||
         (node->type == XML_HTML_DOCUMENT_NODE)) {
         cur = ((xmlDocPtr) node)->children;
     } else if (node->type == XML_NAMESPACE_DECL) {
-        xmlLsOneNode(stdout, node);
+        xmlLsOneNode(ctxt->output, node);
         return (0);
     } else if (node->children != NULL) {
         cur = node->children;
     } else {
-        xmlLsOneNode(stdout, node);
+        xmlLsOneNode(ctxt->output, node);
         return (0);
     }
     while (cur != NULL) {
-        xmlLsOneNode(stdout, cur);
+        xmlLsOneNode(ctxt->output, cur);
         cur = cur->next;
     }
     return (0);
@@ -1472,22 +1501,24 @@
  * Returns 0
  */
 int
-xmlShellBase(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED,
+xmlShellBase(xmlShellCtxtPtr ctxt,
              char *arg ATTRIBUTE_UNUSED, xmlNodePtr node,
              xmlNodePtr node2 ATTRIBUTE_UNUSED)
 {
     xmlChar *base;
+    if (!ctxt)
+        return 0;
     if (node == NULL) {
-	fprintf(stdout, "NULL\n");
+	fprintf(ctxt->output, "NULL\n");
 	return (0);
     }    
 
     base = xmlNodeGetBase(node->doc, node);
 
     if (base == NULL) {
-        fprintf(stdout, " No base found !!!\n");
+        fprintf(ctxt->output, " No base found !!!\n");
     } else {
-        fprintf(stdout, "%s\n", base);
+        fprintf(ctxt->output, "%s\n", base);
         xmlFree(base);
     }
     return (0);
@@ -1531,17 +1562,19 @@
             char *arg ATTRIBUTE_UNUSED, xmlNodePtr node,
             xmlNodePtr node2 ATTRIBUTE_UNUSED)
 {
+    if (!ctxt)
+        return (0);
     if (node == NULL) {
-	fprintf(stdout, "NULL\n");
+	fprintf(ctxt->output, "NULL\n");
 	return (0);
     }    
     if ((node->type == XML_DOCUMENT_NODE) ||
         (node->type == XML_HTML_DOCUMENT_NODE)) {
-        xmlDebugDumpDocumentHead(stdout, (xmlDocPtr) node);
+        xmlDebugDumpDocumentHead(ctxt->output, (xmlDocPtr) node);
     } else if (node->type == XML_ATTRIBUTE_NODE) {
-        xmlDebugDumpAttr(stdout, (xmlAttrPtr) node, 0);
+        xmlDebugDumpAttr(ctxt->output, (xmlAttrPtr) node, 0);
     } else {
-        xmlDebugDumpOneNode(stdout, node, 0);
+        xmlDebugDumpOneNode(ctxt->output, node, 0);
     }
     return (0);
 }
@@ -1562,29 +1595,31 @@
 xmlShellCat(xmlShellCtxtPtr ctxt, char *arg ATTRIBUTE_UNUSED,
             xmlNodePtr node, xmlNodePtr node2 ATTRIBUTE_UNUSED)
 {
+    if (!ctxt)
+        return (0);
     if (node == NULL) {
-	fprintf(stdout, "NULL\n");
+	fprintf(ctxt->output, "NULL\n");
 	return (0);
     }    
     if (ctxt->doc->type == XML_HTML_DOCUMENT_NODE) {
 #ifdef LIBXML_HTML_ENABLED
         if (node->type == XML_HTML_DOCUMENT_NODE)
-            htmlDocDump(stdout, (htmlDocPtr) node);
+            htmlDocDump(ctxt->output, (htmlDocPtr) node);
         else
-            htmlNodeDumpFile(stdout, ctxt->doc, node);
+            htmlNodeDumpFile(ctxt->output, ctxt->doc, node);
 #else
         if (node->type == XML_DOCUMENT_NODE)
-            xmlDocDump(stdout, (xmlDocPtr) node);
+            xmlDocDump(ctxt->output, (xmlDocPtr) node);
         else
-            xmlElemDump(stdout, ctxt->doc, node);
+            xmlElemDump(ctxt->output, ctxt->doc, node);
 #endif /* LIBXML_HTML_ENABLED */
     } else {
         if (node->type == XML_DOCUMENT_NODE)
-            xmlDocDump(stdout, (xmlDocPtr) node);
+            xmlDocDump(ctxt->output, (xmlDocPtr) node);
         else
-            xmlElemDump(stdout, ctxt->doc, node);
+            xmlElemDump(ctxt->output, ctxt->doc, node);
     }
-    fprintf(stdout, "\n");
+    fprintf(ctxt->output, "\n");
     return (0);
 }
 
@@ -1615,7 +1650,7 @@
 #ifdef LIBXML_HTML_ENABLED
         doc = htmlParseFile(filename, NULL);
 #else
-        fprintf(stdout, "HTML support not compiled in\n");
+        fprintf(ctxt->output, "HTML support not compiled in\n");
         doc = NULL;
 #endif /* LIBXML_HTML_ENABLED */
     } else {
@@ -1822,24 +1857,27 @@
  * Returns 0 or -1 in case of error
  */
 int
-xmlShellDu(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED,
+xmlShellDu(xmlShellCtxtPtr ctxt,
            char *arg ATTRIBUTE_UNUSED, xmlNodePtr tree,
            xmlNodePtr node2 ATTRIBUTE_UNUSED)
 {
     xmlNodePtr node;
     int indent = 0, i;
 
+    if (!ctxt)
+	return (-1);
+
     if (tree == NULL)
         return (-1);
     node = tree;
     while (node != NULL) {
         if ((node->type == XML_DOCUMENT_NODE) ||
             (node->type == XML_HTML_DOCUMENT_NODE)) {
-            fprintf(stdout, "/\n");
+            fprintf(ctxt->output, "/\n");
         } else if (node->type == XML_ELEMENT_NODE) {
             for (i = 0; i < indent; i++)
-                fprintf(stdout, "  ");
-            fprintf(stdout, "%s\n", node->name);
+                fprintf(ctxt->output, "  ");
+            fprintf(ctxt->output, "%s\n", node->name);
         } else {
         }
 
@@ -1934,7 +1972,7 @@
  * @doc:  the initial document
  * @filename:  the output buffer
  * @input:  the line reading function
- * @output:  the output FILE*
+ * @output:  the output FILE*, defaults to stdout if NULL
  *
  * Implements the XML shell 
  * This allow to load, validate, view, modify and save a document
@@ -1960,7 +1998,7 @@
     if (input == NULL)
         return;
     if (output == NULL)
-        return;
+        output = stdout;
     ctxt = (xmlShellCtxtPtr) xmlMalloc(sizeof(xmlShellCtxt));
     if (ctxt == NULL)
         return;
@@ -2038,26 +2076,26 @@
         if (!strcmp(command, "bye"))
             break;
 		if (!strcmp(command, "help")) {
-		  fprintf(stdout, "\tbase         display XML base of the node\n");
-		  fprintf(stdout, "\tsetbase URI  change the XML base of the node\n");
-		  fprintf(stdout, "\tbye          leave shell\n");
-		  fprintf(stdout, "\tcat [node]   display node or current node\n");
-		  fprintf(stdout, "\tcd [path]    change directory to path or to root\n");
-		  fprintf(stdout, "\tdir [path]   dumps informations about the node (namespace, attributes, content)\n");
-		  fprintf(stdout, "\tdu [path]    show the structure of the subtree under path or the current node\n");
-		  fprintf(stdout, "\texit         leave shell\n");
-		  fprintf(stdout, "\thelp         display this help\n");
-		  fprintf(stdout, "\tfree         display memory usage\n");
-		  fprintf(stdout, "\tload [name]  load a new document with name\n");
-		  fprintf(stdout, "\tls [path]    list contents of path or the current directory\n");
+		  fprintf(ctxt->output, "\tbase         display XML base of the node\n");
+		  fprintf(ctxt->output, "\tsetbase URI  change the XML base of the node\n");
+		  fprintf(ctxt->output, "\tbye          leave shell\n");
+		  fprintf(ctxt->output, "\tcat [node]   display node or current node\n");
+		  fprintf(ctxt->output, "\tcd [path]    change directory to path or to root\n");
+		  fprintf(ctxt->output, "\tdir [path]   dumps informations about the node (namespace, attributes, content)\n");
+		  fprintf(ctxt->output, "\tdu [path]    show the structure of the subtree under path or the current node\n");
+		  fprintf(ctxt->output, "\texit         leave shell\n");
+		  fprintf(ctxt->output, "\thelp         display this help\n");
+		  fprintf(ctxt->output, "\tfree         display memory usage\n");
+		  fprintf(ctxt->output, "\tload [name]  load a new document with name\n");
+		  fprintf(ctxt->output, "\tls [path]    list contents of path or the current directory\n");
 #ifdef LIBXML_XPATH_ENABLED
-		  fprintf(stdout, "\txpath expr   evaluate the XPath expression in that context and print the result\n");
+		  fprintf(ctxt->output, "\txpath expr   evaluate the XPath expression in that context and print the result\n");
 #endif /* LIBXML_XPATH_ENABLED */
-		  fprintf(stdout, "\tpwd          display current working directory\n");
-		  fprintf(stdout, "\tquit         leave shell\n");
-		  fprintf(stdout, "\tsave [name]  save this document to name or the original name\n");
-		  fprintf(stdout, "\tvalidate     check the document for errors\n");
-		  fprintf(stdout, "\twrite [name] write the current node to the filename\n");
+		  fprintf(ctxt->output, "\tpwd          display current working directory\n");
+		  fprintf(ctxt->output, "\tquit         leave shell\n");
+		  fprintf(ctxt->output, "\tsave [name]  save this document to name or the original name\n");
+		  fprintf(ctxt->output, "\tvalidate     check the document for errors\n");
+		  fprintf(ctxt->output, "\twrite [name] write the current node to the filename\n");
         } else if (!strcmp(command, "validate")) {
             xmlShellValidate(ctxt, arg, NULL, NULL);
         } else if (!strcmp(command, "load")) {
@@ -2068,18 +2106,18 @@
             xmlShellWrite(ctxt, arg, NULL, NULL);
         } else if (!strcmp(command, "free")) {
             if (arg[0] == 0) {
-                xmlMemShow(stdout, 0);
+                xmlMemShow(ctxt->output, 0);
             } else {
                 int len = 0;
 
                 sscanf(arg, "%d", &len);
-                xmlMemShow(stdout, len);
+                xmlMemShow(ctxt->output, len);
             }
         } else if (!strcmp(command, "pwd")) {
             char dir[500];
 
             if (!xmlShellPwd(ctxt, dir, ctxt->node, NULL))
-                fprintf(stdout, "%s\n", dir);
+                fprintf(ctxt->output, "%s\n", dir);
         } else if (!strcmp(command, "du")) {
             xmlShellDu(ctxt, NULL, ctxt->node, NULL);
         } else if (!strcmp(command, "base")) {
@@ -2092,7 +2130,7 @@
 	    } else {
                 ctxt->pctxt->node = ctxt->node;
                 list = xmlXPathEval((xmlChar *) arg, ctxt->pctxt);
-		xmlXPathDebugDumpObject(stdout, list, 0);
+		xmlXPathDebugDumpObject(ctxt->output, list, 0);
 		xmlXPathFreeObject(list);
 	    }
 #endif /* LIBXML_XPATH_ENABLED */
@@ -2283,7 +2321,7 @@
                                      indx < list->nodesetval->nodeNr;
                                      indx++) {
                                     if (i > 0)
-                                        fprintf(stdout, " -------\n");
+                                        fprintf(ctxt->output, " -------\n");
                                     xmlShellCat(ctxt, NULL,
                                                 list->nodesetval->
                                                 nodeTab[indx], NULL);