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