ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ/** * @file * * @brief internal interfaces for XML Path Language implementation * * internal interfaces for XML Path Language implementation * used to build new modules on top of XPath like XPointer and * XSLT * * @copyright See Copyright for the status of this software. * * @author Daniel Veillard */ #ifndef __XML_XPATH_INTERNALS_H__ #define __XML_XPATH_INTERNALS_H__ #include #include #include #ifdef LIBXML_XPATH_ENABLED #ifdef __cplusplus extern "C" { #endif /** * Push a value on the stack * * @deprecated Use #xmlXPathValuePush */ #define valuePush xmlXPathValuePush /** * Pop a value from the stack * * @deprecated Use #xmlXPathValuePop */ #define valuePop xmlXPathValuePop /************************************************************************ * * * Helpers * * * ************************************************************************/ /* * Many of these macros may later turn into functions. They * shouldn't be used in \#ifdef's preprocessor instructions. */ /** * Raises an error. * * @param ctxt an XPath parser context * @param err an xmlXPathError code */ #define xmlXPathSetError(ctxt, err) \ { xmlXPatherror((ctxt), __FILE__, __LINE__, (err)); \ if ((ctxt) != NULL) (ctxt)->error = (err); } /** * Raises an XPATH_INVALID_ARITY error. * * @param ctxt an XPath parser context */ #define xmlXPathSetArityError(ctxt) \ xmlXPathSetError((ctxt), XPATH_INVALID_ARITY) /** * Raises an XPATH_INVALID_TYPE error. * * @param ctxt an XPath parser context */ #define xmlXPathSetTypeError(ctxt) \ xmlXPathSetError((ctxt), XPATH_INVALID_TYPE) /** * Get the error code of an XPath context. * * @param ctxt an XPath parser context * @returns the context error. */ #define xmlXPathGetError(ctxt) ((ctxt)->error) /** * Check if an XPath error was raised. * * @param ctxt an XPath parser context * @returns true if an error has been raised, false otherwise. */ #define xmlXPathCheckError(ctxt) ((ctxt)->error != XPATH_EXPRESSION_OK) /** * Get the document of an XPath context. * * @param ctxt an XPath parser context * @returns the context document. */ #define xmlXPathGetDocument(ctxt) ((ctxt)->context->doc) /** * Get the context node of an XPath context. * * @param ctxt an XPath parser context * @returns the context node. */ #define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node) XMLPUBFUN int xmlXPathPopBoolean (xmlXPathParserContext *ctxt); XMLPUBFUN double xmlXPathPopNumber (xmlXPathParserContext *ctxt); XMLPUBFUN xmlChar * xmlXPathPopString (xmlXPathParserContext *ctxt); XMLPUBFUN xmlNodeSet * xmlXPathPopNodeSet (xmlXPathParserContext *ctxt); XMLPUBFUN void * xmlXPathPopExternal (xmlXPathParserContext *ctxt); /** * Pushes the boolean `val` on the context stack. * * @param ctxt an XPath parser context * @param val a boolean */ #define xmlXPathReturnBoolean(ctxt, val) \ valuePush((ctxt), xmlXPathNewBoolean(val)) /** * Pushes true on the context stack. * * @param ctxt an XPath parser context */ #define xmlXPathReturnTrue(ctxt) xmlXPathReturnBoolean((ctxt), 1) /** * Pushes false on the context stack. * * @param ctxt an XPath parser context */ #define xmlXPathReturnFalse(ctxt) xmlXPathReturnBoolean((ctxt), 0) /** * Pushes the double `val` on the context stack. * * @param ctxt an XPath parser context * @param val a double */ #define xmlXPathReturnNumber(ctxt, val) \ valuePush((ctxt), xmlXPathNewFloat(val)) /** * Pushes the string `str` on the context stack. * * @param ctxt an XPath parser context * @param str a string */ #define xmlXPathReturnString(ctxt, str) \ valuePush((ctxt), xmlXPathWrapString(str)) /** * Pushes an empty string on the stack. * * @param ctxt an XPath parser context */ #define xmlXPathReturnEmptyString(ctxt) \ valuePush((ctxt), xmlXPathNewCString("")) /** * Pushes the node-set `ns` on the context stack. * * @param ctxt an XPath parser context * @param ns a node-set */ #define xmlXPathReturnNodeSet(ctxt, ns) \ valuePush((ctxt), xmlXPathWrapNodeSet(ns)) /** * Pushes an empty node-set on the context stack. * * @param ctxt an XPath parser context */ #define xmlXPathReturnEmptyNodeSet(ctxt) \ valuePush((ctxt), xmlXPathNewNodeSet(NULL)) /** * Pushes user data on the context stack. * * @param ctxt an XPath parser context * @param val user data */ #define xmlXPathReturnExternal(ctxt, val) \ valuePush((ctxt), xmlXPathWrapExternal(val)) /** * Check if the current value on the XPath stack is a node set or * an XSLT value tree. * * @param ctxt an XPath parser context * @returns true if the current object on the stack is a node-set. */ #define xmlXPathStackIsNodeSet(ctxt) \ (((ctxt)->value != NULL) \ && (((ctxt)->value->type == XPATH_NODESET) \ || ((ctxt)->value->type == XPATH_XSLT_TREE))) /** * Checks if the current value on the XPath stack is an external * object. * * @param ctxt an XPath parser context * @returns true if the current object on the stack is an external * object. */ #define xmlXPathStackIsExternal(ctxt) \ ((ctxt->value != NULL) && (ctxt->value->type == XPATH_USERS)) /** * Empties a node-set. * * @param ns a node-set */ #define xmlXPathEmptyNodeSet(ns) \ { while ((ns)->nodeNr > 0) (ns)->nodeTab[--(ns)->nodeNr] = NULL; } /** * Macro to return from the function if an XPath error was detected. */ #define CHECK_ERROR \ if (ctxt->error != XPATH_EXPRESSION_OK) return /** * Macro to return 0 from the function if an XPath error was detected. */ #define CHECK_ERROR0 \ if (ctxt->error != XPATH_EXPRESSION_OK) return(0) /** * Macro to raise an XPath error and return. * * @param X the error code */ #define XP_ERROR(X) \ { xmlXPathErr(ctxt, X); return; } /** * Macro to raise an XPath error and return 0. * * @param X the error code */ #define XP_ERROR0(X) \ { xmlXPathErr(ctxt, X); return(0); } /** * Macro to check that the value on top of the XPath stack is of a given * type. * * @param typeval the XPath type */ #define CHECK_TYPE(typeval) \ if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ XP_ERROR(XPATH_INVALID_TYPE) /** * Macro to check that the value on top of the XPath stack is of a given * type. Return(0) in case of failure * * @param typeval the XPath type */ #define CHECK_TYPE0(typeval) \ if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \ XP_ERROR0(XPATH_INVALID_TYPE) /** * Macro to check that the number of args passed to an XPath function matches. * * @param x the number of expected args */ #define CHECK_ARITY(x) \ if (ctxt == NULL) return; \ if (nargs != (x)) \ XP_ERROR(XPATH_INVALID_ARITY); \ if (ctxt->valueNr < (x)) \ XP_ERROR(XPATH_STACK_ERROR); /** * Macro to try to cast the value on the top of the XPath stack to a string. */ #define CAST_TO_STRING \ if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \ xmlXPathStringFunction(ctxt, 1); /** * Macro to try to cast the value on the top of the XPath stack to a number. */ #define CAST_TO_NUMBER \ if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \ xmlXPathNumberFunction(ctxt, 1); /** * Macro to try to cast the value on the top of the XPath stack to a boolean. */ #define CAST_TO_BOOLEAN \ if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \ xmlXPathBooleanFunction(ctxt, 1); /* * Variable Lookup forwarding. */ XMLPUBFUN void xmlXPathRegisterVariableLookup (xmlXPathContext *ctxt, xmlXPathVariableLookupFunc f, void *data); /* * Function Lookup forwarding. */ XMLPUBFUN void xmlXPathRegisterFuncLookup (xmlXPathContext *ctxt, xmlXPathFuncLookupFunc f, void *funcCtxt); /* * Error reporting. */ XMLPUBFUN void xmlXPatherror (xmlXPathParserContext *ctxt, const char *file, int line, int no); XMLPUBFUN void xmlXPathErr (xmlXPathParserContext *ctxt, int error); #ifdef LIBXML_DEBUG_ENABLED XMLPUBFUN void xmlXPathDebugDumpObject (FILE *output, xmlXPathObject *cur, int depth); XMLPUBFUN void xmlXPathDebugDumpCompExpr(FILE *output, xmlXPathCompExpr *comp, int depth); #endif /** * NodeSet handling. */ XMLPUBFUN int xmlXPathNodeSetContains (xmlNodeSet *cur, xmlNode *val); XMLPUBFUN xmlNodeSet * xmlXPathDifference (xmlNodeSet *nodes1, xmlNodeSet *nodes2); XMLPUBFUN xmlNodeSet * xmlXPathIntersection (xmlNodeSet *nodes1, xmlNodeSet *nodes2); XMLPUBFUN xmlNodeSet * xmlXPathDistinctSorted (xmlNodeSet *nodes); XMLPUBFUN xmlNodeSet * xmlXPathDistinct (xmlNodeSet *nodes); XMLPUBFUN int xmlXPathHasSameNodes (xmlNodeSet *nodes1, xmlNodeSet *nodes2); XMLPUBFUN xmlNodeSet * xmlXPathNodeLeadingSorted (xmlNodeSet *nodes, xmlNode *node); XMLPUBFUN xmlNodeSet * xmlXPathLeadingSorted (xmlNodeSet *nodes1, xmlNodeSet *nodes2); XMLPUBFUN xmlNodeSet * xmlXPathNodeLeading (xmlNodeSet *nodes, xmlNode *node); XMLPUBFUN xmlNodeSet * xmlXPathLeading (xmlNodeSet *nodes1, xmlNodeSet *nodes2); XMLPUBFUN xmlNodeSet * xmlXPathNodeTrailingSorted (xmlNodeSet *nodes, xmlNode *node); XMLPUBFUN xmlNodeSet * xmlXPathTrailingSorted (xmlNodeSet *nodes1, xmlNodeSet *nodes2); XMLPUBFUN xmlNodeSet * xmlXPathNodeTrailing (xmlNodeSet *nodes, xmlNode *node); XMLPUBFUN xmlNodeSet * xmlXPathTrailing (xmlNodeSet *nodes1, xmlNodeSet *nodes2); /** * Extending a context. */ XMLPUBFUN int xmlXPathRegisterNs (xmlXPathContext *ctxt, const xmlChar *prefix, const xmlChar *ns_uri); XMLPUBFUN const xmlChar * xmlXPathNsLookup (xmlXPathContext *ctxt, const xmlChar *prefix); XMLPUBFUN void xmlXPathRegisteredNsCleanup (xmlXPathContext *ctxt); XMLPUBFUN int xmlXPathRegisterFunc (xmlXPathContext *ctxt, const xmlChar *name, xmlXPathFunction f); XMLPUBFUN int xmlXPathRegisterFuncNS (xmlXPathContext *ctxt, const xmlChar *name, const xmlChar *ns_uri, xmlXPathFunction f); XMLPUBFUN int xmlXPathRegisterVariable (xmlXPathContext *ctxt, const xmlChar *name, xmlXPathObject *value); XMLPUBFUN int xmlXPathRegisterVariableNS (xmlXPathContext *ctxt, const xmlChar *name, const xmlChar *ns_uri, xmlXPathObject *value); XMLPUBFUN xmlXPathFunction xmlXPathFunctionLookup (xmlXPathContext *ctxt, const xmlChar *name); XMLPUBFUN xmlXPathFunction xmlXPathFunctionLookupNS (xmlXPathContext *ctxt, const xmlChar *name, const xmlChar *ns_uri); XMLPUBFUN void xmlXPathRegisteredFuncsCleanup (xmlXPathContext *ctxt); XMLPUBFUN xmlXPathObject * xmlXPathVariableLookup (xmlXPathContext *ctxt, const xmlChar *name); XMLPUBFUN xmlXPathObject * xmlXPathVariableLookupNS (xmlXPathContext *ctxt, const xmlChar *name, const xmlChar *ns_uri); XMLPUBFUN void xmlXPathRegisteredVariablesCleanup(xmlXPathContext *ctxt); /** * Utilities to extend XPath. */ XMLPUBFUN xmlXPathParserContext * xmlXPathNewParserContext (const xmlChar *str, xmlXPathContext *ctxt); XMLPUBFUN void xmlXPathFreeParserContext (xmlXPathParserContext *ctxt); XMLPUBFUN xmlXPathObject * xmlXPathValuePop (xmlXPathParserContext *ctxt); XMLPUBFUN int xmlXPathValuePush (xmlXPathParserContext *ctxt, xmlXPathObject *value); XMLPUBFUN xmlXPathObject * xmlXPathNewString (const xmlChar *val); XMLPUBFUN xmlXPathObject * xmlXPathNewCString (const char *val); XMLPUBFUN xmlXPathObject * xmlXPathWrapString (xmlChar *val); XMLPUBFUN xmlXPathObject * xmlXPathWrapCString (char * val); XMLPUBFUN xmlXPathObject * xmlXPathNewFloat (double val); XMLPUBFUN xmlXPathObject * xmlXPathNewBoolean (int val); XMLPUBFUN xmlXPathObject * xmlXPathNewNodeSet (xmlNode *val); XMLPUBFUN xmlXPathObject * xmlXPathNewValueTree (xmlNode *val); XMLPUBFUN int xmlXPathNodeSetAdd (xmlNodeSet *cur, xmlNode *val); XMLPUBFUN int xmlXPathNodeSetAddUnique (xmlNodeSet *cur, xmlNode *val); XMLPUBFUN int xmlXPathNodeSetAddNs (xmlNodeSet *cur, xmlNode *node, xmlNs *ns); XMLPUBFUN void xmlXPathNodeSetSort (xmlNodeSet *set); XMLPUBFUN void xmlXPathRoot (xmlXPathParserContext *ctxt); XML_DEPRECATED XMLPUBFUN void xmlXPathEvalExpr (xmlXPathParserContext *ctxt); XMLPUBFUN xmlChar * xmlXPathParseName (xmlXPathParserContext *ctxt); XMLPUBFUN xmlChar * xmlXPathParseNCName (xmlXPathParserContext *ctxt); /* * Existing functions. */ XMLPUBFUN double xmlXPathStringEvalNumber (const xmlChar *str); XMLPUBFUN int xmlXPathEvaluatePredicateResult (xmlXPathParserContext *ctxt, xmlXPathObject *res); XMLPUBFUN void xmlXPathRegisterAllFunctions (xmlXPathContext *ctxt); XMLPUBFUN xmlNodeSet * xmlXPathNodeSetMerge (xmlNodeSet *val1, xmlNodeSet *val2); XMLPUBFUN void xmlXPathNodeSetDel (xmlNodeSet *cur, xmlNode *val); XMLPUBFUN void xmlXPathNodeSetRemove (xmlNodeSet *cur, int val); XMLPUBFUN xmlXPathObject * xmlXPathNewNodeSetList (xmlNodeSet *val); XMLPUBFUN xmlXPathObject * xmlXPathWrapNodeSet (xmlNodeSet *val); XMLPUBFUN xmlXPathObject * xmlXPathWrapExternal (void *val); XMLPUBFUN int xmlXPathEqualValues(xmlXPathParserContext *ctxt); XMLPUBFUN int xmlXPathNotEqualValues(xmlXPathParserContext *ctxt); XMLPUBFUN int xmlXPathCompareValues(xmlXPathParserContext *ctxt, int inf, int strict); XMLPUBFUN void xmlXPathValueFlipSign(xmlXPathParserContext *ctxt); XMLPUBFUN void xmlXPathAddValues(xmlXPathParserContext *ctxt); XMLPUBFUN void xmlXPathSubValues(xmlXPathParserContext *ctxt); XMLPUBFUN void xmlXPathMultValues(xmlXPathParserContext *ctxt); XMLPUBFUN void xmlXPathDivValues(xmlXPathParserContext *ctxt); XMLPUBFUN void xmlXPathModValues(xmlXPathParserContext *ctxt); XMLPUBFUN int xmlXPathIsNodeType(const xmlChar *name); /* * Some of the axis navigation routines. */ XMLPUBFUN xmlNode *xmlXPathNextSelf(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextChild(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextDescendant(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextDescendantOrSelf(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextParent(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextAncestorOrSelf(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextFollowingSibling(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextFollowing(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextNamespace(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextAttribute(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextPreceding(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextAncestor(xmlXPathParserContext *ctxt, xmlNode *cur); XMLPUBFUN xmlNode *xmlXPathNextPrecedingSibling(xmlXPathParserContext *ctxt, xmlNode *cur); /* * The official core of XPath functions. */ XMLPUBFUN void xmlXPathLastFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathPositionFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathCountFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathIdFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathLocalNameFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathNamespaceURIFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathStringFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathStringLengthFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathConcatFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathContainsFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathStartsWithFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathSubstringFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathSubstringBeforeFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathSubstringAfterFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathNormalizeFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathTranslateFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathNotFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathTrueFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathFalseFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathLangFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathNumberFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathSumFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathFloorFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathCeilingFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathRoundFunction(xmlXPathParserContext *ctxt, int nargs); XMLPUBFUN void xmlXPathBooleanFunction(xmlXPathParserContext *ctxt, int nargs); /** * Really internal functions */ XMLPUBFUN void xmlXPathNodeSetFreeNs(xmlNs *ns); #ifdef __cplusplus } #endif #endif /* LIBXML_XPATH_ENABLED */ #endif /* ! __XML_XPATH_INTERNALS_H__ */