blob: cb2f3b42e66fbe340b2e6d7db586988b18bfe90f [file] [log] [blame]
Owen Taylor3473f882001-02-23 17:55:21 +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)) \
41 XP_ERROR(XPATH_INVALID_TYPE)
42
43#define CHECK_ARITY(x) \
44 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);
58
59/*
60 * Varibale Lookup forwarding
61 */
62typedef xmlXPathObjectPtr
63 (*xmlXPathVariableLookupFunc) (void *ctxt,
64 const xmlChar *name,
65 const xmlChar *ns_uri);
66
67void xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt,
68 xmlXPathVariableLookupFunc f,
69 void *varCtxt);
70
71/*
72 * Error reporting
73 */
74void xmlXPatherror (xmlXPathParserContextPtr ctxt,
75 const char *file,
76 int line,
77 int no);
78
79void xmlXPathDebugDumpObject (FILE *output,
80 xmlXPathObjectPtr cur,
81 int depth);
Daniel Veillard56a4cb82001-03-24 17:00:36 +000082void xmlXPathDebugDumpCompExpr(FILE *output,
83 xmlXPathCompExprPtr comp,
84 int depth);
Owen Taylor3473f882001-02-23 17:55:21 +000085/**
86 * Extending a context
87 */
88
89int xmlXPathRegisterNs (xmlXPathContextPtr ctxt,
90 const xmlChar *prefix,
91 const xmlChar *ns_uri);
92const xmlChar * xmlXPathNsLookup (xmlXPathContextPtr ctxt,
93 const xmlChar *ns_uri);
94void xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt);
95
96int xmlXPathRegisterFunc (xmlXPathContextPtr ctxt,
97 const xmlChar *name,
98 xmlXPathFunction f);
99int xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt,
100 const xmlChar *name,
101 const xmlChar *ns_uri,
102 xmlXPathFunction f);
103int xmlXPathRegisterVariable (xmlXPathContextPtr ctxt,
104 const xmlChar *name,
105 xmlXPathObjectPtr value);
106int xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt,
107 const xmlChar *name,
108 const xmlChar *ns_uri,
109 xmlXPathObjectPtr value);
110xmlXPathFunction xmlXPathFunctionLookup (xmlXPathContextPtr ctxt,
111 const xmlChar *name);
112xmlXPathFunction xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt,
113 const xmlChar *name,
114 const xmlChar *ns_uri);
115void xmlXPathRegisteredFuncsCleanup(xmlXPathContextPtr ctxt);
116xmlXPathObjectPtr xmlXPathVariableLookup (xmlXPathContextPtr ctxt,
117 const xmlChar *name);
118xmlXPathObjectPtr xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt,
119 const xmlChar *name,
120 const xmlChar *ns_uri);
121void xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt);
122
123/**
124 * Utilities to extend XPath
125 */
126xmlXPathParserContextPtr
127 xmlXPathNewParserContext (const xmlChar *str,
128 xmlXPathContextPtr ctxt);
129void xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt);
130
131/* TODO: remap to xmlXPathValuePop and Push */
132xmlXPathObjectPtr valuePop (xmlXPathParserContextPtr ctxt);
133int valuePush (xmlXPathParserContextPtr ctxt,
134 xmlXPathObjectPtr value);
135
136xmlXPathObjectPtr xmlXPathNewString (const xmlChar *val);
137xmlXPathObjectPtr xmlXPathNewCString (const char *val);
138xmlXPathObjectPtr xmlXPathNewFloat (double val);
139xmlXPathObjectPtr xmlXPathNewBoolean (int val);
140xmlXPathObjectPtr xmlXPathNewNodeSet (xmlNodePtr val);
141xmlXPathObjectPtr xmlXPathNewValueTree (xmlNodePtr val);
142void xmlXPathNodeSetAdd (xmlNodeSetPtr cur,
143 xmlNodePtr val);
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000144void xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur,
145 xmlNodePtr val);
146void xmlXPathNodeSetSort (xmlNodeSetPtr set);
Owen Taylor3473f882001-02-23 17:55:21 +0000147
148void xmlXPathIdFunction (xmlXPathParserContextPtr ctxt,
149 int nargs);
150void xmlXPathRoot (xmlXPathParserContextPtr ctxt);
151void xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt);
152xmlChar * xmlXPathParseName (xmlXPathParserContextPtr ctxt);
153xmlChar * xmlXPathParseNCName (xmlXPathParserContextPtr ctxt);
154
155/*
156 * Debug
157 */
158#ifdef LIBXML_DEBUG_ENABLED
159double xmlXPathStringEvalNumber(const xmlChar *str);
160void xmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth);
161#endif
162/*
163 * Existing functions
164 */
165
166int xmlXPathEvaluatePredicateResult(xmlXPathParserContextPtr ctxt,
167 xmlXPathObjectPtr res);
168void xmlXPathInit(void);
169void xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs);
170void xmlXPathRegisterAllFunctions(xmlXPathContextPtr ctxt);
171xmlNodeSetPtr xmlXPathNodeSetCreate(xmlNodePtr val);
172void xmlXPathNodeSetAdd(xmlNodeSetPtr cur, xmlNodePtr val);
173xmlNodeSetPtr xmlXPathNodeSetMerge(xmlNodeSetPtr val1, xmlNodeSetPtr val2);
174void xmlXPathNodeSetDel(xmlNodeSetPtr cur, xmlNodePtr val);
175void xmlXPathNodeSetRemove(xmlNodeSetPtr cur, int val);
176void xmlXPathFreeNodeSet(xmlNodeSetPtr obj);
177xmlXPathObjectPtr xmlXPathNewNodeSet(xmlNodePtr val);
178xmlXPathObjectPtr xmlXPathNewNodeSetList(xmlNodeSetPtr val);
179xmlXPathObjectPtr xmlXPathWrapNodeSet(xmlNodeSetPtr val);
180void xmlXPathFreeNodeSetList(xmlXPathObjectPtr obj);
181
182
183xmlXPathObjectPtr xmlXPathNewFloat(double val);
184xmlXPathObjectPtr xmlXPathNewBoolean(int val);
185xmlXPathObjectPtr xmlXPathNewString(const xmlChar *val);
186xmlXPathObjectPtr xmlXPathNewCString(const char *val);
187void xmlXPathFreeObject(xmlXPathObjectPtr obj);
188xmlXPathContextPtr xmlXPathNewContext(xmlDocPtr doc);
189void xmlXPathFreeContext(xmlXPathContextPtr ctxt);
190
191int xmlXPathEqualValues(xmlXPathParserContextPtr ctxt);
192int xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict);
193void xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt);
194void xmlXPathAddValues(xmlXPathParserContextPtr ctxt);
195void xmlXPathSubValues(xmlXPathParserContextPtr ctxt);
196void xmlXPathMultValues(xmlXPathParserContextPtr ctxt);
197void xmlXPathDivValues(xmlXPathParserContextPtr ctxt);
198void xmlXPathModValues(xmlXPathParserContextPtr ctxt);
199
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000200int xmlXPathIsNodeType(const xmlChar *name);
Owen Taylor3473f882001-02-23 17:55:21 +0000201
202/*
203 * Some of the axis navigation routines
204 */
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000205xmlNodePtr xmlXPathNextSelf(xmlXPathParserContextPtr ctxt,
206 xmlNodePtr cur);
207xmlNodePtr xmlXPathNextChild(xmlXPathParserContextPtr ctxt,
208 xmlNodePtr cur);
209xmlNodePtr xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt,
210 xmlNodePtr cur);
211xmlNodePtr xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt,
212 xmlNodePtr cur);
213xmlNodePtr xmlXPathNextParent(xmlXPathParserContextPtr ctxt,
214 xmlNodePtr cur);
215xmlNodePtr xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt,
216 xmlNodePtr cur);
217xmlNodePtr xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt,
218 xmlNodePtr cur);
219xmlNodePtr xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt,
220 xmlNodePtr cur);
221xmlNodePtr xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt,
222 xmlNodePtr cur);
223xmlNodePtr xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt,
224 xmlNodePtr cur);
225xmlNodePtr xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt,
226 xmlNodePtr cur);
227xmlNodePtr xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt,
228 xmlNodePtr cur);
229xmlNodePtr xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt,
230 xmlNodePtr cur);
Owen Taylor3473f882001-02-23 17:55:21 +0000231/*
232 * The official core of XPath functions
233 */
234void xmlXPathRoot(xmlXPathParserContextPtr ctxt);
235void xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs);
236void xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs);
237void xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs);
238void xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs);
239void xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs);
240void xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs);
241void xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs);
242void xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs);
243void xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs);
244void xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs);
245void xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs);
246void xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs);
247void xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs);
248void xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs);
249void xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs);
250void xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs);
251void xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs);
252void xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs);
253void xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs);
254void xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs);
255void xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs);
256void xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs);
257void xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs);
258void xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs);
259void xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs);
260void xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs);
261#ifdef __cplusplus
262}
263#endif
264#endif /* ! __XML_XPATH_INTERNALS_H__ */