Path: blob/master/libs/xml2/include/libxml/xpathInternals.h
4394 views
/*1* Summary: internal interfaces for XML Path Language implementation2* Description: internal interfaces for XML Path Language implementation3* used to build new modules on top of XPath like XPointer and4* XSLT5*6* Copy: See Copyright for the status of this software.7*8* Author: Daniel Veillard9*/1011#ifndef __XML_XPATH_INTERNALS_H__12#define __XML_XPATH_INTERNALS_H__1314#include <stdio.h>15#include <libxml/xmlversion.h>16#include <libxml/xpath.h>1718#ifdef LIBXML_XPATH_ENABLED1920#ifdef __cplusplus21extern "C" {22#endif2324/************************************************************************25* *26* Helpers *27* *28************************************************************************/2930/*31* Many of these macros may later turn into functions. They32* shouldn't be used in #ifdef's preprocessor instructions.33*/34/**35* xmlXPathSetError:36* @ctxt: an XPath parser context37* @err: an xmlXPathError code38*39* Raises an error.40*/41#define xmlXPathSetError(ctxt, err) \42{ xmlXPatherror((ctxt), __FILE__, __LINE__, (err)); \43if ((ctxt) != NULL) (ctxt)->error = (err); }4445/**46* xmlXPathSetArityError:47* @ctxt: an XPath parser context48*49* Raises an XPATH_INVALID_ARITY error.50*/51#define xmlXPathSetArityError(ctxt) \52xmlXPathSetError((ctxt), XPATH_INVALID_ARITY)5354/**55* xmlXPathSetTypeError:56* @ctxt: an XPath parser context57*58* Raises an XPATH_INVALID_TYPE error.59*/60#define xmlXPathSetTypeError(ctxt) \61xmlXPathSetError((ctxt), XPATH_INVALID_TYPE)6263/**64* xmlXPathGetError:65* @ctxt: an XPath parser context66*67* Get the error code of an XPath context.68*69* Returns the context error.70*/71#define xmlXPathGetError(ctxt) ((ctxt)->error)7273/**74* xmlXPathCheckError:75* @ctxt: an XPath parser context76*77* Check if an XPath error was raised.78*79* Returns true if an error has been raised, false otherwise.80*/81#define xmlXPathCheckError(ctxt) ((ctxt)->error != XPATH_EXPRESSION_OK)8283/**84* xmlXPathGetDocument:85* @ctxt: an XPath parser context86*87* Get the document of an XPath context.88*89* Returns the context document.90*/91#define xmlXPathGetDocument(ctxt) ((ctxt)->context->doc)9293/**94* xmlXPathGetContextNode:95* @ctxt: an XPath parser context96*97* Get the context node of an XPath context.98*99* Returns the context node.100*/101#define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node)102103XMLPUBFUN int104xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt);105XMLPUBFUN double106xmlXPathPopNumber (xmlXPathParserContextPtr ctxt);107XMLPUBFUN xmlChar *108xmlXPathPopString (xmlXPathParserContextPtr ctxt);109XMLPUBFUN xmlNodeSetPtr110xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt);111XMLPUBFUN void *112xmlXPathPopExternal (xmlXPathParserContextPtr ctxt);113114/**115* xmlXPathReturnBoolean:116* @ctxt: an XPath parser context117* @val: a boolean118*119* Pushes the boolean @val on the context stack.120*/121#define xmlXPathReturnBoolean(ctxt, val) \122valuePush((ctxt), xmlXPathNewBoolean(val))123124/**125* xmlXPathReturnTrue:126* @ctxt: an XPath parser context127*128* Pushes true on the context stack.129*/130#define xmlXPathReturnTrue(ctxt) xmlXPathReturnBoolean((ctxt), 1)131132/**133* xmlXPathReturnFalse:134* @ctxt: an XPath parser context135*136* Pushes false on the context stack.137*/138#define xmlXPathReturnFalse(ctxt) xmlXPathReturnBoolean((ctxt), 0)139140/**141* xmlXPathReturnNumber:142* @ctxt: an XPath parser context143* @val: a double144*145* Pushes the double @val on the context stack.146*/147#define xmlXPathReturnNumber(ctxt, val) \148valuePush((ctxt), xmlXPathNewFloat(val))149150/**151* xmlXPathReturnString:152* @ctxt: an XPath parser context153* @str: a string154*155* Pushes the string @str on the context stack.156*/157#define xmlXPathReturnString(ctxt, str) \158valuePush((ctxt), xmlXPathWrapString(str))159160/**161* xmlXPathReturnEmptyString:162* @ctxt: an XPath parser context163*164* Pushes an empty string on the stack.165*/166#define xmlXPathReturnEmptyString(ctxt) \167valuePush((ctxt), xmlXPathNewCString(""))168169/**170* xmlXPathReturnNodeSet:171* @ctxt: an XPath parser context172* @ns: a node-set173*174* Pushes the node-set @ns on the context stack.175*/176#define xmlXPathReturnNodeSet(ctxt, ns) \177valuePush((ctxt), xmlXPathWrapNodeSet(ns))178179/**180* xmlXPathReturnEmptyNodeSet:181* @ctxt: an XPath parser context182*183* Pushes an empty node-set on the context stack.184*/185#define xmlXPathReturnEmptyNodeSet(ctxt) \186valuePush((ctxt), xmlXPathNewNodeSet(NULL))187188/**189* xmlXPathReturnExternal:190* @ctxt: an XPath parser context191* @val: user data192*193* Pushes user data on the context stack.194*/195#define xmlXPathReturnExternal(ctxt, val) \196valuePush((ctxt), xmlXPathWrapExternal(val))197198/**199* xmlXPathStackIsNodeSet:200* @ctxt: an XPath parser context201*202* Check if the current value on the XPath stack is a node set or203* an XSLT value tree.204*205* Returns true if the current object on the stack is a node-set.206*/207#define xmlXPathStackIsNodeSet(ctxt) \208(((ctxt)->value != NULL) \209&& (((ctxt)->value->type == XPATH_NODESET) \210|| ((ctxt)->value->type == XPATH_XSLT_TREE)))211212/**213* xmlXPathStackIsExternal:214* @ctxt: an XPath parser context215*216* Checks if the current value on the XPath stack is an external217* object.218*219* Returns true if the current object on the stack is an external220* object.221*/222#define xmlXPathStackIsExternal(ctxt) \223((ctxt->value != NULL) && (ctxt->value->type == XPATH_USERS))224225/**226* xmlXPathEmptyNodeSet:227* @ns: a node-set228*229* Empties a node-set.230*/231#define xmlXPathEmptyNodeSet(ns) \232{ while ((ns)->nodeNr > 0) (ns)->nodeTab[--(ns)->nodeNr] = NULL; }233234/**235* CHECK_ERROR:236*237* Macro to return from the function if an XPath error was detected.238*/239#define CHECK_ERROR \240if (ctxt->error != XPATH_EXPRESSION_OK) return241242/**243* CHECK_ERROR0:244*245* Macro to return 0 from the function if an XPath error was detected.246*/247#define CHECK_ERROR0 \248if (ctxt->error != XPATH_EXPRESSION_OK) return(0)249250/**251* XP_ERROR:252* @X: the error code253*254* Macro to raise an XPath error and return.255*/256#define XP_ERROR(X) \257{ xmlXPathErr(ctxt, X); return; }258259/**260* XP_ERROR0:261* @X: the error code262*263* Macro to raise an XPath error and return 0.264*/265#define XP_ERROR0(X) \266{ xmlXPathErr(ctxt, X); return(0); }267268/**269* CHECK_TYPE:270* @typeval: the XPath type271*272* Macro to check that the value on top of the XPath stack is of a given273* type.274*/275#define CHECK_TYPE(typeval) \276if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \277XP_ERROR(XPATH_INVALID_TYPE)278279/**280* CHECK_TYPE0:281* @typeval: the XPath type282*283* Macro to check that the value on top of the XPath stack is of a given284* type. Return(0) in case of failure285*/286#define CHECK_TYPE0(typeval) \287if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \288XP_ERROR0(XPATH_INVALID_TYPE)289290/**291* CHECK_ARITY:292* @x: the number of expected args293*294* Macro to check that the number of args passed to an XPath function matches.295*/296#define CHECK_ARITY(x) \297if (ctxt == NULL) return; \298if (nargs != (x)) \299XP_ERROR(XPATH_INVALID_ARITY); \300if (ctxt->valueNr < (x)) \301XP_ERROR(XPATH_STACK_ERROR);302303/**304* CAST_TO_STRING:305*306* Macro to try to cast the value on the top of the XPath stack to a string.307*/308#define CAST_TO_STRING \309if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \310xmlXPathStringFunction(ctxt, 1);311312/**313* CAST_TO_NUMBER:314*315* Macro to try to cast the value on the top of the XPath stack to a number.316*/317#define CAST_TO_NUMBER \318if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \319xmlXPathNumberFunction(ctxt, 1);320321/**322* CAST_TO_BOOLEAN:323*324* Macro to try to cast the value on the top of the XPath stack to a boolean.325*/326#define CAST_TO_BOOLEAN \327if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \328xmlXPathBooleanFunction(ctxt, 1);329330/*331* Variable Lookup forwarding.332*/333334XMLPUBFUN void335xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt,336xmlXPathVariableLookupFunc f,337void *data);338339/*340* Function Lookup forwarding.341*/342343XMLPUBFUN void344xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt,345xmlXPathFuncLookupFunc f,346void *funcCtxt);347348/*349* Error reporting.350*/351XMLPUBFUN void352xmlXPatherror (xmlXPathParserContextPtr ctxt,353const char *file,354int line,355int no);356357XMLPUBFUN void358xmlXPathErr (xmlXPathParserContextPtr ctxt,359int error);360361#ifdef LIBXML_DEBUG_ENABLED362XMLPUBFUN void363xmlXPathDebugDumpObject (FILE *output,364xmlXPathObjectPtr cur,365int depth);366XMLPUBFUN void367xmlXPathDebugDumpCompExpr(FILE *output,368xmlXPathCompExprPtr comp,369int depth);370#endif371/**372* NodeSet handling.373*/374XMLPUBFUN int375xmlXPathNodeSetContains (xmlNodeSetPtr cur,376xmlNodePtr val);377XMLPUBFUN xmlNodeSetPtr378xmlXPathDifference (xmlNodeSetPtr nodes1,379xmlNodeSetPtr nodes2);380XMLPUBFUN xmlNodeSetPtr381xmlXPathIntersection (xmlNodeSetPtr nodes1,382xmlNodeSetPtr nodes2);383384XMLPUBFUN xmlNodeSetPtr385xmlXPathDistinctSorted (xmlNodeSetPtr nodes);386XMLPUBFUN xmlNodeSetPtr387xmlXPathDistinct (xmlNodeSetPtr nodes);388389XMLPUBFUN int390xmlXPathHasSameNodes (xmlNodeSetPtr nodes1,391xmlNodeSetPtr nodes2);392393XMLPUBFUN xmlNodeSetPtr394xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes,395xmlNodePtr node);396XMLPUBFUN xmlNodeSetPtr397xmlXPathLeadingSorted (xmlNodeSetPtr nodes1,398xmlNodeSetPtr nodes2);399XMLPUBFUN xmlNodeSetPtr400xmlXPathNodeLeading (xmlNodeSetPtr nodes,401xmlNodePtr node);402XMLPUBFUN xmlNodeSetPtr403xmlXPathLeading (xmlNodeSetPtr nodes1,404xmlNodeSetPtr nodes2);405406XMLPUBFUN xmlNodeSetPtr407xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes,408xmlNodePtr node);409XMLPUBFUN xmlNodeSetPtr410xmlXPathTrailingSorted (xmlNodeSetPtr nodes1,411xmlNodeSetPtr nodes2);412XMLPUBFUN xmlNodeSetPtr413xmlXPathNodeTrailing (xmlNodeSetPtr nodes,414xmlNodePtr node);415XMLPUBFUN xmlNodeSetPtr416xmlXPathTrailing (xmlNodeSetPtr nodes1,417xmlNodeSetPtr nodes2);418419420/**421* Extending a context.422*/423424XMLPUBFUN int425xmlXPathRegisterNs (xmlXPathContextPtr ctxt,426const xmlChar *prefix,427const xmlChar *ns_uri);428XMLPUBFUN const xmlChar *429xmlXPathNsLookup (xmlXPathContextPtr ctxt,430const xmlChar *prefix);431XMLPUBFUN void432xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt);433434XMLPUBFUN int435xmlXPathRegisterFunc (xmlXPathContextPtr ctxt,436const xmlChar *name,437xmlXPathFunction f);438XMLPUBFUN int439xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt,440const xmlChar *name,441const xmlChar *ns_uri,442xmlXPathFunction f);443XMLPUBFUN int444xmlXPathRegisterVariable (xmlXPathContextPtr ctxt,445const xmlChar *name,446xmlXPathObjectPtr value);447XMLPUBFUN int448xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt,449const xmlChar *name,450const xmlChar *ns_uri,451xmlXPathObjectPtr value);452XMLPUBFUN xmlXPathFunction453xmlXPathFunctionLookup (xmlXPathContextPtr ctxt,454const xmlChar *name);455XMLPUBFUN xmlXPathFunction456xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt,457const xmlChar *name,458const xmlChar *ns_uri);459XMLPUBFUN void460xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt);461XMLPUBFUN xmlXPathObjectPtr462xmlXPathVariableLookup (xmlXPathContextPtr ctxt,463const xmlChar *name);464XMLPUBFUN xmlXPathObjectPtr465xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt,466const xmlChar *name,467const xmlChar *ns_uri);468XMLPUBFUN void469xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt);470471/**472* Utilities to extend XPath.473*/474XMLPUBFUN xmlXPathParserContextPtr475xmlXPathNewParserContext (const xmlChar *str,476xmlXPathContextPtr ctxt);477XMLPUBFUN void478xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt);479480/* TODO: remap to xmlXPathValuePop and Push. */481XMLPUBFUN xmlXPathObjectPtr482valuePop (xmlXPathParserContextPtr ctxt);483XMLPUBFUN int484valuePush (xmlXPathParserContextPtr ctxt,485xmlXPathObjectPtr value);486487XMLPUBFUN xmlXPathObjectPtr488xmlXPathNewString (const xmlChar *val);489XMLPUBFUN xmlXPathObjectPtr490xmlXPathNewCString (const char *val);491XMLPUBFUN xmlXPathObjectPtr492xmlXPathWrapString (xmlChar *val);493XMLPUBFUN xmlXPathObjectPtr494xmlXPathWrapCString (char * val);495XMLPUBFUN xmlXPathObjectPtr496xmlXPathNewFloat (double val);497XMLPUBFUN xmlXPathObjectPtr498xmlXPathNewBoolean (int val);499XMLPUBFUN xmlXPathObjectPtr500xmlXPathNewNodeSet (xmlNodePtr val);501XMLPUBFUN xmlXPathObjectPtr502xmlXPathNewValueTree (xmlNodePtr val);503XMLPUBFUN int504xmlXPathNodeSetAdd (xmlNodeSetPtr cur,505xmlNodePtr val);506XMLPUBFUN int507xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur,508xmlNodePtr val);509XMLPUBFUN int510xmlXPathNodeSetAddNs (xmlNodeSetPtr cur,511xmlNodePtr node,512xmlNsPtr ns);513XMLPUBFUN void514xmlXPathNodeSetSort (xmlNodeSetPtr set);515516XMLPUBFUN void517xmlXPathRoot (xmlXPathParserContextPtr ctxt);518XMLPUBFUN void519xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt);520XMLPUBFUN xmlChar *521xmlXPathParseName (xmlXPathParserContextPtr ctxt);522XMLPUBFUN xmlChar *523xmlXPathParseNCName (xmlXPathParserContextPtr ctxt);524525/*526* Existing functions.527*/528XMLPUBFUN double529xmlXPathStringEvalNumber (const xmlChar *str);530XMLPUBFUN int531xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt,532xmlXPathObjectPtr res);533XMLPUBFUN void534xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt);535XMLPUBFUN xmlNodeSetPtr536xmlXPathNodeSetMerge (xmlNodeSetPtr val1,537xmlNodeSetPtr val2);538XMLPUBFUN void539xmlXPathNodeSetDel (xmlNodeSetPtr cur,540xmlNodePtr val);541XMLPUBFUN void542xmlXPathNodeSetRemove (xmlNodeSetPtr cur,543int val);544XMLPUBFUN xmlXPathObjectPtr545xmlXPathNewNodeSetList (xmlNodeSetPtr val);546XMLPUBFUN xmlXPathObjectPtr547xmlXPathWrapNodeSet (xmlNodeSetPtr val);548XMLPUBFUN xmlXPathObjectPtr549xmlXPathWrapExternal (void *val);550551XMLPUBFUN int xmlXPathEqualValues(xmlXPathParserContextPtr ctxt);552XMLPUBFUN int xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt);553XMLPUBFUN int xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict);554XMLPUBFUN void xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt);555XMLPUBFUN void xmlXPathAddValues(xmlXPathParserContextPtr ctxt);556XMLPUBFUN void xmlXPathSubValues(xmlXPathParserContextPtr ctxt);557XMLPUBFUN void xmlXPathMultValues(xmlXPathParserContextPtr ctxt);558XMLPUBFUN void xmlXPathDivValues(xmlXPathParserContextPtr ctxt);559XMLPUBFUN void xmlXPathModValues(xmlXPathParserContextPtr ctxt);560561XMLPUBFUN int xmlXPathIsNodeType(const xmlChar *name);562563/*564* Some of the axis navigation routines.565*/566XMLPUBFUN xmlNodePtr xmlXPathNextSelf(xmlXPathParserContextPtr ctxt,567xmlNodePtr cur);568XMLPUBFUN xmlNodePtr xmlXPathNextChild(xmlXPathParserContextPtr ctxt,569xmlNodePtr cur);570XMLPUBFUN xmlNodePtr xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt,571xmlNodePtr cur);572XMLPUBFUN xmlNodePtr xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt,573xmlNodePtr cur);574XMLPUBFUN xmlNodePtr xmlXPathNextParent(xmlXPathParserContextPtr ctxt,575xmlNodePtr cur);576XMLPUBFUN xmlNodePtr xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt,577xmlNodePtr cur);578XMLPUBFUN xmlNodePtr xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt,579xmlNodePtr cur);580XMLPUBFUN xmlNodePtr xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt,581xmlNodePtr cur);582XMLPUBFUN xmlNodePtr xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt,583xmlNodePtr cur);584XMLPUBFUN xmlNodePtr xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt,585xmlNodePtr cur);586XMLPUBFUN xmlNodePtr xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt,587xmlNodePtr cur);588XMLPUBFUN xmlNodePtr xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt,589xmlNodePtr cur);590XMLPUBFUN xmlNodePtr xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt,591xmlNodePtr cur);592/*593* The official core of XPath functions.594*/595XMLPUBFUN void xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs);596XMLPUBFUN void xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs);597XMLPUBFUN void xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs);598XMLPUBFUN void xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs);599XMLPUBFUN void xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs);600XMLPUBFUN void xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs);601XMLPUBFUN void xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs);602XMLPUBFUN void xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs);603XMLPUBFUN void xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs);604XMLPUBFUN void xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs);605XMLPUBFUN void xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs);606XMLPUBFUN void xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs);607XMLPUBFUN void xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs);608XMLPUBFUN void xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs);609XMLPUBFUN void xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs);610XMLPUBFUN void xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs);611XMLPUBFUN void xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs);612XMLPUBFUN void xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs);613XMLPUBFUN void xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs);614XMLPUBFUN void xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs);615XMLPUBFUN void xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs);616XMLPUBFUN void xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs);617XMLPUBFUN void xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs);618XMLPUBFUN void xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs);619XMLPUBFUN void xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs);620XMLPUBFUN void xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs);621622/**623* Really internal functions624*/625XMLPUBFUN void xmlXPathNodeSetFreeNs(xmlNsPtr ns);626627#ifdef __cplusplus628}629#endif630631#endif /* LIBXML_XPATH_ENABLED */632#endif /* ! __XML_XPATH_INTERNALS_H__ */633634635