Annotation of win32/gnome/gnome-xml/include/libxml/xpath.h, revision 1.2
1.1 paf 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.com
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
19: extern "C" {
20: #endif
21:
22: typedef struct _xmlXPathContext xmlXPathContext;
23: typedef xmlXPathContext *xmlXPathContextPtr;
24: typedef struct _xmlXPathParserContext xmlXPathParserContext;
25: typedef xmlXPathParserContext *xmlXPathParserContextPtr;
26:
27: /**
28: * The set of XPath error codes.
29: */
30:
31: typedef 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: */
59: typedef struct _xmlNodeSet xmlNodeSet;
60: typedef xmlNodeSet *xmlNodeSetPtr;
61: struct _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: /* @@ with_ns to check wether namespace nodes should be looked at @@ */
66: };
67:
68: /*
69: * An expression is evaluated to yield an object, which
70: * has one of the following four basic types:
71: * - node-set
72: * - boolean
73: * - number
74: * - string
75: *
76: * @@ XPointer will add more types !
77: */
78:
79: typedef enum {
80: XPATH_UNDEFINED = 0,
81: XPATH_NODESET = 1,
82: XPATH_BOOLEAN = 2,
83: XPATH_NUMBER = 3,
84: XPATH_STRING = 4,
85: XPATH_POINT = 5,
86: XPATH_RANGE = 6,
87: XPATH_LOCATIONSET = 7,
88: XPATH_USERS = 8,
89: XPATH_XSLT_TREE = 9 /* An XSLT value tree, non modifiable */
90: } xmlXPathObjectType;
91:
92: typedef struct _xmlXPathObject xmlXPathObject;
93: typedef xmlXPathObject *xmlXPathObjectPtr;
94: struct _xmlXPathObject {
95: xmlXPathObjectType type;
96: xmlNodeSetPtr nodesetval;
97: int boolval;
98: double floatval;
99: xmlChar *stringval;
100: void *user;
101: int index;
102: void *user2;
103: int index2;
104: };
105:
106: /**
107: * xmlXPathConvertFunc:
108: * @obj: an XPath object
109: * @type: the number of the target type
110: *
111: * A conversion function is associated to a type and used to cast
112: * the new type to primitive values.
113: *
114: * Returns -1 in case of error, 0 otherwise
115: */
116: typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type);
117:
118: /*
119: * Extra type: a name and a conversion function.
120: */
121:
122: typedef struct _xmlXPathType xmlXPathType;
123: typedef xmlXPathType *xmlXPathTypePtr;
124: struct _xmlXPathType {
125: const xmlChar *name; /* the type name */
126: xmlXPathConvertFunc func; /* the conversion function */
127: };
128:
129: /*
130: * Extra variable: a name and a value.
131: */
132:
133: typedef struct _xmlXPathVariable xmlXPathVariable;
134: typedef xmlXPathVariable *xmlXPathVariablePtr;
135: struct _xmlXPathVariable {
136: const xmlChar *name; /* the variable name */
137: xmlXPathObjectPtr value; /* the value */
138: };
139:
140: /**
141: * xmlXPathEvalFunc:
142: * @ctxt: an XPath parser context
143: * @nargs: the number of arguments passed to the function
144: *
145: * An XPath evaluation function, the parameters are on the XPath context stack.
146: */
147:
148: typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt,
149: int nargs);
150:
151: /*
152: * Extra function: a name and a evaluation function.
153: */
154:
155: typedef struct _xmlXPathFunct xmlXPathFunct;
156: typedef xmlXPathFunct *xmlXPathFuncPtr;
157: struct _xmlXPathFunct {
158: const xmlChar *name; /* the function name */
159: xmlXPathEvalFunc func; /* the evaluation function */
160: };
161:
162: /**
163: * xmlXPathAxisFunc:
164: * @ctxt: the XPath interpreter context
165: * @cur: the previous node being explored on that axis
166: *
167: * An axis traversal function. To traverse an axis, the engine calls
168: * the first time with cur == NULL and repeat until the function returns
169: * NULL indicating the end of the axis traversal.
170: *
171: * Returns the next node in that axis or NULL if at the end of the axis.
172: */
173:
174: typedef xmlXPathObjectPtr (*xmlXPathAxisFunc) (xmlXPathParserContextPtr ctxt,
175: xmlXPathObjectPtr cur);
176:
177: /*
178: * Extra axis: a name and an axis function.
179: */
180:
181: typedef struct _xmlXPathAxis xmlXPathAxis;
182: typedef xmlXPathAxis *xmlXPathAxisPtr;
183: struct _xmlXPathAxis {
184: const xmlChar *name; /* the axis name */
185: xmlXPathAxisFunc func; /* the search function */
186: };
187:
188: /**
189: * xmlXPathContext:
190: *
191: * Expression evaluation occurs with respect to a context.
192: * he context consists of:
193: * - a node (the context node)
194: * - a node list (the context node list)
195: * - a set of variable bindings
196: * - a function library
197: * - the set of namespace declarations in scope for the expression
198: * Following the switch to hash tables, this need to be trimmed up at
199: * the next binary incompatible release.
200: */
201:
202: struct _xmlXPathContext {
203: xmlDocPtr doc; /* The current document */
204: xmlNodePtr node; /* The current node */
205:
206: int nb_variables_unused; /* unused (hash table) */
207: int max_variables_unused; /* unused (hash table) */
208: xmlHashTablePtr varHash; /* Hash table of defined variables */
209:
210: int nb_types; /* number of defined types */
211: int max_types; /* max number of types */
212: xmlXPathTypePtr types; /* Array of defined types */
213:
214: int nb_funcs_unused; /* unused (hash table) */
215: int max_funcs_unused; /* unused (hash table) */
216: xmlHashTablePtr funcHash; /* Hash table of defined funcs */
217:
218: int nb_axis; /* number of defined axis */
219: int max_axis; /* max number of axis */
220: xmlXPathAxisPtr axis; /* Array of defined axis */
221:
222: /* the namespace nodes of the context node */
223: xmlNsPtr *namespaces; /* Array of namespaces */
224: int nsNr; /* number of namespace in scope */
225: void *user; /* function to free */
226:
227: /* extra variables */
228: int contextSize; /* the context size */
229: int proximityPosition; /* the proximity position */
230:
231: /* extra stuff for XPointer */
232: int xptr; /* it this an XPointer context */
233: xmlNodePtr here; /* for here() */
234: xmlNodePtr origin; /* for origin() */
235:
236: /* the set of namespace declarations in scope for the expression */
237: xmlHashTablePtr nsHash; /* The namespaces hash table */
238: void *varLookupFunc; /* variable lookup func */
239: void *varLookupData; /* variable lookup data */
240:
241: /* Possibility to link in an extra item */
242: void *extra; /* needed for XSLT */
243:
244: /* The function name and URI when calling a function */
245: const xmlChar *function;
246: const xmlChar *functionURI;
247:
248: /* function lookup function and data */
249: void *funcLookupFunc; /* function lookup func */
250: void *funcLookupData; /* function lookup data */
251:
252: /* temporary namespace lists kept for walking the namespace axis */
253: xmlNsPtr *tmpNsList; /* Array of namespaces */
254: int tmpNsNr; /* number of namespace in scope */
255: };
256:
257: /*
258: * The structure of a compiled expression form is not public.
259: */
260:
261: typedef struct _xmlXPathCompExpr xmlXPathCompExpr;
262: typedef xmlXPathCompExpr *xmlXPathCompExprPtr;
263:
264: /**
265: * xmlXPathParserContext:
266: *
267: * An XPath parser context. It contains pure parsing informations,
268: * an xmlXPathContext, and the stack of objects.
269: */
270: struct _xmlXPathParserContext {
271: const xmlChar *cur; /* the current char being parsed */
272: const xmlChar *base; /* the full expression */
273:
274: int error; /* error code */
275:
276: xmlXPathContextPtr context; /* the evaluation context */
277: xmlXPathObjectPtr value; /* the current value */
278: int valueNr; /* number of values stacked */
279: int valueMax; /* max number of values stacked */
280: xmlXPathObjectPtr *valueTab; /* stack of values */
281:
282: xmlXPathCompExprPtr comp; /* the precompiled expression */
283: int xptr; /* it this an XPointer expression */
284: xmlNodePtr ancestor; /* used for walking preceding axis */
285: };
286:
287: /**
288: * xmlXPathFunction:
289: * @ctxt: the XPath interprestation context
290: * @nargs: the number of arguments
291: *
292: * An XPath function.
293: * The arguments (if any) are popped out from the context stack
294: * and the result is pushed on the stack.
295: */
296:
297: typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs);
298:
299: /************************************************************************
300: * *
301: * Public API *
302: * *
303: ************************************************************************/
304:
305: /**
306: * Objects and Nodesets handling
307: */
308:
309: LIBXML_DLL_IMPORT extern double xmlXPathNAN;
310: LIBXML_DLL_IMPORT extern double xmlXPathPINF;
311: LIBXML_DLL_IMPORT extern double xmlXPathNINF;
312:
313: int xmlXPathIsNaN (double val);
314: int xmlXPathIsInf (double val);
315:
316: /* These macros may later turn into functions */
317: /**
318: * xmlXPathNodeSetGetLength:
319: * @ns: a node-set
320: *
321: * Implement a functionality similar to the DOM NodeList.length.
322: *
323: * Returns the number of nodes in the node-set.
324: */
325: #define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0)
326: /**
327: * xmlXPathNodeSetItem:
328: * @ns: a node-set
329: * @index: index of a node in the set
330: *
331: * Implements a functionality similar to the DOM NodeList.item().
332: *
333: * Returns the xmlNodePtr at the given @index in @ns or NULL if
334: * @index is out of range (0 to length-1)
335: */
336: #define xmlXPathNodeSetItem(ns, index) \
337: ((((ns) != NULL) && \
338: ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \
339: (ns)->nodeTab[(index)] \
340: : NULL)
341: /**
342: * xmlXPathNodeSetIsEmpty:
343: * @ns: a node-set
344: *
345: * Checks whether @ns is empty or not.
346: *
347: * Returns %TRUE if @ns is an empty node-set.
348: */
349: #define xmlXPathNodeSetIsEmpty(ns) \
350: (((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL))
351:
352:
353: void xmlXPathFreeObject (xmlXPathObjectPtr obj);
354: xmlNodeSetPtr xmlXPathNodeSetCreate (xmlNodePtr val);
355: void xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj);
356: void xmlXPathFreeNodeSet (xmlNodeSetPtr obj);
357: xmlXPathObjectPtr xmlXPathObjectCopy (xmlXPathObjectPtr val);
358: int xmlXPathCmpNodes (xmlNodePtr node1,
359: xmlNodePtr node2);
360: /**
361: * Conversion functions to basic types.
362: */
363: int xmlXPathCastNumberToBoolean (double val);
364: int xmlXPathCastStringToBoolean (const xmlChar * val);
365: int xmlXPathCastNodeSetToBoolean (xmlNodeSetPtr ns);
366: int xmlXPathCastToBoolean (xmlXPathObjectPtr val);
367:
368: double xmlXPathCastBooleanToNumber (int val);
369: double xmlXPathCastStringToNumber (const xmlChar * val);
370: double xmlXPathCastNodeToNumber (xmlNodePtr node);
371: double xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns);
372: double xmlXPathCastToNumber (xmlXPathObjectPtr val);
373:
374: xmlChar * xmlXPathCastBooleanToString (int val);
375: xmlChar * xmlXPathCastNumberToString (double val);
376: xmlChar * xmlXPathCastNodeToString (xmlNodePtr node);
377: xmlChar * xmlXPathCastNodeSetToString (xmlNodeSetPtr ns);
378: xmlChar * xmlXPathCastToString (xmlXPathObjectPtr val);
379:
380: xmlXPathObjectPtr xmlXPathConvertBoolean (xmlXPathObjectPtr val);
381: xmlXPathObjectPtr xmlXPathConvertNumber (xmlXPathObjectPtr val);
382: xmlXPathObjectPtr xmlXPathConvertString (xmlXPathObjectPtr val);
383:
384: /**
385: * Context handling.
386: */
387: void xmlXPathInit (void);
388: xmlXPathContextPtr xmlXPathNewContext (xmlDocPtr doc);
389: void xmlXPathFreeContext (xmlXPathContextPtr ctxt);
390:
391: /**
392: * Evaluation functions.
393: */
1.2 ! paf 394: long xmlXPathOrderDocElems (xmlDocPtr doc);
1.1 paf 395: xmlXPathObjectPtr xmlXPathEval (const xmlChar *str,
396: xmlXPathContextPtr ctx);
397: xmlXPathObjectPtr xmlXPathEvalExpression (const xmlChar *str,
398: xmlXPathContextPtr ctxt);
399: int xmlXPathEvalPredicate (xmlXPathContextPtr ctxt,
400: xmlXPathObjectPtr res);
401: /**
402: * Separate compilation/evaluation entry points.
403: */
404: xmlXPathCompExprPtr xmlXPathCompile (const xmlChar *str);
405: xmlXPathObjectPtr xmlXPathCompiledEval (xmlXPathCompExprPtr comp,
406: xmlXPathContextPtr ctx);
407: void xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp);
408: #ifdef __cplusplus
409: }
410: #endif
411: #endif /* ! __XML_XPATH_H__ */
E-mail: