blob: 88ee27c6b080b4235c56ed887bb1d15f7652be16 [file] [log] [blame]
Owen Taylor3473f882001-02-23 17:55:21 +00001/*
Daniel Veillardbe586972003-11-18 20:56:51 +00002 * Summary: internal interfaces for XML Path Language implementation
3 * Description: internal interfaces for XML Path Language implementation
4 * used to build new modules on top of XPath like XPointer and
5 * XSLT
Owen Taylor3473f882001-02-23 17:55:21 +00006 *
Daniel Veillardbe586972003-11-18 20:56:51 +00007 * Copy: See Copyright for the status of this software.
Owen Taylor3473f882001-02-23 17:55:21 +00008 *
Daniel Veillardbe586972003-11-18 20:56:51 +00009 * Author: Daniel Veillard
Owen Taylor3473f882001-02-23 17:55:21 +000010 */
11
12#ifndef __XML_XPATH_INTERNALS_H__
13#define __XML_XPATH_INTERNALS_H__
14
Daniel Veillard017b1082001-06-21 11:20:21 +000015#include <libxml/xmlversion.h>
Owen Taylor3473f882001-02-23 17:55:21 +000016#include <libxml/xpath.h>
17
Daniel Veillarda2351322004-06-27 12:08:10 +000018#ifdef LIBXML_XPATH_ENABLED
19
Owen Taylor3473f882001-02-23 17:55:21 +000020#ifdef __cplusplus
21extern "C" {
22#endif
23
24/************************************************************************
25 * *
26 * Helpers *
27 * *
28 ************************************************************************/
29
William M. Brack60f394e2003-11-16 06:25:42 +000030/*
Daniel Veillard8fcc4942001-07-17 20:07:33 +000031 * Many of these macros may later turn into functions. They
32 * shouldn't be used in #ifdef's preprocessor instructions.
33 */
Thomas Broyerf06a3d82001-07-16 04:52:57 +000034/**
35 * xmlXPathSetError:
36 * @ctxt: an XPath parser context
37 * @err: an xmlXPathError code
38 *
39 * Raises an error.
40 */
41#define xmlXPathSetError(ctxt, err) \
42 { xmlXPatherror((ctxt), __FILE__, __LINE__, (err)); \
43 (ctxt)->error = (err); }
Daniel Veillard8fcc4942001-07-17 20:07:33 +000044
Thomas Broyerf06a3d82001-07-16 04:52:57 +000045/**
46 * xmlXPathSetArityError:
47 * @ctxt: an XPath parser context
48 *
Daniel Veillard61f26172002-03-12 18:46:39 +000049 * Raises an XPATH_INVALID_ARITY error.
Thomas Broyerf06a3d82001-07-16 04:52:57 +000050 */
51#define xmlXPathSetArityError(ctxt) \
52 xmlXPathSetError((ctxt), XPATH_INVALID_ARITY)
Daniel Veillard8fcc4942001-07-17 20:07:33 +000053
Thomas Broyerf06a3d82001-07-16 04:52:57 +000054/**
55 * xmlXPathSetTypeError:
56 * @ctxt: an XPath parser context
57 *
Daniel Veillard61f26172002-03-12 18:46:39 +000058 * Raises an XPATH_INVALID_TYPE error.
Thomas Broyerf06a3d82001-07-16 04:52:57 +000059 */
60#define xmlXPathSetTypeError(ctxt) \
61 xmlXPathSetError((ctxt), XPATH_INVALID_TYPE)
Daniel Veillard8fcc4942001-07-17 20:07:33 +000062
Thomas Broyerf06a3d82001-07-16 04:52:57 +000063/**
64 * xmlXPathGetError:
65 * @ctxt: an XPath parser context
66 *
Daniel Veillard61f26172002-03-12 18:46:39 +000067 * Get the error code of an XPath context.
Daniel Veillard5e2dace2001-07-18 19:30:27 +000068 *
Daniel Veillard61f26172002-03-12 18:46:39 +000069 * Returns the context error.
Thomas Broyerf06a3d82001-07-16 04:52:57 +000070 */
71#define xmlXPathGetError(ctxt) ((ctxt)->error)
Daniel Veillard8fcc4942001-07-17 20:07:33 +000072
Thomas Broyerf06a3d82001-07-16 04:52:57 +000073/**
74 * xmlXPathCheckError:
75 * @ctxt: an XPath parser context
76 *
Daniel Veillard61f26172002-03-12 18:46:39 +000077 * Check if an XPath error was raised.
Daniel Veillard5e2dace2001-07-18 19:30:27 +000078 *
Thomas Broyerf06a3d82001-07-16 04:52:57 +000079 * Returns true if an error has been raised, false otherwise.
80 */
81#define xmlXPathCheckError(ctxt) ((ctxt)->error != XPATH_EXPRESSION_OK)
82
83/**
84 * xmlXPathGetDocument:
85 * @ctxt: an XPath parser context
86 *
Daniel Veillard61f26172002-03-12 18:46:39 +000087 * Get the document of an XPath context.
Daniel Veillard5e2dace2001-07-18 19:30:27 +000088 *
Daniel Veillard61f26172002-03-12 18:46:39 +000089 * Returns the context document.
Thomas Broyerf06a3d82001-07-16 04:52:57 +000090 */
91#define xmlXPathGetDocument(ctxt) ((ctxt)->context->doc)
Daniel Veillard8fcc4942001-07-17 20:07:33 +000092
Thomas Broyerf06a3d82001-07-16 04:52:57 +000093/**
94 * xmlXPathGetContextNode:
95 * @ctxt: an XPath parser context
96 *
Daniel Veillard61f26172002-03-12 18:46:39 +000097 * Get the context node of an XPath context.
Daniel Veillard5e2dace2001-07-18 19:30:27 +000098 *
Daniel Veillard61f26172002-03-12 18:46:39 +000099 * Returns the context node.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000100 */
101#define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node)
102
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000103XMLPUBFUN int XMLCALL
104 xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt);
105XMLPUBFUN double XMLCALL
106 xmlXPathPopNumber (xmlXPathParserContextPtr ctxt);
107XMLPUBFUN xmlChar * XMLCALL
108 xmlXPathPopString (xmlXPathParserContextPtr ctxt);
109XMLPUBFUN xmlNodeSetPtr XMLCALL
110 xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt);
111XMLPUBFUN void * XMLCALL
112 xmlXPathPopExternal (xmlXPathParserContextPtr ctxt);
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000113
114/**
115 * xmlXPathReturnBoolean:
116 * @ctxt: an XPath parser context
117 * @val: a boolean
118 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000119 * Pushes the boolean @val on the context stack.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000120 */
121#define xmlXPathReturnBoolean(ctxt, val) \
122 valuePush((ctxt), xmlXPathNewBoolean(val))
Daniel Veillard8fcc4942001-07-17 20:07:33 +0000123
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000124/**
125 * xmlXPathReturnTrue:
126 * @ctxt: an XPath parser context
127 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000128 * Pushes true on the context stack.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000129 */
130#define xmlXPathReturnTrue(ctxt) xmlXPathReturnBoolean((ctxt), 1)
Daniel Veillard8fcc4942001-07-17 20:07:33 +0000131
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000132/**
133 * xmlXPathReturnFalse:
134 * @ctxt: an XPath parser context
135 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000136 * Pushes false on the context stack.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000137 */
138#define xmlXPathReturnFalse(ctxt) xmlXPathReturnBoolean((ctxt), 0)
Daniel Veillard8fcc4942001-07-17 20:07:33 +0000139
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000140/**
141 * xmlXPathReturnNumber:
142 * @ctxt: an XPath parser context
143 * @val: a double
144 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000145 * Pushes the double @val on the context stack.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000146 */
147#define xmlXPathReturnNumber(ctxt, val) \
148 valuePush((ctxt), xmlXPathNewFloat(val))
Daniel Veillard8fcc4942001-07-17 20:07:33 +0000149
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000150/**
151 * xmlXPathReturnString:
152 * @ctxt: an XPath parser context
153 * @str: a string
154 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000155 * Pushes the string @str on the context stack.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000156 */
157#define xmlXPathReturnString(ctxt, str) \
William M. Brack09428a32003-12-20 09:20:39 +0000158 valuePush((ctxt), xmlXPathWrapString(str))
Daniel Veillard8fcc4942001-07-17 20:07:33 +0000159
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000160/**
161 * xmlXPathReturnEmptyString:
162 * @ctxt: an XPath parser context
163 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000164 * Pushes an empty string on the stack.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000165 */
166#define xmlXPathReturnEmptyString(ctxt) \
167 valuePush((ctxt), xmlXPathNewCString(""))
Daniel Veillard8fcc4942001-07-17 20:07:33 +0000168
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000169/**
170 * xmlXPathReturnNodeSet:
171 * @ctxt: an XPath parser context
172 * @ns: a node-set
173 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000174 * Pushes the node-set @ns on the context stack.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000175 */
176#define xmlXPathReturnNodeSet(ctxt, ns) \
177 valuePush((ctxt), xmlXPathWrapNodeSet(ns))
Daniel Veillard8fcc4942001-07-17 20:07:33 +0000178
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000179/**
180 * xmlXPathReturnEmptyNodeSet:
181 * @ctxt: an XPath parser context
182 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000183 * Pushes an empty node-set on the context stack.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000184 */
Daniel Veillard5344c602001-12-31 16:37:34 +0000185#define xmlXPathReturnEmptyNodeSet(ctxt) \
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000186 valuePush((ctxt), xmlXPathNewNodeSet(NULL))
Daniel Veillard8fcc4942001-07-17 20:07:33 +0000187
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000188/**
189 * xmlXPathReturnExternal:
190 * @ctxt: an XPath parser context
191 * @val: user data
192 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000193 * Pushes user data on the context stack.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000194 */
195#define xmlXPathReturnExternal(ctxt, val) \
196 valuePush((ctxt), xmlXPathWrapExternal(val))
197
198/**
199 * xmlXPathStackIsNodeSet:
200 * @ctxt: an XPath parser context
201 *
Daniel Veillard5e2dace2001-07-18 19:30:27 +0000202 * Check if the current value on the XPath stack is a node set or
Daniel Veillard61f26172002-03-12 18:46:39 +0000203 * an XSLT value tree.
Daniel Veillard5e2dace2001-07-18 19:30:27 +0000204 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000205 * Returns true if the current object on the stack is a node-set.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000206 */
207#define xmlXPathStackIsNodeSet(ctxt) \
208 (((ctxt)->value != NULL) \
209 && (((ctxt)->value->type == XPATH_NODESET) \
210 || ((ctxt)->value->type == XPATH_XSLT_TREE)))
211
212/**
Thomas Broyer47334c02001-10-07 16:41:52 +0000213 * xmlXPathStackIsExternal:
214 * @ctxt: an XPath parser context
215 *
216 * Checks if the current value on the XPath stack is an external
217 * object.
218 *
219 * Returns true if the current object on the stack is an external
Daniel Veillard61f26172002-03-12 18:46:39 +0000220 * object.
Thomas Broyer47334c02001-10-07 16:41:52 +0000221 */
222#define xmlXPathStackIsExternal(ctxt) \
223 ((ctxt->value != NULL) && (ctxt->value->type == XPATH_USERS))
224
225/**
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000226 * xmlXPathEmptyNodeSet:
227 * @ns: a node-set
228 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000229 * Empties a node-set.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000230 */
231#define xmlXPathEmptyNodeSet(ns) \
232 { while ((ns)->nodeNr > 0) (ns)->nodeTab[(ns)->nodeNr--] = NULL; }
233
Daniel Veillardbed7b052001-05-19 14:59:49 +0000234/**
235 * CHECK_ERROR:
236 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000237 * Macro to return from the function if an XPath error was detected.
Daniel Veillardbed7b052001-05-19 14:59:49 +0000238 */
Owen Taylor3473f882001-02-23 17:55:21 +0000239#define CHECK_ERROR \
240 if (ctxt->error != XPATH_EXPRESSION_OK) return
241
Daniel Veillardbed7b052001-05-19 14:59:49 +0000242/**
243 * CHECK_ERROR0:
244 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000245 * Macro to return 0 from the function if an XPath error was detected.
Daniel Veillardbed7b052001-05-19 14:59:49 +0000246 */
Owen Taylor3473f882001-02-23 17:55:21 +0000247#define CHECK_ERROR0 \
248 if (ctxt->error != XPATH_EXPRESSION_OK) return(0)
249
Daniel Veillardbed7b052001-05-19 14:59:49 +0000250/**
251 * XP_ERROR:
252 * @X: the error code
253 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000254 * Macro to raise an XPath error and return.
Daniel Veillardbed7b052001-05-19 14:59:49 +0000255 */
Owen Taylor3473f882001-02-23 17:55:21 +0000256#define XP_ERROR(X) \
Daniel Veillardd96f6d32003-10-07 21:25:12 +0000257 { xmlXPathErr(ctxt, X); return; }
Owen Taylor3473f882001-02-23 17:55:21 +0000258
Daniel Veillardbed7b052001-05-19 14:59:49 +0000259/**
260 * XP_ERROR0:
261 * @X: the error code
262 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000263 * Macro to raise an XPath error and return 0.
Daniel Veillardbed7b052001-05-19 14:59:49 +0000264 */
Owen Taylor3473f882001-02-23 17:55:21 +0000265#define XP_ERROR0(X) \
Daniel Veillardd96f6d32003-10-07 21:25:12 +0000266 { xmlXPathErr(ctxt, X); return(0); }
Owen Taylor3473f882001-02-23 17:55:21 +0000267
Daniel Veillardbed7b052001-05-19 14:59:49 +0000268/**
269 * CHECK_TYPE:
270 * @typeval: the XPath type
271 *
272 * Macro to check that the value on top of the XPath stack is of a given
273 * type.
274 */
Owen Taylor3473f882001-02-23 17:55:21 +0000275#define CHECK_TYPE(typeval) \
276 if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \
277 XP_ERROR(XPATH_INVALID_TYPE)
278
Daniel Veillardbed7b052001-05-19 14:59:49 +0000279/**
Daniel Veillardf06307e2001-07-03 10:35:50 +0000280 * CHECK_TYPE0:
281 * @typeval: the XPath type
282 *
283 * Macro to check that the value on top of the XPath stack is of a given
Daniel Veillard61f26172002-03-12 18:46:39 +0000284 * type. Return(0) in case of failure
Daniel Veillardf06307e2001-07-03 10:35:50 +0000285 */
286#define CHECK_TYPE0(typeval) \
287 if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \
288 XP_ERROR0(XPATH_INVALID_TYPE)
289
290/**
Daniel Veillardbed7b052001-05-19 14:59:49 +0000291 * CHECK_ARITY:
292 * @x: the number of expected args
293 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000294 * Macro to check that the number of args passed to an XPath function matches.
Daniel Veillardbed7b052001-05-19 14:59:49 +0000295 */
Owen Taylor3473f882001-02-23 17:55:21 +0000296#define CHECK_ARITY(x) \
297 if (nargs != (x)) \
298 XP_ERROR(XPATH_INVALID_ARITY);
299
Daniel Veillardbed7b052001-05-19 14:59:49 +0000300/**
301 * CAST_TO_STRING:
302 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000303 * Macro to try to cast the value on the top of the XPath stack to a string.
Daniel Veillardbed7b052001-05-19 14:59:49 +0000304 */
Owen Taylor3473f882001-02-23 17:55:21 +0000305#define CAST_TO_STRING \
306 if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \
307 xmlXPathStringFunction(ctxt, 1);
308
Daniel Veillardbed7b052001-05-19 14:59:49 +0000309/**
310 * CAST_TO_NUMBER:
311 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000312 * Macro to try to cast the value on the top of the XPath stack to a number.
Daniel Veillardbed7b052001-05-19 14:59:49 +0000313 */
Owen Taylor3473f882001-02-23 17:55:21 +0000314#define CAST_TO_NUMBER \
315 if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \
316 xmlXPathNumberFunction(ctxt, 1);
317
Daniel Veillardbed7b052001-05-19 14:59:49 +0000318/**
319 * CAST_TO_BOOLEAN:
320 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000321 * Macro to try to cast the value on the top of the XPath stack to a boolean.
Daniel Veillardbed7b052001-05-19 14:59:49 +0000322 */
Owen Taylor3473f882001-02-23 17:55:21 +0000323#define CAST_TO_BOOLEAN \
324 if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \
325 xmlXPathBooleanFunction(ctxt, 1);
326
327/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000328 * Variable Lookup forwarding.
Owen Taylor3473f882001-02-23 17:55:21 +0000329 */
Owen Taylor3473f882001-02-23 17:55:21 +0000330
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000331XMLPUBFUN void XMLCALL
332 xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000333 xmlXPathVariableLookupFunc f,
Daniel Veillardcbaf3992001-12-31 16:16:02 +0000334 void *data);
Owen Taylor3473f882001-02-23 17:55:21 +0000335
336/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000337 * Function Lookup forwarding.
Thomas Broyerba4ad322001-07-26 16:55:21 +0000338 */
Thomas Broyerba4ad322001-07-26 16:55:21 +0000339
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000340XMLPUBFUN void XMLCALL
341 xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt,
Thomas Broyerba4ad322001-07-26 16:55:21 +0000342 xmlXPathFuncLookupFunc f,
343 void *funcCtxt);
344
345/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000346 * Error reporting.
Owen Taylor3473f882001-02-23 17:55:21 +0000347 */
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000348XMLPUBFUN void XMLCALL
349 xmlXPatherror (xmlXPathParserContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000350 const char *file,
351 int line,
352 int no);
353
Daniel Veillardd96f6d32003-10-07 21:25:12 +0000354XMLPUBFUN void XMLCALL
355 xmlXPathErr (xmlXPathParserContextPtr ctxt,
356 int error);
357
Daniel Veillarda9cce9c2003-09-29 13:20:24 +0000358#ifdef LIBXML_DEBUG_ENABLED
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000359XMLPUBFUN void XMLCALL
360 xmlXPathDebugDumpObject (FILE *output,
Owen Taylor3473f882001-02-23 17:55:21 +0000361 xmlXPathObjectPtr cur,
362 int depth);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000363XMLPUBFUN void XMLCALL
364 xmlXPathDebugDumpCompExpr(FILE *output,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000365 xmlXPathCompExprPtr comp,
366 int depth);
Daniel Veillarda9cce9c2003-09-29 13:20:24 +0000367#endif
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000368/**
Daniel Veillard61f26172002-03-12 18:46:39 +0000369 * NodeSet handling.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000370 */
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000371XMLPUBFUN int XMLCALL
372 xmlXPathNodeSetContains (xmlNodeSetPtr cur,
Thomas Broyerf186c822001-07-31 23:30:37 +0000373 xmlNodePtr val);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000374XMLPUBFUN xmlNodeSetPtr XMLCALL
375 xmlXPathDifference (xmlNodeSetPtr nodes1,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000376 xmlNodeSetPtr nodes2);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000377XMLPUBFUN xmlNodeSetPtr XMLCALL
378 xmlXPathIntersection (xmlNodeSetPtr nodes1,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000379 xmlNodeSetPtr nodes2);
380
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000381XMLPUBFUN xmlNodeSetPtr XMLCALL
382 xmlXPathDistinctSorted (xmlNodeSetPtr nodes);
383XMLPUBFUN xmlNodeSetPtr XMLCALL
384 xmlXPathDistinct (xmlNodeSetPtr nodes);
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000385
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000386XMLPUBFUN int XMLCALL
387 xmlXPathHasSameNodes (xmlNodeSetPtr nodes1,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000388 xmlNodeSetPtr nodes2);
389
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000390XMLPUBFUN xmlNodeSetPtr XMLCALL
391 xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000392 xmlNodePtr node);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000393XMLPUBFUN xmlNodeSetPtr XMLCALL
394 xmlXPathLeadingSorted (xmlNodeSetPtr nodes1,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000395 xmlNodeSetPtr nodes2);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000396XMLPUBFUN xmlNodeSetPtr XMLCALL
397 xmlXPathNodeLeading (xmlNodeSetPtr nodes,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000398 xmlNodePtr node);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000399XMLPUBFUN xmlNodeSetPtr XMLCALL
400 xmlXPathLeading (xmlNodeSetPtr nodes1,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000401 xmlNodeSetPtr nodes2);
402
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000403XMLPUBFUN xmlNodeSetPtr XMLCALL
404 xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000405 xmlNodePtr node);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000406XMLPUBFUN xmlNodeSetPtr XMLCALL
407 xmlXPathTrailingSorted (xmlNodeSetPtr nodes1,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000408 xmlNodeSetPtr nodes2);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000409XMLPUBFUN xmlNodeSetPtr XMLCALL
410 xmlXPathNodeTrailing (xmlNodeSetPtr nodes,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000411 xmlNodePtr node);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000412XMLPUBFUN xmlNodeSetPtr XMLCALL
413 xmlXPathTrailing (xmlNodeSetPtr nodes1,
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000414 xmlNodeSetPtr nodes2);
415
416
Owen Taylor3473f882001-02-23 17:55:21 +0000417/**
Daniel Veillard61f26172002-03-12 18:46:39 +0000418 * Extending a context.
Owen Taylor3473f882001-02-23 17:55:21 +0000419 */
420
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000421XMLPUBFUN int XMLCALL
422 xmlXPathRegisterNs (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000423 const xmlChar *prefix,
424 const xmlChar *ns_uri);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000425XMLPUBFUN const xmlChar * XMLCALL
426 xmlXPathNsLookup (xmlXPathContextPtr ctxt,
Daniel Veillardcbaf3992001-12-31 16:16:02 +0000427 const xmlChar *prefix);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000428XMLPUBFUN void XMLCALL
429 xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt);
Owen Taylor3473f882001-02-23 17:55:21 +0000430
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000431XMLPUBFUN int XMLCALL
432 xmlXPathRegisterFunc (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000433 const xmlChar *name,
434 xmlXPathFunction f);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000435XMLPUBFUN int XMLCALL
436 xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000437 const xmlChar *name,
438 const xmlChar *ns_uri,
439 xmlXPathFunction f);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000440XMLPUBFUN int XMLCALL
441 xmlXPathRegisterVariable (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000442 const xmlChar *name,
443 xmlXPathObjectPtr value);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000444XMLPUBFUN int XMLCALL
445 xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000446 const xmlChar *name,
447 const xmlChar *ns_uri,
448 xmlXPathObjectPtr value);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000449XMLPUBFUN xmlXPathFunction XMLCALL
450 xmlXPathFunctionLookup (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000451 const xmlChar *name);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000452XMLPUBFUN xmlXPathFunction XMLCALL
453 xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000454 const xmlChar *name,
455 const xmlChar *ns_uri);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000456XMLPUBFUN void XMLCALL
457 xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt);
458XMLPUBFUN xmlXPathObjectPtr XMLCALL
459 xmlXPathVariableLookup (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000460 const xmlChar *name);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000461XMLPUBFUN xmlXPathObjectPtr XMLCALL
462 xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt,
Owen Taylor3473f882001-02-23 17:55:21 +0000463 const xmlChar *name,
464 const xmlChar *ns_uri);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000465XMLPUBFUN void XMLCALL
466 xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt);
Owen Taylor3473f882001-02-23 17:55:21 +0000467
468/**
Daniel Veillard61f26172002-03-12 18:46:39 +0000469 * Utilities to extend XPath.
Owen Taylor3473f882001-02-23 17:55:21 +0000470 */
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000471XMLPUBFUN xmlXPathParserContextPtr XMLCALL
Owen Taylor3473f882001-02-23 17:55:21 +0000472 xmlXPathNewParserContext (const xmlChar *str,
473 xmlXPathContextPtr ctxt);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000474XMLPUBFUN void XMLCALL
475 xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt);
Owen Taylor3473f882001-02-23 17:55:21 +0000476
Daniel Veillard61f26172002-03-12 18:46:39 +0000477/* TODO: remap to xmlXPathValuePop and Push. */
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000478XMLPUBFUN xmlXPathObjectPtr XMLCALL
479 valuePop (xmlXPathParserContextPtr ctxt);
480XMLPUBFUN int XMLCALL
481 valuePush (xmlXPathParserContextPtr ctxt,
482 xmlXPathObjectPtr value);
Owen Taylor3473f882001-02-23 17:55:21 +0000483
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000484XMLPUBFUN xmlXPathObjectPtr XMLCALL
485 xmlXPathNewString (const xmlChar *val);
486XMLPUBFUN xmlXPathObjectPtr XMLCALL
487 xmlXPathNewCString (const char *val);
488XMLPUBFUN xmlXPathObjectPtr XMLCALL
489 xmlXPathWrapString (xmlChar *val);
490XMLPUBFUN xmlXPathObjectPtr XMLCALL
491 xmlXPathWrapCString (char * val);
492XMLPUBFUN xmlXPathObjectPtr XMLCALL
493 xmlXPathNewFloat (double val);
494XMLPUBFUN xmlXPathObjectPtr XMLCALL
495 xmlXPathNewBoolean (int val);
496XMLPUBFUN xmlXPathObjectPtr XMLCALL
497 xmlXPathNewNodeSet (xmlNodePtr val);
498XMLPUBFUN xmlXPathObjectPtr XMLCALL
499 xmlXPathNewValueTree (xmlNodePtr val);
500XMLPUBFUN void XMLCALL
501 xmlXPathNodeSetAdd (xmlNodeSetPtr cur,
Owen Taylor3473f882001-02-23 17:55:21 +0000502 xmlNodePtr val);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000503XMLPUBFUN void XMLCALL
504 xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000505 xmlNodePtr val);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000506XMLPUBFUN void XMLCALL
507 xmlXPathNodeSetAddNs (xmlNodeSetPtr cur,
Aleksey Sanin79376ba2002-05-14 06:41:32 +0000508 xmlNodePtr node,
509 xmlNsPtr ns);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000510XMLPUBFUN void XMLCALL
511 xmlXPathNodeSetSort (xmlNodeSetPtr set);
Owen Taylor3473f882001-02-23 17:55:21 +0000512
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000513XMLPUBFUN void XMLCALL
514 xmlXPathRoot (xmlXPathParserContextPtr ctxt);
515XMLPUBFUN void XMLCALL
516 xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt);
517XMLPUBFUN xmlChar * XMLCALL
518 xmlXPathParseName (xmlXPathParserContextPtr ctxt);
519XMLPUBFUN xmlChar * XMLCALL
520 xmlXPathParseNCName (xmlXPathParserContextPtr ctxt);
Owen Taylor3473f882001-02-23 17:55:21 +0000521
522/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000523 * Existing functions.
Owen Taylor3473f882001-02-23 17:55:21 +0000524 */
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000525XMLPUBFUN double XMLCALL
526 xmlXPathStringEvalNumber (const xmlChar *str);
527XMLPUBFUN int XMLCALL
528 xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt,
529 xmlXPathObjectPtr res);
530XMLPUBFUN void XMLCALL
531 xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt);
532XMLPUBFUN xmlNodeSetPtr XMLCALL
533 xmlXPathNodeSetMerge (xmlNodeSetPtr val1,
534 xmlNodeSetPtr val2);
535XMLPUBFUN void XMLCALL
536 xmlXPathNodeSetDel (xmlNodeSetPtr cur,
537 xmlNodePtr val);
538XMLPUBFUN void XMLCALL
539 xmlXPathNodeSetRemove (xmlNodeSetPtr cur,
540 int val);
541XMLPUBFUN xmlXPathObjectPtr XMLCALL
542 xmlXPathNewNodeSetList (xmlNodeSetPtr val);
543XMLPUBFUN xmlXPathObjectPtr XMLCALL
544 xmlXPathWrapNodeSet (xmlNodeSetPtr val);
545XMLPUBFUN xmlXPathObjectPtr XMLCALL
546 xmlXPathWrapExternal (void *val);
Owen Taylor3473f882001-02-23 17:55:21 +0000547
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000548XMLPUBFUN int XMLCALL xmlXPathEqualValues(xmlXPathParserContextPtr ctxt);
549XMLPUBFUN int XMLCALL xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt);
550XMLPUBFUN int XMLCALL xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict);
551XMLPUBFUN void XMLCALL xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt);
552XMLPUBFUN void XMLCALL xmlXPathAddValues(xmlXPathParserContextPtr ctxt);
553XMLPUBFUN void XMLCALL xmlXPathSubValues(xmlXPathParserContextPtr ctxt);
554XMLPUBFUN void XMLCALL xmlXPathMultValues(xmlXPathParserContextPtr ctxt);
555XMLPUBFUN void XMLCALL xmlXPathDivValues(xmlXPathParserContextPtr ctxt);
556XMLPUBFUN void XMLCALL xmlXPathModValues(xmlXPathParserContextPtr ctxt);
Owen Taylor3473f882001-02-23 17:55:21 +0000557
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000558XMLPUBFUN int XMLCALL xmlXPathIsNodeType(const xmlChar *name);
Owen Taylor3473f882001-02-23 17:55:21 +0000559
560/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000561 * Some of the axis navigation routines.
Owen Taylor3473f882001-02-23 17:55:21 +0000562 */
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000563XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextSelf(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000564 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000565XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextChild(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000566 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000567XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000568 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000569XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000570 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000571XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextParent(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000572 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000573XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000574 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000575XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000576 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000577XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000578 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000579XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000580 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000581XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000582 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000583XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000584 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000585XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000586 xmlNodePtr cur);
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000587XMLPUBFUN xmlNodePtr XMLCALL xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt,
Daniel Veillard56a4cb82001-03-24 17:00:36 +0000588 xmlNodePtr cur);
Owen Taylor3473f882001-02-23 17:55:21 +0000589/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000590 * The official core of XPath functions.
Owen Taylor3473f882001-02-23 17:55:21 +0000591 */
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000592XMLPUBFUN void XMLCALL xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs);
593XMLPUBFUN void XMLCALL xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs);
594XMLPUBFUN void XMLCALL xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs);
595XMLPUBFUN void XMLCALL xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs);
596XMLPUBFUN void XMLCALL xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs);
597XMLPUBFUN void XMLCALL xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs);
598XMLPUBFUN void XMLCALL xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs);
599XMLPUBFUN void XMLCALL xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs);
600XMLPUBFUN void XMLCALL xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs);
601XMLPUBFUN void XMLCALL xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs);
602XMLPUBFUN void XMLCALL xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs);
603XMLPUBFUN void XMLCALL xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs);
604XMLPUBFUN void XMLCALL xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs);
605XMLPUBFUN void XMLCALL xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs);
606XMLPUBFUN void XMLCALL xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs);
607XMLPUBFUN void XMLCALL xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs);
608XMLPUBFUN void XMLCALL xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs);
609XMLPUBFUN void XMLCALL xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs);
610XMLPUBFUN void XMLCALL xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs);
611XMLPUBFUN void XMLCALL xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs);
612XMLPUBFUN void XMLCALL xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs);
613XMLPUBFUN void XMLCALL xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs);
614XMLPUBFUN void XMLCALL xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs);
615XMLPUBFUN void XMLCALL xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs);
616XMLPUBFUN void XMLCALL xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs);
617XMLPUBFUN void XMLCALL xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs);
Aleksey Saninf8cb6dd2002-06-04 04:27:06 +0000618
619/**
620 * Really internal functions
621 */
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000622XMLPUBFUN void XMLCALL xmlXPathNodeSetFreeNs(xmlNsPtr ns);
Aleksey Saninf8cb6dd2002-06-04 04:27:06 +0000623
Owen Taylor3473f882001-02-23 17:55:21 +0000624#ifdef __cplusplus
625}
626#endif
Daniel Veillarda2351322004-06-27 12:08:10 +0000627
628#endif /* LIBXML_XPATH_ENABLED */
Owen Taylor3473f882001-02-23 17:55:21 +0000629#endif /* ! __XML_XPATH_INTERNALS_H__ */