Improvement of doc, Raph patch for CORBA init, support for spaces in XPath, Daniel
diff --git a/xpath.c b/xpath.c
index 3b0c535..3a703bb 100644
--- a/xpath.c
+++ b/xpath.c
@@ -775,8 +775,6 @@
 /**
  * xmlXPathNewContext:
  * @doc:  the XML document
- * @variables:  the variable list
- * @functions:  the function list
  *
  * Create a new xmlXPathContext
  *
@@ -3240,6 +3238,8 @@
 	        return(xmlXPathNameFunction);
 	    if (!xmlStrcmp(name, BAD_CAST "namespace"))
 	        return(xmlXPathNamespaceFunction);
+	    if (!xmlStrcmp(name, BAD_CAST "normalize-space"))
+	        return(xmlXPathNormalizeFunction);
 	    if (!xmlStrcmp(name, BAD_CAST "normalize"))
 	        return(xmlXPathNormalizeFunction);
 	    if (!xmlStrcmp(name, BAD_CAST "number"))
@@ -3373,6 +3373,7 @@
     if (name == NULL) {
 	ERROR(XPATH_EXPR_ERROR);
     }
+    SKIP_BLANKS;
     func = xmlXPathIsFunction(ctxt, name);
     if (func == NULL) {
         xmlFree(name);
@@ -3387,6 +3388,7 @@
 	ERROR(XPATH_EXPR_ERROR);
     }
     NEXT;
+    SKIP_BLANKS;
 
     while (CUR != ')') {
         xmlXPathEvalExpr(ctxt);
@@ -3397,8 +3399,10 @@
 	    ERROR(XPATH_EXPR_ERROR);
 	}
 	NEXT;
+	SKIP_BLANKS;
     }
     NEXT;
+    SKIP_BLANKS;
     xmlFree(name);
     func(ctxt, nbargs);
 }
@@ -3417,14 +3421,17 @@
  */
 void
 xmlXPathEvalPrimaryExpr(xmlXPathParserContextPtr ctxt) {
+    SKIP_BLANKS;
     if (CUR == '$') xmlXPathEvalVariableReference(ctxt);
     else if (CUR == '(') {
         NEXT;
+	SKIP_BLANKS;
         xmlXPathEvalExpr(ctxt);
 	if (CUR != ')') {
 	    ERROR(XPATH_EXPR_ERROR);
 	}
 	NEXT;
+	SKIP_BLANKS;
     } else if (IS_DIGIT(CUR)) {
         xmlXPathEvalNumber(ctxt);
     } else if ((CUR == '\'') || (CUR == '"')) {
@@ -3458,6 +3465,7 @@
 
     xmlXPathEvalPrimaryExpr(ctxt);
     CHECK_ERROR;
+    SKIP_BLANKS;
     
     if (CUR != '[') return;
 
@@ -3465,6 +3473,7 @@
 
     while (CUR == '[') {
 	xmlXPathEvalPredicate(ctxt);
+	SKIP_BLANKS;
     }
 
     
@@ -3492,6 +3501,7 @@
     xmlChar buf[XML_MAX_NAMELEN];
     int len = 0;
 
+    SKIP_BLANKS;
     if (!IS_LETTER(CUR) && (CUR != '_') &&
         (CUR != ':')) {
 	return(NULL);
@@ -3541,12 +3551,14 @@
 xmlXPathEvalPathExpr(xmlXPathParserContextPtr ctxt) {
     xmlNodeSetPtr newset = NULL;
 
+    SKIP_BLANKS;
     if ((CUR == '$') || (CUR == '(') || (IS_DIGIT(CUR)) ||
         (CUR == '\'') || (CUR == '"')) {
 	xmlXPathEvalFilterExpr(ctxt);
 	CHECK_ERROR;
 	if ((CUR == '/') && (NXT(1) == '/')) {
 	    SKIP(2);
+	    SKIP_BLANKS;
 	    if (ctxt->context->nodelist == NULL) {
 		STRANGE
 		xmlXPathRoot(ctxt);
@@ -3562,6 +3574,7 @@
 	    xmlXPathEvalRelativeLocationPath(ctxt);
 	}
     } else {
+        /******* !!!!!!!!!! @attname */
         xmlChar *name;
 
 	name = xmlXPathScanName(ctxt);
@@ -3588,9 +3601,12 @@
 xmlXPathEvalUnionExpr(xmlXPathParserContextPtr ctxt) {
     xmlXPathEvalPathExpr(ctxt);
     CHECK_ERROR;
+    SKIP_BLANKS;
     if (CUR == '|') {
 	xmlNodeSetPtr old = ctxt->context->nodelist;
 
+	NEXT;
+	SKIP_BLANKS;
 	xmlXPathEvalPathExpr(ctxt);
 
 	if (ctxt->context->nodelist == NULL)
@@ -3617,9 +3633,11 @@
 xmlXPathEvalUnaryExpr(xmlXPathParserContextPtr ctxt) {
     int minus = 0;
 
+    SKIP_BLANKS;
     if (CUR == '-') {
         minus = 1;
 	NEXT;
+	SKIP_BLANKS;
     }
     xmlXPathEvalUnionExpr(ctxt);
     CHECK_ERROR;
@@ -3645,6 +3663,7 @@
 xmlXPathEvalMultiplicativeExpr(xmlXPathParserContextPtr ctxt) {
     xmlXPathEvalUnaryExpr(ctxt);
     CHECK_ERROR;
+    SKIP_BLANKS;
     while ((CUR == '*') || 
            ((CUR == 'd') && (NXT(1) == 'i') && (NXT(2) == 'v')) ||
            ((CUR == 'm') && (NXT(1) == 'o') && (NXT(2) == 'd'))) {
@@ -3660,6 +3679,7 @@
 	    op = 2;
 	    SKIP(3);
 	}
+	SKIP_BLANKS;
         xmlXPathEvalUnaryExpr(ctxt);
 	CHECK_ERROR;
 	switch (op) {
@@ -3691,12 +3711,14 @@
 xmlXPathEvalAdditiveExpr(xmlXPathParserContextPtr ctxt) {
     xmlXPathEvalMultiplicativeExpr(ctxt);
     CHECK_ERROR;
+    SKIP_BLANKS;
     while ((CUR == '+') || (CUR == '-')) {
 	int plus;
 
         if (CUR == '+') plus = 1;
 	else plus = 0;
 	NEXT;
+	SKIP_BLANKS;
         xmlXPathEvalMultiplicativeExpr(ctxt);
 	CHECK_ERROR;
 	if (plus) xmlXPathAddValues(ctxt);
@@ -3726,6 +3748,7 @@
 xmlXPathEvalRelationalExpr(xmlXPathParserContextPtr ctxt) {
     xmlXPathEvalAdditiveExpr(ctxt);
     CHECK_ERROR;
+    SKIP_BLANKS;
     while ((CUR == '<') ||
            (CUR == '>') ||
            ((CUR == '<') && (NXT(1) == '=')) ||
@@ -3738,6 +3761,7 @@
 	else strict = 1;
 	NEXT;
 	if (!strict) NEXT;
+	SKIP_BLANKS;
         xmlXPathEvalAdditiveExpr(ctxt);
 	CHECK_ERROR;
 	ret = xmlXPathCompareValues(ctxt, inf, strict);
@@ -3765,6 +3789,7 @@
 xmlXPathEvalEqualityExpr(xmlXPathParserContextPtr ctxt) {
     xmlXPathEvalRelationalExpr(ctxt);
     CHECK_ERROR;
+    SKIP_BLANKS;
     while ((CUR == '=') || ((CUR == '!') && (NXT(1) == '='))) {
 	xmlXPathObjectPtr res;
 	int eq, equal;
@@ -3773,6 +3798,7 @@
 	else eq = 0;
 	NEXT;
 	if (!eq) NEXT;
+	SKIP_BLANKS;
         xmlXPathEvalRelationalExpr(ctxt);
 	CHECK_ERROR;
 	equal = xmlXPathEqualValues(ctxt);
@@ -3796,10 +3822,12 @@
 xmlXPathEvalAndExpr(xmlXPathParserContextPtr ctxt) {
     xmlXPathEvalEqualityExpr(ctxt);
     CHECK_ERROR;
+    SKIP_BLANKS;
     while ((CUR == 'a') && (NXT(1) == 'n') && (NXT(2) == 'n')) {
 	xmlXPathObjectPtr arg1, arg2;
 
         SKIP(3);
+	SKIP_BLANKS;
         xmlXPathEvalEqualityExpr(ctxt);
 	CHECK_ERROR;
 	arg2 = valuePop(ctxt);
@@ -3825,10 +3853,12 @@
 xmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) {
     xmlXPathEvalAndExpr(ctxt);
     CHECK_ERROR;
+    SKIP_BLANKS;
     while ((CUR == 'o') && (NXT(1) == 'r')) {
 	xmlXPathObjectPtr arg1, arg2;
 
         SKIP(2);
+	SKIP_BLANKS;
         xmlXPathEvalAndExpr(ctxt);
 	CHECK_ERROR;
 	arg2 = valuePop(ctxt);
@@ -3892,10 +3922,12 @@
     xmlNodeSetPtr newset = NULL;
     int i;
 
+    SKIP_BLANKS;
     if (CUR != '[') {
 	ERROR(XPATH_INVALID_PREDICATE_ERROR);
     }
     NEXT;
+    SKIP_BLANKS;
     if ((ctxt->context->nodelist == NULL) ||
         (ctxt->context->nodelist->nodeNr == 0)) {
         ctxt->context->node = NULL;
@@ -3928,6 +3960,7 @@
 	ERROR(XPATH_INVALID_PREDICATE_ERROR);
     }
     NEXT;
+    SKIP_BLANKS;
 #ifdef DEBUG_STEP
     fprintf(xmlXPathDebug, "After predicate : ");
     xmlXPathDebugNodeSet(xmlXPathDebug, ctxt->context->nodelist);
@@ -4226,8 +4259,10 @@
 xmlXPathEvalStep(xmlXPathParserContextPtr ctxt) {
     xmlNodeSetPtr newset = NULL;
 
+    SKIP_BLANKS;
     if ((CUR == '.') && (NXT(1) == '.')) {
 	SKIP(2);
+	SKIP_BLANKS;
 	if (ctxt->context->nodelist == NULL) {
 	    STRANGE
 	    xmlXPathRoot(ctxt);
@@ -4240,8 +4275,10 @@
 	ctxt->context->node = NULL;
     } else if (CUR == '.') {
 	NEXT;
+	SKIP_BLANKS;
     } else {
 	xmlXPathEvalBasis(ctxt);
+	SKIP_BLANKS;
 	while (CUR == '[') {
 	    xmlXPathEvalPredicate(ctxt);
 	}
@@ -4266,10 +4303,13 @@
 xmlXPathEvalRelativeLocationPath(xmlXPathParserContextPtr ctxt) {
     xmlNodeSetPtr newset = NULL;
 
+    SKIP_BLANKS;
     xmlXPathEvalStep(ctxt);
+    SKIP_BLANKS;
     while (CUR == '/') {
 	if ((CUR == '/') && (NXT(1) == '/')) {
 	    SKIP(2);
+	    SKIP_BLANKS;
 	    if (ctxt->context->nodelist == NULL) {
 		STRANGE
 		xmlXPathRoot(ctxt);
@@ -4283,8 +4323,10 @@
 	    xmlXPathEvalStep(ctxt);
 	} else if (CUR == '/') {
 	    NEXT;
+	    SKIP_BLANKS;
 	    xmlXPathEvalStep(ctxt);
 	}
+	SKIP_BLANKS;
     }
 }
 
@@ -4311,54 +4353,37 @@
 xmlXPathEvalLocationPath(xmlXPathParserContextPtr ctxt) {
     xmlNodeSetPtr newset = NULL;
 
-    while (CUR == '/') {
-	if ((CUR == '/') && (NXT(1) == '/')) {
-	    SKIP(2);
-	    if (ctxt->context->nodelist == NULL)
-		xmlXPathRoot(ctxt);
-	    newset = xmlXPathNodeCollectAndTest(ctxt, AXIS_DESCENDANT_OR_SELF,
-			     NODE_TEST_TYPE, XML_ELEMENT_NODE, NULL, NULL);
-	    if (ctxt->context->nodelist != NULL)
-		xmlXPathFreeNodeSet(ctxt->context->nodelist);
-	    ctxt->context->nodelist = newset;
-	    ctxt->context->node = NULL;
-	    xmlXPathEvalRelativeLocationPath(ctxt);
-	} else if (CUR == '/') {
-	    NEXT;
-	    xmlXPathRoot(ctxt);
-	    if (CUR != 0)
+    SKIP_BLANKS;
+    if (CUR != '/') {
+        xmlXPathEvalRelativeLocationPath(ctxt);
+    } else {
+	while (CUR == '/') {
+	    if ((CUR == '/') && (NXT(1) == '/')) {
+		SKIP(2);
+		SKIP_BLANKS;
+		if (ctxt->context->nodelist == NULL)
+		    xmlXPathRoot(ctxt);
+		newset = xmlXPathNodeCollectAndTest(ctxt,
+		                 AXIS_DESCENDANT_OR_SELF, NODE_TEST_TYPE,
+				 XML_ELEMENT_NODE, NULL, NULL);
+		if (ctxt->context->nodelist != NULL)
+		    xmlXPathFreeNodeSet(ctxt->context->nodelist);
+		ctxt->context->nodelist = newset;
+		ctxt->context->node = NULL;
 		xmlXPathEvalRelativeLocationPath(ctxt);
-	} else {
-	    xmlXPathEvalRelativeLocationPath(ctxt);
+	    } else if (CUR == '/') {
+		NEXT;
+		SKIP_BLANKS;
+		xmlXPathRoot(ctxt);
+		if (CUR != 0)
+		    xmlXPathEvalRelativeLocationPath(ctxt);
+	    } else {
+		xmlXPathEvalRelativeLocationPath(ctxt);
+	    }
 	}
     }
 }
 
-/*
- * TODO * extra spaces *
- * more tokenization rules ... Not used currently, especially allowing
- * spaces before and after ExprToken !!!!!!!!!!!!!
- *
- *  [32]   Operator ::=   OperatorName 
- *                    | MultiplyOperator 
- *                    | '/' | '//' | '|' | '+' | '-' | '=' | '!='
- *                    | '<'| '<=' | '>' | '>='
- *  [33]   OperatorName ::=   'and' | 'or' | 'mod' | 'div'
- *  [39]   ExprWhitespace ::=   S 
- *
- *  BUG: ExprToken is never referenced.
- *
- *  [28]   ExprToken ::=   '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'
- *                    | WildcardName 
- *                    | NodeType 
- *                    | Operator 
- *                    | FunctionName 
- *                    | AxisName 
- *                    | Literal 
- *                    | Number 
- *                    | VariableReference 
- */
-
 /**
  * xmlXPathEval:
  * @str:  the XPath expression