- bux fixes in XPath implementation
- fixed xml-config --version
- updated TODO

Daniel
diff --git a/ChangeLog b/ChangeLog
index 6fc6b61..f0c84c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Jan 24 14:31:09 CET 2000 Daniel Veillard <Daniel.Veillard@w3.org>
+
+	* xml-config.in: xml-config --version to just return the
+	  version number
+	* xpath.c: some cleanup w.r.t. axis when the current node is
+	  an attribute.
+	* TODO: updated
+
 Tue Jan 18 18:46:06 CET 2000 Daniel Veillard <Daniel.Veillard@w3.org>
 
 	* configure.in: prepared for libxml-1.8.5
diff --git a/TODO b/TODO
index 417ea00..8c4dffd 100644
--- a/TODO
+++ b/TODO
@@ -86,6 +86,10 @@
 - dynamically adapt the alloc entry point to use g_alloc()/g_free()
   if the programmer wants it
 
+- I18N: http://wap.trondheim.com/vaer/index.phtml is not XML and accepted
+  by the XML parser, UTF-8 should be checked when there is no "encoding"
+  declared !
+
 Done:
 =====
 
diff --git a/xml-config.in b/xml-config.in
index be9fe53..82c0cd1 100644
--- a/xml-config.in
+++ b/xml-config.in
@@ -44,7 +44,7 @@
 	;;
 
     --version)
-	echo @PACKAGE@ @VERSION@
+	echo @VERSION@
 	exit 0
 	;;
 
diff --git a/xpath.c b/xpath.c
index 7f2a589..bb94ab8 100644
--- a/xpath.c
+++ b/xpath.c
@@ -1488,10 +1488,26 @@
 xmlNodePtr
 xmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
     if (cur == NULL) {
-	if ((ctxt->context->node->type == XML_DOCUMENT_NODE) ||
-	    (ctxt->context->node->type == XML_HTML_DOCUMENT_NODE))
-	    return(((xmlDocPtr) ctxt->context->node)->root);
-        return(ctxt->context->node->childs);
+	if (ctxt->context->node == NULL) return(NULL);
+	switch (ctxt->context->node->type) {
+            case XML_ELEMENT_NODE:
+            case XML_TEXT_NODE:
+            case XML_CDATA_SECTION_NODE:
+            case XML_ENTITY_REF_NODE:
+            case XML_ENTITY_NODE:
+            case XML_PI_NODE:
+            case XML_COMMENT_NODE:
+            case XML_NOTATION_NODE:
+		return(ctxt->context->node->childs);
+            case XML_ATTRIBUTE_NODE:
+		return(NULL);
+            case XML_DOCUMENT_NODE:
+            case XML_DOCUMENT_TYPE_NODE:
+            case XML_DOCUMENT_FRAG_NODE:
+            case XML_HTML_DOCUMENT_NODE:
+		return(((xmlDocPtr) ctxt->context->node)->root);
+	}
+	return(NULL);
     }
     if ((cur->type == XML_DOCUMENT_NODE) ||
         (cur->type == XML_HTML_DOCUMENT_NODE))
@@ -1513,6 +1529,11 @@
 xmlNodePtr
 xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
     if (cur == NULL) {
+	if (ctxt->context->node == NULL)
+	    return(NULL);
+	if (ctxt->context->node->type == XML_ATTRIBUTE_NODE)
+	    return(NULL);
+
         if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc)
 	    return(ctxt->context->doc->root);
         return(ctxt->context->node->childs);
@@ -1548,24 +1569,15 @@
  */
 xmlNodePtr
 xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
-    if (cur == NULL)
+    if (cur == NULL) {
+	if (ctxt->context->node == NULL)
+	    return(NULL);
+	if (ctxt->context->node->type == XML_ATTRIBUTE_NODE)
+	    return(NULL);
         return(ctxt->context->node);
+    }
 
-    if (cur == (xmlNodePtr) ctxt->context->doc)
-        return(ctxt->context->doc->root);
-    if (cur->childs != NULL) return(cur->childs);
-    if (cur->next != NULL) return(cur->next);
-    
-    do {
-        cur = cur->parent;
-	if (cur == NULL) return(NULL);
-	if (cur == ctxt->context->node) return(NULL);
-	if (cur->next != NULL) {
-	    cur = cur->next;
-	    return(cur);
-	}
-    } while (cur != NULL);
-    return(cur);
+    return(xmlXPathNextDescendant(ctxt, cur));
 }
 
 /**
@@ -1581,14 +1593,35 @@
 xmlNodePtr
 xmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
     /*
-     * !!!!!!!!!!!!!
      * the parent of an attribute or namespace node is the element
      * to which the attribute or namespace node is attached
+     * Namespace handling !!!
      */
     if (cur == NULL) {
-        if (ctxt->context->node->parent == NULL)
-	    return((xmlNodePtr) ctxt->context->doc);
-        return(ctxt->context->node->parent);
+	if (ctxt->context->node == NULL) return(NULL);
+	switch (ctxt->context->node->type) {
+            case XML_ELEMENT_NODE:
+            case XML_TEXT_NODE:
+            case XML_CDATA_SECTION_NODE:
+            case XML_ENTITY_REF_NODE:
+            case XML_ENTITY_NODE:
+            case XML_PI_NODE:
+            case XML_COMMENT_NODE:
+            case XML_NOTATION_NODE:
+		if (ctxt->context->node->parent == NULL)
+		    return((xmlNodePtr) ctxt->context->doc);
+		return(ctxt->context->node->parent);
+            case XML_ATTRIBUTE_NODE: {
+		xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node;
+
+		return(att->node);
+	    }
+            case XML_DOCUMENT_NODE:
+            case XML_DOCUMENT_TYPE_NODE:
+            case XML_DOCUMENT_FRAG_NODE:
+            case XML_HTML_DOCUMENT_NODE:
+                return(NULL);
+	}
     }
     return(NULL);
 }
@@ -1610,20 +1643,63 @@
 xmlNodePtr
 xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
     /*
-     * !!!!!!!!!!!!!
      * the parent of an attribute or namespace node is the element
      * to which the attribute or namespace node is attached
+     * !!!!!!!!!!!!!
      */
     if (cur == NULL) {
-        if (ctxt->context->node->parent == NULL)
-	    return((xmlNodePtr) ctxt->context->doc);
-        return(ctxt->context->node->parent);
+	if (ctxt->context->node == NULL) return(NULL);
+	switch (ctxt->context->node->type) {
+            case XML_ELEMENT_NODE:
+            case XML_TEXT_NODE:
+            case XML_CDATA_SECTION_NODE:
+            case XML_ENTITY_REF_NODE:
+            case XML_ENTITY_NODE:
+            case XML_PI_NODE:
+            case XML_COMMENT_NODE:
+            case XML_NOTATION_NODE:
+		if (ctxt->context->node->parent == NULL)
+		    return((xmlNodePtr) ctxt->context->doc);
+		return(ctxt->context->node->parent);
+            case XML_ATTRIBUTE_NODE: {
+		xmlAttrPtr cur = (xmlAttrPtr) ctxt->context->node;
+
+		return(cur->node);
+	    }
+            case XML_DOCUMENT_NODE:
+            case XML_DOCUMENT_TYPE_NODE:
+            case XML_DOCUMENT_FRAG_NODE:
+            case XML_HTML_DOCUMENT_NODE:
+                return(NULL);
+	}
+	return(NULL);
     }
     if (cur == ctxt->context->doc->root)
 	return((xmlNodePtr) ctxt->context->doc);
     if (cur == (xmlNodePtr) ctxt->context->doc)
 	return(NULL);
-    return(cur->parent);
+    switch (cur->type) {
+	case XML_ELEMENT_NODE:
+	case XML_TEXT_NODE:
+	case XML_CDATA_SECTION_NODE:
+	case XML_ENTITY_REF_NODE:
+	case XML_ENTITY_NODE:
+	case XML_PI_NODE:
+	case XML_COMMENT_NODE:
+	case XML_NOTATION_NODE:
+	    return(cur->parent);
+	case XML_ATTRIBUTE_NODE: {
+	    xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node;
+
+	    return(att->node);
+	}
+	case XML_DOCUMENT_NODE:
+	case XML_DOCUMENT_TYPE_NODE:
+	case XML_DOCUMENT_FRAG_NODE:
+	case XML_HTML_DOCUMENT_NODE:
+	    return(NULL);
+    }
+    return(NULL);
 }
 
 /**
@@ -1641,18 +1717,9 @@
  */
 xmlNodePtr
 xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
-    /*
-     * !!!!!!!!!!!!!
-     * the parent of an attribute or namespace node is the element
-     * to which the attribute or namespace node is attached
-     */
     if (cur == NULL)
         return(ctxt->context->node);
-    if (cur == ctxt->context->doc->root)
-	return((xmlNodePtr) ctxt->context->doc);
-    if (cur == (xmlNodePtr) ctxt->context->doc)
-	return(NULL);
-    return(cur->parent);
+    return(xmlXPathNextAncestor(ctxt, cur));
 }
 
 /**