applied fix from Mathias Hasselmann about a bug in URI parsing. fix bug

* uri.c: applied fix from Mathias Hasselmann about a bug in URI
  parsing.
* xpath.c: fix bug #61291 the default XML namespace node is
  missing from the namespace axis.
* tree.c: refuse to create namespaces nodes with prefix "xml"
Daniel
diff --git a/ChangeLog b/ChangeLog
index fbde3cf..6d30206 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Fri Oct  5 11:16:21 CEST 2001 Daniel Veillard <daniel@veillard.com>
+
+	* uri.c: applied fix from Mathias Hasselmann about a bug in URI
+	  parsing.
+	* xpath.c: fix bug #61291 the default XML namespace node is
+	  missing from the namespace axis.
+	* tree.c: refuse to create namespaces nodes with prefix "xml"
+
 Thu Oct  4 16:47:44 CEST 2001 Daniel Veillard <daniel@veillard.com>
 
 	* SAX.c: ouch a non-defined namespace could lead to a crash,
diff --git a/tree.c b/tree.c
index d002d7f..395080e 100644
--- a/tree.c
+++ b/tree.c
@@ -132,6 +132,9 @@
     if ((node != NULL) && (node->type != XML_ELEMENT_NODE))
 	return(NULL);
 
+    if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xml")))
+	return(NULL);
+
     /*
      * Allocate a new Namespace and fill the fields.
      */
diff --git a/uri.c b/uri.c
index bbd3c30..a2e427a 100644
--- a/uri.c
+++ b/uri.c
@@ -1649,14 +1649,19 @@
 static int
 xmlParseAbsoluteURI(xmlURIPtr uri, const char **str) {
     int ret;
+    const char *cur;
 
     if (str == NULL)
 	return(-1);
     
+    cur = *str;
+
     ret = xmlParseURIScheme(uri, str);
     if (ret != 0) return(ret);
-    if (**str != ':')
+    if (**str != ':') {
+	*str = cur;
 	return(1);
+    }
     (*str)++;
     if (**str == '/')
 	return(xmlParseURIHierPart(uri, str));
diff --git a/xpath.c b/xpath.c
index fd44e1a..8bbe15c 100644
--- a/xpath.c
+++ b/xpath.c
@@ -62,6 +62,14 @@
 double xmlXPathStringEvalNumber(const xmlChar *str);
 double xmlXPathDivideBy(double f, double fzero);
 
+static xmlNs xmlXPathXMLNamespaceStruct = {
+    NULL,
+    XML_NAMESPACE_DECL,
+    XML_XML_NAMESPACE,
+    BAD_CAST "xml"
+};
+static xmlNsPtr xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct;
+
 /************************************************************************
  * 									*
  * 			Floating point stuff				*
@@ -79,6 +87,7 @@
 double xmlXPathNAN = 0;
 double xmlXPathPINF = 1;
 double xmlXPathNINF = -1;
+static int xmlXPathInitialized = 0;
 
 /**
  * xmlXPathInit:
@@ -87,15 +96,13 @@
  */
 void
 xmlXPathInit(void) {
-    static int initialized = 0;
-
-    if (initialized) return;
+    if (xmlXPathInitialized) return;
 
     xmlXPathPINF = trio_pinf();
     xmlXPathNINF = trio_ninf();
     xmlXPathNAN = trio_nan();
 
-    initialized = 1;
+    xmlXPathInitialized = 1;
 }
 
 /**
@@ -4970,6 +4977,8 @@
  * the order of nodes on this axis is implementation-defined; the axis will
  * be empty unless the context node is an element
  *
+ * We keep the XML namespace node at the end of the list.
+ *
  * Returns the next element following that axis
  */
 xmlNodePtr
@@ -4977,6 +4986,8 @@
     xmlNodePtr ret;
 
     if (ctxt->context->node->type != XML_ELEMENT_NODE) return(NULL);
+    if (cur == (xmlNodePtr) xmlXPathXMLNamespace)
+	return(NULL);
     if ((cur == NULL) || (ctxt->context->tmpNsList == NULL)) {
         if (ctxt->context->tmpNsList != NULL)
 	    xmlFree(ctxt->context->tmpNsList);
@@ -4989,6 +5000,7 @@
     if (ret == NULL) {
 	xmlFree(ctxt->context->tmpNsList);
 	ctxt->context->tmpNsList = NULL;
+	return((xmlNodePtr) xmlXPathXMLNamespace);
     }
     return(ret);
 }