Annotation of win32/gnome/gnome-xml/include/libxml/xpath.h, revision 1.1
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: */
! 394: xmlXPathObjectPtr xmlXPathEval (const xmlChar *str,
! 395: xmlXPathContextPtr ctx);
! 396: xmlXPathObjectPtr xmlXPathEvalExpression (const xmlChar *str,
! 397: xmlXPathContextPtr ctxt);
! 398: int xmlXPathEvalPredicate (xmlXPathContextPtr ctxt,
! 399: xmlXPathObjectPtr res);
! 400: /**
! 401: * Separate compilation/evaluation entry points.
! 402: */
! 403: xmlXPathCompExprPtr xmlXPathCompile (const xmlChar *str);
! 404: xmlXPathObjectPtr xmlXPathCompiledEval (xmlXPathCompExprPtr comp,
! 405: xmlXPathContextPtr ctx);
! 406: void xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp);
! 407: #ifdef __cplusplus
! 408: }
! 409: #endif
! 410: #endif /* ! __XML_XPATH_H__ */
E-mail: