19#pragma convert("ISO8859-1")
38#ifdef LIBXML_XPTR_LOCS_ENABLED
41#ifdef LIBXML_DEBUG_ENABLED
46#ifdef LIBXML_PATTERN_ENABLED
54#ifdef LIBXML_PATTERN_ENABLED
55#define XPATH_STREAMING
59 xmlGenericError(xmlGenericErrorContext, \
60 "Unimplemented block at %s:%d\n", \
81#define XP_OPTIMIZED_NON_ELEM_COMPARISON
88#define XP_OPTIMIZED_FILTER_FIRST
97#define XPATH_MAX_STEPS 1000000
106#define XPATH_MAX_STACK_DEPTH 1000000
116#define XPATH_MAX_NODESET_LENGTH 10000000
123#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
124#define XPATH_MAX_RECURSION_DEPTH 500
127#define XPATH_MAX_RECURSION_DEPTH 1000
129#define XPATH_MAX_RECURSION_DEPTH 5000
139#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
147double xmlXPathNAN = 0.0;
148double xmlXPathPINF = 0.0;
149double xmlXPathNINF = 0.0;
169#if defined(NAN) && defined(INFINITY)
176 xmlXPathNAN = 0.0 /
zero;
177 xmlXPathPINF = 1.0 /
zero;
178 xmlXPathNINF = -xmlXPathPINF;
191xmlXPathIsNaN(
double val) {
208xmlXPathIsInf(
double val) {
212 if (
val >= xmlXPathPINF)
214 if (
val <= -xmlXPathPINF)
222#ifdef LIBXML_XPATH_ENABLED
229static xmlNs xmlXPathXMLNamespaceStruct = {
237static xmlNsPtr xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct;
238#ifndef LIBXML_THREAD_ENABLED
243static int xmlXPathDisableOptimizer = 0;
247xmlXPathNodeSetClear(xmlNodeSetPtr
set,
int hasNsNodes);
249#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
262xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) {
264 int misc = 0, precedence1 = 0, precedence2 = 0;
265 xmlNodePtr miscNode1 =
NULL, miscNode2 =
NULL;
269 if ((node1 ==
NULL) || (node2 ==
NULL))
278 switch (node1->type) {
279 case XML_ELEMENT_NODE:
280 if (node2->type == XML_ELEMENT_NODE) {
283 (node1->doc == node2->doc))
292 goto turtle_comparison;
295 case XML_ATTRIBUTE_NODE:
298 node1 = node1->parent;
302 case XML_CDATA_SECTION_NODE:
303 case XML_COMMENT_NODE:
309 if (node1->prev !=
NULL) {
312 if (node1->type == XML_ELEMENT_NODE) {
316 if (node1->prev ==
NULL) {
322 node1 = node1->parent;
328 node1 = node1->parent;
330 if ((node1 ==
NULL) || (node1->type != XML_ELEMENT_NODE) ||
341 case XML_NAMESPACE_DECL:
349 switch (node2->type) {
350 case XML_ELEMENT_NODE:
352 case XML_ATTRIBUTE_NODE:
355 node2 = node2->parent;
359 case XML_CDATA_SECTION_NODE:
360 case XML_COMMENT_NODE:
363 if (node2->prev !=
NULL) {
366 if (node2->type == XML_ELEMENT_NODE) {
370 if (node2->prev ==
NULL) {
372 node2 = node2->parent;
378 node2 = node2->parent;
380 if ((node2 ==
NULL) || (node2->type != XML_ELEMENT_NODE) ||
389 case XML_NAMESPACE_DECL:
395 if (node1 == node2) {
396 if (precedence1 == precedence2) {
401 cur = miscNode2->prev;
403 if (
cur == miscNode1)
405 if (
cur->type == XML_ELEMENT_NODE)
416 if (precedence1 < precedence2)
431 if ((precedence2 == 3) && (precedence1 > 1)) {
439 if ((precedence1 == 3) && (precedence2 > 1)) {
452 if ((node1->type == XML_ELEMENT_NODE) &&
453 (node2->type == XML_ELEMENT_NODE) &&
456 (node1->doc == node2->doc)) {
468 if (node1 == node2->prev)
470 if (node1 == node2->next)
476 if (
cur->parent == node1)
482 if (
cur->parent == node2)
495 while (depth1 > depth2) {
497 node1 = node1->parent;
499 while (depth2 > depth1) {
501 node2 = node2->parent;
503 while (node1->parent != node2->parent) {
504 node1 = node1->parent;
505 node2 = node2->parent;
507 if ((node1 ==
NULL) || (node2 ==
NULL))
513 if (node1 == node2->prev)
515 if (node1 == node2->next)
520 if ((node1->type == XML_ELEMENT_NODE) &&
521 (node2->type == XML_ELEMENT_NODE) &&
524 (node1->doc == node2->doc)) {
545#define SORT_NAME libxml_domnode
546#define SORT_TYPE xmlNodePtr
558int wrap_cmp( xmlNodePtr
x, xmlNodePtr
y );
559#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
560 static int wrap_cmp( xmlNodePtr
x, xmlNodePtr
y )
562 int res = xmlXPathCmpNodesExt(
x,
y);
566 static int wrap_cmp( xmlNodePtr
x, xmlNodePtr
y )
568 int res = xmlXPathCmpNodes(
x,
y);
572#define SORT_CMP(x, y) (wrap_cmp(x, y))
588#define XP_ERRORNULL(X) \
589 { xmlXPathErr(ctxt, X); return(NULL); }
594static const char*
const xmlXPathErrorMessages[] = {
597 "Unfinished literal\n",
598 "Start of literal\n",
599 "Expected $ for variable reference\n",
600 "Undefined variable\n",
601 "Invalid predicate\n",
602 "Invalid expression\n",
603 "Missing closing curly brace\n",
604 "Unregistered function\n",
607 "Invalid number of arguments\n",
608 "Invalid context size\n",
609 "Invalid context position\n",
610 "Memory allocation error\n",
613 "Sub resource error\n",
614 "Undefined namespace prefix\n",
616 "Char out of XML range\n",
617 "Invalid or incomplete context\n",
618 "Stack usage error\n",
619 "Forbidden variable\n",
620 "Operation limit exceeded\n",
621 "Recursion limit exceeded\n",
622 "?? Unknown error ??\n"
624#define MAXERRNO ((int)(sizeof(xmlXPathErrorMessages) / \
625 sizeof(xmlXPathErrorMessages[0])) - 1)
634xmlXPathErrMemory(xmlXPathContextPtr ctxt,
const char *
extra)
642 "Memory allocation failed : %s\n",
646 ctxt->lastError.message = (
char *)
651 if (ctxt->error !=
NULL)
652 ctxt->error(ctxt->userData, &ctxt->lastError);
659 "Memory allocation failed : %s\n",
extra);
665 "Memory allocation failed\n");
677xmlXPathPErrMemory(xmlXPathParserContextPtr ctxt,
const char *
extra)
682 ctxt->error = XPATH_MEMORY_ERROR;
683 xmlXPathErrMemory(ctxt->context,
extra);
695xmlXPathErr(xmlXPathParserContextPtr ctxt,
int error)
705 "%s", xmlXPathErrorMessages[
error]);
709 if (ctxt->error != 0)
712 if (ctxt->context ==
NULL) {
717 (
const char *) ctxt->base,
NULL,
NULL,
718 ctxt->cur - ctxt->base, 0,
719 "%s", xmlXPathErrorMessages[
error]);
730 ctxt->context->lastError.str1 = (
char *)
xmlStrdup(ctxt->base);
731 ctxt->context->lastError.int1 = ctxt->cur - ctxt->base;
732 ctxt->context->lastError.node = ctxt->context->debugNode;
733 if (ctxt->context->error !=
NULL) {
734 ctxt->context->error(ctxt->context->userData,
735 &ctxt->context->lastError);
741 (
const char *) ctxt->base,
NULL,
NULL,
742 ctxt->cur - ctxt->base, 0,
743 "%s", xmlXPathErrorMessages[
error]);
760 xmlXPathErr(ctxt,
no);
772xmlXPathCheckOpLimit(xmlXPathParserContextPtr ctxt,
unsigned long opCount) {
773 xmlXPathContextPtr xpctxt = ctxt->context;
775 if ((opCount > xpctxt->opLimit) ||
776 (xpctxt->opCount > xpctxt->opLimit - opCount)) {
777 xpctxt->opCount = xpctxt->opLimit;
778 xmlXPathErr(ctxt, XPATH_OP_LIMIT_EXCEEDED);
782 xpctxt->opCount += opCount;
786#define OP_LIMIT_EXCEEDED(ctxt, n) \
787 ((ctxt->context->opLimit != 0) && (xmlXPathCheckOpLimit(ctxt, n) < 0))
800typedef struct _xmlPointerList xmlPointerList;
801typedef xmlPointerList *xmlPointerListPtr;
802struct _xmlPointerList {
812xmlPointerListAddSize(xmlPointerListPtr
list,
821 if (initialSize <= 0)
823 newSize = initialSize;
826 xmlXPathErrMemory(
NULL,
827 "xmlPointerListAddSize: re-allocating item\n");
832 tmp = (
void **)
xmlRealloc(
list->items, newSize *
sizeof(
void *));
834 xmlXPathErrMemory(
NULL,
835 "xmlPointerListAddSize: re-allocating item\n");
852static xmlPointerListPtr
853xmlPointerListCreate(
int initialSize)
855 xmlPointerListPtr
ret;
859 xmlXPathErrMemory(
NULL,
860 "xmlPointerListCreate: allocating item\n");
864 if (initialSize > 0) {
865 xmlPointerListAddSize(
ret,
NULL, initialSize);
878xmlPointerListFree(xmlPointerListPtr
list)
916#ifdef LIBXML_XPTR_LOCS_ENABLED
923 AXIS_ANCESTOR_OR_SELF,
927 AXIS_DESCENDANT_OR_SELF,
929 AXIS_FOLLOWING_SIBLING,
933 AXIS_PRECEDING_SIBLING,
948 NODE_TYPE_COMMENT = XML_COMMENT_NODE,
949 NODE_TYPE_TEXT = XML_TEXT_NODE,
950 NODE_TYPE_PI = XML_PI_NODE
953typedef struct _xmlXPathStepOp xmlXPathStepOp;
954typedef xmlXPathStepOp *xmlXPathStepOpPtr;
955struct _xmlXPathStepOp {
964 xmlXPathFunction
cache;
968struct _xmlXPathCompExpr {
971 xmlXPathStepOp *
steps;
975#ifdef XPATH_STREAMING
986xmlXPathFreeValueTree(xmlNodeSetPtr
obj);
988xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
obj);
990xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt,
991 xmlXPathStepOpPtr
op, xmlNodePtr *
first);
993xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt,
994 xmlXPathStepOpPtr
op,
1012static xmlXPathCompExprPtr
1013xmlXPathNewCompExpr(
void) {
1014 xmlXPathCompExprPtr
cur;
1016 cur = (xmlXPathCompExprPtr)
xmlMalloc(
sizeof(xmlXPathCompExpr));
1018 xmlXPathErrMemory(
NULL,
"allocating component\n");
1021 memset(
cur, 0,
sizeof(xmlXPathCompExpr));
1025 sizeof(xmlXPathStepOp));
1027 xmlXPathErrMemory(
NULL,
"allocating steps\n");
1031 memset(
cur->steps, 0,
cur->maxStep *
sizeof(xmlXPathStepOp));
1043xmlXPathFreeCompExpr(xmlXPathCompExprPtr comp)
1045 xmlXPathStepOpPtr
op;
1050 if (comp->dict ==
NULL) {
1051 for (
i = 0;
i < comp->nbStep;
i++) {
1052 op = &comp->steps[
i];
1053 if (
op->value4 !=
NULL) {
1054 if (
op->op == XPATH_OP_VALUE)
1055 xmlXPathFreeObject(
op->value4);
1063 for (
i = 0;
i < comp->nbStep;
i++) {
1064 op = &comp->steps[
i];
1065 if (
op->value4 !=
NULL) {
1066 if (
op->op == XPATH_OP_VALUE)
1067 xmlXPathFreeObject(
op->value4);
1072 if (comp->steps !=
NULL) {
1075#ifdef XPATH_STREAMING
1076 if (comp->stream !=
NULL) {
1077 xmlFreePatternList(comp->stream);
1080 if (comp->expr !=
NULL) {
1104xmlXPathCompExprAdd(xmlXPathParserContextPtr ctxt,
int ch1,
int ch2,
1106 int value2,
int value3,
void *value4,
void *value5) {
1107 xmlXPathCompExprPtr comp = ctxt->comp;
1108 if (comp->nbStep >= comp->maxStep) {
1109 xmlXPathStepOp *
real;
1112 xmlXPathPErrMemory(ctxt,
"adding step\n");
1117 comp->maxStep *
sizeof(xmlXPathStepOp));
1120 xmlXPathPErrMemory(ctxt,
"adding step\n");
1125 comp->last = comp->nbStep;
1126 comp->steps[comp->nbStep].ch1 = ch1;
1127 comp->steps[comp->nbStep].ch2 = ch2;
1128 comp->steps[comp->nbStep].op =
op;
1129 comp->steps[comp->nbStep].value =
value;
1130 comp->steps[comp->nbStep].value2 = value2;
1131 comp->steps[comp->nbStep].value3 = value3;
1132 if ((comp->dict !=
NULL) &&
1133 ((
op == XPATH_OP_FUNCTION) || (
op == XPATH_OP_VARIABLE) ||
1134 (
op == XPATH_OP_COLLECT))) {
1135 if (value4 !=
NULL) {
1136 comp->steps[comp->nbStep].value4 = (
xmlChar *)
1140 comp->steps[comp->nbStep].value4 =
NULL;
1141 if (value5 !=
NULL) {
1142 comp->steps[comp->nbStep].value5 = (
xmlChar *)
1146 comp->steps[comp->nbStep].value5 =
NULL;
1148 comp->steps[comp->nbStep].value4 = value4;
1149 comp->steps[comp->nbStep].value5 = value5;
1151 comp->steps[comp->nbStep].cache =
NULL;
1152 return(comp->nbStep++);
1163xmlXPathCompSwap(xmlXPathStepOpPtr
op) {
1166#ifndef LIBXML_THREAD_ENABLED
1172 if (xmlXPathDisableOptimizer)
1181#define PUSH_FULL_EXPR(op, op1, op2, val, val2, val3, val4, val5) \
1182 xmlXPathCompExprAdd(ctxt, (op1), (op2), \
1183 (op), (val), (val2), (val3), (val4), (val5))
1184#define PUSH_LONG_EXPR(op, val, val2, val3, val4, val5) \
1185 xmlXPathCompExprAdd(ctxt, ctxt->comp->last, -1, \
1186 (op), (val), (val2), (val3), (val4), (val5))
1188#define PUSH_LEAVE_EXPR(op, val, val2) \
1189xmlXPathCompExprAdd(ctxt, -1, -1, (op), (val), (val2), 0 ,NULL ,NULL)
1191#define PUSH_UNARY_EXPR(op, ch, val, val2) \
1192xmlXPathCompExprAdd(ctxt, (ch), -1, (op), (val), (val2), 0 ,NULL ,NULL)
1194#define PUSH_BINARY_EXPR(op, ch1, ch2, val, val2) \
1195xmlXPathCompExprAdd(ctxt, (ch1), (ch2), (op), \
1196 (val), (val2), 0 ,NULL ,NULL)
1206#define XP_HAS_CACHE(c) ((c != NULL) && ((c)->cache != NULL))
1208typedef struct _xmlXPathContextCache xmlXPathContextCache;
1209typedef xmlXPathContextCache *xmlXPathContextCachePtr;
1210struct _xmlXPathContextCache {
1211 xmlPointerListPtr nodesetObjs;
1212 xmlPointerListPtr stringObjs;
1213 xmlPointerListPtr booleanObjs;
1214 xmlPointerListPtr numberObjs;
1215 xmlPointerListPtr miscObjs;
1230 xmlGenericError(xmlGenericErrorContext, \
1231 "Internal error at %s:%d\n", \
1232 __FILE__, __LINE__);
1234#ifdef LIBXML_DEBUG_ENABLED
1236xmlXPathDebugDumpNode(
FILE *output, xmlNodePtr
cur,
int depth) {
1240 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1245 fprintf(output,
"Node is NULL !\n");
1250 if ((
cur->type == XML_DOCUMENT_NODE) ||
1251 (
cur->type == XML_HTML_DOCUMENT_NODE)) {
1254 }
else if (
cur->type == XML_ATTRIBUTE_NODE)
1255 xmlDebugDumpAttr(output, (xmlAttrPtr)
cur,
depth);
1257 xmlDebugDumpOneNode(output,
cur,
depth);
1260xmlXPathDebugDumpNodeList(
FILE *output, xmlNodePtr
cur,
int depth) {
1265 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1270 fprintf(output,
"Node is NULL !\n");
1278 xmlDebugDumpOneNode(output, tmp,
depth);
1283xmlXPathDebugDumpNodeSet(
FILE *output, xmlNodeSetPtr
cur,
int depth) {
1287 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1293 fprintf(output,
"NodeSet is NULL !\n");
1299 fprintf(output,
"Set contains %d nodes:\n",
cur->nodeNr);
1300 for (
i = 0;
i <
cur->nodeNr;
i++) {
1303 xmlXPathDebugDumpNode(output,
cur->nodeTab[
i],
depth + 1);
1309xmlXPathDebugDumpValueTree(
FILE *output, xmlNodeSetPtr
cur,
int depth) {
1313 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1319 fprintf(output,
"Value Tree is NULL !\n");
1326 xmlXPathDebugDumpNodeList(output,
cur->nodeTab[0]->children,
depth + 1);
1328#if defined(LIBXML_XPTR_LOCS_ENABLED)
1330xmlXPathDebugDumpLocationSet(
FILE *output, xmlLocationSetPtr
cur,
int depth) {
1334 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1340 fprintf(output,
"LocationSet is NULL !\n");
1345 for (
i = 0;
i <
cur->locNr;
i++) {
1348 xmlXPathDebugDumpObject(output,
cur->locTab[
i],
depth + 1);
1362xmlXPathDebugDumpObject(
FILE *output, xmlXPathObjectPtr
cur,
int depth) {
1366 if (output ==
NULL)
return;
1368 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1376 fprintf(output,
"Object is empty (NULL)\n");
1380 case XPATH_UNDEFINED:
1381 fprintf(output,
"Object is uninitialized\n");
1384 fprintf(output,
"Object is a Node Set :\n");
1385 xmlXPathDebugDumpNodeSet(output,
cur->nodesetval,
depth);
1387 case XPATH_XSLT_TREE:
1388 fprintf(output,
"Object is an XSLT value tree :\n");
1389 xmlXPathDebugDumpValueTree(output,
cur->nodesetval,
depth);
1392 fprintf(output,
"Object is a Boolean : ");
1394 else fprintf(output,
"false\n");
1397 switch (xmlXPathIsInf(
cur->floatval)) {
1399 fprintf(output,
"Object is a number : Infinity\n");
1402 fprintf(output,
"Object is a number : -Infinity\n");
1405 if (xmlXPathIsNaN(
cur->floatval)) {
1406 fprintf(output,
"Object is a number : NaN\n");
1407 }
else if (
cur->floatval == 0) {
1409 fprintf(output,
"Object is a number : 0\n");
1411 fprintf(output,
"Object is a number : %0g\n",
cur->floatval);
1416 fprintf(output,
"Object is a string : ");
1417 xmlDebugDumpString(output,
cur->stringval);
1420#ifdef LIBXML_XPTR_LOCS_ENABLED
1422 fprintf(output,
"Object is a point : index %d in node",
cur->index);
1423 xmlXPathDebugDumpNode(output, (xmlNodePtr)
cur->user,
depth + 1);
1428 ((
cur->user2 ==
cur->user) && (
cur->index ==
cur->index2))) {
1429 fprintf(output,
"Object is a collapsed range :\n");
1431 if (
cur->index >= 0)
1434 xmlXPathDebugDumpNode(output, (xmlNodePtr)
cur->user,
1437 fprintf(output,
"Object is a range :\n");
1440 if (
cur->index >= 0)
1443 xmlXPathDebugDumpNode(output, (xmlNodePtr)
cur->user,
1447 if (
cur->index2 >= 0)
1448 fprintf(output,
"index %d in ",
cur->index2);
1450 xmlXPathDebugDumpNode(output, (xmlNodePtr)
cur->user2,
1455 case XPATH_LOCATIONSET:
1456 fprintf(output,
"Object is a Location Set:\n");
1457 xmlXPathDebugDumpLocationSet(output,
1458 (xmlLocationSetPtr)
cur->user,
depth);
1462 fprintf(output,
"Object is user defined\n");
1468xmlXPathDebugDumpStepOp(
FILE *output, xmlXPathCompExprPtr comp,
1469 xmlXPathStepOpPtr
op,
int depth) {
1473 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1479 fprintf(output,
"Step is NULL\n");
1484 fprintf(output,
"END");
break;
1486 fprintf(output,
"AND");
break;
1489 case XPATH_OP_EQUAL:
1506 else if (
op->value == 1)
1508 else if (
op->value == 2)
1509 fprintf(output,
"PLUS unary -");
1510 else if (
op->value == 3)
1511 fprintf(output,
"PLUS unary - -");
1516 else if (
op->value == 1)
1521 case XPATH_OP_UNION:
1522 fprintf(output,
"UNION");
break;
1524 fprintf(output,
"ROOT");
break;
1526 fprintf(output,
"NODE");
break;
1528 fprintf(output,
"SORT");
break;
1529 case XPATH_OP_COLLECT: {
1530 xmlXPathAxisVal axis = (xmlXPathAxisVal)
op->value;
1531 xmlXPathTestVal
test = (xmlXPathTestVal)
op->value2;
1532 xmlXPathTypeVal
type = (xmlXPathTypeVal)
op->value3;
1539 fprintf(output,
" 'ancestors' ");
break;
1540 case AXIS_ANCESTOR_OR_SELF:
1541 fprintf(output,
" 'ancestors-or-self' ");
break;
1543 fprintf(output,
" 'attributes' ");
break;
1545 fprintf(output,
" 'child' ");
break;
1546 case AXIS_DESCENDANT:
1547 fprintf(output,
" 'descendant' ");
break;
1548 case AXIS_DESCENDANT_OR_SELF:
1549 fprintf(output,
" 'descendant-or-self' ");
break;
1550 case AXIS_FOLLOWING:
1551 fprintf(output,
" 'following' ");
break;
1552 case AXIS_FOLLOWING_SIBLING:
1553 fprintf(output,
" 'following-siblings' ");
break;
1554 case AXIS_NAMESPACE:
1555 fprintf(output,
" 'namespace' ");
break;
1557 fprintf(output,
" 'parent' ");
break;
1558 case AXIS_PRECEDING:
1559 fprintf(output,
" 'preceding' ");
break;
1560 case AXIS_PRECEDING_SIBLING:
1561 fprintf(output,
" 'preceding-sibling' ");
break;
1563 fprintf(output,
" 'self' ");
break;
1566 case NODE_TEST_NONE:
1567 fprintf(output,
"'none' ");
break;
1568 case NODE_TEST_TYPE:
1569 fprintf(output,
"'type' ");
break;
1571 fprintf(output,
"'PI' ");
break;
1573 fprintf(output,
"'all' ");
break;
1575 fprintf(output,
"'namespace' ");
break;
1576 case NODE_TEST_NAME:
1577 fprintf(output,
"'name' ");
break;
1580 case NODE_TYPE_NODE:
1581 fprintf(output,
"'node' ");
break;
1582 case NODE_TYPE_COMMENT:
1583 fprintf(output,
"'comment' ");
break;
1584 case NODE_TYPE_TEXT:
1585 fprintf(output,
"'text' ");
break;
1587 fprintf(output,
"'PI' ");
break;
1596 case XPATH_OP_VALUE: {
1597 xmlXPathObjectPtr
object = (xmlXPathObjectPtr)
op->value4;
1600 xmlXPathDebugDumpObject(output,
object, 0);
1603 case XPATH_OP_VARIABLE: {
1613 case XPATH_OP_FUNCTION: {
1614 int nbargs =
op->value;
1619 fprintf(output,
"FUNCTION %s:%s(%d args)",
1622 fprintf(output,
"FUNCTION %s(%d args)",
name, nbargs);
1625 case XPATH_OP_ARG:
fprintf(output,
"ARG");
break;
1626 case XPATH_OP_PREDICATE:
fprintf(output,
"PREDICATE");
break;
1627 case XPATH_OP_FILTER:
fprintf(output,
"FILTER");
break;
1628#ifdef LIBXML_XPTR_LOCS_ENABLED
1629 case XPATH_OP_RANGETO:
fprintf(output,
"RANGETO");
break;
1632 fprintf(output,
"UNKNOWN %d\n",
op->op);
return;
1637 xmlXPathDebugDumpStepOp(output, comp, &comp->steps[
op->ch1],
depth + 1);
1639 xmlXPathDebugDumpStepOp(output, comp, &comp->steps[
op->ch2],
depth + 1);
1651xmlXPathDebugDumpCompExpr(
FILE *output, xmlXPathCompExprPtr comp,
1656 if ((output ==
NULL) || (comp ==
NULL))
return;
1658 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1664#ifdef XPATH_STREAMING
1666 fprintf(output,
"Streaming Expression\n");
1670 fprintf(output,
"Compiled Expression : %d elements\n",
1673 xmlXPathDebugDumpStepOp(output, comp, &comp->steps[
i],
depth + 1);
1692static xmlXPathContextCachePtr
1693xmlXPathNewCache(
void)
1695 xmlXPathContextCachePtr
ret;
1697 ret = (xmlXPathContextCachePtr)
xmlMalloc(
sizeof(xmlXPathContextCache));
1699 xmlXPathErrMemory(
NULL,
"creating object cache\n");
1702 memset(
ret, 0 ,
sizeof(xmlXPathContextCache));
1703 ret->maxNodeset = 100;
1704 ret->maxString = 100;
1705 ret->maxBoolean = 100;
1706 ret->maxNumber = 100;
1712xmlXPathCacheFreeObjectList(xmlPointerListPtr
list)
1715 xmlXPathObjectPtr
obj;
1720 for (
i = 0;
i <
list->number;
i++) {
1726 if (
obj->nodesetval !=
NULL) {
1727 if (
obj->nodesetval->nodeTab !=
NULL)
1733 xmlPointerListFree(
list);
1737xmlXPathFreeCache(xmlXPathContextCachePtr
cache)
1741 if (
cache->nodesetObjs)
1742 xmlXPathCacheFreeObjectList(
cache->nodesetObjs);
1743 if (
cache->stringObjs)
1744 xmlXPathCacheFreeObjectList(
cache->stringObjs);
1745 if (
cache->booleanObjs)
1746 xmlXPathCacheFreeObjectList(
cache->booleanObjs);
1747 if (
cache->numberObjs)
1748 xmlXPathCacheFreeObjectList(
cache->numberObjs);
1749 if (
cache->miscObjs)
1750 xmlXPathCacheFreeObjectList(
cache->miscObjs);
1777xmlXPathContextSetCache(xmlXPathContextPtr ctxt,
1785 xmlXPathContextCachePtr
cache;
1787 if (ctxt->cache ==
NULL) {
1788 ctxt->cache = xmlXPathNewCache();
1789 if (ctxt->cache ==
NULL)
1792 cache = (xmlXPathContextCachePtr) ctxt->cache;
1802 }
else if (ctxt->cache !=
NULL) {
1803 xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache);
1821static xmlXPathObjectPtr
1822xmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr
val)
1824 if ((ctxt !=
NULL) && (ctxt->cache !=
NULL)) {
1825 xmlXPathContextCachePtr
cache =
1826 (xmlXPathContextCachePtr) ctxt->cache;
1829 (
cache->miscObjs->number != 0))
1831 xmlXPathObjectPtr
ret;
1833 ret = (xmlXPathObjectPtr)
1834 cache->miscObjs->items[--
cache->miscObjs->number];
1835 ret->type = XPATH_NODESET;
1841 return(xmlXPathWrapNodeSet(
val));
1855static xmlXPathObjectPtr
1856xmlXPathCacheWrapString(xmlXPathContextPtr ctxt,
xmlChar *
val)
1858 if ((ctxt !=
NULL) && (ctxt->cache !=
NULL)) {
1859 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
1862 (
cache->stringObjs->number != 0))
1865 xmlXPathObjectPtr
ret;
1867 ret = (xmlXPathObjectPtr)
1868 cache->stringObjs->items[--
cache->stringObjs->number];
1869 ret->type = XPATH_STRING;
1873 (
cache->miscObjs->number != 0))
1875 xmlXPathObjectPtr
ret;
1879 ret = (xmlXPathObjectPtr)
1880 cache->miscObjs->items[--
cache->miscObjs->number];
1882 ret->type = XPATH_STRING;
1887 return(xmlXPathWrapString(
val));
1901static xmlXPathObjectPtr
1902xmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr
val)
1904 if ((ctxt !=
NULL) && (ctxt->cache)) {
1905 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
1908 (
cache->nodesetObjs->number != 0))
1910 xmlXPathObjectPtr
ret;
1914 ret = (xmlXPathObjectPtr)
1915 cache->nodesetObjs->items[--
cache->nodesetObjs->number];
1916 ret->type = XPATH_NODESET;
1919 if ((
ret->nodesetval->nodeMax == 0) ||
1920 (
val->type == XML_NAMESPACE_DECL))
1923 xmlXPathNodeSetAddUnique(
ret->nodesetval,
val);
1925 ret->nodesetval->nodeTab[0] =
val;
1926 ret->nodesetval->nodeNr = 1;
1931 (
cache->miscObjs->number != 0))
1933 xmlXPathObjectPtr
ret;
1939 set = xmlXPathNodeSetCreate(
val);
1946 ret = (xmlXPathObjectPtr)
1947 cache->miscObjs->items[--
cache->miscObjs->number];
1949 ret->type = XPATH_NODESET;
1955 return(xmlXPathNewNodeSet(
val));
1968static xmlXPathObjectPtr
1969xmlXPathCacheNewString(xmlXPathContextPtr ctxt,
const xmlChar *
val)
1971 if ((ctxt !=
NULL) && (ctxt->cache)) {
1972 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
1975 (
cache->stringObjs->number != 0))
1977 xmlXPathObjectPtr
ret;
1984 xmlXPathErrMemory(ctxt,
NULL);
1988 ret = (xmlXPathObjectPtr)
1989 cache->stringObjs->items[--
cache->stringObjs->number];
1990 ret->type = XPATH_STRING;
1994 (
cache->miscObjs->number != 0))
1996 xmlXPathObjectPtr
ret;
2003 xmlXPathErrMemory(ctxt,
NULL);
2007 ret = (xmlXPathObjectPtr)
2008 cache->miscObjs->items[--
cache->miscObjs->number];
2010 ret->type = XPATH_STRING;
2015 return(xmlXPathNewString(
val));
2028static xmlXPathObjectPtr
2029xmlXPathCacheNewCString(xmlXPathContextPtr ctxt,
const char *
val)
2031 return xmlXPathCacheNewString(ctxt,
BAD_CAST val);
2044static xmlXPathObjectPtr
2045xmlXPathCacheNewBoolean(xmlXPathContextPtr ctxt,
int val)
2047 if ((ctxt !=
NULL) && (ctxt->cache)) {
2048 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
2051 (
cache->booleanObjs->number != 0))
2053 xmlXPathObjectPtr
ret;
2055 ret = (xmlXPathObjectPtr)
2056 cache->booleanObjs->items[--
cache->booleanObjs->number];
2057 ret->type = XPATH_BOOLEAN;
2058 ret->boolval = (
val != 0);
2061 (
cache->miscObjs->number != 0))
2063 xmlXPathObjectPtr
ret;
2065 ret = (xmlXPathObjectPtr)
2066 cache->miscObjs->items[--
cache->miscObjs->number];
2068 ret->type = XPATH_BOOLEAN;
2069 ret->boolval = (
val != 0);
2073 return(xmlXPathNewBoolean(
val));
2086static xmlXPathObjectPtr
2087xmlXPathCacheNewFloat(xmlXPathContextPtr ctxt,
double val)
2089 if ((ctxt !=
NULL) && (ctxt->cache)) {
2090 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
2093 (
cache->numberObjs->number != 0))
2095 xmlXPathObjectPtr
ret;
2097 ret = (xmlXPathObjectPtr)
2098 cache->numberObjs->items[--
cache->numberObjs->number];
2099 ret->type = XPATH_NUMBER;
2103 (
cache->miscObjs->number != 0))
2105 xmlXPathObjectPtr
ret;
2107 ret = (xmlXPathObjectPtr)
2108 cache->miscObjs->items[--
cache->miscObjs->number];
2110 ret->type = XPATH_NUMBER;
2115 return(xmlXPathNewFloat(
val));
2130static xmlXPathObjectPtr
2131xmlXPathCacheConvertString(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
val) {
2135 return(xmlXPathCacheNewCString(ctxt,
""));
2137 switch (
val->type) {
2138 case XPATH_UNDEFINED:
2141 case XPATH_XSLT_TREE:
2142 res = xmlXPathCastNodeSetToString(
val->nodesetval);
2147 res = xmlXPathCastBooleanToString(
val->boolval);
2150 res = xmlXPathCastNumberToString(
val->floatval);
2153#ifdef LIBXML_XPTR_LOCS_ENABLED
2156 case XPATH_LOCATIONSET:
2161 xmlXPathReleaseObject(ctxt,
val);
2163 return(xmlXPathCacheNewCString(ctxt,
""));
2164 return(xmlXPathCacheWrapString(ctxt,
res));
2177static xmlXPathObjectPtr
2178xmlXPathCacheObjectCopy(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
val)
2183 if (XP_HAS_CACHE(ctxt)) {
2184 switch (
val->type) {
2186 return(xmlXPathCacheWrapNodeSet(ctxt,
2187 xmlXPathNodeSetMerge(
NULL,
val->nodesetval)));
2189 return(xmlXPathCacheNewString(ctxt,
val->stringval));
2191 return(xmlXPathCacheNewBoolean(ctxt,
val->boolval));
2193 return(xmlXPathCacheNewFloat(ctxt,
val->floatval));
2198 return(xmlXPathObjectCopy(
val));
2212static xmlXPathObjectPtr
2213xmlXPathCacheConvertBoolean(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
val) {
2214 xmlXPathObjectPtr
ret;
2217 return(xmlXPathCacheNewBoolean(ctxt, 0));
2218 if (
val->type == XPATH_BOOLEAN)
2220 ret = xmlXPathCacheNewBoolean(ctxt, xmlXPathCastToBoolean(
val));
2221 xmlXPathReleaseObject(ctxt,
val);
2236static xmlXPathObjectPtr
2237xmlXPathCacheConvertNumber(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
val) {
2238 xmlXPathObjectPtr
ret;
2241 return(xmlXPathCacheNewFloat(ctxt, 0.0));
2242 if (
val->type == XPATH_NUMBER)
2244 ret = xmlXPathCacheNewFloat(ctxt, xmlXPathCastToNumber(
val));
2245 xmlXPathReleaseObject(ctxt,
val);
2264valuePop(xmlXPathParserContextPtr ctxt)
2266 xmlXPathObjectPtr
ret;
2268 if ((ctxt ==
NULL) || (ctxt->valueNr <= 0))
2272 if (ctxt->valueNr > 0)
2273 ctxt->value = ctxt->valueTab[ctxt->valueNr - 1];
2276 ret = ctxt->valueTab[ctxt->valueNr];
2277 ctxt->valueTab[ctxt->valueNr] =
NULL;
2293valuePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr
value)
2295 if (ctxt ==
NULL)
return(-1);
2301 ctxt->error = XPATH_MEMORY_ERROR;
2304 if (ctxt->valueNr >= ctxt->valueMax) {
2305 xmlXPathObjectPtr *tmp;
2308 xmlXPathPErrMemory(ctxt,
"XPath stack depth limit reached\n");
2309 xmlXPathFreeObject(
value);
2312 tmp = (xmlXPathObjectPtr *)
xmlRealloc(ctxt->valueTab,
2313 2 * ctxt->valueMax *
2314 sizeof(ctxt->valueTab[0]));
2316 xmlXPathPErrMemory(ctxt,
"pushing value\n");
2317 xmlXPathFreeObject(
value);
2320 ctxt->valueMax *= 2;
2321 ctxt->valueTab = tmp;
2323 ctxt->valueTab[ctxt->valueNr] =
value;
2324 ctxt->value =
value;
2325 return (ctxt->valueNr++);
2338xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt) {
2339 xmlXPathObjectPtr
obj;
2342 obj = valuePop(ctxt);
2344 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2347 if (
obj->type != XPATH_BOOLEAN)
2348 ret = xmlXPathCastToBoolean(
obj);
2351 xmlXPathReleaseObject(ctxt->context,
obj);
2365xmlXPathPopNumber (xmlXPathParserContextPtr ctxt) {
2366 xmlXPathObjectPtr
obj;
2369 obj = valuePop(ctxt);
2371 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2374 if (
obj->type != XPATH_NUMBER)
2375 ret = xmlXPathCastToNumber(
obj);
2378 xmlXPathReleaseObject(ctxt->context,
obj);
2392xmlXPathPopString (xmlXPathParserContextPtr ctxt) {
2393 xmlXPathObjectPtr
obj;
2396 obj = valuePop(ctxt);
2398 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2401 ret = xmlXPathCastToString(
obj);
2403 if (
obj->stringval ==
ret)
2405 xmlXPathReleaseObject(ctxt->context,
obj);
2419xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt) {
2420 xmlXPathObjectPtr
obj;
2424 if (ctxt->value ==
NULL) {
2425 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2428 if (!xmlXPathStackIsNodeSet(ctxt)) {
2429 xmlXPathSetTypeError(ctxt);
2432 obj = valuePop(ctxt);
2437 xmlFreeNodeList((xmlNodePtr)
obj->user);
2440 xmlXPathReleaseObject(ctxt->context,
obj);
2454xmlXPathPopExternal (xmlXPathParserContextPtr ctxt) {
2455 xmlXPathObjectPtr
obj;
2458 if ((ctxt ==
NULL) || (ctxt->value ==
NULL)) {
2459 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2462 if (ctxt->value->type != XPATH_USERS) {
2463 xmlXPathSetTypeError(ctxt);
2466 obj = valuePop(ctxt);
2469 xmlXPathReleaseObject(ctxt->context,
obj);
2496#define CUR (*ctxt->cur)
2497#define SKIP(val) ctxt->cur += (val)
2498#define NXT(val) ctxt->cur[(val)]
2499#define CUR_PTR ctxt->cur
2500#define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l)
2502#define COPY_BUF(l,b,i,v) \
2503 if (l == 1) b[i++] = v; \
2504 else i += xmlCopyChar(l,&b[i],v)
2506#define NEXTL(l) ctxt->cur += l
2508#define SKIP_BLANKS \
2509 while (IS_BLANK_CH(*(ctxt->cur))) NEXT
2511#define CURRENT (*ctxt->cur)
2512#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur)
2519#define DBL_EPSILON 1E-9
2522#define UPPER_DOUBLE 1E9
2523#define LOWER_DOUBLE 1E-5
2524#define LOWER_DOUBLE_EXP 5
2526#define INTEGER_DIGITS DBL_DIG
2527#define FRACTION_DIGITS (DBL_DIG + 1 + (LOWER_DOUBLE_EXP))
2528#define EXPONENT_DIGITS (3 + 2)
2539xmlXPathFormatNumber(
double number,
char buffer[],
int buffersize)
2541 switch (xmlXPathIsInf(
number)) {
2543 if (buffersize > (
int)
sizeof(
"Infinity"))
2547 if (buffersize > (
int)
sizeof(
"-Infinity"))
2551 if (xmlXPathIsNaN(
number)) {
2552 if (buffersize > (
int)
sizeof(
"NaN"))
2554 }
else if (
number == 0) {
2575 }
else if (buffersize > 0) {
2589 char work[
DBL_DIG + EXPONENT_DIGITS + 3 + LOWER_DOUBLE_EXP];
2590 int integer_place, fraction_place;
2592 char *after_fraction;
2593 double absolute_value;
2603 if ( ((absolute_value > UPPER_DOUBLE) ||
2604 (absolute_value < LOWER_DOUBLE)) &&
2605 (absolute_value != 0.0) ) {
2607 integer_place =
DBL_DIG + EXPONENT_DIGITS + 1;
2610 integer_place, fraction_place,
number);
2616 if (absolute_value > 0.0) {
2617 integer_place = (
int)
log10(absolute_value);
2618 if (integer_place > 0)
2619 fraction_place =
DBL_DIG - integer_place - 1;
2621 fraction_place =
DBL_DIG - integer_place;
2630 while (work[0] ==
' ') {
2636 after_fraction = work +
size;
2637 ptr = after_fraction;
2638 while (*(--
ptr) ==
'0')
2642 while ((*
ptr++ = *after_fraction++) != 0);
2646 if (
size > buffersize) {
2647 work[buffersize - 1] = 0;
2677xmlXPathOrderDocElems(xmlDocPtr doc) {
2683 cur = doc->children;
2685 if (
cur->type == XML_ELEMENT_NODE) {
2686 cur->content = (
void *) (-(++
count));
2700 if (
cur == (xmlNodePtr) doc) {
2724xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) {
2726 int attr1 = 0, attr2 = 0;
2727 xmlNodePtr attrNode1 =
NULL, attrNode2 =
NULL;
2730 if ((node1 ==
NULL) || (node2 ==
NULL))
2737 if (node1->type == XML_ATTRIBUTE_NODE) {
2740 node1 = node1->parent;
2742 if (node2->type == XML_ATTRIBUTE_NODE) {
2745 node2 = node2->parent;
2747 if (node1 == node2) {
2748 if (attr1 == attr2) {
2751 cur = attrNode2->prev;
2753 if (
cur == attrNode1)
2765 if ((node1->type == XML_NAMESPACE_DECL) ||
2766 (node2->type == XML_NAMESPACE_DECL))
2768 if (node1 == node2->prev)
2770 if (node1 == node2->next)
2776 if ((node1->type == XML_ELEMENT_NODE) &&
2777 (node2->type == XML_ELEMENT_NODE) &&
2780 (node1->doc == node2->doc)) {
2795 if (
cur->parent == node1)
2801 if (
cur->parent == node2)
2814 while (depth1 > depth2) {
2816 node1 = node1->parent;
2818 while (depth2 > depth1) {
2820 node2 = node2->parent;
2822 while (node1->parent != node2->parent) {
2823 node1 = node1->parent;
2824 node2 = node2->parent;
2826 if ((node1 ==
NULL) || (node2 ==
NULL))
2832 if (node1 == node2->prev)
2834 if (node1 == node2->next)
2839 if ((node1->type == XML_ELEMENT_NODE) &&
2840 (node2->type == XML_ELEMENT_NODE) &&
2843 (node1->doc == node2->doc)) {
2867xmlXPathNodeSetSort(xmlNodeSetPtr
set) {
2868#ifndef WITH_TIM_SORT
2869 int i,
j, incr,
len;
2876#ifndef WITH_TIM_SORT
2882 for (incr =
len / 2; incr > 0; incr /= 2) {
2883 for (
i = incr;
i <
len;
i++) {
2886#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
2887 if (xmlXPathCmpNodesExt(
set->nodeTab[
j],
2888 set->nodeTab[
j + incr]) == -1)
2890 if (xmlXPathCmpNodes(
set->nodeTab[
j],
2891 set->nodeTab[
j + incr]) == -1)
2894 tmp =
set->nodeTab[
j];
2895 set->nodeTab[
j] =
set->nodeTab[
j + incr];
2896 set->nodeTab[
j + incr] = tmp;
2904 libxml_domnode_tim_sort(
set->nodeTab,
set->nodeNr);
2908#define XML_NODESET_DEFAULT 10
2921xmlXPathNodeSetDupNs(xmlNodePtr
node, xmlNsPtr
ns) {
2924 if ((
ns ==
NULL) || (
ns->type != XML_NAMESPACE_DECL))
2926 if ((
node ==
NULL) || (
node->type == XML_NAMESPACE_DECL))
2927 return((xmlNodePtr)
ns);
2934 xmlXPathErrMemory(
NULL,
"duplicating namespace\n");
2938 cur->type = XML_NAMESPACE_DECL;
2944 return((xmlNodePtr)
cur);
2956xmlXPathNodeSetFreeNs(xmlNsPtr
ns) {
2957 if ((
ns ==
NULL) || (
ns->type != XML_NAMESPACE_DECL))
2960 if ((
ns->next !=
NULL) && (
ns->next->type != XML_NAMESPACE_DECL)) {
2978xmlXPathNodeSetCreate(xmlNodePtr
val) {
2983 xmlXPathErrMemory(
NULL,
"creating nodeset\n");
2988 ret->nodeTab = (xmlNodePtr *)
xmlMalloc(XML_NODESET_DEFAULT *
2989 sizeof(xmlNodePtr));
2991 xmlXPathErrMemory(
NULL,
"creating nodeset\n");
2996 XML_NODESET_DEFAULT *
sizeof(xmlNodePtr));
2997 ret->nodeMax = XML_NODESET_DEFAULT;
2998 if (
val->type == XML_NAMESPACE_DECL) {
2999 xmlNsPtr
ns = (xmlNsPtr)
val;
3000 xmlNodePtr nsNode = xmlXPathNodeSetDupNs((xmlNodePtr)
ns->next,
ns);
3002 if (nsNode ==
NULL) {
3003 xmlXPathFreeNodeSet(
ret);
3006 ret->nodeTab[
ret->nodeNr++] = nsNode;
3023xmlXPathNodeSetContains (xmlNodeSetPtr
cur, xmlNodePtr
val) {
3027 if (
val->type == XML_NAMESPACE_DECL) {
3028 for (
i = 0;
i <
cur->nodeNr;
i++) {
3029 if (
cur->nodeTab[
i]->type == XML_NAMESPACE_DECL) {
3032 ns1 = (xmlNsPtr)
val;
3033 ns2 = (xmlNsPtr)
cur->nodeTab[
i];
3036 if ((ns1->next !=
NULL) && (ns2->next == ns1->next) &&
3042 for (
i = 0;
i <
cur->nodeNr;
i++) {
3061xmlXPathNodeSetAddNs(xmlNodeSetPtr
cur, xmlNodePtr
node, xmlNsPtr
ns) {
3066 (
ns->type != XML_NAMESPACE_DECL) ||
3067 (
node->type != XML_ELEMENT_NODE))
3074 for (
i = 0;
i <
cur->nodeNr;
i++) {
3076 (
cur->nodeTab[
i]->type == XML_NAMESPACE_DECL) &&
3077 (((xmlNsPtr)
cur->nodeTab[
i])->next == (xmlNsPtr)
node) &&
3085 if (
cur->nodeMax == 0) {
3086 cur->nodeTab = (xmlNodePtr *)
xmlMalloc(XML_NODESET_DEFAULT *
3087 sizeof(xmlNodePtr));
3089 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3093 XML_NODESET_DEFAULT *
sizeof(xmlNodePtr));
3094 cur->nodeMax = XML_NODESET_DEFAULT;
3095 }
else if (
cur->nodeNr ==
cur->nodeMax) {
3099 xmlXPathErrMemory(
NULL,
"growing nodeset hit limit\n");
3103 sizeof(xmlNodePtr));
3105 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3111 nsNode = xmlXPathNodeSetDupNs(
node,
ns);
3114 cur->nodeTab[
cur->nodeNr++] = nsNode;
3128xmlXPathNodeSetAdd(xmlNodeSetPtr
cur, xmlNodePtr
val) {
3137 for (
i = 0;
i <
cur->nodeNr;
i++)
3138 if (
cur->nodeTab[
i] ==
val)
return(0);
3143 if (
cur->nodeMax == 0) {
3144 cur->nodeTab = (xmlNodePtr *)
xmlMalloc(XML_NODESET_DEFAULT *
3145 sizeof(xmlNodePtr));
3147 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3151 XML_NODESET_DEFAULT *
sizeof(xmlNodePtr));
3152 cur->nodeMax = XML_NODESET_DEFAULT;
3153 }
else if (
cur->nodeNr ==
cur->nodeMax) {
3157 xmlXPathErrMemory(
NULL,
"growing nodeset hit limit\n");
3161 sizeof(xmlNodePtr));
3163 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3169 if (
val->type == XML_NAMESPACE_DECL) {
3170 xmlNsPtr
ns = (xmlNsPtr)
val;
3171 xmlNodePtr nsNode = xmlXPathNodeSetDupNs((xmlNodePtr)
ns->next,
ns);
3175 cur->nodeTab[
cur->nodeNr++] = nsNode;
3192xmlXPathNodeSetAddUnique(xmlNodeSetPtr
cur, xmlNodePtr
val) {
3199 if (
cur->nodeMax == 0) {
3200 cur->nodeTab = (xmlNodePtr *)
xmlMalloc(XML_NODESET_DEFAULT *
3201 sizeof(xmlNodePtr));
3203 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3207 XML_NODESET_DEFAULT *
sizeof(xmlNodePtr));
3208 cur->nodeMax = XML_NODESET_DEFAULT;
3209 }
else if (
cur->nodeNr ==
cur->nodeMax) {
3213 xmlXPathErrMemory(
NULL,
"growing nodeset hit limit\n");
3217 sizeof(xmlNodePtr));
3219 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3225 if (
val->type == XML_NAMESPACE_DECL) {
3226 xmlNsPtr
ns = (xmlNsPtr)
val;
3227 xmlNodePtr nsNode = xmlXPathNodeSetDupNs((xmlNodePtr)
ns->next,
ns);
3231 cur->nodeTab[
cur->nodeNr++] = nsNode;
3250xmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) {
3254 if (val2 ==
NULL)
return(val1);
3256 val1 = xmlXPathNodeSetCreate(
NULL);
3262 initNr = val1->nodeNr;
3264 for (
i = 0;
i < val2->nodeNr;
i++) {
3265 n2 = val2->nodeTab[
i];
3270 for (
j = 0;
j < initNr;
j++) {
3271 n1 = val1->nodeTab[
j];
3275 }
else if ((
n1->type == XML_NAMESPACE_DECL) &&
3276 (
n2->type == XML_NAMESPACE_DECL)) {
3277 if ((((xmlNsPtr)
n1)->
next == ((xmlNsPtr)
n2)->
next) &&
3292 if (val1->nodeMax == 0) {
3293 val1->nodeTab = (xmlNodePtr *)
xmlMalloc(XML_NODESET_DEFAULT *
3294 sizeof(xmlNodePtr));
3295 if (val1->nodeTab ==
NULL) {
3296 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
3299 memset(val1->nodeTab, 0 ,
3300 XML_NODESET_DEFAULT *
sizeof(xmlNodePtr));
3301 val1->nodeMax = XML_NODESET_DEFAULT;
3302 }
else if (val1->nodeNr == val1->nodeMax) {
3306 xmlXPathErrMemory(
NULL,
"merging nodeset hit limit\n");
3309 temp = (xmlNodePtr *)
xmlRealloc(val1->nodeTab, val1->nodeMax * 2 *
3310 sizeof(xmlNodePtr));
3312 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
3315 val1->nodeTab =
temp;
3318 if (
n2->type == XML_NAMESPACE_DECL) {
3319 xmlNsPtr
ns = (xmlNsPtr)
n2;
3320 xmlNodePtr nsNode = xmlXPathNodeSetDupNs((xmlNodePtr)
ns->next,
ns);
3324 val1->nodeTab[val1->nodeNr++] = nsNode;
3326 val1->nodeTab[val1->nodeNr++] =
n2;
3332 xmlXPathFreeNodeSet(val1);
3350xmlXPathNodeSetMergeAndClear(xmlNodeSetPtr
set1, xmlNodeSetPtr set2)
3353 int i,
j, initNbSet1;
3356 initNbSet1 =
set1->nodeNr;
3357 for (
i = 0;
i < set2->nodeNr;
i++) {
3358 n2 = set2->nodeTab[
i];
3362 for (
j = 0;
j < initNbSet1;
j++) {
3366 }
else if ((
n1->type == XML_NAMESPACE_DECL) &&
3367 (
n2->type == XML_NAMESPACE_DECL))
3369 if ((((xmlNsPtr)
n1)->
next == ((xmlNsPtr)
n2)->
next) &&
3376 xmlXPathNodeSetFreeNs((xmlNsPtr)
n2);
3384 if (
set1->nodeMax == 0) {
3386 XML_NODESET_DEFAULT *
sizeof(xmlNodePtr));
3388 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
3392 XML_NODESET_DEFAULT *
sizeof(xmlNodePtr));
3393 set1->nodeMax = XML_NODESET_DEFAULT;
3394 }
else if (
set1->nodeNr >=
set1->nodeMax) {
3398 xmlXPathErrMemory(
NULL,
"merging nodeset hit limit\n");
3402 set1->nodeTab,
set1->nodeMax * 2 *
sizeof(xmlNodePtr));
3404 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
3412 set2->nodeTab[
i] =
NULL;
3419 xmlXPathFreeNodeSet(
set1);
3420 xmlXPathNodeSetClear(set2, 1);
3437xmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr
set1, xmlNodeSetPtr set2)
3443 for (
i = 0;
i < set2->nodeNr;
i++) {
3444 n2 = set2->nodeTab[
i];
3445 if (
set1->nodeMax == 0) {
3447 XML_NODESET_DEFAULT *
sizeof(xmlNodePtr));
3449 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
3453 XML_NODESET_DEFAULT *
sizeof(xmlNodePtr));
3454 set1->nodeMax = XML_NODESET_DEFAULT;
3455 }
else if (
set1->nodeNr >=
set1->nodeMax) {
3459 xmlXPathErrMemory(
NULL,
"merging nodeset hit limit\n");
3463 set1->nodeTab,
set1->nodeMax * 2 *
sizeof(xmlNodePtr));
3465 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
3472 set2->nodeTab[
i] =
NULL;
3479 xmlXPathFreeNodeSet(
set1);
3480 xmlXPathNodeSetClear(set2, 1);
3492xmlXPathNodeSetDel(xmlNodeSetPtr
cur, xmlNodePtr
val) {
3501 for (
i = 0;
i <
cur->nodeNr;
i++)
3502 if (
cur->nodeTab[
i] ==
val)
break;
3504 if (
i >=
cur->nodeNr) {
3508 (
cur->nodeTab[
i]->type == XML_NAMESPACE_DECL))
3509 xmlXPathNodeSetFreeNs((xmlNsPtr)
cur->nodeTab[
i]);
3511 for (;
i <
cur->nodeNr;
i++)
3512 cur->nodeTab[
i] =
cur->nodeTab[
i + 1];
3524xmlXPathNodeSetRemove(xmlNodeSetPtr
cur,
int val) {
3526 if (
val >=
cur->nodeNr)
return;
3528 (
cur->nodeTab[
val]->type == XML_NAMESPACE_DECL))
3529 xmlXPathNodeSetFreeNs((xmlNsPtr)
cur->nodeTab[
val]);
3543xmlXPathFreeNodeSet(xmlNodeSetPtr
obj) {
3549 for (
i = 0;
i <
obj->nodeNr;
i++)
3551 (
obj->nodeTab[
i]->type == XML_NAMESPACE_DECL))
3552 xmlXPathNodeSetFreeNs((xmlNsPtr)
obj->nodeTab[
i]);
3568xmlXPathNodeSetClearFromPos(xmlNodeSetPtr
set,
int pos,
int hasNsNodes)
3572 else if ((hasNsNodes)) {
3579 (
node->type == XML_NAMESPACE_DECL))
3580 xmlXPathNodeSetFreeNs((xmlNsPtr)
node);
3595xmlXPathNodeSetClear(xmlNodeSetPtr
set,
int hasNsNodes)
3597 xmlXPathNodeSetClearFromPos(
set, 0, hasNsNodes);
3609xmlXPathNodeSetKeepLast(xmlNodeSetPtr
set)
3616 for (
i = 0;
i <
set->nodeNr - 1;
i++) {
3619 (
node->type == XML_NAMESPACE_DECL))
3620 xmlXPathNodeSetFreeNs((xmlNsPtr)
node);
3622 set->nodeTab[0] =
set->nodeTab[
set->nodeNr-1];
3634xmlXPathFreeValueTree(xmlNodeSetPtr
obj) {
3640 for (
i = 0;
i <
obj->nodeNr;
i++) {
3642 if (
obj->nodeTab[
i]->type == XML_NAMESPACE_DECL) {
3643 xmlXPathNodeSetFreeNs((xmlNsPtr)
obj->nodeTab[
i]);
3645 xmlFreeNodeList(
obj->nodeTab[
i]);
3664xmlXPathNewNodeSet(xmlNodePtr
val) {
3665 xmlXPathObjectPtr
ret;
3667 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
3669 xmlXPathErrMemory(
NULL,
"creating nodeset\n");
3672 memset(
ret, 0 ,
sizeof(xmlXPathObject));
3673 ret->type = XPATH_NODESET;
3676 ret->nodesetval = xmlXPathNodeSetCreate(
val);
3691xmlXPathNewValueTree(xmlNodePtr
val) {
3692 xmlXPathObjectPtr
ret;
3694 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
3696 xmlXPathErrMemory(
NULL,
"creating result value tree\n");
3699 memset(
ret, 0 ,
sizeof(xmlXPathObject));
3700 ret->type = XPATH_XSLT_TREE;
3702 ret->user = (
void *)
val;
3703 ret->nodesetval = xmlXPathNodeSetCreate(
val);
3717xmlXPathNewNodeSetList(xmlNodeSetPtr
val)
3719 xmlXPathObjectPtr
ret;
3724 else if (
val->nodeTab ==
NULL)
3725 ret = xmlXPathNewNodeSet(
NULL);
3727 ret = xmlXPathNewNodeSet(
val->nodeTab[0]);
3729 for (
i = 1;
i <
val->nodeNr; ++
i) {
3731 if (xmlXPathNodeSetAddUnique(
ret->nodesetval,
val->nodeTab[
i])
3751xmlXPathWrapNodeSet(xmlNodeSetPtr
val) {
3752 xmlXPathObjectPtr
ret;
3754 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
3756 xmlXPathErrMemory(
NULL,
"creating node set object\n");
3757 xmlXPathFreeNodeSet(
val);
3760 memset(
ret, 0 ,
sizeof(xmlXPathObject));
3761 ret->type = XPATH_NODESET;
3774xmlXPathFreeNodeSetList(xmlXPathObjectPtr
obj) {
3791xmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
3796 if (xmlXPathNodeSetIsEmpty(nodes2))
3800 ret = xmlXPathNodeSetCreate(
NULL);
3801 if (xmlXPathNodeSetIsEmpty(nodes1))
3804 l1 = xmlXPathNodeSetGetLength(nodes1);
3806 for (
i = 0;
i < l1;
i++) {
3807 cur = xmlXPathNodeSetItem(nodes1,
i);
3808 if (!xmlXPathNodeSetContains(nodes2,
cur)) {
3810 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
3829xmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
3830 xmlNodeSetPtr
ret = xmlXPathNodeSetCreate(
NULL);
3836 if (xmlXPathNodeSetIsEmpty(nodes1))
3838 if (xmlXPathNodeSetIsEmpty(nodes2))
3841 l1 = xmlXPathNodeSetGetLength(nodes1);
3843 for (
i = 0;
i < l1;
i++) {
3844 cur = xmlXPathNodeSetItem(nodes1,
i);
3845 if (xmlXPathNodeSetContains(nodes2,
cur)) {
3847 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
3865xmlXPathDistinctSorted (xmlNodeSetPtr nodes) {
3872 if (xmlXPathNodeSetIsEmpty(nodes))
3875 ret = xmlXPathNodeSetCreate(
NULL);
3878 l = xmlXPathNodeSetGetLength(nodes);
3880 for (
i = 0;
i <
l;
i++) {
3881 cur = xmlXPathNodeSetItem(nodes,
i);
3888 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
3899 xmlXPathFreeNodeSet(
ret);
3916xmlXPathDistinct (xmlNodeSetPtr nodes) {
3917 if (xmlXPathNodeSetIsEmpty(nodes))
3920 xmlXPathNodeSetSort(nodes);
3921 return(xmlXPathDistinctSorted(nodes));
3936xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
3940 if (xmlXPathNodeSetIsEmpty(nodes1) ||
3941 xmlXPathNodeSetIsEmpty(nodes2))
3944 l = xmlXPathNodeSetGetLength(nodes1);
3945 for (
i = 0;
i <
l;
i++) {
3946 cur = xmlXPathNodeSetItem(nodes1,
i);
3947 if (xmlXPathNodeSetContains(nodes2,
cur))
3966xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes, xmlNodePtr
node) {
3974 ret = xmlXPathNodeSetCreate(
NULL);
3977 if (xmlXPathNodeSetIsEmpty(nodes) ||
3978 (!xmlXPathNodeSetContains(nodes,
node)))
3981 l = xmlXPathNodeSetGetLength(nodes);
3982 for (
i = 0;
i <
l;
i++) {
3983 cur = xmlXPathNodeSetItem(nodes,
i);
3987 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
4008xmlXPathNodeLeading (xmlNodeSetPtr nodes, xmlNodePtr
node) {
4009 xmlXPathNodeSetSort(nodes);
4010 return(xmlXPathNodeLeadingSorted(nodes,
node));
4026xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4027 if (xmlXPathNodeSetIsEmpty(nodes2))
4029 return(xmlXPathNodeLeadingSorted(nodes1,
4030 xmlXPathNodeSetItem(nodes2, 1)));
4048xmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4049 if (xmlXPathNodeSetIsEmpty(nodes2))
4051 if (xmlXPathNodeSetIsEmpty(nodes1))
4052 return(xmlXPathNodeSetCreate(
NULL));
4053 xmlXPathNodeSetSort(nodes1);
4054 xmlXPathNodeSetSort(nodes2);
4055 return(xmlXPathNodeLeadingSorted(nodes1,
4056 xmlXPathNodeSetItem(nodes2, 1)));
4072xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes, xmlNodePtr
node) {
4080 ret = xmlXPathNodeSetCreate(
NULL);
4083 if (xmlXPathNodeSetIsEmpty(nodes) ||
4084 (!xmlXPathNodeSetContains(nodes,
node)))
4087 l = xmlXPathNodeSetGetLength(nodes);
4088 for (
i =
l - 1;
i >= 0;
i--) {
4089 cur = xmlXPathNodeSetItem(nodes,
i);
4093 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
4096 xmlXPathNodeSetSort(
ret);
4115xmlXPathNodeTrailing (xmlNodeSetPtr nodes, xmlNodePtr
node) {
4116 xmlXPathNodeSetSort(nodes);
4117 return(xmlXPathNodeTrailingSorted(nodes,
node));
4133xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4134 if (xmlXPathNodeSetIsEmpty(nodes2))
4136 return(xmlXPathNodeTrailingSorted(nodes1,
4137 xmlXPathNodeSetItem(nodes2, 0)));
4155xmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4156 if (xmlXPathNodeSetIsEmpty(nodes2))
4158 if (xmlXPathNodeSetIsEmpty(nodes1))
4159 return(xmlXPathNodeSetCreate(
NULL));
4160 xmlXPathNodeSetSort(nodes1);
4161 xmlXPathNodeSetSort(nodes2);
4162 return(xmlXPathNodeTrailingSorted(nodes1,
4163 xmlXPathNodeSetItem(nodes2, 0)));
4183xmlXPathRegisterFunc(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4184 xmlXPathFunction
f) {
4185 return(xmlXPathRegisterFuncNS(ctxt,
name,
NULL,
f));
4200xmlXPathRegisterFuncNS(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4201 const xmlChar *ns_uri, xmlXPathFunction
f) {
4207 if (ctxt->funcHash ==
NULL)
4209 if (ctxt->funcHash ==
NULL)
4227xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt,
4228 xmlXPathFuncLookupFunc
f,
4232 ctxt->funcLookupFunc =
f;
4233 ctxt->funcLookupData = funcCtxt;
4247xmlXPathFunctionLookup(xmlXPathContextPtr ctxt,
const xmlChar *
name) {
4251 if (ctxt->funcLookupFunc !=
NULL) {
4252 xmlXPathFunction
ret;
4253 xmlXPathFuncLookupFunc
f;
4255 f = ctxt->funcLookupFunc;
4260 return(xmlXPathFunctionLookupNS(ctxt,
name,
NULL));
4275xmlXPathFunctionLookupNS(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4277 xmlXPathFunction
ret;
4284 if (ctxt->funcLookupFunc !=
NULL) {
4285 xmlXPathFuncLookupFunc
f;
4287 f = ctxt->funcLookupFunc;
4288 ret =
f(ctxt->funcLookupData,
name, ns_uri);
4293 if (ctxt->funcHash ==
NULL)
4309xmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt) {
4314 ctxt->funcHash =
NULL;
4335xmlXPathRegisterVariable(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4336 xmlXPathObjectPtr
value) {
4337 return(xmlXPathRegisterVariableNS(ctxt,
name,
NULL,
value));
4353xmlXPathRegisterVariableNS(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4355 xmlXPathObjectPtr
value) {
4361 if (ctxt->varHash ==
NULL)
4363 if (ctxt->varHash ==
NULL)
4367 xmlXPathFreeObjectEntry));
4369 (
void *)
value, xmlXPathFreeObjectEntry));
4381xmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt,
4382 xmlXPathVariableLookupFunc
f,
void *
data) {
4385 ctxt->varLookupFunc =
f;
4386 ctxt->varLookupData =
data;
4400xmlXPathVariableLookup(xmlXPathContextPtr ctxt,
const xmlChar *
name) {
4404 if (ctxt->varLookupFunc !=
NULL) {
4405 xmlXPathObjectPtr
ret;
4407 ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc)
4411 return(xmlXPathVariableLookupNS(ctxt,
name,
NULL));
4426xmlXPathVariableLookupNS(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4431 if (ctxt->varLookupFunc !=
NULL) {
4432 xmlXPathObjectPtr
ret;
4434 ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc)
4435 (ctxt->varLookupData,
name, ns_uri);
4439 if (ctxt->varHash ==
NULL)
4444 return(xmlXPathCacheObjectCopy(ctxt, (xmlXPathObjectPtr)
4455xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt) {
4459 xmlHashFree(ctxt->varHash, xmlXPathFreeObjectEntry);
4460 ctxt->varHash =
NULL;
4475xmlXPathRegisterNs(xmlXPathContextPtr ctxt,
const xmlChar *
prefix,
4486 if (ctxt->nsHash ==
NULL)
4488 if (ctxt->nsHash ==
NULL)
4517xmlXPathNsLookup(xmlXPathContextPtr ctxt,
const xmlChar *
prefix) {
4523#ifdef XML_XML_NAMESPACE
4525 return(XML_XML_NAMESPACE);
4528 if (ctxt->namespaces !=
NULL) {
4531 for (
i = 0;
i < ctxt->nsNr;
i++) {
4532 if ((ctxt->namespaces[
i] !=
NULL) &&
4534 return(ctxt->namespaces[
i]->href);
4548xmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) {
4553 ctxt->nsHash =
NULL;
4573xmlXPathNewFloat(
double val) {
4574 xmlXPathObjectPtr
ret;
4576 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
4578 xmlXPathErrMemory(
NULL,
"creating float object\n");
4581 memset(
ret, 0 ,
sizeof(xmlXPathObject));
4582 ret->type = XPATH_NUMBER;
4596xmlXPathNewBoolean(
int val) {
4597 xmlXPathObjectPtr
ret;
4599 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
4601 xmlXPathErrMemory(
NULL,
"creating boolean object\n");
4604 memset(
ret, 0 ,
sizeof(xmlXPathObject));
4605 ret->type = XPATH_BOOLEAN;
4606 ret->boolval = (
val != 0);
4620 xmlXPathObjectPtr
ret;
4622 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
4624 xmlXPathErrMemory(
NULL,
"creating string object\n");
4627 memset(
ret, 0 ,
sizeof(xmlXPathObject));
4628 ret->type = XPATH_STRING;
4651 xmlXPathObjectPtr
ret;
4653 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
4655 xmlXPathErrMemory(
NULL,
"creating string object\n");
4659 memset(
ret, 0 ,
sizeof(xmlXPathObject));
4660 ret->type = XPATH_STRING;
4674xmlXPathNewCString(
const char *
val) {
4687xmlXPathWrapCString (
char *
val) {
4688 return(xmlXPathWrapString((
xmlChar *)(
val)));
4700xmlXPathWrapExternal (
void *
val) {
4701 xmlXPathObjectPtr
ret;
4703 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
4705 xmlXPathErrMemory(
NULL,
"creating user object\n");
4708 memset(
ret, 0 ,
sizeof(xmlXPathObject));
4709 ret->type = XPATH_USERS;
4723xmlXPathObjectCopy(xmlXPathObjectPtr
val) {
4724 xmlXPathObjectPtr
ret;
4729 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
4731 xmlXPathErrMemory(
NULL,
"copying object\n");
4735 switch (
val->type) {
4738#ifdef LIBXML_XPTR_LOCS_ENABLED
4750 case XPATH_XSLT_TREE:
4757 if ((
val->nodesetval !=
NULL) &&
4758 (
val->nodesetval->nodeTab !=
NULL)) {
4759 xmlNodePtr
cur, tmp;
4764 top->name = (
char *)
4769 cur =
val->nodesetval->nodeTab[0]->children;
4771 tmp = xmlDocCopyNode(
cur,
top, 1);
4772 xmlAddChild((xmlNodePtr)
top, tmp);
4777 ret->nodesetval = xmlXPathNodeSetCreate((xmlNodePtr)
top);
4779 ret->nodesetval = xmlXPathNodeSetCreate(
NULL);
4785 ret->nodesetval = xmlXPathNodeSetMerge(
NULL,
val->nodesetval);
4789#ifdef LIBXML_XPTR_LOCS_ENABLED
4790 case XPATH_LOCATIONSET:
4792 xmlLocationSetPtr loc =
val->user;
4793 ret->user = (
void *) xmlXPtrLocationSetMerge(
NULL, loc);
4800 case XPATH_UNDEFINED:
4802 "xmlXPathObjectCopy: unsupported type %d\n",
4816xmlXPathFreeObject(xmlXPathObjectPtr
obj) {
4818 if ((
obj->type == XPATH_NODESET) || (
obj->type == XPATH_XSLT_TREE)) {
4822 xmlXPathFreeNodeSet(
obj->nodesetval);
4823 xmlFreeNodeList((xmlNodePtr)
obj->user);
4826 obj->type = XPATH_XSLT_TREE;
4828 xmlXPathFreeValueTree(
obj->nodesetval);
4831 xmlXPathFreeNodeSet(
obj->nodesetval);
4833#ifdef LIBXML_XPTR_LOCS_ENABLED
4834 }
else if (
obj->type == XPATH_LOCATIONSET) {
4836 xmlXPtrFreeLocationSet(
obj->user);
4838 }
else if (
obj->type == XPATH_STRING) {
4847 xmlXPathFreeObject((xmlXPathObjectPtr)
obj);
4858xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
obj)
4860#define XP_CACHE_ADD(sl, o) if (sl == NULL) { \
4861 sl = xmlPointerListCreate(10); if (sl == NULL) goto free_obj; } \
4862 if (xmlPointerListAddSize(sl, obj, 0) == -1) goto free_obj;
4864#define XP_CACHE_WANTS(sl, n) ((sl == NULL) || ((sl)->number < n))
4868 if ((ctxt ==
NULL) || (ctxt->cache ==
NULL)) {
4869 xmlXPathFreeObject(
obj);
4871 xmlXPathContextCachePtr
cache =
4872 (xmlXPathContextCachePtr) ctxt->cache;
4876 case XPATH_XSLT_TREE:
4877 if (
obj->nodesetval !=
NULL) {
4884 obj->type = XPATH_XSLT_TREE;
4885 xmlXPathFreeValueTree(
obj->nodesetval);
4887 }
else if ((
obj->nodesetval->nodeMax <= 40) &&
4888 (XP_CACHE_WANTS(
cache->nodesetObjs,
4889 cache->maxNodeset)))
4891 XP_CACHE_ADD(
cache->nodesetObjs,
obj);
4894 xmlXPathFreeNodeSet(
obj->nodesetval);
4903 if (XP_CACHE_WANTS(
cache->stringObjs,
cache->maxString)) {
4904 XP_CACHE_ADD(
cache->stringObjs,
obj);
4909 if (XP_CACHE_WANTS(
cache->booleanObjs,
cache->maxBoolean)) {
4910 XP_CACHE_ADD(
cache->booleanObjs,
obj);
4915 if (XP_CACHE_WANTS(
cache->numberObjs,
cache->maxNumber)) {
4916 XP_CACHE_ADD(
cache->numberObjs,
obj);
4920#ifdef LIBXML_XPTR_LOCS_ENABLED
4921 case XPATH_LOCATIONSET:
4923 xmlXPtrFreeLocationSet(
obj->user);
4934 if (XP_CACHE_WANTS(
cache->miscObjs,
cache->maxMisc)) {
4935 XP_CACHE_ADD(
cache->miscObjs,
obj);
4940 if (
obj->nodesetval !=
NULL) {
4941 xmlNodeSetPtr tmpset =
obj->nodesetval;
4949 if (tmpset->nodeNr > 1) {
4953 for (
i = 0;
i < tmpset->nodeNr;
i++) {
4954 node = tmpset->nodeTab[
i];
4956 (
node->type == XML_NAMESPACE_DECL))
4958 xmlXPathNodeSetFreeNs((xmlNsPtr)
node);
4961 }
else if (tmpset->nodeNr == 1) {
4962 if ((tmpset->nodeTab[0] !=
NULL) &&
4963 (tmpset->nodeTab[0]->type == XML_NAMESPACE_DECL))
4964 xmlXPathNodeSetFreeNs((xmlNsPtr) tmpset->nodeTab[0]);
4968 obj->nodesetval = tmpset;
4979 xmlXPathFreeNodeSet(
obj->nodesetval);
5001xmlXPathCastBooleanToString (
int val) {
5019xmlXPathCastNumberToString (
double val) {
5021 switch (xmlXPathIsInf(
val)) {
5029 if (xmlXPathIsNaN(
val)) {
5031 }
else if (
val == 0) {
5037 xmlXPathFormatNumber(
val,
buf, 99);
5054xmlXPathCastNodeToString (xmlNodePtr
node) {
5070xmlXPathCastNodeSetToString (xmlNodeSetPtr
ns) {
5075 xmlXPathNodeSetSort(
ns);
5076 return(xmlXPathCastNodeToString(
ns->nodeTab[0]));
5089xmlXPathCastToString(xmlXPathObjectPtr
val) {
5094 switch (
val->type) {
5095 case XPATH_UNDEFINED:
5099 case XPATH_XSLT_TREE:
5100 ret = xmlXPathCastNodeSetToString(
val->nodesetval);
5105 ret = xmlXPathCastBooleanToString(
val->boolval);
5107 case XPATH_NUMBER: {
5108 ret = xmlXPathCastNumberToString(
val->floatval);
5112#ifdef LIBXML_XPTR_LOCS_ENABLED
5115 case XPATH_LOCATIONSET:
5134xmlXPathConvertString(xmlXPathObjectPtr
val) {
5138 return(xmlXPathNewCString(
""));
5140 switch (
val->type) {
5141 case XPATH_UNDEFINED:
5144 case XPATH_XSLT_TREE:
5145 res = xmlXPathCastNodeSetToString(
val->nodesetval);
5150 res = xmlXPathCastBooleanToString(
val->boolval);
5153 res = xmlXPathCastNumberToString(
val->floatval);
5156#ifdef LIBXML_XPTR_LOCS_ENABLED
5159 case XPATH_LOCATIONSET:
5164 xmlXPathFreeObject(
val);
5166 return(xmlXPathNewCString(
""));
5167 return(xmlXPathWrapString(
res));
5179xmlXPathCastBooleanToNumber(
int val) {
5194xmlXPathCastStringToNumber(
const xmlChar *
val) {
5195 return(xmlXPathStringEvalNumber(
val));
5207xmlXPathCastNodeToNumber (xmlNodePtr
node) {
5212 return(xmlXPathNAN);
5215 return(xmlXPathNAN);
5216 ret = xmlXPathCastStringToNumber(
strval);
5231xmlXPathCastNodeSetToNumber (xmlNodeSetPtr
ns) {
5236 return(xmlXPathNAN);
5237 str = xmlXPathCastNodeSetToString(
ns);
5238 ret = xmlXPathCastStringToNumber(
str);
5252xmlXPathCastToNumber(xmlXPathObjectPtr
val) {
5256 return(xmlXPathNAN);
5257 switch (
val->type) {
5258 case XPATH_UNDEFINED:
5262 case XPATH_XSLT_TREE:
5263 ret = xmlXPathCastNodeSetToNumber(
val->nodesetval);
5266 ret = xmlXPathCastStringToNumber(
val->stringval);
5272 ret = xmlXPathCastBooleanToNumber(
val->boolval);
5275#ifdef LIBXML_XPTR_LOCS_ENABLED
5278 case XPATH_LOCATIONSET:
5297xmlXPathConvertNumber(xmlXPathObjectPtr
val) {
5298 xmlXPathObjectPtr
ret;
5301 return(xmlXPathNewFloat(0.0));
5302 if (
val->type == XPATH_NUMBER)
5304 ret = xmlXPathNewFloat(xmlXPathCastToNumber(
val));
5305 xmlXPathFreeObject(
val);
5318xmlXPathCastNumberToBoolean (
double val) {
5319 if (xmlXPathIsNaN(
val) || (
val == 0.0))
5333xmlXPathCastStringToBoolean (
const xmlChar *
val) {
5348xmlXPathCastNodeSetToBoolean (xmlNodeSetPtr
ns) {
5349 if ((
ns ==
NULL) || (
ns->nodeNr == 0))
5363xmlXPathCastToBoolean (xmlXPathObjectPtr
val) {
5368 switch (
val->type) {
5369 case XPATH_UNDEFINED:
5373 case XPATH_XSLT_TREE:
5374 ret = xmlXPathCastNodeSetToBoolean(
val->nodesetval);
5377 ret = xmlXPathCastStringToBoolean(
val->stringval);
5380 ret = xmlXPathCastNumberToBoolean(
val->floatval);
5386#ifdef LIBXML_XPTR_LOCS_ENABLED
5389 case XPATH_LOCATIONSET:
5409xmlXPathConvertBoolean(xmlXPathObjectPtr
val) {
5410 xmlXPathObjectPtr
ret;
5413 return(xmlXPathNewBoolean(0));
5414 if (
val->type == XPATH_BOOLEAN)
5416 ret = xmlXPathNewBoolean(xmlXPathCastToBoolean(
val));
5417 xmlXPathFreeObject(
val);
5436xmlXPathNewContext(xmlDocPtr doc) {
5437 xmlXPathContextPtr
ret;
5439 ret = (xmlXPathContextPtr)
xmlMalloc(
sizeof(xmlXPathContext));
5441 xmlXPathErrMemory(
NULL,
"creating context\n");
5444 memset(
ret, 0 ,
sizeof(xmlXPathContext));
5463 ret->contextSize = -1;
5464 ret->proximityPosition = -1;
5466#ifdef XP_DEFAULT_CACHE_ON
5467 if (xmlXPathContextSetCache(
ret, 1, -1, 0) == -1) {
5468 xmlXPathFreeContext(
ret);
5473 xmlXPathRegisterAllFunctions(
ret);
5485xmlXPathFreeContext(xmlXPathContextPtr ctxt) {
5486 if (ctxt ==
NULL)
return;
5488 if (ctxt->cache !=
NULL)
5489 xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache);
5490 xmlXPathRegisteredNsCleanup(ctxt);
5491 xmlXPathRegisteredFuncsCleanup(ctxt);
5492 xmlXPathRegisteredVariablesCleanup(ctxt);
5503#define CHECK_CTXT(ctxt) \
5504 if (ctxt == NULL) { \
5505 __xmlRaiseError(NULL, NULL, NULL, \
5506 NULL, NULL, XML_FROM_XPATH, \
5507 XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \
5508 __FILE__, __LINE__, \
5509 NULL, NULL, NULL, 0, 0, \
5510 "NULL context pointer\n"); \
5514#define CHECK_CTXT_NEG(ctxt) \
5515 if (ctxt == NULL) { \
5516 __xmlRaiseError(NULL, NULL, NULL, \
5517 NULL, NULL, XML_FROM_XPATH, \
5518 XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \
5519 __FILE__, __LINE__, \
5520 NULL, NULL, NULL, 0, 0, \
5521 "NULL context pointer\n"); \
5526#define CHECK_CONTEXT(ctxt) \
5527 if ((ctxt == NULL) || (ctxt->doc == NULL) || \
5528 (ctxt->doc->children == NULL)) { \
5529 xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_INVALID_CTXT); \
5543xmlXPathParserContextPtr
5544xmlXPathNewParserContext(
const xmlChar *
str, xmlXPathContextPtr ctxt) {
5545 xmlXPathParserContextPtr
ret;
5547 ret = (xmlXPathParserContextPtr)
xmlMalloc(
sizeof(xmlXPathParserContext));
5549 xmlXPathErrMemory(ctxt,
"creating parser context\n");
5552 memset(
ret, 0 ,
sizeof(xmlXPathParserContext));
5554 ret->context = ctxt;
5556 ret->comp = xmlXPathNewCompExpr();
5562 if ((ctxt !=
NULL) && (ctxt->dict !=
NULL)) {
5563 ret->comp->dict = ctxt->dict;
5579static xmlXPathParserContextPtr
5580xmlXPathCompParserContext(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) {
5581 xmlXPathParserContextPtr
ret;
5583 ret = (xmlXPathParserContextPtr)
xmlMalloc(
sizeof(xmlXPathParserContext));
5585 xmlXPathErrMemory(ctxt,
"creating evaluation context\n");
5588 memset(
ret, 0 ,
sizeof(xmlXPathParserContext));
5591 ret->valueTab = (xmlXPathObjectPtr *)
5592 xmlMalloc(10 *
sizeof(xmlXPathObjectPtr));
5595 xmlXPathErrMemory(ctxt,
"creating evaluation context\n");
5602 ret->context = ctxt;
5615xmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) {
5618 if (ctxt->valueTab !=
NULL) {
5619 for (
i = 0;
i < ctxt->valueNr;
i++) {
5621 xmlXPathReleaseObject(ctxt->context, ctxt->valueTab[
i]);
5623 xmlXPathFreeObject(ctxt->valueTab[
i]);
5627 if (ctxt->comp !=
NULL) {
5628#ifdef XPATH_STREAMING
5629 if (ctxt->comp->stream !=
NULL) {
5630 xmlFreePatternList(ctxt->comp->stream);
5631 ctxt->comp->stream =
NULL;
5634 xmlXPathFreeCompExpr(ctxt->comp);
5655xmlXPathNodeValHash(xmlNodePtr
node) {
5658 xmlNodePtr tmp =
NULL;
5659 unsigned int ret = 0;
5664 if (
node->type == XML_DOCUMENT_NODE) {
5665 tmp = xmlDocGetRootElement((xmlDocPtr)
node);
5675 switch (
node->type) {
5676 case XML_COMMENT_NODE:
5678 case XML_CDATA_SECTION_NODE:
5680 string =
node->content;
5685 return(
string[0] + (
string[1] << 8));
5686 case XML_NAMESPACE_DECL:
5687 string = ((xmlNsPtr)
node)->href;
5692 return(
string[0] + (
string[1] << 8));
5693 case XML_ATTRIBUTE_NODE:
5694 tmp = ((xmlAttrPtr)
node)->children;
5696 case XML_ELEMENT_NODE:
5697 tmp =
node->children;
5702 while (tmp !=
NULL) {
5703 switch (tmp->type) {
5704 case XML_CDATA_SECTION_NODE:
5706 string = tmp->content;
5712 if ((
string !=
NULL) && (
string[0] != 0)) {
5714 return(
ret + (
string[0] << 8));
5716 if (
string[1] == 0) {
5720 return(
string[0] + (
string[1] << 8));
5726 if ((tmp->children !=
NULL) &&
5727 (tmp->type != XML_DTD_NODE) &&
5728 (tmp->type != XML_ENTITY_REF_NODE) &&
5729 (tmp->children->type != XML_ENTITY_DECL)) {
5730 tmp = tmp->children;
5736 if (tmp->next !=
NULL) {
5749 if (tmp->next !=
NULL) {
5753 }
while (tmp !=
NULL);
5768xmlXPathStringHash(
const xmlChar *
string) {
5773 return(
string[0] + (
string[1] << 8));
5799xmlXPathCompareNodeSetFloat(xmlXPathParserContextPtr ctxt,
int inf,
int strict,
5800 xmlXPathObjectPtr
arg, xmlXPathObjectPtr
f) {
5806 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE))) {
5807 xmlXPathReleaseObject(ctxt->context,
arg);
5808 xmlXPathReleaseObject(ctxt->context,
f);
5811 ns =
arg->nodesetval;
5813 for (
i = 0;
i <
ns->nodeNr;
i++) {
5814 str2 = xmlXPathCastNodeToString(
ns->nodeTab[
i]);
5817 xmlXPathCacheNewString(ctxt->context,
str2));
5819 xmlXPathNumberFunction(ctxt, 1);
5820 valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context,
f));
5821 ret = xmlXPathCompareValues(ctxt, inf,
strict);
5827 xmlXPathReleaseObject(ctxt->context,
arg);
5828 xmlXPathReleaseObject(ctxt->context,
f);
5854xmlXPathCompareNodeSetString(xmlXPathParserContextPtr ctxt,
int inf,
int strict,
5855 xmlXPathObjectPtr
arg, xmlXPathObjectPtr
s) {
5861 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE))) {
5862 xmlXPathReleaseObject(ctxt->context,
arg);
5863 xmlXPathReleaseObject(ctxt->context,
s);
5866 ns =
arg->nodesetval;
5868 for (
i = 0;
i <
ns->nodeNr;
i++) {
5869 str2 = xmlXPathCastNodeToString(
ns->nodeTab[
i]);
5872 xmlXPathCacheNewString(ctxt->context,
str2));
5874 valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context,
s));
5875 ret = xmlXPathCompareValues(ctxt, inf,
strict);
5881 xmlXPathReleaseObject(ctxt->context,
arg);
5882 xmlXPathReleaseObject(ctxt->context,
s);
5915xmlXPathCompareNodeSets(
int inf,
int strict,
5916 xmlXPathObjectPtr
arg1, xmlXPathObjectPtr
arg2) {
5925 ((
arg1->type != XPATH_NODESET) && (
arg1->type != XPATH_XSLT_TREE))) {
5926 xmlXPathFreeObject(
arg2);
5930 ((
arg2->type != XPATH_NODESET) && (
arg2->type != XPATH_XSLT_TREE))) {
5931 xmlXPathFreeObject(
arg1);
5932 xmlXPathFreeObject(
arg2);
5936 ns1 =
arg1->nodesetval;
5937 ns2 =
arg2->nodesetval;
5939 if ((ns1 ==
NULL) || (ns1->nodeNr <= 0)) {
5940 xmlXPathFreeObject(
arg1);
5941 xmlXPathFreeObject(
arg2);
5944 if ((ns2 ==
NULL) || (ns2->nodeNr <= 0)) {
5945 xmlXPathFreeObject(
arg1);
5946 xmlXPathFreeObject(
arg2);
5950 values2 = (
double *)
xmlMalloc(ns2->nodeNr *
sizeof(
double));
5951 if (values2 ==
NULL) {
5953 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
5954 xmlXPathFreeObject(
arg1);
5955 xmlXPathFreeObject(
arg2);
5958 for (
i = 0;
i < ns1->nodeNr;
i++) {
5959 val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[
i]);
5960 if (xmlXPathIsNaN(val1))
5962 for (
j = 0;
j < ns2->nodeNr;
j++) {
5964 values2[
j] = xmlXPathCastNodeToNumber(ns2->nodeTab[
j]);
5966 if (xmlXPathIsNaN(values2[
j]))
5969 ret = (val1 < values2[
j]);
5971 ret = (val1 <= values2[
j]);
5973 ret = (val1 > values2[
j]);
5974 else if (!inf && !
strict)
5975 ret = (val1 >= values2[
j]);
5984 xmlXPathFreeObject(
arg1);
5985 xmlXPathFreeObject(
arg2);
6011xmlXPathCompareNodeSetValue(xmlXPathParserContextPtr ctxt,
int inf,
int strict,
6012 xmlXPathObjectPtr
arg, xmlXPathObjectPtr
val) {
6014 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE)))
6019 return(xmlXPathCompareNodeSetFloat(ctxt, inf,
strict,
arg,
val));
6021 case XPATH_XSLT_TREE:
6022 return(xmlXPathCompareNodeSets(inf,
strict,
arg,
val));
6024 return(xmlXPathCompareNodeSetString(ctxt, inf,
strict,
arg,
val));
6026 valuePush(ctxt,
arg);
6027 xmlXPathBooleanFunction(ctxt, 1);
6028 valuePush(ctxt,
val);
6029 return(xmlXPathCompareValues(ctxt, inf,
strict));
6032 "xmlXPathCompareNodeSetValue: Can't compare node set "
6033 "and object of type %d\n",
6035 xmlXPathReleaseObject(ctxt->context,
arg);
6036 xmlXPathReleaseObject(ctxt->context,
val);
6037 XP_ERROR0(XPATH_INVALID_TYPE);
6057xmlXPathEqualNodeSetString(xmlXPathObjectPtr
arg,
const xmlChar *
str,
int neq)
6065 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE)))
6067 ns =
arg->nodesetval;
6072 if ((
ns ==
NULL) || (
ns->nodeNr <= 0) )
6074 hash = xmlXPathStringHash(
str);
6075 for (
i = 0;
i <
ns->nodeNr;
i++) {
6076 if (xmlXPathNodeValHash(
ns->nodeTab[
i]) ==
hash) {
6077 str2 = xmlNodeGetContent(
ns->nodeTab[
i]);
6116xmlXPathEqualNodeSetFloat(xmlXPathParserContextPtr ctxt,
6117 xmlXPathObjectPtr
arg,
double f,
int neq) {
6121 xmlXPathObjectPtr
val;
6125 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE)))
6128 ns =
arg->nodesetval;
6130 for (
i=0;
i<
ns->nodeNr;
i++) {
6131 str2 = xmlXPathCastNodeToString(
ns->nodeTab[
i]);
6133 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
str2));
6135 xmlXPathNumberFunction(ctxt, 1);
6137 val = valuePop(ctxt);
6139 xmlXPathReleaseObject(ctxt->context,
val);
6140 if (!xmlXPathIsNaN(
v)) {
6141 if ((!neq) && (
v==
f)) {
6144 }
else if ((neq) && (
v!=
f)) {
6178xmlXPathEqualNodeSets(xmlXPathObjectPtr
arg1, xmlXPathObjectPtr
arg2,
int neq) {
6180 unsigned int *hashs1;
6181 unsigned int *hashs2;
6189 ((
arg1->type != XPATH_NODESET) && (
arg1->type != XPATH_XSLT_TREE)))
6192 ((
arg2->type != XPATH_NODESET) && (
arg2->type != XPATH_XSLT_TREE)))
6195 ns1 =
arg1->nodesetval;
6196 ns2 =
arg2->nodesetval;
6198 if ((ns1 ==
NULL) || (ns1->nodeNr <= 0))
6200 if ((ns2 ==
NULL) || (ns2->nodeNr <= 0))
6207 for (
i = 0;
i < ns1->nodeNr;
i++)
6208 for (
j = 0;
j < ns2->nodeNr;
j++)
6209 if (ns1->nodeTab[
i] == ns2->nodeTab[
j])
6213 if (values1 ==
NULL) {
6215 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
6218 hashs1 = (
unsigned int *)
xmlMalloc(ns1->nodeNr *
sizeof(
unsigned int));
6219 if (hashs1 ==
NULL) {
6221 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
6227 if (values2 ==
NULL) {
6229 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
6234 hashs2 = (
unsigned int *)
xmlMalloc(ns2->nodeNr *
sizeof(
unsigned int));
6235 if (hashs2 ==
NULL) {
6237 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
6244 for (
i = 0;
i < ns1->nodeNr;
i++) {
6245 hashs1[
i] = xmlXPathNodeValHash(ns1->nodeTab[
i]);
6246 for (
j = 0;
j < ns2->nodeNr;
j++) {
6248 hashs2[
j] = xmlXPathNodeValHash(ns2->nodeTab[
j]);
6249 if (hashs1[
i] != hashs2[
j]) {
6256 if (values1[
i] ==
NULL)
6257 values1[
i] = xmlNodeGetContent(ns1->nodeTab[
i]);
6258 if (values2[
j] ==
NULL)
6259 values2[
j] = xmlNodeGetContent(ns2->nodeTab[
j]);
6268 for (
i = 0;
i < ns1->nodeNr;
i++)
6269 if (values1[
i] !=
NULL)
6271 for (
j = 0;
j < ns2->nodeNr;
j++)
6272 if (values2[
j] !=
NULL)
6282xmlXPathEqualValuesCommon(xmlXPathParserContextPtr ctxt,
6283 xmlXPathObjectPtr
arg1, xmlXPathObjectPtr
arg2) {
6289 switch (
arg1->type) {
6290 case XPATH_UNDEFINED:
6293 switch (
arg2->type) {
6294 case XPATH_UNDEFINED:
6301 xmlXPathCastNumberToBoolean(
arg2->floatval));
6305 (
arg2->stringval[0] == 0))
ret = 0;
6311#ifdef LIBXML_XPTR_LOCS_ENABLED
6314 case XPATH_LOCATIONSET:
6319 case XPATH_XSLT_TREE:
6324 switch (
arg2->type) {
6325 case XPATH_UNDEFINED:
6329 xmlXPathCastNumberToBoolean(
arg1->floatval));
6332 valuePush(ctxt,
arg2);
6333 xmlXPathNumberFunction(ctxt, 1);
6334 arg2 = valuePop(ctxt);
6340 if (xmlXPathIsNaN(
arg1->floatval) ||
6341 xmlXPathIsNaN(
arg2->floatval)) {
6343 }
else if (xmlXPathIsInf(
arg1->floatval) == 1) {
6344 if (xmlXPathIsInf(
arg2->floatval) == 1)
6348 }
else if (xmlXPathIsInf(
arg1->floatval) == -1) {
6349 if (xmlXPathIsInf(
arg2->floatval) == -1)
6353 }
else if (xmlXPathIsInf(
arg2->floatval) == 1) {
6354 if (xmlXPathIsInf(
arg1->floatval) == 1)
6358 }
else if (xmlXPathIsInf(
arg2->floatval) == -1) {
6359 if (xmlXPathIsInf(
arg1->floatval) == -1)
6368#ifdef LIBXML_XPTR_LOCS_ENABLED
6371 case XPATH_LOCATIONSET:
6376 case XPATH_XSLT_TREE:
6381 switch (
arg2->type) {
6382 case XPATH_UNDEFINED:
6386 (
arg1->stringval[0] == 0))
ret = 0;
6395 valuePush(ctxt,
arg1);
6396 xmlXPathNumberFunction(ctxt, 1);
6397 arg1 = valuePop(ctxt);
6401 if (xmlXPathIsNaN(
arg1->floatval) ||
6402 xmlXPathIsNaN(
arg2->floatval)) {
6404 }
else if (xmlXPathIsInf(
arg1->floatval) == 1) {
6405 if (xmlXPathIsInf(
arg2->floatval) == 1)
6409 }
else if (xmlXPathIsInf(
arg1->floatval) == -1) {
6410 if (xmlXPathIsInf(
arg2->floatval) == -1)
6414 }
else if (xmlXPathIsInf(
arg2->floatval) == 1) {
6415 if (xmlXPathIsInf(
arg1->floatval) == 1)
6419 }
else if (xmlXPathIsInf(
arg2->floatval) == -1) {
6420 if (xmlXPathIsInf(
arg1->floatval) == -1)
6429#ifdef LIBXML_XPTR_LOCS_ENABLED
6432 case XPATH_LOCATIONSET:
6437 case XPATH_XSLT_TREE:
6442#ifdef LIBXML_XPTR_LOCS_ENABLED
6445 case XPATH_LOCATIONSET:
6450 case XPATH_XSLT_TREE:
6453 xmlXPathReleaseObject(ctxt->context,
arg1);
6454 xmlXPathReleaseObject(ctxt->context,
arg2);
6467xmlXPathEqualValues(xmlXPathParserContextPtr ctxt) {
6468 xmlXPathObjectPtr
arg1,
arg2, argtmp;
6471 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(0);
6472 arg2 = valuePop(ctxt);
6473 arg1 = valuePop(ctxt);
6476 xmlXPathReleaseObject(ctxt->context,
arg1);
6478 xmlXPathReleaseObject(ctxt->context,
arg2);
6479 XP_ERROR0(XPATH_INVALID_OPERAND);
6483 xmlXPathFreeObject(
arg1);
6490 if ((
arg2->type == XPATH_NODESET) || (
arg2->type == XPATH_XSLT_TREE) ||
6491 (
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE)) {
6495 if ((
arg1->type != XPATH_NODESET) && (
arg1->type != XPATH_XSLT_TREE)) {
6500 switch (
arg2->type) {
6501 case XPATH_UNDEFINED:
6504 case XPATH_XSLT_TREE:
6509 (
arg1->nodesetval->nodeNr == 0))
ret = 0;
6515 ret = xmlXPathEqualNodeSetFloat(ctxt,
arg1,
arg2->floatval, 0);
6518 ret = xmlXPathEqualNodeSetString(
arg1,
arg2->stringval, 0);
6521#ifdef LIBXML_XPTR_LOCS_ENABLED
6524 case XPATH_LOCATIONSET:
6529 xmlXPathReleaseObject(ctxt->context,
arg1);
6530 xmlXPathReleaseObject(ctxt->context,
arg2);
6534 return (xmlXPathEqualValuesCommon(ctxt,
arg1,
arg2));
6546xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt) {
6547 xmlXPathObjectPtr
arg1,
arg2, argtmp;
6550 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(0);
6551 arg2 = valuePop(ctxt);
6552 arg1 = valuePop(ctxt);
6555 xmlXPathReleaseObject(ctxt->context,
arg1);
6557 xmlXPathReleaseObject(ctxt->context,
arg2);
6558 XP_ERROR0(XPATH_INVALID_OPERAND);
6562 xmlXPathReleaseObject(ctxt->context,
arg1);
6569 if ((
arg2->type == XPATH_NODESET) || (
arg2->type == XPATH_XSLT_TREE) ||
6570 (
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE)) {
6574 if ((
arg1->type != XPATH_NODESET) && (
arg1->type != XPATH_XSLT_TREE)) {
6579 switch (
arg2->type) {
6580 case XPATH_UNDEFINED:
6583 case XPATH_XSLT_TREE:
6588 (
arg1->nodesetval->nodeNr == 0))
ret = 0;
6594 ret = xmlXPathEqualNodeSetFloat(ctxt,
arg1,
arg2->floatval, 1);
6597 ret = xmlXPathEqualNodeSetString(
arg1,
arg2->stringval,1);
6600#ifdef LIBXML_XPTR_LOCS_ENABLED
6603 case XPATH_LOCATIONSET:
6608 xmlXPathReleaseObject(ctxt->context,
arg1);
6609 xmlXPathReleaseObject(ctxt->context,
arg2);
6613 return (!xmlXPathEqualValuesCommon(ctxt,
arg1,
arg2));
6641xmlXPathCompareValues(xmlXPathParserContextPtr ctxt,
int inf,
int strict) {
6642 int ret = 0, arg1i = 0, arg2i = 0;
6645 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(0);
6646 arg2 = valuePop(ctxt);
6647 arg1 = valuePop(ctxt);
6650 xmlXPathReleaseObject(ctxt->context,
arg1);
6652 xmlXPathReleaseObject(ctxt->context,
arg2);
6653 XP_ERROR0(XPATH_INVALID_OPERAND);
6656 if ((
arg2->type == XPATH_NODESET) || (
arg2->type == XPATH_XSLT_TREE) ||
6657 (
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE)) {
6663 if (((
arg2->type == XPATH_NODESET) || (
arg2->type == XPATH_XSLT_TREE)) &&
6664 ((
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE))){
6667 if ((
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE)) {
6668 ret = xmlXPathCompareNodeSetValue(ctxt, inf,
strict,
6671 ret = xmlXPathCompareNodeSetValue(ctxt, !inf,
strict,
6678 if (
arg1->type != XPATH_NUMBER) {
6679 valuePush(ctxt,
arg1);
6680 xmlXPathNumberFunction(ctxt, 1);
6681 arg1 = valuePop(ctxt);
6683 if (
arg2->type != XPATH_NUMBER) {
6684 valuePush(ctxt,
arg2);
6685 xmlXPathNumberFunction(ctxt, 1);
6686 arg2 = valuePop(ctxt);
6695 if (xmlXPathIsNaN(
arg1->floatval) || xmlXPathIsNaN(
arg2->floatval)) {
6698 arg1i=xmlXPathIsInf(
arg1->floatval);
6699 arg2i=xmlXPathIsInf(
arg2->floatval);
6701 if ((arg1i == -1 && arg2i != -1) ||
6702 (arg2i == 1 && arg1i != 1)) {
6704 }
else if (arg1i == 0 && arg2i == 0) {
6710 else if (inf && !
strict) {
6711 if (arg1i == -1 || arg2i == 1) {
6713 }
else if (arg1i == 0 && arg2i == 0) {
6719 else if (!inf &&
strict) {
6720 if ((arg1i == 1 && arg2i != 1) ||
6721 (arg2i == -1 && arg1i != -1)) {
6723 }
else if (arg1i == 0 && arg2i == 0) {
6729 else if (!inf && !
strict) {
6730 if (arg1i == 1 || arg2i == -1) {
6732 }
else if (arg1i == 0 && arg2i == 0) {
6740 xmlXPathReleaseObject(ctxt->context,
arg1);
6741 xmlXPathReleaseObject(ctxt->context,
arg2);
6754xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt) {
6755 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return;
6757 CHECK_TYPE(XPATH_NUMBER);
6758 ctxt->value->floatval = -ctxt->value->floatval;
6770xmlXPathAddValues(xmlXPathParserContextPtr ctxt) {
6771 xmlXPathObjectPtr
arg;
6774 arg = valuePop(ctxt);
6776 XP_ERROR(XPATH_INVALID_OPERAND);
6777 val = xmlXPathCastToNumber(
arg);
6778 xmlXPathReleaseObject(ctxt->context,
arg);
6780 CHECK_TYPE(XPATH_NUMBER);
6781 ctxt->value->floatval +=
val;
6793xmlXPathSubValues(xmlXPathParserContextPtr ctxt) {
6794 xmlXPathObjectPtr
arg;
6797 arg = valuePop(ctxt);
6799 XP_ERROR(XPATH_INVALID_OPERAND);
6800 val = xmlXPathCastToNumber(
arg);
6801 xmlXPathReleaseObject(ctxt->context,
arg);
6803 CHECK_TYPE(XPATH_NUMBER);
6804 ctxt->value->floatval -=
val;
6816xmlXPathMultValues(xmlXPathParserContextPtr ctxt) {
6817 xmlXPathObjectPtr
arg;
6820 arg = valuePop(ctxt);
6822 XP_ERROR(XPATH_INVALID_OPERAND);
6823 val = xmlXPathCastToNumber(
arg);
6824 xmlXPathReleaseObject(ctxt->context,
arg);
6826 CHECK_TYPE(XPATH_NUMBER);
6827 ctxt->value->floatval *=
val;
6840xmlXPathDivValues(xmlXPathParserContextPtr ctxt) {
6841 xmlXPathObjectPtr
arg;
6844 arg = valuePop(ctxt);
6846 XP_ERROR(XPATH_INVALID_OPERAND);
6847 val = xmlXPathCastToNumber(
arg);
6848 xmlXPathReleaseObject(ctxt->context,
arg);
6850 CHECK_TYPE(XPATH_NUMBER);
6851 ctxt->value->floatval /=
val;
6863xmlXPathModValues(xmlXPathParserContextPtr ctxt) {
6864 xmlXPathObjectPtr
arg;
6867 arg = valuePop(ctxt);
6869 XP_ERROR(XPATH_INVALID_OPERAND);
6870 arg2 = xmlXPathCastToNumber(
arg);
6871 xmlXPathReleaseObject(ctxt->context,
arg);
6873 CHECK_TYPE(XPATH_NUMBER);
6874 arg1 = ctxt->value->floatval;
6876 ctxt->value->floatval = xmlXPathNAN;
6893typedef xmlNodePtr (*xmlXPathTraversalFunction)
6894 (xmlXPathParserContextPtr ctxt, xmlNodePtr
cur);
6903typedef xmlNodePtr (*xmlXPathTraversalFunctionExt)
6904 (xmlNodePtr
cur, xmlNodePtr contextNode);
6910typedef xmlNodeSetPtr (*xmlXPathNodeSetMergeFunction)
6911 (xmlNodeSetPtr, xmlNodeSetPtr);
6925xmlXPathNextSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
6926 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
6928 return(ctxt->context->node);
6943xmlXPathNextChild(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
6944 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
6946 if (ctxt->context->node ==
NULL)
return(
NULL);
6947 switch (ctxt->context->node->type) {
6948 case XML_ELEMENT_NODE:
6950 case XML_CDATA_SECTION_NODE:
6951 case XML_ENTITY_REF_NODE:
6952 case XML_ENTITY_NODE:
6954 case XML_COMMENT_NODE:
6955 case XML_NOTATION_NODE:
6957 return(ctxt->context->node->children);
6958 case XML_DOCUMENT_NODE:
6959 case XML_DOCUMENT_TYPE_NODE:
6960 case XML_DOCUMENT_FRAG_NODE:
6961 case XML_HTML_DOCUMENT_NODE:
6962 return(((xmlDocPtr) ctxt->context->node)->children);
6963 case XML_ELEMENT_DECL:
6964 case XML_ATTRIBUTE_DECL:
6965 case XML_ENTITY_DECL:
6966 case XML_ATTRIBUTE_NODE:
6967 case XML_NAMESPACE_DECL:
6968 case XML_XINCLUDE_START:
6969 case XML_XINCLUDE_END:
6974 if ((
cur->type == XML_DOCUMENT_NODE) ||
6975 (
cur->type == XML_HTML_DOCUMENT_NODE))
6991xmlXPathNextChildElement(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
6992 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
6994 cur = ctxt->context->node;
6999 switch (
cur->type) {
7000 case XML_ELEMENT_NODE:
7001 case XML_DOCUMENT_FRAG_NODE:
7002 case XML_ENTITY_REF_NODE:
7003 case XML_ENTITY_NODE:
7006 if (
cur->type == XML_ELEMENT_NODE)
7011 (
cur->type != XML_ELEMENT_NODE));
7015 case XML_DOCUMENT_NODE:
7016 case XML_HTML_DOCUMENT_NODE:
7017 return(xmlDocGetRootElement((xmlDocPtr)
cur));
7026 switch (
cur->type) {
7027 case XML_ELEMENT_NODE:
7029 case XML_ENTITY_REF_NODE:
7030 case XML_ENTITY_NODE:
7031 case XML_CDATA_SECTION_NODE:
7033 case XML_COMMENT_NODE:
7034 case XML_XINCLUDE_END:
7041 if (
cur->next->type == XML_ELEMENT_NODE)
7046 }
while ((
cur !=
NULL) && (
cur->type != XML_ELEMENT_NODE));
7066xmlXPathNextDescendantOrSelfElemParent(xmlNodePtr
cur,
7067 xmlNodePtr contextNode)
7070 if (contextNode ==
NULL)
7072 switch (contextNode->type) {
7073 case XML_ELEMENT_NODE:
7074 case XML_XINCLUDE_START:
7075 case XML_DOCUMENT_FRAG_NODE:
7076 case XML_DOCUMENT_NODE:
7077 case XML_HTML_DOCUMENT_NODE:
7078 return(contextNode);
7087 switch (
cur->type) {
7088 case XML_ELEMENT_NODE:
7090 case XML_XINCLUDE_START:
7091 case XML_DOCUMENT_FRAG_NODE:
7100 case XML_DOCUMENT_NODE:
7101 case XML_HTML_DOCUMENT_NODE:
7104 return(xmlDocGetRootElement((xmlDocPtr)
cur));
7136xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7137 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7139 if (ctxt->context->node ==
NULL)
7141 if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
7142 (ctxt->context->node->type == XML_NAMESPACE_DECL))
7145 if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc)
7146 return(ctxt->context->doc->children);
7147 return(ctxt->context->node->children);
7150 if (
cur->type == XML_NAMESPACE_DECL)
7156 if (
cur->children->type != XML_ENTITY_DECL) {
7161 if (
cur->type != XML_DTD_NODE)
7166 if (
cur == ctxt->context->node)
return(
NULL);
7170 if ((
cur->type != XML_ENTITY_DECL) &&
7171 (
cur->type != XML_DTD_NODE))
7178 if (
cur == ctxt->context->node)
return(
NULL);
7201xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7202 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7204 return(ctxt->context->node);
7206 if (ctxt->context->node ==
NULL)
7208 if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
7209 (ctxt->context->node->type == XML_NAMESPACE_DECL))
7212 return(xmlXPathNextDescendant(ctxt,
cur));
7226xmlXPathNextParent(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7227 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7234 if (ctxt->context->node ==
NULL)
return(
NULL);
7235 switch (ctxt->context->node->type) {
7236 case XML_ELEMENT_NODE:
7238 case XML_CDATA_SECTION_NODE:
7239 case XML_ENTITY_REF_NODE:
7240 case XML_ENTITY_NODE:
7242 case XML_COMMENT_NODE:
7243 case XML_NOTATION_NODE:
7245 case XML_ELEMENT_DECL:
7246 case XML_ATTRIBUTE_DECL:
7247 case XML_XINCLUDE_START:
7248 case XML_XINCLUDE_END:
7249 case XML_ENTITY_DECL:
7250 if (ctxt->context->node->parent ==
NULL)
7251 return((xmlNodePtr) ctxt->context->doc);
7252 if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) &&
7253 ((ctxt->context->node->parent->name[0] ==
' ') ||
7257 return(ctxt->context->node->parent);
7258 case XML_ATTRIBUTE_NODE: {
7259 xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node;
7261 return(att->parent);
7263 case XML_DOCUMENT_NODE:
7264 case XML_DOCUMENT_TYPE_NODE:
7265 case XML_DOCUMENT_FRAG_NODE:
7266 case XML_HTML_DOCUMENT_NODE:
7268 case XML_NAMESPACE_DECL: {
7269 xmlNsPtr
ns = (xmlNsPtr) ctxt->context->node;
7272 (
ns->next->type != XML_NAMESPACE_DECL))
7273 return((xmlNodePtr)
ns->next);
7296xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7297 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7304 if (ctxt->context->node ==
NULL)
return(
NULL);
7305 switch (ctxt->context->node->type) {
7306 case XML_ELEMENT_NODE:
7308 case XML_CDATA_SECTION_NODE:
7309 case XML_ENTITY_REF_NODE:
7310 case XML_ENTITY_NODE:
7312 case XML_COMMENT_NODE:
7314 case XML_ELEMENT_DECL:
7315 case XML_ATTRIBUTE_DECL:
7316 case XML_ENTITY_DECL:
7317 case XML_NOTATION_NODE:
7318 case XML_XINCLUDE_START:
7319 case XML_XINCLUDE_END:
7320 if (ctxt->context->node->parent ==
NULL)
7321 return((xmlNodePtr) ctxt->context->doc);
7322 if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) &&
7323 ((ctxt->context->node->parent->name[0] ==
' ') ||
7327 return(ctxt->context->node->parent);
7328 case XML_ATTRIBUTE_NODE: {
7329 xmlAttrPtr tmp = (xmlAttrPtr) ctxt->context->node;
7331 return(tmp->parent);
7333 case XML_DOCUMENT_NODE:
7334 case XML_DOCUMENT_TYPE_NODE:
7335 case XML_DOCUMENT_FRAG_NODE:
7336 case XML_HTML_DOCUMENT_NODE:
7338 case XML_NAMESPACE_DECL: {
7339 xmlNsPtr
ns = (xmlNsPtr) ctxt->context->node;
7342 (
ns->next->type != XML_NAMESPACE_DECL))
7343 return((xmlNodePtr)
ns->next);
7350 if (
cur == ctxt->context->doc->children)
7351 return((xmlNodePtr) ctxt->context->doc);
7352 if (
cur == (xmlNodePtr) ctxt->context->doc)
7354 switch (
cur->type) {
7355 case XML_ELEMENT_NODE:
7357 case XML_CDATA_SECTION_NODE:
7358 case XML_ENTITY_REF_NODE:
7359 case XML_ENTITY_NODE:
7361 case XML_COMMENT_NODE:
7362 case XML_NOTATION_NODE:
7364 case XML_ELEMENT_DECL:
7365 case XML_ATTRIBUTE_DECL:
7366 case XML_ENTITY_DECL:
7367 case XML_XINCLUDE_START:
7368 case XML_XINCLUDE_END:
7371 if ((
cur->parent->type == XML_ELEMENT_NODE) &&
7372 ((
cur->parent->name[0] ==
' ') ||
7376 return(
cur->parent);
7377 case XML_ATTRIBUTE_NODE: {
7378 xmlAttrPtr att = (xmlAttrPtr)
cur;
7380 return(att->parent);
7382 case XML_NAMESPACE_DECL: {
7383 xmlNsPtr
ns = (xmlNsPtr)
cur;
7385 if ((
ns->next !=
NULL) &&
7386 (
ns->next->type != XML_NAMESPACE_DECL))
7387 return((xmlNodePtr)
ns->next);
7391 case XML_DOCUMENT_NODE:
7392 case XML_DOCUMENT_TYPE_NODE:
7393 case XML_DOCUMENT_FRAG_NODE:
7394 case XML_HTML_DOCUMENT_NODE:
7414xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7415 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7417 return(ctxt->context->node);
7418 return(xmlXPathNextAncestor(ctxt,
cur));
7433xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7434 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7435 if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
7436 (ctxt->context->node->type == XML_NAMESPACE_DECL))
7438 if (
cur == (xmlNodePtr) ctxt->context->doc)
7441 return(ctxt->context->node->next);
7458xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7459 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7460 if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
7461 (ctxt->context->node->type == XML_NAMESPACE_DECL))
7463 if (
cur == (xmlNodePtr) ctxt->context->doc)
7466 return(ctxt->context->node->prev);
7467 if ((
cur->prev !=
NULL) && (
cur->prev->type == XML_DTD_NODE)) {
7470 return(ctxt->context->node->prev);
7489xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7490 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7491 if ((
cur !=
NULL) && (
cur->type != XML_ATTRIBUTE_NODE) &&
7492 (
cur->type != XML_NAMESPACE_DECL) && (
cur->children !=
NULL))
7493 return(
cur->children);
7496 cur = ctxt->context->node;
7497 if (
cur->type == XML_ATTRIBUTE_NODE) {
7499 }
else if (
cur->type == XML_NAMESPACE_DECL) {
7500 xmlNsPtr
ns = (xmlNsPtr)
cur;
7502 if ((
ns->next ==
NULL) ||
7503 (
ns->next->type == XML_NAMESPACE_DECL))
7505 cur = (xmlNodePtr)
ns->next;
7513 if (
cur == (xmlNodePtr) ctxt->context->doc)
return(
NULL);
7529xmlXPathIsAncestor(xmlNodePtr ancestor, xmlNodePtr
node) {
7531 if (
node->type == XML_NAMESPACE_DECL)
7533 if (ancestor->type == XML_NAMESPACE_DECL)
7536 if (ancestor->doc !=
node->doc)
return(0);
7538 if (ancestor == (xmlNodePtr)
node->doc)
return(1);
7539 if (
node == (xmlNodePtr) ancestor->doc)
return(0);
7541 if (
node->parent == ancestor)
7562xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur)
7564 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7566 cur = ctxt->context->node;
7567 if (
cur->type == XML_ATTRIBUTE_NODE) {
7569 }
else if (
cur->type == XML_NAMESPACE_DECL) {
7570 xmlNsPtr
ns = (xmlNsPtr)
cur;
7572 if ((
ns->next ==
NULL) ||
7573 (
ns->next->type == XML_NAMESPACE_DECL))
7575 cur = (xmlNodePtr)
ns->next;
7578 if ((
cur ==
NULL) || (
cur->type == XML_NAMESPACE_DECL))
7580 if ((
cur->prev !=
NULL) && (
cur->prev->type == XML_DTD_NODE))
7591 if (
cur == ctxt->context->doc->children)
7593 }
while (xmlXPathIsAncestor(
cur, ctxt->context->node));
7613xmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt,
7616 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7618 cur = ctxt->context->node;
7621 if (
cur->type == XML_ATTRIBUTE_NODE) {
7623 }
else if (
cur->type == XML_NAMESPACE_DECL) {
7624 xmlNsPtr
ns = (xmlNsPtr)
cur;
7626 if ((
ns->next ==
NULL) ||
7627 (
ns->next->type == XML_NAMESPACE_DECL))
7629 cur = (xmlNodePtr)
ns->next;
7631 ctxt->ancestor =
cur->parent;
7633 if (
cur->type == XML_NAMESPACE_DECL)
7635 if ((
cur->prev !=
NULL) && (
cur->prev->type == XML_DTD_NODE))
7641 if (
cur == ctxt->context->doc->children)
7643 if (
cur != ctxt->ancestor)
7645 ctxt->ancestor =
cur->parent;
7668xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7669 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7670 if (ctxt->context->node->type != XML_ELEMENT_NODE)
return(
NULL);
7672 if (ctxt->context->tmpNsList !=
NULL)
7673 xmlFree(ctxt->context->tmpNsList);
7674 ctxt->context->tmpNsList =
7675 xmlGetNsList(ctxt->context->doc, ctxt->context->node);
7676 ctxt->context->tmpNsNr = 0;
7677 if (ctxt->context->tmpNsList !=
NULL) {
7678 while (ctxt->context->tmpNsList[ctxt->context->tmpNsNr] !=
NULL) {
7679 ctxt->context->tmpNsNr++;
7682 return((xmlNodePtr) xmlXPathXMLNamespace);
7684 if (ctxt->context->tmpNsNr > 0) {
7685 return (xmlNodePtr)ctxt->context->tmpNsList[--ctxt->context->tmpNsNr];
7687 if (ctxt->context->tmpNsList !=
NULL)
7688 xmlFree(ctxt->context->tmpNsList);
7689 ctxt->context->tmpNsList =
NULL;
7705xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt, xmlNodePtr
cur) {
7706 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7707 if (ctxt->context->node ==
NULL)
7709 if (ctxt->context->node->type != XML_ELEMENT_NODE)
7712 if (ctxt->context->node == (xmlNodePtr) ctxt->context->doc)
7714 return((xmlNodePtr)ctxt->context->node->properties);
7716 return((xmlNodePtr)
cur->next);
7725#define IS_FUNCTION 200
7741xmlXPathRoot(xmlXPathParserContextPtr ctxt) {
7742 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
7744 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
7745 (xmlNodePtr) ctxt->context->doc));
7766xmlXPathLastFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
7768 if (ctxt->context->contextSize >= 0) {
7770 xmlXPathCacheNewFloat(ctxt->context,
7771 (
double) ctxt->context->contextSize));
7773 XP_ERROR(XPATH_INVALID_CTXT_SIZE);
7789xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
7791 if (ctxt->context->proximityPosition >= 0) {
7793 xmlXPathCacheNewFloat(ctxt->context,
7794 (
double) ctxt->context->proximityPosition));
7796 XP_ERROR(XPATH_INVALID_CTXT_POSITION);
7809xmlXPathCountFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
7810 xmlXPathObjectPtr
cur;
7813 if ((ctxt->value ==
NULL) ||
7814 ((ctxt->value->type != XPATH_NODESET) &&
7815 (ctxt->value->type != XPATH_XSLT_TREE)))
7816 XP_ERROR(XPATH_INVALID_TYPE);
7817 cur = valuePop(ctxt);
7820 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (
double) 0));
7822 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
7823 (
double)
cur->nodesetval->nodeNr));
7824 xmlXPathReleaseObject(ctxt->context,
cur);
7837xmlXPathGetElementsByIds (xmlDocPtr doc,
const xmlChar *
ids) {
7846 ret = xmlXPathNodeSetCreate(
NULL);
7866 if (
attr->type == XML_ATTRIBUTE_NODE)
7868 else if (
attr->type == XML_ELEMENT_NODE)
7874 xmlXPathNodeSetAdd(
ret,
elem);
7904xmlXPathIdFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
7907 xmlXPathObjectPtr
obj;
7910 obj = valuePop(ctxt);
7911 if (
obj ==
NULL) XP_ERROR(XPATH_INVALID_OPERAND);
7912 if ((
obj->type == XPATH_NODESET) || (
obj->type == XPATH_XSLT_TREE)) {
7917 ret = xmlXPathNodeSetCreate(
NULL);
7919 if (
obj->nodesetval !=
NULL) {
7920 for (
i = 0;
i <
obj->nodesetval->nodeNr;
i++) {
7922 xmlXPathCastNodeToString(
obj->nodesetval->nodeTab[
i]);
7923 ns = xmlXPathGetElementsByIds(ctxt->context->doc, tokens);
7925 ret = xmlXPathNodeSetMerge(
ret,
ns);
7926 xmlXPathFreeNodeSet(
ns);
7931 xmlXPathReleaseObject(ctxt->context,
obj);
7932 valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context,
ret));
7935 obj = xmlXPathCacheConvertString(ctxt->context,
obj);
7937 ret = xmlXPathGetElementsByIds(ctxt->context->doc,
obj->stringval);
7938 valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context,
ret));
7939 xmlXPathReleaseObject(ctxt->context,
obj);
7957xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
7958 xmlXPathObjectPtr
cur;
7960 if (ctxt ==
NULL)
return;
7963 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
7964 ctxt->context->node));
7969 if ((ctxt->value ==
NULL) ||
7970 ((ctxt->value->type != XPATH_NODESET) &&
7971 (ctxt->value->type != XPATH_XSLT_TREE)))
7972 XP_ERROR(XPATH_INVALID_TYPE);
7973 cur = valuePop(ctxt);
7975 if ((
cur->nodesetval ==
NULL) || (
cur->nodesetval->nodeNr == 0)) {
7976 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
7979 switch (
cur->nodesetval->nodeTab[
i]->type) {
7980 case XML_ELEMENT_NODE:
7981 case XML_ATTRIBUTE_NODE:
7983 if (
cur->nodesetval->nodeTab[
i]->name[0] ==
' ')
7984 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
7987 xmlXPathCacheNewString(ctxt->context,
7988 cur->nodesetval->nodeTab[
i]->name));
7990 case XML_NAMESPACE_DECL:
7991 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
7992 ((xmlNsPtr)
cur->nodesetval->nodeTab[
i])->prefix));
7995 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
7998 xmlXPathReleaseObject(ctxt->context,
cur);
8016xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8017 xmlXPathObjectPtr
cur;
8019 if (ctxt ==
NULL)
return;
8022 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8023 ctxt->context->node));
8027 if ((ctxt->value ==
NULL) ||
8028 ((ctxt->value->type != XPATH_NODESET) &&
8029 (ctxt->value->type != XPATH_XSLT_TREE)))
8030 XP_ERROR(XPATH_INVALID_TYPE);
8031 cur = valuePop(ctxt);
8033 if ((
cur->nodesetval ==
NULL) || (
cur->nodesetval->nodeNr == 0)) {
8034 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8037 switch (
cur->nodesetval->nodeTab[
i]->type) {
8038 case XML_ELEMENT_NODE:
8039 case XML_ATTRIBUTE_NODE:
8040 if (
cur->nodesetval->nodeTab[
i]->ns ==
NULL)
8041 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8043 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8044 cur->nodesetval->nodeTab[
i]->ns->href));
8047 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8050 xmlXPathReleaseObject(ctxt->context,
cur);
8076xmlXPathNameFunction(xmlXPathParserContextPtr ctxt,
int nargs)
8078 xmlXPathObjectPtr
cur;
8081 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8082 ctxt->context->node));
8087 if ((ctxt->value ==
NULL) ||
8088 ((ctxt->value->type != XPATH_NODESET) &&
8089 (ctxt->value->type != XPATH_XSLT_TREE)))
8090 XP_ERROR(XPATH_INVALID_TYPE);
8091 cur = valuePop(ctxt);
8093 if ((
cur->nodesetval ==
NULL) || (
cur->nodesetval->nodeNr == 0)) {
8094 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8098 switch (
cur->nodesetval->nodeTab[
i]->type) {
8099 case XML_ELEMENT_NODE:
8100 case XML_ATTRIBUTE_NODE:
8101 if (
cur->nodesetval->nodeTab[
i]->name[0] ==
' ')
8103 xmlXPathCacheNewCString(ctxt->context,
""));
8104 else if ((
cur->nodesetval->nodeTab[
i]->ns ==
NULL) ||
8105 (
cur->nodesetval->nodeTab[
i]->ns->prefix ==
NULL)) {
8107 xmlXPathCacheNewString(ctxt->context,
8108 cur->nodesetval->nodeTab[
i]->name));
8112 fullname = xmlBuildQName(
cur->nodesetval->nodeTab[
i]->name,
8113 cur->nodesetval->nodeTab[
i]->ns->prefix,
8118 xmlXPathPErrMemory(ctxt,
NULL);
8119 valuePush(ctxt, xmlXPathCacheWrapString(
8124 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8125 cur->nodesetval->nodeTab[
i]));
8126 xmlXPathLocalNameFunction(ctxt, 1);
8129 xmlXPathReleaseObject(ctxt->context,
cur);
8170xmlXPathStringFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8171 xmlXPathObjectPtr
cur;
8173 if (ctxt ==
NULL)
return;
8176 xmlXPathCacheWrapString(ctxt->context,
8177 xmlXPathCastNodeToString(ctxt->context->node)));
8182 cur = valuePop(ctxt);
8183 if (
cur ==
NULL) XP_ERROR(XPATH_INVALID_OPERAND);
8184 valuePush(ctxt, xmlXPathCacheConvertString(ctxt->context,
cur));
8200xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8201 xmlXPathObjectPtr
cur;
8204 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
8206 if (ctxt->context->node ==
NULL) {
8207 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0));
8211 content = xmlXPathCastNodeToString(ctxt->context->node);
8212 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8220 CHECK_TYPE(XPATH_STRING);
8221 cur = valuePop(ctxt);
8222 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8224 xmlXPathReleaseObject(ctxt->context,
cur);
8237xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8238 xmlXPathObjectPtr
cur, newobj;
8241 if (ctxt ==
NULL)
return;
8247 cur = valuePop(ctxt);
8248 if ((
cur ==
NULL) || (
cur->type != XPATH_STRING)) {
8249 xmlXPathReleaseObject(ctxt->context,
cur);
8256 newobj = valuePop(ctxt);
8257 if ((newobj ==
NULL) || (newobj->type != XPATH_STRING)) {
8258 xmlXPathReleaseObject(ctxt->context, newobj);
8259 xmlXPathReleaseObject(ctxt->context,
cur);
8260 XP_ERROR(XPATH_INVALID_TYPE);
8263 newobj->stringval =
cur->stringval;
8264 cur->stringval = tmp;
8265 xmlXPathReleaseObject(ctxt->context, newobj);
8268 valuePush(ctxt,
cur);
8282xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8283 xmlXPathObjectPtr hay, needle;
8287 CHECK_TYPE(XPATH_STRING);
8288 needle = valuePop(ctxt);
8290 hay = valuePop(ctxt);
8292 if ((hay ==
NULL) || (hay->type != XPATH_STRING)) {
8293 xmlXPathReleaseObject(ctxt->context, hay);
8294 xmlXPathReleaseObject(ctxt->context, needle);
8295 XP_ERROR(XPATH_INVALID_TYPE);
8297 if (
xmlStrstr(hay->stringval, needle->stringval))
8298 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
8300 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
8301 xmlXPathReleaseObject(ctxt->context, hay);
8302 xmlXPathReleaseObject(ctxt->context, needle);
8316xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8317 xmlXPathObjectPtr hay, needle;
8322 CHECK_TYPE(XPATH_STRING);
8323 needle = valuePop(ctxt);
8325 hay = valuePop(ctxt);
8327 if ((hay ==
NULL) || (hay->type != XPATH_STRING)) {
8328 xmlXPathReleaseObject(ctxt->context, hay);
8329 xmlXPathReleaseObject(ctxt->context, needle);
8330 XP_ERROR(XPATH_INVALID_TYPE);
8333 if (
xmlStrncmp(hay->stringval, needle->stringval,
n))
8334 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
8336 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
8337 xmlXPathReleaseObject(ctxt->context, hay);
8338 xmlXPathReleaseObject(ctxt->context, needle);
8370xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8386 CHECK_TYPE(XPATH_NUMBER);
8387 len = valuePop(ctxt);
8389 xmlXPathReleaseObject(ctxt->context,
len);
8393 CHECK_TYPE(XPATH_NUMBER);
8394 start = valuePop(ctxt);
8396 xmlXPathReleaseObject(ctxt->context,
start);
8398 CHECK_TYPE(XPATH_STRING);
8399 str = valuePop(ctxt);
8403 }
else if (
in >= 1.0) {
8410 double rin, rle,
end;
8413 if (
in - rin >= 0.5)
8417 if (le - rle >= 0.5)
8421 if (!(
end >= 1.0)) {
8430 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
ret));
8433 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8436 xmlXPathReleaseObject(ctxt->context,
str);
8453xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8454 xmlXPathObjectPtr
str;
8455 xmlXPathObjectPtr
find;
8462 find = valuePop(ctxt);
8464 str = valuePop(ctxt);
8473 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8477 xmlXPathReleaseObject(ctxt->context,
str);
8478 xmlXPathReleaseObject(ctxt->context,
find);
8496xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8497 xmlXPathObjectPtr
str;
8498 xmlXPathObjectPtr
find;
8505 find = valuePop(ctxt);
8507 str = valuePop(ctxt);
8517 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8521 xmlXPathReleaseObject(ctxt->context,
str);
8522 xmlXPathReleaseObject(ctxt->context,
find);
8540xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8544 if (ctxt ==
NULL)
return;
8548 xmlXPathCacheWrapString(ctxt->context,
8549 xmlXPathCastNodeToString(ctxt->context->node)));
8555 CHECK_TYPE(XPATH_STRING);
8556 source = ctxt->value->stringval;
8604xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8605 xmlXPathObjectPtr
str;
8606 xmlXPathObjectPtr
from;
8607 xmlXPathObjectPtr to;
8617 to = valuePop(ctxt);
8619 from = valuePop(ctxt);
8621 str = valuePop(ctxt);
8626 for (cptr =
str->stringval; (
ch=*cptr); ) {
8641 if ( (
ch & 0xc0) != 0xc0 ) {
8643 "xmlXPathTranslateFunction: Invalid UTF8 string\n");
8648 while ( (
ch <<= 1) & 0x80 )
8649 if ( (*cptr++ & 0xc0) != 0x80 ) {
8651 "xmlXPathTranslateFunction: Invalid UTF8 string\n");
8660 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8663 xmlXPathReleaseObject(ctxt->context,
str);
8664 xmlXPathReleaseObject(ctxt->context,
from);
8665 xmlXPathReleaseObject(ctxt->context, to);
8682xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8683 xmlXPathObjectPtr
cur;
8686 cur = valuePop(ctxt);
8687 if (
cur ==
NULL) XP_ERROR(XPATH_INVALID_OPERAND);
8688 cur = xmlXPathCacheConvertBoolean(ctxt->context,
cur);
8689 valuePush(ctxt,
cur);
8703xmlXPathNotFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8706 CHECK_TYPE(XPATH_BOOLEAN);
8707 ctxt->value->boolval = ! ctxt->value->boolval;
8719xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8721 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
8733xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8735 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
8760xmlXPathLangFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8769 CHECK_TYPE(XPATH_STRING);
8770 val = valuePop(ctxt);
8772 theLang = xmlNodeGetLang(ctxt->context->node);
8777 if ((theLang[
i] == 0) || (theLang[
i] ==
'-'))
8781 if (theLang !=
NULL)
8784 xmlXPathReleaseObject(ctxt->context,
val);
8785 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context,
ret));
8797xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8798 xmlXPathObjectPtr
cur;
8801 if (ctxt ==
NULL)
return;
8803 if (ctxt->context->node ==
NULL) {
8804 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0.0));
8809 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
res));
8816 cur = valuePop(ctxt);
8817 valuePush(ctxt, xmlXPathCacheConvertNumber(ctxt->context,
cur));
8831xmlXPathSumFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8832 xmlXPathObjectPtr
cur;
8837 if ((ctxt->value ==
NULL) ||
8838 ((ctxt->value->type != XPATH_NODESET) &&
8839 (ctxt->value->type != XPATH_XSLT_TREE)))
8840 XP_ERROR(XPATH_INVALID_TYPE);
8841 cur = valuePop(ctxt);
8843 if ((
cur->nodesetval !=
NULL) && (
cur->nodesetval->nodeNr != 0)) {
8844 for (
i = 0;
i <
cur->nodesetval->nodeNr;
i++) {
8845 res += xmlXPathCastNodeToNumber(
cur->nodesetval->nodeTab[
i]);
8848 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
res));
8849 xmlXPathReleaseObject(ctxt->context,
cur);
8863xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8866 CHECK_TYPE(XPATH_NUMBER);
8868 ctxt->value->floatval =
floor(ctxt->value->floatval);
8882xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8885 CHECK_TYPE(XPATH_NUMBER);
8889 ctxt->value->floatval =
copysign(
ceil(ctxt->value->floatval), ctxt->value->floatval);
8891 ctxt->value->floatval =
ceil(ctxt->value->floatval);
8907xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8912 CHECK_TYPE(XPATH_NUMBER);
8914 f = ctxt->value->floatval;
8916 if ((
f >= -0.5) && (
f < 0.5)) {
8918 ctxt->value->floatval *= 0.0;
8921 double rounded =
floor(
f);
8922 if (
f - rounded >= 0.5)
8924 ctxt->value->floatval = rounded;
8938static void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt,
int sort);
8939static void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt,
int filter);
8940static void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt);
8941static void xmlXPathCompRelativeLocationPath(xmlXPathParserContextPtr ctxt);
8942static xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt,
8958xmlXPathCurrentChar(xmlXPathParserContextPtr ctxt,
int *
len) {
8980 if ((
cur[1] & 0xc0) != 0x80)
8981 goto encoding_error;
8982 if ((
c & 0xe0) == 0xe0) {
8984 if ((
cur[2] & 0xc0) != 0x80)
8985 goto encoding_error;
8986 if ((
c & 0xf0) == 0xf0) {
8987 if (((
c & 0xf8) != 0xf0) ||
8988 ((
cur[3] & 0xc0) != 0x80))
8989 goto encoding_error;
8992 val = (
cur[0] & 0x7) << 18;
8993 val |= (
cur[1] & 0x3f) << 12;
8994 val |= (
cur[2] & 0x3f) << 6;
8999 val = (
cur[0] & 0xf) << 12;
9000 val |= (
cur[1] & 0x3f) << 6;
9006 val = (
cur[0] & 0x1f) << 6;
9010 XP_ERROR0(XPATH_INVALID_CHAR_ERROR);
9027 XP_ERROR0(XPATH_ENCODING_ERROR);
9045xmlXPathParseNCName(xmlXPathParserContextPtr ctxt) {
9050 if ((ctxt ==
NULL) || (ctxt->cur ==
NULL))
return(
NULL);
9055 if (((*
in >= 0x61) && (*
in <= 0x7A)) ||
9056 ((*
in >= 0x41) && (*
in <= 0x5A)) ||
9059 while (((*
in >= 0x61) && (*
in <= 0x7A)) ||
9060 ((*
in >= 0x41) && (*
in <= 0x5A)) ||
9061 ((*
in >= 0x30) && (*
in <= 0x39)) ||
9062 (*
in ==
'_') || (*
in ==
'.') ||
9065 if ((*
in ==
' ') || (*
in ==
'>') || (*
in ==
'/') ||
9066 (*
in ==
'[') || (*
in ==
']') || (*
in ==
':') ||
9067 (*
in ==
'@') || (*
in ==
'*')) {
9076 return(xmlXPathParseNameComplex(ctxt, 0));
9098xmlXPathParseQName(xmlXPathParserContextPtr ctxt,
xmlChar **
prefix) {
9102 ret = xmlXPathParseNCName(ctxt);
9106 ret = xmlXPathParseNCName(ctxt);
9126xmlXPathParseName(xmlXPathParserContextPtr ctxt) {
9131 if ((ctxt ==
NULL) || (ctxt->cur ==
NULL))
return(
NULL);
9136 if (((*
in >= 0x61) && (*
in <= 0x7A)) ||
9137 ((*
in >= 0x41) && (*
in <= 0x5A)) ||
9138 (*
in ==
'_') || (*
in ==
':')) {
9140 while (((*
in >= 0x61) && (*
in <= 0x7A)) ||
9141 ((*
in >= 0x41) && (*
in <= 0x5A)) ||
9142 ((*
in >= 0x30) && (*
in <= 0x39)) ||
9143 (*
in ==
'_') || (*
in ==
'-') ||
9144 (*
in ==
':') || (*
in ==
'.'))
9146 if ((*
in > 0) && (*
in < 0x80)) {
9150 XP_ERRORNULL(XPATH_EXPR_ERROR);
9157 return(xmlXPathParseNameComplex(ctxt, 1));
9161xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt,
int qualified) {
9170 if ((
c ==
' ') || (
c ==
'>') || (
c ==
'/') ||
9171 (
c ==
'[') || (
c ==
']') || (
c ==
'@') ||
9174 ((!qualified) || (
c !=
':')))) {
9178 while ((
c !=
' ') && (
c !=
'>') && (
c !=
'/') &&
9180 (
c ==
'.') || (
c ==
'-') ||
9181 (
c ==
'_') || ((qualified) && (
c ==
':')) ||
9196 XP_ERRORNULL(XPATH_EXPR_ERROR);
9200 XP_ERRORNULL(XPATH_MEMORY_ERROR);
9204 (
c ==
'.') || (
c ==
'-') ||
9205 (
c ==
'_') || ((qualified) && (
c ==
':')) ||
9212 XP_ERRORNULL(XPATH_EXPR_ERROR);
9218 XP_ERRORNULL(XPATH_MEMORY_ERROR);
9254xmlXPathStringEvalNumber(
const xmlChar *
str) {
9260 int is_exponent_negative = 0;
9262 unsigned long tmp = 0;
9271 if ((*
cur !=
'.') && ((*
cur <
'0') || (*
cur >
'9'))) {
9272 return(xmlXPathNAN);
9281 while ((*
cur >=
'0') && (*
cur <=
'9')) {
9291 while ((*
cur >=
'0') && (*
cur <=
'9')) {
9300 double fraction = 0;
9303 if (((*
cur <
'0') || (*
cur >
'9')) && (!
ok)) {
9304 return(xmlXPathNAN);
9306 while (*
cur ==
'0') {
9313 fraction = fraction * 10 +
v;
9319 while ((*
cur >=
'0') && (*
cur <=
'9'))
9322 if ((*
cur ==
'e') || (*
cur ==
'E')) {
9325 is_exponent_negative = 1;
9327 }
else if (*
cur ==
'+') {
9330 while ((*
cur >=
'0') && (*
cur <=
'9')) {
9337 if (*
cur != 0)
return(xmlXPathNAN);
9356xmlXPathCompNumber(xmlXPathParserContextPtr ctxt)
9361 int is_exponent_negative = 0;
9362 xmlXPathObjectPtr
num;
9364 unsigned long tmp = 0;
9369 if ((
CUR !=
'.') && ((
CUR <
'0') || (
CUR >
'9'))) {
9370 XP_ERROR(XPATH_NUMBER_ERROR);
9378 while ((
CUR >=
'0') && (
CUR <=
'9')) {
9388 while ((
CUR >=
'0') && (
CUR <=
'9')) {
9396 double fraction = 0;
9399 if (((
CUR <
'0') || (
CUR >
'9')) && (!
ok)) {
9400 XP_ERROR(XPATH_NUMBER_ERROR);
9402 while (
CUR ==
'0') {
9409 fraction = fraction * 10 +
v;
9415 while ((
CUR >=
'0') && (
CUR <=
'9'))
9418 if ((
CUR ==
'e') || (
CUR ==
'E')) {
9421 is_exponent_negative = 1;
9423 }
else if (
CUR ==
'+') {
9426 while ((
CUR >=
'0') && (
CUR <=
'9')) {
9431 if (is_exponent_negative)
9435 num = xmlXPathCacheNewFloat(ctxt->context,
ret);
9437 ctxt->error = XPATH_MEMORY_ERROR;
9438 }
else if (PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0,
num,
9440 xmlXPathReleaseObject(ctxt->context,
num);
9456xmlXPathParseLiteral(xmlXPathParserContextPtr ctxt) {
9466 XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR);
9471 }
else if (
CUR ==
'\'') {
9477 XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR);
9483 XP_ERRORNULL(XPATH_START_LITERAL_ERROR);
9500xmlXPathCompLiteral(xmlXPathParserContextPtr ctxt) {
9503 xmlXPathObjectPtr lit;
9511 XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR);
9516 }
else if (
CUR ==
'\'') {
9522 XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR);
9528 XP_ERROR(XPATH_START_LITERAL_ERROR);
9531 xmlXPathPErrMemory(ctxt,
NULL);
9534 lit = xmlXPathCacheNewString(ctxt->context,
ret);
9536 ctxt->error = XPATH_MEMORY_ERROR;
9537 }
else if (PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_STRING, 0, 0, lit,
9539 xmlXPathReleaseObject(ctxt->context, lit);
9562xmlXPathCompVariableReference(xmlXPathParserContextPtr ctxt) {
9568 XP_ERROR(XPATH_VARIABLE_REF_ERROR);
9574 XP_ERROR(XPATH_VARIABLE_REF_ERROR);
9576 ctxt->comp->last = -1;
9577 if (PUSH_LONG_EXPR(XPATH_OP_VARIABLE, 0, 0, 0,
name,
prefix) == -1) {
9582 if ((ctxt->context !=
NULL) && (ctxt->context->flags & XML_XPATH_NOVAR)) {
9583 XP_ERROR(XPATH_FORBID_VARIABLE_ERROR);
9627xmlXPathCompFunctionCall(xmlXPathParserContextPtr ctxt) {
9636 XP_ERROR(XPATH_EXPR_ERROR);
9643 XP_ERROR(XPATH_EXPR_ERROR);
9656 ctxt->comp->last = -1;
9659 int op1 = ctxt->comp->last;
9660 ctxt->comp->last = -1;
9661 xmlXPathCompileExpr(ctxt,
sort);
9662 if (ctxt->error != XPATH_EXPRESSION_OK) {
9667 PUSH_BINARY_EXPR(XPATH_OP_ARG, op1, ctxt->comp->last, 0, 0);
9669 if (
CUR ==
')')
break;
9673 XP_ERROR(XPATH_EXPR_ERROR);
9679 if (PUSH_LONG_EXPR(XPATH_OP_FUNCTION, nbargs, 0, 0,
name,
prefix) == -1) {
9700xmlXPathCompPrimaryExpr(xmlXPathParserContextPtr ctxt) {
9702 if (
CUR ==
'$') xmlXPathCompVariableReference(ctxt);
9703 else if (
CUR ==
'(') {
9706 xmlXPathCompileExpr(ctxt, 1);
9709 XP_ERROR(XPATH_EXPR_ERROR);
9714 xmlXPathCompNumber(ctxt);
9715 }
else if ((
CUR ==
'\'') || (
CUR ==
'"')) {
9716 xmlXPathCompLiteral(ctxt);
9718 xmlXPathCompFunctionCall(ctxt);
9739xmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) {
9740 xmlXPathCompPrimaryExpr(ctxt);
9744 while (
CUR ==
'[') {
9745 xmlXPathCompPredicate(ctxt, 1);
9770xmlXPathScanName(xmlXPathParserContextPtr ctxt) {
9779 if ((
c ==
' ') || (
c ==
'>') || (
c ==
'/') ||
9785 while ((
c !=
' ') && (
c !=
'>') && (
c !=
'/') &&
9787 (
c ==
'.') || (
c ==
'-') ||
9788 (
c ==
'_') || (
c ==
':') ||
9818xmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) {
9823 if ((
CUR ==
'$') || (
CUR ==
'(') ||
9825 (
CUR ==
'\'') || (
CUR ==
'"') ||
9828 }
else if (
CUR ==
'*') {
9831 }
else if (
CUR ==
'/') {
9834 }
else if (
CUR ==
'@') {
9837 }
else if (
CUR ==
'.') {
9853 name = xmlXPathScanName(ctxt);
9869 }
else if (
NXT(
len) ==
':') {
9872 }
else if ((
NXT(
len) ==
'(')) {
9874 if (xmlXPathIsNodeType(
name)) {
9876#ifdef LIBXML_XPTR_LOCS_ENABLED
9877 }
else if (ctxt->xptr &&
9885 }
else if ((
NXT(
len) ==
'[')) {
9906 XP_ERROR(XPATH_EXPR_ERROR);
9912 PUSH_LEAVE_EXPR(XPATH_OP_ROOT, 0, 0);
9914 PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0);
9916 xmlXPathCompLocationPath(ctxt);
9918 xmlXPathCompFilterExpr(ctxt);
9920 if ((
CUR ==
'/') && (
NXT(1) ==
'/')) {
9924 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
9925 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
9927 xmlXPathCompRelativeLocationPath(ctxt);
9928 }
else if (
CUR ==
'/') {
9929 xmlXPathCompRelativeLocationPath(ctxt);
9946xmlXPathCompUnionExpr(xmlXPathParserContextPtr ctxt) {
9947 xmlXPathCompPathExpr(ctxt);
9950 while (
CUR ==
'|') {
9951 int op1 = ctxt->comp->last;
9952 PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0);
9956 xmlXPathCompPathExpr(ctxt);
9958 PUSH_BINARY_EXPR(XPATH_OP_UNION, op1, ctxt->comp->last, 0, 0);
9975xmlXPathCompUnaryExpr(xmlXPathParserContextPtr ctxt) {
9980 while (
CUR ==
'-') {
9987 xmlXPathCompUnionExpr(ctxt);
9991 PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 2, 0);
9993 PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 3, 0);
10011xmlXPathCompMultiplicativeExpr(xmlXPathParserContextPtr ctxt) {
10012 xmlXPathCompUnaryExpr(ctxt);
10015 while ((
CUR ==
'*') ||
10016 ((
CUR ==
'd') && (
NXT(1) ==
'i') && (
NXT(2) ==
'v')) ||
10017 ((
CUR ==
'm') && (
NXT(1) ==
'o') && (
NXT(2) ==
'd'))) {
10019 int op1 = ctxt->comp->last;
10024 }
else if (
CUR ==
'd') {
10027 }
else if (
CUR ==
'm') {
10032 xmlXPathCompUnaryExpr(ctxt);
10034 PUSH_BINARY_EXPR(XPATH_OP_MULT, op1, ctxt->comp->last,
op, 0);
10051xmlXPathCompAdditiveExpr(xmlXPathParserContextPtr ctxt) {
10053 xmlXPathCompMultiplicativeExpr(ctxt);
10056 while ((
CUR ==
'+') || (
CUR ==
'-')) {
10058 int op1 = ctxt->comp->last;
10064 xmlXPathCompMultiplicativeExpr(ctxt);
10066 PUSH_BINARY_EXPR(XPATH_OP_PLUS, op1, ctxt->comp->last,
plus, 0);
10090xmlXPathCompRelationalExpr(xmlXPathParserContextPtr ctxt) {
10091 xmlXPathCompAdditiveExpr(ctxt);
10094 while ((
CUR ==
'<') || (
CUR ==
'>')) {
10096 int op1 = ctxt->comp->last;
10098 if (
CUR ==
'<') inf = 1;
10105 xmlXPathCompAdditiveExpr(ctxt);
10107 PUSH_BINARY_EXPR(XPATH_OP_CMP, op1, ctxt->comp->last, inf,
strict);
10129xmlXPathCompEqualityExpr(xmlXPathParserContextPtr ctxt) {
10130 xmlXPathCompRelationalExpr(ctxt);
10133 while ((
CUR ==
'=') || ((
CUR ==
'!') && (
NXT(1) ==
'='))) {
10135 int op1 = ctxt->comp->last;
10137 if (
CUR ==
'=')
eq = 1;
10142 xmlXPathCompRelationalExpr(ctxt);
10144 PUSH_BINARY_EXPR(XPATH_OP_EQUAL, op1, ctxt->comp->last,
eq, 0);
10160xmlXPathCompAndExpr(xmlXPathParserContextPtr ctxt) {
10161 xmlXPathCompEqualityExpr(ctxt);
10164 while ((
CUR ==
'a') && (
NXT(1) ==
'n') && (
NXT(2) ==
'd')) {
10165 int op1 = ctxt->comp->last;
10168 xmlXPathCompEqualityExpr(ctxt);
10170 PUSH_BINARY_EXPR(XPATH_OP_AND, op1, ctxt->comp->last, 0, 0);
10186xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt,
int sort) {
10187 xmlXPathContextPtr xpctxt = ctxt->context;
10189 if (xpctxt !=
NULL) {
10191 XP_ERROR(XPATH_RECURSION_LIMIT_EXCEEDED);
10196 xpctxt->depth += 10;
10199 xmlXPathCompAndExpr(ctxt);
10202 while ((
CUR ==
'o') && (
NXT(1) ==
'r')) {
10203 int op1 = ctxt->comp->last;
10206 xmlXPathCompAndExpr(ctxt);
10208 PUSH_BINARY_EXPR(XPATH_OP_OR, op1, ctxt->comp->last, 0, 0);
10211 if ((
sort) && (ctxt->comp->steps[ctxt->comp->last].op != XPATH_OP_VALUE)) {
10218 PUSH_UNARY_EXPR(XPATH_OP_SORT, ctxt->comp->last , 0, 0);
10221 if (xpctxt !=
NULL)
10222 xpctxt->depth -= 10;
10236xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt,
int filter) {
10237 int op1 = ctxt->comp->last;
10241 XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
10246 ctxt->comp->last = -1;
10257 xmlXPathCompileExpr(ctxt, 0);
10259 xmlXPathCompileExpr(ctxt, 1);
10263 XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
10267 PUSH_BINARY_EXPR(XPATH_OP_FILTER, op1, ctxt->comp->last, 0, 0);
10269 PUSH_BINARY_EXPR(XPATH_OP_PREDICATE, op1, ctxt->comp->last, 0, 0);
10297xmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *
test,
10306 *
type = (xmlXPathTypeVal) 0;
10307 *
test = (xmlXPathTestVal) 0;
10316 *
test = NODE_TEST_ALL;
10321 name = xmlXPathParseNCName(ctxt);
10323 XP_ERRORNULL(XPATH_EXPR_ERROR);
10334 *
type = NODE_TYPE_COMMENT;
10336 *
type = NODE_TYPE_NODE;
10338 *
type = NODE_TYPE_PI;
10340 *
type = NODE_TYPE_TEXT;
10344 XP_ERRORNULL(XPATH_EXPR_ERROR);
10347 *
test = NODE_TEST_TYPE;
10350 if (*
type == NODE_TYPE_PI) {
10358 name = xmlXPathParseLiteral(ctxt);
10360 XP_ERRORNULL(XPATH_EXPR_ERROR);
10362 *
test = NODE_TEST_PI;
10369 XP_ERRORNULL(XPATH_UNCLOSED_ERROR);
10374 *
test = NODE_TEST_NAME;
10375 if ((!blanks) && (
CUR ==
':')) {
10386 *
prefix = xmlXPathNsLookup(ctxt->context,
name);
10390 XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR);
10401 *
test = NODE_TEST_ALL;
10405 name = xmlXPathParseNCName(ctxt);
10407 XP_ERRORNULL(XPATH_EXPR_ERROR);
10433static xmlXPathAxisVal
10435 xmlXPathAxisVal
ret = (xmlXPathAxisVal) 0;
10439 ret = AXIS_ANCESTOR;
10441 ret = AXIS_ANCESTOR_OR_SELF;
10451 ret = AXIS_DESCENDANT;
10453 ret = AXIS_DESCENDANT_OR_SELF;
10457 ret = AXIS_FOLLOWING;
10459 ret = AXIS_FOLLOWING_SIBLING;
10463 ret = AXIS_NAMESPACE;
10469 ret = AXIS_PRECEDING;
10471 ret = AXIS_PRECEDING_SIBLING;
10514xmlXPathCompStep(xmlXPathParserContextPtr ctxt) {
10515#ifdef LIBXML_XPTR_LOCS_ENABLED
10521 if ((
CUR ==
'.') && (
NXT(1) ==
'.')) {
10524 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_PARENT,
10525 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
10526 }
else if (
CUR ==
'.') {
10532 xmlXPathTestVal
test = (xmlXPathTestVal) 0;
10533 xmlXPathAxisVal axis = (xmlXPathAxisVal) 0;
10534 xmlXPathTypeVal
type = (xmlXPathTypeVal) 0;
10540#ifdef LIBXML_XPTR_LOCS_ENABLED
10542 name = xmlXPathParseNCName(ctxt);
10544 op2 = ctxt->comp->last;
10548 XP_ERROR(XPATH_EXPR_ERROR);
10553 xmlXPathCompileExpr(ctxt, 1);
10559 XP_ERROR(XPATH_EXPR_ERROR);
10563 goto eval_predicates;
10571 name = xmlXPathParseNCName(ctxt);
10573 axis = xmlXPathIsAxisName(
name);
10576 if ((
CUR ==
':') && (
NXT(1) ==
':')) {
10587 }
else if (
CUR ==
'@') {
10595 if (ctxt->error != XPATH_EXPRESSION_OK) {
10605 (ctxt->context->flags & XML_XPATH_CHECKNS)) {
10606 if (xmlXPathNsLookup(ctxt->context,
prefix) ==
NULL) {
10607 xmlXPathErr(ctxt, XPATH_UNDEF_PREFIX_ERROR);
10611#ifdef LIBXML_XPTR_LOCS_ENABLED
10614 op1 = ctxt->comp->last;
10615 ctxt->comp->last = -1;
10618 while (
CUR ==
'[') {
10619 xmlXPathCompPredicate(ctxt, 0);
10622#ifdef LIBXML_XPTR_LOCS_ENABLED
10624 PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, op1, 0, 0);
10627 if (PUSH_FULL_EXPR(XPATH_OP_COLLECT, op1, ctxt->comp->last, axis,
10647xmlXPathCompRelativeLocationPath
10648(xmlXPathParserContextPtr ctxt) {
10650 if ((
CUR ==
'/') && (
NXT(1) ==
'/')) {
10653 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
10654 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
10655 }
else if (
CUR ==
'/') {
10659 xmlXPathCompStep(ctxt);
10662 while (
CUR ==
'/') {
10663 if ((
CUR ==
'/') && (
NXT(1) ==
'/')) {
10666 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
10667 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
10668 xmlXPathCompStep(ctxt);
10669 }
else if (
CUR ==
'/') {
10672 xmlXPathCompStep(ctxt);
10700xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt) {
10703 xmlXPathCompRelativeLocationPath(ctxt);
10705 while (
CUR ==
'/') {
10706 if ((
CUR ==
'/') && (
NXT(1) ==
'/')) {
10709 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
10710 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
10711 xmlXPathCompRelativeLocationPath(ctxt);
10712 }
else if (
CUR ==
'/') {
10717 (
CUR ==
'@') || (
CUR ==
'*')))
10718 xmlXPathCompRelativeLocationPath(ctxt);
10732xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr
op);
10748xmlXPathNodeSetFilter(xmlXPathParserContextPtr ctxt,
10751 int minPos,
int maxPos,
10754 xmlXPathContextPtr xpctxt;
10755 xmlNodePtr oldnode;
10757 xmlXPathStepOpPtr filterOp;
10768 if (
set->nodeNr < minPos) {
10769 xmlXPathNodeSetClear(
set, hasNsNodes);
10773 xpctxt = ctxt->context;
10774 oldnode = xpctxt->node;
10775 olddoc = xpctxt->doc;
10776 oldcs = xpctxt->contextSize;
10777 oldpp = xpctxt->proximityPosition;
10778 filterOp = &ctxt->comp->steps[filterOpIndex];
10780 xpctxt->contextSize =
set->nodeNr;
10782 for (
i = 0,
j = 0,
pos = 1;
i <
set->nodeNr;
i++) {
10783 xmlNodePtr
node =
set->nodeTab[
i];
10786 xpctxt->node =
node;
10787 xpctxt->proximityPosition =
i + 1;
10795 if ((
node->type != XML_NAMESPACE_DECL) &&
10797 xpctxt->doc =
node->doc;
10799 res = xmlXPathCompOpEvalToBoolean(ctxt, filterOp, 1);
10801 if (ctxt->error != XPATH_EXPRESSION_OK)
10805 xmlXPathErr(ctxt, XPATH_EXPR_ERROR);
10809 if ((
res != 0) && ((
pos >= minPos) && (
pos <= maxPos))) {
10819 if (
node->type == XML_NAMESPACE_DECL)
10820 xmlXPathNodeSetFreeNs((xmlNsPtr)
node);
10824 if (
pos == maxPos) {
10835 for (;
i <
set->nodeNr;
i++) {
10836 xmlNodePtr
node =
set->nodeTab[
i];
10837 if ((
node !=
NULL) && (
node->type == XML_NAMESPACE_DECL))
10838 xmlXPathNodeSetFreeNs((xmlNsPtr)
node);
10845 if ((
set->nodeMax > XML_NODESET_DEFAULT) &&
10846 (
set->nodeNr <
set->nodeMax / 2)) {
10848 int nodeMax =
set->nodeNr;
10850 if (nodeMax < XML_NODESET_DEFAULT)
10851 nodeMax = XML_NODESET_DEFAULT;
10853 nodeMax *
sizeof(xmlNodePtr));
10855 xmlXPathPErrMemory(ctxt,
"shrinking nodeset\n");
10857 set->nodeTab = tmp;
10858 set->nodeMax = nodeMax;
10862 xpctxt->node = oldnode;
10863 xpctxt->doc = olddoc;
10864 xpctxt->contextSize = oldcs;
10865 xpctxt->proximityPosition = oldpp;
10868#ifdef LIBXML_XPTR_LOCS_ENABLED
10882xmlXPathLocationSetFilter(xmlXPathParserContextPtr ctxt,
10883 xmlLocationSetPtr locset,
10885 int minPos,
int maxPos)
10887 xmlXPathContextPtr xpctxt;
10888 xmlNodePtr oldnode;
10890 xmlXPathStepOpPtr filterOp;
10894 if ((locset ==
NULL) || (locset->locNr == 0) || (filterOpIndex == -1))
10897 xpctxt = ctxt->context;
10898 oldnode = xpctxt->node;
10899 olddoc = xpctxt->doc;
10900 oldcs = xpctxt->contextSize;
10901 oldpp = xpctxt->proximityPosition;
10902 filterOp = &ctxt->comp->steps[filterOpIndex];
10904 xpctxt->contextSize = locset->locNr;
10906 for (
i = 0,
j = 0,
pos = 1;
i < locset->locNr;
i++) {
10907 xmlNodePtr contextNode = locset->locTab[
i]->user;
10910 xpctxt->node = contextNode;
10911 xpctxt->proximityPosition =
i + 1;
10919 if ((contextNode->type != XML_NAMESPACE_DECL) &&
10920 (contextNode->doc !=
NULL))
10921 xpctxt->doc = contextNode->doc;
10923 res = xmlXPathCompOpEvalToBoolean(ctxt, filterOp, 1);
10925 if (ctxt->error != XPATH_EXPRESSION_OK)
10929 xmlXPathErr(ctxt, XPATH_EXPR_ERROR);
10933 if ((
res != 0) && ((
pos >= minPos) && (
pos <= maxPos))) {
10935 locset->locTab[
j] = locset->locTab[
i];
10936 locset->locTab[
i] =
NULL;
10942 xmlXPathFreeObject(locset->locTab[
i]);
10943 locset->locTab[
i] =
NULL;
10947 if (
pos == maxPos) {
10957 for (;
i < locset->locNr;
i++)
10958 xmlXPathFreeObject(locset->locTab[
i]);
10963 if ((locset->locMax > XML_NODESET_DEFAULT) &&
10964 (locset->locNr < locset->locMax / 2)) {
10965 xmlXPathObjectPtr *tmp;
10966 int locMax = locset->locNr;
10968 if (locMax < XML_NODESET_DEFAULT)
10969 locMax = XML_NODESET_DEFAULT;
10970 tmp = (xmlXPathObjectPtr *)
xmlRealloc(locset->locTab,
10971 locMax *
sizeof(xmlXPathObjectPtr));
10973 xmlXPathPErrMemory(ctxt,
"shrinking locset\n");
10975 locset->locTab = tmp;
10976 locset->locMax = locMax;
10980 xpctxt->node = oldnode;
10981 xpctxt->doc = olddoc;
10982 xpctxt->contextSize = oldcs;
10983 xpctxt->proximityPosition = oldpp;
11001xmlXPathCompOpEvalPredicate(xmlXPathParserContextPtr ctxt,
11002 xmlXPathStepOpPtr
op,
11004 int minPos,
int maxPos,
11007 if (
op->ch1 != -1) {
11008 xmlXPathCompExprPtr comp = ctxt->comp;
11012 if (comp->steps[
op->ch1].op != XPATH_OP_PREDICATE) {
11014 "xmlXPathCompOpEvalPredicate: Expected a predicate\n");
11015 XP_ERROR(XPATH_INVALID_OPERAND);
11018 XP_ERROR(XPATH_RECURSION_LIMIT_EXCEEDED);
11019 ctxt->context->depth += 1;
11020 xmlXPathCompOpEvalPredicate(ctxt, &comp->steps[
op->ch1],
set,
11021 1,
set->nodeNr, hasNsNodes);
11022 ctxt->context->depth -= 1;
11027 xmlXPathNodeSetFilter(ctxt,
set,
op->ch2, minPos, maxPos, hasNsNodes);
11031xmlXPathIsPositionalPredicate(xmlXPathParserContextPtr ctxt,
11032 xmlXPathStepOpPtr
op,
11036 xmlXPathStepOpPtr exprOp;
11051 if ((
op->op != XPATH_OP_PREDICATE) && (
op->op != XPATH_OP_FILTER))
11054 if (
op->ch2 != -1) {
11055 exprOp = &ctxt->comp->steps[
op->ch2];
11059 if ((exprOp !=
NULL) &&
11060 (exprOp->op == XPATH_OP_VALUE) &&
11061 (exprOp->value4 !=
NULL) &&
11062 (((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER))
11064 double floatval = ((xmlXPathObjectPtr) exprOp->value4)->floatval;
11078 *maxPos = (
int) floatval;
11079 if (floatval == (
double) *maxPos)
11087xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
11088 xmlXPathStepOpPtr
op,
11093#define XP_TEST_HIT \
11094 if (hasAxisRange != 0) { \
11095 if (++pos == maxPos) { \
11096 if (addNode(seq, cur) < 0) \
11097 ctxt->error = XPATH_MEMORY_ERROR; \
11098 goto axis_range_end; } \
11100 if (addNode(seq, cur) < 0) \
11101 ctxt->error = XPATH_MEMORY_ERROR; \
11102 if (breakOnFirstHit) goto first_hit; }
11104#define XP_TEST_HIT_NS \
11105 if (hasAxisRange != 0) { \
11106 if (++pos == maxPos) { \
11108 if (xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur) < 0) \
11109 ctxt->error = XPATH_MEMORY_ERROR; \
11110 goto axis_range_end; } \
11113 if (xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur) < 0) \
11114 ctxt->error = XPATH_MEMORY_ERROR; \
11115 if (breakOnFirstHit) goto first_hit; }
11117 xmlXPathAxisVal axis = (xmlXPathAxisVal)
op->value;
11118 xmlXPathTestVal
test = (xmlXPathTestVal)
op->value2;
11119 xmlXPathTypeVal
type = (xmlXPathTypeVal)
op->value3;
11124 int total = 0, hasNsNodes = 0;
11126 xmlXPathObjectPtr
obj;
11128 xmlNodeSetPtr contextSeq;
11130 xmlNodePtr contextNode;
11132 xmlNodeSetPtr outSeq;
11140 xmlXPathStepOpPtr predOp;
11142 int hasPredicateRange, hasAxisRange,
pos;
11143 int breakOnFirstHit;
11145 xmlXPathTraversalFunction
next =
NULL;
11146 int (*addNode) (xmlNodeSetPtr, xmlNodePtr);
11147 xmlXPathNodeSetMergeFunction mergeAndClear;
11148 xmlNodePtr oldContextNode;
11149 xmlXPathContextPtr xpctxt = ctxt->context;
11152 CHECK_TYPE0(XPATH_NODESET);
11153 obj = valuePop(ctxt);
11158 URI = xmlXPathNsLookup(xpctxt,
prefix);
11160 xmlXPathReleaseObject(xpctxt,
obj);
11161 XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR);
11177 mergeAndClear = xmlXPathNodeSetMergeAndClear;
11179 case AXIS_ANCESTOR:
11181 next = xmlXPathNextAncestor;
11183 case AXIS_ANCESTOR_OR_SELF:
11185 next = xmlXPathNextAncestorOrSelf;
11190 next = xmlXPathNextAttribute;
11191 mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
11195 if (((
test == NODE_TEST_NAME) || (
test == NODE_TEST_ALL)) &&
11196 (
type == NODE_TYPE_NODE))
11201 next = xmlXPathNextChildElement;
11203 next = xmlXPathNextChild;
11204 mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
11206 case AXIS_DESCENDANT:
11208 next = xmlXPathNextDescendant;
11210 case AXIS_DESCENDANT_OR_SELF:
11212 next = xmlXPathNextDescendantOrSelf;
11214 case AXIS_FOLLOWING:
11216 next = xmlXPathNextFollowing;
11218 case AXIS_FOLLOWING_SIBLING:
11220 next = xmlXPathNextFollowingSibling;
11222 case AXIS_NAMESPACE:
11225 next = (xmlXPathTraversalFunction) xmlXPathNextNamespace;
11226 mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
11230 next = xmlXPathNextParent;
11232 case AXIS_PRECEDING:
11234 next = xmlXPathNextPrecedingInternal;
11236 case AXIS_PRECEDING_SIBLING:
11238 next = xmlXPathNextPrecedingSibling;
11243 next = xmlXPathNextSelf;
11244 mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
11249 xmlXPathReleaseObject(xpctxt,
obj);
11252 contextSeq =
obj->nodesetval;
11253 if ((contextSeq ==
NULL) || (contextSeq->nodeNr <= 0)) {
11254 xmlXPathReleaseObject(xpctxt,
obj);
11255 valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt,
NULL));
11278 hasPredicateRange = 0;
11280 if (
op->ch2 != -1) {
11284 predOp = &ctxt->comp->steps[
op->ch2];
11285 if (xmlXPathIsPositionalPredicate(ctxt, predOp, &maxPos)) {
11286 if (predOp->ch1 != -1) {
11290 predOp = &ctxt->comp->steps[predOp->ch1];
11291 hasPredicateRange = 1;
11301 breakOnFirstHit = ((toBool) && (predOp ==
NULL)) ? 1 : 0;
11315 oldContextNode = xpctxt->node;
11316 addNode = xmlXPathNodeSetAddUnique;
11319 contextNode =
NULL;
11323 while (((contextIdx < contextSeq->nodeNr) || (contextNode !=
NULL)) &&
11324 (ctxt->error == XPATH_EXPRESSION_OK)) {
11325 xpctxt->node = contextSeq->nodeTab[contextIdx++];
11328 seq = xmlXPathNodeSetCreate(
NULL);
11342 if (OP_LIMIT_EXCEEDED(ctxt, 1))
11355 if (((
total % 256) == 0) &&
11357 (xmlXPathCmpNodesExt(*
first,
cur) >= 0))
11359 (xmlXPathCmpNodes(*
first,
cur) >= 0))
11368 if (((
total % 256) == 0) &&
11370 (xmlXPathCmpNodesExt(
cur, *
last) >= 0))
11372 (xmlXPathCmpNodes(
cur, *
last) >= 0))
11382 case NODE_TEST_NONE:
11386 case NODE_TEST_TYPE:
11387 if (
type == NODE_TYPE_NODE) {
11388 switch (
cur->type) {
11389 case XML_DOCUMENT_NODE:
11390 case XML_HTML_DOCUMENT_NODE:
11391 case XML_ELEMENT_NODE:
11392 case XML_ATTRIBUTE_NODE:
11394 case XML_COMMENT_NODE:
11395 case XML_CDATA_SECTION_NODE:
11396 case XML_TEXT_NODE:
11399 case XML_NAMESPACE_DECL: {
11400 if (axis == AXIS_NAMESPACE) {
11411 }
else if (
cur->type == (xmlElementType)
type) {
11412 if (
cur->type == XML_NAMESPACE_DECL)
11416 }
else if ((
type == NODE_TYPE_TEXT) &&
11417 (
cur->type == XML_CDATA_SECTION_NODE))
11423 if ((
cur->type == XML_PI_NODE) &&
11429 case NODE_TEST_ALL:
11431 if (
cur->type == XML_ATTRIBUTE_NODE)
11436 }
else if ((
cur->ns !=
NULL) &&
11442 }
else if (axis == AXIS_NAMESPACE) {
11443 if (
cur->type == XML_NAMESPACE_DECL)
11448 if (
cur->type == XML_ELEMENT_NODE) {
11453 }
else if ((
cur->ns !=
NULL) &&
11461 case NODE_TEST_NS:{
11465 case NODE_TEST_NAME:
11467 if (
cur->type != XML_ATTRIBUTE_NODE)
11469 }
else if (axis == AXIS_NAMESPACE) {
11470 if (
cur->type != XML_NAMESPACE_DECL)
11473 if (
cur->type != XML_ELEMENT_NODE)
11476 switch (
cur->type) {
11477 case XML_ELEMENT_NODE:
11493 case XML_ATTRIBUTE_NODE:{
11494 xmlAttrPtr
attr = (xmlAttrPtr)
cur;
11514 case XML_NAMESPACE_DECL:
11515 if (
cur->type == XML_NAMESPACE_DECL) {
11516 xmlNsPtr
ns = (xmlNsPtr)
cur;
11530 }
while ((
cur !=
NULL) && (ctxt->error == XPATH_EXPRESSION_OK));
11532 goto apply_predicates;
11541 if (outSeq ==
NULL) {
11546 outSeq = mergeAndClear(outSeq, seq);
11559 if (outSeq ==
NULL) {
11564 outSeq = mergeAndClear(outSeq, seq);
11568 if (ctxt->error != XPATH_EXPRESSION_OK)
11574 if ((predOp !=
NULL) && (seq->nodeNr > 0)) {
11603 if (hasPredicateRange != 0)
11604 xmlXPathCompOpEvalPredicate(ctxt, predOp, seq, maxPos, maxPos,
11607 xmlXPathCompOpEvalPredicate(ctxt, predOp, seq, 1, seq->nodeNr,
11610 if (ctxt->error != XPATH_EXPRESSION_OK) {
11616 if (seq->nodeNr > 0) {
11620 if (outSeq ==
NULL) {
11625 outSeq = mergeAndClear(outSeq, seq);
11634 if ((
obj->boolval) && (
obj->user !=
NULL)) {
11640 ctxt->
value->boolval = 1;
11641 ctxt->value->user =
obj->user;
11645 xmlXPathReleaseObject(xpctxt,
obj);
11650 if (outSeq ==
NULL) {
11651 if ((seq !=
NULL) && (seq->nodeNr == 0))
11655 outSeq = xmlXPathNodeSetCreate(
NULL);
11657 if ((seq !=
NULL) && (seq != outSeq)) {
11658 xmlXPathFreeNodeSet(seq);
11664 valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, outSeq));
11668 xpctxt->node = oldContextNode;
11673 if (xpctxt->tmpNsList !=
NULL) {
11675 xpctxt->tmpNsList =
NULL;
11682xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt,
11683 xmlXPathStepOpPtr
op, xmlNodePtr *
first);
11697xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt,
11698 xmlXPathStepOpPtr
op, xmlNodePtr *
first)
11701 xmlXPathCompExprPtr comp;
11705 if (OP_LIMIT_EXCEEDED(ctxt, 1))
11708 XP_ERROR0(XPATH_RECURSION_LIMIT_EXCEEDED);
11709 ctxt->context->depth += 1;
11714 case XPATH_OP_UNION:
11716 xmlXPathCompOpEvalFirst(ctxt, &comp->steps[
op->ch1],
11719 if ((ctxt->value !=
NULL)
11720 && (ctxt->value->type == XPATH_NODESET)
11721 && (ctxt->value->nodesetval !=
NULL)
11722 && (ctxt->value->nodesetval->nodeNr >= 1)) {
11733 if (ctxt->value->nodesetval->nodeNr > 1)
11734 xmlXPathNodeSetSort(ctxt->value->nodesetval);
11735 *
first = ctxt->value->nodesetval->nodeTab[0];
11738 xmlXPathCompOpEvalFirst(ctxt, &comp->steps[
op->ch2],
11742 arg2 = valuePop(ctxt);
11743 arg1 = valuePop(ctxt);
11744 if ((
arg1 ==
NULL) || (
arg1->type != XPATH_NODESET) ||
11746 xmlXPathReleaseObject(ctxt->context,
arg1);
11747 xmlXPathReleaseObject(ctxt->context,
arg2);
11748 XP_ERROR0(XPATH_INVALID_TYPE);
11750 if ((ctxt->context->opLimit != 0) &&
11752 (xmlXPathCheckOpLimit(ctxt,
11753 arg1->nodesetval->nodeNr) < 0)) ||
11755 (xmlXPathCheckOpLimit(ctxt,
11756 arg2->nodesetval->nodeNr) < 0)))) {
11757 xmlXPathReleaseObject(ctxt->context,
arg1);
11758 xmlXPathReleaseObject(ctxt->context,
arg2);
11763 arg1->nodesetval = xmlXPathNodeSetMerge(
arg1->nodesetval,
11765 valuePush(ctxt,
arg1);
11766 xmlXPathReleaseObject(ctxt->context,
arg2);
11769 xmlXPathCompSwap(
op);
11772 case XPATH_OP_ROOT:
11773 xmlXPathRoot(ctxt);
11775 case XPATH_OP_NODE:
11777 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
11780 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
11782 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
11783 ctxt->context->node));
11785 case XPATH_OP_COLLECT:{
11789 total = xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
11795 case XPATH_OP_VALUE:
11797 xmlXPathCacheObjectCopy(ctxt->context,
11798 (xmlXPathObjectPtr)
op->value4));
11800 case XPATH_OP_SORT:
11803 xmlXPathCompOpEvalFirst(ctxt, &comp->steps[
op->ch1],
11806 if ((ctxt->value !=
NULL)
11807 && (ctxt->value->type == XPATH_NODESET)
11808 && (ctxt->value->nodesetval !=
NULL)
11809 && (ctxt->value->nodesetval->nodeNr > 1))
11810 xmlXPathNodeSetSort(ctxt->value->nodesetval);
11812#ifdef XP_OPTIMIZED_FILTER_FIRST
11813 case XPATH_OP_FILTER:
11814 total += xmlXPathCompOpEvalFilterFirst(ctxt,
op,
first);
11818 total += xmlXPathCompOpEval(ctxt,
op);
11822 ctxt->context->depth -= 1;
11838xmlXPathCompOpEvalLast(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr
op,
11842 xmlXPathCompExprPtr comp;
11846 if (OP_LIMIT_EXCEEDED(ctxt, 1))
11849 XP_ERROR0(XPATH_RECURSION_LIMIT_EXCEEDED);
11850 ctxt->context->depth += 1;
11855 case XPATH_OP_UNION:
11857 xmlXPathCompOpEvalLast(ctxt, &comp->steps[
op->ch1],
last);
11859 if ((ctxt->value !=
NULL)
11860 && (ctxt->value->type == XPATH_NODESET)
11861 && (ctxt->value->nodesetval !=
NULL)
11862 && (ctxt->value->nodesetval->nodeNr >= 1)) {
11866 if (ctxt->value->nodesetval->nodeNr > 1)
11867 xmlXPathNodeSetSort(ctxt->value->nodesetval);
11869 ctxt->value->nodesetval->nodeTab[ctxt->value->
11870 nodesetval->nodeNr -
11874 xmlXPathCompOpEvalLast(ctxt, &comp->steps[
op->ch2],
last);
11876 if ((ctxt->value !=
NULL)
11877 && (ctxt->value->type == XPATH_NODESET)
11878 && (ctxt->value->nodesetval !=
NULL)
11879 && (ctxt->value->nodesetval->nodeNr >= 1)) {
11882 arg2 = valuePop(ctxt);
11883 arg1 = valuePop(ctxt);
11884 if ((
arg1 ==
NULL) || (
arg1->type != XPATH_NODESET) ||
11886 xmlXPathReleaseObject(ctxt->context,
arg1);
11887 xmlXPathReleaseObject(ctxt->context,
arg2);
11888 XP_ERROR0(XPATH_INVALID_TYPE);
11890 if ((ctxt->context->opLimit != 0) &&
11892 (xmlXPathCheckOpLimit(ctxt,
11893 arg1->nodesetval->nodeNr) < 0)) ||
11895 (xmlXPathCheckOpLimit(ctxt,
11896 arg2->nodesetval->nodeNr) < 0)))) {
11897 xmlXPathReleaseObject(ctxt->context,
arg1);
11898 xmlXPathReleaseObject(ctxt->context,
arg2);
11903 arg1->nodesetval = xmlXPathNodeSetMerge(
arg1->nodesetval,
11905 valuePush(ctxt,
arg1);
11906 xmlXPathReleaseObject(ctxt->context,
arg2);
11909 xmlXPathCompSwap(
op);
11912 case XPATH_OP_ROOT:
11913 xmlXPathRoot(ctxt);
11915 case XPATH_OP_NODE:
11917 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
11920 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
11922 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
11923 ctxt->context->node));
11925 case XPATH_OP_COLLECT:{
11929 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
11935 case XPATH_OP_VALUE:
11937 xmlXPathCacheObjectCopy(ctxt->context,
11938 (xmlXPathObjectPtr)
op->value4));
11940 case XPATH_OP_SORT:
11943 xmlXPathCompOpEvalLast(ctxt, &comp->steps[
op->ch1],
11946 if ((ctxt->value !=
NULL)
11947 && (ctxt->value->type == XPATH_NODESET)
11948 && (ctxt->value->nodesetval !=
NULL)
11949 && (ctxt->value->nodesetval->nodeNr > 1))
11950 xmlXPathNodeSetSort(ctxt->value->nodesetval);
11953 total += xmlXPathCompOpEval(ctxt,
op);
11957 ctxt->context->depth -= 1;
11961#ifdef XP_OPTIMIZED_FILTER_FIRST
11963xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt,
11964 xmlXPathStepOpPtr
op, xmlNodePtr *
first)
11967 xmlXPathCompExprPtr comp;
11968 xmlXPathObjectPtr
obj;
11976 if ((
op->ch1 != -1) && (
op->ch2 != -1) &&
11977 (comp->steps[
op->ch1].op == XPATH_OP_SORT) &&
11978 (comp->steps[
op->ch2].op == XPATH_OP_SORT)) {
11979 int f = comp->steps[
op->ch2].ch1;
11982 (comp->steps[
f].op == XPATH_OP_FUNCTION) &&
11983 (comp->steps[
f].value5 ==
NULL) &&
11984 (comp->steps[
f].value == 0) &&
11985 (comp->steps[
f].value4 !=
NULL) &&
11987 (comp->steps[
f].value4,
BAD_CAST "last"))) {
11991 xmlXPathCompOpEvalLast(ctxt,
11992 &comp->steps[
op->ch1],
11999 if ((ctxt->value !=
NULL) &&
12000 (ctxt->value->type == XPATH_NODESET) &&
12001 (ctxt->value->nodesetval !=
NULL) &&
12002 (ctxt->value->nodesetval->nodeTab !=
NULL) &&
12003 (ctxt->value->nodesetval->nodeNr > 1)) {
12004 xmlXPathNodeSetKeepLast(ctxt->value->nodesetval);
12005 *
first = *(ctxt->value->nodesetval->nodeTab);
12012 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12016 if (ctxt->value ==
NULL)
12019#ifdef LIBXML_XPTR_LOCS_ENABLED
12023 if (ctxt->value->type == XPATH_LOCATIONSET) {
12024 xmlLocationSetPtr locset = ctxt->value->user;
12026 if (locset !=
NULL) {
12027 xmlXPathLocationSetFilter(ctxt, locset,
op->ch2, 1, 1);
12028 if (locset->locNr > 0)
12029 *
first = (xmlNodePtr) locset->locTab[0]->user;
12041 CHECK_TYPE0(XPATH_NODESET);
12042 obj = valuePop(ctxt);
12045 xmlXPathNodeSetFilter(ctxt,
set,
op->ch2, 1, 1, 1);
12046 if (
set->nodeNr > 0)
12049 valuePush(ctxt,
obj);
12064xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr
op)
12068 xmlXPathCompExprPtr comp;
12072 if (OP_LIMIT_EXCEEDED(ctxt, 1))
12075 XP_ERROR0(XPATH_RECURSION_LIMIT_EXCEEDED);
12076 ctxt->context->depth += 1;
12082 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12084 xmlXPathBooleanFunction(ctxt, 1);
12085 if ((ctxt->value ==
NULL) || (ctxt->value->boolval == 0))
12087 arg2 = valuePop(ctxt);
12088 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12090 xmlXPathFreeObject(
arg2);
12093 xmlXPathBooleanFunction(ctxt, 1);
12094 if (ctxt->value !=
NULL)
12095 ctxt->value->boolval &=
arg2->boolval;
12096 xmlXPathReleaseObject(ctxt->context,
arg2);
12099 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12101 xmlXPathBooleanFunction(ctxt, 1);
12102 if ((ctxt->value ==
NULL) || (ctxt->value->boolval == 1))
12104 arg2 = valuePop(ctxt);
12105 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12107 xmlXPathFreeObject(
arg2);
12110 xmlXPathBooleanFunction(ctxt, 1);
12111 if (ctxt->value !=
NULL)
12112 ctxt->value->boolval |=
arg2->boolval;
12113 xmlXPathReleaseObject(ctxt->context,
arg2);
12115 case XPATH_OP_EQUAL:
12116 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12118 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12121 equal = xmlXPathEqualValues(ctxt);
12123 equal = xmlXPathNotEqualValues(ctxt);
12124 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context,
equal));
12127 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12129 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12131 ret = xmlXPathCompareValues(ctxt,
op->value,
op->value2);
12132 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context,
ret));
12134 case XPATH_OP_PLUS:
12135 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12137 if (
op->ch2 != -1) {
12138 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12141 if (
op->value == 0)
12142 xmlXPathSubValues(ctxt);
12143 else if (
op->value == 1)
12144 xmlXPathAddValues(ctxt);
12145 else if (
op->value == 2)
12146 xmlXPathValueFlipSign(ctxt);
12147 else if (
op->value == 3) {
12149 CHECK_TYPE0(XPATH_NUMBER);
12152 case XPATH_OP_MULT:
12153 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12155 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12157 if (
op->value == 0)
12158 xmlXPathMultValues(ctxt);
12159 else if (
op->value == 1)
12160 xmlXPathDivValues(ctxt);
12161 else if (
op->value == 2)
12162 xmlXPathModValues(ctxt);
12164 case XPATH_OP_UNION:
12165 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12167 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12170 arg2 = valuePop(ctxt);
12171 arg1 = valuePop(ctxt);
12172 if ((
arg1 ==
NULL) || (
arg1->type != XPATH_NODESET) ||
12174 xmlXPathReleaseObject(ctxt->context,
arg1);
12175 xmlXPathReleaseObject(ctxt->context,
arg2);
12176 XP_ERROR0(XPATH_INVALID_TYPE);
12178 if ((ctxt->context->opLimit != 0) &&
12180 (xmlXPathCheckOpLimit(ctxt,
12181 arg1->nodesetval->nodeNr) < 0)) ||
12183 (xmlXPathCheckOpLimit(ctxt,
12184 arg2->nodesetval->nodeNr) < 0)))) {
12185 xmlXPathReleaseObject(ctxt->context,
arg1);
12186 xmlXPathReleaseObject(ctxt->context,
arg2);
12192 (
arg2->nodesetval->nodeNr != 0)))
12195 arg1->nodesetval = xmlXPathNodeSetMerge(
arg1->nodesetval,
12199 valuePush(ctxt,
arg1);
12200 xmlXPathReleaseObject(ctxt->context,
arg2);
12202 case XPATH_OP_ROOT:
12203 xmlXPathRoot(ctxt);
12205 case XPATH_OP_NODE:
12207 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12210 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12212 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
12213 ctxt->context->node));
12215 case XPATH_OP_COLLECT:{
12219 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12225 case XPATH_OP_VALUE:
12227 xmlXPathCacheObjectCopy(ctxt->context,
12228 (xmlXPathObjectPtr)
op->value4));
12230 case XPATH_OP_VARIABLE:{
12231 xmlXPathObjectPtr
val;
12235 xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12236 if (
op->value5 ==
NULL) {
12237 val = xmlXPathVariableLookup(ctxt->context,
op->value4);
12239 XP_ERROR0(XPATH_UNDEF_VARIABLE_ERROR);
12240 valuePush(ctxt,
val);
12244 URI = xmlXPathNsLookup(ctxt->context,
op->value5);
12247 "xmlXPathCompOpEval: variable %s bound to undefined prefix %s\n",
12248 (
char *)
op->value4, (
char *)
op->value5);
12249 ctxt->error = XPATH_UNDEF_PREFIX_ERROR;
12252 val = xmlXPathVariableLookupNS(ctxt->context,
12255 XP_ERROR0(XPATH_UNDEF_VARIABLE_ERROR);
12256 valuePush(ctxt,
val);
12260 case XPATH_OP_FUNCTION:{
12261 xmlXPathFunction
func;
12262 const xmlChar *oldFunc, *oldFuncURI;
12266 frame = ctxt->valueNr;
12267 if (
op->ch1 != -1) {
12269 xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12270 if (ctxt->error != XPATH_EXPRESSION_OK)
12273 if (ctxt->valueNr < frame +
op->value) {
12275 "xmlXPathCompOpEval: parameter error\n");
12276 ctxt->error = XPATH_INVALID_OPERAND;
12279 for (
i = 0;
i <
op->value;
i++) {
12280 if (ctxt->valueTab[(ctxt->valueNr - 1) -
i] ==
NULL) {
12282 "xmlXPathCompOpEval: parameter error\n");
12283 ctxt->error = XPATH_INVALID_OPERAND;
12294 xmlXPathFunctionLookup(ctxt->context,
12297 URI = xmlXPathNsLookup(ctxt->context,
op->value5);
12300 "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n",
12301 (
char *)
op->value4, (
char *)
op->value5);
12302 ctxt->error = XPATH_UNDEF_PREFIX_ERROR;
12305 func = xmlXPathFunctionLookupNS(ctxt->context,
12310 "xmlXPathCompOpEval: function %s not found\n",
12311 (
char *)
op->value4);
12312 XP_ERROR0(XPATH_UNKNOWN_FUNC_ERROR);
12315 op->cacheURI = (
void *) URI;
12317 oldFunc = ctxt->context->function;
12318 oldFuncURI = ctxt->context->functionURI;
12319 ctxt->context->function =
op->value4;
12320 ctxt->context->functionURI =
op->cacheURI;
12322 ctxt->context->function = oldFunc;
12323 ctxt->context->functionURI = oldFuncURI;
12324 if ((ctxt->error == XPATH_EXPRESSION_OK) &&
12325 (ctxt->valueNr != frame + 1))
12326 XP_ERROR0(XPATH_STACK_ERROR);
12330 if (
op->ch1 != -1) {
12331 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12334 if (
op->ch2 != -1) {
12335 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12339 case XPATH_OP_PREDICATE:
12340 case XPATH_OP_FILTER:{
12341 xmlXPathObjectPtr
obj;
12347 if ((
op->ch1 != -1) && (
op->ch2 != -1) &&
12358 ((comp->steps[
op->ch1].op == XPATH_OP_SORT) ||
12359 (comp->steps[
op->ch1].op == XPATH_OP_FILTER)) &&
12361 (comp->steps[
op->ch1].op == XPATH_OP_SORT) &&
12363 (comp->steps[
op->ch2].op == XPATH_OP_VALUE)) {
12364 xmlXPathObjectPtr
val;
12366 val = comp->steps[
op->ch2].value4;
12367 if ((
val !=
NULL) && (
val->type == XPATH_NUMBER) &&
12368 (
val->floatval == 1.0)) {
12372 xmlXPathCompOpEvalFirst(ctxt,
12373 &comp->steps[
op->ch1],
12380 if ((ctxt->value !=
NULL) &&
12381 (ctxt->value->type == XPATH_NODESET) &&
12382 (ctxt->value->nodesetval !=
NULL) &&
12383 (ctxt->value->nodesetval->nodeNr > 1))
12384 xmlXPathNodeSetClearFromPos(ctxt->value->nodesetval,
12392 if ((
op->ch1 != -1) && (
op->ch2 != -1) &&
12393 (comp->steps[
op->ch1].op == XPATH_OP_SORT) &&
12394 (comp->steps[
op->ch2].op == XPATH_OP_SORT)) {
12395 int f = comp->steps[
op->ch2].ch1;
12398 (comp->steps[
f].op == XPATH_OP_FUNCTION) &&
12399 (comp->steps[
f].value5 ==
NULL) &&
12400 (comp->steps[
f].value == 0) &&
12401 (comp->steps[
f].value4 !=
NULL) &&
12403 (comp->steps[
f].value4,
BAD_CAST "last"))) {
12407 xmlXPathCompOpEvalLast(ctxt,
12408 &comp->steps[
op->ch1],
12415 if ((ctxt->value !=
NULL) &&
12416 (ctxt->value->type == XPATH_NODESET) &&
12417 (ctxt->value->nodesetval !=
NULL) &&
12418 (ctxt->value->nodesetval->nodeTab !=
NULL) &&
12419 (ctxt->value->nodesetval->nodeNr > 1))
12420 xmlXPathNodeSetKeepLast(ctxt->value->nodesetval);
12437 xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12441 if (ctxt->value ==
NULL)
12444#ifdef LIBXML_XPTR_LOCS_ENABLED
12448 if (ctxt->value->type == XPATH_LOCATIONSET) {
12449 xmlLocationSetPtr locset = ctxt->value->user;
12450 xmlXPathLocationSetFilter(ctxt, locset,
op->ch2,
12462 CHECK_TYPE0(XPATH_NODESET);
12463 obj = valuePop(ctxt);
12466 xmlXPathNodeSetFilter(ctxt,
set,
op->ch2,
12467 1,
set->nodeNr, 1);
12468 valuePush(ctxt,
obj);
12471 case XPATH_OP_SORT:
12473 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12475 if ((ctxt->value !=
NULL) &&
12476 (ctxt->value->type == XPATH_NODESET) &&
12477 (ctxt->value->nodesetval !=
NULL) &&
12478 (ctxt->value->nodesetval->nodeNr > 1))
12480 xmlXPathNodeSetSort(ctxt->value->nodesetval);
12483#ifdef LIBXML_XPTR_LOCS_ENABLED
12484 case XPATH_OP_RANGETO:{
12485 xmlXPathObjectPtr
range;
12486 xmlXPathObjectPtr
res,
obj;
12487 xmlXPathObjectPtr tmp;
12488 xmlLocationSetPtr newlocset =
NULL;
12489 xmlLocationSetPtr oldlocset;
12490 xmlNodeSetPtr oldset;
12491 xmlNodePtr oldnode = ctxt->context->node;
12492 int oldcs = ctxt->context->contextSize;
12493 int oldpp = ctxt->context->proximityPosition;
12496 if (
op->ch1 != -1) {
12498 xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12501 if (ctxt->value ==
NULL) {
12502 XP_ERROR0(XPATH_INVALID_OPERAND);
12507 if (ctxt->value->type == XPATH_LOCATIONSET) {
12513 CHECK_TYPE0(XPATH_LOCATIONSET);
12515 if ((ctxt->value->user ==
NULL) ||
12516 (((xmlLocationSetPtr) ctxt->value->user)->locNr == 0))
12519 obj = valuePop(ctxt);
12520 oldlocset =
obj->user;
12522 newlocset = xmlXPtrLocationSetCreate(
NULL);
12524 for (
i = 0;
i < oldlocset->locNr;
i++) {
12529 ctxt->context->node = oldlocset->locTab[
i]->user;
12530 ctxt->context->contextSize = oldlocset->locNr;
12531 ctxt->context->proximityPosition =
i + 1;
12532 tmp = xmlXPathCacheNewNodeSet(ctxt->context,
12533 ctxt->context->node);
12534 valuePush(ctxt, tmp);
12538 xmlXPathCompOpEval(ctxt,
12539 &comp->steps[
op->ch2]);
12540 if (ctxt->error != XPATH_EXPRESSION_OK) {
12541 xmlXPtrFreeLocationSet(newlocset);
12542 goto rangeto_error;
12545 res = valuePop(ctxt);
12546 if (
res->type == XPATH_LOCATIONSET) {
12547 xmlLocationSetPtr rloc =
12548 (xmlLocationSetPtr)
res->user;
12549 for (
j=0;
j<rloc->locNr;
j++) {
12550 range = xmlXPtrNewRange(
12551 oldlocset->locTab[
i]->user,
12552 oldlocset->locTab[
i]->index,
12553 rloc->locTab[
j]->user2,
12554 rloc->locTab[
j]->index2);
12556 xmlXPtrLocationSetAdd(newlocset,
range);
12560 range = xmlXPtrNewRangeNodeObject(
12561 (xmlNodePtr)oldlocset->locTab[
i]->user,
res);
12563 xmlXPtrLocationSetAdd(newlocset,
range);
12571 xmlXPathReleaseObject(ctxt->context,
res);
12573 if (ctxt->value == tmp) {
12574 res = valuePop(ctxt);
12575 xmlXPathReleaseObject(ctxt->context,
res);
12579 CHECK_TYPE0(XPATH_NODESET);
12580 obj = valuePop(ctxt);
12581 oldset =
obj->nodesetval;
12583 newlocset = xmlXPtrLocationSetCreate(
NULL);
12585 if (oldset !=
NULL) {
12586 for (
i = 0;
i < oldset->nodeNr;
i++) {
12591 ctxt->context->node = oldset->nodeTab[
i];
12595 tmp = xmlXPathCacheNewNodeSet(ctxt->context,
12596 ctxt->context->node);
12597 valuePush(ctxt, tmp);
12601 xmlXPathCompOpEval(ctxt,
12602 &comp->steps[
op->ch2]);
12603 if (ctxt->error != XPATH_EXPRESSION_OK) {
12604 xmlXPtrFreeLocationSet(newlocset);
12605 goto rangeto_error;
12608 res = valuePop(ctxt);
12610 xmlXPtrNewRangeNodeObject(oldset->nodeTab[
i],
12613 xmlXPtrLocationSetAdd(newlocset,
range);
12620 xmlXPathReleaseObject(ctxt->context,
res);
12622 if (ctxt->value == tmp) {
12623 res = valuePop(ctxt);
12624 xmlXPathReleaseObject(ctxt->context,
res);
12633 valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset));
12635 xmlXPathReleaseObject(ctxt->context,
obj);
12636 ctxt->context->node = oldnode;
12637 ctxt->context->contextSize = oldcs;
12638 ctxt->context->proximityPosition = oldpp;
12644 "XPath: unknown precompiled operation %d\n",
op->op);
12645 ctxt->error = XPATH_INVALID_OPERAND;
12649 ctxt->context->depth -= 1;
12662xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt,
12663 xmlXPathStepOpPtr
op,
12666 xmlXPathObjectPtr resObj =
NULL;
12669 if (OP_LIMIT_EXCEEDED(ctxt, 1))
12675 case XPATH_OP_VALUE:
12676 resObj = (xmlXPathObjectPtr)
op->value4;
12678 return(xmlXPathEvaluatePredicateResult(ctxt, resObj));
12679 return(xmlXPathCastToBoolean(resObj));
12680 case XPATH_OP_SORT:
12684 if (
op->ch1 != -1) {
12685 op = &ctxt->comp->steps[
op->ch1];
12689 case XPATH_OP_COLLECT:
12693 xmlXPathCompOpEval(ctxt, &ctxt->comp->steps[
op->ch1]);
12694 if (ctxt->error != XPATH_EXPRESSION_OK)
12697 xmlXPathNodeCollectAndTest(ctxt,
op,
NULL,
NULL, 1);
12698 if (ctxt->error != XPATH_EXPRESSION_OK)
12701 resObj = valuePop(ctxt);
12702 if (resObj ==
NULL)
12709 xmlXPathCompOpEval(ctxt,
op);
12710 if (ctxt->error != XPATH_EXPRESSION_OK)
12713 resObj = valuePop(ctxt);
12714 if (resObj ==
NULL)
12722 if (resObj->type == XPATH_BOOLEAN) {
12723 res = resObj->boolval;
12724 }
else if (isPredicate) {
12733 res = xmlXPathEvaluatePredicateResult(ctxt, resObj);
12735 res = xmlXPathCastToBoolean(resObj);
12737 xmlXPathReleaseObject(ctxt->context, resObj);
12744#ifdef XPATH_STREAMING
12752xmlXPathRunStreamEval(xmlXPathContextPtr ctxt, xmlPatternPtr comp,
12753 xmlXPathObjectPtr *resultSeq,
int toBool)
12755 int max_depth, min_depth;
12758 int eval_all_nodes;
12760 xmlStreamCtxtPtr patstream =
NULL;
12762 if ((ctxt ==
NULL) || (comp ==
NULL))
12764 max_depth = xmlPatternMaxDepth(comp);
12765 if (max_depth == -1)
12767 if (max_depth == -2)
12769 min_depth = xmlPatternMinDepth(comp);
12770 if (min_depth == -1)
12772 from_root = xmlPatternFromRoot(comp);
12776 printf(
"stream eval: depth %d from root %d\n", max_depth, from_root);
12780 if (resultSeq ==
NULL)
12782 *resultSeq = xmlXPathCacheNewNodeSet(ctxt,
NULL);
12783 if (*resultSeq ==
NULL)
12790 if (min_depth == 0) {
12796 xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval,
12797 (xmlNodePtr) ctxt->doc);
12803 xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, ctxt->node);
12806 if (max_depth == 0) {
12811 cur = (xmlNodePtr)ctxt->doc;
12812 }
else if (ctxt->node !=
NULL) {
12813 switch (ctxt->node->type) {
12814 case XML_ELEMENT_NODE:
12815 case XML_DOCUMENT_NODE:
12816 case XML_DOCUMENT_FRAG_NODE:
12817 case XML_HTML_DOCUMENT_NODE:
12820 case XML_ATTRIBUTE_NODE:
12821 case XML_TEXT_NODE:
12822 case XML_CDATA_SECTION_NODE:
12823 case XML_ENTITY_REF_NODE:
12824 case XML_ENTITY_NODE:
12826 case XML_COMMENT_NODE:
12827 case XML_NOTATION_NODE:
12829 case XML_DOCUMENT_TYPE_NODE:
12830 case XML_ELEMENT_DECL:
12831 case XML_ATTRIBUTE_DECL:
12832 case XML_ENTITY_DECL:
12833 case XML_NAMESPACE_DECL:
12834 case XML_XINCLUDE_START:
12835 case XML_XINCLUDE_END:
12844 patstream = xmlPatternGetStreamCtxt(comp);
12845 if (patstream ==
NULL) {
12852 eval_all_nodes = xmlStreamWantsAnyNode(patstream);
12857 }
else if (
ret == 1) {
12861 xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval,
cur);
12865 goto scan_children;
12868 if (ctxt->opLimit != 0) {
12869 if (ctxt->opCount >= ctxt->opLimit) {
12871 "XPath operation limit exceeded\n");
12872 xmlFreeStreamCtxt(patstream);
12878 switch (
cur->type) {
12879 case XML_ELEMENT_NODE:
12880 case XML_TEXT_NODE:
12881 case XML_CDATA_SECTION_NODE:
12882 case XML_COMMENT_NODE:
12884 if (
cur->type == XML_ELEMENT_NODE) {
12885 ret = xmlStreamPush(patstream,
cur->name,
12887 }
else if (eval_all_nodes)
12894 }
else if (
ret == 1) {
12897 if (xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval,
cur)
12903 if ((
cur->children ==
NULL) || (
depth >= max_depth)) {
12904 ret = xmlStreamPop(patstream);
12907 if ((
cur->type != XML_ENTITY_DECL) &&
12908 (
cur->type != XML_DTD_NODE))
12917 if (
cur->type == XML_NAMESPACE_DECL)
break;
12922 if (
cur->children->type != XML_ENTITY_DECL) {
12928 if (
cur->type != XML_DTD_NODE)
12938 if ((
cur->type != XML_ENTITY_DECL) &&
12939 (
cur->type != XML_DTD_NODE))
12947 (
cur->type == XML_DOCUMENT_NODE))
12949 if (
cur->type == XML_ELEMENT_NODE) {
12950 ret = xmlStreamPop(patstream);
12951 }
else if ((eval_all_nodes) &&
12952 ((
cur->type == XML_TEXT_NODE) ||
12953 (
cur->type == XML_CDATA_SECTION_NODE) ||
12954 (
cur->type == XML_COMMENT_NODE) ||
12955 (
cur->type == XML_PI_NODE)))
12957 ret = xmlStreamPop(patstream);
12970 xmlFreeStreamCtxt(patstream);
12975 xmlFreeStreamCtxt(patstream);
12988xmlXPathRunEval(xmlXPathParserContextPtr ctxt,
int toBool)
12990 xmlXPathCompExprPtr comp;
12993 if ((ctxt ==
NULL) || (ctxt->comp ==
NULL))
12996 if (ctxt->valueTab ==
NULL) {
12998 ctxt->valueTab = (xmlXPathObjectPtr *)
12999 xmlMalloc(10 *
sizeof(xmlXPathObjectPtr));
13000 if (ctxt->valueTab ==
NULL) {
13001 xmlXPathPErrMemory(ctxt,
"creating evaluation context\n");
13005 ctxt->valueMax = 10;
13006 ctxt->value =
NULL;
13008#ifdef XPATH_STREAMING
13009 if (ctxt->comp->stream) {
13016 res = xmlXPathRunStreamEval(ctxt->context,
13017 ctxt->comp->stream,
NULL, 1);
13021 xmlXPathObjectPtr resObj =
NULL;
13026 res = xmlXPathRunStreamEval(ctxt->context,
13027 ctxt->comp->stream, &resObj, 0);
13029 if ((
res != -1) && (resObj !=
NULL)) {
13030 valuePush(ctxt, resObj);
13033 if (resObj !=
NULL)
13034 xmlXPathReleaseObject(ctxt->context, resObj);
13043 if (comp->last < 0) {
13045 "xmlXPathRunEval: last is less than zero\n");
13048 oldDepth = ctxt->context->depth;
13050 return(xmlXPathCompOpEvalToBoolean(ctxt,
13051 &comp->steps[comp->last], 0));
13053 xmlXPathCompOpEval(ctxt, &comp->steps[comp->last]);
13054 ctxt->context->depth = oldDepth;
13082xmlXPathEvalPredicate(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
res) {
13084 switch (
res->type) {
13085 case XPATH_BOOLEAN:
13086 return(
res->boolval);
13088 return(
res->floatval == ctxt->proximityPosition);
13089 case XPATH_NODESET:
13090 case XPATH_XSLT_TREE:
13093 return(
res->nodesetval->nodeNr != 0);
13095 return((
res->stringval !=
NULL) &&
13120xmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt,
13121 xmlXPathObjectPtr
res) {
13123 switch (
res->type) {
13124 case XPATH_BOOLEAN:
13125 return(
res->boolval);
13127#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER == 1200))
13128 return((
res->floatval == ctxt->context->proximityPosition) &&
13129 (!xmlXPathIsNaN(
res->floatval)));
13131 return(
res->floatval == ctxt->context->proximityPosition);
13133 case XPATH_NODESET:
13134 case XPATH_XSLT_TREE:
13137 return(
res->nodesetval->nodeNr != 0);
13139 return((
res->stringval !=
NULL) && (
res->stringval[0] != 0));
13140#ifdef LIBXML_XPTR_LOCS_ENABLED
13141 case XPATH_LOCATIONSET:{
13142 xmlLocationSetPtr
ptr =
res->user;
13145 return (
ptr->locNr != 0);
13154#ifdef XPATH_STREAMING
13164static xmlXPathCompExprPtr
13165xmlXPathTryStreamCompile(xmlXPathContextPtr ctxt,
const xmlChar *
str) {
13171 xmlXPathCompExprPtr comp;
13191 if ((tmp !=
NULL) &&
13192 ((ctxt ==
NULL) || (ctxt->nsNr == 0) || (tmp[1] ==
':')))
13195 if (ctxt !=
NULL) {
13197 if (ctxt->nsNr > 0) {
13199 if (namespaces ==
NULL) {
13200 xmlXPathErrMemory(ctxt,
"allocating namespaces array\n");
13203 for (
i = 0,
j = 0; (
j < ctxt->nsNr);
j++) {
13204 ns = ctxt->namespaces[
j];
13205 namespaces[
i++] =
ns->href;
13208 namespaces[
i++] =
NULL;
13209 namespaces[
i] =
NULL;
13213 stream = xmlPatterncompile(
str, dict, XML_PATTERN_XPATH, namespaces);
13214 if (namespaces !=
NULL) {
13218 comp = xmlXPathNewCompExpr();
13219 if (comp ==
NULL) {
13220 xmlXPathErrMemory(ctxt,
"allocating streamable expression\n");
13237xmlXPathOptimizeExpression(xmlXPathParserContextPtr pctxt,
13238 xmlXPathStepOpPtr
op)
13240 xmlXPathCompExprPtr comp = pctxt->comp;
13241 xmlXPathContextPtr ctxt;
13248 if ((
op->op == XPATH_OP_COLLECT ) &&
13252 xmlXPathStepOpPtr prevop = &comp->steps[
op->ch1];
13254 if ((prevop->op == XPATH_OP_COLLECT ) &&
13255 ((xmlXPathAxisVal) prevop->value ==
13256 AXIS_DESCENDANT_OR_SELF) &&
13257 (prevop->ch2 == -1) &&
13258 ((xmlXPathTestVal) prevop->value2 == NODE_TEST_TYPE) &&
13259 ((xmlXPathTypeVal) prevop->value3 == NODE_TYPE_NODE))
13266 switch ((xmlXPathAxisVal)
op->value) {
13268 case AXIS_DESCENDANT:
13274 op->ch1 = prevop->ch1;
13275 op->value = AXIS_DESCENDANT;
13278 case AXIS_DESCENDANT_OR_SELF:
13284 op->ch1 = prevop->ch1;
13285 op->value = AXIS_DESCENDANT_OR_SELF;
13294 if (
op->op == XPATH_OP_VALUE)
13298 ctxt = pctxt->context;
13299 if (ctxt !=
NULL) {
13305 xmlXPathOptimizeExpression(pctxt, &comp->steps[
op->ch1]);
13307 xmlXPathOptimizeExpression(pctxt, &comp->steps[
op->ch2]);
13323xmlXPathCtxtCompile(xmlXPathContextPtr ctxt,
const xmlChar *
str) {
13324 xmlXPathParserContextPtr pctxt;
13325 xmlXPathCompExprPtr comp;
13328#ifdef XPATH_STREAMING
13329 comp = xmlXPathTryStreamCompile(ctxt,
str);
13336 pctxt = xmlXPathNewParserContext(
str, ctxt);
13340 oldDepth = ctxt->depth;
13341 xmlXPathCompileExpr(pctxt, 1);
13343 ctxt->depth = oldDepth;
13345 if( pctxt->error != XPATH_EXPRESSION_OK )
13347 xmlXPathFreeParserContext(pctxt);
13351 if (*pctxt->cur != 0) {
13358 xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
13361 comp = pctxt->comp;
13362 if ((comp->nbStep > 1) && (comp->last >= 0)) {
13364 oldDepth = ctxt->depth;
13365 xmlXPathOptimizeExpression(pctxt, &comp->steps[comp->last]);
13367 ctxt->depth = oldDepth;
13369 pctxt->comp =
NULL;
13371 xmlXPathFreeParserContext(pctxt);
13373 if (comp !=
NULL) {
13390 return(xmlXPathCtxtCompile(
NULL,
str));
13407xmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp,
13408 xmlXPathContextPtr ctxt,
13409 xmlXPathObjectPtr *resObjPtr,
13412 xmlXPathParserContextPtr pctxt;
13413 xmlXPathObjectPtr resObj;
13414#ifndef LIBXML_THREAD_ENABLED
13415 static int reentance = 0;
13419 CHECK_CTXT_NEG(ctxt)
13425#ifndef LIBXML_THREAD_ENABLED
13428 xmlXPathDisableOptimizer = 1;
13431 pctxt = xmlXPathCompParserContext(comp, ctxt);
13434 res = xmlXPathRunEval(pctxt, toBool);
13436 if (pctxt->error != XPATH_EXPRESSION_OK) {
13439 resObj = valuePop(pctxt);
13440 if (resObj ==
NULL) {
13443 "xmlXPathCompiledEval: No result on the stack.\n");
13444 }
else if (pctxt->valueNr > 0) {
13446 "xmlXPathCompiledEval: %d object(s) left on the stack.\n",
13452 *resObjPtr = resObj;
13454 xmlXPathReleaseObject(ctxt, resObj);
13456 pctxt->comp =
NULL;
13457 xmlXPathFreeParserContext(pctxt);
13458#ifndef LIBXML_THREAD_ENABLED
13476xmlXPathCompiledEval(xmlXPathCompExprPtr comp, xmlXPathContextPtr
ctx)
13478 xmlXPathObjectPtr
res =
NULL;
13480 xmlXPathCompiledEvalInternal(comp,
ctx, &
res, 0);
13496xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp,
13497 xmlXPathContextPtr ctxt)
13499 return(xmlXPathCompiledEvalInternal(comp, ctxt,
NULL, 1));
13510xmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) {
13511#ifdef XPATH_STREAMING
13512 xmlXPathCompExprPtr comp;
13516 if (ctxt ==
NULL)
return;
13518#ifdef XPATH_STREAMING
13519 comp = xmlXPathTryStreamCompile(ctxt->context, ctxt->base);
13520 if (comp !=
NULL) {
13521 if (ctxt->comp !=
NULL)
13522 xmlXPathFreeCompExpr(ctxt->comp);
13527 if (ctxt->context !=
NULL)
13528 oldDepth = ctxt->context->depth;
13529 xmlXPathCompileExpr(ctxt, 1);
13530 if (ctxt->context !=
NULL)
13531 ctxt->context->depth = oldDepth;
13535 if (*ctxt->cur != 0)
13536 XP_ERROR(XPATH_EXPR_ERROR);
13538 if ((ctxt->comp->nbStep > 1) && (ctxt->comp->last >= 0)) {
13539 if (ctxt->context !=
NULL)
13540 oldDepth = ctxt->context->depth;
13541 xmlXPathOptimizeExpression(ctxt,
13542 &ctxt->comp->steps[ctxt->comp->last]);
13543 if (ctxt->context !=
NULL)
13544 ctxt->context->depth = oldDepth;
13548 xmlXPathRunEval(ctxt, 0);
13563 xmlXPathParserContextPtr ctxt;
13564 xmlXPathObjectPtr
res;
13570 ctxt = xmlXPathNewParserContext(
str,
ctx);
13573 xmlXPathEvalExpr(ctxt);
13575 if (ctxt->error != XPATH_EXPRESSION_OK) {
13578 res = valuePop(ctxt);
13581 "xmlXPathCompiledEval: No result on the stack.\n");
13582 }
else if (ctxt->valueNr > 0) {
13584 "xmlXPathCompiledEval: %d object(s) left on the stack.\n",
13589 xmlXPathFreeParserContext(ctxt);
13604xmlXPathSetContextNode(xmlNodePtr
node, xmlXPathContextPtr
ctx) {
13631 if (xmlXPathSetContextNode(
node,
ctx) < 0)
13633 return(xmlXPathEval(
str,
ctx));
13647xmlXPathEvalExpression(
const xmlChar *
str, xmlXPathContextPtr ctxt) {
13648 return(xmlXPathEval(
str, ctxt));
13705xmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
13706 xmlXPathObjectPtr
str;
13707 int escape_reserved;
13714 escape_reserved = xmlXPathPopBoolean(ctxt);
13717 str = valuePop(ctxt);
13725 for (cptr =
str->stringval; *cptr; cptr++) {
13726 if ((*cptr >=
'A' && *cptr <=
'Z') ||
13727 (*cptr >=
'a' && *cptr <=
'z') ||
13728 (*cptr >=
'0' && *cptr <=
'9') ||
13729 *cptr ==
'-' || *cptr ==
'_' || *cptr ==
'.' ||
13730 *cptr ==
'!' || *cptr ==
'~' || *cptr ==
'*' ||
13731 *cptr ==
'\''|| *cptr ==
'(' || *cptr ==
')' ||
13733 ((cptr[1] >=
'A' && cptr[1] <=
'F') ||
13734 (cptr[1] >=
'a' && cptr[1] <=
'f') ||
13735 (cptr[1] >=
'0' && cptr[1] <=
'9')) &&
13736 ((cptr[2] >=
'A' && cptr[2] <=
'F') ||
13737 (cptr[2] >=
'a' && cptr[2] <=
'f') ||
13738 (cptr[2] >=
'0' && cptr[2] <=
'9'))) ||
13739 (!escape_reserved &&
13740 (*cptr ==
';' || *cptr ==
'/' || *cptr ==
'?' ||
13741 *cptr ==
':' || *cptr ==
'@' || *cptr ==
'&' ||
13742 *cptr ==
'=' || *cptr ==
'+' || *cptr ==
'$' ||
13746 if ((*cptr >> 4) < 10)
13747 escape[1] =
'0' + (*cptr >> 4);
13749 escape[1] =
'A' - 10 + (*cptr >> 4);
13750 if ((*cptr & 0xF) < 10)
13751 escape[2] =
'0' + (*cptr & 0xF);
13753 escape[2] =
'A' - 10 + (*cptr & 0xF);
13759 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
13762 xmlXPathReleaseObject(ctxt->context,
str);
13772xmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt)
13774 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"boolean",
13775 xmlXPathBooleanFunction);
13776 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"ceiling",
13777 xmlXPathCeilingFunction);
13778 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"count",
13779 xmlXPathCountFunction);
13780 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"concat",
13781 xmlXPathConcatFunction);
13782 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"contains",
13783 xmlXPathContainsFunction);
13784 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"id",
13785 xmlXPathIdFunction);
13786 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"false",
13787 xmlXPathFalseFunction);
13788 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"floor",
13789 xmlXPathFloorFunction);
13790 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"last",
13791 xmlXPathLastFunction);
13792 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"lang",
13793 xmlXPathLangFunction);
13794 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"local-name",
13795 xmlXPathLocalNameFunction);
13796 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"not",
13797 xmlXPathNotFunction);
13798 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"name",
13799 xmlXPathNameFunction);
13800 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"namespace-uri",
13801 xmlXPathNamespaceURIFunction);
13802 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"normalize-space",
13803 xmlXPathNormalizeFunction);
13804 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"number",
13805 xmlXPathNumberFunction);
13806 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"position",
13807 xmlXPathPositionFunction);
13808 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"round",
13809 xmlXPathRoundFunction);
13810 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"string",
13811 xmlXPathStringFunction);
13812 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"string-length",
13813 xmlXPathStringLengthFunction);
13814 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"starts-with",
13815 xmlXPathStartsWithFunction);
13816 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"substring",
13817 xmlXPathSubstringFunction);
13818 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"substring-before",
13819 xmlXPathSubstringBeforeFunction);
13820 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"substring-after",
13821 xmlXPathSubstringAfterFunction);
13822 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"sum",
13823 xmlXPathSumFunction);
13824 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"true",
13825 xmlXPathTrueFunction);
13826 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"translate",
13827 xmlXPathTranslateFunction);
13829 xmlXPathRegisterFuncNS(ctxt, (
const xmlChar *)
"escape-uri",
13830 (
const xmlChar *)
"http://www.w3.org/2002/08/xquery-functions",
13831 xmlXPathEscapeUriFunction);
INT copy(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], INT append, DWORD lpdwFlags, BOOL bTouch)
void xmlBufFree(xmlBufPtr buf)
xmlBufPtr xmlBufCreate(void)
xmlChar * xmlBufContent(const xmlBuf *buf)
int xmlBufAdd(xmlBufPtr buf, const xmlChar *str, int len)
static WCHAR no[MAX_STRING_RESOURCE_LEN]
BOOL next_node(stream_t *stream, strbuf_t *buf)
int WINAPIV fprintf(FILE *file, const char *format,...)
_ACRTIMP double __cdecl fabs(double)
_ACRTIMP double __cdecl ceil(double)
_ACRTIMP double __cdecl fmod(double, double)
_ACRTIMP double __cdecl floor(double)
_ACRTIMP size_t __cdecl strlen(const char *)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
double pow(double x, double y)
GLint GLint GLsizei GLsizei GLsizei depth
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble GLdouble q
GLuint GLuint GLuint GLuint arg1
GLdouble GLdouble GLdouble GLdouble top
GLuint GLuint GLuint GLuint GLuint GLuint GLuint arg2
GLenum GLuint GLenum GLsizei const GLchar * buf
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define ATTRIBUTE_NO_SANITIZE(arg)
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
static unsigned int number
#define eq(received, expected, label, type)
static const char mbstate_t *static wchar_t const char mbstate_t *static const wchar_t int *static double
static DWORD DWORD DWORD DWORD * steps
static void set1(uint8 *data, int x, int y)
#define XML_MAX_NAME_LENGTH
#define IS_ASCII_DIGIT(c)
#define IS_ASCII_LETTER(c)
XML_HIDDEN void xmlInitXPathInternal(void)
static unsigned __int64 next
void xmlDictFree(xmlDictPtr dict)
int xmlDictReference(xmlDictPtr dict)
const xmlChar * xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len)
void * xmlGenericErrorContext
xmlReallocFunc xmlRealloc
xmlGenericErrorFunc xmlGenericError
xmlMallocFunc xmlMallocAtomic
void xmlHashFree(xmlHashTablePtr hash, xmlHashDeallocator dealloc)
void * xmlHashLookup(xmlHashTablePtr hash, const xmlChar *key)
void * xmlHashLookup2(xmlHashTablePtr hash, const xmlChar *key, const xmlChar *key2)
int xmlHashRemoveEntry(xmlHashTablePtr hash, const xmlChar *key, xmlHashDeallocator dealloc)
int xmlHashRemoveEntry2(xmlHashTablePtr hash, const xmlChar *key, const xmlChar *key2, xmlHashDeallocator dealloc)
int xmlHashAddEntry(xmlHashTablePtr hash, const xmlChar *key, void *payload)
xmlHashTablePtr xmlHashCreate(int size)
int xmlHashUpdateEntry2(xmlHashTablePtr hash, const xmlChar *key, const xmlChar *key2, void *payload, xmlHashDeallocator dealloc)
int xmlHashUpdateEntry(xmlHashTablePtr hash, const xmlChar *key, void *payload, xmlHashDeallocator dealloc)
void xmlHashDefaultDeallocator(void *entry, const xmlChar *key ATTRIBUTE_UNUSED)
int xmlHashAddEntry2(xmlHashTablePtr hash, const xmlChar *key, const xmlChar *key2, void *payload)
XML_GLOBALS_PARSER XMLPUBFUN void xmlInitParser(void)
XML_HIDDEN void __xmlRaiseError(xmlStructuredErrorFunc schannel, xmlGenericErrorFunc channel, void *data, void *ctx, void *nod, int domain, int code, xmlErrorLevel level, const char *file, int line, const char *str1, const char *str2, const char *str3, int int1, int col, const char *msg,...) LIBXML_ATTR_FORMAT(16
XML_HIDDEN void xmlParserErrors const char const xmlChar const xmlChar * str2
#define COPY_BUF(b, i, v)
Character const *const prefix
XMLPUBFUN xmlAttrPtr xmlGetID(xmlDocPtr doc, const xmlChar *ID)
static const WCHAR lang[]
XMLPUBFUN void xmlResetError(xmlErrorPtr err)
@ XML_XPATH_EXPRESSION_OK
XMLPUBFUN int xmlUTF8Strloc(const xmlChar *utf, const xmlChar *utfchar)
XMLPUBFUN xmlChar * xmlStrndup(const xmlChar *cur, int len)
XMLPUBFUN int xmlUTF8Strlen(const xmlChar *utf)
XMLPUBFUN int xmlStrPrintf(xmlChar *buf, int len, const char *msg,...) LIBXML_ATTR_FORMAT(3
XMLPUBFUN int xmlStrlen(const xmlChar *str)
XMLPUBFUN xmlChar * xmlUTF8Strsub(const xmlChar *utf, int start, int len)
XMLPUBFUN const xmlChar * xmlUTF8Strpos(const xmlChar *utf, int pos)
XMLPUBFUN int xmlStrncmp(const xmlChar *str1, const xmlChar *str2, int len)
XMLPUBFUN const xmlChar * xmlStrstr(const xmlChar *str, const xmlChar *val)
XMLPUBFUN xmlChar * xmlStrcat(xmlChar *cur, const xmlChar *add)
XMLPUBFUN int xmlUTF8Strsize(const xmlChar *utf, int len)
XMLPUBFUN int xmlStrEqual(const xmlChar *str1, const xmlChar *str2)
XMLPUBFUN const xmlChar * xmlStrchr(const xmlChar *str, xmlChar val)
XMLPUBFUN xmlChar * xmlStrdup(const xmlChar *cur)
#define XML_IGNORE_FPTR_CAST_WARNINGS
#define XP_OPTIMIZED_NON_ELEM_COMPARISON
#define XPATH_MAX_STACK_DEPTH
#define XPATH_MAX_NODESET_LENGTH
#define XP_OPTIMIZED_FILTER_FIRST
#define XPATH_MAX_RECURSION_DEPTH