xpath.h revision 42596ad20cdf1925dd79ea801cbe598b6e7b7aec
1/*
2 * xpath.c: interface for XML Path Language implementation
3 *
4 * Reference: W3C Working Draft 5 July 1999
5 *            http://www.w3.org/Style/XSL/Group/1999/07/xpath-19990705.html
6 *
7 * See COPYRIGHT for the status of this software
8 *
9 * Author: Daniel.Veillard@w3.org
10 */
11
12#ifndef __XML_XPATH_H__
13#define __XML_XPATH_H__
14
15#include <libxml/tree.h>
16#include <libxml/hash.h>
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22typedef struct _xmlXPathContext xmlXPathContext;
23typedef xmlXPathContext *xmlXPathContextPtr;
24typedef struct _xmlXPathParserContext xmlXPathParserContext;
25typedef xmlXPathParserContext *xmlXPathParserContextPtr;
26
27/**
28 * The set of XPath error codes
29 */
30
31typedef enum {
32    XPATH_EXPRESSION_OK = 0,
33    XPATH_NUMBER_ERROR,
34    XPATH_UNFINISHED_LITERAL_ERROR,
35    XPATH_START_LITERAL_ERROR,
36    XPATH_VARIABLE_REF_ERROR,
37    XPATH_UNDEF_VARIABLE_ERROR,
38    XPATH_INVALID_PREDICATE_ERROR,
39    XPATH_EXPR_ERROR,
40    XPATH_UNCLOSED_ERROR,
41    XPATH_UNKNOWN_FUNC_ERROR,
42    XPATH_INVALID_OPERAND,
43    XPATH_INVALID_TYPE,
44    XPATH_INVALID_ARITY,
45    XPATH_INVALID_CTXT_SIZE,
46    XPATH_INVALID_CTXT_POSITION,
47    XPATH_MEMORY_ERROR,
48    XPTR_SYNTAX_ERROR,
49    XPTR_RESOURCE_ERROR,
50    XPTR_SUB_RESOURCE_ERROR,
51    XPATH_UNDEF_PREFIX_ERROR,
52    XPATH_ENCODING_ERROR,
53    XPATH_INVALID_CHAR_ERROR
54} xmlXPathError;
55
56/*
57 * A node-set (an unordered collection of nodes without duplicates)
58 */
59typedef struct _xmlNodeSet xmlNodeSet;
60typedef xmlNodeSet *xmlNodeSetPtr;
61struct _xmlNodeSet {
62    int nodeNr;			/* number of nodes in the set */
63    int nodeMax;		/* size of the array as allocated */
64    xmlNodePtr *nodeTab;	/* array of nodes in no particular order */
65};
66
67/*
68 * An expression is evaluated to yield an object, which
69 * has one of the following four basic types:
70 *   - node-set
71 *   - boolean
72 *   - number
73 *   - string
74 *
75 * @@ XPointer will add more types !
76 */
77
78typedef enum {
79    XPATH_UNDEFINED = 0,
80    XPATH_NODESET = 1,
81    XPATH_BOOLEAN = 2,
82    XPATH_NUMBER = 3,
83    XPATH_STRING = 4,
84    XPATH_POINT = 5,
85    XPATH_RANGE = 6,
86    XPATH_LOCATIONSET = 7,
87    XPATH_USERS = 8,
88    XPATH_XSLT_TREE = 9  /* An XSLT value tree, non modifiable */
89} xmlXPathObjectType;
90
91typedef struct _xmlXPathObject xmlXPathObject;
92typedef xmlXPathObject *xmlXPathObjectPtr;
93struct _xmlXPathObject {
94    xmlXPathObjectType type;
95    xmlNodeSetPtr nodesetval;
96    int boolval;
97    double floatval;
98    xmlChar *stringval;
99    void *user;
100    int index;
101    void *user2;
102    int index2;
103};
104
105/*
106 * A conversion function is associated to a type and used to cast
107 * the new type to primitive values.
108 */
109typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type);
110
111/*
112 * Extra type: a name and a conversion function.
113 */
114
115typedef struct _xmlXPathType xmlXPathType;
116typedef xmlXPathType *xmlXPathTypePtr;
117struct _xmlXPathType {
118    const xmlChar         *name;		/* the type name */
119    xmlXPathConvertFunc func;		/* the conversion function */
120};
121
122/*
123 * Extra variable: a name and a value.
124 */
125
126typedef struct _xmlXPathVariable xmlXPathVariable;
127typedef xmlXPathVariable *xmlXPathVariablePtr;
128struct _xmlXPathVariable {
129    const xmlChar       *name;		/* the variable name */
130    xmlXPathObjectPtr value;		/* the value */
131};
132
133/*
134 * an evaluation function, the parameters are on the context stack
135 */
136
137typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt, int nargs);
138
139/*
140 * Extra function: a name and a evaluation function.
141 */
142
143typedef struct _xmlXPathFunct xmlXPathFunct;
144typedef xmlXPathFunct *xmlXPathFuncPtr;
145struct _xmlXPathFunct {
146    const xmlChar      *name;		/* the function name */
147    xmlXPathEvalFunc func;		/* the evaluation function */
148};
149
150/*
151 * An axis traversal function. To traverse an axis, the engine calls
152 * the first time with cur == NULL and repeat until the function returns
153 * NULL indicating the end of the axis traversal.
154 */
155
156typedef xmlXPathObjectPtr (*xmlXPathAxisFunc)	(xmlXPathParserContextPtr ctxt,
157						 xmlXPathObjectPtr cur);
158
159/*
160 * Extra axis: a name and an axis function.
161 */
162
163typedef struct _xmlXPathAxis xmlXPathAxis;
164typedef xmlXPathAxis *xmlXPathAxisPtr;
165struct _xmlXPathAxis {
166    const xmlChar      *name;		/* the axis name */
167    xmlXPathAxisFunc func;		/* the search function */
168};
169
170/**
171 * xmlXPathContext:
172 *
173 * Expression evaluation occurs with respect to a context.
174 * he context consists of:
175 *    - a node (the context node)
176 *    - a node list (the context node list)
177 *    - a set of variable bindings
178 *    - a function library
179 *    - the set of namespace declarations in scope for the expression
180 * Following the switch to hash tables, this need to be trimmed up at
181 * the next binary incompatible release.
182 */
183
184struct _xmlXPathContext {
185    xmlDocPtr doc;			/* The current document */
186    xmlNodePtr node;			/* The current node */
187
188    int nb_variables_unused;		/* unused (hash table) */
189    int max_variables_unused;		/* unused (hash table) */
190    xmlHashTablePtr varHash;		/* Hash table of defined variables */
191
192    int nb_types;			/* number of defined types */
193    int max_types;			/* max number of types */
194    xmlXPathTypePtr types;		/* Array of defined types */
195
196    int nb_funcs_unused;		/* unused (hash table) */
197    int max_funcs_unused;		/* unused (hash table) */
198    xmlHashTablePtr funcHash;		/* Hash table of defined funcs */
199
200    int nb_axis;			/* number of defined axis */
201    int max_axis;			/* max number of axis */
202    xmlXPathAxisPtr axis;		/* Array of defined axis */
203
204    /* the namespace nodes of the context node */
205    xmlNsPtr *namespaces;		/* Array of namespaces */
206    int nsNr;				/* number of namespace in scope */
207    void *user;				/* function to free */
208
209    /* extra variables */
210    int contextSize;			/* the context size */
211    int proximityPosition;		/* the proximity position */
212
213    /* extra stuff for XPointer */
214    int xptr;				/* it this an XPointer context */
215    xmlNodePtr here;			/* for here() */
216    xmlNodePtr origin;			/* for origin() */
217
218    /* the set of namespace declarations in scope for the expression */
219    xmlHashTablePtr nsHash;		/* The namespaces hash table */
220    void *varLookupFunc;		/* variable lookup func */
221    void *varLookupData;		/* variable lookup data */
222
223    /* Possibility to link in an extra item */
224    void *extra;                        /* needed for XSLT */
225
226    /* The function name and URI when calling a function */
227    const xmlChar *function;
228    const xmlChar *functionURI;
229};
230
231/*
232 * The structure of a compiled expression form is not public
233 */
234
235typedef struct _xmlXPathCompExpr xmlXPathCompExpr;
236typedef xmlXPathCompExpr *xmlXPathCompExprPtr;
237
238/**
239 * xmlXPathParserContext:
240 *
241 * An XPath parser context, it contains pure parsing informations,
242 * an xmlXPathContext, and the stack of objects.
243 */
244struct _xmlXPathParserContext {
245    const xmlChar *cur;			/* the current char being parsed */
246    const xmlChar *base;			/* the full expression */
247
248    int error;				/* error code */
249
250    xmlXPathContextPtr  context;	/* the evaluation context */
251    xmlXPathObjectPtr     value;	/* the current value */
252    int                 valueNr;	/* number of values stacked */
253    int                valueMax;	/* max number of values stacked */
254    xmlXPathObjectPtr *valueTab;	/* stack of values */
255
256    xmlXPathCompExprPtr comp;		/* the precompiled expression */
257    int xptr;				/* it this an XPointer expression */
258};
259
260/**
261 * xmlXPathFunction:
262 *
263 * An XPath function
264 * The arguments (if any) are popped out of the context stack
265 * and the result is pushed on the stack.
266 */
267
268typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs);
269
270/************************************************************************
271 *									*
272 *			Public API					*
273 *									*
274 ************************************************************************/
275
276/**
277 * Objects and Nodesets handling
278 */
279
280/* These macros may later turn into functions */
281#define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0)
282#define xmlXPathNodeSetItem(ns, index)				\
283		((((ns) != NULL) && 				\
284		  ((index) > 0) && ((index) <= (ns)->nodeNr)) ?	\
285		 (ns)->nodeTab[(index)]				\
286		 : NULL)
287
288
289void		   xmlXPathFreeObject		(xmlXPathObjectPtr obj);
290xmlNodeSetPtr	   xmlXPathNodeSetCreate	(xmlNodePtr val);
291void		   xmlXPathFreeNodeSetList	(xmlXPathObjectPtr obj);
292void		   xmlXPathFreeNodeSet		(xmlNodeSetPtr obj);
293xmlXPathObjectPtr  xmlXPathObjectCopy		(xmlXPathObjectPtr val);
294int		   xmlXPathCmpNodes		(xmlNodePtr node1,
295						 xmlNodePtr node2);
296/**
297 * Conversion functions to basic types
298 */
299int		   xmlXPathCastNumberToBoolean	(double val);
300int		   xmlXPathCastStringToBoolean	(const xmlChar * val);
301int		   xmlXPathCastNodeSetToBoolean	(xmlNodeSetPtr ns);
302int		   xmlXPathCastToBoolean	(xmlXPathObjectPtr val);
303
304double		   xmlXPathCastBooleanToNumber	(int val);
305double		   xmlXPathCastStringToNumber	(const xmlChar * val);
306double		   xmlXPathCastNodeToNumber	(xmlNodePtr node);
307double		   xmlXPathCastNodeSetToNumber	(xmlNodeSetPtr ns);
308double		   xmlXPathCastToNumber		(xmlXPathObjectPtr val);
309
310xmlChar *	   xmlXPathCastBooleanToString	(int val);
311xmlChar *	   xmlXPathCastNumberToString	(double val);
312xmlChar *	   xmlXPathCastNodeToString	(xmlNodePtr node);
313xmlChar *	   xmlXPathCastNodeSetToString	(xmlNodeSetPtr ns);
314xmlChar *	   xmlXPathCastToString		(xmlXPathObjectPtr val);
315
316xmlXPathObjectPtr  xmlXPathConvertBoolean	(xmlXPathObjectPtr val);
317xmlXPathObjectPtr  xmlXPathConvertNumber	(xmlXPathObjectPtr val);
318xmlXPathObjectPtr  xmlXPathConvertString	(xmlXPathObjectPtr val);
319
320/**
321 * Context handling
322 */
323void		   xmlXPathInit			(void);
324xmlXPathContextPtr xmlXPathNewContext		(xmlDocPtr doc);
325void		   xmlXPathFreeContext		(xmlXPathContextPtr ctxt);
326
327/**
328 * Evaluation functions.
329 */
330xmlXPathObjectPtr  xmlXPathEval			(const xmlChar *str,
331						 xmlXPathContextPtr ctxt);
332xmlXPathObjectPtr  xmlXPathEvalXPtrExpr		(const xmlChar *str,
333						 xmlXPathContextPtr ctxt);
334xmlXPathObjectPtr  xmlXPathEvalExpression	(const xmlChar *str,
335						 xmlXPathContextPtr ctxt);
336int                xmlXPathEvalPredicate	(xmlXPathContextPtr ctxt,
337						 xmlXPathObjectPtr res);
338/**
339 * Separate compilation/evaluation entry points
340 */
341xmlXPathCompExprPtr xmlXPathCompile		(const xmlChar *str);
342xmlXPathObjectPtr   xmlXPathCompiledEval	(xmlXPathCompExprPtr comp,
343						 xmlXPathContextPtr ctx);
344void                xmlXPathFreeCompExpr	(xmlXPathCompExprPtr comp);
345#ifdef __cplusplus
346}
347#endif
348#endif /* ! __XML_XPATH_H__ */
349