Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/xml2/include/libxml/xpath.h
4394 views
1
/*
2
* Summary: XML Path Language implementation
3
* Description: API for the XML Path Language implementation
4
*
5
* 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
9
*
10
* Implements
11
* W3C Recommendation 16 November 1999
12
* http://www.w3.org/TR/1999/REC-xpath-19991116
13
*
14
* Copy: See Copyright for the status of this software.
15
*
16
* Author: Daniel Veillard
17
*/
18
19
#ifndef __XML_XPATH_H__
20
#define __XML_XPATH_H__
21
22
#include <libxml/xmlversion.h>
23
24
#ifdef LIBXML_XPATH_ENABLED
25
26
#include <libxml/xmlerror.h>
27
#include <libxml/tree.h>
28
#include <libxml/hash.h>
29
#endif /* LIBXML_XPATH_ENABLED */
30
31
#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
32
#ifdef __cplusplus
33
extern "C" {
34
#endif
35
#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED */
36
37
#ifdef LIBXML_XPATH_ENABLED
38
39
typedef struct _xmlXPathContext xmlXPathContext;
40
typedef xmlXPathContext *xmlXPathContextPtr;
41
typedef struct _xmlXPathParserContext xmlXPathParserContext;
42
typedef xmlXPathParserContext *xmlXPathParserContextPtr;
43
44
/**
45
* The set of XPath error codes.
46
*/
47
48
typedef enum {
49
XPATH_EXPRESSION_OK = 0,
50
XPATH_NUMBER_ERROR,
51
XPATH_UNFINISHED_LITERAL_ERROR,
52
XPATH_START_LITERAL_ERROR,
53
XPATH_VARIABLE_REF_ERROR,
54
XPATH_UNDEF_VARIABLE_ERROR,
55
XPATH_INVALID_PREDICATE_ERROR,
56
XPATH_EXPR_ERROR,
57
XPATH_UNCLOSED_ERROR,
58
XPATH_UNKNOWN_FUNC_ERROR,
59
XPATH_INVALID_OPERAND,
60
XPATH_INVALID_TYPE,
61
XPATH_INVALID_ARITY,
62
XPATH_INVALID_CTXT_SIZE,
63
XPATH_INVALID_CTXT_POSITION,
64
XPATH_MEMORY_ERROR,
65
XPTR_SYNTAX_ERROR,
66
XPTR_RESOURCE_ERROR,
67
XPTR_SUB_RESOURCE_ERROR,
68
XPATH_UNDEF_PREFIX_ERROR,
69
XPATH_ENCODING_ERROR,
70
XPATH_INVALID_CHAR_ERROR,
71
XPATH_INVALID_CTXT,
72
XPATH_STACK_ERROR,
73
XPATH_FORBID_VARIABLE_ERROR,
74
XPATH_OP_LIMIT_EXCEEDED,
75
XPATH_RECURSION_LIMIT_EXCEEDED
76
} xmlXPathError;
77
78
/*
79
* A node-set (an unordered collection of nodes without duplicates).
80
*/
81
typedef struct _xmlNodeSet xmlNodeSet;
82
typedef xmlNodeSet *xmlNodeSetPtr;
83
struct _xmlNodeSet {
84
int nodeNr; /* number of nodes in the set */
85
int nodeMax; /* size of the array as allocated */
86
xmlNodePtr *nodeTab; /* array of nodes in no particular order */
87
/* @@ with_ns to check whether namespace nodes should be looked at @@ */
88
};
89
90
/*
91
* An expression is evaluated to yield an object, which
92
* has one of the following four basic types:
93
* - node-set
94
* - boolean
95
* - number
96
* - string
97
*
98
* @@ XPointer will add more types !
99
*/
100
101
typedef enum {
102
XPATH_UNDEFINED = 0,
103
XPATH_NODESET = 1,
104
XPATH_BOOLEAN = 2,
105
XPATH_NUMBER = 3,
106
XPATH_STRING = 4,
107
#ifdef LIBXML_XPTR_LOCS_ENABLED
108
XPATH_POINT = 5,
109
XPATH_RANGE = 6,
110
XPATH_LOCATIONSET = 7,
111
#endif
112
XPATH_USERS = 8,
113
XPATH_XSLT_TREE = 9 /* An XSLT value tree, non modifiable */
114
} xmlXPathObjectType;
115
116
#ifndef LIBXML_XPTR_LOCS_ENABLED
117
/** DOC_DISABLE */
118
#define XPATH_POINT 5
119
#define XPATH_RANGE 6
120
#define XPATH_LOCATIONSET 7
121
/** DOC_ENABLE */
122
#endif
123
124
typedef struct _xmlXPathObject xmlXPathObject;
125
typedef xmlXPathObject *xmlXPathObjectPtr;
126
struct _xmlXPathObject {
127
xmlXPathObjectType type;
128
xmlNodeSetPtr nodesetval;
129
int boolval;
130
double floatval;
131
xmlChar *stringval;
132
void *user;
133
int index;
134
void *user2;
135
int index2;
136
};
137
138
/**
139
* xmlXPathConvertFunc:
140
* @obj: an XPath object
141
* @type: the number of the target type
142
*
143
* A conversion function is associated to a type and used to cast
144
* the new type to primitive values.
145
*
146
* Returns -1 in case of error, 0 otherwise
147
*/
148
typedef int (*xmlXPathConvertFunc) (xmlXPathObjectPtr obj, int type);
149
150
/*
151
* Extra type: a name and a conversion function.
152
*/
153
154
typedef struct _xmlXPathType xmlXPathType;
155
typedef xmlXPathType *xmlXPathTypePtr;
156
struct _xmlXPathType {
157
const xmlChar *name; /* the type name */
158
xmlXPathConvertFunc func; /* the conversion function */
159
};
160
161
/*
162
* Extra variable: a name and a value.
163
*/
164
165
typedef struct _xmlXPathVariable xmlXPathVariable;
166
typedef xmlXPathVariable *xmlXPathVariablePtr;
167
struct _xmlXPathVariable {
168
const xmlChar *name; /* the variable name */
169
xmlXPathObjectPtr value; /* the value */
170
};
171
172
/**
173
* xmlXPathEvalFunc:
174
* @ctxt: an XPath parser context
175
* @nargs: the number of arguments passed to the function
176
*
177
* An XPath evaluation function, the parameters are on the XPath context stack.
178
*/
179
180
typedef void (*xmlXPathEvalFunc)(xmlXPathParserContextPtr ctxt,
181
int nargs);
182
183
/*
184
* Extra function: a name and a evaluation function.
185
*/
186
187
typedef struct _xmlXPathFunct xmlXPathFunct;
188
typedef xmlXPathFunct *xmlXPathFuncPtr;
189
struct _xmlXPathFunct {
190
const xmlChar *name; /* the function name */
191
xmlXPathEvalFunc func; /* the evaluation function */
192
};
193
194
/**
195
* xmlXPathAxisFunc:
196
* @ctxt: the XPath interpreter context
197
* @cur: the previous node being explored on that axis
198
*
199
* An axis traversal function. To traverse an axis, the engine calls
200
* the first time with cur == NULL and repeat until the function returns
201
* NULL indicating the end of the axis traversal.
202
*
203
* Returns the next node in that axis or NULL if at the end of the axis.
204
*/
205
206
typedef xmlXPathObjectPtr (*xmlXPathAxisFunc) (xmlXPathParserContextPtr ctxt,
207
xmlXPathObjectPtr cur);
208
209
/*
210
* Extra axis: a name and an axis function.
211
*/
212
213
typedef struct _xmlXPathAxis xmlXPathAxis;
214
typedef xmlXPathAxis *xmlXPathAxisPtr;
215
struct _xmlXPathAxis {
216
const xmlChar *name; /* the axis name */
217
xmlXPathAxisFunc func; /* the search function */
218
};
219
220
/**
221
* xmlXPathFunction:
222
* @ctxt: the XPath interprestation context
223
* @nargs: the number of arguments
224
*
225
* An XPath function.
226
* The arguments (if any) are popped out from the context stack
227
* and the result is pushed on the stack.
228
*/
229
230
typedef void (*xmlXPathFunction) (xmlXPathParserContextPtr ctxt, int nargs);
231
232
/*
233
* Function and Variable Lookup.
234
*/
235
236
/**
237
* xmlXPathVariableLookupFunc:
238
* @ctxt: an XPath context
239
* @name: name of the variable
240
* @ns_uri: the namespace name hosting this variable
241
*
242
* Prototype for callbacks used to plug variable lookup in the XPath
243
* engine.
244
*
245
* Returns the XPath object value or NULL if not found.
246
*/
247
typedef xmlXPathObjectPtr (*xmlXPathVariableLookupFunc) (void *ctxt,
248
const xmlChar *name,
249
const xmlChar *ns_uri);
250
251
/**
252
* xmlXPathFuncLookupFunc:
253
* @ctxt: an XPath context
254
* @name: name of the function
255
* @ns_uri: the namespace name hosting this function
256
*
257
* Prototype for callbacks used to plug function lookup in the XPath
258
* engine.
259
*
260
* Returns the XPath function or NULL if not found.
261
*/
262
typedef xmlXPathFunction (*xmlXPathFuncLookupFunc) (void *ctxt,
263
const xmlChar *name,
264
const xmlChar *ns_uri);
265
266
/**
267
* xmlXPathFlags:
268
* Flags for XPath engine compilation and runtime
269
*/
270
/**
271
* XML_XPATH_CHECKNS:
272
*
273
* check namespaces at compilation
274
*/
275
#define XML_XPATH_CHECKNS (1<<0)
276
/**
277
* XML_XPATH_NOVAR:
278
*
279
* forbid variables in expression
280
*/
281
#define XML_XPATH_NOVAR (1<<1)
282
283
/**
284
* xmlXPathContext:
285
*
286
* Expression evaluation occurs with respect to a context.
287
* he context consists of:
288
* - a node (the context node)
289
* - a node list (the context node list)
290
* - a set of variable bindings
291
* - a function library
292
* - the set of namespace declarations in scope for the expression
293
* Following the switch to hash tables, this need to be trimmed up at
294
* the next binary incompatible release.
295
* The node may be modified when the context is passed to libxml2
296
* for an XPath evaluation so you may need to initialize it again
297
* before the next call.
298
*/
299
300
struct _xmlXPathContext {
301
xmlDocPtr doc; /* The current document */
302
xmlNodePtr node; /* The current node */
303
304
int nb_variables_unused; /* unused (hash table) */
305
int max_variables_unused; /* unused (hash table) */
306
xmlHashTablePtr varHash; /* Hash table of defined variables */
307
308
int nb_types; /* number of defined types */
309
int max_types; /* max number of types */
310
xmlXPathTypePtr types; /* Array of defined types */
311
312
int nb_funcs_unused; /* unused (hash table) */
313
int max_funcs_unused; /* unused (hash table) */
314
xmlHashTablePtr funcHash; /* Hash table of defined funcs */
315
316
int nb_axis; /* number of defined axis */
317
int max_axis; /* max number of axis */
318
xmlXPathAxisPtr axis; /* Array of defined axis */
319
320
/* the namespace nodes of the context node */
321
xmlNsPtr *namespaces; /* Array of namespaces */
322
int nsNr; /* number of namespace in scope */
323
void *user; /* function to free */
324
325
/* extra variables */
326
int contextSize; /* the context size */
327
int proximityPosition; /* the proximity position */
328
329
/* extra stuff for XPointer */
330
int xptr; /* is this an XPointer context? */
331
xmlNodePtr here; /* for here() */
332
xmlNodePtr origin; /* for origin() */
333
334
/* the set of namespace declarations in scope for the expression */
335
xmlHashTablePtr nsHash; /* The namespaces hash table */
336
xmlXPathVariableLookupFunc varLookupFunc;/* variable lookup func */
337
void *varLookupData; /* variable lookup data */
338
339
/* Possibility to link in an extra item */
340
void *extra; /* needed for XSLT */
341
342
/* The function name and URI when calling a function */
343
const xmlChar *function;
344
const xmlChar *functionURI;
345
346
/* function lookup function and data */
347
xmlXPathFuncLookupFunc funcLookupFunc;/* function lookup func */
348
void *funcLookupData; /* function lookup data */
349
350
/* temporary namespace lists kept for walking the namespace axis */
351
xmlNsPtr *tmpNsList; /* Array of namespaces */
352
int tmpNsNr; /* number of namespaces in scope */
353
354
/* error reporting mechanism */
355
void *userData; /* user specific data block */
356
xmlStructuredErrorFunc error; /* the callback in case of errors */
357
xmlError lastError; /* the last error */
358
xmlNodePtr debugNode; /* the source node XSLT */
359
360
/* dictionary */
361
xmlDictPtr dict; /* dictionary if any */
362
363
int flags; /* flags to control compilation */
364
365
/* Cache for reusal of XPath objects */
366
void *cache;
367
368
/* Resource limits */
369
unsigned long opLimit;
370
unsigned long opCount;
371
int depth;
372
};
373
374
/*
375
* The structure of a compiled expression form is not public.
376
*/
377
378
typedef struct _xmlXPathCompExpr xmlXPathCompExpr;
379
typedef xmlXPathCompExpr *xmlXPathCompExprPtr;
380
381
/**
382
* xmlXPathParserContext:
383
*
384
* An XPath parser context. It contains pure parsing information,
385
* an xmlXPathContext, and the stack of objects.
386
*/
387
struct _xmlXPathParserContext {
388
const xmlChar *cur; /* the current char being parsed */
389
const xmlChar *base; /* the full expression */
390
391
int error; /* error code */
392
393
xmlXPathContextPtr context; /* the evaluation context */
394
xmlXPathObjectPtr value; /* the current value */
395
int valueNr; /* number of values stacked */
396
int valueMax; /* max number of values stacked */
397
xmlXPathObjectPtr *valueTab; /* stack of values */
398
399
xmlXPathCompExprPtr comp; /* the precompiled expression */
400
int xptr; /* it this an XPointer expression */
401
xmlNodePtr ancestor; /* used for walking preceding axis */
402
403
int valueFrame; /* always zero for compatibility */
404
};
405
406
/************************************************************************
407
* *
408
* Public API *
409
* *
410
************************************************************************/
411
412
/**
413
* Objects and Nodesets handling
414
*/
415
416
XMLPUBVAR double xmlXPathNAN;
417
XMLPUBVAR double xmlXPathPINF;
418
XMLPUBVAR double xmlXPathNINF;
419
420
/* These macros may later turn into functions */
421
/**
422
* xmlXPathNodeSetGetLength:
423
* @ns: a node-set
424
*
425
* Implement a functionality similar to the DOM NodeList.length.
426
*
427
* Returns the number of nodes in the node-set.
428
*/
429
#define xmlXPathNodeSetGetLength(ns) ((ns) ? (ns)->nodeNr : 0)
430
/**
431
* xmlXPathNodeSetItem:
432
* @ns: a node-set
433
* @index: index of a node in the set
434
*
435
* Implements a functionality similar to the DOM NodeList.item().
436
*
437
* Returns the xmlNodePtr at the given @index in @ns or NULL if
438
* @index is out of range (0 to length-1)
439
*/
440
#define xmlXPathNodeSetItem(ns, index) \
441
((((ns) != NULL) && \
442
((index) >= 0) && ((index) < (ns)->nodeNr)) ? \
443
(ns)->nodeTab[(index)] \
444
: NULL)
445
/**
446
* xmlXPathNodeSetIsEmpty:
447
* @ns: a node-set
448
*
449
* Checks whether @ns is empty or not.
450
*
451
* Returns %TRUE if @ns is an empty node-set.
452
*/
453
#define xmlXPathNodeSetIsEmpty(ns) \
454
(((ns) == NULL) || ((ns)->nodeNr == 0) || ((ns)->nodeTab == NULL))
455
456
457
XMLPUBFUN void
458
xmlXPathFreeObject (xmlXPathObjectPtr obj);
459
XMLPUBFUN xmlNodeSetPtr
460
xmlXPathNodeSetCreate (xmlNodePtr val);
461
XMLPUBFUN void
462
xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj);
463
XMLPUBFUN void
464
xmlXPathFreeNodeSet (xmlNodeSetPtr obj);
465
XMLPUBFUN xmlXPathObjectPtr
466
xmlXPathObjectCopy (xmlXPathObjectPtr val);
467
XMLPUBFUN int
468
xmlXPathCmpNodes (xmlNodePtr node1,
469
xmlNodePtr node2);
470
/**
471
* Conversion functions to basic types.
472
*/
473
XMLPUBFUN int
474
xmlXPathCastNumberToBoolean (double val);
475
XMLPUBFUN int
476
xmlXPathCastStringToBoolean (const xmlChar * val);
477
XMLPUBFUN int
478
xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns);
479
XMLPUBFUN int
480
xmlXPathCastToBoolean (xmlXPathObjectPtr val);
481
482
XMLPUBFUN double
483
xmlXPathCastBooleanToNumber (int val);
484
XMLPUBFUN double
485
xmlXPathCastStringToNumber (const xmlChar * val);
486
XMLPUBFUN double
487
xmlXPathCastNodeToNumber (xmlNodePtr node);
488
XMLPUBFUN double
489
xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns);
490
XMLPUBFUN double
491
xmlXPathCastToNumber (xmlXPathObjectPtr val);
492
493
XMLPUBFUN xmlChar *
494
xmlXPathCastBooleanToString (int val);
495
XMLPUBFUN xmlChar *
496
xmlXPathCastNumberToString (double val);
497
XMLPUBFUN xmlChar *
498
xmlXPathCastNodeToString (xmlNodePtr node);
499
XMLPUBFUN xmlChar *
500
xmlXPathCastNodeSetToString (xmlNodeSetPtr ns);
501
XMLPUBFUN xmlChar *
502
xmlXPathCastToString (xmlXPathObjectPtr val);
503
504
XMLPUBFUN xmlXPathObjectPtr
505
xmlXPathConvertBoolean (xmlXPathObjectPtr val);
506
XMLPUBFUN xmlXPathObjectPtr
507
xmlXPathConvertNumber (xmlXPathObjectPtr val);
508
XMLPUBFUN xmlXPathObjectPtr
509
xmlXPathConvertString (xmlXPathObjectPtr val);
510
511
/**
512
* Context handling.
513
*/
514
XMLPUBFUN xmlXPathContextPtr
515
xmlXPathNewContext (xmlDocPtr doc);
516
XMLPUBFUN void
517
xmlXPathFreeContext (xmlXPathContextPtr ctxt);
518
XMLPUBFUN int
519
xmlXPathContextSetCache(xmlXPathContextPtr ctxt,
520
int active,
521
int value,
522
int options);
523
/**
524
* Evaluation functions.
525
*/
526
XMLPUBFUN long
527
xmlXPathOrderDocElems (xmlDocPtr doc);
528
XMLPUBFUN int
529
xmlXPathSetContextNode (xmlNodePtr node,
530
xmlXPathContextPtr ctx);
531
XMLPUBFUN xmlXPathObjectPtr
532
xmlXPathNodeEval (xmlNodePtr node,
533
const xmlChar *str,
534
xmlXPathContextPtr ctx);
535
XMLPUBFUN xmlXPathObjectPtr
536
xmlXPathEval (const xmlChar *str,
537
xmlXPathContextPtr ctx);
538
XMLPUBFUN xmlXPathObjectPtr
539
xmlXPathEvalExpression (const xmlChar *str,
540
xmlXPathContextPtr ctxt);
541
XMLPUBFUN int
542
xmlXPathEvalPredicate (xmlXPathContextPtr ctxt,
543
xmlXPathObjectPtr res);
544
/**
545
* Separate compilation/evaluation entry points.
546
*/
547
XMLPUBFUN xmlXPathCompExprPtr
548
xmlXPathCompile (const xmlChar *str);
549
XMLPUBFUN xmlXPathCompExprPtr
550
xmlXPathCtxtCompile (xmlXPathContextPtr ctxt,
551
const xmlChar *str);
552
XMLPUBFUN xmlXPathObjectPtr
553
xmlXPathCompiledEval (xmlXPathCompExprPtr comp,
554
xmlXPathContextPtr ctx);
555
XMLPUBFUN int
556
xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp,
557
xmlXPathContextPtr ctxt);
558
XMLPUBFUN void
559
xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp);
560
#endif /* LIBXML_XPATH_ENABLED */
561
#if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
562
XML_DEPRECATED
563
XMLPUBFUN void
564
xmlXPathInit (void);
565
XMLPUBFUN int
566
xmlXPathIsNaN (double val);
567
XMLPUBFUN int
568
xmlXPathIsInf (double val);
569
570
#ifdef __cplusplus
571
}
572
#endif
573
574
#endif /* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED*/
575
#endif /* ! __XML_XPATH_H__ */
576
577