blob: 5172e93282557d28c19565e2eeaba351cccc143c [file] [log] [blame]
Owen Taylor3473f882001-02-23 17:55:21 +00001/*
Daniel Veillardbe586972003-11-18 20:56:51 +00002 * Summary: XML Path Language implementation
3 * Description: API for the XML Path Language implementation
Owen Taylor3473f882001-02-23 17:55:21 +00004 *
Daniel Veillardbe586972003-11-18 20:56:51 +00005 * XML Path Language implementation
6 * XPath is a language for addressing parts of an XML document,
7 * designed to be used by both XSLT and XPointer
8 * http://www.w3.org/TR/xpath
Owen Taylor3473f882001-02-23 17:55:21 +00009 *
Daniel Veillardbe586972003-11-18 20:56:51 +000010 * Implements
11 * W3C Recommendation 16 November 1999
12 * http://www.w3.org/TR/1999/REC-xpath-19991116
Owen Taylor3473f882001-02-23 17:55:21 +000013 *
Daniel Veillardbe586972003-11-18 20:56:51 +000014 * Copy: See Copyright for the status of this software.
15 *
16 * Author: Daniel Veillard
Owen Taylor3473f882001-02-23 17:55:21 +000017 */
18
19#ifndef __XML_XPATH_H__
20#define __XML_XPATH_H__
21
Igor Zlatkovic76874e42003-08-25 09:05:12 +000022#include <libxml/xmlversion.h>
Daniel Veillardd96f6d32003-10-07 21:25:12 +000023#include <libxml/xmlerror.h>
Owen Taylor3473f882001-02-23 17:55:21 +000024#include <libxml/tree.h>
25#include <libxml/hash.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31typedef struct _xmlXPathContext xmlXPathContext;
32typedef xmlXPathContext *xmlXPathContextPtr;
33typedef struct _xmlXPathParserContext xmlXPathParserContext;
34typedef xmlXPathParserContext *xmlXPathParserContextPtr;
35
36/**
Daniel Veillard61f26172002-03-12 18:46:39 +000037 * The set of XPath error codes.
Owen Taylor3473f882001-02-23 17:55:21 +000038 */
39
40typedef enum {
41 XPATH_EXPRESSION_OK = 0,
42 XPATH_NUMBER_ERROR,
43 XPATH_UNFINISHED_LITERAL_ERROR,
44 XPATH_START_LITERAL_ERROR,
45 XPATH_VARIABLE_REF_ERROR,
46 XPATH_UNDEF_VARIABLE_ERROR,
47 XPATH_INVALID_PREDICATE_ERROR,
48 XPATH_EXPR_ERROR,
49 XPATH_UNCLOSED_ERROR,
50 XPATH_UNKNOWN_FUNC_ERROR,
51 XPATH_INVALID_OPERAND,
52 XPATH_INVALID_TYPE,
53 XPATH_INVALID_ARITY,
54 XPATH_INVALID_CTXT_SIZE,
55 XPATH_INVALID_CTXT_POSITION,
56 XPATH_MEMORY_ERROR,
57 XPTR_SYNTAX_ERROR,
58 XPTR_RESOURCE_ERROR,
59 XPTR_SUB_RESOURCE_ERROR,
Daniel Veillard61d80a22001-04-27 17:13:01 +000060 XPATH_UNDEF_PREFIX_ERROR,
61 XPATH_ENCODING_ERROR,
62 XPATH_INVALID_CHAR_ERROR
Owen Taylor3473f882001-02-23 17:55:21 +000063} xmlXPathError;
64
65/*
Daniel Veillard61f26172002-03-12 18:46:39 +000066 * A node-set (an unordered collection of nodes without duplicates).
Owen Taylor3473f882001-02-23 17:55:21 +000067 */
68typedef struct _xmlNodeSet xmlNodeSet;
69typedef xmlNodeSet *xmlNodeSetPtr;
70struct _xmlNodeSet {
71 int nodeNr; /* number of nodes in the set */
72 int nodeMax; /* size of the array as allocated */
73 xmlNodePtr *nodeTab; /* array of nodes in no particular order */
Daniel Veillard044fc6b2002-03-04 17:09:44 +000074 /* @@ with_ns to check wether namespace nodes should be looked at @@ */
Owen Taylor3473f882001-02-23 17:55:21 +000075};
76
77/*
78 * An expression is evaluated to yield an object, which
79 * has one of the following four basic types:
80 * - node-set
81 * - boolean
82 * - number
83 * - string
84 *
85 * @@ XPointer will add more types !
86 */
87
88typedef enum {
89 XPATH_UNDEFINED = 0,
90 XPATH_NODESET = 1,
91 XPATH_BOOLEAN = 2,
92 XPATH_NUMBER = 3,
93 XPATH_STRING = 4,
94 XPATH_POINT = 5,
95 XPATH_RANGE = 6,
96 XPATH_LOCATIONSET = 7,
97 XPATH_USERS = 8,
98 XPATH_XSLT_TREE = 9 /* An XSLT value tree, non modifiable */
99} xmlXPathObjectType;
100
101typedef struct _xmlXPathObject xmlXPathObject;
102typedef xmlXPathObject *xmlXPathObjectPtr;
103struct _xmlXPathObject {
104 xmlXPathObjectType type;
105 xmlNodeSetPtr nodesetval;
106 int boolval;
107 double floatval;
108 xmlChar *stringval;
109 void *user;
110 int index;
111 void *user2;
112 int index2;
113};
114
Daniel Veillard9d06d302002-01-22 18:15:52 +0000115/**
116 * xmlXPathConvertFunc:
117 * @obj: an XPath object
118 * @type: the number of the target type
119 *
Owen Taylor3473f882001-02-23 17:55:21 +0000120 * A conversion function is associated to a type and used to cast
121 * the new type to primitive values.
Daniel Veillard9d06d302002-01-22 18:15:52 +0000122 *
123 * Returns -1 in case of error, 0 otherwise
Owen Taylor3473f882001-02-23 17:55:21 +0000124 */
125typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type);
126
127/*
128 * Extra type: a name and a conversion function.
129 */
130
131typedef struct _xmlXPathType xmlXPathType;
132typedef xmlXPathType *xmlXPathTypePtr;
133struct _xmlXPathType {
134 const xmlChar *name; /* the type name */
135 xmlXPathConvertFunc func; /* the conversion function */
136};
137
138/*
139 * Extra variable: a name and a value.
140 */
141
142typedef struct _xmlXPathVariable xmlXPathVariable;
143typedef xmlXPathVariable *xmlXPathVariablePtr;
144struct _xmlXPathVariable {
145 const xmlChar *name; /* the variable name */
146 xmlXPathObjectPtr value; /* the value */
147};
148
Daniel Veillard5168dbf2001-07-07 00:18:23 +0000149/**
150 * xmlXPathEvalFunc:
151 * @ctxt: an XPath parser context
152 * @nargs: the number of arguments passed to the function
153 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000154 * An XPath evaluation function, the parameters are on the XPath context stack.
Owen Taylor3473f882001-02-23 17:55:21 +0000155 */
156
Daniel Veillard5168dbf2001-07-07 00:18:23 +0000157typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt,
158 int nargs);
Owen Taylor3473f882001-02-23 17:55:21 +0000159
160/*
161 * Extra function: a name and a evaluation function.
162 */
163
164typedef struct _xmlXPathFunct xmlXPathFunct;
165typedef xmlXPathFunct *xmlXPathFuncPtr;
166struct _xmlXPathFunct {
167 const xmlChar *name; /* the function name */
168 xmlXPathEvalFunc func; /* the evaluation function */
169};
170
Daniel Veillard9d06d302002-01-22 18:15:52 +0000171/**
172 * xmlXPathAxisFunc:
173 * @ctxt: the XPath interpreter context
174 * @cur: the previous node being explored on that axis
175 *
Owen Taylor3473f882001-02-23 17:55:21 +0000176 * An axis traversal function. To traverse an axis, the engine calls
177 * the first time with cur == NULL and repeat until the function returns
178 * NULL indicating the end of the axis traversal.
Daniel Veillard9d06d302002-01-22 18:15:52 +0000179 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000180 * Returns the next node in that axis or NULL if at the end of the axis.
Owen Taylor3473f882001-02-23 17:55:21 +0000181 */
182
Daniel Veillard9d06d302002-01-22 18:15:52 +0000183typedef xmlXPathObjectPtr (*xmlXPathAxisFunc) (xmlXPathParserContextPtr ctxt,
184 xmlXPathObjectPtr cur);
Owen Taylor3473f882001-02-23 17:55:21 +0000185
186/*
187 * Extra axis: a name and an axis function.
188 */
189
190typedef struct _xmlXPathAxis xmlXPathAxis;
191typedef xmlXPathAxis *xmlXPathAxisPtr;
192struct _xmlXPathAxis {
193 const xmlChar *name; /* the axis name */
194 xmlXPathAxisFunc func; /* the search function */
195};
196
Daniel Veillardbed7b052001-05-19 14:59:49 +0000197/**
198 * xmlXPathContext:
199 *
Owen Taylor3473f882001-02-23 17:55:21 +0000200 * Expression evaluation occurs with respect to a context.
201 * he context consists of:
202 * - a node (the context node)
203 * - a node list (the context node list)
204 * - a set of variable bindings
205 * - a function library
206 * - the set of namespace declarations in scope for the expression
207 * Following the switch to hash tables, this need to be trimmed up at
208 * the next binary incompatible release.
209 */
210
211struct _xmlXPathContext {
212 xmlDocPtr doc; /* The current document */
213 xmlNodePtr node; /* The current node */
214
215 int nb_variables_unused; /* unused (hash table) */
216 int max_variables_unused; /* unused (hash table) */
217 xmlHashTablePtr varHash; /* Hash table of defined variables */
218
219 int nb_types; /* number of defined types */
220 int max_types; /* max number of types */
221 xmlXPathTypePtr types; /* Array of defined types */
222
223 int nb_funcs_unused; /* unused (hash table) */
224 int max_funcs_unused; /* unused (hash table) */
225 xmlHashTablePtr funcHash; /* Hash table of defined funcs */
226
227 int nb_axis; /* number of defined axis */
228 int max_axis; /* max number of axis */
229 xmlXPathAxisPtr axis; /* Array of defined axis */
230
231 /* the namespace nodes of the context node */
232 xmlNsPtr *namespaces; /* Array of namespaces */
233 int nsNr; /* number of namespace in scope */
234 void *user; /* function to free */
235
236 /* extra variables */
237 int contextSize; /* the context size */
238 int proximityPosition; /* the proximity position */
239
240 /* extra stuff for XPointer */
241 int xptr; /* it this an XPointer context */
242 xmlNodePtr here; /* for here() */
243 xmlNodePtr origin; /* for origin() */
244
245 /* the set of namespace declarations in scope for the expression */
246 xmlHashTablePtr nsHash; /* The namespaces hash table */
247 void *varLookupFunc; /* variable lookup func */
248 void *varLookupData; /* variable lookup data */
249
250 /* Possibility to link in an extra item */
251 void *extra; /* needed for XSLT */
Daniel Veillard42596ad2001-05-22 16:57:14 +0000252
253 /* The function name and URI when calling a function */
254 const xmlChar *function;
255 const xmlChar *functionURI;
Thomas Broyerba4ad322001-07-26 16:55:21 +0000256
257 /* function lookup function and data */
258 void *funcLookupFunc; /* function lookup func */
259 void *funcLookupData; /* function lookup data */
Daniel Veillard7d7e3792001-07-30 13:42:13 +0000260
261 /* temporary namespace lists kept for walking the namespace axis */
262 xmlNsPtr *tmpNsList; /* Array of namespaces */
263 int tmpNsNr; /* number of namespace in scope */
Daniel Veillardd96f6d32003-10-07 21:25:12 +0000264
265 /* error reporting mechanism */
266 void *userData; /* user specific data block */
267 xmlStructuredErrorFunc error; /* the callback in case of errors */
268 xmlError lastError; /* the last error */
269 xmlNodePtr debugNode; /* the source node XSLT */
Owen Taylor3473f882001-02-23 17:55:21 +0000270};
271
272/*
Daniel Veillard61f26172002-03-12 18:46:39 +0000273 * The structure of a compiled expression form is not public.
Daniel Veillard9e7160d2001-03-18 23:17:47 +0000274 */
275
276typedef struct _xmlXPathCompExpr xmlXPathCompExpr;
277typedef xmlXPathCompExpr *xmlXPathCompExprPtr;
278
Daniel Veillardbed7b052001-05-19 14:59:49 +0000279/**
280 * xmlXPathParserContext:
281 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000282 * An XPath parser context. It contains pure parsing informations,
Owen Taylor3473f882001-02-23 17:55:21 +0000283 * an xmlXPathContext, and the stack of objects.
284 */
285struct _xmlXPathParserContext {
286 const xmlChar *cur; /* the current char being parsed */
287 const xmlChar *base; /* the full expression */
288
289 int error; /* error code */
290
Owen Taylor3473f882001-02-23 17:55:21 +0000291 xmlXPathContextPtr context; /* the evaluation context */
292 xmlXPathObjectPtr value; /* the current value */
293 int valueNr; /* number of values stacked */
294 int valueMax; /* max number of values stacked */
295 xmlXPathObjectPtr *valueTab; /* stack of values */
Daniel Veillardd007d6c2001-03-19 00:01:07 +0000296
297 xmlXPathCompExprPtr comp; /* the precompiled expression */
Daniel Veillardfbf8a2d2001-03-19 15:58:54 +0000298 int xptr; /* it this an XPointer expression */
Daniel Veillardf06307e2001-07-03 10:35:50 +0000299 xmlNodePtr ancestor; /* used for walking preceding axis */
Owen Taylor3473f882001-02-23 17:55:21 +0000300};
301
Daniel Veillardbed7b052001-05-19 14:59:49 +0000302/**
303 * xmlXPathFunction:
Daniel Veillard9d06d302002-01-22 18:15:52 +0000304 * @ctxt: the XPath interprestation context
305 * @nargs: the number of arguments
Daniel Veillardbed7b052001-05-19 14:59:49 +0000306 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000307 * An XPath function.
Daniel Veillard9d06d302002-01-22 18:15:52 +0000308 * The arguments (if any) are popped out from the context stack
Owen Taylor3473f882001-02-23 17:55:21 +0000309 * and the result is pushed on the stack.
310 */
311
312typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs);
313
314/************************************************************************
315 * *
316 * Public API *
317 * *
318 ************************************************************************/
319
320/**
Daniel Veillardafcbe1c2001-03-19 10:57:13 +0000321 * Objects and Nodesets handling
Owen Taylor3473f882001-02-23 17:55:21 +0000322 */
Daniel Veillard790142b2001-05-15 10:51:53 +0000323
Igor Zlatkovic76874e42003-08-25 09:05:12 +0000324XMLPUBVAR double xmlXPathNAN;
325XMLPUBVAR double xmlXPathPINF;
326XMLPUBVAR double xmlXPathNINF;
Thomas Broyer496be682001-07-15 22:59:18 +0000327
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000328XMLPUBFUN int XMLCALL
329 xmlXPathIsNaN (double val);
330XMLPUBFUN int XMLCALL
331 xmlXPathIsInf (double val);
Daniel Veillardcda96922001-08-21 10:56:31 +0000332
Daniel Veillard790142b2001-05-15 10:51:53 +0000333/* These macros may later turn into functions */
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000334/**
335 * xmlXPathNodeSetGetLength:
336 * @ns: a node-set
337 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000338 * Implement a functionality similar to the DOM NodeList.length.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000339 *
340 * Returns the number of nodes in the node-set.
341 */
Daniel Veillard790142b2001-05-15 10:51:53 +0000342#define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0)
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000343/**
344 * xmlXPathNodeSetItem:
345 * @ns: a node-set
346 * @index: index of a node in the set
347 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000348 * Implements a functionality similar to the DOM NodeList.item().
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000349 *
350 * Returns the xmlNodePtr at the given @index in @ns or NULL if
351 * @index is out of range (0 to length-1)
352 */
Daniel Veillard790142b2001-05-15 10:51:53 +0000353#define xmlXPathNodeSetItem(ns, index) \
354 ((((ns) != NULL) && \
Thomas Broyer496be682001-07-15 22:59:18 +0000355 ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \
Daniel Veillard790142b2001-05-15 10:51:53 +0000356 (ns)->nodeTab[(index)] \
357 : NULL)
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000358/**
359 * xmlXPathNodeSetIsEmpty:
360 * @ns: a node-set
361 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000362 * Checks whether @ns is empty or not.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000363 *
Daniel Veillard61f26172002-03-12 18:46:39 +0000364 * Returns %TRUE if @ns is an empty node-set.
Thomas Broyerf06a3d82001-07-16 04:52:57 +0000365 */
366#define xmlXPathNodeSetIsEmpty(ns) \
367 (((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL))
Daniel Veillard790142b2001-05-15 10:51:53 +0000368
369
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000370XMLPUBFUN void XMLCALL
371 xmlXPathFreeObject (xmlXPathObjectPtr obj);
372XMLPUBFUN xmlNodeSetPtr XMLCALL
373 xmlXPathNodeSetCreate (xmlNodePtr val);
374XMLPUBFUN void XMLCALL
375 xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj);
376XMLPUBFUN void XMLCALL
377 xmlXPathFreeNodeSet (xmlNodeSetPtr obj);
378XMLPUBFUN xmlXPathObjectPtr XMLCALL
379 xmlXPathObjectCopy (xmlXPathObjectPtr val);
380XMLPUBFUN int XMLCALL
381 xmlXPathCmpNodes (xmlNodePtr node1,
Owen Taylor3473f882001-02-23 17:55:21 +0000382 xmlNodePtr node2);
Daniel Veillardfbf8a2d2001-03-19 15:58:54 +0000383/**
Daniel Veillard61f26172002-03-12 18:46:39 +0000384 * Conversion functions to basic types.
Daniel Veillardfbf8a2d2001-03-19 15:58:54 +0000385 */
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000386XMLPUBFUN int XMLCALL
387 xmlXPathCastNumberToBoolean (double val);
388XMLPUBFUN int XMLCALL
389 xmlXPathCastStringToBoolean (const xmlChar * val);
390XMLPUBFUN int XMLCALL
391 xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns);
392XMLPUBFUN int XMLCALL
393 xmlXPathCastToBoolean (xmlXPathObjectPtr val);
Daniel Veillardba0b8c92001-05-15 09:43:47 +0000394
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000395XMLPUBFUN double XMLCALL
396 xmlXPathCastBooleanToNumber (int val);
397XMLPUBFUN double XMLCALL
398 xmlXPathCastStringToNumber (const xmlChar * val);
399XMLPUBFUN double XMLCALL
400 xmlXPathCastNodeToNumber (xmlNodePtr node);
401XMLPUBFUN double XMLCALL
402 xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns);
403XMLPUBFUN double XMLCALL
404 xmlXPathCastToNumber (xmlXPathObjectPtr val);
Daniel Veillardba0b8c92001-05-15 09:43:47 +0000405
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000406XMLPUBFUN xmlChar * XMLCALL
407 xmlXPathCastBooleanToString (int val);
408XMLPUBFUN xmlChar * XMLCALL
409 xmlXPathCastNumberToString (double val);
410XMLPUBFUN xmlChar * XMLCALL
411 xmlXPathCastNodeToString (xmlNodePtr node);
412XMLPUBFUN xmlChar * XMLCALL
413 xmlXPathCastNodeSetToString (xmlNodeSetPtr ns);
414XMLPUBFUN xmlChar * XMLCALL
415 xmlXPathCastToString (xmlXPathObjectPtr val);
Daniel Veillardba0b8c92001-05-15 09:43:47 +0000416
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000417XMLPUBFUN xmlXPathObjectPtr XMLCALL
418 xmlXPathConvertBoolean (xmlXPathObjectPtr val);
419XMLPUBFUN xmlXPathObjectPtr XMLCALL
420 xmlXPathConvertNumber (xmlXPathObjectPtr val);
421XMLPUBFUN xmlXPathObjectPtr XMLCALL
422 xmlXPathConvertString (xmlXPathObjectPtr val);
Owen Taylor3473f882001-02-23 17:55:21 +0000423
Daniel Veillardafcbe1c2001-03-19 10:57:13 +0000424/**
Daniel Veillard61f26172002-03-12 18:46:39 +0000425 * Context handling.
Daniel Veillardafcbe1c2001-03-19 10:57:13 +0000426 */
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000427XMLPUBFUN void XMLCALL
428 xmlXPathInit (void);
429XMLPUBFUN xmlXPathContextPtr XMLCALL
430 xmlXPathNewContext (xmlDocPtr doc);
431XMLPUBFUN void XMLCALL
432 xmlXPathFreeContext (xmlXPathContextPtr ctxt);
Daniel Veillardafcbe1c2001-03-19 10:57:13 +0000433
434/**
435 * Evaluation functions.
436 */
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000437XMLPUBFUN long XMLCALL
438 xmlXPathOrderDocElems (xmlDocPtr doc);
439XMLPUBFUN xmlXPathObjectPtr XMLCALL
440 xmlXPathEval (const xmlChar *str,
Daniel Veillardcbaf3992001-12-31 16:16:02 +0000441 xmlXPathContextPtr ctx);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000442XMLPUBFUN xmlXPathObjectPtr XMLCALL
443 xmlXPathEvalExpression (const xmlChar *str,
Daniel Veillardafcbe1c2001-03-19 10:57:13 +0000444 xmlXPathContextPtr ctxt);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000445XMLPUBFUN int XMLCALL
446 xmlXPathEvalPredicate (xmlXPathContextPtr ctxt,
Daniel Veillardfbf8a2d2001-03-19 15:58:54 +0000447 xmlXPathObjectPtr res);
Daniel Veillardafcbe1c2001-03-19 10:57:13 +0000448/**
Daniel Veillard61f26172002-03-12 18:46:39 +0000449 * Separate compilation/evaluation entry points.
Daniel Veillardafcbe1c2001-03-19 10:57:13 +0000450 */
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000451XMLPUBFUN xmlXPathCompExprPtr XMLCALL
452 xmlXPathCompile (const xmlChar *str);
453XMLPUBFUN xmlXPathObjectPtr XMLCALL
454 xmlXPathCompiledEval (xmlXPathCompExprPtr comp,
Daniel Veillardafcbe1c2001-03-19 10:57:13 +0000455 xmlXPathContextPtr ctx);
Igor Zlatkovicaa3cfbd2003-08-27 08:59:58 +0000456XMLPUBFUN void XMLCALL
457 xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp);
Owen Taylor3473f882001-02-23 17:55:21 +0000458#ifdef __cplusplus
459}
460#endif
461#endif /* ! __XML_XPATH_H__ */