blob: 5126dc7dbfb258e262cf1b2ba2dbeaa2037cf164 [file] [log] [blame]
Daniel Veillard29a11cc2000-10-25 13:32:39 +00001/*
2 * xpath.c: internal interfaces for XML Path Language implementation
3 * used to build new modules on top of XPath
4 *
5 * See COPYRIGHT for the status of this software
6 *
7 * Author: Daniel.Veillard@w3.org
8 */
9
10#ifndef __XML_XPATH_INTERNALS_H__
11#define __XML_XPATH_INTERNALS_H__
12
13#include <libxml/xpath.h>
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19/************************************************************************
20 * *
21 * Helpers *
22 * *
23 ************************************************************************/
24
25#define CHECK_ERROR \
26 if (ctxt->error != XPATH_EXPRESSION_OK) return
27
28#define CHECK_ERROR0 \
29 if (ctxt->error != XPATH_EXPRESSION_OK) return(0)
30
31#define XP_ERROR(X) \
32 { xmlXPatherror(ctxt, __FILE__, __LINE__, X); \
33 ctxt->error = (X); return; }
34
35#define XP_ERROR0(X) \
36 { xmlXPatherror(ctxt, __FILE__, __LINE__, X); \
37 ctxt->error = (X); return(0); }
38
39#define CHECK_TYPE(typeval) \
40 if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \
Daniel Veillarda5db68a2000-10-29 18:06:06 +000041 XP_ERROR(XPATH_INVALID_TYPE)
Daniel Veillard29a11cc2000-10-25 13:32:39 +000042
43#define CHECK_ARITY(x) \
Daniel Veillarda5db68a2000-10-29 18:06:06 +000044 if (nargs != (x)) \
45 XP_ERROR(XPATH_INVALID_ARITY);
46
47#define CAST_TO_STRING \
48 if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \
49 xmlXPathStringFunction(ctxt, 1);
50
51#define CAST_TO_NUMBER \
52 if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \
53 xmlXPathNumberFunction(ctxt, 1);
54
55#define CAST_TO_BOOLEAN \
56 if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \
57 xmlXPathBooleanFunction(ctxt, 1);
Daniel Veillard29a11cc2000-10-25 13:32:39 +000058
59void xmlXPatherror (xmlXPathParserContextPtr ctxt,
60 const char *file,
61 int line,
62 int no);
63
64void xmlXPathDebugDumpObject (FILE *output,
65 xmlXPathObjectPtr cur,
66 int depth);
67
68/**
69 * Extending a context
70 */
Daniel Veillarda6d8eb62000-12-27 10:46:47 +000071int xmlXPathRegisterNs (xmlXPathContextPtr ctxt,
72 const xmlChar *prefix,
73 const xmlChar *ns_uri);
74const xmlChar * xmlXPathNsLookup (xmlXPathContextPtr ctxt,
75 const xmlChar *ns_uri);
76void xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt);
77
Daniel Veillard29a11cc2000-10-25 13:32:39 +000078int xmlXPathRegisterFunc (xmlXPathContextPtr ctxt,
79 const xmlChar *name,
80 xmlXPathFunction f);
Daniel Veillarda5db68a2000-10-29 18:06:06 +000081int xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt,
82 const xmlChar *name,
83 const xmlChar *ns_uri,
84 xmlXPathFunction f);
Daniel Veillard29a11cc2000-10-25 13:32:39 +000085int xmlXPathRegisterVariable (xmlXPathContextPtr ctxt,
86 const xmlChar *name,
87 xmlXPathObjectPtr value);
Daniel Veillarda5db68a2000-10-29 18:06:06 +000088int xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt,
89 const xmlChar *name,
90 const xmlChar *ns_uri,
91 xmlXPathObjectPtr value);
Daniel Veillard29a11cc2000-10-25 13:32:39 +000092xmlXPathFunction xmlXPathFunctionLookup (xmlXPathContextPtr ctxt,
93 const xmlChar *name);
Daniel Veillarda5db68a2000-10-29 18:06:06 +000094xmlXPathFunction xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt,
95 const xmlChar *name,
96 const xmlChar *ns_uri);
Daniel Veillard29a11cc2000-10-25 13:32:39 +000097void xmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt);
98xmlXPathObjectPtr xmlXPathVariableLookup (xmlXPathContextPtr ctxt,
99 const xmlChar *name);
Daniel Veillarda5db68a2000-10-29 18:06:06 +0000100xmlXPathObjectPtr xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt,
101 const xmlChar *name,
102 const xmlChar *ns_uri);
Daniel Veillard29a11cc2000-10-25 13:32:39 +0000103void xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt);
104
105/**
106 * Utilities to extend XPath
107 */
108xmlXPathParserContextPtr
109 xmlXPathNewParserContext (const xmlChar *str,
110 xmlXPathContextPtr ctxt);
111void xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt);
112
Daniel Veillard389e6b72001-01-15 19:41:13 +0000113/* TODO: remap to xmlXPathValuePop and Push */
Daniel Veillard29a11cc2000-10-25 13:32:39 +0000114xmlXPathObjectPtr valuePop (xmlXPathParserContextPtr ctxt);
115int valuePush (xmlXPathParserContextPtr ctxt,
116 xmlXPathObjectPtr value);
117
118xmlXPathObjectPtr xmlXPathNewString (const xmlChar *val);
119xmlXPathObjectPtr xmlXPathNewCString (const char *val);
120xmlXPathObjectPtr xmlXPathNewFloat (double val);
121xmlXPathObjectPtr xmlXPathNewBoolean (int val);
122xmlXPathObjectPtr xmlXPathNewNodeSet (xmlNodePtr val);
123void xmlXPathNodeSetAdd (xmlNodeSetPtr cur,
124 xmlNodePtr val);
125
126
127void xmlXPathIdFunction (xmlXPathParserContextPtr ctxt,
128 int nargs);
129void xmlXPathRoot (xmlXPathParserContextPtr ctxt);
130void xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt);
131xmlChar * xmlXPathParseName (xmlXPathParserContextPtr ctxt);
Daniel Veillarda6d8eb62000-12-27 10:46:47 +0000132xmlChar * xmlXPathParseNCName (xmlXPathParserContextPtr ctxt);
Daniel Veillard29a11cc2000-10-25 13:32:39 +0000133
134/*
135 * Debug
136 */
137#ifdef LIBXML_DEBUG_ENABLED
138double xmlXPathStringEvalNumber(const xmlChar *str);
139void xmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth);
140#endif
141/*
142 * Existing functions
143 */
144
Daniel Veillardf62ceff2000-11-24 23:36:01 +0000145int xmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt,
146 xmlXPathObjectPtr res);
Daniel Veillard29a11cc2000-10-25 13:32:39 +0000147void xmlXPathInit(void);
148void xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs);
149void xmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt);
150xmlNodeSetPtr xmlXPathNodeSetCreate(xmlNodePtr val);
151void xmlXPathNodeSetAdd(xmlNodeSetPtr cur, xmlNodePtr val);
152xmlNodeSetPtr xmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2);
153void xmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val);
154void xmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val);
155void xmlXPathFreeNodeSet(xmlNodeSetPtr obj);
156xmlXPathObjectPtr xmlXPathNewNodeSet(xmlNodePtr val);
157xmlXPathObjectPtr xmlXPathNewNodeSetList(xmlNodeSetPtr val);
158xmlXPathObjectPtr xmlXPathWrapNodeSet(xmlNodeSetPtr val);
159void xmlXPathFreeNodeSetList(xmlXPathObjectPtr obj);
160
161
162xmlXPathObjectPtr xmlXPathNewFloat(double val);
163xmlXPathObjectPtr xmlXPathNewBoolean(int val);
164xmlXPathObjectPtr xmlXPathNewString(const xmlChar *val);
165xmlXPathObjectPtr xmlXPathNewCString(const char *val);
166void xmlXPathFreeObject(xmlXPathObjectPtr obj);
167xmlXPathContextPtr xmlXPathNewContext(xmlDocPtr doc);
168void xmlXPathFreeContext(xmlXPathContextPtr ctxt);
169
170int xmlXPathEqualValues(xmlXPathParserContextPtr ctxt);
171int xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict);
172void xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt);
173void xmlXPathAddValues(xmlXPathParserContextPtr ctxt);
174void xmlXPathSubValues(xmlXPathParserContextPtr ctxt);
175void xmlXPathMultValues(xmlXPathParserContextPtr ctxt);
176void xmlXPathDivValues(xmlXPathParserContextPtr ctxt);
177void xmlXPathModValues(xmlXPathParserContextPtr ctxt);
178
179/*
180 * The official core of XPath functions
181 */
182void xmlXPathRoot(xmlXPathParserContextPtr ctxt);
183void xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs);
184void xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs);
185void xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs);
186void xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs);
Daniel Veillardf6bf9212000-10-26 14:07:44 +0000187void xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs);
188void xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs);
Daniel Veillard29a11cc2000-10-25 13:32:39 +0000189void xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs);
190void xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs);
191void xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs);
192void xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs);
193void xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs);
194void xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs);
195void xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs);
196void xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs);
197void xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs);
198void xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs);
199void xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs);
200void xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs);
201void xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs);
202void xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs);
203void xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs);
204void xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs);
205void xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs);
206void xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs);
207void xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs);
Daniel Veillard389e6b72001-01-15 19:41:13 +0000208void xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs);
Daniel Veillard29a11cc2000-10-25 13:32:39 +0000209#ifdef __cplusplus
210}
211#endif
212#endif /* ! __XML_XPATH_INTERNALS_H__ */