summaryrefslogtreecommitdiff
path: root/packages/libxml/src/xpath.inc
blob: a2e0bae381357cf1d4036c0904de4002d5b755ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
(*
 * Summary: XML Path Language implementation
 * Description: API for the XML Path Language implementation
 *
 * XML Path Language implementation
 * XPath is a language for addressing parts of an XML document,
 * designed to be used by both XSLT and XPointer
 *     http://www.w3.org/TR/xpath
 *
 * Implements
 * W3C Recommendation 16 November 1999
 *     http://www.w3.org/TR/1999/REC-xpath-19991116
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Daniel Veillard
 *)

{$IFDEF LIBXML_XPATH_ENABLED}

{$IFDEF POINTER}
  xmlXPathContextPtr = ^xmlXPathContext;
  xmlXPathParserContextPtr = ^xmlXPathParserContext;
  xmlNodeSetPtr = ^xmlNodeSet;
  xmlXPathObjectPtr = ^xmlXPathObject;
  xmlXPathObjectPtrPtr = ^xmlXPathObjectPtr;
  xmlXPathTypePtr = ^xmlXPathType;
  xmlXPathVariablePtr = ^xmlXPathVariable;
  xmlXPathFuncPtr = ^xmlXPathFunc;
  xmlXPathAxisPtr = ^xmlXPathAxis;
  xmlXPathCompExprPtr = ^xmlXPathCompExpr;
{$ENDIF}

{$IFDEF TYPE}
(**
 * The set of XPath error codes.
 *)

  xmlXPathError = (
    XPATH_EXPRESSION_OK = 0,
    XPATH_NUMBER_ERROR,
    XPATH_UNFINISHED_LITERAL_ERROR,
    XPATH_START_LITERAL_ERROR,
    XPATH_VARIABLE_REF_ERROR,
    XPATH_UNDEF_VARIABLE_ERROR,
    XPATH_INVALID_PREDICATE_ERROR,
    XPATH_EXPR_ERROR,
    XPATH_UNCLOSED_ERROR,
    XPATH_UNKNOWN_FUNC_ERROR,
    XPATH_INVALID_OPERAND,
    XPATH_INVALID_TYPE,
    XPATH_INVALID_ARITY,
    XPATH_INVALID_CTXT_SIZE,
    XPATH_INVALID_CTXT_POSITION,
    XPATH_MEMORY_ERROR,
    XPTR_SYNTAX_ERROR,
    XPTR_RESOURCE_ERROR,
    XPTR_SUB_RESOURCE_ERROR,
    XPATH_UNDEF_PREFIX_ERROR,
    XPATH_ENCODING_ERROR,
    XPATH_INVALID_CHAR_ERROR,
    XPATH_INVALID_CTXT
  );

(*
 * A node-set (an unordered collection of nodes without duplicates).
 *)
  xmlNodeSet = record
    nodeNr  : cint;			(* number of nodes in the set *)
    nodeMax : cint;		(* size of the array as allocated *)
    nodeTab : xmlNodePtrPtr;	(* array of nodes in no particular order *)
    (* @@ with_ns to check wether namespace nodes should be looked at @@ *)
  end;

(*
 * An expression is evaluated to yield an object, which
 * has one of the following four basic types:
 *   - node-set
 *   - boolean
 *   - number
 *   - string
 *
 * @@ XPointer will add more types !
 *)

  xmlXPathObjectType = (
    XPATH_UNDEFINED = 0,
    XPATH_NODESET = 1,
    XPATH_BOOLEAN = 2,
    XPATH_NUMBER = 3,
    XPATH_STRING = 4,
    XPATH_POINT = 5,
    XPATH_RANGE = 6,
    XPATH_LOCATIONSET = 7,
    XPATH_USERS = 8,
    XPATH_XSLT_TREE = 9  (* An XSLT value tree, non modifiable *)
  );

  xmlXPathObject = record
    _type       : xmlXPathObjectType;
    nodesetval  : xmlNodeSetPtr;
    boolval     : cint;
    floatval    : cdouble;
    stringval   : xmlCharPtr;
    user        : pointer;
    index       : cint;
    user2       : pointer;
    index2      : cint;
  end;

(**
 * xmlXPathConvertFunc:
 * @obj:  an XPath object
 * @type:  the number of the target type
 *
 * A conversion function is associated to a type and used to cast
 * the new type to primitive values.
 *
 * Returns -1 in case of error, 0 otherwise
 *)
  xmlXPathConvertFunc = function(obj: xmlXPathObjectPtr; _type: cint): cint; EXTDECL;

(*
 * Extra type: a name and a conversion function.
 *)
  xmlXPathType = record
    name  : xmlCharPtr;		(* the type name *)
    func  : xmlXPathConvertFunc;		(* the conversion function *)
  end;

(*
 * Extra variable: a name and a value.
 *)
  xmlXPathVariable = record
    name  : xmlCharPtr;		(* the variable name *)
    value : xmlXPathObjectPtr;		(* the value *)
  end;

(**
 * xmlXPathEvalFunc:
 * @ctxt: an XPath parser context
 * @nargs: the number of arguments passed to the function
 *
 * An XPath evaluation function, the parameters are on the XPath context stack.
 *)

  xmlXPathEvalFunc = procedure(ctxt: xmlXPathParserContextPtr; nargs: cint); EXTDECL;

(*
 * Extra function: a name and a evaluation function.
 *)

  xmlXPathFunc = record
    name  : xmlCharPtr;		(* the function name *)
    func  : xmlXPathEvalFunc;		(* the evaluation function *)
  end;

(**
 * xmlXPathAxisFunc:
 * @ctxt:  the XPath interpreter context
 * @cur:  the previous node being explored on that axis
 *
 * An axis traversal function. To traverse an axis, the engine calls
 * the first time with cur == NULL and repeat until the function returns
 * NULL indicating the end of the axis traversal.
 *
 * Returns the next node in that axis or NULL if at the end of the axis.
 *)

  xmlXPathAxisFunc = function(ctxt: xmlXPathParserContextPtr; cur: xmlXPathObjectPtr): xmlXPathObjectPtr; EXTDECL;

(*
 * Extra axis: a name and an axis function.
 *)
  xmlXPathAxis = record
    name  : xmlCharPtr;		(* the axis name *)
    func  : xmlXPathAxisFunc;		(* the search function *)
  end;

(**
 * xmlXPathFunction:
 * @ctxt:  the XPath interprestation context
 * @nargs:  the number of arguments
 *
 * An XPath function.
 * The arguments (if any) are popped out from the context stack
 * and the result is pushed on the stack.
 *)
  xmlXPathFunction = procedure(ctxt: xmlXPathParserContextPtr; nargs: cint); EXTDECL;

(*
 * Function and Variable Lookup.
 *)

(**
 * xmlXPathVariableLookupFunc:
 * @ctxt:  an XPath context
 * @name:  name of the variable
 * @ns_uri:  the namespace name hosting this variable
 *
 * Prototype for callbacks used to plug variable lookup in the XPath
 * engine.
 *
 * Returns the XPath object value or NULL if not found.
 *)
  xmlXPathVariableLookupFunc = function(ctxt: pointer; name, ns_uri: xmlCharPtr): xmlXPathObjectPtr; EXTDECL;

(**
 * xmlXPathFuncLookupFunc:
 * @ctxt:  an XPath context
 * @name:  name of the function
 * @ns_uri:  the namespace name hosting this function
 *
 * Prototype for callbacks used to plug function lookup in the XPath
 * engine.
 *
 * Returns the XPath function or NULL if not found.
 *)
  xmlXPathFuncLookupFunc = function(ctxt: pointer; name, ns_uri: xmlCharPtr): xmlXPathFunction; EXTDECL;
{$ENDIF}

{$IFDEF CONST}
(**
 * xmlXPathFlags:
 * Flags for XPath engine compilation and runtime
 *)
(**
 * XML_XPATH_CHECKNS:
 *
 * check namespaces at compilation
 *)
  XML_XPATH_CHECKNS = (1 shl 0);
(**
 * XML_XPATH_NOVAR:
 *
 * forbid variables in expression
 *)
  XML_XPATH_NOVAR	 = (1 shl 1);
{$ENDIF}

{$IFDEF TYPE}
(**
 * xmlXPathContext:
 *
 * Expression evaluation occurs with respect to a context.
 * he context consists of:
 *    - a node (the context node) 
 *    - a node list (the context node list) 
 *    - a set of variable bindings 
 *    - a function library 
 *    - the set of namespace declarations in scope for the expression 
 * Following the switch to hash tables, this need to be trimmed up at
 * the next binary incompatible release.
 * The node may be modified when the context is passed to libxml2
 * for an XPath evaluation so you may need to initialize it again
 * before the next call.
 *)

  xmlXPathContext = record
    doc                 : xmlDocPtr;			(* The current document *)
    node                : xmlNodePtr;			(* The current node *)

    nb_variables_unused : cint;		(* unused (hash table) *)
    max_variables_unused: cint;		(* unused (hash table) *)
    varHash             : xmlHashTablePtr;		(* Hash table of defined variables *)

    nb_types            : cint;			(* number of defined types *)
    max_types           : cint;			(* max number of types *)
    types               : xmlXPathTypePtr;		(* Array of defined types *)

    nb_funcs_unused     : cint;		(* unused (hash table) *)
    max_funcs_unused    : cint;		(* unused (hash table) *)
    funcHash            : xmlHashTablePtr;		(* Hash table of defined funcs *)

    nb_axis             : cint;			(* number of defined axis *)
    max_axis            : cint;			(* max number of axis *)
    axis                : xmlXPathAxisPtr;		(* Array of defined axis *)

    (* the namespace nodes of the context node *)
    namespaces          : xmlNsPtrPtr;		(* Array of namespaces *)
    nsNr                : cint;				(* number of namespace in scope *)
    user                : pointer;				(* function to free *)

    (* extra variables *)
    contextSize         : cint;			(* the context size *)
    proximityPosition   : cint;		(* the proximity position *)

    (* extra stuff for XPointer *)
    xptr                : cint;				(* is this an XPointer context? *)
    here                : xmlNodePtr;			(* for here() *)
    origin              : xmlNodePtr;			(* for origin() *)

    (* the set of namespace declarations in scope for the expression *)
    nsHash              : xmlHashTablePtr;		(* The namespaces hash table *)
    varLookupFunc       : xmlXPathVariableLookupFunc;(* variable lookup func *)
    varLookupData       : pointer;		(* variable lookup data *)

    (* Possibility to link in an extra item *)
    extra               : pointer;                        (* needed for XSLT *)

    (* The function name and URI when calling a function *)
    _function           : xmlCharPtr;
    functionURI         : xmlCharPtr;

    (* function lookup function and data *)
    funcLookupFunc      : xmlXPathFuncLookupFunc;(* function lookup func *)
    funcLookupData      : pointer;		(* function lookup data *)

    (* temporary namespace lists kept for walking the namespace axis *)
    tmpNsList           : xmlNsPtr;		(* Array of namespaces *)
    tmpNsNr             : cint;			(* number of namespaces in scope *)

    (* error reporting mechanism *)
    userData            : pointer;                     (* user specific data block *)
    error               : xmlStructuredErrorFunc;       (* the callback in case of errors *)
    lastError           : xmlError;			(* the last error *)
    debugNode           : xmlNodePtr;		(* the source node XSLT *)

    (* dictionary *)
    dict                : xmlDictPtr;			(* dictionary if any *)

    flags               : cint;				(* flags to control compilation *)

    (* Cache for reusal of XPath objects *)
    cache               : pointer;
  end;

(*
 * The structure of a compiled expression form is not public.
 *)
  xmlXPathCompExpr = record end;

(**
 * xmlXPathParserContext:
 *
 * An XPath parser context. It contains pure parsing informations,
 * an xmlXPathContext, and the stack of objects.
 *)
  xmlXPathParserContext = record
    cur           : xmlCharPtr;			(* the current char being parsed *)
    base          : xmlCharPtr;			(* the full expression *)

    error         : cint;				(* error code *)

    context       : xmlXPathContextPtr;	(* the evaluation context *)
    value         : xmlXPathObjectPtr;	(* the current value *)
    valueNr       : cint;	(* number of values stacked *)
    valueMax      : cint;	(* max number of values stacked *)
    valueTab      : xmlXPathObjectPtrPtr;	(* stack of values *)

    comp          : xmlXPathCompExprPtr;		(* the precompiled expression *)
    xptr          : cint;				(* it this an XPointer expression *)
    ancestor      : xmlNodePtr;	(* used for walking preceding axis *)
  end;
{$ENDIF}

{$IFDEF FUNCTION}
(************************************************************************
 *									*
 *			Public API					*
 *									*
 ************************************************************************)

(**
 * Objects and Nodesets handling
 *)

{$IFNDEF NO_EXTERNAL_VARS}
var
  xmlXPathNAN: cdouble; cvar; external;
  xmlXPathPINF: cdouble; cvar; external;
  xmlXPathNINF: cdouble; cvar; external;
{$ENDIF}

(* These macros may later turn into functions *)
(**
 * xmlXPathNodeSetGetLength:
 * @ns:  a node-set
 *
 * Implement a functionality similar to the DOM NodeList.length.
 *
 * Returns the number of nodes in the node-set.
 *)
function xmlXPathNodeSetGetLength(ns: xmlNodeSetPtr): cint;

(**
 * xmlXPathNodeSetItem:
 * @ns:  a node-set
 * @index:  index of a node in the set
 *
 * Implements a functionality similar to the DOM NodeList.item().
 *
 * Returns the xmlNodePtr at the given @index in @ns or NULL if
 *         @index is out of range (0 to length-1)
 *)
function xmlXPathNodeSetItem(ns: xmlNodeSetPtr; index: cint): xmlNodePtr;

(**
 * xmlXPathNodeSetIsEmpty:
 * @ns: a node-set
 *
 * Checks whether @ns is empty or not.
 *
 * Returns %TRUE if @ns is an empty node-set.
 *)
function xmlXPathNodeSetIsEmpty(ns: xmlNodeSetPtr): boolean;


procedure xmlXPathFreeObject(obj: xmlXPathObjectPtr); EXTDECL; external xml2lib;
function xmlXPathNodeSetCreate(val: xmlNodePtr): xmlNodeSetPtr; EXTDECL; external xml2lib;
procedure xmlXPathFreeNodeSetList(obj: xmlXPathObjectPtr); EXTDECL; external xml2lib;
procedure xmlXPathFreeNodeSet(obj: xmlNodeSetPtr); EXTDECL; external xml2lib;
function xmlXPathObjectCopy(val: xmlXPathObjectPtr): xmlXPathObjectPtr; EXTDECL; external xml2lib;
function xmlXPathCmpNodes(node1, node2: xmlNodePtr): cint; EXTDECL; external xml2lib;

(**
 * Conversion functions to basic types.
 *)
function xmlXPathCastNumberToBoolean(val: cdouble): cint; EXTDECL; external xml2lib;
function xmlXPathCastStringToBoolean(val: xmlCharPtr): cint; EXTDECL; external xml2lib;
function xmlXPathCastNodeSetToBoolean(ns: xmlNodeSetPtr): cint; EXTDECL; external xml2lib;
function xmlXPathCastToBoolean(ns: xmlXPathObjectPtr): cint; EXTDECL; external xml2lib;

function xmlXPathCastBooleanToNumber(val: cint): cdouble; EXTDECL; external xml2lib;
function xmlXPathCastStringToNumber(val: xmlCharPtr): cdouble; EXTDECL; external xml2lib;
function xmlXPathCastNodeToNumber(val: xmlNodePtr): cdouble; EXTDECL; external xml2lib;
function xmlXPathCastNodeSetToNumber(val: xmlNodeSetPtr): cdouble; EXTDECL; external xml2lib;
function xmlXPathCastToNumber(val: xmlXPathObjectPtr): cdouble; EXTDECL; external xml2lib;

function xmlXPathCastBooleanToString(val: cint): xmlCharPtr; EXTDECL; external xml2lib;
function xmlXPathCastNumberToString(val: cdouble): xmlCharPtr; EXTDECL; external xml2lib;
function xmlXPathCastNodeToString(val: xmlNodePtr): xmlCharPtr; EXTDECL; external xml2lib;
function xmlXPathCastNodeSetToString(val: xmlNodeSetPtr): xmlCharPtr; EXTDECL; external xml2lib;
function xmlXPathCastToString(val: xmlXPathObjectPtr): xmlCharPtr; EXTDECL; external xml2lib;

function xmlXPathConvertBoolean(val: xmlXPathObjectPtr): xmlXPathObjectPtr; EXTDECL; external xml2lib;
function xmlXPathConvertNumber(val: xmlXPathObjectPtr): xmlXPathObjectPtr; EXTDECL; external xml2lib;
function xmlXPathConvertString(val: xmlXPathObjectPtr): xmlXPathObjectPtr; EXTDECL; external xml2lib;

(**
 * Context handling.
 *)
function xmlXPathNewContext(doc: xmlDocPtr): xmlXPathContextPtr; EXTDECL; external xml2lib;
procedure xmlXPathFreeContext(ctxt: xmlXPathContextPtr); EXTDECL; external xml2lib;
function xmlXPathContextSetCache(ctxt: xmlXPathContextPtr; active, value, options: cint): cint; EXTDECL; external xml2lib;

(**
 * Evaluation functions.
 *)
function xmlXPathOrderDocElems(doc: xmlDocPtr): clong; EXTDECL; external xml2lib;
function xmlXPathEval(str: xmlCharPtr; ctx: xmlXPathContextPtr): xmlXPathObjectPtr; EXTDECL; external xml2lib;
function xmlXPathEvalExpression(str: xmlCharPtr; ctx: xmlXPathContextPtr): xmlXPathObjectPtr; EXTDECL; external xml2lib;
function xmlXPathEvalPredicate(ctxt: xmlXPathContextPtr; res: xmlXPathObjectPtr): cint; EXTDECL; external xml2lib;

(**
 * Separate compilation/evaluation entry points.
 *)
function xmlXPathCompile(str: xmlCharPtr): xmlXPathCompExprPtr; EXTDECL; external xml2lib;
function xmlXPathCtxtCompile(ctxt: xmlXPathContextPtr; str: xmlCharPtr): xmlXPathCompExprPtr; EXTDECL; external xml2lib;
function xmlXPathCompiledEval(comp: xmlXPathCompExprPtr; ctxt: xmlXPathContextPtr): xmlXPathObjectPtr; EXTDECL; external xml2lib;
function xmlXPathCompiledEvalToBoolean(comp: xmlXPathCompExprPtr; ctxt: xmlXPathContextPtr): cint; EXTDECL; external xml2lib;
procedure xmlXPathFreeCompExpr(comp: xmlXPathCompExprPtr); EXTDECL; external xml2lib;
{$ENDIF}
{$ENDIF} (* LIBXML_XPATH_ENABLED *)

{$if defined(LIBXML_XPATH_ENABLED) or defined(LIBXML_SCHEMAS_ENABLED)}
{$IFDEF FUNCTION}
procedure xmlXPathInit; EXTDECL; external xml2lib;
function xmlXPathIsNaN(val: cdouble): cint; EXTDECL; external xml2lib;
function xmlXPathIsInf(val: cdouble): cint; EXTDECL; external xml2lib;
{$ENDIF}
{$ENDIF} (* LIBXML_XPATH_ENABLED or LIBXML_SCHEMAS_ENABLED*)