19#pragma convert("ISO8859-1")
39#ifdef LIBXML_XPTR_LOCS_ENABLED
42#ifdef LIBXML_DEBUG_ENABLED
48#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
104#define XPATH_MAX_STEPS 1000000
113#define XPATH_MAX_STACK_DEPTH 1000000
123#define XPATH_MAX_NODESET_LENGTH 10000000
130#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
131#define XPATH_MAX_RECURSION_DEPTH 500
133#define XPATH_MAX_RECURSION_DEPTH 5000
143#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
158 int misc = 0, precedence1 = 0, precedence2 = 0;
163 if ((node1 ==
NULL) || (node2 ==
NULL))
172 switch (node1->
type) {
177 (node1->
doc == node2->
doc))
186 goto turtle_comparison;
243 switch (node2->
type) {
289 if (node1 == node2) {
290 if (precedence1 == precedence2) {
295 cur = miscNode2->prev;
297 if (
cur == miscNode1)
310 if (precedence1 < precedence2)
325 if ((precedence2 == 3) && (precedence1 > 1)) {
333 if ((precedence1 == 3) && (precedence2 > 1)) {
350 (node1->
doc == node2->
doc)) {
362 if (node1 == node2->
prev)
364 if (node1 == node2->
next)
370 if (
cur->parent == node1)
376 if (
cur->parent == node2)
389 while (depth1 > depth2) {
393 while (depth2 > depth1) {
401 if ((node1 ==
NULL) || (node2 ==
NULL))
407 if (node1 == node2->
prev)
409 if (node1 == node2->
next)
418 (node1->
doc == node2->
doc)) {
439#define SORT_NAME libxml_domnode
440#define SORT_TYPE xmlNodePtr
453#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
462 int res = xmlXPathCmpNodes(
x,
y);
466#define SORT_CMP(x, y) (wrap_cmp(x, y))
470#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
478double xmlXPathNAN = 0.0;
479double xmlXPathPINF = 0.0;
480double xmlXPathNINF = 0.0;
493#if defined(NAN) && defined(INFINITY)
500 xmlXPathNAN = 0.0 /
zero;
501 xmlXPathPINF = 1.0 /
zero;
502 xmlXPathNINF = -xmlXPathPINF;
513xmlXPathIsNaN(
double val) {
528xmlXPathIsInf(
double val) {
532 if (
val >= xmlXPathPINF)
534 if (
val <= -xmlXPathPINF)
542#ifdef LIBXML_XPATH_ENABLED
548#ifdef DEBUG_XPATH_EXPRESSION
551#define DEBUG_EVAL_COUNTS
554static xmlNs xmlXPathXMLNamespaceStruct = {
562static xmlNsPtr xmlXPathXMLNamespace = &xmlXPathXMLNamespaceStruct;
563#ifndef LIBXML_THREAD_ENABLED
568static int xmlXPathDisableOptimizer = 0;
583#define XP_ERRORNULL(X) \
584 { xmlXPathErr(ctxt, X); return(NULL); }
589static const char*
const xmlXPathErrorMessages[] = {
592 "Unfinished literal\n",
593 "Start of literal\n",
594 "Expected $ for variable reference\n",
595 "Undefined variable\n",
596 "Invalid predicate\n",
597 "Invalid expression\n",
598 "Missing closing curly brace\n",
599 "Unregistered function\n",
602 "Invalid number of arguments\n",
603 "Invalid context size\n",
604 "Invalid context position\n",
605 "Memory allocation error\n",
608 "Sub resource error\n",
609 "Undefined namespace prefix\n",
611 "Char out of XML range\n",
612 "Invalid or incomplete context\n",
613 "Stack usage error\n",
614 "Forbidden variable\n",
615 "Operation limit exceeded\n",
616 "Recursion limit exceeded\n",
617 "?? Unknown error ??\n"
619#define MAXERRNO ((int)(sizeof(xmlXPathErrorMessages) / \
620 sizeof(xmlXPathErrorMessages[0])) - 1)
629xmlXPathErrMemory(xmlXPathContextPtr ctxt,
const char *
extra)
637 "Memory allocation failed : %s\n",
641 ctxt->lastError.message = (
char *)
646 if (ctxt->error !=
NULL)
647 ctxt->error(ctxt->userData, &ctxt->lastError);
654 "Memory allocation failed : %s\n",
extra);
660 "Memory allocation failed\n");
672xmlXPathPErrMemory(xmlXPathParserContextPtr ctxt,
const char *
extra)
677 ctxt->error = XPATH_MEMORY_ERROR;
678 xmlXPathErrMemory(ctxt->context,
extra);
690xmlXPathErr(xmlXPathParserContextPtr ctxt,
int error)
700 "%s", xmlXPathErrorMessages[
error]);
704 if (ctxt->context ==
NULL) {
709 (
const char *) ctxt->base,
NULL,
NULL,
710 ctxt->cur - ctxt->base, 0,
711 "%s", xmlXPathErrorMessages[
error]);
722 ctxt->context->lastError.str1 = (
char *)
xmlStrdup(ctxt->base);
723 ctxt->context->lastError.int1 = ctxt->cur - ctxt->base;
724 ctxt->context->lastError.node = ctxt->context->debugNode;
725 if (ctxt->context->error !=
NULL) {
726 ctxt->context->error(ctxt->context->userData,
727 &ctxt->context->lastError);
733 (
const char *) ctxt->base,
NULL,
NULL,
734 ctxt->cur - ctxt->base, 0,
735 "%s", xmlXPathErrorMessages[
error]);
752 xmlXPathErr(ctxt,
no);
764xmlXPathCheckOpLimit(xmlXPathParserContextPtr ctxt,
unsigned long opCount) {
765 xmlXPathContextPtr xpctxt = ctxt->context;
767 if ((opCount > xpctxt->opLimit) ||
768 (xpctxt->opCount > xpctxt->opLimit - opCount)) {
769 xpctxt->opCount = xpctxt->opLimit;
770 xmlXPathErr(ctxt, XPATH_OP_LIMIT_EXCEEDED);
774 xpctxt->opCount += opCount;
778#define OP_LIMIT_EXCEEDED(ctxt, n) \
779 ((ctxt->context->opLimit != 0) && (xmlXPathCheckOpLimit(ctxt, n) < 0))
792typedef struct _xmlPointerList xmlPointerList;
793typedef xmlPointerList *xmlPointerListPtr;
794struct _xmlPointerList {
804xmlPointerListAddSize(xmlPointerListPtr
list,
809 if (initialSize <= 0)
811 list->items = (
void **)
xmlMalloc(initialSize *
sizeof(
void *));
813 xmlXPathErrMemory(
NULL,
814 "xmlPointerListCreate: allocating item\n");
821 xmlXPathErrMemory(
NULL,
822 "xmlPointerListAddSize: re-allocating item\n");
829 xmlXPathErrMemory(
NULL,
830 "xmlPointerListAddSize: re-allocating item\n");
846static xmlPointerListPtr
847xmlPointerListCreate(
int initialSize)
849 xmlPointerListPtr
ret;
853 xmlXPathErrMemory(
NULL,
854 "xmlPointerListCreate: allocating item\n");
858 if (initialSize > 0) {
859 xmlPointerListAddSize(
ret,
NULL, initialSize);
872xmlPointerListFree(xmlPointerListPtr
list)
910#ifdef LIBXML_XPTR_LOCS_ENABLED
917 AXIS_ANCESTOR_OR_SELF,
921 AXIS_DESCENDANT_OR_SELF,
923 AXIS_FOLLOWING_SIBLING,
927 AXIS_PRECEDING_SIBLING,
947typedef struct _xmlXPathStepOp xmlXPathStepOp;
948typedef xmlXPathStepOp *xmlXPathStepOpPtr;
949struct _xmlXPathStepOp {
958 xmlXPathFunction
cache;
962struct _xmlXPathCompExpr {
965 xmlXPathStepOp *
steps;
969#ifdef DEBUG_EVAL_COUNTS
973#ifdef XPATH_STREAMING
984xmlXPathFreeValueTree(xmlNodeSetPtr
obj);
986xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
obj);
988xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt,
991xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt,
992 xmlXPathStepOpPtr
op,
1010static xmlXPathCompExprPtr
1011xmlXPathNewCompExpr(
void) {
1012 xmlXPathCompExprPtr
cur;
1014 cur = (xmlXPathCompExprPtr)
xmlMalloc(
sizeof(xmlXPathCompExpr));
1016 xmlXPathErrMemory(
NULL,
"allocating component\n");
1019 memset(
cur, 0,
sizeof(xmlXPathCompExpr));
1023 sizeof(xmlXPathStepOp));
1025 xmlXPathErrMemory(
NULL,
"allocating steps\n");
1029 memset(
cur->steps, 0,
cur->maxStep *
sizeof(xmlXPathStepOp));
1031#ifdef DEBUG_EVAL_COUNTS
1044xmlXPathFreeCompExpr(xmlXPathCompExprPtr comp)
1046 xmlXPathStepOpPtr
op;
1051 if (comp->dict ==
NULL) {
1052 for (
i = 0;
i < comp->nbStep;
i++) {
1053 op = &comp->steps[
i];
1054 if (
op->value4 !=
NULL) {
1055 if (
op->op == XPATH_OP_VALUE)
1056 xmlXPathFreeObject(
op->value4);
1064 for (
i = 0;
i < comp->nbStep;
i++) {
1065 op = &comp->steps[
i];
1066 if (
op->value4 !=
NULL) {
1067 if (
op->op == XPATH_OP_VALUE)
1068 xmlXPathFreeObject(
op->value4);
1073 if (comp->steps !=
NULL) {
1076#ifdef DEBUG_EVAL_COUNTS
1077 if (comp->string !=
NULL) {
1081#ifdef XPATH_STREAMING
1082 if (comp->stream !=
NULL) {
1083 xmlFreePatternList(comp->stream);
1086 if (comp->expr !=
NULL) {
1110xmlXPathCompExprAdd(xmlXPathParserContextPtr ctxt,
int ch1,
int ch2,
1112 int value2,
int value3,
void *value4,
void *value5) {
1113 xmlXPathCompExprPtr comp = ctxt->comp;
1114 if (comp->nbStep >= comp->maxStep) {
1115 xmlXPathStepOp *
real;
1118 xmlXPathPErrMemory(ctxt,
"adding step\n");
1123 comp->maxStep *
sizeof(xmlXPathStepOp));
1126 xmlXPathPErrMemory(ctxt,
"adding step\n");
1131 comp->last = comp->nbStep;
1132 comp->steps[comp->nbStep].ch1 = ch1;
1133 comp->steps[comp->nbStep].ch2 = ch2;
1134 comp->steps[comp->nbStep].op =
op;
1135 comp->steps[comp->nbStep].value =
value;
1136 comp->steps[comp->nbStep].value2 = value2;
1137 comp->steps[comp->nbStep].value3 = value3;
1138 if ((comp->dict !=
NULL) &&
1139 ((
op == XPATH_OP_FUNCTION) || (
op == XPATH_OP_VARIABLE) ||
1140 (
op == XPATH_OP_COLLECT))) {
1141 if (value4 !=
NULL) {
1142 comp->steps[comp->nbStep].value4 = (
xmlChar *)
1146 comp->steps[comp->nbStep].value4 =
NULL;
1147 if (value5 !=
NULL) {
1148 comp->steps[comp->nbStep].value5 = (
xmlChar *)
1152 comp->steps[comp->nbStep].value5 =
NULL;
1154 comp->steps[comp->nbStep].value4 = value4;
1155 comp->steps[comp->nbStep].value5 = value5;
1157 comp->steps[comp->nbStep].cache =
NULL;
1158 return(comp->nbStep++);
1169xmlXPathCompSwap(xmlXPathStepOpPtr
op) {
1172#ifndef LIBXML_THREAD_ENABLED
1178 if (xmlXPathDisableOptimizer)
1187#define PUSH_FULL_EXPR(op, op1, op2, val, val2, val3, val4, val5) \
1188 xmlXPathCompExprAdd(ctxt, (op1), (op2), \
1189 (op), (val), (val2), (val3), (val4), (val5))
1190#define PUSH_LONG_EXPR(op, val, val2, val3, val4, val5) \
1191 xmlXPathCompExprAdd(ctxt, ctxt->comp->last, -1, \
1192 (op), (val), (val2), (val3), (val4), (val5))
1194#define PUSH_LEAVE_EXPR(op, val, val2) \
1195xmlXPathCompExprAdd(ctxt, -1, -1, (op), (val), (val2), 0 ,NULL ,NULL)
1197#define PUSH_UNARY_EXPR(op, ch, val, val2) \
1198xmlXPathCompExprAdd(ctxt, (ch), -1, (op), (val), (val2), 0 ,NULL ,NULL)
1200#define PUSH_BINARY_EXPR(op, ch1, ch2, val, val2) \
1201xmlXPathCompExprAdd(ctxt, (ch1), (ch2), (op), \
1202 (val), (val2), 0 ,NULL ,NULL)
1212#define XP_HAS_CACHE(c) ((c != NULL) && ((c)->cache != NULL))
1214typedef struct _xmlXPathContextCache xmlXPathContextCache;
1215typedef xmlXPathContextCache *xmlXPathContextCachePtr;
1216struct _xmlXPathContextCache {
1217 xmlPointerListPtr nodesetObjs;
1218 xmlPointerListPtr stringObjs;
1219 xmlPointerListPtr booleanObjs;
1220 xmlPointerListPtr numberObjs;
1221 xmlPointerListPtr miscObjs;
1227#ifdef XP_DEBUG_OBJ_USAGE
1229 int dbgCachedNodeset;
1230 int dbgCachedString;
1232 int dbgCachedNumber;
1235 int dbgCachedLocset;
1237 int dbgCachedXSLTTree;
1238 int dbgCachedUndefined;
1242 int dbgReusedNodeset;
1243 int dbgReusedString;
1245 int dbgReusedNumber;
1248 int dbgReusedLocset;
1250 int dbgReusedXSLTTree;
1251 int dbgReusedUndefined;
1263 xmlGenericError(xmlGenericErrorContext, \
1264 "Internal error at %s:%d\n", \
1265 __FILE__, __LINE__);
1267#ifdef LIBXML_DEBUG_ENABLED
1273 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1278 fprintf(output,
"Node is NULL !\n");
1290 xmlDebugDumpOneNode(output,
cur,
depth);
1298 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1303 fprintf(output,
"Node is NULL !\n");
1311 xmlDebugDumpOneNode(output, tmp,
depth);
1316xmlXPathDebugDumpNodeSet(
FILE *output, xmlNodeSetPtr
cur,
int depth) {
1320 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1326 fprintf(output,
"NodeSet is NULL !\n");
1332 fprintf(output,
"Set contains %d nodes:\n",
cur->nodeNr);
1333 for (
i = 0;
i <
cur->nodeNr;
i++) {
1336 xmlXPathDebugDumpNode(output,
cur->nodeTab[
i],
depth + 1);
1342xmlXPathDebugDumpValueTree(
FILE *output, xmlNodeSetPtr
cur,
int depth) {
1346 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1352 fprintf(output,
"Value Tree is NULL !\n");
1359 xmlXPathDebugDumpNodeList(output,
cur->nodeTab[0]->children,
depth + 1);
1361#if defined(LIBXML_XPTR_LOCS_ENABLED)
1363xmlXPathDebugDumpLocationSet(
FILE *output, xmlLocationSetPtr
cur,
int depth) {
1367 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1373 fprintf(output,
"LocationSet is NULL !\n");
1378 for (
i = 0;
i <
cur->locNr;
i++) {
1381 xmlXPathDebugDumpObject(output,
cur->locTab[
i],
depth + 1);
1395xmlXPathDebugDumpObject(
FILE *output, xmlXPathObjectPtr
cur,
int depth) {
1399 if (output ==
NULL)
return;
1401 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1409 fprintf(output,
"Object is empty (NULL)\n");
1413 case XPATH_UNDEFINED:
1414 fprintf(output,
"Object is uninitialized\n");
1417 fprintf(output,
"Object is a Node Set :\n");
1418 xmlXPathDebugDumpNodeSet(output,
cur->nodesetval,
depth);
1420 case XPATH_XSLT_TREE:
1421 fprintf(output,
"Object is an XSLT value tree :\n");
1422 xmlXPathDebugDumpValueTree(output,
cur->nodesetval,
depth);
1425 fprintf(output,
"Object is a Boolean : ");
1427 else fprintf(output,
"false\n");
1430 switch (xmlXPathIsInf(
cur->floatval)) {
1432 fprintf(output,
"Object is a number : Infinity\n");
1435 fprintf(output,
"Object is a number : -Infinity\n");
1438 if (xmlXPathIsNaN(
cur->floatval)) {
1439 fprintf(output,
"Object is a number : NaN\n");
1440 }
else if (
cur->floatval == 0) {
1442 fprintf(output,
"Object is a number : 0\n");
1444 fprintf(output,
"Object is a number : %0g\n",
cur->floatval);
1449 fprintf(output,
"Object is a string : ");
1450 xmlDebugDumpString(output,
cur->stringval);
1453#ifdef LIBXML_XPTR_LOCS_ENABLED
1455 fprintf(output,
"Object is a point : index %d in node",
cur->index);
1461 ((
cur->user2 ==
cur->user) && (
cur->index ==
cur->index2))) {
1462 fprintf(output,
"Object is a collapsed range :\n");
1464 if (
cur->index >= 0)
1470 fprintf(output,
"Object is a range :\n");
1473 if (
cur->index >= 0)
1480 if (
cur->index2 >= 0)
1481 fprintf(output,
"index %d in ",
cur->index2);
1488 case XPATH_LOCATIONSET:
1489 fprintf(output,
"Object is a Location Set:\n");
1490 xmlXPathDebugDumpLocationSet(output,
1491 (xmlLocationSetPtr)
cur->user,
depth);
1495 fprintf(output,
"Object is user defined\n");
1501xmlXPathDebugDumpStepOp(
FILE *output, xmlXPathCompExprPtr comp,
1502 xmlXPathStepOpPtr
op,
int depth) {
1506 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1512 fprintf(output,
"Step is NULL\n");
1517 fprintf(output,
"END");
break;
1519 fprintf(output,
"AND");
break;
1522 case XPATH_OP_EQUAL:
1539 else if (
op->value == 1)
1541 else if (
op->value == 2)
1542 fprintf(output,
"PLUS unary -");
1543 else if (
op->value == 3)
1544 fprintf(output,
"PLUS unary - -");
1549 else if (
op->value == 1)
1554 case XPATH_OP_UNION:
1555 fprintf(output,
"UNION");
break;
1557 fprintf(output,
"ROOT");
break;
1559 fprintf(output,
"NODE");
break;
1561 fprintf(output,
"SORT");
break;
1562 case XPATH_OP_COLLECT: {
1563 xmlXPathAxisVal axis = (xmlXPathAxisVal)
op->value;
1564 xmlXPathTestVal
test = (xmlXPathTestVal)
op->value2;
1565 xmlXPathTypeVal
type = (xmlXPathTypeVal)
op->value3;
1572 fprintf(output,
" 'ancestors' ");
break;
1573 case AXIS_ANCESTOR_OR_SELF:
1574 fprintf(output,
" 'ancestors-or-self' ");
break;
1576 fprintf(output,
" 'attributes' ");
break;
1578 fprintf(output,
" 'child' ");
break;
1579 case AXIS_DESCENDANT:
1580 fprintf(output,
" 'descendant' ");
break;
1581 case AXIS_DESCENDANT_OR_SELF:
1582 fprintf(output,
" 'descendant-or-self' ");
break;
1583 case AXIS_FOLLOWING:
1584 fprintf(output,
" 'following' ");
break;
1585 case AXIS_FOLLOWING_SIBLING:
1586 fprintf(output,
" 'following-siblings' ");
break;
1587 case AXIS_NAMESPACE:
1588 fprintf(output,
" 'namespace' ");
break;
1590 fprintf(output,
" 'parent' ");
break;
1591 case AXIS_PRECEDING:
1592 fprintf(output,
" 'preceding' ");
break;
1593 case AXIS_PRECEDING_SIBLING:
1594 fprintf(output,
" 'preceding-sibling' ");
break;
1596 fprintf(output,
" 'self' ");
break;
1599 case NODE_TEST_NONE:
1600 fprintf(output,
"'none' ");
break;
1601 case NODE_TEST_TYPE:
1602 fprintf(output,
"'type' ");
break;
1604 fprintf(output,
"'PI' ");
break;
1606 fprintf(output,
"'all' ");
break;
1608 fprintf(output,
"'namespace' ");
break;
1609 case NODE_TEST_NAME:
1610 fprintf(output,
"'name' ");
break;
1613 case NODE_TYPE_NODE:
1614 fprintf(output,
"'node' ");
break;
1615 case NODE_TYPE_COMMENT:
1616 fprintf(output,
"'comment' ");
break;
1617 case NODE_TYPE_TEXT:
1618 fprintf(output,
"'text' ");
break;
1620 fprintf(output,
"'PI' ");
break;
1629 case XPATH_OP_VALUE: {
1630 xmlXPathObjectPtr
object = (xmlXPathObjectPtr)
op->value4;
1633 xmlXPathDebugDumpObject(output,
object, 0);
1636 case XPATH_OP_VARIABLE: {
1646 case XPATH_OP_FUNCTION: {
1647 int nbargs =
op->value;
1652 fprintf(output,
"FUNCTION %s:%s(%d args)",
1655 fprintf(output,
"FUNCTION %s(%d args)",
name, nbargs);
1658 case XPATH_OP_ARG:
fprintf(output,
"ARG");
break;
1659 case XPATH_OP_PREDICATE:
fprintf(output,
"PREDICATE");
break;
1660 case XPATH_OP_FILTER:
fprintf(output,
"FILTER");
break;
1661#ifdef LIBXML_XPTR_LOCS_ENABLED
1662 case XPATH_OP_RANGETO:
fprintf(output,
"RANGETO");
break;
1665 fprintf(output,
"UNKNOWN %d\n",
op->op);
return;
1670 xmlXPathDebugDumpStepOp(output, comp, &comp->steps[
op->ch1],
depth + 1);
1672 xmlXPathDebugDumpStepOp(output, comp, &comp->steps[
op->ch2],
depth + 1);
1684xmlXPathDebugDumpCompExpr(
FILE *output, xmlXPathCompExprPtr comp,
1689 if ((output ==
NULL) || (comp ==
NULL))
return;
1691 for (
i = 0;((
i <
depth) && (
i < 25));
i++)
1697#ifdef XPATH_STREAMING
1699 fprintf(output,
"Streaming Expression\n");
1703 fprintf(output,
"Compiled Expression : %d elements\n",
1706 xmlXPathDebugDumpStepOp(output, comp, &comp->steps[
i],
depth + 1);
1710#ifdef XP_DEBUG_OBJ_USAGE
1715static int xmlXPathDebugObjCounterUndefined = 0;
1716static int xmlXPathDebugObjCounterNodeset = 0;
1717static int xmlXPathDebugObjCounterBool = 0;
1718static int xmlXPathDebugObjCounterNumber = 0;
1719static int xmlXPathDebugObjCounterString = 0;
1720static int xmlXPathDebugObjCounterPoint = 0;
1721static int xmlXPathDebugObjCounterRange = 0;
1722static int xmlXPathDebugObjCounterLocset = 0;
1723static int xmlXPathDebugObjCounterUsers = 0;
1724static int xmlXPathDebugObjCounterXSLTTree = 0;
1725static int xmlXPathDebugObjCounterAll = 0;
1727static int xmlXPathDebugObjTotalUndefined = 0;
1728static int xmlXPathDebugObjTotalNodeset = 0;
1729static int xmlXPathDebugObjTotalBool = 0;
1730static int xmlXPathDebugObjTotalNumber = 0;
1731static int xmlXPathDebugObjTotalString = 0;
1732static int xmlXPathDebugObjTotalPoint = 0;
1733static int xmlXPathDebugObjTotalRange = 0;
1734static int xmlXPathDebugObjTotalLocset = 0;
1735static int xmlXPathDebugObjTotalUsers = 0;
1736static int xmlXPathDebugObjTotalXSLTTree = 0;
1737static int xmlXPathDebugObjTotalAll = 0;
1739static int xmlXPathDebugObjMaxUndefined = 0;
1740static int xmlXPathDebugObjMaxNodeset = 0;
1741static int xmlXPathDebugObjMaxBool = 0;
1742static int xmlXPathDebugObjMaxNumber = 0;
1743static int xmlXPathDebugObjMaxString = 0;
1744static int xmlXPathDebugObjMaxPoint = 0;
1745static int xmlXPathDebugObjMaxRange = 0;
1746static int xmlXPathDebugObjMaxLocset = 0;
1747static int xmlXPathDebugObjMaxUsers = 0;
1748static int xmlXPathDebugObjMaxXSLTTree = 0;
1749static int xmlXPathDebugObjMaxAll = 0;
1752xmlXPathDebugObjUsageReset(xmlXPathContextPtr ctxt)
1755 if (ctxt->cache !=
NULL) {
1756 xmlXPathContextCachePtr
cache =
1757 (xmlXPathContextCachePtr) ctxt->cache;
1759 cache->dbgCachedAll = 0;
1760 cache->dbgCachedNodeset = 0;
1761 cache->dbgCachedString = 0;
1762 cache->dbgCachedBool = 0;
1763 cache->dbgCachedNumber = 0;
1764 cache->dbgCachedPoint = 0;
1765 cache->dbgCachedRange = 0;
1766 cache->dbgCachedLocset = 0;
1767 cache->dbgCachedUsers = 0;
1768 cache->dbgCachedXSLTTree = 0;
1769 cache->dbgCachedUndefined = 0;
1771 cache->dbgReusedAll = 0;
1772 cache->dbgReusedNodeset = 0;
1773 cache->dbgReusedString = 0;
1774 cache->dbgReusedBool = 0;
1775 cache->dbgReusedNumber = 0;
1776 cache->dbgReusedPoint = 0;
1777 cache->dbgReusedRange = 0;
1778 cache->dbgReusedLocset = 0;
1779 cache->dbgReusedUsers = 0;
1780 cache->dbgReusedXSLTTree = 0;
1781 cache->dbgReusedUndefined = 0;
1785 xmlXPathDebugObjCounterUndefined = 0;
1786 xmlXPathDebugObjCounterNodeset = 0;
1787 xmlXPathDebugObjCounterBool = 0;
1788 xmlXPathDebugObjCounterNumber = 0;
1789 xmlXPathDebugObjCounterString = 0;
1790 xmlXPathDebugObjCounterPoint = 0;
1791 xmlXPathDebugObjCounterRange = 0;
1792 xmlXPathDebugObjCounterLocset = 0;
1793 xmlXPathDebugObjCounterUsers = 0;
1794 xmlXPathDebugObjCounterXSLTTree = 0;
1795 xmlXPathDebugObjCounterAll = 0;
1797 xmlXPathDebugObjTotalUndefined = 0;
1798 xmlXPathDebugObjTotalNodeset = 0;
1799 xmlXPathDebugObjTotalBool = 0;
1800 xmlXPathDebugObjTotalNumber = 0;
1801 xmlXPathDebugObjTotalString = 0;
1802 xmlXPathDebugObjTotalPoint = 0;
1803 xmlXPathDebugObjTotalRange = 0;
1804 xmlXPathDebugObjTotalLocset = 0;
1805 xmlXPathDebugObjTotalUsers = 0;
1806 xmlXPathDebugObjTotalXSLTTree = 0;
1807 xmlXPathDebugObjTotalAll = 0;
1809 xmlXPathDebugObjMaxUndefined = 0;
1810 xmlXPathDebugObjMaxNodeset = 0;
1811 xmlXPathDebugObjMaxBool = 0;
1812 xmlXPathDebugObjMaxNumber = 0;
1813 xmlXPathDebugObjMaxString = 0;
1814 xmlXPathDebugObjMaxPoint = 0;
1815 xmlXPathDebugObjMaxRange = 0;
1816 xmlXPathDebugObjMaxLocset = 0;
1817 xmlXPathDebugObjMaxUsers = 0;
1818 xmlXPathDebugObjMaxXSLTTree = 0;
1819 xmlXPathDebugObjMaxAll = 0;
1824xmlXPathDebugObjUsageRequested(xmlXPathContextPtr ctxt,
1825 xmlXPathObjectType objType)
1830 if (ctxt->cache !=
NULL) {
1831 xmlXPathContextCachePtr
cache =
1832 (xmlXPathContextCachePtr) ctxt->cache;
1836 cache->dbgReusedAll++;
1838 case XPATH_UNDEFINED:
1839 cache->dbgReusedUndefined++;
1842 cache->dbgReusedNodeset++;
1845 cache->dbgReusedBool++;
1848 cache->dbgReusedNumber++;
1851 cache->dbgReusedString++;
1853#ifdef LIBXML_XPTR_LOCS_ENABLED
1855 cache->dbgReusedPoint++;
1858 cache->dbgReusedRange++;
1860 case XPATH_LOCATIONSET:
1861 cache->dbgReusedLocset++;
1865 cache->dbgReusedUsers++;
1867 case XPATH_XSLT_TREE:
1868 cache->dbgReusedXSLTTree++;
1877 case XPATH_UNDEFINED:
1879 xmlXPathDebugObjTotalUndefined++;
1880 xmlXPathDebugObjCounterUndefined++;
1881 if (xmlXPathDebugObjCounterUndefined >
1882 xmlXPathDebugObjMaxUndefined)
1883 xmlXPathDebugObjMaxUndefined =
1884 xmlXPathDebugObjCounterUndefined;
1888 xmlXPathDebugObjTotalNodeset++;
1889 xmlXPathDebugObjCounterNodeset++;
1890 if (xmlXPathDebugObjCounterNodeset >
1891 xmlXPathDebugObjMaxNodeset)
1892 xmlXPathDebugObjMaxNodeset =
1893 xmlXPathDebugObjCounterNodeset;
1897 xmlXPathDebugObjTotalBool++;
1898 xmlXPathDebugObjCounterBool++;
1899 if (xmlXPathDebugObjCounterBool >
1900 xmlXPathDebugObjMaxBool)
1901 xmlXPathDebugObjMaxBool =
1902 xmlXPathDebugObjCounterBool;
1906 xmlXPathDebugObjTotalNumber++;
1907 xmlXPathDebugObjCounterNumber++;
1908 if (xmlXPathDebugObjCounterNumber >
1909 xmlXPathDebugObjMaxNumber)
1910 xmlXPathDebugObjMaxNumber =
1911 xmlXPathDebugObjCounterNumber;
1915 xmlXPathDebugObjTotalString++;
1916 xmlXPathDebugObjCounterString++;
1917 if (xmlXPathDebugObjCounterString >
1918 xmlXPathDebugObjMaxString)
1919 xmlXPathDebugObjMaxString =
1920 xmlXPathDebugObjCounterString;
1922#ifdef LIBXML_XPTR_LOCS_ENABLED
1925 xmlXPathDebugObjTotalPoint++;
1926 xmlXPathDebugObjCounterPoint++;
1927 if (xmlXPathDebugObjCounterPoint >
1928 xmlXPathDebugObjMaxPoint)
1929 xmlXPathDebugObjMaxPoint =
1930 xmlXPathDebugObjCounterPoint;
1934 xmlXPathDebugObjTotalRange++;
1935 xmlXPathDebugObjCounterRange++;
1936 if (xmlXPathDebugObjCounterRange >
1937 xmlXPathDebugObjMaxRange)
1938 xmlXPathDebugObjMaxRange =
1939 xmlXPathDebugObjCounterRange;
1941 case XPATH_LOCATIONSET:
1943 xmlXPathDebugObjTotalLocset++;
1944 xmlXPathDebugObjCounterLocset++;
1945 if (xmlXPathDebugObjCounterLocset >
1946 xmlXPathDebugObjMaxLocset)
1947 xmlXPathDebugObjMaxLocset =
1948 xmlXPathDebugObjCounterLocset;
1953 xmlXPathDebugObjTotalUsers++;
1954 xmlXPathDebugObjCounterUsers++;
1955 if (xmlXPathDebugObjCounterUsers >
1956 xmlXPathDebugObjMaxUsers)
1957 xmlXPathDebugObjMaxUsers =
1958 xmlXPathDebugObjCounterUsers;
1960 case XPATH_XSLT_TREE:
1962 xmlXPathDebugObjTotalXSLTTree++;
1963 xmlXPathDebugObjCounterXSLTTree++;
1964 if (xmlXPathDebugObjCounterXSLTTree >
1965 xmlXPathDebugObjMaxXSLTTree)
1966 xmlXPathDebugObjMaxXSLTTree =
1967 xmlXPathDebugObjCounterXSLTTree;
1973 xmlXPathDebugObjTotalAll++;
1974 xmlXPathDebugObjCounterAll++;
1975 if (xmlXPathDebugObjCounterAll >
1976 xmlXPathDebugObjMaxAll)
1977 xmlXPathDebugObjMaxAll =
1978 xmlXPathDebugObjCounterAll;
1982xmlXPathDebugObjUsageReleased(xmlXPathContextPtr ctxt,
1983 xmlXPathObjectType objType)
1988 if (ctxt->cache !=
NULL) {
1989 xmlXPathContextCachePtr
cache =
1990 (xmlXPathContextCachePtr) ctxt->cache;
1994 cache->dbgCachedAll++;
1996 case XPATH_UNDEFINED:
1997 cache->dbgCachedUndefined++;
2000 cache->dbgCachedNodeset++;
2003 cache->dbgCachedBool++;
2006 cache->dbgCachedNumber++;
2009 cache->dbgCachedString++;
2011#ifdef LIBXML_XPTR_LOCS_ENABLED
2013 cache->dbgCachedPoint++;
2016 cache->dbgCachedRange++;
2018 case XPATH_LOCATIONSET:
2019 cache->dbgCachedLocset++;
2023 cache->dbgCachedUsers++;
2025 case XPATH_XSLT_TREE:
2026 cache->dbgCachedXSLTTree++;
2035 case XPATH_UNDEFINED:
2036 xmlXPathDebugObjCounterUndefined--;
2039 xmlXPathDebugObjCounterNodeset--;
2042 xmlXPathDebugObjCounterBool--;
2045 xmlXPathDebugObjCounterNumber--;
2048 xmlXPathDebugObjCounterString--;
2050#ifdef LIBXML_XPTR_LOCS_ENABLED
2052 xmlXPathDebugObjCounterPoint--;
2055 xmlXPathDebugObjCounterRange--;
2057 case XPATH_LOCATIONSET:
2058 xmlXPathDebugObjCounterLocset--;
2062 xmlXPathDebugObjCounterUsers--;
2064 case XPATH_XSLT_TREE:
2065 xmlXPathDebugObjCounterXSLTTree--;
2070 xmlXPathDebugObjCounterAll--;
2074xmlXPathDebugObjUsageDisplay(xmlXPathContextPtr ctxt)
2076 int reqAll, reqNodeset, reqString, reqBool, reqNumber,
2077 reqXSLTTree, reqUndefined;
2078 int caAll = 0, caNodeset = 0, caString = 0, caBool = 0,
2079 caNumber = 0, caXSLTTree = 0, caUndefined = 0;
2080 int reAll = 0, reNodeset = 0, reString = 0, reBool = 0,
2081 reNumber = 0, reXSLTTree = 0, reUndefined = 0;
2082 int leftObjs = xmlXPathDebugObjCounterAll;
2084 reqAll = xmlXPathDebugObjTotalAll;
2085 reqNodeset = xmlXPathDebugObjTotalNodeset;
2086 reqString = xmlXPathDebugObjTotalString;
2087 reqBool = xmlXPathDebugObjTotalBool;
2088 reqNumber = xmlXPathDebugObjTotalNumber;
2089 reqXSLTTree = xmlXPathDebugObjTotalXSLTTree;
2090 reqUndefined = xmlXPathDebugObjTotalUndefined;
2092 printf(
"# XPath object usage:\n");
2095 if (ctxt->cache !=
NULL) {
2096 xmlXPathContextCachePtr
cache =
2097 (xmlXPathContextCachePtr) ctxt->cache;
2099 reAll =
cache->dbgReusedAll;
2101 reNodeset =
cache->dbgReusedNodeset;
2102 reqNodeset += reNodeset;
2103 reString =
cache->dbgReusedString;
2104 reqString += reString;
2105 reBool =
cache->dbgReusedBool;
2107 reNumber =
cache->dbgReusedNumber;
2108 reqNumber += reNumber;
2109 reXSLTTree =
cache->dbgReusedXSLTTree;
2110 reqXSLTTree += reXSLTTree;
2111 reUndefined =
cache->dbgReusedUndefined;
2112 reqUndefined += reUndefined;
2114 caAll =
cache->dbgCachedAll;
2115 caBool =
cache->dbgCachedBool;
2116 caNodeset =
cache->dbgCachedNodeset;
2117 caString =
cache->dbgCachedString;
2118 caNumber =
cache->dbgCachedNumber;
2119 caXSLTTree =
cache->dbgCachedXSLTTree;
2120 caUndefined =
cache->dbgCachedUndefined;
2123 leftObjs -=
cache->nodesetObjs->number;
2124 if (
cache->stringObjs)
2125 leftObjs -=
cache->stringObjs->number;
2126 if (
cache->booleanObjs)
2127 leftObjs -=
cache->booleanObjs->number;
2128 if (
cache->numberObjs)
2129 leftObjs -=
cache->numberObjs->number;
2130 if (
cache->miscObjs)
2131 leftObjs -=
cache->miscObjs->number;
2136 printf(
"# total : %d\n", reqAll);
2137 printf(
"# left : %d\n", leftObjs);
2138 printf(
"# created: %d\n", xmlXPathDebugObjTotalAll);
2139 printf(
"# reused : %d\n", reAll);
2140 printf(
"# max : %d\n", xmlXPathDebugObjMaxAll);
2143 printf(
"# total : %d\n", reqNodeset);
2144 printf(
"# created: %d\n", xmlXPathDebugObjTotalNodeset);
2145 printf(
"# reused : %d\n", reNodeset);
2146 printf(
"# max : %d\n", xmlXPathDebugObjMaxNodeset);
2149 printf(
"# total : %d\n", reqString);
2150 printf(
"# created: %d\n", xmlXPathDebugObjTotalString);
2151 printf(
"# reused : %d\n", reString);
2152 printf(
"# max : %d\n", xmlXPathDebugObjMaxString);
2155 printf(
"# total : %d\n", reqBool);
2156 printf(
"# created: %d\n", xmlXPathDebugObjTotalBool);
2157 printf(
"# reused : %d\n", reBool);
2158 printf(
"# max : %d\n", xmlXPathDebugObjMaxBool);
2161 printf(
"# total : %d\n", reqNumber);
2162 printf(
"# created: %d\n", xmlXPathDebugObjTotalNumber);
2163 printf(
"# reused : %d\n", reNumber);
2164 printf(
"# max : %d\n", xmlXPathDebugObjMaxNumber);
2166 printf(
"# XSLT result tree fragments\n");
2167 printf(
"# total : %d\n", reqXSLTTree);
2168 printf(
"# created: %d\n", xmlXPathDebugObjTotalXSLTTree);
2169 printf(
"# reused : %d\n", reXSLTTree);
2170 printf(
"# max : %d\n", xmlXPathDebugObjMaxXSLTTree);
2173 printf(
"# total : %d\n", reqUndefined);
2174 printf(
"# created: %d\n", xmlXPathDebugObjTotalUndefined);
2175 printf(
"# reused : %d\n", reUndefined);
2176 printf(
"# max : %d\n", xmlXPathDebugObjMaxUndefined);
2197static xmlXPathContextCachePtr
2198xmlXPathNewCache(
void)
2200 xmlXPathContextCachePtr
ret;
2202 ret = (xmlXPathContextCachePtr)
xmlMalloc(
sizeof(xmlXPathContextCache));
2204 xmlXPathErrMemory(
NULL,
"creating object cache\n");
2207 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathContextCache));
2208 ret->maxNodeset = 100;
2209 ret->maxString = 100;
2210 ret->maxBoolean = 100;
2211 ret->maxNumber = 100;
2217xmlXPathCacheFreeObjectList(xmlPointerListPtr
list)
2220 xmlXPathObjectPtr
obj;
2225 for (
i = 0;
i <
list->number;
i++) {
2231 if (
obj->nodesetval !=
NULL) {
2232 if (
obj->nodesetval->nodeTab !=
NULL)
2237#ifdef XP_DEBUG_OBJ_USAGE
2238 xmlXPathDebugObjCounterAll--;
2241 xmlPointerListFree(
list);
2245xmlXPathFreeCache(xmlXPathContextCachePtr
cache)
2249 if (
cache->nodesetObjs)
2250 xmlXPathCacheFreeObjectList(
cache->nodesetObjs);
2251 if (
cache->stringObjs)
2252 xmlXPathCacheFreeObjectList(
cache->stringObjs);
2253 if (
cache->booleanObjs)
2254 xmlXPathCacheFreeObjectList(
cache->booleanObjs);
2255 if (
cache->numberObjs)
2256 xmlXPathCacheFreeObjectList(
cache->numberObjs);
2257 if (
cache->miscObjs)
2258 xmlXPathCacheFreeObjectList(
cache->miscObjs);
2285xmlXPathContextSetCache(xmlXPathContextPtr ctxt,
2293 xmlXPathContextCachePtr
cache;
2295 if (ctxt->cache ==
NULL) {
2296 ctxt->cache = xmlXPathNewCache();
2297 if (ctxt->cache ==
NULL)
2300 cache = (xmlXPathContextCachePtr) ctxt->cache;
2310 }
else if (ctxt->cache !=
NULL) {
2311 xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache);
2327static xmlXPathObjectPtr
2328xmlXPathCacheWrapNodeSet(xmlXPathContextPtr ctxt, xmlNodeSetPtr
val)
2330 if ((ctxt !=
NULL) && (ctxt->cache !=
NULL)) {
2331 xmlXPathContextCachePtr
cache =
2332 (xmlXPathContextCachePtr) ctxt->cache;
2335 (
cache->miscObjs->number != 0))
2337 xmlXPathObjectPtr
ret;
2339 ret = (xmlXPathObjectPtr)
2340 cache->miscObjs->items[--
cache->miscObjs->number];
2341 ret->type = XPATH_NODESET;
2343#ifdef XP_DEBUG_OBJ_USAGE
2344 xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
2350 return(xmlXPathWrapNodeSet(
val));
2364static xmlXPathObjectPtr
2365xmlXPathCacheWrapString(xmlXPathContextPtr ctxt,
xmlChar *
val)
2367 if ((ctxt !=
NULL) && (ctxt->cache !=
NULL)) {
2368 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
2371 (
cache->stringObjs->number != 0))
2374 xmlXPathObjectPtr
ret;
2376 ret = (xmlXPathObjectPtr)
2377 cache->stringObjs->items[--
cache->stringObjs->number];
2378 ret->type = XPATH_STRING;
2380#ifdef XP_DEBUG_OBJ_USAGE
2381 xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2385 (
cache->miscObjs->number != 0))
2387 xmlXPathObjectPtr
ret;
2391 ret = (xmlXPathObjectPtr)
2392 cache->miscObjs->items[--
cache->miscObjs->number];
2394 ret->type = XPATH_STRING;
2396#ifdef XP_DEBUG_OBJ_USAGE
2397 xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2402 return(xmlXPathWrapString(
val));
2416static xmlXPathObjectPtr
2417xmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt,
xmlNodePtr val)
2419 if ((ctxt !=
NULL) && (ctxt->cache)) {
2420 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
2423 (
cache->nodesetObjs->number != 0))
2425 xmlXPathObjectPtr
ret;
2429 ret = (xmlXPathObjectPtr)
2430 cache->nodesetObjs->items[--
cache->nodesetObjs->number];
2431 ret->type = XPATH_NODESET;
2434 if ((
ret->nodesetval->nodeMax == 0) ||
2438 xmlXPathNodeSetAddUnique(
ret->nodesetval,
val);
2440 ret->nodesetval->nodeTab[0] =
val;
2441 ret->nodesetval->nodeNr = 1;
2444#ifdef XP_DEBUG_OBJ_USAGE
2445 xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
2449 (
cache->miscObjs->number != 0))
2451 xmlXPathObjectPtr
ret;
2456 ret = (xmlXPathObjectPtr)
2457 cache->miscObjs->items[--
cache->miscObjs->number];
2459 ret->type = XPATH_NODESET;
2461 ret->nodesetval = xmlXPathNodeSetCreate(
val);
2462 if (
ret->nodesetval ==
NULL) {
2467#ifdef XP_DEBUG_OBJ_USAGE
2468 xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
2473 return(xmlXPathNewNodeSet(
val));
2486static xmlXPathObjectPtr
2487xmlXPathCacheNewCString(xmlXPathContextPtr ctxt,
const char *
val)
2489 if ((ctxt !=
NULL) && (ctxt->cache)) {
2490 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
2493 (
cache->stringObjs->number != 0))
2495 xmlXPathObjectPtr
ret;
2497 ret = (xmlXPathObjectPtr)
2498 cache->stringObjs->items[--
cache->stringObjs->number];
2500 ret->type = XPATH_STRING;
2502#ifdef XP_DEBUG_OBJ_USAGE
2503 xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2507 (
cache->miscObjs->number != 0))
2509 xmlXPathObjectPtr
ret;
2511 ret = (xmlXPathObjectPtr)
2512 cache->miscObjs->items[--
cache->miscObjs->number];
2514 ret->type = XPATH_STRING;
2516#ifdef XP_DEBUG_OBJ_USAGE
2517 xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2522 return(xmlXPathNewCString(
val));
2535static xmlXPathObjectPtr
2536xmlXPathCacheNewString(xmlXPathContextPtr ctxt,
const xmlChar *
val)
2538 if ((ctxt !=
NULL) && (ctxt->cache)) {
2539 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
2542 (
cache->stringObjs->number != 0))
2544 xmlXPathObjectPtr
ret;
2546 ret = (xmlXPathObjectPtr)
2547 cache->stringObjs->items[--
cache->stringObjs->number];
2548 ret->type = XPATH_STRING;
2553#ifdef XP_DEBUG_OBJ_USAGE
2554 xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2558 (
cache->miscObjs->number != 0))
2560 xmlXPathObjectPtr
ret;
2562 ret = (xmlXPathObjectPtr)
2563 cache->miscObjs->items[--
cache->miscObjs->number];
2565 ret->type = XPATH_STRING;
2570#ifdef XP_DEBUG_OBJ_USAGE
2571 xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
2576 return(xmlXPathNewString(
val));
2589static xmlXPathObjectPtr
2590xmlXPathCacheNewBoolean(xmlXPathContextPtr ctxt,
int val)
2592 if ((ctxt !=
NULL) && (ctxt->cache)) {
2593 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
2596 (
cache->booleanObjs->number != 0))
2598 xmlXPathObjectPtr
ret;
2600 ret = (xmlXPathObjectPtr)
2601 cache->booleanObjs->items[--
cache->booleanObjs->number];
2602 ret->type = XPATH_BOOLEAN;
2603 ret->boolval = (
val != 0);
2604#ifdef XP_DEBUG_OBJ_USAGE
2605 xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN);
2609 (
cache->miscObjs->number != 0))
2611 xmlXPathObjectPtr
ret;
2613 ret = (xmlXPathObjectPtr)
2614 cache->miscObjs->items[--
cache->miscObjs->number];
2616 ret->type = XPATH_BOOLEAN;
2617 ret->boolval = (
val != 0);
2618#ifdef XP_DEBUG_OBJ_USAGE
2619 xmlXPathDebugObjUsageRequested(ctxt, XPATH_BOOLEAN);
2624 return(xmlXPathNewBoolean(
val));
2637static xmlXPathObjectPtr
2638xmlXPathCacheNewFloat(xmlXPathContextPtr ctxt,
double val)
2640 if ((ctxt !=
NULL) && (ctxt->cache)) {
2641 xmlXPathContextCachePtr
cache = (xmlXPathContextCachePtr) ctxt->cache;
2644 (
cache->numberObjs->number != 0))
2646 xmlXPathObjectPtr
ret;
2648 ret = (xmlXPathObjectPtr)
2649 cache->numberObjs->items[--
cache->numberObjs->number];
2650 ret->type = XPATH_NUMBER;
2652#ifdef XP_DEBUG_OBJ_USAGE
2653 xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER);
2657 (
cache->miscObjs->number != 0))
2659 xmlXPathObjectPtr
ret;
2661 ret = (xmlXPathObjectPtr)
2662 cache->miscObjs->items[--
cache->miscObjs->number];
2664 ret->type = XPATH_NUMBER;
2666#ifdef XP_DEBUG_OBJ_USAGE
2667 xmlXPathDebugObjUsageRequested(ctxt, XPATH_NUMBER);
2672 return(xmlXPathNewFloat(
val));
2687static xmlXPathObjectPtr
2688xmlXPathCacheConvertString(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
val) {
2692 return(xmlXPathCacheNewCString(ctxt,
""));
2694 switch (
val->type) {
2695 case XPATH_UNDEFINED:
2701 case XPATH_XSLT_TREE:
2702 res = xmlXPathCastNodeSetToString(
val->nodesetval);
2707 res = xmlXPathCastBooleanToString(
val->boolval);
2710 res = xmlXPathCastNumberToString(
val->floatval);
2713#ifdef LIBXML_XPTR_LOCS_ENABLED
2716 case XPATH_LOCATIONSET:
2721 xmlXPathReleaseObject(ctxt,
val);
2723 return(xmlXPathCacheNewCString(ctxt,
""));
2724 return(xmlXPathCacheWrapString(ctxt,
res));
2737static xmlXPathObjectPtr
2738xmlXPathCacheObjectCopy(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
val)
2743 if (XP_HAS_CACHE(ctxt)) {
2744 switch (
val->type) {
2746 return(xmlXPathCacheWrapNodeSet(ctxt,
2747 xmlXPathNodeSetMerge(
NULL,
val->nodesetval)));
2749 return(xmlXPathCacheNewString(ctxt,
val->stringval));
2751 return(xmlXPathCacheNewBoolean(ctxt,
val->boolval));
2753 return(xmlXPathCacheNewFloat(ctxt,
val->floatval));
2758 return(xmlXPathObjectCopy(
val));
2772static xmlXPathObjectPtr
2773xmlXPathCacheConvertBoolean(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
val) {
2774 xmlXPathObjectPtr
ret;
2777 return(xmlXPathCacheNewBoolean(ctxt, 0));
2778 if (
val->type == XPATH_BOOLEAN)
2780 ret = xmlXPathCacheNewBoolean(ctxt, xmlXPathCastToBoolean(
val));
2781 xmlXPathReleaseObject(ctxt,
val);
2796static xmlXPathObjectPtr
2797xmlXPathCacheConvertNumber(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
val) {
2798 xmlXPathObjectPtr
ret;
2801 return(xmlXPathCacheNewFloat(ctxt, 0.0));
2802 if (
val->type == XPATH_NUMBER)
2804 ret = xmlXPathCacheNewFloat(ctxt, xmlXPathCastToNumber(
val));
2805 xmlXPathReleaseObject(ctxt,
val);
2824xmlXPathSetFrame(xmlXPathParserContextPtr ctxt) {
2829 ret = ctxt->valueFrame;
2830 ctxt->valueFrame = ctxt->valueNr;
2842xmlXPathPopFrame(xmlXPathParserContextPtr ctxt,
int frame) {
2845 if (ctxt->valueNr < ctxt->valueFrame) {
2846 xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR);
2848 ctxt->valueFrame = frame;
2860valuePop(xmlXPathParserContextPtr ctxt)
2862 xmlXPathObjectPtr
ret;
2864 if ((ctxt ==
NULL) || (ctxt->valueNr <= 0))
2867 if (ctxt->valueNr <= ctxt->valueFrame) {
2868 xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR);
2873 if (ctxt->valueNr > 0)
2874 ctxt->value = ctxt->valueTab[ctxt->valueNr - 1];
2877 ret = ctxt->valueTab[ctxt->valueNr];
2878 ctxt->valueTab[ctxt->valueNr] =
NULL;
2892valuePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr
value)
2894 if (ctxt ==
NULL)
return(-1);
2900 ctxt->error = XPATH_MEMORY_ERROR;
2903 if (ctxt->valueNr >= ctxt->valueMax) {
2904 xmlXPathObjectPtr *tmp;
2907 xmlXPathPErrMemory(ctxt,
"XPath stack depth limit reached\n");
2910 tmp = (xmlXPathObjectPtr *)
xmlRealloc(ctxt->valueTab,
2911 2 * ctxt->valueMax *
2912 sizeof(ctxt->valueTab[0]));
2914 xmlXPathPErrMemory(ctxt,
"pushing value\n");
2917 ctxt->valueMax *= 2;
2918 ctxt->valueTab = tmp;
2920 ctxt->valueTab[ctxt->valueNr] =
value;
2921 ctxt->value =
value;
2922 return (ctxt->valueNr++);
2935xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt) {
2936 xmlXPathObjectPtr
obj;
2939 obj = valuePop(ctxt);
2941 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2944 if (
obj->type != XPATH_BOOLEAN)
2945 ret = xmlXPathCastToBoolean(
obj);
2948 xmlXPathReleaseObject(ctxt->context,
obj);
2962xmlXPathPopNumber (xmlXPathParserContextPtr ctxt) {
2963 xmlXPathObjectPtr
obj;
2966 obj = valuePop(ctxt);
2968 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2971 if (
obj->type != XPATH_NUMBER)
2972 ret = xmlXPathCastToNumber(
obj);
2975 xmlXPathReleaseObject(ctxt->context,
obj);
2989xmlXPathPopString (xmlXPathParserContextPtr ctxt) {
2990 xmlXPathObjectPtr
obj;
2993 obj = valuePop(ctxt);
2995 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
2998 ret = xmlXPathCastToString(
obj);
3000 if (
obj->stringval ==
ret)
3002 xmlXPathReleaseObject(ctxt->context,
obj);
3016xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt) {
3017 xmlXPathObjectPtr
obj;
3021 if (ctxt->value ==
NULL) {
3022 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
3025 if (!xmlXPathStackIsNodeSet(ctxt)) {
3026 xmlXPathSetTypeError(ctxt);
3029 obj = valuePop(ctxt);
3037 xmlXPathReleaseObject(ctxt->context,
obj);
3051xmlXPathPopExternal (xmlXPathParserContextPtr ctxt) {
3052 xmlXPathObjectPtr
obj;
3055 if ((ctxt ==
NULL) || (ctxt->value ==
NULL)) {
3056 xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
3059 if (ctxt->value->type != XPATH_USERS) {
3060 xmlXPathSetTypeError(ctxt);
3063 obj = valuePop(ctxt);
3066 xmlXPathReleaseObject(ctxt->context,
obj);
3093#define CUR (*ctxt->cur)
3094#define SKIP(val) ctxt->cur += (val)
3095#define NXT(val) ctxt->cur[(val)]
3096#define CUR_PTR ctxt->cur
3097#define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l)
3099#define COPY_BUF(l,b,i,v) \
3100 if (l == 1) b[i++] = (xmlChar) v; \
3101 else i += xmlCopyChar(l,&b[i],v)
3103#define NEXTL(l) ctxt->cur += l
3105#define SKIP_BLANKS \
3106 while (IS_BLANK_CH(*(ctxt->cur))) NEXT
3108#define CURRENT (*ctxt->cur)
3109#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur)
3116#define DBL_EPSILON 1E-9
3119#define UPPER_DOUBLE 1E9
3120#define LOWER_DOUBLE 1E-5
3121#define LOWER_DOUBLE_EXP 5
3123#define INTEGER_DIGITS DBL_DIG
3124#define FRACTION_DIGITS (DBL_DIG + 1 + (LOWER_DOUBLE_EXP))
3125#define EXPONENT_DIGITS (3 + 2)
3136xmlXPathFormatNumber(
double number,
char buffer[],
int buffersize)
3138 switch (xmlXPathIsInf(
number)) {
3140 if (buffersize > (
int)
sizeof(
"Infinity"))
3144 if (buffersize > (
int)
sizeof(
"-Infinity"))
3148 if (xmlXPathIsNaN(
number)) {
3149 if (buffersize > (
int)
sizeof(
"NaN"))
3151 }
else if (
number == 0) {
3172 }
else if (buffersize > 0) {
3186 char work[
DBL_DIG + EXPONENT_DIGITS + 3 + LOWER_DOUBLE_EXP];
3187 int integer_place, fraction_place;
3189 char *after_fraction;
3190 double absolute_value;
3200 if ( ((absolute_value > UPPER_DOUBLE) ||
3201 (absolute_value < LOWER_DOUBLE)) &&
3202 (absolute_value != 0.0) ) {
3204 integer_place =
DBL_DIG + EXPONENT_DIGITS + 1;
3207 integer_place, fraction_place,
number);
3213 if (absolute_value > 0.0) {
3214 integer_place = (
int)
log10(absolute_value);
3215 if (integer_place > 0)
3216 fraction_place =
DBL_DIG - integer_place - 1;
3218 fraction_place =
DBL_DIG - integer_place;
3227 while (work[0] ==
' ') {
3233 after_fraction = work +
size;
3234 ptr = after_fraction;
3235 while (*(--
ptr) ==
'0')
3239 while ((*
ptr++ = *after_fraction++) != 0);
3243 if (
size > buffersize) {
3244 work[buffersize - 1] = 0;
3283 cur->content = (
void *) (-(++
count));
3307 return((
long)
count);
3323 int attr1 = 0, attr2 = 0;
3327 if ((node1 ==
NULL) || (node2 ==
NULL))
3344 if (node1 == node2) {
3345 if (attr1 == attr2) {
3348 cur = attrNode2->prev;
3350 if (
cur == attrNode1)
3365 if (node1 == node2->
prev)
3367 if (node1 == node2->
next)
3377 (node1->
doc == node2->
doc)) {
3392 if (
cur->parent == node1)
3398 if (
cur->parent == node2)
3411 while (depth1 > depth2) {
3415 while (depth2 > depth1) {
3423 if ((node1 ==
NULL) || (node2 ==
NULL))
3429 if (node1 == node2->
prev)
3431 if (node1 == node2->
next)
3440 (node1->
doc == node2->
doc)) {
3464xmlXPathNodeSetSort(xmlNodeSetPtr
set) {
3465#ifndef WITH_TIM_SORT
3466 int i,
j, incr,
len;
3473#ifndef WITH_TIM_SORT
3479 for (incr =
len / 2; incr > 0; incr /= 2) {
3480 for (
i = incr;
i <
len;
i++) {
3483#ifdef XP_OPTIMIZED_NON_ELEM_COMPARISON
3485 set->nodeTab[
j + incr]) == -1)
3487 if (xmlXPathCmpNodes(
set->nodeTab[
j],
3488 set->nodeTab[
j + incr]) == -1)
3491 tmp =
set->nodeTab[
j];
3492 set->nodeTab[
j] =
set->nodeTab[
j + incr];
3493 set->nodeTab[
j + incr] = tmp;
3501 libxml_domnode_tim_sort(
set->nodeTab,
set->nodeNr);
3505#define XML_NODESET_DEFAULT 10
3531 xmlXPathErrMemory(
NULL,
"duplicating namespace\n");
3580 xmlXPathErrMemory(
NULL,
"creating nodeset\n");
3583 memset(
ret, 0 , (
size_t)
sizeof(xmlNodeSet));
3588 xmlXPathErrMemory(
NULL,
"creating nodeset\n");
3593 XML_NODESET_DEFAULT * (
size_t)
sizeof(
xmlNodePtr));
3594 ret->nodeMax = XML_NODESET_DEFAULT;
3599 ret->nodeTab[
ret->nodeNr++] =
3622 for (
i = 0;
i <
cur->nodeNr;
i++) {
3636 for (
i = 0;
i <
cur->nodeNr;
i++) {
3668 for (
i = 0;
i <
cur->nodeNr;
i++) {
3679 if (
cur->nodeMax == 0) {
3683 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3687 XML_NODESET_DEFAULT * (
size_t)
sizeof(
xmlNodePtr));
3688 cur->nodeMax = XML_NODESET_DEFAULT;
3689 }
else if (
cur->nodeNr ==
cur->nodeMax) {
3693 xmlXPathErrMemory(
NULL,
"growing nodeset hit limit\n");
3699 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3706 cur->nodeTab[
cur->nodeNr++] = xmlXPathNodeSetDupNs(
node,
ns);
3729 for (
i = 0;
i <
cur->nodeNr;
i++)
3730 if (
cur->nodeTab[
i] ==
val)
return(0);
3735 if (
cur->nodeMax == 0) {
3739 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3743 XML_NODESET_DEFAULT * (
size_t)
sizeof(
xmlNodePtr));
3744 cur->nodeMax = XML_NODESET_DEFAULT;
3745 }
else if (
cur->nodeNr ==
cur->nodeMax) {
3749 xmlXPathErrMemory(
NULL,
"growing nodeset hit limit\n");
3755 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3765 cur->nodeTab[
cur->nodeNr++] =
3790 if (
cur->nodeMax == 0) {
3794 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3798 XML_NODESET_DEFAULT * (
size_t)
sizeof(
xmlNodePtr));
3799 cur->nodeMax = XML_NODESET_DEFAULT;
3800 }
else if (
cur->nodeNr ==
cur->nodeMax) {
3804 xmlXPathErrMemory(
NULL,
"growing nodeset hit limit\n");
3810 xmlXPathErrMemory(
NULL,
"growing nodeset\n");
3820 cur->nodeTab[
cur->nodeNr++] =
3838xmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2) {
3842 if (val2 ==
NULL)
return(val1);
3844 val1 = xmlXPathNodeSetCreate(
NULL);
3860 val1 = xmlXPathNodeSetCreateSize(val2->nodeNr);
3863 if (val2->nodeNr != 0) {
3864 if (val2->nodeNr == 1)
3865 *(val1->nodeTab) = *(val2->nodeTab);
3867 memcpy(val1->nodeTab, val2->nodeTab,
3870 val1->nodeNr = val2->nodeNr;
3877 initNr = val1->nodeNr;
3879 for (
i = 0;
i < val2->nodeNr;
i++) {
3880 n2 = val2->nodeTab[
i];
3885 for (
j = 0;
j < initNr;
j++) {
3886 n1 = val1->nodeTab[
j];
3907 if (val1->nodeMax == 0) {
3910 if (val1->nodeTab ==
NULL) {
3911 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
3914 memset(val1->nodeTab, 0 ,
3915 XML_NODESET_DEFAULT * (
size_t)
sizeof(
xmlNodePtr));
3916 val1->nodeMax = XML_NODESET_DEFAULT;
3917 }
else if (val1->nodeNr == val1->nodeMax) {
3921 xmlXPathErrMemory(
NULL,
"merging nodeset hit limit\n");
3927 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
3930 val1->nodeTab =
temp;
3937 val1->nodeTab[val1->nodeNr++] =
3940 val1->nodeTab[val1->nodeNr++] =
n2;
3958xmlXPathNodeSetMergeAndClear(xmlNodeSetPtr
set1, xmlNodeSetPtr set2)
3961 int i,
j, initNbSet1;
3964 initNbSet1 =
set1->nodeNr;
3965 for (
i = 0;
i < set2->nodeNr;
i++) {
3966 n2 = set2->nodeTab[
i];
3970 for (
j = 0;
j < initNbSet1;
j++) {
3984 set2->nodeTab[
i] =
NULL;
3993 if (
set1->nodeMax == 0) {
3997 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
4001 XML_NODESET_DEFAULT * (
size_t)
sizeof(
xmlNodePtr));
4002 set1->nodeMax = XML_NODESET_DEFAULT;
4003 }
else if (
set1->nodeNr >=
set1->nodeMax) {
4007 xmlXPathErrMemory(
NULL,
"merging nodeset hit limit\n");
4013 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
4039xmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr
set1, xmlNodeSetPtr set2)
4045 for (
i = 0;
i < set2->nodeNr;
i++) {
4046 n2 = set2->nodeTab[
i];
4047 if (
set1->nodeMax == 0) {
4051 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
4055 XML_NODESET_DEFAULT * (
size_t)
sizeof(
xmlNodePtr));
4056 set1->nodeMax = XML_NODESET_DEFAULT;
4057 }
else if (
set1->nodeNr >=
set1->nodeMax) {
4061 xmlXPathErrMemory(
NULL,
"merging nodeset hit limit\n");
4067 xmlXPathErrMemory(
NULL,
"merging nodeset\n");
4097 for (
i = 0;
i <
cur->nodeNr;
i++)
4098 if (
cur->nodeTab[
i] ==
val)
break;
4100 if (
i >=
cur->nodeNr) {
4103 "xmlXPathNodeSetDel: Node %s wasn't found in NodeList\n",
4112 for (;
i <
cur->nodeNr;
i++)
4113 cur->nodeTab[
i] =
cur->nodeTab[
i + 1];
4125xmlXPathNodeSetRemove(xmlNodeSetPtr
cur,
int val) {
4127 if (
val >=
cur->nodeNr)
return;
4144xmlXPathFreeNodeSet(xmlNodeSetPtr
obj) {
4150 for (
i = 0;
i <
obj->nodeNr;
i++)
4169xmlXPathNodeSetClearFromPos(xmlNodeSetPtr
set,
int pos,
int hasNsNodes)
4173 else if ((hasNsNodes)) {
4196xmlXPathNodeSetClear(xmlNodeSetPtr
set,
int hasNsNodes)
4198 xmlXPathNodeSetClearFromPos(
set, 0, hasNsNodes);
4210xmlXPathNodeSetKeepLast(xmlNodeSetPtr
set)
4217 for (
i = 0;
i <
set->nodeNr - 1;
i++) {
4223 set->nodeTab[0] =
set->nodeTab[
set->nodeNr-1];
4235xmlXPathFreeValueTree(xmlNodeSetPtr
obj) {
4241 for (
i = 0;
i <
obj->nodeNr;
i++) {
4255#if defined(DEBUG) || defined(DEBUG_STEP)
4264xmlGenericErrorContextNodeSet(
FILE *output, xmlNodeSetPtr
obj) {
4269 fprintf(output,
"NodeSet == NULL !\n");
4272 if (
obj->nodeNr == 0) {
4273 fprintf(output,
"NodeSet is empty\n");
4277 fprintf(output,
" nodeTab == NULL !\n");
4280 for (
i = 0;
i <
obj->nodeNr;
i++) {
4288 else if (
obj->nodeTab[
i]->name ==
NULL)
4290 else fprintf(output,
" %s",
obj->nodeTab[
i]->name);
4307 xmlXPathObjectPtr
ret;
4309 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
4311 xmlXPathErrMemory(
NULL,
"creating nodeset\n");
4314 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathObject));
4315 ret->type = XPATH_NODESET;
4318 ret->nodesetval = xmlXPathNodeSetCreate(
val);
4320#ifdef XP_DEBUG_OBJ_USAGE
4321 xmlXPathDebugObjUsageRequested(
NULL, XPATH_NODESET);
4337 xmlXPathObjectPtr
ret;
4339 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
4341 xmlXPathErrMemory(
NULL,
"creating result value tree\n");
4344 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathObject));
4345 ret->type = XPATH_XSLT_TREE;
4347 ret->user = (
void *)
val;
4348 ret->nodesetval = xmlXPathNodeSetCreate(
val);
4349#ifdef XP_DEBUG_OBJ_USAGE
4350 xmlXPathDebugObjUsageRequested(
NULL, XPATH_XSLT_TREE);
4365xmlXPathNewNodeSetList(xmlNodeSetPtr
val)
4367 xmlXPathObjectPtr
ret;
4372 else if (
val->nodeTab ==
NULL)
4373 ret = xmlXPathNewNodeSet(
NULL);
4375 ret = xmlXPathNewNodeSet(
val->nodeTab[0]);
4377 for (
i = 1;
i <
val->nodeNr; ++
i) {
4379 if (xmlXPathNodeSetAddUnique(
ret->nodesetval,
val->nodeTab[
i])
4397xmlXPathWrapNodeSet(xmlNodeSetPtr
val) {
4398 xmlXPathObjectPtr
ret;
4400 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
4402 xmlXPathErrMemory(
NULL,
"creating node set object\n");
4405 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathObject));
4406 ret->type = XPATH_NODESET;
4408#ifdef XP_DEBUG_OBJ_USAGE
4409 xmlXPathDebugObjUsageRequested(
NULL, XPATH_NODESET);
4422xmlXPathFreeNodeSetList(xmlXPathObjectPtr
obj) {
4424#ifdef XP_DEBUG_OBJ_USAGE
4425 xmlXPathDebugObjUsageReleased(
NULL,
obj->type);
4442xmlXPathDifference (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4447 if (xmlXPathNodeSetIsEmpty(nodes2))
4451 ret = xmlXPathNodeSetCreate(
NULL);
4452 if (xmlXPathNodeSetIsEmpty(nodes1))
4455 l1 = xmlXPathNodeSetGetLength(nodes1);
4457 for (
i = 0;
i < l1;
i++) {
4458 cur = xmlXPathNodeSetItem(nodes1,
i);
4459 if (!xmlXPathNodeSetContains(nodes2,
cur)) {
4461 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
4480xmlXPathIntersection (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4481 xmlNodeSetPtr
ret = xmlXPathNodeSetCreate(
NULL);
4487 if (xmlXPathNodeSetIsEmpty(nodes1))
4489 if (xmlXPathNodeSetIsEmpty(nodes2))
4492 l1 = xmlXPathNodeSetGetLength(nodes1);
4494 for (
i = 0;
i < l1;
i++) {
4495 cur = xmlXPathNodeSetItem(nodes1,
i);
4496 if (xmlXPathNodeSetContains(nodes2,
cur)) {
4498 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
4516xmlXPathDistinctSorted (xmlNodeSetPtr nodes) {
4523 if (xmlXPathNodeSetIsEmpty(nodes))
4526 ret = xmlXPathNodeSetCreate(
NULL);
4529 l = xmlXPathNodeSetGetLength(nodes);
4531 for (
i = 0;
i <
l;
i++) {
4532 cur = xmlXPathNodeSetItem(nodes,
i);
4537 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
4560xmlXPathDistinct (xmlNodeSetPtr nodes) {
4561 if (xmlXPathNodeSetIsEmpty(nodes))
4564 xmlXPathNodeSetSort(nodes);
4565 return(xmlXPathDistinctSorted(nodes));
4580xmlXPathHasSameNodes (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4584 if (xmlXPathNodeSetIsEmpty(nodes1) ||
4585 xmlXPathNodeSetIsEmpty(nodes2))
4588 l = xmlXPathNodeSetGetLength(nodes1);
4589 for (
i = 0;
i <
l;
i++) {
4590 cur = xmlXPathNodeSetItem(nodes1,
i);
4591 if (xmlXPathNodeSetContains(nodes2,
cur))
4610xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes,
xmlNodePtr node) {
4618 ret = xmlXPathNodeSetCreate(
NULL);
4621 if (xmlXPathNodeSetIsEmpty(nodes) ||
4622 (!xmlXPathNodeSetContains(nodes,
node)))
4625 l = xmlXPathNodeSetGetLength(nodes);
4626 for (
i = 0;
i <
l;
i++) {
4627 cur = xmlXPathNodeSetItem(nodes,
i);
4631 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
4653 xmlXPathNodeSetSort(nodes);
4654 return(xmlXPathNodeLeadingSorted(nodes,
node));
4670xmlXPathLeadingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4671 if (xmlXPathNodeSetIsEmpty(nodes2))
4673 return(xmlXPathNodeLeadingSorted(nodes1,
4674 xmlXPathNodeSetItem(nodes2, 1)));
4692xmlXPathLeading (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4693 if (xmlXPathNodeSetIsEmpty(nodes2))
4695 if (xmlXPathNodeSetIsEmpty(nodes1))
4696 return(xmlXPathNodeSetCreate(
NULL));
4697 xmlXPathNodeSetSort(nodes1);
4698 xmlXPathNodeSetSort(nodes2);
4699 return(xmlXPathNodeLeadingSorted(nodes1,
4700 xmlXPathNodeSetItem(nodes2, 1)));
4716xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes,
xmlNodePtr node) {
4724 ret = xmlXPathNodeSetCreate(
NULL);
4727 if (xmlXPathNodeSetIsEmpty(nodes) ||
4728 (!xmlXPathNodeSetContains(nodes,
node)))
4731 l = xmlXPathNodeSetGetLength(nodes);
4732 for (
i =
l - 1;
i >= 0;
i--) {
4733 cur = xmlXPathNodeSetItem(nodes,
i);
4737 if (xmlXPathNodeSetAddUnique(
ret,
cur) < 0)
4740 xmlXPathNodeSetSort(
ret);
4760 xmlXPathNodeSetSort(nodes);
4761 return(xmlXPathNodeTrailingSorted(nodes,
node));
4777xmlXPathTrailingSorted (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4778 if (xmlXPathNodeSetIsEmpty(nodes2))
4780 return(xmlXPathNodeTrailingSorted(nodes1,
4781 xmlXPathNodeSetItem(nodes2, 0)));
4799xmlXPathTrailing (xmlNodeSetPtr nodes1, xmlNodeSetPtr nodes2) {
4800 if (xmlXPathNodeSetIsEmpty(nodes2))
4802 if (xmlXPathNodeSetIsEmpty(nodes1))
4803 return(xmlXPathNodeSetCreate(
NULL));
4804 xmlXPathNodeSetSort(nodes1);
4805 xmlXPathNodeSetSort(nodes2);
4806 return(xmlXPathNodeTrailingSorted(nodes1,
4807 xmlXPathNodeSetItem(nodes2, 0)));
4827xmlXPathRegisterFunc(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4828 xmlXPathFunction
f) {
4829 return(xmlXPathRegisterFuncNS(ctxt,
name,
NULL,
f));
4844xmlXPathRegisterFuncNS(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4845 const xmlChar *ns_uri, xmlXPathFunction
f) {
4851 if (ctxt->funcHash ==
NULL)
4853 if (ctxt->funcHash ==
NULL)
4871xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt,
4872 xmlXPathFuncLookupFunc
f,
4876 ctxt->funcLookupFunc =
f;
4877 ctxt->funcLookupData = funcCtxt;
4891xmlXPathFunctionLookup(xmlXPathContextPtr ctxt,
const xmlChar *
name) {
4895 if (ctxt->funcLookupFunc !=
NULL) {
4896 xmlXPathFunction
ret;
4897 xmlXPathFuncLookupFunc
f;
4899 f = ctxt->funcLookupFunc;
4904 return(xmlXPathFunctionLookupNS(ctxt,
name,
NULL));
4919xmlXPathFunctionLookupNS(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4921 xmlXPathFunction
ret;
4928 if (ctxt->funcLookupFunc !=
NULL) {
4929 xmlXPathFuncLookupFunc
f;
4931 f = ctxt->funcLookupFunc;
4932 ret =
f(ctxt->funcLookupData,
name, ns_uri);
4937 if (ctxt->funcHash ==
NULL)
4953xmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt) {
4958 ctxt->funcHash =
NULL;
4979xmlXPathRegisterVariable(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4980 xmlXPathObjectPtr
value) {
4981 return(xmlXPathRegisterVariableNS(ctxt,
name,
NULL,
value));
4997xmlXPathRegisterVariableNS(xmlXPathContextPtr ctxt,
const xmlChar *
name,
4999 xmlXPathObjectPtr
value) {
5005 if (ctxt->varHash ==
NULL)
5007 if (ctxt->varHash ==
NULL)
5011 xmlXPathFreeObjectEntry));
5013 (
void *)
value, xmlXPathFreeObjectEntry));
5025xmlXPathRegisterVariableLookup(xmlXPathContextPtr ctxt,
5026 xmlXPathVariableLookupFunc
f,
void *
data) {
5029 ctxt->varLookupFunc =
f;
5030 ctxt->varLookupData =
data;
5044xmlXPathVariableLookup(xmlXPathContextPtr ctxt,
const xmlChar *
name) {
5048 if (ctxt->varLookupFunc !=
NULL) {
5049 xmlXPathObjectPtr
ret;
5051 ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc)
5055 return(xmlXPathVariableLookupNS(ctxt,
name,
NULL));
5070xmlXPathVariableLookupNS(xmlXPathContextPtr ctxt,
const xmlChar *
name,
5075 if (ctxt->varLookupFunc !=
NULL) {
5076 xmlXPathObjectPtr
ret;
5078 ret = ((xmlXPathVariableLookupFunc)ctxt->varLookupFunc)
5079 (ctxt->varLookupData,
name, ns_uri);
5083 if (ctxt->varHash ==
NULL)
5088 return(xmlXPathCacheObjectCopy(ctxt, (xmlXPathObjectPtr)
5099xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt) {
5103 xmlHashFree(ctxt->varHash, xmlXPathFreeObjectEntry);
5104 ctxt->varHash =
NULL;
5119xmlXPathRegisterNs(xmlXPathContextPtr ctxt,
const xmlChar *
prefix,
5128 if (ctxt->nsHash ==
NULL)
5130 if (ctxt->nsHash ==
NULL)
5150xmlXPathNsLookup(xmlXPathContextPtr ctxt,
const xmlChar *
prefix) {
5156#ifdef XML_XML_NAMESPACE
5161 if (ctxt->namespaces !=
NULL) {
5164 for (
i = 0;
i < ctxt->nsNr;
i++) {
5165 if ((ctxt->namespaces[
i] !=
NULL) &&
5167 return(ctxt->namespaces[
i]->href);
5181xmlXPathRegisteredNsCleanup(xmlXPathContextPtr ctxt) {
5186 ctxt->nsHash =
NULL;
5206xmlXPathNewFloat(
double val) {
5207 xmlXPathObjectPtr
ret;
5209 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
5211 xmlXPathErrMemory(
NULL,
"creating float object\n");
5214 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathObject));
5215 ret->type = XPATH_NUMBER;
5217#ifdef XP_DEBUG_OBJ_USAGE
5218 xmlXPathDebugObjUsageRequested(
NULL, XPATH_NUMBER);
5232xmlXPathNewBoolean(
int val) {
5233 xmlXPathObjectPtr
ret;
5235 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
5237 xmlXPathErrMemory(
NULL,
"creating boolean object\n");
5240 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathObject));
5241 ret->type = XPATH_BOOLEAN;
5242 ret->boolval = (
val != 0);
5243#ifdef XP_DEBUG_OBJ_USAGE
5244 xmlXPathDebugObjUsageRequested(
NULL, XPATH_BOOLEAN);
5259 xmlXPathObjectPtr
ret;
5261 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
5263 xmlXPathErrMemory(
NULL,
"creating string object\n");
5266 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathObject));
5267 ret->type = XPATH_STRING;
5272#ifdef XP_DEBUG_OBJ_USAGE
5273 xmlXPathDebugObjUsageRequested(
NULL, XPATH_STRING);
5288 xmlXPathObjectPtr
ret;
5290 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
5292 xmlXPathErrMemory(
NULL,
"creating string object\n");
5295 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathObject));
5296 ret->type = XPATH_STRING;
5298#ifdef XP_DEBUG_OBJ_USAGE
5299 xmlXPathDebugObjUsageRequested(
NULL, XPATH_STRING);
5313xmlXPathNewCString(
const char *
val) {
5314 xmlXPathObjectPtr
ret;
5316 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
5318 xmlXPathErrMemory(
NULL,
"creating string object\n");
5321 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathObject));
5322 ret->type = XPATH_STRING;
5324#ifdef XP_DEBUG_OBJ_USAGE
5325 xmlXPathDebugObjUsageRequested(
NULL, XPATH_STRING);
5339xmlXPathWrapCString (
char *
val) {
5340 return(xmlXPathWrapString((
xmlChar *)(
val)));
5352xmlXPathWrapExternal (
void *
val) {
5353 xmlXPathObjectPtr
ret;
5355 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
5357 xmlXPathErrMemory(
NULL,
"creating user object\n");
5360 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathObject));
5361 ret->type = XPATH_USERS;
5363#ifdef XP_DEBUG_OBJ_USAGE
5364 xmlXPathDebugObjUsageRequested(
NULL, XPATH_USERS);
5378xmlXPathObjectCopy(xmlXPathObjectPtr
val) {
5379 xmlXPathObjectPtr
ret;
5384 ret = (xmlXPathObjectPtr)
xmlMalloc(
sizeof(xmlXPathObject));
5386 xmlXPathErrMemory(
NULL,
"copying object\n");
5390#ifdef XP_DEBUG_OBJ_USAGE
5391 xmlXPathDebugObjUsageRequested(
NULL,
val->type);
5393 switch (
val->type) {
5396#ifdef LIBXML_XPTR_LOCS_ENABLED
5404 case XPATH_XSLT_TREE:
5411 if ((
val->nodesetval !=
NULL) &&
5412 (
val->nodesetval->nodeTab !=
NULL)) {
5418 top->name = (
char *)
5423 cur =
val->nodesetval->nodeTab[0]->children;
5433 ret->nodesetval = xmlXPathNodeSetCreate(
NULL);
5439 ret->nodesetval = xmlXPathNodeSetMerge(
NULL,
val->nodesetval);
5443#ifdef LIBXML_XPTR_LOCS_ENABLED
5444 case XPATH_LOCATIONSET:
5446 xmlLocationSetPtr loc =
val->user;
5447 ret->user = (
void *) xmlXPtrLocationSetMerge(
NULL, loc);
5454 case XPATH_UNDEFINED:
5456 "xmlXPathObjectCopy: unsupported type %d\n",
5470xmlXPathFreeObject(xmlXPathObjectPtr
obj) {
5472 if ((
obj->type == XPATH_NODESET) || (
obj->type == XPATH_XSLT_TREE)) {
5476 xmlXPathFreeNodeSet(
obj->nodesetval);
5480 obj->type = XPATH_XSLT_TREE;
5482 xmlXPathFreeValueTree(
obj->nodesetval);
5485 xmlXPathFreeNodeSet(
obj->nodesetval);
5487#ifdef LIBXML_XPTR_LOCS_ENABLED
5488 }
else if (
obj->type == XPATH_LOCATIONSET) {
5490 xmlXPtrFreeLocationSet(
obj->user);
5492 }
else if (
obj->type == XPATH_STRING) {
5496#ifdef XP_DEBUG_OBJ_USAGE
5497 xmlXPathDebugObjUsageReleased(
NULL,
obj->type);
5504 xmlXPathFreeObject((xmlXPathObjectPtr)
obj);
5515xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
obj)
5517#define XP_CACHE_ADD(sl, o) if (sl == NULL) { \
5518 sl = xmlPointerListCreate(10); if (sl == NULL) goto free_obj; } \
5519 if (xmlPointerListAddSize(sl, obj, 0) == -1) goto free_obj;
5521#define XP_CACHE_WANTS(sl, n) ((sl == NULL) || ((sl)->number < n))
5525 if ((ctxt ==
NULL) || (ctxt->cache ==
NULL)) {
5526 xmlXPathFreeObject(
obj);
5528 xmlXPathContextCachePtr
cache =
5529 (xmlXPathContextCachePtr) ctxt->cache;
5533 case XPATH_XSLT_TREE:
5534 if (
obj->nodesetval !=
NULL) {
5541 obj->type = XPATH_XSLT_TREE;
5542 xmlXPathFreeValueTree(
obj->nodesetval);
5544 }
else if ((
obj->nodesetval->nodeMax <= 40) &&
5545 (XP_CACHE_WANTS(
cache->nodesetObjs,
5546 cache->maxNodeset)))
5548 XP_CACHE_ADD(
cache->nodesetObjs,
obj);
5551 xmlXPathFreeNodeSet(
obj->nodesetval);
5560 if (XP_CACHE_WANTS(
cache->stringObjs,
cache->maxString)) {
5561 XP_CACHE_ADD(
cache->stringObjs,
obj);
5566 if (XP_CACHE_WANTS(
cache->booleanObjs,
cache->maxBoolean)) {
5567 XP_CACHE_ADD(
cache->booleanObjs,
obj);
5572 if (XP_CACHE_WANTS(
cache->numberObjs,
cache->maxNumber)) {
5573 XP_CACHE_ADD(
cache->numberObjs,
obj);
5577#ifdef LIBXML_XPTR_LOCS_ENABLED
5578 case XPATH_LOCATIONSET:
5580 xmlXPtrFreeLocationSet(
obj->user);
5591 if (XP_CACHE_WANTS(
cache->miscObjs,
cache->maxMisc)) {
5592 XP_CACHE_ADD(
cache->miscObjs,
obj);
5598#ifdef XP_DEBUG_OBJ_USAGE
5599 xmlXPathDebugObjUsageReleased(ctxt,
obj->type);
5602 if (
obj->nodesetval !=
NULL) {
5603 xmlNodeSetPtr tmpset =
obj->nodesetval;
5611 if (tmpset->nodeNr > 1) {
5615 for (
i = 0;
i < tmpset->nodeNr;
i++) {
5616 node = tmpset->nodeTab[
i];
5623 }
else if (tmpset->nodeNr == 1) {
5624 if ((tmpset->nodeTab[0] !=
NULL) &&
5626 xmlXPathNodeSetFreeNs((
xmlNsPtr) tmpset->nodeTab[0]);
5630 obj->nodesetval = tmpset;
5641 xmlXPathFreeNodeSet(
obj->nodesetval);
5642#ifdef XP_DEBUG_OBJ_USAGE
5643 xmlXPathDebugObjUsageReleased(
NULL,
obj->type);
5666xmlXPathCastBooleanToString (
int val) {
5684xmlXPathCastNumberToString (
double val) {
5686 switch (xmlXPathIsInf(
val)) {
5694 if (xmlXPathIsNaN(
val)) {
5696 }
else if (
val == 0) {
5702 xmlXPathFormatNumber(
val,
buf, 99);
5735xmlXPathCastNodeSetToString (xmlNodeSetPtr
ns) {
5740 xmlXPathNodeSetSort(
ns);
5741 return(xmlXPathCastNodeToString(
ns->nodeTab[0]));
5754xmlXPathCastToString(xmlXPathObjectPtr
val) {
5759 switch (
val->type) {
5760 case XPATH_UNDEFINED:
5767 case XPATH_XSLT_TREE:
5768 ret = xmlXPathCastNodeSetToString(
val->nodesetval);
5773 ret = xmlXPathCastBooleanToString(
val->boolval);
5775 case XPATH_NUMBER: {
5776 ret = xmlXPathCastNumberToString(
val->floatval);
5780#ifdef LIBXML_XPTR_LOCS_ENABLED
5783 case XPATH_LOCATIONSET:
5802xmlXPathConvertString(xmlXPathObjectPtr
val) {
5806 return(xmlXPathNewCString(
""));
5808 switch (
val->type) {
5809 case XPATH_UNDEFINED:
5815 case XPATH_XSLT_TREE:
5816 res = xmlXPathCastNodeSetToString(
val->nodesetval);
5821 res = xmlXPathCastBooleanToString(
val->boolval);
5824 res = xmlXPathCastNumberToString(
val->floatval);
5827#ifdef LIBXML_XPTR_LOCS_ENABLED
5830 case XPATH_LOCATIONSET:
5835 xmlXPathFreeObject(
val);
5837 return(xmlXPathNewCString(
""));
5838 return(xmlXPathWrapString(
res));
5850xmlXPathCastBooleanToNumber(
int val) {
5865xmlXPathCastStringToNumber(
const xmlChar *
val) {
5883 return(xmlXPathNAN);
5886 return(xmlXPathNAN);
5887 ret = xmlXPathCastStringToNumber(
strval);
5902xmlXPathCastNodeSetToNumber (xmlNodeSetPtr
ns) {
5907 return(xmlXPathNAN);
5908 str = xmlXPathCastNodeSetToString(
ns);
5909 ret = xmlXPathCastStringToNumber(
str);
5923xmlXPathCastToNumber(xmlXPathObjectPtr
val) {
5927 return(xmlXPathNAN);
5928 switch (
val->type) {
5929 case XPATH_UNDEFINED:
5936 case XPATH_XSLT_TREE:
5937 ret = xmlXPathCastNodeSetToNumber(
val->nodesetval);
5940 ret = xmlXPathCastStringToNumber(
val->stringval);
5946 ret = xmlXPathCastBooleanToNumber(
val->boolval);
5949#ifdef LIBXML_XPTR_LOCS_ENABLED
5952 case XPATH_LOCATIONSET:
5971xmlXPathConvertNumber(xmlXPathObjectPtr
val) {
5972 xmlXPathObjectPtr
ret;
5975 return(xmlXPathNewFloat(0.0));
5976 if (
val->type == XPATH_NUMBER)
5978 ret = xmlXPathNewFloat(xmlXPathCastToNumber(
val));
5979 xmlXPathFreeObject(
val);
5992xmlXPathCastNumberToBoolean (
double val) {
5993 if (xmlXPathIsNaN(
val) || (
val == 0.0))
6007xmlXPathCastStringToBoolean (
const xmlChar *
val) {
6022xmlXPathCastNodeSetToBoolean (xmlNodeSetPtr
ns) {
6023 if ((
ns ==
NULL) || (
ns->nodeNr == 0))
6037xmlXPathCastToBoolean (xmlXPathObjectPtr
val) {
6042 switch (
val->type) {
6043 case XPATH_UNDEFINED:
6050 case XPATH_XSLT_TREE:
6051 ret = xmlXPathCastNodeSetToBoolean(
val->nodesetval);
6054 ret = xmlXPathCastStringToBoolean(
val->stringval);
6057 ret = xmlXPathCastNumberToBoolean(
val->floatval);
6063#ifdef LIBXML_XPTR_LOCS_ENABLED
6066 case XPATH_LOCATIONSET:
6086xmlXPathConvertBoolean(xmlXPathObjectPtr
val) {
6087 xmlXPathObjectPtr
ret;
6090 return(xmlXPathNewBoolean(0));
6091 if (
val->type == XPATH_BOOLEAN)
6093 ret = xmlXPathNewBoolean(xmlXPathCastToBoolean(
val));
6094 xmlXPathFreeObject(
val);
6114 xmlXPathContextPtr
ret;
6116 ret = (xmlXPathContextPtr)
xmlMalloc(
sizeof(xmlXPathContext));
6118 xmlXPathErrMemory(
NULL,
"creating context\n");
6121 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathContext));
6140 ret->contextSize = -1;
6141 ret->proximityPosition = -1;
6143#ifdef XP_DEFAULT_CACHE_ON
6144 if (xmlXPathContextSetCache(
ret, 1, -1, 0) == -1) {
6145 xmlXPathFreeContext(
ret);
6150 xmlXPathRegisterAllFunctions(
ret);
6162xmlXPathFreeContext(xmlXPathContextPtr ctxt) {
6163 if (ctxt ==
NULL)
return;
6165 if (ctxt->cache !=
NULL)
6166 xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache);
6167 xmlXPathRegisteredNsCleanup(ctxt);
6168 xmlXPathRegisteredFuncsCleanup(ctxt);
6169 xmlXPathRegisteredVariablesCleanup(ctxt);
6180#define CHECK_CTXT(ctxt) \
6181 if (ctxt == NULL) { \
6182 __xmlRaiseError(NULL, NULL, NULL, \
6183 NULL, NULL, XML_FROM_XPATH, \
6184 XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \
6185 __FILE__, __LINE__, \
6186 NULL, NULL, NULL, 0, 0, \
6187 "NULL context pointer\n"); \
6191#define CHECK_CTXT_NEG(ctxt) \
6192 if (ctxt == NULL) { \
6193 __xmlRaiseError(NULL, NULL, NULL, \
6194 NULL, NULL, XML_FROM_XPATH, \
6195 XML_ERR_INTERNAL_ERROR, XML_ERR_FATAL, \
6196 __FILE__, __LINE__, \
6197 NULL, NULL, NULL, 0, 0, \
6198 "NULL context pointer\n"); \
6203#define CHECK_CONTEXT(ctxt) \
6204 if ((ctxt == NULL) || (ctxt->doc == NULL) || \
6205 (ctxt->doc->children == NULL)) { \
6206 xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_INVALID_CTXT); \
6220xmlXPathParserContextPtr
6221xmlXPathNewParserContext(
const xmlChar *
str, xmlXPathContextPtr ctxt) {
6222 xmlXPathParserContextPtr
ret;
6224 ret = (xmlXPathParserContextPtr)
xmlMalloc(
sizeof(xmlXPathParserContext));
6226 xmlXPathErrMemory(ctxt,
"creating parser context\n");
6229 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathParserContext));
6231 ret->context = ctxt;
6233 ret->comp = xmlXPathNewCompExpr();
6239 if ((ctxt !=
NULL) && (ctxt->dict !=
NULL)) {
6240 ret->comp->dict = ctxt->dict;
6256static xmlXPathParserContextPtr
6257xmlXPathCompParserContext(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt) {
6258 xmlXPathParserContextPtr
ret;
6260 ret = (xmlXPathParserContextPtr)
xmlMalloc(
sizeof(xmlXPathParserContext));
6262 xmlXPathErrMemory(ctxt,
"creating evaluation context\n");
6265 memset(
ret, 0 , (
size_t)
sizeof(xmlXPathParserContext));
6268 ret->valueTab = (xmlXPathObjectPtr *)
6269 xmlMalloc(10 *
sizeof(xmlXPathObjectPtr));
6272 xmlXPathErrMemory(ctxt,
"creating evaluation context\n");
6278 ret->valueFrame = 0;
6280 ret->context = ctxt;
6293xmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) {
6296 if (ctxt->valueTab !=
NULL) {
6297 for (
i = 0;
i < ctxt->valueNr;
i++) {
6299 xmlXPathReleaseObject(ctxt->context, ctxt->valueTab[
i]);
6301 xmlXPathFreeObject(ctxt->valueTab[
i]);
6305 if (ctxt->comp !=
NULL) {
6306#ifdef XPATH_STREAMING
6307 if (ctxt->comp->stream !=
NULL) {
6308 xmlFreePatternList(ctxt->comp->stream);
6309 ctxt->comp->stream =
NULL;
6312 xmlXPathFreeCompExpr(ctxt->comp);
6337 unsigned int ret = 0;
6353 switch (
node->type) {
6358 string =
node->content;
6363 return(((
unsigned int)
string[0]) +
6364 (((
unsigned int)
string[1]) << 8));
6371 return(((
unsigned int)
string[0]) +
6372 (((
unsigned int)
string[1]) << 8));
6377 tmp =
node->children;
6382 while (tmp !=
NULL) {
6383 switch (tmp->
type) {
6392 if ((
string !=
NULL) && (
string[0] != 0)) {
6394 return(
ret + (((
unsigned int)
string[0]) << 8));
6396 if (
string[1] == 0) {
6398 ret = (
unsigned int)
string[0];
6400 return(((
unsigned int)
string[0]) +
6401 (((
unsigned int)
string[1]) << 8));
6433 }
while (tmp !=
NULL);
6448xmlXPathStringHash(
const xmlChar *
string) {
6450 return((
unsigned int) 0);
6453 return(((
unsigned int)
string[0]) +
6454 (((
unsigned int)
string[1]) << 8));
6480xmlXPathCompareNodeSetFloat(xmlXPathParserContextPtr ctxt,
int inf,
int strict,
6481 xmlXPathObjectPtr
arg, xmlXPathObjectPtr
f) {
6487 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE))) {
6488 xmlXPathReleaseObject(ctxt->context,
arg);
6489 xmlXPathReleaseObject(ctxt->context,
f);
6492 ns =
arg->nodesetval;
6494 for (
i = 0;
i <
ns->nodeNr;
i++) {
6495 str2 = xmlXPathCastNodeToString(
ns->nodeTab[
i]);
6498 xmlXPathCacheNewString(ctxt->context, str2));
6500 xmlXPathNumberFunction(ctxt, 1);
6501 valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context,
f));
6502 ret = xmlXPathCompareValues(ctxt, inf,
strict);
6508 xmlXPathReleaseObject(ctxt->context,
arg);
6509 xmlXPathReleaseObject(ctxt->context,
f);
6535xmlXPathCompareNodeSetString(xmlXPathParserContextPtr ctxt,
int inf,
int strict,
6536 xmlXPathObjectPtr
arg, xmlXPathObjectPtr
s) {
6542 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE))) {
6543 xmlXPathReleaseObject(ctxt->context,
arg);
6544 xmlXPathReleaseObject(ctxt->context,
s);
6547 ns =
arg->nodesetval;
6549 for (
i = 0;
i <
ns->nodeNr;
i++) {
6550 str2 = xmlXPathCastNodeToString(
ns->nodeTab[
i]);
6553 xmlXPathCacheNewString(ctxt->context, str2));
6555 valuePush(ctxt, xmlXPathCacheObjectCopy(ctxt->context,
s));
6556 ret = xmlXPathCompareValues(ctxt, inf,
strict);
6562 xmlXPathReleaseObject(ctxt->context,
arg);
6563 xmlXPathReleaseObject(ctxt->context,
s);
6596xmlXPathCompareNodeSets(
int inf,
int strict,
6597 xmlXPathObjectPtr
arg1, xmlXPathObjectPtr
arg2) {
6606 ((
arg1->type != XPATH_NODESET) && (
arg1->type != XPATH_XSLT_TREE))) {
6607 xmlXPathFreeObject(
arg2);
6611 ((
arg2->type != XPATH_NODESET) && (
arg2->type != XPATH_XSLT_TREE))) {
6612 xmlXPathFreeObject(
arg1);
6613 xmlXPathFreeObject(
arg2);
6617 ns1 =
arg1->nodesetval;
6618 ns2 =
arg2->nodesetval;
6620 if ((ns1 ==
NULL) || (ns1->nodeNr <= 0)) {
6621 xmlXPathFreeObject(
arg1);
6622 xmlXPathFreeObject(
arg2);
6625 if ((ns2 ==
NULL) || (ns2->nodeNr <= 0)) {
6626 xmlXPathFreeObject(
arg1);
6627 xmlXPathFreeObject(
arg2);
6631 values2 = (
double *)
xmlMalloc(ns2->nodeNr *
sizeof(
double));
6632 if (values2 ==
NULL) {
6634 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
6635 xmlXPathFreeObject(
arg1);
6636 xmlXPathFreeObject(
arg2);
6639 for (
i = 0;
i < ns1->nodeNr;
i++) {
6640 val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[
i]);
6641 if (xmlXPathIsNaN(val1))
6643 for (
j = 0;
j < ns2->nodeNr;
j++) {
6645 values2[
j] = xmlXPathCastNodeToNumber(ns2->nodeTab[
j]);
6647 if (xmlXPathIsNaN(values2[
j]))
6650 ret = (val1 < values2[
j]);
6652 ret = (val1 <= values2[
j]);
6654 ret = (val1 > values2[
j]);
6655 else if (!inf && !
strict)
6656 ret = (val1 >= values2[
j]);
6665 xmlXPathFreeObject(
arg1);
6666 xmlXPathFreeObject(
arg2);
6692xmlXPathCompareNodeSetValue(xmlXPathParserContextPtr ctxt,
int inf,
int strict,
6693 xmlXPathObjectPtr
arg, xmlXPathObjectPtr
val) {
6695 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE)))
6700 return(xmlXPathCompareNodeSetFloat(ctxt, inf,
strict,
arg,
val));
6702 case XPATH_XSLT_TREE:
6703 return(xmlXPathCompareNodeSets(inf,
strict,
arg,
val));
6705 return(xmlXPathCompareNodeSetString(ctxt, inf,
strict,
arg,
val));
6707 valuePush(ctxt,
arg);
6708 xmlXPathBooleanFunction(ctxt, 1);
6709 valuePush(ctxt,
val);
6710 return(xmlXPathCompareValues(ctxt, inf,
strict));
6713 "xmlXPathCompareNodeSetValue: Can't compare node set "
6714 "and object of type %d\n",
6716 xmlXPathReleaseObject(ctxt->context,
arg);
6717 xmlXPathReleaseObject(ctxt->context,
val);
6718 XP_ERROR0(XPATH_INVALID_TYPE);
6738xmlXPathEqualNodeSetString(xmlXPathObjectPtr
arg,
const xmlChar *
str,
int neq)
6746 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE)))
6748 ns =
arg->nodesetval;
6753 if ((
ns ==
NULL) || (
ns->nodeNr <= 0) )
6755 hash = xmlXPathStringHash(
str);
6756 for (
i = 0;
i <
ns->nodeNr;
i++) {
6757 if (xmlXPathNodeValHash(
ns->nodeTab[
i]) ==
hash) {
6797xmlXPathEqualNodeSetFloat(xmlXPathParserContextPtr ctxt,
6798 xmlXPathObjectPtr
arg,
double f,
int neq) {
6802 xmlXPathObjectPtr
val;
6806 ((
arg->type != XPATH_NODESET) && (
arg->type != XPATH_XSLT_TREE)))
6809 ns =
arg->nodesetval;
6811 for (
i=0;
i<
ns->nodeNr;
i++) {
6812 str2 = xmlXPathCastNodeToString(
ns->nodeTab[
i]);
6814 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2));
6816 xmlXPathNumberFunction(ctxt, 1);
6817 val = valuePop(ctxt);
6819 xmlXPathReleaseObject(ctxt->context,
val);
6820 if (!xmlXPathIsNaN(
v)) {
6821 if ((!neq) && (
v==
f)) {
6824 }
else if ((neq) && (
v!=
f)) {
6858xmlXPathEqualNodeSets(xmlXPathObjectPtr
arg1, xmlXPathObjectPtr
arg2,
int neq) {
6860 unsigned int *hashs1;
6861 unsigned int *hashs2;
6869 ((
arg1->type != XPATH_NODESET) && (
arg1->type != XPATH_XSLT_TREE)))
6872 ((
arg2->type != XPATH_NODESET) && (
arg2->type != XPATH_XSLT_TREE)))
6875 ns1 =
arg1->nodesetval;
6876 ns2 =
arg2->nodesetval;
6878 if ((ns1 ==
NULL) || (ns1->nodeNr <= 0))
6880 if ((ns2 ==
NULL) || (ns2->nodeNr <= 0))
6887 for (
i = 0;
i < ns1->nodeNr;
i++)
6888 for (
j = 0;
j < ns2->nodeNr;
j++)
6889 if (ns1->nodeTab[
i] == ns2->nodeTab[
j])
6893 if (values1 ==
NULL) {
6895 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
6898 hashs1 = (
unsigned int *)
xmlMalloc(ns1->nodeNr *
sizeof(
unsigned int));
6899 if (hashs1 ==
NULL) {
6901 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
6907 if (values2 ==
NULL) {
6909 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
6914 hashs2 = (
unsigned int *)
xmlMalloc(ns2->nodeNr *
sizeof(
unsigned int));
6915 if (hashs2 ==
NULL) {
6917 xmlXPathErrMemory(
NULL,
"comparing nodesets\n");
6924 for (
i = 0;
i < ns1->nodeNr;
i++) {
6925 hashs1[
i] = xmlXPathNodeValHash(ns1->nodeTab[
i]);
6926 for (
j = 0;
j < ns2->nodeNr;
j++) {
6928 hashs2[
j] = xmlXPathNodeValHash(ns2->nodeTab[
j]);
6929 if (hashs1[
i] != hashs2[
j]) {
6936 if (values1[
i] ==
NULL)
6938 if (values2[
j] ==
NULL)
6948 for (
i = 0;
i < ns1->nodeNr;
i++)
6949 if (values1[
i] !=
NULL)
6951 for (
j = 0;
j < ns2->nodeNr;
j++)
6952 if (values2[
j] !=
NULL)
6962xmlXPathEqualValuesCommon(xmlXPathParserContextPtr ctxt,
6963 xmlXPathObjectPtr
arg1, xmlXPathObjectPtr
arg2) {
6969 switch (
arg1->type) {
6970 case XPATH_UNDEFINED:
6973 "Equal: undefined\n");
6977 switch (
arg2->type) {
6978 case XPATH_UNDEFINED:
6981 "Equal: undefined\n");
6987 "Equal: %d boolean %d \n",
6994 xmlXPathCastNumberToBoolean(
arg2->floatval));
6998 (
arg2->stringval[0] == 0))
ret = 0;
7004#ifdef LIBXML_XPTR_LOCS_ENABLED
7007 case XPATH_LOCATIONSET:
7012 case XPATH_XSLT_TREE:
7017 switch (
arg2->type) {
7018 case XPATH_UNDEFINED:
7021 "Equal: undefined\n");
7026 xmlXPathCastNumberToBoolean(
arg1->floatval));
7029 valuePush(ctxt,
arg2);
7030 xmlXPathNumberFunction(ctxt, 1);
7031 arg2 = valuePop(ctxt);
7035 if (xmlXPathIsNaN(
arg1->floatval) ||
7036 xmlXPathIsNaN(
arg2->floatval)) {
7038 }
else if (xmlXPathIsInf(
arg1->floatval) == 1) {
7039 if (xmlXPathIsInf(
arg2->floatval) == 1)
7043 }
else if (xmlXPathIsInf(
arg1->floatval) == -1) {
7044 if (xmlXPathIsInf(
arg2->floatval) == -1)
7048 }
else if (xmlXPathIsInf(
arg2->floatval) == 1) {
7049 if (xmlXPathIsInf(
arg1->floatval) == 1)
7053 }
else if (xmlXPathIsInf(
arg2->floatval) == -1) {
7054 if (xmlXPathIsInf(
arg1->floatval) == -1)
7063#ifdef LIBXML_XPTR_LOCS_ENABLED
7066 case XPATH_LOCATIONSET:
7071 case XPATH_XSLT_TREE:
7076 switch (
arg2->type) {
7077 case XPATH_UNDEFINED:
7080 "Equal: undefined\n");
7085 (
arg1->stringval[0] == 0))
ret = 0;
7094 valuePush(ctxt,
arg1);
7095 xmlXPathNumberFunction(ctxt, 1);
7096 arg1 = valuePop(ctxt);
7098 if (xmlXPathIsNaN(
arg1->floatval) ||
7099 xmlXPathIsNaN(
arg2->floatval)) {
7101 }
else if (xmlXPathIsInf(
arg1->floatval) == 1) {
7102 if (xmlXPathIsInf(
arg2->floatval) == 1)
7106 }
else if (xmlXPathIsInf(
arg1->floatval) == -1) {
7107 if (xmlXPathIsInf(
arg2->floatval) == -1)
7111 }
else if (xmlXPathIsInf(
arg2->floatval) == 1) {
7112 if (xmlXPathIsInf(
arg1->floatval) == 1)
7116 }
else if (xmlXPathIsInf(
arg2->floatval) == -1) {
7117 if (xmlXPathIsInf(
arg1->floatval) == -1)
7126#ifdef LIBXML_XPTR_LOCS_ENABLED
7129 case XPATH_LOCATIONSET:
7134 case XPATH_XSLT_TREE:
7139#ifdef LIBXML_XPTR_LOCS_ENABLED
7142 case XPATH_LOCATIONSET:
7147 case XPATH_XSLT_TREE:
7150 xmlXPathReleaseObject(ctxt->context,
arg1);
7151 xmlXPathReleaseObject(ctxt->context,
arg2);
7164xmlXPathEqualValues(xmlXPathParserContextPtr ctxt) {
7165 xmlXPathObjectPtr
arg1,
arg2, argtmp;
7168 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(0);
7169 arg2 = valuePop(ctxt);
7170 arg1 = valuePop(ctxt);
7173 xmlXPathReleaseObject(ctxt->context,
arg1);
7175 xmlXPathReleaseObject(ctxt->context,
arg2);
7176 XP_ERROR0(XPATH_INVALID_OPERAND);
7182 "Equal: by pointer\n");
7184 xmlXPathFreeObject(
arg1);
7191 if ((
arg2->type == XPATH_NODESET) || (
arg2->type == XPATH_XSLT_TREE) ||
7192 (
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE)) {
7196 if ((
arg1->type != XPATH_NODESET) && (
arg1->type != XPATH_XSLT_TREE)) {
7201 switch (
arg2->type) {
7202 case XPATH_UNDEFINED:
7205 "Equal: undefined\n");
7209 case XPATH_XSLT_TREE:
7214 (
arg1->nodesetval->nodeNr == 0))
ret = 0;
7220 ret = xmlXPathEqualNodeSetFloat(ctxt,
arg1,
arg2->floatval, 0);
7223 ret = xmlXPathEqualNodeSetString(
arg1,
arg2->stringval, 0);
7226#ifdef LIBXML_XPTR_LOCS_ENABLED
7229 case XPATH_LOCATIONSET:
7234 xmlXPathReleaseObject(ctxt->context,
arg1);
7235 xmlXPathReleaseObject(ctxt->context,
arg2);
7239 return (xmlXPathEqualValuesCommon(ctxt,
arg1,
arg2));
7251xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt) {
7252 xmlXPathObjectPtr
arg1,
arg2, argtmp;
7255 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(0);
7256 arg2 = valuePop(ctxt);
7257 arg1 = valuePop(ctxt);
7260 xmlXPathReleaseObject(ctxt->context,
arg1);
7262 xmlXPathReleaseObject(ctxt->context,
arg2);
7263 XP_ERROR0(XPATH_INVALID_OPERAND);
7269 "NotEqual: by pointer\n");
7271 xmlXPathReleaseObject(ctxt->context,
arg1);
7278 if ((
arg2->type == XPATH_NODESET) || (
arg2->type == XPATH_XSLT_TREE) ||
7279 (
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE)) {
7283 if ((
arg1->type != XPATH_NODESET) && (
arg1->type != XPATH_XSLT_TREE)) {
7288 switch (
arg2->type) {
7289 case XPATH_UNDEFINED:
7292 "NotEqual: undefined\n");
7296 case XPATH_XSLT_TREE:
7301 (
arg1->nodesetval->nodeNr == 0))
ret = 0;
7307 ret = xmlXPathEqualNodeSetFloat(ctxt,
arg1,
arg2->floatval, 1);
7310 ret = xmlXPathEqualNodeSetString(
arg1,
arg2->stringval,1);
7313#ifdef LIBXML_XPTR_LOCS_ENABLED
7316 case XPATH_LOCATIONSET:
7321 xmlXPathReleaseObject(ctxt->context,
arg1);
7322 xmlXPathReleaseObject(ctxt->context,
arg2);
7326 return (!xmlXPathEqualValuesCommon(ctxt,
arg1,
arg2));
7354xmlXPathCompareValues(xmlXPathParserContextPtr ctxt,
int inf,
int strict) {
7355 int ret = 0, arg1i = 0, arg2i = 0;
7358 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(0);
7359 arg2 = valuePop(ctxt);
7360 arg1 = valuePop(ctxt);
7363 xmlXPathReleaseObject(ctxt->context,
arg1);
7365 xmlXPathReleaseObject(ctxt->context,
arg2);
7366 XP_ERROR0(XPATH_INVALID_OPERAND);
7369 if ((
arg2->type == XPATH_NODESET) || (
arg2->type == XPATH_XSLT_TREE) ||
7370 (
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE)) {
7376 if (((
arg2->type == XPATH_NODESET) || (
arg2->type == XPATH_XSLT_TREE)) &&
7377 ((
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE))){
7380 if ((
arg1->type == XPATH_NODESET) || (
arg1->type == XPATH_XSLT_TREE)) {
7381 ret = xmlXPathCompareNodeSetValue(ctxt, inf,
strict,
7384 ret = xmlXPathCompareNodeSetValue(ctxt, !inf,
strict,
7391 if (
arg1->type != XPATH_NUMBER) {
7392 valuePush(ctxt,
arg1);
7393 xmlXPathNumberFunction(ctxt, 1);
7394 arg1 = valuePop(ctxt);
7396 if (
arg1->type != XPATH_NUMBER) {
7397 xmlXPathFreeObject(
arg1);
7398 xmlXPathFreeObject(
arg2);
7399 XP_ERROR0(XPATH_INVALID_OPERAND);
7401 if (
arg2->type != XPATH_NUMBER) {
7402 valuePush(ctxt,
arg2);
7403 xmlXPathNumberFunction(ctxt, 1);
7404 arg2 = valuePop(ctxt);
7406 if (
arg2->type != XPATH_NUMBER) {
7407 xmlXPathReleaseObject(ctxt->context,
arg1);
7408 xmlXPathReleaseObject(ctxt->context,
arg2);
7409 XP_ERROR0(XPATH_INVALID_OPERAND);
7416 if (xmlXPathIsNaN(
arg1->floatval) || xmlXPathIsNaN(
arg2->floatval)) {
7419 arg1i=xmlXPathIsInf(
arg1->floatval);
7420 arg2i=xmlXPathIsInf(
arg2->floatval);
7422 if ((arg1i == -1 && arg2i != -1) ||
7423 (arg2i == 1 && arg1i != 1)) {
7425 }
else if (arg1i == 0 && arg2i == 0) {
7431 else if (inf && !
strict) {
7432 if (arg1i == -1 || arg2i == 1) {
7434 }
else if (arg1i == 0 && arg2i == 0) {
7440 else if (!inf &&
strict) {
7441 if ((arg1i == 1 && arg2i != 1) ||
7442 (arg2i == -1 && arg1i != -1)) {
7444 }
else if (arg1i == 0 && arg2i == 0) {
7450 else if (!inf && !
strict) {
7451 if (arg1i == 1 || arg2i == -1) {
7453 }
else if (arg1i == 0 && arg2i == 0) {
7460 xmlXPathReleaseObject(ctxt->context,
arg1);
7461 xmlXPathReleaseObject(ctxt->context,
arg2);
7474xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt) {
7475 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return;
7477 CHECK_TYPE(XPATH_NUMBER);
7478 ctxt->value->floatval = -ctxt->value->floatval;
7490xmlXPathAddValues(xmlXPathParserContextPtr ctxt) {
7491 xmlXPathObjectPtr
arg;
7494 arg = valuePop(ctxt);
7496 XP_ERROR(XPATH_INVALID_OPERAND);
7497 val = xmlXPathCastToNumber(
arg);
7498 xmlXPathReleaseObject(ctxt->context,
arg);
7500 CHECK_TYPE(XPATH_NUMBER);
7501 ctxt->value->floatval +=
val;
7513xmlXPathSubValues(xmlXPathParserContextPtr ctxt) {
7514 xmlXPathObjectPtr
arg;
7517 arg = valuePop(ctxt);
7519 XP_ERROR(XPATH_INVALID_OPERAND);
7520 val = xmlXPathCastToNumber(
arg);
7521 xmlXPathReleaseObject(ctxt->context,
arg);
7523 CHECK_TYPE(XPATH_NUMBER);
7524 ctxt->value->floatval -=
val;
7536xmlXPathMultValues(xmlXPathParserContextPtr ctxt) {
7537 xmlXPathObjectPtr
arg;
7540 arg = valuePop(ctxt);
7542 XP_ERROR(XPATH_INVALID_OPERAND);
7543 val = xmlXPathCastToNumber(
arg);
7544 xmlXPathReleaseObject(ctxt->context,
arg);
7546 CHECK_TYPE(XPATH_NUMBER);
7547 ctxt->value->floatval *=
val;
7560xmlXPathDivValues(xmlXPathParserContextPtr ctxt) {
7561 xmlXPathObjectPtr
arg;
7564 arg = valuePop(ctxt);
7566 XP_ERROR(XPATH_INVALID_OPERAND);
7567 val = xmlXPathCastToNumber(
arg);
7568 xmlXPathReleaseObject(ctxt->context,
arg);
7570 CHECK_TYPE(XPATH_NUMBER);
7571 ctxt->value->floatval /=
val;
7583xmlXPathModValues(xmlXPathParserContextPtr ctxt) {
7584 xmlXPathObjectPtr
arg;
7587 arg = valuePop(ctxt);
7589 XP_ERROR(XPATH_INVALID_OPERAND);
7590 arg2 = xmlXPathCastToNumber(
arg);
7591 xmlXPathReleaseObject(ctxt->context,
arg);
7593 CHECK_TYPE(XPATH_NUMBER);
7594 arg1 = ctxt->value->floatval;
7596 ctxt->value->floatval = xmlXPathNAN;
7613typedef xmlNodePtr (*xmlXPathTraversalFunction)
7623typedef xmlNodePtr (*xmlXPathTraversalFunctionExt)
7630typedef xmlNodeSetPtr (*xmlXPathNodeSetMergeFunction)
7631 (xmlNodeSetPtr, xmlNodeSetPtr);
7645xmlXPathNextSelf(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
7646 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7648 return(ctxt->context->node);
7663xmlXPathNextChild(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
7664 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7666 if (ctxt->context->node ==
NULL)
return(
NULL);
7667 switch (ctxt->context->node->type) {
7677 return(ctxt->context->node->children);
7682 return(((
xmlDocPtr) ctxt->context->node)->children);
7711xmlXPathNextChildElement(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
7712 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7714 cur = ctxt->context->node;
7719 switch (
cur->type) {
7746 switch (
cur->type) {
7790 if (contextNode ==
NULL)
7792 switch (contextNode->
type) {
7798 return(contextNode);
7807 switch (
cur->type) {
7856xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
7857 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7859 if (ctxt->context->node ==
NULL)
7865 if (ctxt->context->node == (
xmlNodePtr) ctxt->context->doc)
7866 return(ctxt->context->doc->children);
7867 return(ctxt->context->node->children);
7886 if (
cur == ctxt->context->node)
return(
NULL);
7898 if (
cur == ctxt->context->node)
return(
NULL);
7921xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
7922 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7924 return(ctxt->context->node);
7926 if (ctxt->context->node ==
NULL)
7932 return(xmlXPathNextDescendant(ctxt,
cur));
7946xmlXPathNextParent(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
7947 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
7954 if (ctxt->context->node ==
NULL)
return(
NULL);
7955 switch (ctxt->context->node->type) {
7970 if (ctxt->context->node->parent ==
NULL)
7973 ((ctxt->context->node->parent->name[0] ==
' ') ||
7977 return(ctxt->context->node->parent);
8016xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
8017 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
8024 if (ctxt->context->node ==
NULL)
return(
NULL);
8025 switch (ctxt->context->node->type) {
8040 if (ctxt->context->node->parent ==
NULL)
8043 ((ctxt->context->node->parent->name[0] ==
' ') ||
8047 return(ctxt->context->node->parent);
8070 if (
cur == ctxt->context->doc->children)
8074 switch (
cur->type) {
8092 ((
cur->parent->name[0] ==
' ') ||
8096 return(
cur->parent);
8105 if ((
ns->next !=
NULL) &&
8134xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
8135 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
8137 return(ctxt->context->node);
8138 return(xmlXPathNextAncestor(ctxt,
cur));
8153xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
8154 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
8161 return(ctxt->context->node->next);
8178xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
8179 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
8186 return(ctxt->context->node->prev);
8190 return(ctxt->context->node->prev);
8209xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
8210 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
8213 return(
cur->children);
8216 cur = ctxt->context->node;
8222 if ((
ns->next ==
NULL) ||
8256 if (ancestor->
doc !=
node->doc)
return(0);
8261 if (
node->parent == ancestor)
8282xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur)
8284 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
8286 cur = ctxt->context->node;
8292 if ((
ns->next ==
NULL) ||
8311 if (
cur == ctxt->context->doc->children)
8313 }
while (xmlXPathIsAncestor(
cur, ctxt->context->node));
8333xmlXPathNextPrecedingInternal(xmlXPathParserContextPtr ctxt,
8336 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
8338 cur = ctxt->context->node;
8346 if ((
ns->next ==
NULL) ||
8351 ctxt->ancestor =
cur->parent;
8361 if (
cur == ctxt->context->doc->children)
8363 if (
cur != ctxt->ancestor)
8365 ctxt->ancestor =
cur->parent;
8388xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
8389 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
8392 if (ctxt->context->tmpNsList !=
NULL)
8393 xmlFree(ctxt->context->tmpNsList);
8394 ctxt->context->tmpNsList =
8395 xmlGetNsList(ctxt->context->doc, ctxt->context->node);
8396 ctxt->context->tmpNsNr = 0;
8397 if (ctxt->context->tmpNsList !=
NULL) {
8398 while (ctxt->context->tmpNsList[ctxt->context->tmpNsNr] !=
NULL) {
8399 ctxt->context->tmpNsNr++;
8404 if (ctxt->context->tmpNsNr > 0) {
8405 return (
xmlNodePtr)ctxt->context->tmpNsList[--ctxt->context->tmpNsNr];
8407 if (ctxt->context->tmpNsList !=
NULL)
8408 xmlFree(ctxt->context->tmpNsList);
8409 ctxt->context->tmpNsList =
NULL;
8425xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt,
xmlNodePtr cur) {
8426 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
return(
NULL);
8427 if (ctxt->context->node ==
NULL)
8432 if (ctxt->context->node == (
xmlNodePtr) ctxt->context->doc)
8434 return((
xmlNodePtr)ctxt->context->node->properties);
8445#define IS_FUNCTION 200
8461xmlXPathRoot(xmlXPathParserContextPtr ctxt) {
8462 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
8464 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8486xmlXPathLastFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8488 if (ctxt->context->contextSize >= 0) {
8490 xmlXPathCacheNewFloat(ctxt->context,
8491 (
double) ctxt->context->contextSize));
8494 "last() : %d\n", ctxt->context->contextSize);
8497 XP_ERROR(XPATH_INVALID_CTXT_SIZE);
8513xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8515 if (ctxt->context->proximityPosition >= 0) {
8517 xmlXPathCacheNewFloat(ctxt->context,
8518 (
double) ctxt->context->proximityPosition));
8521 ctxt->context->proximityPosition);
8524 XP_ERROR(XPATH_INVALID_CTXT_POSITION);
8537xmlXPathCountFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8538 xmlXPathObjectPtr
cur;
8541 if ((ctxt->value ==
NULL) ||
8542 ((ctxt->value->type != XPATH_NODESET) &&
8543 (ctxt->value->type != XPATH_XSLT_TREE)))
8544 XP_ERROR(XPATH_INVALID_TYPE);
8545 cur = valuePop(ctxt);
8548 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, (
double) 0));
8550 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8551 (
double)
cur->nodesetval->nodeNr));
8552 xmlXPathReleaseObject(ctxt->context,
cur);
8574 ret = xmlXPathNodeSetCreate(
NULL);
8602 xmlXPathNodeSetAdd(
ret,
elem);
8632xmlXPathIdFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8635 xmlXPathObjectPtr
obj;
8638 obj = valuePop(ctxt);
8639 if (
obj ==
NULL) XP_ERROR(XPATH_INVALID_OPERAND);
8640 if ((
obj->type == XPATH_NODESET) || (
obj->type == XPATH_XSLT_TREE)) {
8645 ret = xmlXPathNodeSetCreate(
NULL);
8647 if (
obj->nodesetval !=
NULL) {
8648 for (
i = 0;
i <
obj->nodesetval->nodeNr;
i++) {
8650 xmlXPathCastNodeToString(
obj->nodesetval->nodeTab[
i]);
8651 ns = xmlXPathGetElementsByIds(ctxt->context->doc, tokens);
8653 ret = xmlXPathNodeSetMerge(
ret,
ns);
8654 xmlXPathFreeNodeSet(
ns);
8659 xmlXPathReleaseObject(ctxt->context,
obj);
8660 valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context,
ret));
8663 obj = xmlXPathCacheConvertString(ctxt->context,
obj);
8665 ret = xmlXPathGetElementsByIds(ctxt->context->doc,
obj->stringval);
8666 valuePush(ctxt, xmlXPathCacheWrapNodeSet(ctxt->context,
ret));
8667 xmlXPathReleaseObject(ctxt->context,
obj);
8685xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8686 xmlXPathObjectPtr
cur;
8688 if (ctxt ==
NULL)
return;
8691 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8692 ctxt->context->node));
8697 if ((ctxt->value ==
NULL) ||
8698 ((ctxt->value->type != XPATH_NODESET) &&
8699 (ctxt->value->type != XPATH_XSLT_TREE)))
8700 XP_ERROR(XPATH_INVALID_TYPE);
8701 cur = valuePop(ctxt);
8703 if ((
cur->nodesetval ==
NULL) || (
cur->nodesetval->nodeNr == 0)) {
8704 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8707 switch (
cur->nodesetval->nodeTab[
i]->type) {
8711 if (
cur->nodesetval->nodeTab[
i]->name[0] ==
' ')
8712 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8715 xmlXPathCacheNewString(ctxt->context,
8716 cur->nodesetval->nodeTab[
i]->name));
8719 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8723 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8726 xmlXPathReleaseObject(ctxt->context,
cur);
8744xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8745 xmlXPathObjectPtr
cur;
8747 if (ctxt ==
NULL)
return;
8750 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8751 ctxt->context->node));
8755 if ((ctxt->value ==
NULL) ||
8756 ((ctxt->value->type != XPATH_NODESET) &&
8757 (ctxt->value->type != XPATH_XSLT_TREE)))
8758 XP_ERROR(XPATH_INVALID_TYPE);
8759 cur = valuePop(ctxt);
8761 if ((
cur->nodesetval ==
NULL) || (
cur->nodesetval->nodeNr == 0)) {
8762 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8765 switch (
cur->nodesetval->nodeTab[
i]->type) {
8768 if (
cur->nodesetval->nodeTab[
i]->ns ==
NULL)
8769 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8771 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
8772 cur->nodesetval->nodeTab[
i]->ns->href));
8775 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8778 xmlXPathReleaseObject(ctxt->context,
cur);
8804xmlXPathNameFunction(xmlXPathParserContextPtr ctxt,
int nargs)
8806 xmlXPathObjectPtr
cur;
8809 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8810 ctxt->context->node));
8815 if ((ctxt->value ==
NULL) ||
8816 ((ctxt->value->type != XPATH_NODESET) &&
8817 (ctxt->value->type != XPATH_XSLT_TREE)))
8818 XP_ERROR(XPATH_INVALID_TYPE);
8819 cur = valuePop(ctxt);
8821 if ((
cur->nodesetval ==
NULL) || (
cur->nodesetval->nodeNr == 0)) {
8822 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
8826 switch (
cur->nodesetval->nodeTab[
i]->type) {
8829 if (
cur->nodesetval->nodeTab[
i]->name[0] ==
' ')
8831 xmlXPathCacheNewCString(ctxt->context,
""));
8832 else if ((
cur->nodesetval->nodeTab[
i]->ns ==
NULL) ||
8833 (
cur->nodesetval->nodeTab[
i]->ns->prefix ==
NULL)) {
8835 xmlXPathCacheNewString(ctxt->context,
8836 cur->nodesetval->nodeTab[
i]->name));
8841 cur->nodesetval->nodeTab[
i]->ns->prefix,
8846 XP_ERROR(XPATH_MEMORY_ERROR);
8848 valuePush(ctxt, xmlXPathCacheWrapString(
8853 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
8854 cur->nodesetval->nodeTab[
i]));
8855 xmlXPathLocalNameFunction(ctxt, 1);
8858 xmlXPathReleaseObject(ctxt->context,
cur);
8899xmlXPathStringFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8900 xmlXPathObjectPtr
cur;
8902 if (ctxt ==
NULL)
return;
8905 xmlXPathCacheWrapString(ctxt->context,
8906 xmlXPathCastNodeToString(ctxt->context->node)));
8911 cur = valuePop(ctxt);
8912 if (
cur ==
NULL) XP_ERROR(XPATH_INVALID_OPERAND);
8913 valuePush(ctxt, xmlXPathCacheConvertString(ctxt->context,
cur));
8929xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8930 xmlXPathObjectPtr
cur;
8933 if ((ctxt ==
NULL) || (ctxt->context ==
NULL))
8935 if (ctxt->context->node ==
NULL) {
8936 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0));
8940 content = xmlXPathCastNodeToString(ctxt->context->node);
8941 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8949 CHECK_TYPE(XPATH_STRING);
8950 cur = valuePop(ctxt);
8951 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
8953 xmlXPathReleaseObject(ctxt->context,
cur);
8966xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
8967 xmlXPathObjectPtr
cur, newobj;
8970 if (ctxt ==
NULL)
return;
8976 cur = valuePop(ctxt);
8977 if ((
cur ==
NULL) || (
cur->type != XPATH_STRING)) {
8978 xmlXPathReleaseObject(ctxt->context,
cur);
8985 newobj = valuePop(ctxt);
8986 if ((newobj ==
NULL) || (newobj->type != XPATH_STRING)) {
8987 xmlXPathReleaseObject(ctxt->context, newobj);
8988 xmlXPathReleaseObject(ctxt->context,
cur);
8989 XP_ERROR(XPATH_INVALID_TYPE);
8992 newobj->stringval =
cur->stringval;
8993 cur->stringval = tmp;
8994 xmlXPathReleaseObject(ctxt->context, newobj);
8997 valuePush(ctxt,
cur);
9011xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9012 xmlXPathObjectPtr hay, needle;
9016 CHECK_TYPE(XPATH_STRING);
9017 needle = valuePop(ctxt);
9019 hay = valuePop(ctxt);
9021 if ((hay ==
NULL) || (hay->type != XPATH_STRING)) {
9022 xmlXPathReleaseObject(ctxt->context, hay);
9023 xmlXPathReleaseObject(ctxt->context, needle);
9024 XP_ERROR(XPATH_INVALID_TYPE);
9026 if (
xmlStrstr(hay->stringval, needle->stringval))
9027 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
9029 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
9030 xmlXPathReleaseObject(ctxt->context, hay);
9031 xmlXPathReleaseObject(ctxt->context, needle);
9045xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9046 xmlXPathObjectPtr hay, needle;
9051 CHECK_TYPE(XPATH_STRING);
9052 needle = valuePop(ctxt);
9054 hay = valuePop(ctxt);
9056 if ((hay ==
NULL) || (hay->type != XPATH_STRING)) {
9057 xmlXPathReleaseObject(ctxt->context, hay);
9058 xmlXPathReleaseObject(ctxt->context, needle);
9059 XP_ERROR(XPATH_INVALID_TYPE);
9062 if (
xmlStrncmp(hay->stringval, needle->stringval,
n))
9063 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
9065 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
9066 xmlXPathReleaseObject(ctxt->context, hay);
9067 xmlXPathReleaseObject(ctxt->context, needle);
9099xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9115 CHECK_TYPE(XPATH_NUMBER);
9116 len = valuePop(ctxt);
9118 xmlXPathReleaseObject(ctxt->context,
len);
9122 CHECK_TYPE(XPATH_NUMBER);
9123 start = valuePop(ctxt);
9125 xmlXPathReleaseObject(ctxt->context,
start);
9127 CHECK_TYPE(XPATH_STRING);
9128 str = valuePop(ctxt);
9132 }
else if (
in >= 1.0) {
9139 double rin, rle,
end;
9142 if (
in - rin >= 0.5)
9146 if (le - rle >= 0.5)
9150 if (!(
end >= 1.0)) {
9159 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
ret));
9162 valuePush(ctxt, xmlXPathCacheNewCString(ctxt->context,
""));
9165 xmlXPathReleaseObject(ctxt->context,
str);
9182xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9183 xmlXPathObjectPtr
str;
9184 xmlXPathObjectPtr
find;
9191 find = valuePop(ctxt);
9193 str = valuePop(ctxt);
9202 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9206 xmlXPathReleaseObject(ctxt->context,
str);
9207 xmlXPathReleaseObject(ctxt->context,
find);
9225xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9226 xmlXPathObjectPtr
str;
9227 xmlXPathObjectPtr
find;
9234 find = valuePop(ctxt);
9236 str = valuePop(ctxt);
9246 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9250 xmlXPathReleaseObject(ctxt->context,
str);
9251 xmlXPathReleaseObject(ctxt->context,
find);
9269xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9273 if (ctxt ==
NULL)
return;
9277 xmlXPathCacheWrapString(ctxt->context,
9278 xmlXPathCastNodeToString(ctxt->context->node)));
9284 CHECK_TYPE(XPATH_STRING);
9285 source = ctxt->value->stringval;
9333xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9334 xmlXPathObjectPtr
str;
9335 xmlXPathObjectPtr
from;
9336 xmlXPathObjectPtr to;
9346 to = valuePop(ctxt);
9348 from = valuePop(ctxt);
9350 str = valuePop(ctxt);
9355 for (cptr =
str->stringval; (ch=*cptr); ) {
9370 if ( (ch & 0xc0) != 0xc0 ) {
9372 "xmlXPathTranslateFunction: Invalid UTF8 string\n");
9377 while ( (ch <<= 1) & 0x80 )
9378 if ( (*cptr++ & 0xc0) != 0x80 ) {
9380 "xmlXPathTranslateFunction: Invalid UTF8 string\n");
9389 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
9392 xmlXPathReleaseObject(ctxt->context,
str);
9393 xmlXPathReleaseObject(ctxt->context,
from);
9394 xmlXPathReleaseObject(ctxt->context, to);
9411xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9412 xmlXPathObjectPtr
cur;
9415 cur = valuePop(ctxt);
9416 if (
cur ==
NULL) XP_ERROR(XPATH_INVALID_OPERAND);
9417 cur = xmlXPathCacheConvertBoolean(ctxt->context,
cur);
9418 valuePush(ctxt,
cur);
9432xmlXPathNotFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9435 CHECK_TYPE(XPATH_BOOLEAN);
9436 ctxt->value->boolval = ! ctxt->value->boolval;
9448xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9450 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 1));
9462xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9464 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context, 0));
9489xmlXPathLangFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9498 CHECK_TYPE(XPATH_STRING);
9499 val = valuePop(ctxt);
9506 if ((theLang[
i] == 0) || (theLang[
i] ==
'-'))
9510 if (theLang !=
NULL)
9513 xmlXPathReleaseObject(ctxt->context,
val);
9514 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context,
ret));
9526xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9527 xmlXPathObjectPtr
cur;
9530 if (ctxt ==
NULL)
return;
9532 if (ctxt->context->node ==
NULL) {
9533 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context, 0.0));
9538 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
res));
9545 cur = valuePop(ctxt);
9546 valuePush(ctxt, xmlXPathCacheConvertNumber(ctxt->context,
cur));
9560xmlXPathSumFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9561 xmlXPathObjectPtr
cur;
9566 if ((ctxt->value ==
NULL) ||
9567 ((ctxt->value->type != XPATH_NODESET) &&
9568 (ctxt->value->type != XPATH_XSLT_TREE)))
9569 XP_ERROR(XPATH_INVALID_TYPE);
9570 cur = valuePop(ctxt);
9572 if ((
cur->nodesetval !=
NULL) && (
cur->nodesetval->nodeNr != 0)) {
9573 for (
i = 0;
i <
cur->nodesetval->nodeNr;
i++) {
9574 res += xmlXPathCastNodeToNumber(
cur->nodesetval->nodeTab[
i]);
9577 valuePush(ctxt, xmlXPathCacheNewFloat(ctxt->context,
res));
9578 xmlXPathReleaseObject(ctxt->context,
cur);
9592xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9595 CHECK_TYPE(XPATH_NUMBER);
9597 ctxt->value->floatval =
floor(ctxt->value->floatval);
9611xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9614 CHECK_TYPE(XPATH_NUMBER);
9618 ctxt->value->floatval =
copysign(
ceil(ctxt->value->floatval), ctxt->value->floatval);
9620 ctxt->value->floatval =
ceil(ctxt->value->floatval);
9636xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
9641 CHECK_TYPE(XPATH_NUMBER);
9643 f = ctxt->value->floatval;
9645 if ((
f >= -0.5) && (
f < 0.5)) {
9647 ctxt->value->floatval *= 0.0;
9650 double rounded =
floor(
f);
9651 if (
f - rounded >= 0.5)
9653 ctxt->value->floatval = rounded;
9667static void xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt,
int sort);
9668static void xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt,
int filter);
9669static void xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt);
9670static void xmlXPathCompRelativeLocationPath(xmlXPathParserContextPtr ctxt);
9671static xmlChar * xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt,
9687xmlXPathCurrentChar(xmlXPathParserContextPtr ctxt,
int *
len) {
9709 if ((
cur[1] & 0xc0) != 0x80)
9710 goto encoding_error;
9711 if ((
c & 0xe0) == 0xe0) {
9713 if ((
cur[2] & 0xc0) != 0x80)
9714 goto encoding_error;
9715 if ((
c & 0xf0) == 0xf0) {
9716 if (((
c & 0xf8) != 0xf0) ||
9717 ((
cur[3] & 0xc0) != 0x80))
9718 goto encoding_error;
9721 val = (
cur[0] & 0x7) << 18;
9722 val |= (
cur[1] & 0x3f) << 12;
9723 val |= (
cur[2] & 0x3f) << 6;
9728 val = (
cur[0] & 0xf) << 12;
9729 val |= (
cur[1] & 0x3f) << 6;
9735 val = (
cur[0] & 0x1f) << 6;
9739 XP_ERROR0(XPATH_INVALID_CHAR_ERROR);
9756 XP_ERROR0(XPATH_ENCODING_ERROR);
9774xmlXPathParseNCName(xmlXPathParserContextPtr ctxt) {
9779 if ((ctxt ==
NULL) || (ctxt->cur ==
NULL))
return(
NULL);
9784 if (((*
in >= 0x61) && (*
in <= 0x7A)) ||
9785 ((*
in >= 0x41) && (*
in <= 0x5A)) ||
9788 while (((*
in >= 0x61) && (*
in <= 0x7A)) ||
9789 ((*
in >= 0x41) && (*
in <= 0x5A)) ||
9790 ((*
in >= 0x30) && (*
in <= 0x39)) ||
9791 (*
in ==
'_') || (*
in ==
'.') ||
9794 if ((*
in ==
' ') || (*
in ==
'>') || (*
in ==
'/') ||
9795 (*
in ==
'[') || (*
in ==
']') || (*
in ==
':') ||
9796 (*
in ==
'@') || (*
in ==
'*')) {
9805 return(xmlXPathParseNameComplex(ctxt, 0));
9827xmlXPathParseQName(xmlXPathParserContextPtr ctxt,
xmlChar **
prefix) {
9831 ret = xmlXPathParseNCName(ctxt);
9835 ret = xmlXPathParseNCName(ctxt);
9855xmlXPathParseName(xmlXPathParserContextPtr ctxt) {
9860 if ((ctxt ==
NULL) || (ctxt->cur ==
NULL))
return(
NULL);
9865 if (((*
in >= 0x61) && (*
in <= 0x7A)) ||
9866 ((*
in >= 0x41) && (*
in <= 0x5A)) ||
9867 (*
in ==
'_') || (*
in ==
':')) {
9869 while (((*
in >= 0x61) && (*
in <= 0x7A)) ||
9870 ((*
in >= 0x41) && (*
in <= 0x5A)) ||
9871 ((*
in >= 0x30) && (*
in <= 0x39)) ||
9872 (*
in ==
'_') || (*
in ==
'-') ||
9873 (*
in ==
':') || (*
in ==
'.'))
9875 if ((*
in > 0) && (*
in < 0x80)) {
9879 XP_ERRORNULL(XPATH_EXPR_ERROR);
9886 return(xmlXPathParseNameComplex(ctxt, 1));
9890xmlXPathParseNameComplex(xmlXPathParserContextPtr ctxt,
int qualified) {
9899 if ((
c ==
' ') || (
c ==
'>') || (
c ==
'/') ||
9900 (
c ==
'[') || (
c ==
']') || (
c ==
'@') ||
9903 ((!qualified) || (
c !=
':')))) {
9907 while ((
c !=
' ') && (
c !=
'>') && (
c !=
'/') &&
9909 (
c ==
'.') || (
c ==
'-') ||
9910 (
c ==
'_') || ((qualified) && (
c ==
':')) ||
9925 XP_ERRORNULL(XPATH_EXPR_ERROR);
9929 XP_ERRORNULL(XPATH_MEMORY_ERROR);
9933 (
c ==
'.') || (
c ==
'-') ||
9934 (
c ==
'_') || ((qualified) && (
c ==
':')) ||
9941 XP_ERRORNULL(XPATH_EXPR_ERROR);
9948 XP_ERRORNULL(XPATH_MEMORY_ERROR);
9990 int is_exponent_negative = 0;
9992 unsigned long tmp = 0;
9997 if ((*
cur !=
'.') && ((*
cur <
'0') || (*
cur >
'9')) && (*
cur !=
'-')) {
9998 return(xmlXPathNAN);
10011 while ((*
cur >=
'0') && (*
cur <=
'9')) {
10013 tmp = (*
cur -
'0');
10021 while ((*
cur >=
'0') && (*
cur <=
'9')) {
10030 double fraction = 0;
10033 if (((*
cur <
'0') || (*
cur >
'9')) && (!
ok)) {
10034 return(xmlXPathNAN);
10036 while (*
cur ==
'0') {
10043 fraction = fraction * 10 +
v;
10049 while ((*
cur >=
'0') && (*
cur <=
'9'))
10052 if ((*
cur ==
'e') || (*
cur ==
'E')) {
10055 is_exponent_negative = 1;
10057 }
else if (*
cur ==
'+') {
10060 while ((*
cur >=
'0') && (*
cur <=
'9')) {
10067 if (*
cur != 0)
return(xmlXPathNAN);
10086xmlXPathCompNumber(xmlXPathParserContextPtr ctxt)
10091 int is_exponent_negative = 0;
10092 xmlXPathObjectPtr
num;
10094 unsigned long tmp = 0;
10099 if ((
CUR !=
'.') && ((
CUR <
'0') || (
CUR >
'9'))) {
10100 XP_ERROR(XPATH_NUMBER_ERROR);
10108 while ((
CUR >=
'0') && (
CUR <=
'9')) {
10118 while ((
CUR >=
'0') && (
CUR <=
'9')) {
10126 double fraction = 0;
10129 if (((
CUR <
'0') || (
CUR >
'9')) && (!
ok)) {
10130 XP_ERROR(XPATH_NUMBER_ERROR);
10132 while (
CUR ==
'0') {
10139 fraction = fraction * 10 +
v;
10145 while ((
CUR >=
'0') && (
CUR <=
'9'))
10148 if ((
CUR ==
'e') || (
CUR ==
'E')) {
10151 is_exponent_negative = 1;
10153 }
else if (
CUR ==
'+') {
10156 while ((
CUR >=
'0') && (
CUR <=
'9')) {
10161 if (is_exponent_negative)
10165 num = xmlXPathCacheNewFloat(ctxt->context,
ret);
10167 ctxt->error = XPATH_MEMORY_ERROR;
10168 }
else if (PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_NUMBER, 0, 0,
num,
10170 xmlXPathReleaseObject(ctxt->context,
num);
10186xmlXPathParseLiteral(xmlXPathParserContextPtr ctxt) {
10196 XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR);
10201 }
else if (
CUR ==
'\'') {
10207 XP_ERRORNULL(XPATH_UNFINISHED_LITERAL_ERROR);
10213 XP_ERRORNULL(XPATH_START_LITERAL_ERROR);
10230xmlXPathCompLiteral(xmlXPathParserContextPtr ctxt) {
10233 xmlXPathObjectPtr lit;
10241 XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR);
10246 }
else if (
CUR ==
'\'') {
10252 XP_ERROR(XPATH_UNFINISHED_LITERAL_ERROR);
10258 XP_ERROR(XPATH_START_LITERAL_ERROR);
10261 lit = xmlXPathCacheNewString(ctxt->context,
ret);
10263 ctxt->error = XPATH_MEMORY_ERROR;
10264 }
else if (PUSH_LONG_EXPR(XPATH_OP_VALUE, XPATH_STRING, 0, 0, lit,
10266 xmlXPathReleaseObject(ctxt->context, lit);
10289xmlXPathCompVariableReference(xmlXPathParserContextPtr ctxt) {
10295 XP_ERROR(XPATH_VARIABLE_REF_ERROR);
10301 XP_ERROR(XPATH_VARIABLE_REF_ERROR);
10303 ctxt->comp->last = -1;
10304 if (PUSH_LONG_EXPR(XPATH_OP_VARIABLE, 0, 0, 0,
name,
prefix) == -1) {
10309 if ((ctxt->context !=
NULL) && (ctxt->context->flags & XML_XPATH_NOVAR)) {
10310 XP_ERROR(XPATH_FORBID_VARIABLE_ERROR);
10354xmlXPathCompFunctionCall(xmlXPathParserContextPtr ctxt) {
10363 XP_ERROR(XPATH_EXPR_ERROR);
10378 XP_ERROR(XPATH_EXPR_ERROR);
10391 ctxt->comp->last = -1;
10394 int op1 = ctxt->comp->last;
10395 ctxt->comp->last = -1;
10396 xmlXPathCompileExpr(ctxt,
sort);
10397 if (ctxt->error != XPATH_EXPRESSION_OK) {
10402 PUSH_BINARY_EXPR(XPATH_OP_ARG, op1, ctxt->comp->last, 0, 0);
10404 if (
CUR ==
')')
break;
10408 XP_ERROR(XPATH_EXPR_ERROR);
10414 if (PUSH_LONG_EXPR(XPATH_OP_FUNCTION, nbargs, 0, 0,
name,
prefix) == -1) {
10435xmlXPathCompPrimaryExpr(xmlXPathParserContextPtr ctxt) {
10437 if (
CUR ==
'$') xmlXPathCompVariableReference(ctxt);
10438 else if (
CUR ==
'(') {
10441 xmlXPathCompileExpr(ctxt, 1);
10444 XP_ERROR(XPATH_EXPR_ERROR);
10449 xmlXPathCompNumber(ctxt);
10450 }
else if ((
CUR ==
'\'') || (
CUR ==
'"')) {
10451 xmlXPathCompLiteral(ctxt);
10453 xmlXPathCompFunctionCall(ctxt);
10474xmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) {
10475 xmlXPathCompPrimaryExpr(ctxt);
10479 while (
CUR ==
'[') {
10480 xmlXPathCompPredicate(ctxt, 1);
10505xmlXPathScanName(xmlXPathParserContextPtr ctxt) {
10514 if ((
c ==
' ') || (
c ==
'>') || (
c ==
'/') ||
10520 while ((
c !=
' ') && (
c !=
'>') && (
c !=
'/') &&
10522 (
c ==
'.') || (
c ==
'-') ||
10523 (
c ==
'_') || (
c ==
':') ||
10553xmlXPathCompPathExpr(xmlXPathParserContextPtr ctxt) {
10558 if ((
CUR ==
'$') || (
CUR ==
'(') ||
10560 (
CUR ==
'\'') || (
CUR ==
'"') ||
10563 }
else if (
CUR ==
'*') {
10566 }
else if (
CUR ==
'/') {
10569 }
else if (
CUR ==
'@') {
10572 }
else if (
CUR ==
'.') {
10588 name = xmlXPathScanName(ctxt);
10592 "PathExpr: Axis\n");
10605 "PathExpr: AbbrRelLocation\n");
10612 }
else if (
NXT(
len) ==
':') {
10615 "PathExpr: AbbrRelLocation\n");
10619 }
else if ((
NXT(
len) ==
'(')) {
10621 if (xmlXPathIsNodeType(
name)) {
10624 "PathExpr: Type search\n");
10627#ifdef LIBXML_XPTR_LOCS_ENABLED
10628 }
else if (ctxt->xptr &&
10635 "PathExpr: function call\n");
10640 }
else if ((
NXT(
len) ==
'[')) {
10644 "PathExpr: AbbrRelLocation\n");
10661 "PathExpr: AbbrRelLocation\n");
10669 XP_ERROR(XPATH_EXPR_ERROR);
10675 PUSH_LEAVE_EXPR(XPATH_OP_ROOT, 0, 0);
10677 PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0);
10679 xmlXPathCompLocationPath(ctxt);
10681 xmlXPathCompFilterExpr(ctxt);
10683 if ((
CUR ==
'/') && (
NXT(1) ==
'/')) {
10687 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
10688 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
10690 xmlXPathCompRelativeLocationPath(ctxt);
10691 }
else if (
CUR ==
'/') {
10692 xmlXPathCompRelativeLocationPath(ctxt);
10709xmlXPathCompUnionExpr(xmlXPathParserContextPtr ctxt) {
10710 xmlXPathCompPathExpr(ctxt);
10713 while (
CUR ==
'|') {
10714 int op1 = ctxt->comp->last;
10715 PUSH_LEAVE_EXPR(XPATH_OP_NODE, 0, 0);
10719 xmlXPathCompPathExpr(ctxt);
10721 PUSH_BINARY_EXPR(XPATH_OP_UNION, op1, ctxt->comp->last, 0, 0);
10738xmlXPathCompUnaryExpr(xmlXPathParserContextPtr ctxt) {
10743 while (
CUR ==
'-') {
10750 xmlXPathCompUnionExpr(ctxt);
10754 PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 2, 0);
10756 PUSH_UNARY_EXPR(XPATH_OP_PLUS, ctxt->comp->last, 3, 0);
10774xmlXPathCompMultiplicativeExpr(xmlXPathParserContextPtr ctxt) {
10775 xmlXPathCompUnaryExpr(ctxt);
10778 while ((
CUR ==
'*') ||
10779 ((
CUR ==
'd') && (
NXT(1) ==
'i') && (
NXT(2) ==
'v')) ||
10780 ((
CUR ==
'm') && (
NXT(1) ==
'o') && (
NXT(2) ==
'd'))) {
10782 int op1 = ctxt->comp->last;
10787 }
else if (
CUR ==
'd') {
10790 }
else if (
CUR ==
'm') {
10795 xmlXPathCompUnaryExpr(ctxt);
10797 PUSH_BINARY_EXPR(XPATH_OP_MULT, op1, ctxt->comp->last,
op, 0);
10814xmlXPathCompAdditiveExpr(xmlXPathParserContextPtr ctxt) {
10816 xmlXPathCompMultiplicativeExpr(ctxt);
10819 while ((
CUR ==
'+') || (
CUR ==
'-')) {
10821 int op1 = ctxt->comp->last;
10827 xmlXPathCompMultiplicativeExpr(ctxt);
10829 PUSH_BINARY_EXPR(XPATH_OP_PLUS, op1, ctxt->comp->last,
plus, 0);
10853xmlXPathCompRelationalExpr(xmlXPathParserContextPtr ctxt) {
10854 xmlXPathCompAdditiveExpr(ctxt);
10857 while ((
CUR ==
'<') || (
CUR ==
'>')) {
10859 int op1 = ctxt->comp->last;
10861 if (
CUR ==
'<') inf = 1;
10868 xmlXPathCompAdditiveExpr(ctxt);
10870 PUSH_BINARY_EXPR(XPATH_OP_CMP, op1, ctxt->comp->last, inf,
strict);
10892xmlXPathCompEqualityExpr(xmlXPathParserContextPtr ctxt) {
10893 xmlXPathCompRelationalExpr(ctxt);
10896 while ((
CUR ==
'=') || ((
CUR ==
'!') && (
NXT(1) ==
'='))) {
10898 int op1 = ctxt->comp->last;
10900 if (
CUR ==
'=')
eq = 1;
10905 xmlXPathCompRelationalExpr(ctxt);
10907 PUSH_BINARY_EXPR(XPATH_OP_EQUAL, op1, ctxt->comp->last,
eq, 0);
10923xmlXPathCompAndExpr(xmlXPathParserContextPtr ctxt) {
10924 xmlXPathCompEqualityExpr(ctxt);
10927 while ((
CUR ==
'a') && (
NXT(1) ==
'n') && (
NXT(2) ==
'd')) {
10928 int op1 = ctxt->comp->last;
10931 xmlXPathCompEqualityExpr(ctxt);
10933 PUSH_BINARY_EXPR(XPATH_OP_AND, op1, ctxt->comp->last, 0, 0);
10949xmlXPathCompileExpr(xmlXPathParserContextPtr ctxt,
int sort) {
10950 xmlXPathContextPtr xpctxt = ctxt->context;
10952 if (xpctxt !=
NULL) {
10954 XP_ERROR(XPATH_RECURSION_LIMIT_EXCEEDED);
10959 xpctxt->depth += 10;
10962 xmlXPathCompAndExpr(ctxt);
10965 while ((
CUR ==
'o') && (
NXT(1) ==
'r')) {
10966 int op1 = ctxt->comp->last;
10969 xmlXPathCompAndExpr(ctxt);
10971 PUSH_BINARY_EXPR(XPATH_OP_OR, op1, ctxt->comp->last, 0, 0);
10974 if ((
sort) && (ctxt->comp->steps[ctxt->comp->last].op != XPATH_OP_VALUE)) {
10981 PUSH_UNARY_EXPR(XPATH_OP_SORT, ctxt->comp->last , 0, 0);
10984 if (xpctxt !=
NULL)
10985 xpctxt->depth -= 10;
10999xmlXPathCompPredicate(xmlXPathParserContextPtr ctxt,
int filter) {
11000 int op1 = ctxt->comp->last;
11004 XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
11009 ctxt->comp->last = -1;
11020 xmlXPathCompileExpr(ctxt, 0);
11022 xmlXPathCompileExpr(ctxt, 1);
11026 XP_ERROR(XPATH_INVALID_PREDICATE_ERROR);
11030 PUSH_BINARY_EXPR(XPATH_OP_FILTER, op1, ctxt->comp->last, 0, 0);
11032 PUSH_BINARY_EXPR(XPATH_OP_PREDICATE, op1, ctxt->comp->last, 0, 0);
11060xmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *
test,
11069 *
type = (xmlXPathTypeVal) 0;
11070 *
test = (xmlXPathTestVal) 0;
11079 *
test = NODE_TEST_ALL;
11084 name = xmlXPathParseNCName(ctxt);
11086 XP_ERRORNULL(XPATH_EXPR_ERROR);
11097 *
type = NODE_TYPE_COMMENT;
11099 *
type = NODE_TYPE_NODE;
11101 *
type = NODE_TYPE_PI;
11103 *
type = NODE_TYPE_TEXT;
11107 XP_ERRORNULL(XPATH_EXPR_ERROR);
11110 *
test = NODE_TEST_TYPE;
11113 if (*
type == NODE_TYPE_PI) {
11121 name = xmlXPathParseLiteral(ctxt);
11123 XP_ERRORNULL(XPATH_EXPR_ERROR);
11125 *
test = NODE_TEST_PI;
11132 XP_ERRORNULL(XPATH_UNCLOSED_ERROR);
11137 *
test = NODE_TEST_NAME;
11138 if ((!blanks) && (
CUR ==
':')) {
11149 *
prefix = xmlXPathNsLookup(ctxt->context,
name);
11153 XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR);
11164 *
test = NODE_TEST_ALL;
11168 name = xmlXPathParseNCName(ctxt);
11170 XP_ERRORNULL(XPATH_EXPR_ERROR);
11196static xmlXPathAxisVal
11198 xmlXPathAxisVal
ret = (xmlXPathAxisVal) 0;
11202 ret = AXIS_ANCESTOR;
11204 ret = AXIS_ANCESTOR_OR_SELF;
11214 ret = AXIS_DESCENDANT;
11216 ret = AXIS_DESCENDANT_OR_SELF;
11220 ret = AXIS_FOLLOWING;
11222 ret = AXIS_FOLLOWING_SIBLING;
11226 ret = AXIS_NAMESPACE;
11232 ret = AXIS_PRECEDING;
11234 ret = AXIS_PRECEDING_SIBLING;
11277xmlXPathCompStep(xmlXPathParserContextPtr ctxt) {
11278#ifdef LIBXML_XPTR_LOCS_ENABLED
11284 if ((
CUR ==
'.') && (
NXT(1) ==
'.')) {
11287 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_PARENT,
11288 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
11289 }
else if (
CUR ==
'.') {
11295 xmlXPathTestVal
test = (xmlXPathTestVal) 0;
11296 xmlXPathAxisVal axis = (xmlXPathAxisVal) 0;
11297 xmlXPathTypeVal
type = (xmlXPathTypeVal) 0;
11303#ifdef LIBXML_XPTR_LOCS_ENABLED
11305 name = xmlXPathParseNCName(ctxt);
11307 op2 = ctxt->comp->last;
11311 XP_ERROR(XPATH_EXPR_ERROR);
11316 xmlXPathCompileExpr(ctxt, 1);
11322 XP_ERROR(XPATH_EXPR_ERROR);
11326 goto eval_predicates;
11334 name = xmlXPathParseNCName(ctxt);
11336 axis = xmlXPathIsAxisName(
name);
11339 if ((
CUR ==
':') && (
NXT(1) ==
':')) {
11350 }
else if (
CUR ==
'@') {
11358 if (ctxt->error != XPATH_EXPRESSION_OK) {
11368 (ctxt->context->flags & XML_XPATH_CHECKNS)) {
11369 if (xmlXPathNsLookup(ctxt->context,
prefix) ==
NULL) {
11370 xmlXPathErr(ctxt, XPATH_UNDEF_PREFIX_ERROR);
11375 "Basis : computing new set\n");
11380 if (ctxt->value ==
NULL)
11382 else if (ctxt->value->nodesetval ==
NULL)
11385 xmlGenericErrorContextNodeSet(
stdout, ctxt->
value->nodesetval);
11388#ifdef LIBXML_XPTR_LOCS_ENABLED
11391 op1 = ctxt->comp->last;
11392 ctxt->comp->last = -1;
11395 while (
CUR ==
'[') {
11396 xmlXPathCompPredicate(ctxt, 0);
11399#ifdef LIBXML_XPTR_LOCS_ENABLED
11401 PUSH_BINARY_EXPR(XPATH_OP_RANGETO, op2, op1, 0, 0);
11404 if (PUSH_FULL_EXPR(XPATH_OP_COLLECT, op1, ctxt->comp->last, axis,
11412 if (ctxt->value ==
NULL)
11414 else if (ctxt->value->nodesetval ==
NULL)
11418 ctxt->value->nodesetval);
11434xmlXPathCompRelativeLocationPath
11435(xmlXPathParserContextPtr ctxt) {
11437 if ((
CUR ==
'/') && (
NXT(1) ==
'/')) {
11440 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
11441 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
11442 }
else if (
CUR ==
'/') {
11446 xmlXPathCompStep(ctxt);
11449 while (
CUR ==
'/') {
11450 if ((
CUR ==
'/') && (
NXT(1) ==
'/')) {
11453 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
11454 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
11455 xmlXPathCompStep(ctxt);
11456 }
else if (
CUR ==
'/') {
11459 xmlXPathCompStep(ctxt);
11487xmlXPathCompLocationPath(xmlXPathParserContextPtr ctxt) {
11490 xmlXPathCompRelativeLocationPath(ctxt);
11492 while (
CUR ==
'/') {
11493 if ((
CUR ==
'/') && (
NXT(1) ==
'/')) {
11496 PUSH_LONG_EXPR(XPATH_OP_COLLECT, AXIS_DESCENDANT_OR_SELF,
11497 NODE_TEST_TYPE, NODE_TYPE_NODE,
NULL,
NULL);
11498 xmlXPathCompRelativeLocationPath(ctxt);
11499 }
else if (
CUR ==
'/') {
11504 (
CUR ==
'@') || (
CUR ==
'*')))
11505 xmlXPathCompRelativeLocationPath(ctxt);
11519xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr
op);
11523xmlXPathDebugDumpStepAxis(xmlXPathStepOpPtr
op,
11527 switch (
op->value) {
11528 case AXIS_ANCESTOR:
11531 case AXIS_ANCESTOR_OR_SELF:
11533 "axis 'ancestors-or-self' ");
11541 case AXIS_DESCENDANT:
11544 case AXIS_DESCENDANT_OR_SELF:
11546 "axis 'descendant-or-self' ");
11548 case AXIS_FOLLOWING:
11551 case AXIS_FOLLOWING_SIBLING:
11553 "axis 'following-siblings' ");
11555 case AXIS_NAMESPACE:
11561 case AXIS_PRECEDING:
11564 case AXIS_PRECEDING_SIBLING:
11566 "axis 'preceding-sibling' ");
11573 " context contains %d nodes\n", nbNodes);
11574 switch (
op->value2) {
11575 case NODE_TEST_NONE:
11577 " searching for none !!!\n");
11579 case NODE_TEST_TYPE:
11581 " searching for type %d\n",
op->value3);
11585 " searching for PI !!!\n");
11587 case NODE_TEST_ALL:
11589 " searching for *\n");
11593 " searching for namespace %s\n",
11596 case NODE_TEST_NAME:
11598 " searching for name %s\n",
op->value5);
11601 " with namespace %s\n",
op->value4);
11622xmlXPathNodeSetFilter(xmlXPathParserContextPtr ctxt,
11625 int minPos,
int maxPos,
11628 xmlXPathContextPtr xpctxt;
11631 xmlXPathStepOpPtr filterOp;
11642 if (
set->nodeNr < minPos) {
11643 xmlXPathNodeSetClear(
set, hasNsNodes);
11647 xpctxt = ctxt->context;
11648 oldnode = xpctxt->node;
11649 olddoc = xpctxt->
doc;
11650 oldcs = xpctxt->contextSize;
11651 oldpp = xpctxt->proximityPosition;
11652 filterOp = &ctxt->comp->steps[filterOpIndex];
11654 xpctxt->contextSize =
set->nodeNr;
11656 for (
i = 0,
j = 0,
pos = 1;
i <
set->nodeNr;
i++) {
11660 xpctxt->node =
node;
11661 xpctxt->proximityPosition =
i + 1;
11671 xpctxt->doc =
node->doc;
11673 res = xmlXPathCompOpEvalToBoolean(ctxt, filterOp, 1);
11675 if (ctxt->error != XPATH_EXPRESSION_OK)
11679 xmlXPathErr(ctxt, XPATH_EXPR_ERROR);
11683 if ((
res != 0) && ((
pos >= minPos) && (
pos <= maxPos))) {
11698 if (
pos == maxPos) {
11709 for (;
i <
set->nodeNr;
i++) {
11719 if ((
set->nodeMax > XML_NODESET_DEFAULT) &&
11720 (
set->nodeNr <
set->nodeMax / 2)) {
11722 int nodeMax =
set->nodeNr;
11724 if (nodeMax < XML_NODESET_DEFAULT)
11725 nodeMax = XML_NODESET_DEFAULT;
11729 xmlXPathPErrMemory(ctxt,
"shrinking nodeset\n");
11731 set->nodeTab = tmp;
11732 set->nodeMax = nodeMax;
11736 xpctxt->node = oldnode;
11737 xpctxt->
doc = olddoc;
11738 xpctxt->contextSize = oldcs;
11739 xpctxt->proximityPosition = oldpp;
11742#ifdef LIBXML_XPTR_LOCS_ENABLED
11756xmlXPathLocationSetFilter(xmlXPathParserContextPtr ctxt,
11757 xmlLocationSetPtr locset,
11759 int minPos,
int maxPos)
11761 xmlXPathContextPtr xpctxt;
11764 xmlXPathStepOpPtr filterOp;
11768 if ((locset ==
NULL) || (locset->locNr == 0) || (filterOpIndex == -1))
11771 xpctxt = ctxt->context;
11772 oldnode = xpctxt->node;
11773 olddoc = xpctxt->
doc;
11774 oldcs = xpctxt->contextSize;
11775 oldpp = xpctxt->proximityPosition;
11776 filterOp = &ctxt->comp->steps[filterOpIndex];
11778 xpctxt->contextSize = locset->locNr;
11780 for (
i = 0,
j = 0,
pos = 1;
i < locset->locNr;
i++) {
11781 xmlNodePtr contextNode = locset->locTab[
i]->user;
11784 xpctxt->node = contextNode;
11785 xpctxt->proximityPosition =
i + 1;
11795 xpctxt->doc = contextNode->
doc;
11797 res = xmlXPathCompOpEvalToBoolean(ctxt, filterOp, 1);
11799 if (ctxt->error != XPATH_EXPRESSION_OK)
11803 xmlXPathErr(ctxt, XPATH_EXPR_ERROR);
11807 if ((
res != 0) && ((
pos >= minPos) && (
pos <= maxPos))) {
11809 locset->locTab[
j] = locset->locTab[
i];
11810 locset->locTab[
i] =
NULL;
11816 xmlXPathFreeObject(locset->locTab[
i]);
11817 locset->locTab[
i] =
NULL;
11821 if (
pos == maxPos) {
11831 for (;
i < locset->locNr;
i++)
11832 xmlXPathFreeObject(locset->locTab[
i]);
11837 if ((locset->locMax > XML_NODESET_DEFAULT) &&
11838 (locset->locNr < locset->locMax / 2)) {
11839 xmlXPathObjectPtr *tmp;
11840 int locMax = locset->locNr;
11842 if (locMax < XML_NODESET_DEFAULT)
11843 locMax = XML_NODESET_DEFAULT;
11844 tmp = (xmlXPathObjectPtr *)
xmlRealloc(locset->locTab,
11845 locMax *
sizeof(xmlXPathObjectPtr));
11847 xmlXPathPErrMemory(ctxt,
"shrinking locset\n");
11849 locset->locTab = tmp;
11850 locset->locMax = locMax;
11854 xpctxt->node = oldnode;
11855 xpctxt->
doc = olddoc;
11856 xpctxt->contextSize = oldcs;
11857 xpctxt->proximityPosition = oldpp;
11875xmlXPathCompOpEvalPredicate(xmlXPathParserContextPtr ctxt,
11876 xmlXPathStepOpPtr
op,
11878 int minPos,
int maxPos,
11881 if (
op->ch1 != -1) {
11882 xmlXPathCompExprPtr comp = ctxt->comp;
11886 if (comp->steps[
op->ch1].op != XPATH_OP_PREDICATE) {
11888 "xmlXPathCompOpEvalPredicate: Expected a predicate\n");
11889 XP_ERROR(XPATH_INVALID_OPERAND);
11892 XP_ERROR(XPATH_RECURSION_LIMIT_EXCEEDED);
11893 ctxt->context->depth += 1;
11894 xmlXPathCompOpEvalPredicate(ctxt, &comp->steps[
op->ch1],
set,
11895 1,
set->nodeNr, hasNsNodes);
11896 ctxt->context->depth -= 1;
11901 xmlXPathNodeSetFilter(ctxt,
set,
op->ch2, minPos, maxPos, hasNsNodes);
11905xmlXPathIsPositionalPredicate(xmlXPathParserContextPtr ctxt,
11906 xmlXPathStepOpPtr
op,
11910 xmlXPathStepOpPtr exprOp;
11925 if ((
op->op != XPATH_OP_PREDICATE) && (
op->op != XPATH_OP_FILTER))
11928 if (
op->ch2 != -1) {
11929 exprOp = &ctxt->comp->steps[
op->ch2];
11933 if ((exprOp !=
NULL) &&
11934 (exprOp->op == XPATH_OP_VALUE) &&
11935 (exprOp->value4 !=
NULL) &&
11936 (((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER))
11938 double floatval = ((xmlXPathObjectPtr) exprOp->value4)->floatval;
11952 *maxPos = (
int) floatval;
11953 if (floatval == (
double) *maxPos)
11961xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
11962 xmlXPathStepOpPtr
op,
11967#define XP_TEST_HIT \
11968 if (hasAxisRange != 0) { \
11969 if (++pos == maxPos) { \
11970 if (addNode(seq, cur) < 0) \
11971 ctxt->error = XPATH_MEMORY_ERROR; \
11972 goto axis_range_end; } \
11974 if (addNode(seq, cur) < 0) \
11975 ctxt->error = XPATH_MEMORY_ERROR; \
11976 if (breakOnFirstHit) goto first_hit; }
11978#define XP_TEST_HIT_NS \
11979 if (hasAxisRange != 0) { \
11980 if (++pos == maxPos) { \
11982 if (xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur) < 0) \
11983 ctxt->error = XPATH_MEMORY_ERROR; \
11984 goto axis_range_end; } \
11987 if (xmlXPathNodeSetAddNs(seq, xpctxt->node, (xmlNsPtr) cur) < 0) \
11988 ctxt->error = XPATH_MEMORY_ERROR; \
11989 if (breakOnFirstHit) goto first_hit; }
11991 xmlXPathAxisVal axis = (xmlXPathAxisVal)
op->value;
11992 xmlXPathTestVal
test = (xmlXPathTestVal)
op->value2;
11993 xmlXPathTypeVal
type = (xmlXPathTypeVal)
op->value3;
11999 int nbMatches = 0, prevMatches = 0;
12001 int total = 0, hasNsNodes = 0;
12003 xmlXPathObjectPtr
obj;
12005 xmlNodeSetPtr contextSeq;
12009 xmlNodeSetPtr outSeq;
12017 xmlXPathStepOpPtr predOp;
12019 int hasPredicateRange, hasAxisRange,
pos;
12020 int breakOnFirstHit;
12022 xmlXPathTraversalFunction
next =
NULL;
12024 xmlXPathNodeSetMergeFunction mergeAndClear;
12026 xmlXPathContextPtr xpctxt = ctxt->context;
12029 CHECK_TYPE0(XPATH_NODESET);
12030 obj = valuePop(ctxt);
12035 URI = xmlXPathNsLookup(xpctxt,
prefix);
12037 xmlXPathReleaseObject(xpctxt,
obj);
12038 XP_ERROR0(XPATH_UNDEF_PREFIX_ERROR);
12054 mergeAndClear = xmlXPathNodeSetMergeAndClear;
12056 case AXIS_ANCESTOR:
12058 next = xmlXPathNextAncestor;
12060 case AXIS_ANCESTOR_OR_SELF:
12062 next = xmlXPathNextAncestorOrSelf;
12067 next = xmlXPathNextAttribute;
12068 mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12072 if (((
test == NODE_TEST_NAME) || (
test == NODE_TEST_ALL)) &&
12073 (
type == NODE_TYPE_NODE))
12078 next = xmlXPathNextChildElement;
12080 next = xmlXPathNextChild;
12081 mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12083 case AXIS_DESCENDANT:
12085 next = xmlXPathNextDescendant;
12087 case AXIS_DESCENDANT_OR_SELF:
12089 next = xmlXPathNextDescendantOrSelf;
12091 case AXIS_FOLLOWING:
12093 next = xmlXPathNextFollowing;
12095 case AXIS_FOLLOWING_SIBLING:
12097 next = xmlXPathNextFollowingSibling;
12099 case AXIS_NAMESPACE:
12102 next = (xmlXPathTraversalFunction) xmlXPathNextNamespace;
12103 mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12107 next = xmlXPathNextParent;
12109 case AXIS_PRECEDING:
12111 next = xmlXPathNextPrecedingInternal;
12113 case AXIS_PRECEDING_SIBLING:
12115 next = xmlXPathNextPrecedingSibling;
12120 next = xmlXPathNextSelf;
12121 mergeAndClear = xmlXPathNodeSetMergeAndClearNoDupls;
12126 xmlXPathDebugDumpStepAxis(
op,
12127 (
obj->nodesetval !=
NULL) ?
obj->nodesetval->nodeNr : 0);
12131 xmlXPathReleaseObject(xpctxt,
obj);
12134 contextSeq =
obj->nodesetval;
12135 if ((contextSeq ==
NULL) || (contextSeq->nodeNr <= 0)) {
12136 xmlXPathReleaseObject(xpctxt,
obj);
12137 valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt,
NULL));
12160 hasPredicateRange = 0;
12162 if (
op->ch2 != -1) {
12166 predOp = &ctxt->comp->steps[
op->ch2];
12167 if (xmlXPathIsPositionalPredicate(ctxt, predOp, &maxPos)) {
12168 if (predOp->ch1 != -1) {
12172 predOp = &ctxt->comp->steps[predOp->ch1];
12173 hasPredicateRange = 1;
12183 breakOnFirstHit = ((toBool) && (predOp ==
NULL)) ? 1 : 0;
12197 oldContextNode = xpctxt->node;
12198 addNode = xmlXPathNodeSetAddUnique;
12201 contextNode =
NULL;
12205 while (((contextIdx < contextSeq->nodeNr) || (contextNode !=
NULL)) &&
12206 (ctxt->error == XPATH_EXPRESSION_OK)) {
12207 xpctxt->node = contextSeq->nodeTab[contextIdx++];
12210 seq = xmlXPathNodeSetCreate(
NULL);
12224 if (OP_LIMIT_EXCEEDED(ctxt, 1))
12237 if (((
total % 256) == 0) &&
12241 (xmlXPathCmpNodes(*
first,
cur) >= 0))
12250 if (((
total % 256) == 0) &&
12254 (xmlXPathCmpNodes(
cur, *
last) >= 0))
12268 case NODE_TEST_NONE:
12272 case NODE_TEST_TYPE:
12273 if (
type == NODE_TYPE_NODE) {
12274 switch (
cur->type) {
12286 if (axis == AXIS_NAMESPACE) {
12302 }
else if ((
type == NODE_TYPE_TEXT) &&
12315 case NODE_TEST_ALL:
12322 }
else if ((
cur->ns !=
NULL) &&
12328 }
else if (axis == AXIS_NAMESPACE) {
12339 }
else if ((
cur->ns !=
NULL) &&
12347 case NODE_TEST_NS:{
12351 case NODE_TEST_NAME:
12355 }
else if (axis == AXIS_NAMESPACE) {
12362 switch (
cur->type) {
12416 }
while ((
cur !=
NULL) && (ctxt->error == XPATH_EXPRESSION_OK));
12418 goto apply_predicates;
12427 if (outSeq ==
NULL) {
12432 outSeq = mergeAndClear(outSeq, seq);
12445 if (outSeq ==
NULL) {
12450 outSeq = mergeAndClear(outSeq, seq);
12455 nbMatches += seq->nodeNr;
12459 if (ctxt->error != XPATH_EXPRESSION_OK)
12465 if ((predOp !=
NULL) && (seq->nodeNr > 0)) {
12494 if (hasPredicateRange != 0)
12495 xmlXPathCompOpEvalPredicate(ctxt, predOp, seq, maxPos, maxPos,
12498 xmlXPathCompOpEvalPredicate(ctxt, predOp, seq, 1, seq->nodeNr,
12501 if (ctxt->error != XPATH_EXPRESSION_OK) {
12507 if (seq->nodeNr > 0) {
12511 if (outSeq ==
NULL) {
12516 outSeq = mergeAndClear(outSeq, seq);
12525 if ((
obj->boolval) && (
obj->user !=
NULL)) {
12531 ctxt->
value->boolval = 1;
12532 ctxt->value->user =
obj->user;
12536 xmlXPathReleaseObject(xpctxt,
obj);
12541 if (outSeq ==
NULL) {
12542 if ((seq !=
NULL) && (seq->nodeNr == 0))
12546 outSeq = xmlXPathNodeSetCreate(
NULL);
12548 if ((seq !=
NULL) && (seq != outSeq)) {
12549 xmlXPathFreeNodeSet(seq);
12555 valuePush(ctxt, xmlXPathCacheWrapNodeSet(xpctxt, outSeq));
12559 xpctxt->node = oldContextNode;
12564 if (xpctxt->tmpNsList !=
NULL) {
12566 xpctxt->tmpNsList =
NULL;
12571 "\nExamined %d nodes, found %d nodes at that step\n",
12579xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt,
12594xmlXPathCompOpEvalFirst(xmlXPathParserContextPtr ctxt,
12598 xmlXPathCompExprPtr comp;
12602 if (OP_LIMIT_EXCEEDED(ctxt, 1))
12605 XP_ERROR0(XPATH_RECURSION_LIMIT_EXCEEDED);
12606 ctxt->context->depth += 1;
12611 case XPATH_OP_UNION:
12613 xmlXPathCompOpEvalFirst(ctxt, &comp->steps[
op->ch1],
12616 if ((ctxt->value !=
NULL)
12617 && (ctxt->value->type == XPATH_NODESET)
12618 && (ctxt->value->nodesetval !=
NULL)
12619 && (ctxt->value->nodesetval->nodeNr >= 1)) {
12630 if (ctxt->value->nodesetval->nodeNr > 1)
12631 xmlXPathNodeSetSort(ctxt->value->nodesetval);
12632 *
first = ctxt->value->nodesetval->nodeTab[0];
12635 xmlXPathCompOpEvalFirst(ctxt, &comp->steps[
op->ch2],
12639 arg2 = valuePop(ctxt);
12640 arg1 = valuePop(ctxt);
12641 if ((
arg1 ==
NULL) || (
arg1->type != XPATH_NODESET) ||
12643 xmlXPathReleaseObject(ctxt->context,
arg1);
12644 xmlXPathReleaseObject(ctxt->context,
arg2);
12645 XP_ERROR0(XPATH_INVALID_TYPE);
12647 if ((ctxt->context->opLimit != 0) &&
12649 (xmlXPathCheckOpLimit(ctxt,
12650 arg1->nodesetval->nodeNr) < 0)) ||
12652 (xmlXPathCheckOpLimit(ctxt,
12653 arg2->nodesetval->nodeNr) < 0)))) {
12654 xmlXPathReleaseObject(ctxt->context,
arg1);
12655 xmlXPathReleaseObject(ctxt->context,
arg2);
12660 arg1->nodesetval = xmlXPathNodeSetMerge(
arg1->nodesetval,
12662 valuePush(ctxt,
arg1);
12663 xmlXPathReleaseObject(ctxt->context,
arg2);
12666 xmlXPathCompSwap(
op);
12669 case XPATH_OP_ROOT:
12670 xmlXPathRoot(ctxt);
12672 case XPATH_OP_NODE:
12674 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12677 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12679 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
12680 ctxt->context->node));
12682 case XPATH_OP_COLLECT:{
12686 total = xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12692 case XPATH_OP_VALUE:
12694 xmlXPathCacheObjectCopy(ctxt->context,
12695 (xmlXPathObjectPtr)
op->value4));
12697 case XPATH_OP_SORT:
12700 xmlXPathCompOpEvalFirst(ctxt, &comp->steps[
op->ch1],
12703 if ((ctxt->value !=
NULL)
12704 && (ctxt->value->type == XPATH_NODESET)
12705 && (ctxt->value->nodesetval !=
NULL)
12706 && (ctxt->value->nodesetval->nodeNr > 1))
12707 xmlXPathNodeSetSort(ctxt->value->nodesetval);
12709#ifdef XP_OPTIMIZED_FILTER_FIRST
12710 case XPATH_OP_FILTER:
12711 total += xmlXPathCompOpEvalFilterFirst(ctxt,
op,
first);
12715 total += xmlXPathCompOpEval(ctxt,
op);
12719 ctxt->context->depth -= 1;
12735xmlXPathCompOpEvalLast(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr
op,
12739 xmlXPathCompExprPtr comp;
12743 if (OP_LIMIT_EXCEEDED(ctxt, 1))
12746 XP_ERROR0(XPATH_RECURSION_LIMIT_EXCEEDED);
12747 ctxt->context->depth += 1;
12752 case XPATH_OP_UNION:
12754 xmlXPathCompOpEvalLast(ctxt, &comp->steps[
op->ch1],
last);
12756 if ((ctxt->value !=
NULL)
12757 && (ctxt->value->type == XPATH_NODESET)
12758 && (ctxt->value->nodesetval !=
NULL)
12759 && (ctxt->value->nodesetval->nodeNr >= 1)) {
12763 if (ctxt->value->nodesetval->nodeNr > 1)
12764 xmlXPathNodeSetSort(ctxt->value->nodesetval);
12766 ctxt->value->nodesetval->nodeTab[ctxt->value->
12767 nodesetval->nodeNr -
12771 xmlXPathCompOpEvalLast(ctxt, &comp->steps[
op->ch2],
last);
12773 if ((ctxt->value !=
NULL)
12774 && (ctxt->value->type == XPATH_NODESET)
12775 && (ctxt->value->nodesetval !=
NULL)
12776 && (ctxt->value->nodesetval->nodeNr >= 1)) {
12779 arg2 = valuePop(ctxt);
12780 arg1 = valuePop(ctxt);
12781 if ((
arg1 ==
NULL) || (
arg1->type != XPATH_NODESET) ||
12783 xmlXPathReleaseObject(ctxt->context,
arg1);
12784 xmlXPathReleaseObject(ctxt->context,
arg2);
12785 XP_ERROR0(XPATH_INVALID_TYPE);
12787 if ((ctxt->context->opLimit != 0) &&
12789 (xmlXPathCheckOpLimit(ctxt,
12790 arg1->nodesetval->nodeNr) < 0)) ||
12792 (xmlXPathCheckOpLimit(ctxt,
12793 arg2->nodesetval->nodeNr) < 0)))) {
12794 xmlXPathReleaseObject(ctxt->context,
arg1);
12795 xmlXPathReleaseObject(ctxt->context,
arg2);
12800 arg1->nodesetval = xmlXPathNodeSetMerge(
arg1->nodesetval,
12802 valuePush(ctxt,
arg1);
12803 xmlXPathReleaseObject(ctxt->context,
arg2);
12806 xmlXPathCompSwap(
op);
12809 case XPATH_OP_ROOT:
12810 xmlXPathRoot(ctxt);
12812 case XPATH_OP_NODE:
12814 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12817 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12819 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
12820 ctxt->context->node));
12822 case XPATH_OP_COLLECT:{
12826 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12832 case XPATH_OP_VALUE:
12834 xmlXPathCacheObjectCopy(ctxt->context,
12835 (xmlXPathObjectPtr)
op->value4));
12837 case XPATH_OP_SORT:
12840 xmlXPathCompOpEvalLast(ctxt, &comp->steps[
op->ch1],
12843 if ((ctxt->value !=
NULL)
12844 && (ctxt->value->type == XPATH_NODESET)
12845 && (ctxt->value->nodesetval !=
NULL)
12846 && (ctxt->value->nodesetval->nodeNr > 1))
12847 xmlXPathNodeSetSort(ctxt->value->nodesetval);
12850 total += xmlXPathCompOpEval(ctxt,
op);
12854 ctxt->context->depth -= 1;
12858#ifdef XP_OPTIMIZED_FILTER_FIRST
12860xmlXPathCompOpEvalFilterFirst(xmlXPathParserContextPtr ctxt,
12864 xmlXPathCompExprPtr comp;
12872 if ((
op->ch1 != -1) && (
op->ch2 != -1) &&
12873 (comp->steps[
op->ch1].op == XPATH_OP_SORT) &&
12874 (comp->steps[
op->ch2].op == XPATH_OP_SORT)) {
12875 int f = comp->steps[
op->ch2].ch1;
12878 (comp->steps[
f].op == XPATH_OP_FUNCTION) &&
12879 (comp->steps[
f].value5 ==
NULL) &&
12880 (comp->steps[
f].value == 0) &&
12881 (comp->steps[
f].value4 !=
NULL) &&
12883 (comp->steps[
f].value4,
BAD_CAST "last"))) {
12887 xmlXPathCompOpEvalLast(ctxt,
12888 &comp->steps[
op->ch1],
12895 if ((ctxt->value !=
NULL) &&
12896 (ctxt->value->type == XPATH_NODESET) &&
12897 (ctxt->value->nodesetval !=
NULL) &&
12898 (ctxt->value->nodesetval->nodeTab !=
NULL) &&
12899 (ctxt->value->nodesetval->nodeNr > 1)) {
12900 xmlXPathNodeSetKeepLast(ctxt->value->nodesetval);
12901 *
first = *(ctxt->value->nodesetval->nodeTab);
12908 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12912 if (ctxt->value ==
NULL)
12915#ifdef LIBXML_XPTR_LOCS_ENABLED
12919 if (ctxt->value->type == XPATH_LOCATIONSET) {
12920 xmlLocationSetPtr locset = ctxt->value->user;
12922 if (locset !=
NULL) {
12923 xmlXPathLocationSetFilter(ctxt, locset,
op->ch2, 1, 1);
12924 if (locset->locNr > 0)
12932 CHECK_TYPE0(XPATH_NODESET);
12933 set = ctxt->value->nodesetval;
12935 xmlXPathNodeSetFilter(ctxt,
set,
op->ch2, 1, 1, 1);
12936 if (
set->nodeNr > 0)
12953xmlXPathCompOpEval(xmlXPathParserContextPtr ctxt, xmlXPathStepOpPtr
op)
12957 xmlXPathCompExprPtr comp;
12961 if (OP_LIMIT_EXCEEDED(ctxt, 1))
12964 XP_ERROR0(XPATH_RECURSION_LIMIT_EXCEEDED);
12965 ctxt->context->depth += 1;
12971 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12973 xmlXPathBooleanFunction(ctxt, 1);
12974 if ((ctxt->value ==
NULL) || (ctxt->value->boolval == 0))
12976 arg2 = valuePop(ctxt);
12977 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12979 xmlXPathFreeObject(
arg2);
12982 xmlXPathBooleanFunction(ctxt, 1);
12983 if (ctxt->value !=
NULL)
12984 ctxt->value->boolval &=
arg2->boolval;
12985 xmlXPathReleaseObject(ctxt->context,
arg2);
12988 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
12990 xmlXPathBooleanFunction(ctxt, 1);
12991 if ((ctxt->value ==
NULL) || (ctxt->value->boolval == 1))
12993 arg2 = valuePop(ctxt);
12994 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
12996 xmlXPathFreeObject(
arg2);
12999 xmlXPathBooleanFunction(ctxt, 1);
13000 if (ctxt->value !=
NULL)
13001 ctxt->value->boolval |=
arg2->boolval;
13002 xmlXPathReleaseObject(ctxt->context,
arg2);
13004 case XPATH_OP_EQUAL:
13005 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13007 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
13010 equal = xmlXPathEqualValues(ctxt);
13012 equal = xmlXPathNotEqualValues(ctxt);
13013 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context,
equal));
13016 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13018 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
13020 ret = xmlXPathCompareValues(ctxt,
op->value,
op->value2);
13021 valuePush(ctxt, xmlXPathCacheNewBoolean(ctxt->context,
ret));
13023 case XPATH_OP_PLUS:
13024 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13026 if (
op->ch2 != -1) {
13027 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
13030 if (
op->value == 0)
13031 xmlXPathSubValues(ctxt);
13032 else if (
op->value == 1)
13033 xmlXPathAddValues(ctxt);
13034 else if (
op->value == 2)
13035 xmlXPathValueFlipSign(ctxt);
13036 else if (
op->value == 3) {
13038 CHECK_TYPE0(XPATH_NUMBER);
13041 case XPATH_OP_MULT:
13042 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13044 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
13046 if (
op->value == 0)
13047 xmlXPathMultValues(ctxt);
13048 else if (
op->value == 1)
13049 xmlXPathDivValues(ctxt);
13050 else if (
op->value == 2)
13051 xmlXPathModValues(ctxt);
13053 case XPATH_OP_UNION:
13054 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13056 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
13059 arg2 = valuePop(ctxt);
13060 arg1 = valuePop(ctxt);
13061 if ((
arg1 ==
NULL) || (
arg1->type != XPATH_NODESET) ||
13063 xmlXPathReleaseObject(ctxt->context,
arg1);
13064 xmlXPathReleaseObject(ctxt->context,
arg2);
13065 XP_ERROR0(XPATH_INVALID_TYPE);
13067 if ((ctxt->context->opLimit != 0) &&
13069 (xmlXPathCheckOpLimit(ctxt,
13070 arg1->nodesetval->nodeNr) < 0)) ||
13072 (xmlXPathCheckOpLimit(ctxt,
13073 arg2->nodesetval->nodeNr) < 0)))) {
13074 xmlXPathReleaseObject(ctxt->context,
arg1);
13075 xmlXPathReleaseObject(ctxt->context,
arg2);
13081 (
arg2->nodesetval->nodeNr != 0)))
13084 arg1->nodesetval = xmlXPathNodeSetMerge(
arg1->nodesetval,
13088 valuePush(ctxt,
arg1);
13089 xmlXPathReleaseObject(ctxt->context,
arg2);
13091 case XPATH_OP_ROOT:
13092 xmlXPathRoot(ctxt);
13094 case XPATH_OP_NODE:
13096 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13099 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
13101 valuePush(ctxt, xmlXPathCacheNewNodeSet(ctxt->context,
13102 ctxt->context->node));
13104 case XPATH_OP_COLLECT:{
13108 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13114 case XPATH_OP_VALUE:
13116 xmlXPathCacheObjectCopy(ctxt->context,
13117 (xmlXPathObjectPtr)
op->value4));
13119 case XPATH_OP_VARIABLE:{
13120 xmlXPathObjectPtr
val;
13124 xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13125 if (
op->value5 ==
NULL) {
13126 val = xmlXPathVariableLookup(ctxt->context,
op->value4);
13128 XP_ERROR0(XPATH_UNDEF_VARIABLE_ERROR);
13129 valuePush(ctxt,
val);
13133 URI = xmlXPathNsLookup(ctxt->context,
op->value5);
13136 "xmlXPathCompOpEval: variable %s bound to undefined prefix %s\n",
13137 (
char *)
op->value4, (
char *)
op->value5);
13138 ctxt->error = XPATH_UNDEF_PREFIX_ERROR;
13141 val = xmlXPathVariableLookupNS(ctxt->context,
13144 XP_ERROR0(XPATH_UNDEF_VARIABLE_ERROR);
13145 valuePush(ctxt,
val);
13149 case XPATH_OP_FUNCTION:{
13150 xmlXPathFunction
func;
13151 const xmlChar *oldFunc, *oldFuncURI;
13155 frame = xmlXPathSetFrame(ctxt);
13156 if (
op->ch1 != -1) {
13158 xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13159 if (ctxt->error != XPATH_EXPRESSION_OK) {
13160 xmlXPathPopFrame(ctxt, frame);
13164 if (ctxt->valueNr < ctxt->valueFrame +
op->value) {
13166 "xmlXPathCompOpEval: parameter error\n");
13167 ctxt->error = XPATH_INVALID_OPERAND;
13168 xmlXPathPopFrame(ctxt, frame);
13171 for (
i = 0;
i <
op->value;
i++) {
13172 if (ctxt->valueTab[(ctxt->valueNr - 1) -
i] ==
NULL) {
13174 "xmlXPathCompOpEval: parameter error\n");
13175 ctxt->error = XPATH_INVALID_OPERAND;
13176 xmlXPathPopFrame(ctxt, frame);
13187 xmlXPathFunctionLookup(ctxt->context,
13190 URI = xmlXPathNsLookup(ctxt->context,
op->value5);
13193 "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n",
13194 (
char *)
op->value4, (
char *)
op->value5);
13195 xmlXPathPopFrame(ctxt, frame);
13196 ctxt->error = XPATH_UNDEF_PREFIX_ERROR;
13199 func = xmlXPathFunctionLookupNS(ctxt->context,
13204 "xmlXPathCompOpEval: function %s not found\n",
13205 (
char *)
op->value4);
13206 XP_ERROR0(XPATH_UNKNOWN_FUNC_ERROR);
13209 op->cacheURI = (
void *) URI;
13211 oldFunc = ctxt->context->function;
13212 oldFuncURI = ctxt->context->functionURI;
13213 ctxt->context->function =
op->value4;
13214 ctxt->context->functionURI =
op->cacheURI;
13216 ctxt->context->function = oldFunc;
13217 ctxt->context->functionURI = oldFuncURI;
13218 if ((ctxt->error == XPATH_EXPRESSION_OK) &&
13219 (ctxt->valueNr != ctxt->valueFrame + 1))
13220 XP_ERROR0(XPATH_STACK_ERROR);
13221 xmlXPathPopFrame(ctxt, frame);
13225 if (
op->ch1 != -1) {
13226 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13229 if (
op->ch2 != -1) {
13230 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch2]);
13234 case XPATH_OP_PREDICATE:
13235 case XPATH_OP_FILTER:{
13241 if ((
op->ch1 != -1) && (
op->ch2 != -1) &&
13252 ((comp->steps[
op->ch1].op == XPATH_OP_SORT) ||
13253 (comp->steps[
op->ch1].op == XPATH_OP_FILTER)) &&
13255 (comp->steps[
op->ch1].op == XPATH_OP_SORT) &&
13257 (comp->steps[
op->ch2].op == XPATH_OP_VALUE)) {
13258 xmlXPathObjectPtr
val;
13260 val = comp->steps[
op->ch2].value4;
13261 if ((
val !=
NULL) && (
val->type == XPATH_NUMBER) &&
13262 (
val->floatval == 1.0)) {
13266 xmlXPathCompOpEvalFirst(ctxt,
13267 &comp->steps[
op->ch1],
13274 if ((ctxt->value !=
NULL) &&
13275 (ctxt->value->type == XPATH_NODESET) &&
13276 (ctxt->value->nodesetval !=
NULL) &&
13277 (ctxt->value->nodesetval->nodeNr > 1))
13278 xmlXPathNodeSetClearFromPos(ctxt->value->nodesetval,
13286 if ((
op->ch1 != -1) && (
op->ch2 != -1) &&
13287 (comp->steps[
op->ch1].op == XPATH_OP_SORT) &&
13288 (comp->steps[
op->ch2].op == XPATH_OP_SORT)) {
13289 int f = comp->steps[
op->ch2].ch1;
13292 (comp->steps[
f].op == XPATH_OP_FUNCTION) &&
13293 (comp->steps[
f].value5 ==
NULL) &&
13294 (comp->steps[
f].value == 0) &&
13295 (comp->steps[
f].value4 !=
NULL) &&
13297 (comp->steps[
f].value4,
BAD_CAST "last"))) {
13301 xmlXPathCompOpEvalLast(ctxt,
13302 &comp->steps[
op->ch1],
13309 if ((ctxt->value !=
NULL) &&
13310 (ctxt->value->type == XPATH_NODESET) &&
13311 (ctxt->value->nodesetval !=
NULL) &&
13312 (ctxt->value->nodesetval->nodeTab !=
NULL) &&
13313 (ctxt->value->nodesetval->nodeNr > 1))
13314 xmlXPathNodeSetKeepLast(ctxt->value->nodesetval);
13331 xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13335 if (ctxt->value ==
NULL)
13338#ifdef LIBXML_XPTR_LOCS_ENABLED
13342 if (ctxt->value->type == XPATH_LOCATIONSET) {
13343 xmlLocationSetPtr locset = ctxt->value->user;
13344 xmlXPathLocationSetFilter(ctxt, locset,
op->ch2,
13350 CHECK_TYPE0(XPATH_NODESET);
13351 set = ctxt->value->nodesetval;
13353 xmlXPathNodeSetFilter(ctxt,
set,
op->ch2,
13354 1,
set->nodeNr, 1);
13357 case XPATH_OP_SORT:
13359 total += xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13361 if ((ctxt->value !=
NULL) &&
13362 (ctxt->value->type == XPATH_NODESET) &&
13363 (ctxt->value->nodesetval !=
NULL) &&
13364 (ctxt->value->nodesetval->nodeNr > 1))
13366 xmlXPathNodeSetSort(ctxt->value->nodesetval);
13369#ifdef LIBXML_XPTR_LOCS_ENABLED
13370 case XPATH_OP_RANGETO:{
13371 xmlXPathObjectPtr
range;
13372 xmlXPathObjectPtr
res,
obj;
13373 xmlXPathObjectPtr tmp;
13374 xmlLocationSetPtr newlocset =
NULL;
13375 xmlLocationSetPtr oldlocset;
13376 xmlNodeSetPtr oldset;
13378 int oldcs = ctxt->context->contextSize;
13379 int oldpp = ctxt->context->proximityPosition;
13382 if (
op->ch1 != -1) {
13384 xmlXPathCompOpEval(ctxt, &comp->steps[
op->ch1]);
13387 if (ctxt->value ==
NULL) {
13388 XP_ERROR0(XPATH_INVALID_OPERAND);
13393 if (ctxt->value->type == XPATH_LOCATIONSET) {
13399 CHECK_TYPE0(XPATH_LOCATIONSET);
13401 if ((ctxt->value->user ==
NULL) ||
13402 (((xmlLocationSetPtr) ctxt->value->user)->locNr == 0))
13405 obj = valuePop(ctxt);
13406 oldlocset =
obj->user;
13408 newlocset = xmlXPtrLocationSetCreate(
NULL);
13410 for (
i = 0;
i < oldlocset->locNr;
i++) {
13415 ctxt->context->node = oldlocset->locTab[
i]->user;
13416 ctxt->context->contextSize = oldlocset->locNr;
13417 ctxt->context->proximityPosition =
i + 1;
13418 tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13419 ctxt->context->node);
13420 valuePush(ctxt, tmp);
13424 xmlXPathCompOpEval(ctxt,
13425 &comp->steps[
op->ch2]);
13426 if (ctxt->error != XPATH_EXPRESSION_OK) {
13427 xmlXPtrFreeLocationSet(newlocset);
13428 goto rangeto_error;
13431 res = valuePop(ctxt);
13432 if (
res->type == XPATH_LOCATIONSET) {
13433 xmlLocationSetPtr rloc =
13434 (xmlLocationSetPtr)
res->user;
13435 for (
j=0;
j<rloc->locNr;
j++) {
13436 range = xmlXPtrNewRange(
13437 oldlocset->locTab[
i]->user,
13438 oldlocset->locTab[
i]->index,
13439 rloc->locTab[
j]->user2,
13440 rloc->locTab[
j]->index2);
13442 xmlXPtrLocationSetAdd(newlocset,
range);
13446 range = xmlXPtrNewRangeNodeObject(
13449 xmlXPtrLocationSetAdd(newlocset,
range);
13457 xmlXPathReleaseObject(ctxt->context,
res);
13459 if (ctxt->value == tmp) {
13460 res = valuePop(ctxt);
13461 xmlXPathReleaseObject(ctxt->context,
res);
13465 CHECK_TYPE0(XPATH_NODESET);
13466 obj = valuePop(ctxt);
13467 oldset =
obj->nodesetval;
13469 newlocset = xmlXPtrLocationSetCreate(
NULL);
13471 if (oldset !=
NULL) {
13472 for (
i = 0;
i < oldset->nodeNr;
i++) {
13477 ctxt->context->node = oldset->nodeTab[
i];
13481 tmp = xmlXPathCacheNewNodeSet(ctxt->context,
13482 ctxt->context->node);
13483 valuePush(ctxt, tmp);
13487 xmlXPathCompOpEval(ctxt,
13488 &comp->steps[
op->ch2]);
13489 if (ctxt->error != XPATH_EXPRESSION_OK) {
13490 xmlXPtrFreeLocationSet(newlocset);
13491 goto rangeto_error;
13494 res = valuePop(ctxt);
13496 xmlXPtrNewRangeNodeObject(oldset->nodeTab[
i],
13499 xmlXPtrLocationSetAdd(newlocset,
range);
13506 xmlXPathReleaseObject(ctxt->context,
res);
13508 if (ctxt->value == tmp) {
13509 res = valuePop(ctxt);
13510 xmlXPathReleaseObject(ctxt->context,
res);
13519 valuePush(ctxt, xmlXPtrWrapLocationSet(newlocset));
13521 xmlXPathReleaseObject(ctxt->context,
obj);
13522 ctxt->context->node = oldnode;
13523 ctxt->context->contextSize = oldcs;
13524 ctxt->context->proximityPosition = oldpp;
13530 "XPath: unknown precompiled operation %d\n",
op->op);
13531 ctxt->error = XPATH_INVALID_OPERAND;
13535 ctxt->context->depth -= 1;
13548xmlXPathCompOpEvalToBoolean(xmlXPathParserContextPtr ctxt,
13549 xmlXPathStepOpPtr
op,
13552 xmlXPathObjectPtr resObj =
NULL;
13555 if (OP_LIMIT_EXCEEDED(ctxt, 1))
13561 case XPATH_OP_VALUE:
13562 resObj = (xmlXPathObjectPtr)
op->value4;
13564 return(xmlXPathEvaluatePredicateResult(ctxt, resObj));
13565 return(xmlXPathCastToBoolean(resObj));
13566 case XPATH_OP_SORT:
13570 if (
op->ch1 != -1) {
13571 op = &ctxt->comp->steps[
op->ch1];
13575 case XPATH_OP_COLLECT:
13579 xmlXPathCompOpEval(ctxt, &ctxt->comp->steps[
op->ch1]);
13580 if (ctxt->error != XPATH_EXPRESSION_OK)
13583 xmlXPathNodeCollectAndTest(ctxt,
op,
NULL,
NULL, 1);
13584 if (ctxt->error != XPATH_EXPRESSION_OK)
13587 resObj = valuePop(ctxt);
13588 if (resObj ==
NULL)
13595 xmlXPathCompOpEval(ctxt,
op);
13596 if (ctxt->error != XPATH_EXPRESSION_OK)
13599 resObj = valuePop(ctxt);
13600 if (resObj ==
NULL)
13608 if (resObj->type == XPATH_BOOLEAN) {
13609 res = resObj->boolval;
13610 }
else if (isPredicate) {
13619 res = xmlXPathEvaluatePredicateResult(ctxt, resObj);
13621 res = xmlXPathCastToBoolean(resObj);
13623 xmlXPathReleaseObject(ctxt->context, resObj);
13630#ifdef XPATH_STREAMING
13638xmlXPathRunStreamEval(xmlXPathContextPtr ctxt, xmlPatternPtr comp,
13639 xmlXPathObjectPtr *resultSeq,
int toBool)
13641 int max_depth, min_depth;
13644 int eval_all_nodes;
13646 xmlStreamCtxtPtr patstream =
NULL;
13650 if ((ctxt ==
NULL) || (comp ==
NULL))
13652 max_depth = xmlPatternMaxDepth(comp);
13653 if (max_depth == -1)
13655 if (max_depth == -2)
13657 min_depth = xmlPatternMinDepth(comp);
13658 if (min_depth == -1)
13660 from_root = xmlPatternFromRoot(comp);
13664 printf(
"stream eval: depth %d from root %d\n", max_depth, from_root);
13668 if (resultSeq ==
NULL)
13670 *resultSeq = xmlXPathCacheNewNodeSet(ctxt,
NULL);
13671 if (*resultSeq ==
NULL)
13678 if (min_depth == 0) {
13684 xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval,
13691 xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval, ctxt->node);
13694 if (max_depth == 0) {
13700 }
else if (ctxt->node !=
NULL) {
13701 switch (ctxt->node->type) {
13732 patstream = xmlPatternGetStreamCtxt(comp);
13733 if (patstream ==
NULL) {
13740 eval_all_nodes = xmlStreamWantsAnyNode(patstream);
13745 }
else if (
ret == 1) {
13749 xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval,
cur);
13753 goto scan_children;
13756 if (ctxt->opLimit != 0) {
13757 if (ctxt->opCount >= ctxt->opLimit) {
13759 "XPath operation limit exceeded\n");
13760 xmlFreeStreamCtxt(patstream);
13768 switch (
cur->type) {
13775 ret = xmlStreamPush(patstream,
cur->name,
13777 }
else if (eval_all_nodes)
13784 }
else if (
ret == 1) {
13787 if (xmlXPathNodeSetAddUnique((*resultSeq)->nodesetval,
cur)
13793 if ((
cur->children ==
NULL) || (
depth >= max_depth)) {
13794 ret = xmlStreamPop(patstream);
13840 ret = xmlStreamPop(patstream);
13841 }
else if ((eval_all_nodes) &&
13847 ret = xmlStreamPop(patstream);
13860 printf(
"stream eval: checked %d nodes selected %d\n",
13861 nb_nodes, retObj->nodesetval->nodeNr);
13865 xmlFreeStreamCtxt(patstream);
13870 xmlFreeStreamCtxt(patstream);
13883xmlXPathRunEval(xmlXPathParserContextPtr ctxt,
int toBool)
13885 xmlXPathCompExprPtr comp;
13888 if ((ctxt ==
NULL) || (ctxt->comp ==
NULL))
13891 if (ctxt->valueTab ==
NULL) {
13893 ctxt->valueTab = (xmlXPathObjectPtr *)
13894 xmlMalloc(10 *
sizeof(xmlXPathObjectPtr));
13895 if (ctxt->valueTab ==
NULL) {
13896 xmlXPathPErrMemory(ctxt,
"creating evaluation context\n");
13900 ctxt->valueMax = 10;
13901 ctxt->value =
NULL;
13902 ctxt->valueFrame = 0;
13904#ifdef XPATH_STREAMING
13905 if (ctxt->comp->stream) {
13912 res = xmlXPathRunStreamEval(ctxt->context,
13913 ctxt->comp->stream,
NULL, 1);
13917 xmlXPathObjectPtr resObj =
NULL;
13922 res = xmlXPathRunStreamEval(ctxt->context,
13923 ctxt->comp->stream, &resObj, 0);
13925 if ((
res != -1) && (resObj !=
NULL)) {
13926 valuePush(ctxt, resObj);
13929 if (resObj !=
NULL)
13930 xmlXPathReleaseObject(ctxt->context, resObj);
13939 if (comp->last < 0) {
13941 "xmlXPathRunEval: last is less than zero\n");
13944 oldDepth = ctxt->context->depth;
13946 return(xmlXPathCompOpEvalToBoolean(ctxt,
13947 &comp->steps[comp->last], 0));
13949 xmlXPathCompOpEval(ctxt, &comp->steps[comp->last]);
13950 ctxt->context->depth = oldDepth;
13978xmlXPathEvalPredicate(xmlXPathContextPtr ctxt, xmlXPathObjectPtr
res) {
13980 switch (
res->type) {
13981 case XPATH_BOOLEAN:
13982 return(
res->boolval);
13984 return(
res->floatval == ctxt->proximityPosition);
13985 case XPATH_NODESET:
13986 case XPATH_XSLT_TREE:
13989 return(
res->nodesetval->nodeNr != 0);
13991 return((
res->stringval !=
NULL) &&
14016xmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt,
14017 xmlXPathObjectPtr
res) {
14019 switch (
res->type) {
14020 case XPATH_BOOLEAN:
14021 return(
res->boolval);
14023#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER == 1200))
14024 return((
res->floatval == ctxt->context->proximityPosition) &&
14025 (!xmlXPathIsNaN(
res->floatval)));
14027 return(
res->floatval == ctxt->context->proximityPosition);
14029 case XPATH_NODESET:
14030 case XPATH_XSLT_TREE:
14033 return(
res->nodesetval->nodeNr != 0);
14035 return((
res->stringval !=
NULL) && (
res->stringval[0] != 0));
14036#ifdef LIBXML_XPTR_LOCS_ENABLED
14037 case XPATH_LOCATIONSET:{
14038 xmlLocationSetPtr
ptr =
res->user;
14041 return (
ptr->locNr != 0);
14050#ifdef XPATH_STREAMING
14060static xmlXPathCompExprPtr
14061xmlXPathTryStreamCompile(xmlXPathContextPtr ctxt,
const xmlChar *
str) {
14067 xmlXPathCompExprPtr comp;
14087 if ((tmp !=
NULL) &&
14088 ((ctxt ==
NULL) || (ctxt->nsNr == 0) || (tmp[1] ==
':')))
14091 if (ctxt !=
NULL) {
14093 if (ctxt->nsNr > 0) {
14095 if (namespaces ==
NULL) {
14096 xmlXPathErrMemory(ctxt,
"allocating namespaces array\n");
14099 for (
i = 0,
j = 0; (
j < ctxt->nsNr);
j++) {
14100 ns = ctxt->namespaces[
j];
14101 namespaces[
i++] =
ns->href;
14104 namespaces[
i++] =
NULL;
14105 namespaces[
i] =
NULL;
14109 stream = xmlPatterncompile(
str, dict, XML_PATTERN_XPATH, namespaces);
14110 if (namespaces !=
NULL) {
14114 comp = xmlXPathNewCompExpr();
14115 if (comp ==
NULL) {
14116 xmlXPathErrMemory(ctxt,
"allocating streamable expression\n");
14132xmlXPathOptimizeExpression(xmlXPathParserContextPtr pctxt,
14133 xmlXPathStepOpPtr
op)
14135 xmlXPathCompExprPtr comp = pctxt->comp;
14136 xmlXPathContextPtr ctxt;
14143 if ((
op->op == XPATH_OP_COLLECT ) &&
14147 xmlXPathStepOpPtr prevop = &comp->steps[
op->ch1];
14149 if ((prevop->op == XPATH_OP_COLLECT ) &&
14150 ((xmlXPathAxisVal) prevop->value ==
14151 AXIS_DESCENDANT_OR_SELF) &&
14152 (prevop->ch2 == -1) &&
14153 ((xmlXPathTestVal) prevop->value2 == NODE_TEST_TYPE) &&
14154 ((xmlXPathTypeVal) prevop->value3 == NODE_TYPE_NODE))
14161 switch ((xmlXPathAxisVal)
op->value) {
14163 case AXIS_DESCENDANT:
14169 op->ch1 = prevop->ch1;
14170 op->value = AXIS_DESCENDANT;
14173 case AXIS_DESCENDANT_OR_SELF:
14179 op->ch1 = prevop->ch1;
14180 op->value = AXIS_DESCENDANT_OR_SELF;
14189 if (
op->op == XPATH_OP_VALUE)
14193 ctxt = pctxt->context;
14194 if (ctxt !=
NULL) {
14200 xmlXPathOptimizeExpression(pctxt, &comp->steps[
op->ch1]);
14202 xmlXPathOptimizeExpression(pctxt, &comp->steps[
op->ch2]);
14218xmlXPathCtxtCompile(xmlXPathContextPtr ctxt,
const xmlChar *
str) {
14219 xmlXPathParserContextPtr pctxt;
14220 xmlXPathCompExprPtr comp;
14223#ifdef XPATH_STREAMING
14224 comp = xmlXPathTryStreamCompile(ctxt,
str);
14231 pctxt = xmlXPathNewParserContext(
str, ctxt);
14235 oldDepth = ctxt->depth;
14236 xmlXPathCompileExpr(pctxt, 1);
14238 ctxt->depth = oldDepth;
14240 if( pctxt->error != XPATH_EXPRESSION_OK )
14242 xmlXPathFreeParserContext(pctxt);
14246 if (*pctxt->cur != 0) {
14253 xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
14256 comp = pctxt->comp;
14257 if ((comp->nbStep > 1) && (comp->last >= 0)) {
14259 oldDepth = ctxt->depth;
14260 xmlXPathOptimizeExpression(pctxt, &comp->steps[comp->last]);
14262 ctxt->depth = oldDepth;
14264 pctxt->comp =
NULL;
14266 xmlXPathFreeParserContext(pctxt);
14268 if (comp !=
NULL) {
14270#ifdef DEBUG_EVAL_COUNTS
14289 return(xmlXPathCtxtCompile(
NULL,
str));
14306xmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp,
14307 xmlXPathContextPtr ctxt,
14308 xmlXPathObjectPtr *resObjPtr,
14311 xmlXPathParserContextPtr pctxt;
14312 xmlXPathObjectPtr resObj;
14313#ifndef LIBXML_THREAD_ENABLED
14314 static int reentance = 0;
14318 CHECK_CTXT_NEG(ctxt)
14324#ifndef LIBXML_THREAD_ENABLED
14327 xmlXPathDisableOptimizer = 1;
14330#ifdef DEBUG_EVAL_COUNTS
14332 if ((comp->string !=
NULL) && (comp->nb > 100)) {
14337 pctxt = xmlXPathCompParserContext(comp, ctxt);
14338 res = xmlXPathRunEval(pctxt, toBool);
14340 if (pctxt->error != XPATH_EXPRESSION_OK) {
14343 resObj = valuePop(pctxt);
14344 if (resObj ==
NULL) {
14347 "xmlXPathCompiledEval: No result on the stack.\n");
14348 }
else if (pctxt->valueNr > 0) {
14350 "xmlXPathCompiledEval: %d object(s) left on the stack.\n",
14356 *resObjPtr = resObj;
14358 xmlXPathReleaseObject(ctxt, resObj);
14360 pctxt->comp =
NULL;
14361 xmlXPathFreeParserContext(pctxt);
14362#ifndef LIBXML_THREAD_ENABLED
14380xmlXPathCompiledEval(xmlXPathCompExprPtr comp, xmlXPathContextPtr
ctx)
14382 xmlXPathObjectPtr
res =
NULL;
14384 xmlXPathCompiledEvalInternal(comp,
ctx, &
res, 0);
14400xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp,
14401 xmlXPathContextPtr ctxt)
14403 return(xmlXPathCompiledEvalInternal(comp, ctxt,
NULL, 1));
14414xmlXPathEvalExpr(xmlXPathParserContextPtr ctxt) {
14415#ifdef XPATH_STREAMING
14416 xmlXPathCompExprPtr comp;
14420 if (ctxt ==
NULL)
return;
14422#ifdef XPATH_STREAMING
14423 comp = xmlXPathTryStreamCompile(ctxt->context, ctxt->base);
14424 if (comp !=
NULL) {
14425 if (ctxt->comp !=
NULL)
14426 xmlXPathFreeCompExpr(ctxt->comp);
14431 if (ctxt->context !=
NULL)
14432 oldDepth = ctxt->context->depth;
14433 xmlXPathCompileExpr(ctxt, 1);
14434 if (ctxt->context !=
NULL)
14435 ctxt->context->depth = oldDepth;
14439 if (*ctxt->cur != 0)
14440 XP_ERROR(XPATH_EXPR_ERROR);
14442 if ((ctxt->comp->nbStep > 1) && (ctxt->comp->last >= 0)) {
14443 if (ctxt->context !=
NULL)
14444 oldDepth = ctxt->context->depth;
14445 xmlXPathOptimizeExpression(ctxt,
14446 &ctxt->comp->steps[ctxt->comp->last]);
14447 if (ctxt->context !=
NULL)
14448 ctxt->context->depth = oldDepth;
14452 xmlXPathRunEval(ctxt, 0);
14467 xmlXPathParserContextPtr ctxt;
14468 xmlXPathObjectPtr
res;
14474 ctxt = xmlXPathNewParserContext(
str,
ctx);
14477 xmlXPathEvalExpr(ctxt);
14479 if (ctxt->error != XPATH_EXPRESSION_OK) {
14482 res = valuePop(ctxt);
14485 "xmlXPathCompiledEval: No result on the stack.\n");
14486 }
else if (ctxt->valueNr > 0) {
14488 "xmlXPathCompiledEval: %d object(s) left on the stack.\n",
14493 xmlXPathFreeParserContext(ctxt);
14535 if (xmlXPathSetContextNode(
node,
ctx) < 0)
14537 return(xmlXPathEval(
str,
ctx));
14551xmlXPathEvalExpression(
const xmlChar *
str, xmlXPathContextPtr ctxt) {
14552 return(xmlXPathEval(
str, ctxt));
14609xmlXPathEscapeUriFunction(xmlXPathParserContextPtr ctxt,
int nargs) {
14610 xmlXPathObjectPtr
str;
14611 int escape_reserved;
14618 escape_reserved = xmlXPathPopBoolean(ctxt);
14621 str = valuePop(ctxt);
14629 for (cptr =
str->stringval; *cptr; cptr++) {
14630 if ((*cptr >=
'A' && *cptr <=
'Z') ||
14631 (*cptr >=
'a' && *cptr <=
'z') ||
14632 (*cptr >=
'0' && *cptr <=
'9') ||
14633 *cptr ==
'-' || *cptr ==
'_' || *cptr ==
'.' ||
14634 *cptr ==
'!' || *cptr ==
'~' || *cptr ==
'*' ||
14635 *cptr ==
'\''|| *cptr ==
'(' || *cptr ==
')' ||
14637 ((cptr[1] >=
'A' && cptr[1] <=
'F') ||
14638 (cptr[1] >=
'a' && cptr[1] <=
'f') ||
14639 (cptr[1] >=
'0' && cptr[1] <=
'9')) &&
14640 ((cptr[2] >=
'A' && cptr[2] <=
'F') ||
14641 (cptr[2] >=
'a' && cptr[2] <=
'f') ||
14642 (cptr[2] >=
'0' && cptr[2] <=
'9'))) ||
14643 (!escape_reserved &&
14644 (*cptr ==
';' || *cptr ==
'/' || *cptr ==
'?' ||
14645 *cptr ==
':' || *cptr ==
'@' || *cptr ==
'&' ||
14646 *cptr ==
'=' || *cptr ==
'+' || *cptr ==
'$' ||
14650 if ((*cptr >> 4) < 10)
14651 escape[1] =
'0' + (*cptr >> 4);
14653 escape[1] =
'A' - 10 + (*cptr >> 4);
14654 if ((*cptr & 0xF) < 10)
14655 escape[2] =
'0' + (*cptr & 0xF);
14657 escape[2] =
'A' - 10 + (*cptr & 0xF);
14663 valuePush(ctxt, xmlXPathCacheNewString(ctxt->context,
14666 xmlXPathReleaseObject(ctxt->context,
str);
14676xmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt)
14678 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"boolean",
14679 xmlXPathBooleanFunction);
14680 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"ceiling",
14681 xmlXPathCeilingFunction);
14682 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"count",
14683 xmlXPathCountFunction);
14684 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"concat",
14685 xmlXPathConcatFunction);
14686 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"contains",
14687 xmlXPathContainsFunction);
14688 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"id",
14689 xmlXPathIdFunction);
14690 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"false",
14691 xmlXPathFalseFunction);
14692 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"floor",
14693 xmlXPathFloorFunction);
14694 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"last",
14695 xmlXPathLastFunction);
14696 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"lang",
14697 xmlXPathLangFunction);
14698 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"local-name",
14699 xmlXPathLocalNameFunction);
14700 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"not",
14701 xmlXPathNotFunction);
14702 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"name",
14703 xmlXPathNameFunction);
14704 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"namespace-uri",
14705 xmlXPathNamespaceURIFunction);
14706 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"normalize-space",
14707 xmlXPathNormalizeFunction);
14708 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"number",
14709 xmlXPathNumberFunction);
14710 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"position",
14711 xmlXPathPositionFunction);
14712 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"round",
14713 xmlXPathRoundFunction);
14714 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"string",
14715 xmlXPathStringFunction);
14716 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"string-length",
14717 xmlXPathStringLengthFunction);
14718 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"starts-with",
14719 xmlXPathStartsWithFunction);
14720 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"substring",
14721 xmlXPathSubstringFunction);
14722 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"substring-before",
14723 xmlXPathSubstringBeforeFunction);
14724 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"substring-after",
14725 xmlXPathSubstringAfterFunction);
14726 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"sum",
14727 xmlXPathSumFunction);
14728 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"true",
14729 xmlXPathTrueFunction);
14730 xmlXPathRegisterFunc(ctxt, (
const xmlChar *)
"translate",
14731 xmlXPathTranslateFunction);
14733 xmlXPathRegisterFuncNS(ctxt, (
const xmlChar *)
"escape-uri",
14734 (
const xmlChar *)
"http://www.w3.org/2002/08/xquery-functions",
14735 xmlXPathEscapeUriFunction);
_STLP_MOVE_TO_STD_NAMESPACE void sort(_RandomAccessIter __first, _RandomAccessIter __last)
ACPI_SIZE strlen(const char *String)
void xmlBufFree(xmlBufPtr buf)
xmlBufPtr xmlBufCreate(void)
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)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
__kernel_ptrdiff_t ptrdiff_t
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
_Check_return_ _CRT_JIT_INTRINSIC double __cdecl fabs(_In_ double x)
_Check_return_ double __cdecl fmod(_In_ double x, _In_ double y)
_Check_return_ _CRTIMP double __cdecl floor(_In_ double x)
_Check_return_ _CRTIMP double __cdecl ceil(_In_ double x)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
#define ATTRIBUTE_NO_SANITIZE(arg)
#define XML_IGNORE_PEDANTIC_WARNINGS
double __cdecl copysign(double, double)
#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)
static unsigned __int64 next
XMLPUBFUN const xmlChar *XMLCALL xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len)
XMLPUBFUN void XMLCALL xmlDictFree(xmlDictPtr dict)
XMLPUBFUN int XMLCALL xmlDictReference(xmlDictPtr dict)
XMLPUBVAR xmlMallocFunc xmlMallocAtomic
XMLPUBVAR xmlMallocFunc xmlMalloc
XMLPUBVAR xmlFreeFunc xmlFree
XMLPUBVAR void * xmlGenericErrorContext
XMLPUBVAR xmlReallocFunc xmlRealloc
XMLPUBVAR xmlGenericErrorFunc xmlGenericError
XMLPUBFUN int XMLCALL xmlHashUpdateEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, void *userdata, xmlHashDeallocator f)
XMLPUBFUN int XMLCALL xmlHashAddEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, void *userdata)
XMLPUBFUN void XMLCALL xmlHashFree(xmlHashTablePtr table, xmlHashDeallocator f)
XMLPUBFUN void *XMLCALL xmlHashLookup(xmlHashTablePtr table, const xmlChar *name)
XMLPUBFUN int XMLCALL xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2, xmlHashDeallocator f)
XMLPUBFUN xmlHashTablePtr XMLCALL xmlHashCreate(int size)
XMLPUBFUN int XMLCALL xmlHashAddEntry(xmlHashTablePtr table, const xmlChar *name, void *userdata)
XMLPUBFUN int XMLCALL xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name, xmlHashDeallocator f)
XMLPUBFUN void *XMLCALL xmlHashLookup2(xmlHashTablePtr table, const xmlChar *name, const xmlChar *name2)
XMLPUBFUN void XMLCALL xmlHashDefaultDeallocator(void *entry, const xmlChar *name)
XMLPUBFUN int XMLCALL xmlHashUpdateEntry(xmlHashTablePtr table, const xmlChar *name, void *userdata, xmlHashDeallocator f)
XMLPUBFUN void XMLCALL xmlInitParser(void)
XMLPUBFUN xmlNodePtr XMLCALL xmlAddChild(xmlNodePtr parent, xmlNodePtr cur)
XMLPUBFUN xmlChar *XMLCALL xmlNodeGetContent(const xmlNode *cur)
XMLPUBFUN xmlNodePtr XMLCALL xmlDocGetRootElement(const xmlDoc *doc)
XMLPUBFUN xmlChar *XMLCALL xmlBuildQName(const xmlChar *ncname, const xmlChar *prefix, xmlChar *memory, int len)
XMLPUBFUN xmlDocPtr XMLCALL xmlNewDoc(const xmlChar *version)
#define XML_XML_NAMESPACE
XMLPUBFUN void XMLCALL xmlFreeNodeList(xmlNodePtr cur)
XMLPUBFUN xmlChar *XMLCALL xmlNodeGetLang(const xmlNode *cur)
XMLPUBFUN xmlChar *XMLCALL xmlBufContent(const xmlBuf *buf)
XMLPUBFUN xmlNodePtr XMLCALL xmlDocCopyNode(xmlNodePtr node, xmlDocPtr doc, int recursive)
#define COPY_BUF(l, b, i, v)
struct _xmlDictEntry * dict
struct _xmlNode * children
struct _xmlNode * children
Character const *const prefix
XMLPUBFUN xmlAttrPtr XMLCALL xmlGetID(xmlDocPtr doc, const xmlChar *ID)
static const WCHAR lang[]
XMLPUBFUN void XMLCALL xmlResetError(xmlErrorPtr err)
@ XML_XPATH_EXPRESSION_OK
XMLPUBFUN int XMLCALL xmlUTF8Strlen(const xmlChar *utf)
XMLPUBFUN const xmlChar *XMLCALL xmlStrchr(const xmlChar *str, xmlChar val)
XMLPUBFUN const xmlChar *XMLCALL xmlUTF8Strpos(const xmlChar *utf, int pos)
XMLPUBFUN xmlChar *XMLCALL xmlStrndup(const xmlChar *cur, int len)
XMLPUBFUN xmlChar *XMLCALL xmlUTF8Strsub(const xmlChar *utf, int start, int len)
XMLPUBFUN xmlChar *XMLCALL xmlStrcat(xmlChar *cur, const xmlChar *add)
XMLPUBFUN int XMLCALL xmlStrncmp(const xmlChar *str1, const xmlChar *str2, int len)
XMLPUBFUN const xmlChar *XMLCALL xmlStrstr(const xmlChar *str, const xmlChar *val)
XMLPUBFUN int XMLCALL xmlStrPrintf(xmlChar *buf, int len, const char *msg,...) LIBXML_ATTR_FORMAT(3
XMLPUBFUN xmlChar *XMLCALL xmlStrdup(const xmlChar *cur)
XMLPUBFUN int XMLCALL xmlUTF8Strsize(const xmlChar *utf, int len)
XMLPUBFUN int XMLCALL xmlUTF8Strloc(const xmlChar *utf, const xmlChar *utfchar)
XMLPUBFUN int XMLCALL xmlStrEqual(const xmlChar *str1, const xmlChar *str2)
XMLPUBFUN int XMLCALL xmlStrlen(const xmlChar *str)
#define XP_OPTIMIZED_NON_ELEM_COMPARISON
static int wrap_cmp(xmlNodePtr x, xmlNodePtr y)
static int xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2)
#define XPATH_MAX_STACK_DEPTH
#define XPATH_MAX_NODESET_LENGTH
#define XP_OPTIMIZED_FILTER_FIRST
#define XPATH_MAX_RECURSION_DEPTH
double xmlXPathStringEvalNumber(const xmlChar *str)