- tree.c: fixed xmlNodeGetContent, it was not recursing on child
- parserInternals.[ch]: trying to speed up parsing
- xpath.c : speeded up node set equality op
Daniel
diff --git a/ChangeLog b/ChangeLog
index 534a6fd..01afd65 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Feb 20 18:57:54 CET 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
+
+	* tree.c: fixed xmlNodeGetContent, it was not recursing on child
+	* parserInternals.[ch]: trying to speed up parsing
+	* xpath.c : speeded up node set equality op
+
 Mon Feb 19 19:01:57 CET 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
 
 	* Makefile.am valid.c list.[ch]: Gary Pennington provided a
diff --git a/include/libxml/parserInternals.h b/include/libxml/parserInternals.h
index c62b298..3fdb8f6 100644
--- a/include/libxml/parserInternals.h
+++ b/include/libxml/parserInternals.h
@@ -42,8 +42,8 @@
  * any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
  */
 #define IS_CHAR(c)							\
-    (((c) == 0x09) || ((c) == 0x0A) || ((c) == 0x0D) ||			\
-     (((c) >= 0x20) && ((c) <= 0xD7FF)) ||				\
+    ((((c) >= 0x20) && ((c) <= 0xD7FF)) ||				\
+     ((c) == 0x09) || ((c) == 0x0A) || ((c) == 0x0D) ||			\
      (((c) >= 0xE000) && ((c) <= 0xFFFD)) ||				\
      (((c) >= 0x10000) && ((c) <= 0x10FFFF)))
 
diff --git a/parserInternals.c b/parserInternals.c
index f99ed4e..65ebf5f 100644
--- a/parserInternals.c
+++ b/parserInternals.c
@@ -1256,6 +1256,10 @@
 	*len = 0;
 	return(ctxt->token);
     }	
+    if ((*ctxt->input->cur >= 0x20) && (*ctxt->input->cur <= 0x7F)) {
+	    *len = 1;
+	    return((int) *ctxt->input->cur);
+    }
     if (ctxt->charset == XML_CHAR_ENCODING_UTF8) {
 	/*
 	 * We are supposed to handle UTF8, check it's valid
diff --git a/parserInternals.h b/parserInternals.h
index c62b298..3fdb8f6 100644
--- a/parserInternals.h
+++ b/parserInternals.h
@@ -42,8 +42,8 @@
  * any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
  */
 #define IS_CHAR(c)							\
-    (((c) == 0x09) || ((c) == 0x0A) || ((c) == 0x0D) ||			\
-     (((c) >= 0x20) && ((c) <= 0xD7FF)) ||				\
+    ((((c) >= 0x20) && ((c) <= 0xD7FF)) ||				\
+     ((c) == 0x09) || ((c) == 0x0A) || ((c) == 0x0D) ||			\
      (((c) >= 0xE000) && ((c) <= 0xFFFD)) ||				\
      (((c) >= 0x10000) && ((c) <= 0x10FFFF)))
 
diff --git a/tree.c b/tree.c
index 5339e9f..ae9c8c2 100644
--- a/tree.c
+++ b/tree.c
@@ -3169,9 +3169,69 @@
     if (cur == NULL) return(NULL);
     switch (cur->type) {
         case XML_DOCUMENT_FRAG_NODE:
-        case XML_ELEMENT_NODE:
-            return(xmlNodeListGetString(cur->doc, cur->children, 1));
-	    break;
+        case XML_ELEMENT_NODE: {
+	    xmlNodePtr tmp = cur;
+	    xmlBufferPtr buffer;
+	    xmlChar *ret;
+
+            buffer = xmlBufferCreate();
+	    if (buffer == NULL)
+		return(NULL);
+	    while (tmp != NULL) {
+		switch (tmp->type) {
+		    case XML_ELEMENT_NODE: 
+		    case XML_TEXT_NODE:
+			if (tmp->content != NULL)
+#ifndef XML_USE_BUFFER_CONTENT
+			    xmlBufferCat(buffer, tmp->content);
+#else
+			    xmlBufferCat(buffer,
+				    xmlBufferContent(tmp->content));
+#endif
+			break;
+		    case XML_ENTITY_REF_NODE: {
+		        xmlEntityPtr ent;
+
+			ent = xmlGetDocEntity(cur->doc, tmp->name);
+			if (ent != NULL)
+			    xmlBufferCat(buffer, ent->content);
+		    }
+		    default:
+			break;
+		}
+		/*
+		 * Skip to next node
+		 */
+		if (tmp->children != NULL) {
+		    if (tmp->children->type != XML_ENTITY_DECL) {
+			tmp = tmp->children;
+			continue;
+		    }
+		}
+		if (tmp->next != NULL) {
+		    tmp = tmp->next;
+		    continue;
+		}
+		
+		do {
+		    tmp = tmp->parent;
+		    if (tmp == NULL)
+			break;
+		    if (tmp == (xmlNodePtr) cur) {
+			tmp = NULL;
+			break;
+		    }
+		    if (tmp->next != NULL) {
+			tmp = tmp->next;
+			break;
+		    }
+		} while (tmp != NULL);
+	    }
+	    ret = buffer->content;
+	    buffer->content = NULL;
+	    xmlBufferFree(buffer);
+	    return(ret);
+        }
         case XML_ATTRIBUTE_NODE: {
 	    xmlAttrPtr attr = (xmlAttrPtr) cur;
 	    if (attr->parent != NULL)
@@ -4553,7 +4613,7 @@
 
 /**
  * xmlBufferContent:
- * @buf:  the buffer to resize
+ * @buf:  the buffer
  *
  * Returns the internal content
  */
diff --git a/xpath.c b/xpath.c
index 57ca143..22a2dab 100644
--- a/xpath.c
+++ b/xpath.c
@@ -1868,15 +1868,29 @@
  *
  * Implement the compare operation on nodesets:
  *
- * If both objects to be compared are node-sets, then the comparison will be true if
- * and only if there is a node in the first node-set and a node in the second node-set
- * such that the result of performing the comparison on the string-values of the two
- * nodes is true. 
+ * If both objects to be compared are node-sets, then the comparison
+ * will be true if and only if there is a node in the first node-set
+ * and a node in the second node-set such that the result of performing
+ * the comparison on the string-values of the two nodes is true. 
+ * ....
+ * When neither object to be compared is a node-set and the operator
+ * is <=, <, >= or >, then the objects are compared by converting both
+ * objects to numbers and comparing the numbers according to IEEE 754.
+ * ....
+ * The number function converts its argument to a number as follows:
+ *  - a string that consists of optional whitespace followed by an
+ *    optional minus sign followed by a Number followed by whitespace
+ *    is converted to the IEEE 754 number that is nearest (according
+ *    to the IEEE 754 round-to-nearest rule) to the mathematical value
+ *    represented by the string; any other string is converted to NaN
+ *
+ * Conclusion all nodes need to be converted first to their string value
+ * and then the comparison must be done when possible 
  */
 int
 xmlXPathCompareNodeSets(xmlXPathParserContextPtr ctxt, int inf, int strict,
 	                xmlXPathObjectPtr ns1, xmlXPathObjectPtr ns2) {
-    TODO
+    TODO /* xmlXPathCompareNodeSets */
     return(0);
 }
 
@@ -1894,10 +1908,10 @@
  *     @ns > @val    (0, 1, ...
  *     @ns >= @val   (0, 0, ...
  *
- * If one object to be compared is a node-set and the other is a boolean, then the
- * comparison will be true if and only if the result of performing the comparison
- * on the boolean and on the result of converting the node-set to a boolean using
- * the boolean function is true.
+ * If one object to be compared is a node-set and the other is a boolean,
+ * then the comparison will be true if and only if the result of performing
+ * the comparison on the boolean and on the result of converting
+ * the node-set to a boolean using the boolean function is true.
  *
  * Returns 0 or 1 depending on the results of the test.
  */
@@ -1951,6 +1965,8 @@
 	((arg->type != XPATH_NODESET) && (arg->type != XPATH_XSLT_TREE)))
         return(0);
     ns = arg->nodesetval;
+    if (ns->nodeNr <= 0)
+	return(0);
     for (i = 0;i < ns->nodeNr;i++) {
          str2 = xmlNodeGetContent(ns->nodeTab[i]);
 	 if ((str2 != NULL) && (xmlStrEqual(str, str2))) {
@@ -2015,9 +2031,12 @@
  */
 int
 xmlXPathEqualNodeSets(xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) {
-    int i;
-    xmlNodeSetPtr ns;
-    xmlChar *str;
+    int i, j;
+    xmlChar **values1;
+    xmlChar **values2;
+    int ret = 0;
+    xmlNodeSetPtr ns1;
+    xmlNodeSetPtr ns2;
 
     if ((arg1 == NULL) ||
 	((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)))
@@ -2026,16 +2045,53 @@
 	((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE)))
         return(0);
 
-    ns = arg1->nodesetval;
-    for (i = 0;i < ns->nodeNr;i++) {
-         str = xmlNodeGetContent(ns->nodeTab[i]);
-	 if ((str != NULL) && (xmlXPathEqualNodeSetString(arg2, str))) {
-	     xmlFree(str);
-	     return(1);
-	 }
-	 xmlFree(str);
+    ns1 = arg1->nodesetval;
+    ns2 = arg2->nodesetval;
+
+    if (ns1->nodeNr <= 0)
+	return(0);
+    if (ns2->nodeNr <= 0)
+	return(0);
+
+    /*
+     * check if there is a node pertaining to both sets
+     */
+    for (i = 0;i < ns1->nodeNr;i++)
+	for (j = 0;j < ns2->nodeNr;j++)
+	    if (ns1->nodeTab[i] == ns2->nodeTab[j])
+		return(1);
+
+    values1 = (xmlChar **) xmlMalloc(ns1->nodeNr * sizeof(xmlChar *));
+    if (values1 == NULL)
+	return(0);
+    memset(values1, 0, ns1->nodeNr * sizeof(xmlChar *));
+    values2 = (xmlChar **) xmlMalloc(ns2->nodeNr * sizeof(xmlChar *));
+    if (values2 == NULL) {
+	xmlFree(values1);
+	return(0);
     }
-    return(0);
+    memset(values2, 0, ns2->nodeNr * sizeof(xmlChar *));
+    for (i = 0;i < ns1->nodeNr;i++) {
+	values1[i] = xmlNodeGetContent(ns1->nodeTab[i]);
+	for (j = 0;j < ns2->nodeNr;j++) {
+	    if (i == 0)
+		values2[j] = xmlNodeGetContent(ns2->nodeTab[j]);
+	    ret = xmlStrEqual(values1[i], values2[j]);
+	    if (ret)
+		break;
+	}
+	if (ret)
+	    break;
+    }
+    for (i = 0;i < ns1->nodeNr;i++)
+	if (values1[i] != NULL)
+	    xmlFree(values1[i]);
+    for (j = 0;j < ns2->nodeNr;j++)
+	if (values2[j] != NULL)
+	    xmlFree(values2[j]);
+    xmlFree(values1);
+    xmlFree(values2);
+    return(ret);
 }
 
 /**