1/*----------------------------------------------------------------------------
2|   Copyright (c) 1999 Jochen Loewer (loewerj@hotmail.com)
3|-----------------------------------------------------------------------------
4|
5|   $Id: domxpath.h,v 1.22 2007/08/18 00:33:12 rolf Exp $
6|
7|
8|   A (partial) XPath implementation (lexer/parser/evaluator) for tDOM,
9|   the DOM implementation for Tcl.
10|   Based on the August 13 working draft of the W3C
11|   (http://www.w3.org/1999/08/WD-xpath-19990813.html)
12|
13|
14|   The contents of this file are subject to the Mozilla Public License
15|   Version 1.1 (the "License"); you may not use this file except in
16|   compliance with the License. You may obtain a copy of the License at
17|   http://www.mozilla.org/MPL/
18|
19|   Software distributed under the License is distributed on an "AS IS"
20|   basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
21|   License for the specific language governing rights and limitations
22|   under the License.
23|
24|   The Original Code is tDOM.
25|
26|   The Initial Developer of the Original Code is Jochen Loewer
27|   Portions created by Jochen Loewer are Copyright (C) 1998, 1999
28|   Jochen Loewer. All Rights Reserved.
29|
30|   Contributor(s):
31|
32|
33|
34|   written by Jochen Loewer
35|   July, 1999
36|
37\---------------------------------------------------------------------------*/
38
39
40#ifndef __DOMXPATH_H__
41#define __DOMXPATH_H__
42
43#include <float.h>
44#include <dom.h>
45
46/*----------------------------------------------------------------------------
47|   Macros
48|
49\---------------------------------------------------------------------------*/
50#define XPATH_OK             0
51#define XPATH_LEX_ERR       -1
52#define XPATH_SYNTAX_ERR    -2
53#define XPATH_EVAL_ERR      -3
54#define XPATH_VAR_NOT_FOUND -4
55#define XPATH_I18N_ERR      -5
56
57/*
58 * Macros for testing floating-point values for certain special cases. Test
59 * for not-a-number by comparing a value against itself; test for infinity
60 * by comparing against the largest floating-point value.
61 */
62
63#define IS_NAN(v) ((v) != (v))
64#ifdef DBL_MAX
65#   define IS_INF(v) ((v) > DBL_MAX ? 1 : ((v) < -DBL_MAX ? -1 : 0))
66#else
67#   define IS_INF(v) 0
68#endif
69
70/*----------------------------------------------------------------------------
71|   Types for abstract syntax trees
72|
73\---------------------------------------------------------------------------*/
74typedef enum {
75    Int, Real, Mult, Div, Mod, UnaryMinus, IsNSElement,
76    IsNode, IsComment, IsText, IsPI, IsSpecificPI, IsElement,
77    IsFQElement, GetVar, GetFQVar, Literal, ExecFunction, Pred,
78    EvalSteps, SelectRoot, CombineSets, Add, Substract, Less,
79    LessOrEq, Greater, GreaterOrEq, Equal,  NotEqual, And, Or,
80    IsNSAttr, IsAttr, AxisAncestor, AxisAncestorOrSelf,
81    AxisAttribute, AxisChild,
82    AxisDescendant, AxisDescendantOrSelf, AxisFollowing,
83    AxisFollowingSibling, AxisNamespace, AxisParent,
84    AxisPreceding, AxisPrecedingSibling, AxisSelf,
85    GetContextNode, GetParentNode, AxisDescendantOrSelfLit,
86    AxisDescendantLit, SlashSlash,
87
88    CombinePath, IsRoot, ToParent, ToAncestors, FillNodeList,
89    FillWithCurrentNode,
90    ExecIdKey
91
92} astType;
93
94
95typedef struct astElem {
96    astType         type;
97    struct astElem *child;
98    struct astElem *next;
99    char           *strvalue;
100    int             intvalue;
101    double          realvalue;
102} astElem;
103
104typedef astElem *ast;
105
106
107/*----------------------------------------------------------------------------
108|   Types for XPath result set
109|
110\---------------------------------------------------------------------------*/
111typedef enum {
112    EmptyResult, BoolResult, IntResult, RealResult, StringResult,
113    xNodeSetResult, NaNResult, InfResult, NInfResult
114} xpathResultType;
115
116
117typedef struct xpathResultSet {
118
119    xpathResultType type;
120    char           *string;
121    int             string_len;
122    int             intvalue;
123    double          realvalue;
124    domNode       **nodes;
125    int             nr_nodes;
126    int             allocated;
127
128} xpathResultSet;
129
130typedef xpathResultSet *xpathResultSets;
131
132typedef int (*xpathFuncCallback)
133                (void *clientData, char *functionName,
134                 domNode *ctxNode, int position, xpathResultSet *nodeList,
135                 domNode *exprContext, int argc, xpathResultSets *args,
136                 xpathResultSet *result, char  **errMsg);
137
138typedef int (*xpathVarCallback)
139                (void *clientData, char *variableName, char *varURI,
140                 xpathResultSet *result, char  **errMsg);
141
142typedef struct xpathCBs {               /* all xpath callbacks + clientData */
143
144    xpathVarCallback    varCB;
145    void              * varClientData;
146    xpathFuncCallback   funcCB;
147    void              * funcClientData;
148
149} xpathCBs;
150
151typedef char * (*xpathParseVarCallback)
152    (void *clientData, char *strToParse, int *offset, char **errMsg);
153
154typedef struct xpathParseVarCB {
155    xpathParseVarCallback parseVarCB;
156    void                * parseVarClientData;
157} xpathParseVarCB;
158
159/* XPath expr/pattern types */
160typedef enum {
161    XPATH_EXPR, XPATH_FORMAT_PATTERN, XPATH_TEMPMATCH_PATTERN,
162    XPATH_KEY_USE_EXPR, XPATH_KEY_MATCH_PATTERN
163} xpathExprType;
164
165/*----------------------------------------------------------------------------
166|   Prototypes
167|
168\---------------------------------------------------------------------------*/
169int    xpathParse   (char *xpath, domNode *exprContext, xpathExprType type,
170                     char **prefixMappings, xpathParseVarCB *varParseCB,
171                     ast *t, char **errMsg);
172void   xpathFreeAst (ast t);
173double xpathGetPrio (ast t);
174int    xpathEval    (domNode *node, domNode *exprContext, char *xpath,
175                     char **prefixMappings, xpathCBs *cbs,
176                     xpathParseVarCB *parseVarCB, Tcl_HashTable *catch,
177                     char **errMsg, xpathResultSet *rs);
178int    xpathMatches (ast steps, domNode * exprContext, domNode *nodeToMatch,
179                     xpathCBs *cbs, char **errMsg
180                    );
181
182int xpathEvalSteps (ast steps, xpathResultSet *nodeList,
183                    domNode *currentNode, domNode *exprContext, int currentPos,
184                    int *docOrder,
185                    xpathCBs *cbs,
186                    xpathResultSet *result, char **errMsg);
187
188#define xpathRSInit(x) (x)->type = EmptyResult; \
189                       (x)->intvalue = 0; \
190                       (x)->nr_nodes = 0;
191void   xpathRSFree (xpathResultSet *rs );
192
193int    xpathFuncBoolean  (xpathResultSet *rs);
194double xpathFuncNumber   (xpathResultSet *rs, int *NaN);
195char * xpathFuncString   (xpathResultSet *rs);
196char * xpathFuncStringForNode (domNode *node);
197int    xpathRound        (double r);
198
199char * xpathGetStringValue (domNode *node, int *strLen);
200
201char * xpathNodeToXPath  (domNode *node);
202
203void rsSetBool      ( xpathResultSet *rs, int          i    );
204void rsSetInt       ( xpathResultSet *rs, int          i    );
205void rsSetReal      ( xpathResultSet *rs, double       d    );
206void rsSetString    ( xpathResultSet *rs, const char  *s    );
207void rsAddNode      ( xpathResultSet *rs, domNode     *node );
208void rsAddNodeFast  ( xpathResultSet *rs, domNode     *node );
209void rsCopy         ( xpathResultSet *to, xpathResultSet *from );
210
211/* This function is only used for debugging code */
212void rsPrint        ( xpathResultSet *rs );
213
214#endif
215
216