Coverage Report

Created: 2024-08-27 12:19

/src/libxml2/include/libxml/xpath.h
Line
Count
Source (jump to first uncovered line)
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
0
#define XML_XPATH_CHECKNS (1<<0)
276
/**
277
 * XML_XPATH_NOVAR:
278
 *
279
 * forbid variables in expression
280
 */
281
0
#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;        /* used to limit Pop on the stack */
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
0
#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
0
    ((((ns) != NULL) &&       \
442
0
      ((index) >= 0) && ((index) < (ns)->nodeNr)) ? \
443
0
     (ns)->nodeTab[(index)]        \
444
0
     : 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
0
    (((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__ */