1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pattern.c: Implemetation of selectors for nodes 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reference: 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/ 694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * to some extent 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * http://www.w3.org/TR/1999/REC-xml-19991116 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - compilation flags to check for specific syntaxes 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * using flags of xmlPatterncompile() 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - making clear how pattern starting with / or . need to be handled, 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * currently push(NULL, NULL) means a reset of the streaming context 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and indicating we are on / (the document node), probably need 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * something similar for . 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - get rid of the "compile" starting with lowercase 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - DONE (2006-05-16): get rid of the Strdup/Strndup in case of dictionary 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h> 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h> 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/dict.h> 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/pattern.h> 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_PATTERN_ENABLED 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_STREAMING */ 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 4294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#ifdef ERROR 4394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#undef ERROR 4494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ERROR(a, b, c, d) 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ERROR5(a, b, c, d, e) 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_STEP_DESC 1 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_STEP_FINAL 2 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_STEP_ROOT 4 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_STEP_ATTR 8 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_STEP_NODE 16 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_STEP_IN_SET 32 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* NOTE: Those private flags (XML_STREAM_xxx) are used 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* in _xmlStreamCtxt->flag. They extend the public 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlPatternFlags, so be carefull not to interfere with the 5994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun* reserved values for xmlPatternFlags. 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_FINAL_IS_ANY_NODE 1<<14 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_FROM_ROOT 1<<15 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_DESC 1<<16 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* XML_STREAM_ANY_NODE is used for comparison against 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlElementType enums, to indicate a node of any type. 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_ANY_NODE 100 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_PATTERN_NOTPATTERN (XML_PATTERN_XPATH | \ 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PATTERN_XSSEL | \ 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PATTERN_XSFIELD) 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_XS_IDC(c) ((c)->flags & \ 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (XML_PATTERN_XSSEL | XML_PATTERN_XSFIELD)) 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_XS_IDC_SEL(c) ((c)->flags & XML_PATTERN_XSSEL) 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STREAM_XS_IDC_FIELD(c) ((c)->flags & XML_PATTERN_XSFIELD) 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_PAT_COPY_NSNAME(c, r, nsname) \ 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c)->comp->dict) \ 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project r = (xmlChar *) xmlDictLookup((c)->comp->dict, BAD_CAST nsname, -1); \ 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else r = xmlStrdup(BAD_CAST nsname); 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_PAT_FREE_STRING(c, r) if ((c)->comp->dict == NULL) xmlFree(r); 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlStreamStep xmlStreamStep; 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlStreamStep *xmlStreamStepPtr; 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlStreamStep { 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* properties of that step */ 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; /* first string value if NULL accept all */ 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns; /* second string value */ 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nodeType; /* type of node */ 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlStreamComp xmlStreamComp; 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlStreamComp *xmlStreamCompPtr; 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlStreamComp { 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDict *dict; /* the dictionary if any */ 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbStep; /* number of steps in the automata */ 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxStep; /* allocated number of steps */ 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamStepPtr steps; /* the array of steps */ 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlStreamCtxt { 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct _xmlStreamCtxt *next;/* link to next sub pattern if | */ 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCompPtr comp; /* the compiled stream */ 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbState; /* number of states in the automata */ 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxState; /* allocated number of states */ 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int level; /* how deep are we ? */ 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *states; /* the array of step indexes */ 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* validation options */ 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int blockLevel; 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlFreeStreamComp(xmlStreamCompPtr comp); 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Types are private: 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_OP_END=0, 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_OP_ROOT, 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_OP_ELEM, 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_OP_CHILD, 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_OP_ATTR, 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_OP_PARENT, 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_OP_ANCESTOR, 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_OP_NS, 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_OP_ALL 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlPatOp; 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlStepState xmlStepState; 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlStepState *xmlStepStatePtr; 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlStepState { 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int step; 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlStepStates xmlStepStates; 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlStepStates *xmlStepStatesPtr; 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlStepStates { 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbstates; 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxstates; 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStepStatePtr states; 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlStepOp xmlStepOp; 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlStepOp *xmlStepOpPtr; 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlStepOp { 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatOp op; 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *value; 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *value2; /* The namespace name */ 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PAT_FROM_ROOT (1<<8) 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PAT_FROM_CUR (1<<9) 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlPattern { 16594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun void *data; /* the associated template */ 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; /* the optional dictionary */ 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project struct _xmlPattern *next; /* next pattern if | is used */ 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *pattern; /* the pattern */ 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* flags */ 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbStep; 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxStep; 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStepOpPtr steps; /* ops for computation */ 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCompPtr stream; /* the streaming data if any */ 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlPatParserContext xmlPatParserContext; 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlPatParserContext *xmlPatParserContextPtr; 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlPatParserContext { 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur; /* the current char being parsed */ 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *base; /* the full expression */ 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int error; /* error code */ 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; /* the dictionary if any */ 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr comp; /* the result */ 18494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlNodePtr elem; /* the current node if any */ 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **namespaces; /* the namespaces definitions */ 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nb_namespaces; /* the number of namespaces */ 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 19094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 19194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Type functions * 19294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewPattern: 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new XSLT Pattern 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated xmlPatternPtr or NULL in case of error 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlPatternPtr 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewPattern(void) { 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr cur; 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlPatternPtr) xmlMalloc(sizeof(xmlPattern)); 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewPattern : malloc failed\n"); 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlPattern)); 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->maxStep = 10; 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->steps = (xmlStepOpPtr) xmlMalloc(cur->maxStep * sizeof(xmlStepOp)); 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->steps == NULL) { 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewPattern : malloc failed\n"); 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreePattern: 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: an XSLT comp 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the memory allocated by @comp 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreePattern(xmlPatternPtr comp) { 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStepOpPtr op; 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->next != NULL) 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePattern(comp->next); 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream != NULL) 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeStreamComp(comp->stream); 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->pattern != NULL) 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *)comp->pattern); 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->steps != NULL) { 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->dict == NULL) { 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < comp->nbStep;i++) { 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = &comp->steps[i]; 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value != NULL) 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) op->value); 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (op->value2 != NULL) 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((xmlChar *) op->value2); 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp->steps); 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->dict != NULL) 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(comp->dict); 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(comp, -1, sizeof(xmlPattern)); 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp); 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreePatternList: 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: an XSLT comp list 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the memory allocated by all the elements of @comp 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreePatternList(xmlPatternPtr comp) { 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr cur; 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (comp != NULL) { 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = comp; 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = comp->next; 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->next = NULL; 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePattern(cur); 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewPatParserContext: 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pattern: the pattern context 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dict: the inherited dictionary or NULL 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespaces: the prefix definitions, array of [URI, prefix] terminated 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * with [NULL, NULL] or NULL if no namespace is used 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a new XML pattern parser context 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated xmlPatParserContextPtr or NULL in case of error 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlPatParserContextPtr 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewPatParserContext(const xmlChar *pattern, xmlDictPtr dict, 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **namespaces) { 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatParserContextPtr cur; 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pattern == NULL) 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlPatParserContextPtr) xmlMalloc(sizeof(xmlPatParserContext)); 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewPatParserContext : malloc failed\n"); 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlPatParserContext)); 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->dict = dict; 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->cur = pattern; 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->base = pattern; 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (namespaces != NULL) { 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 31194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun for (i = 0;namespaces[2 * i] != NULL;i++) 31294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ; 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nb_namespaces = i; 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nb_namespaces = 0; 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->namespaces = namespaces; 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreePatParserContext: 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: an XSLT parser context 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free up the memory allocated by @ctxt 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreePatParserContext(xmlPatParserContextPtr ctxt) { 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 33094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return; 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ctxt, -1, sizeof(xmlPatParserContext)); 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatternAdd: 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled match expression 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @op: an op 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the first value 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2: the second value 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a step to an XSLT Compiled Match 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise. 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatternAdd(xmlPatParserContextPtr ctxt ATTRIBUTE_UNUSED, 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr comp, 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatOp op, xmlChar * value, xmlChar * value2) 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbStep >= comp->maxStep) { 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStepOpPtr temp; 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlStepOpPtr) xmlRealloc(comp->steps, comp->maxStep * 2 * 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlStepOp)); 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(ctxt, NULL, NULL, 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlPatternAdd: realloc failed\n"); 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps = temp; 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep *= 2; 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].op = op; 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value = value; 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value2 = value2; 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nbStep++; 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xsltSwapTopPattern: 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled match expression 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reverse the two top steps. 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxsltSwapTopPattern(xmlPatternPtr comp) { 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int j = comp->nbStep - 1; 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (j > 0) { 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project register const xmlChar *tmp; 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project register xmlPatOp op; 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = j - 1; 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = comp->steps[i].value; 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[i].value = comp->steps[j].value; 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[j].value = tmp; 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = comp->steps[i].value2; 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[i].value2 = comp->steps[j].value2; 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[j].value2 = tmp; 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = comp->steps[i].op; 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[i].op = comp->steps[j].op; 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[j].op = op; 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlReversePattern: 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled match expression 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reverse all the stack of expressions 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 0 in case of success and -1 in case of error. 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlReversePattern(xmlPatternPtr comp) { 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, j; 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * remove the leading // for //a or .//a 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->nbStep > 0) && (comp->steps[0].op == XML_OP_ANCESTOR)) { 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0, j = 1;j < comp->nbStep;i++,j++) { 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[i].value = comp->steps[j].value; 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[i].value2 = comp->steps[j].value2; 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[i].op = comp->steps[j].op; 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->nbStep--; 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbStep >= comp->maxStep) { 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStepOpPtr temp; 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project temp = (xmlStepOpPtr) xmlRealloc(comp->steps, comp->maxStep * 2 * 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlStepOp)); 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (temp == NULL) { 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(ctxt, NULL, NULL, 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlReversePattern: realloc failed\n"); 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps = temp; 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep *= 2; 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j = comp->nbStep - 1; 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (j > i) { 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project register const xmlChar *tmp; 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project register xmlPatOp op; 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = comp->steps[i].value; 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[i].value = comp->steps[j].value; 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[j].value = tmp; 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = comp->steps[i].value2; 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[i].value2 = comp->steps[j].value2; 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[j].value2 = tmp; 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project op = comp->steps[i].op; 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[i].op = comp->steps[j].op; 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[j].op = op; 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project j--; 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value = NULL; 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep].value2 = NULL; 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps[comp->nbStep++].op = XML_OP_END; 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 45894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 45994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * The interpreter for the precompiled patterns * 46094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * * 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatPushState(xmlStepStates *states, int step, xmlNodePtr node) { 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((states->states == NULL) || (states->maxstates <= 0)) { 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->maxstates = 4; 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->nbstates = 0; 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->states = xmlMalloc(4 * sizeof(xmlStepState)); 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (states->maxstates <= states->nbstates) { 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStepState *tmp; 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlStepStatePtr) xmlRealloc(states->states, 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2 * states->maxstates * sizeof(xmlStepState)); 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->states = tmp; 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->maxstates *= 2; 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->states[states->nbstates].step = step; 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states->states[states->nbstates++].node = node; 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "Push: %d, %s\n", step, node->name); 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatMatch: 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled pattern 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Test whether the node matches the pattern 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if it matches, 0 if it doesn't and -1 in case of failure 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatMatch(xmlPatternPtr comp, xmlNodePtr node) { 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStepOpPtr step; 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStepStates states = {0, 0, NULL}; /* // may require backtrack */ 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp == NULL) || (node == NULL)) return(-1); 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrestart: 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;i < comp->nbStep;i++) { 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project step = &comp->steps[i]; 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (step->op) { 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_END: 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found; 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_ROOT: 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type == XML_NAMESPACE_DECL) 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->type == XML_DOCUMENT_NODE) || 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_DOCB_DOCUMENT_NODE) || 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_HTML_DOCUMENT_NODE)) 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_ELEM: 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type != XML_ELEMENT_NODE) 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value == NULL) 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value[0] != node->name[0]) 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(step->value, node->name)) 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Namespace test */ 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->ns == NULL) { 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value2 != NULL) 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (node->ns->href != NULL) { 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value2 == NULL) 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(step->value2, node->ns->href)) 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_CHILD: { 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr lst; 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->type != XML_ELEMENT_NODE) && 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type != XML_DOCUMENT_NODE) && 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type != XML_DOCB_DOCUMENT_NODE) && 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type != XML_HTML_DOCUMENT_NODE)) 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lst = node->children; 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value != NULL) { 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (lst != NULL) { 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((lst->type == XML_ELEMENT_NODE) && 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (step->value[0] == lst->name[0]) && 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(step->value, lst->name))) 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lst = lst->next; 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lst != NULL) 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_ATTR: 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type != XML_ATTRIBUTE_NODE) 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value != NULL) { 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value[0] != node->name[0]) 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(step->value, node->name)) 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Namespace test */ 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->ns == NULL) { 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value2 != NULL) 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (step->value2 != NULL) { 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(step->value2, node->ns->href)) 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_PARENT: 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->type == XML_DOCUMENT_NODE) || 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_HTML_DOCUMENT_NODE) || 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_DOCB_DOCUMENT_NODE) || 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_NAMESPACE_DECL)) 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value == NULL) 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value[0] != node->name[0]) 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(step->value, node->name)) 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Namespace test */ 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->ns == NULL) { 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value2 != NULL) 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (node->ns->href != NULL) { 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value2 == NULL) 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(step->value2, node->ns->href)) 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_ANCESTOR: 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: implement coalescing of ANCESTOR/NODE ops */ 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value == NULL) { 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project step = &comp->steps[i]; 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->op == XML_OP_ROOT) 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto found; 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->op != XML_OP_ELEM) 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value == NULL) 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->type == XML_DOCUMENT_NODE) || 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_HTML_DOCUMENT_NODE) || 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_DOCB_ENABLED 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_DOCB_DOCUMENT_NODE) || 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->type == XML_NAMESPACE_DECL)) 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (node != NULL) { 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((node->type == XML_ELEMENT_NODE) && 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (step->value[0] == node->name[0]) && 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(step->value, node->name))) { 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Namespace test */ 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->ns == NULL) { 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value2 == NULL) 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (node->ns->href != NULL) { 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((step->value2 != NULL) && 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(step->value2, node->ns->href))) 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->parent; 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * prepare a potential rollback from here 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for ancestors of that node. 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->op == XML_OP_ANCESTOR) 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatPushState(&states, i, node); 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatPushState(&states, i - 1, node); 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_NS: 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type != XML_ELEMENT_NODE) 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->ns == NULL) { 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value != NULL) 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (node->ns->href != NULL) { 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step->value == NULL) 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!xmlStrEqual(step->value, node->ns->href)) 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_ALL: 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node->type != XML_ELEMENT_NODE) 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto rollback; 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound: 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states.states != NULL) { 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Free the rollback states */ 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states.states); 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectrollback: 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* got an error try to rollback */ 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states.states == NULL) 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (states.nbstates <= 0) { 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(states.states); 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project states.nbstates--; 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = states.states[states.nbstates].step; 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = states.states[states.nbstates].node; 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "Pop: %d, %s\n", i, node->name); 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto restart; 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dedicated parser for templates * 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 71294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define TODO \ 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unimplemented block at %s:%d\n", \ 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR (*ctxt->cur) 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SKIP(val) ctxt->cur += (val) 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NXT(val) ctxt->cur[(val)] 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PEEKPREV(val) ctxt->cur[-(val)] 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CUR_PTR ctxt->cur 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 72294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define SKIP_BLANKS \ 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_BLANK_CH(CUR)) NEXT 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CURRENT (*ctxt->cur) 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT ((*ctxt->cur) ? ctxt->cur++: ctxt->cur) 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 72994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define PUSH(op, val, val2) \ 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlPatternAdd(ctxt, ctxt->comp, (op), (val), (val2))) goto error; 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XSLT_ERROR(X) \ 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { xsltError(ctxt, __FILE__, __LINE__, X); \ 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = (X); return; } 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XSLT_ERROR0(X) \ 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { xsltError(ctxt, __FILE__, __LINE__, X); \ 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = (X); return(0); } 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatScanLiteral: 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse an XPath Litteral: 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [29] Literal ::= '"' [^"]* '"' 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * | "'" [^']* "'" 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Literal parsed or NULL 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatScanLiteral(xmlPatParserContextPtr ctxt) { 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *q, *cur; 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val, len; 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '"') { 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = q = CUR_PTR; 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR(val)) && (val != '"')) { 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR(val)) { 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->dict) 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q); 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 77594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ret = xmlStrndup(q, cur - q); 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CUR_PTR = cur; 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '\'') { 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = q = CUR_PTR; 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_CHAR(val)) && (val != '\'')) { 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_CHAR(val)) { 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->dict) 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q); 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 79494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ret = xmlStrndup(q, cur - q); 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CUR_PTR = cur; 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* XP_ERROR(XPATH_START_LITERAL_ERROR); */ 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatScanName: 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 81194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CombiningChar | Extender 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [5] Name ::= (Letter | '_' | ':') (NameChar)* 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [6] Names ::= Name (S Name)* 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Name parsed or NULL 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatScanName(xmlPatParserContextPtr ctxt) { 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *q, *cur; 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val, len; 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = q = CUR_PTR; 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_LETTER(val) && (val != '_') && (val != ':')) 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_LETTER(val)) || (IS_DIGIT(val)) || 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val == '.') || (val == '-') || 83694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun (val == '_') || 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_COMBINING(val)) || 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_EXTENDER(val))) { 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->dict) 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q); 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 84594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ret = xmlStrndup(q, cur - q); 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CUR_PTR = cur; 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatScanNCName: 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a non qualified name 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Name parsed or NULL 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatScanNCName(xmlPatParserContextPtr ctxt) { 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *q, *cur; 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val, len; 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = q = CUR_PTR; 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_LETTER(val) && (val != '_')) 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((IS_LETTER(val)) || (IS_DIGIT(val)) || 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val == '.') || (val == '-') || 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (val == '_') || 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_COMBINING(val)) || 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (IS_EXTENDER(val))) { 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += len; 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = xmlStringCurrentChar(NULL, cur, &len); 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->dict) 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlChar *) xmlDictLookup(ctxt->dict, q, cur - q); 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrndup(q, cur - q); 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CUR_PTR = cur; 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatScanQName: 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the XPath Parser context 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the place to store the prefix 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse a qualified name 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the Name parsed or NULL 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatScanQName(xmlPatParserContextPtr ctxt, xmlChar **prefix) { 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = NULL; 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlPatScanNCName(ctxt); 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ':') { 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *prefix = ret; 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlPatScanNCName(ctxt); 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCompileAttributeTest: 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the compilation context 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile an attribute test. 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCompileAttributeTest(xmlPatParserContextPtr ctxt) { 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *token = NULL; 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name = NULL; 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *URL = NULL; 92594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlPatScanNCName(ctxt); 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ATTR, NULL, NULL); 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlCompileAttributeTest : Name expected\n"); 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ':') { 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *prefix = name; 94294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 94594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (IS_BLANK_CH(CUR)) { 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, "Invalid QName.\n", NULL); 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_FREE_STRING(ctxt, prefix); 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a namespace match 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project token = xmlPatScanName(ctxt); 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prefix[0] == 'x') && 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prefix[1] == 'm') && 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prefix[2] == 'l') && 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prefix[3] == 0)) 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 96094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE); 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nb_namespaces;i++) { 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->namespaces[2 * i + 1], prefix)) { 96494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i]) 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i >= ctxt->nb_namespaces) { 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlCompileAttributeTest : no namespace bound to prefix %s\n", 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix); 97294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->error = 1; 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_FREE_STRING(ctxt, prefix); 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (token == NULL) { 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ATTR, NULL, URL); 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlCompileAttributeTest : Name expected\n"); 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 98694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ATTR, token, URL); 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ATTR, name, NULL); 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL != NULL) 99694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_PAT_FREE_STRING(ctxt, URL) 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (token != NULL) 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_FREE_STRING(ctxt, token); 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCompileStepPattern: 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the compilation context 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the Step Pattern and generates a precompiled 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * form suitable for fast matching. 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * [3] Step ::= '.' | NameTest 100994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [4] NameTest ::= QName | '*' | NCName ':' '*' 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCompileStepPattern(xmlPatParserContextPtr ctxt) { 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *token = NULL; 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name = NULL; 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *URL = NULL; 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int hasBlanks = 0; 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '.') { 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Context node. 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ELEM, NULL, NULL); 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '@') { 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Attribute test. 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XML_STREAM_XS_IDC_SEL(ctxt->comp)) { 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unexpected attribute axis in '%s'.\n", ctxt->base); 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompileAttributeTest(ctxt); 104094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (ctxt->error != 0) 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlPatScanNCName(ctxt); 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ALL, NULL, NULL); 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlCompileStepPattern : Name expected\n"); 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(CUR)) { 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project hasBlanks = 1; 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ':') { 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != ':') { 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *prefix = name; 106594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun int i; 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (hasBlanks || IS_BLANK_CH(CUR)) { 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, "Invalid QName.\n", NULL); 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a namespace match 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project token = xmlPatScanName(ctxt); 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prefix[0] == 'x') && 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prefix[1] == 'm') && 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prefix[2] == 'l') && 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prefix[3] == 0)) 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE) 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nb_namespaces;i++) { 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->namespaces[2 * i + 1], prefix)) { 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i]) 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i >= ctxt->nb_namespaces) { 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlCompileStepPattern : no namespace bound to prefix %s\n", 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prefix); 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_FREE_STRING(ctxt, prefix); 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = NULL; 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (token == NULL) { 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_NS, URL, NULL); 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlCompileStepPattern : Name expected\n"); 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ELEM, token, URL); 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 111494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (xmlStrEqual(name, (const xmlChar *) "child")) { 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_FREE_STRING(ctxt, name); 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = xmlPatScanName(ctxt); 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) { 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ALL, NULL, NULL); 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlCompileStepPattern : QName expected\n"); 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == ':') { 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *prefix = name; 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 113294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(CUR)) { 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, "Invalid QName.\n", NULL); 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is a namespace match 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project token = xmlPatScanName(ctxt); 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prefix[0] == 'x') && 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prefix[1] == 'm') && 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prefix[2] == 'l') && 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (prefix[3] == 0)) 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 114894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_PAT_COPY_NSNAME(ctxt, URL, XML_XML_NAMESPACE) 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nb_namespaces;i++) { 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(ctxt->namespaces[2 * i + 1], prefix)) { 115294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_PAT_COPY_NSNAME(ctxt, URL, ctxt->namespaces[2 * i]) 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i >= ctxt->nb_namespaces) { 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlCompileStepPattern : no namespace bound " 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "to prefix %s\n", prefix); 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_FREE_STRING(ctxt, prefix); 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = NULL; 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (token == NULL) { 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '*') { 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_NS, URL, NULL); 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlCompileStepPattern : Name expected\n"); 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_CHILD, token, URL); 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_CHILD, name, NULL); 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (xmlStrEqual(name, (const xmlChar *) "attribute")) { 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_FREE_STRING(ctxt, name) 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project name = NULL; 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XML_STREAM_XS_IDC_SEL(ctxt->comp)) { 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unexpected attribute axis in '%s'.\n", ctxt->base); 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompileAttributeTest(ctxt); 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "The 'element' or 'attribute' axis is expected.\n", NULL); 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 120094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (CUR == '*') { 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) { 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ALL, token, NULL); 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ELEM, name, NULL); 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL != NULL) 121594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_PAT_FREE_STRING(ctxt, URL) 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (token != NULL) 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_FREE_STRING(ctxt, token) 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name != NULL) 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PAT_FREE_STRING(ctxt, name) 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCompilePathPattern: 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the compilation context 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the Path Pattern and generates a precompiled 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * form suitable for fast matching. 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 122994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [5] Path ::= ('.//')? ( Step '/' )* ( Step | '@' NameTest ) 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCompilePathPattern(xmlPatParserContextPtr ctxt) { 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '/') { 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->flags |= PAT_FROM_ROOT; 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((CUR == '.') || (ctxt->comp->flags & XML_PATTERN_NOTPATTERN)) { 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->flags |= PAT_FROM_CUR; 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 123994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((CUR == '/') && (NXT(1) == '/')) { 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ANCESTOR, NULL, NULL); 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if ((CUR == '.') && (NXT(1) == '/') && (NXT(2) == '/')) { 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ANCESTOR, NULL, NULL); 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Check for incompleteness. */ 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == 0) { 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Incomplete expression '%s'.\n", ctxt->base); 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '@') { 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompileAttributeTest(ctxt); 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: check for incompleteness */ 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != 0) { 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompileStepPattern(ctxt); 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '/') { 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ROOT, NULL, NULL); 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Check for incompleteness. */ 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == 0) { 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Incomplete expression '%s'.\n", ctxt->base); 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompileStepPattern(ctxt); 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (CUR == '/') { 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (NXT(1) == '/') { 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ANCESTOR, NULL, NULL); 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompileStepPattern(ctxt); 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_PARENT, NULL, NULL); 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == 0) { 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Incomplete expression '%s'.\n", ctxt->base); 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 130294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun goto error; 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompileStepPattern(ctxt); 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != 0) { 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to compile pattern %s\n", ctxt->base); 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCompileIDCXPathPath: 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the compilation context 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the Path Pattern and generates a precompiled 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * form suitable for fast matching. 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 132694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * [5] Path ::= ('.//')? ( Step '/' )* ( Step | '@' NameTest ) 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCompileIDCXPathPath(xmlPatParserContextPtr ctxt) { 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '/') { 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unexpected selection of the document root in '%s'.\n", 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->base); 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp->flags |= PAT_FROM_CUR; 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '.') { 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* "." - "self::node()" */ 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == 0) { 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Selection of the context node. 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ELEM, NULL, NULL); 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '/') { 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: A more meaningful error message. */ 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unexpected token after '.' in '%s'.\n", ctxt->base); 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* "./" - "self::node()/" */ 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '/') { 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_BLANK_CH(PEEKPREV(1))) { 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Disallow "./ /" 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unexpected '/' token in '%s'.\n", ctxt->base); 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* ".//" - "self:node()/descendant-or-self::node()/" */ 1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_ANCESTOR, NULL, NULL); 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == 0) 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error_unfinished; 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process steps. 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompileStepPattern(ctxt); 138194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (ctxt->error != 0) 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != '/') 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project PUSH(XML_OP_PARENT, NULL, NULL); 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT; 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SKIP_BLANKS; 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == '/') { 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Disallow subsequent '//'. 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unexpected subsequent '//' in '%s'.\n", 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->base); 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR == 0) 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error_unfinished; 140094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (CUR != 0); 1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (CUR != 0) { 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to compile expression '%s'.\n", ctxt->base); 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror_unfinished: 1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->error = 1; 1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR5(NULL, NULL, NULL, 141694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun "Unfinished expression '%s'.\n", ctxt->base); 1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The streaming code * 1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STREAMING 1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDebugStreamComp(xmlStreamCompPtr stream) { 1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) { 1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Stream: NULL\n"); 1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Stream: %d steps\n", stream->nbStep); 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < stream->nbStep;i++) { 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->steps[i].ns != NULL) { 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("{%s}", stream->steps[i].ns); 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->steps[i].name == NULL) { 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("* "); 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("%s ", stream->steps[i].name); 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->steps[i].flags & XML_STREAM_STEP_ROOT) 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("root "); 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->steps[i].flags & XML_STREAM_STEP_DESC) 1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("// "); 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->steps[i].flags & XML_STREAM_STEP_FINAL) 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("final "); 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("\n"); 1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDebugStreamCtxt(xmlStreamCtxtPtr ctxt, int match) { 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) { 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Stream: NULL\n"); 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("Stream: level %d, %d states: ", ctxt->level, ctxt->nbState); 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (match) 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("matches\n"); 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("\n"); 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < ctxt->nbState;i++) { 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->states[2 * i] < 0) 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf(" %d: free\n", i); 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf(" %d: step %d, level %d", i, ctxt->states[2 * i], 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->states[(2 * i) + 1]); 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->comp->steps[ctxt->states[2 * i]].flags & 1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_STREAM_STEP_DESC) 1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf(" //\n"); 1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project printf("\n"); 1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewStreamComp: 1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the number of expected steps 1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * build a new compiled pattern for streaming 1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new structure or NULL in case of error. 1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlStreamCompPtr 1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewStreamComp(int size) { 1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCompPtr cur; 1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (size < 4) 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project size = 4; 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlStreamCompPtr) xmlMalloc(sizeof(xmlStreamComp)); 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewStreamComp: malloc failed\n"); 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlStreamComp)); 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->steps = (xmlStreamStepPtr) xmlMalloc(size * sizeof(xmlStreamStep)); 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->steps == NULL) { 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewStreamComp: malloc failed\n"); 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nbStep = 0; 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->maxStep = size; 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeStreamComp: 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled pattern for streaming 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the compiled pattern for streaming 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeStreamComp(xmlStreamCompPtr comp) { 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp != NULL) { 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->steps != NULL) 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp->steps); 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->dict != NULL) 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(comp->dict); 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(comp); 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStreamCompAddStep: 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the compiled pattern for streaming 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the first string, the name, or NULL for * 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the second step, the namespace name 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: the flags for that step 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a new step to the compiled pattern 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error or the step index if successful 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamCompAddStep(xmlStreamCompPtr comp, const xmlChar *name, 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ns, int nodeType, int flags) { 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamStepPtr cur; 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbStep >= comp->maxStep) { 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlStreamStepPtr) xmlRealloc(comp->steps, 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep * 2 * sizeof(xmlStreamStep)); 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewStreamComp: malloc failed\n"); 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->steps = cur; 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxStep *= 2; 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = &comp->steps[comp->nbStep++]; 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->flags = flags; 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name = name; 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ns = ns; 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nodeType = nodeType; 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp->nbStep - 1); 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStreamCompile: 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled pattern 157194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Tries to stream compile a pattern 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure and 0 in case of success. 1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamCompile(xmlPatternPtr comp) { 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCompPtr stream; 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, s = 0, root = 0, flags = 0, prevs = -1; 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStepOp step; 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp == NULL) || (comp->steps == NULL)) 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * special case for . 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->nbStep == 1) && 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[0].op == XML_OP_ELEM) && 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[0].value == NULL) && 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[0].value2 == NULL)) { 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlNewStreamComp(0); 1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Note that the stream will have no steps in this case. */ 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->flags |= XML_STREAM_FINAL_IS_ANY_NODE; 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->stream = stream; 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = xmlNewStreamComp((comp->nbStep / 2) + 1); 1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->dict != NULL) { 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->dict = comp->dict; 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(stream->dict); 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 160894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun i = 0; 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->flags & PAT_FROM_ROOT) 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->flags |= XML_STREAM_FROM_ROOT; 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (;i < comp->nbStep;i++) { 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project step = comp->steps[i]; 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (step.op) { 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_END: 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_ROOT: 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (i != 0) 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = 1; 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_NS: 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project s = xmlStreamCompAddStep(stream, NULL, step.value, 162494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_ELEMENT_NODE, flags); 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (s < 0) 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prevs = s; 162894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun flags = 0; 162994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun break; 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_ATTR: 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags |= XML_STREAM_STEP_ATTR; 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prevs = -1; 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project s = xmlStreamCompAddStep(stream, 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project step.value, step.value2, XML_ATTRIBUTE_NODE, flags); 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags = 0; 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (s < 0) 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 163994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case XML_OP_ELEM: 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((step.value == NULL) && (step.value2 == NULL)) { 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We have a "." or "self::node()" here. 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Eliminate redundant self::node() tests like in "/./." 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or "//./" 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The only case we won't eliminate is "//.", i.e. if 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * self::node() is the last node test and we had 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * continuation somewhere beforehand. 1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->nbStep == i + 1) && 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (flags & XML_STREAM_STEP_DESC)) { 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Mark the special case where the expression resolves 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to any type of node. 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbStep == i + 1) { 1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->flags |= XML_STREAM_FINAL_IS_ANY_NODE; 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 165894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun flags |= XML_STREAM_STEP_NODE; 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project s = xmlStreamCompAddStep(stream, NULL, NULL, 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_STREAM_ANY_NODE, flags); 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (s < 0) 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags = 0; 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If there was a previous step, mark it to be added to 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the result node-set; this is needed since only 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the last step will be marked as "final" and only 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "final" nodes are added to the resulting set. 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prevs != -1) { 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->steps[prevs].flags |= XML_STREAM_STEP_IN_SET; 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prevs = -1; 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 167494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun break; 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Just skip this one. */ 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 168194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* An element node. */ 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project s = xmlStreamCompAddStep(stream, step.value, step.value2, 168394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_ELEMENT_NODE, flags); 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (s < 0) 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prevs = s; 168794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun flags = 0; 168894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun break; 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_CHILD: 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* An element node child. */ 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project s = xmlStreamCompAddStep(stream, step.value, step.value2, 169294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_ELEMENT_NODE, flags); 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (s < 0) 1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prevs = s; 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags = 0; 169794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun break; 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_ALL: 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project s = xmlStreamCompAddStep(stream, NULL, NULL, 170094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun XML_ELEMENT_NODE, flags); 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (s < 0) 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prevs = s; 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags = 0; 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 170694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun case XML_OP_PARENT: 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_OP_ANCESTOR: 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Skip redundant continuations. */ 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (flags & XML_STREAM_STEP_DESC) 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project flags |= XML_STREAM_STEP_DESC; 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Mark the expression as having "//". 1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stream->flags & XML_STREAM_DESC) == 0) 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->flags |= XML_STREAM_DESC; 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 172094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((! root) && (comp->flags & XML_PATTERN_NOTPATTERN) == 0) { 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If this should behave like a real pattern, we will mark 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first step as having "//", to be reentrant on every 1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * tree level. 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stream->flags & XML_STREAM_DESC) == 0) 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->flags |= XML_STREAM_DESC; 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->nbStep > 0) { 1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stream->steps[0].flags & XML_STREAM_STEP_DESC) == 0) 173294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun stream->steps[0].flags |= XML_STREAM_STEP_DESC; 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->nbStep <= s) 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->steps[s].flags |= XML_STREAM_STEP_FINAL; 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root) 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->steps[0].flags |= XML_STREAM_STEP_ROOT; 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STREAMING 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugStreamComp(stream); 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->stream = stream; 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeStreamComp(stream); 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewStreamCtxt: 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the number of expected states 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * build a new stream context 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new structure or NULL in case of error. 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlStreamCtxtPtr 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewStreamCtxt(xmlStreamCompPtr stream) { 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCtxtPtr cur; 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlStreamCtxtPtr) xmlMalloc(sizeof(xmlStreamCtxt)); 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewStreamCtxt: malloc failed\n"); 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlStreamCtxt)); 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->states = (int *) xmlMalloc(4 * 2 * sizeof(int)); 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->states == NULL) { 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(cur); 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewStreamCtxt: malloc failed\n"); 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->nbState = 0; 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->maxState = 4; 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->level = 0; 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->comp = stream; 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->blockLevel = -1; 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeStreamCtxt: 1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @stream: the stream context 1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the stream context 1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeStreamCtxt(xmlStreamCtxtPtr stream) { 1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCtxtPtr next; 1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (stream != NULL) { 1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = stream->next; 1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->states != NULL) 1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stream->states); 1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(stream); 1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = next; 1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStreamCtxtAddState: 1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the stream context 1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @idx: the step index for that streaming state 1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a new state to the stream context 1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error or the state index if successful 1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamCtxtAddState(xmlStreamCtxtPtr comp, int idx, int level) { 1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < comp->nbState;i++) { 1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->states[2 * i] < 0) { 1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->states[2 * i] = idx; 1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->states[2 * i + 1] = level; 1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(i); 1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbState >= comp->maxState) { 1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int *cur; 1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (int *) xmlRealloc(comp->states, 1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxState * 4 * sizeof(int)); 1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ERROR(NULL, NULL, NULL, 1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlNewStreamCtxt: malloc failed\n"); 1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->states = cur; 1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->maxState *= 2; 1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->states[2 * comp->nbState] = idx; 1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp->states[2 * comp->nbState++ + 1] = level; 1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(comp->nbState - 1); 1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStreamPushInternal: 1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @stream: the stream context 1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the current name 1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the namespace name 1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodeType: the type of the node 1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push new data onto the stream. NOTE: if the call xmlPatterncompile() 1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * indicated a dictionary, then strings for name and ns will be expected 1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to come from the dictionary. 1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Both @name and @ns being NULL means the / i.e. the root of the document. 1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This can also act as a reset. 1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: -1 in case of error, 1 if the current state in the stream is a 1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * match and 0 otherwise. 1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamPushInternal(xmlStreamCtxtPtr stream, 1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, const xmlChar *ns, 1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nodeType) { 1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, err = 0, final = 0, tmp, i, m, match, stepNr, desc; 1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCompPtr comp; 1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamStep step; 1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STREAMING 1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCtxtPtr orig = stream; 1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stream == NULL) || (stream->nbState < 0)) 1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (stream != NULL) { 1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = stream->comp; 1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((nodeType == XML_ELEMENT_NODE) && 1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (name == NULL) && (ns == NULL)) { 1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* We have a document node here (or a reset). */ 1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->nbState = 0; 1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->level = 0; 1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->blockLevel = -1; 1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->flags & XML_STREAM_FROM_ROOT) { 1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbStep == 0) { 1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: We have a "/." here? */ 1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->nbStep == 1) && 1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[0].nodeType == XML_STREAM_ANY_NODE) && 1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (comp->steps[0].flags & XML_STREAM_STEP_DESC)) 1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In the case of "//." the document node will match 1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * as well. 1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (comp->steps[0].flags & XML_STREAM_STEP_ROOT) { 1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: Do we need this ? */ 1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlStreamCtxtAddState(stream, 0, 0); 1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp < 0) 1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project err++; 1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = stream->next; 1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; /* while */ 1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fast check for ".". 1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->nbStep == 0) { 1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * / and . are handled at the XPath node set creation 1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * level by checking min depth 1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->flags & XML_PATTERN_XPATH) { 1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = stream->next; 1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; /* while */ 1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * For non-pattern like evaluation like XML Schema IDCs 1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or traditional XPath expressions, this will match if 1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we are at the first level only, otherwise on every level. 1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((nodeType != XML_ATTRIBUTE_NODE) && 1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (((stream->flags & XML_PATTERN_NOTPATTERN) == 0) || 1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (stream->level == 0))) { 192594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ret = 1; 1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->level++; 1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto stream_next; 1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->blockLevel != -1) { 1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip blocked expressions. 1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 193494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun stream->level++; 1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto stream_next; 1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((nodeType != XML_ELEMENT_NODE) && 1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (nodeType != XML_ATTRIBUTE_NODE) && 1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((comp->flags & XML_STREAM_FINAL_IS_ANY_NODE) == 0)) { 1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * No need to process nodes of other types if we don't 1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * resolve to those types. 1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Do we need to block the context here? 1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->level++; 1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto stream_next; 1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check evolution of existing states 1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = 0; 1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project m = stream->nbState; 1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (i < m) { 1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->flags & XML_STREAM_DESC) == 0) { 1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If there is no "//", then only the last 1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * added state is of interest. 1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stepNr = stream->states[2 * (stream->nbState -1)]; 1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Security check, should not happen, remove it. 1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->states[(2 * (stream->nbState -1)) + 1] < 1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->level) { 1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (-1); 1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project desc = 0; 1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* loop-stopper */ 1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i = m; 1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If there are "//", then we need to process every "//" 1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * occuring in the states, plus any other state for this 1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * level. 197794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */ 1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stepNr = stream->states[2 * i]; 1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO: should not happen anymore: dead states */ 1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stepNr < 0) 1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_state; 1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = stream->states[(2 * i) + 1]; 1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* skip new states just added */ 1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp > stream->level) 1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_state; 1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* skip states at ancestor levels, except if "//" */ 1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project desc = comp->steps[stepNr].flags & XML_STREAM_STEP_DESC; 1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tmp < stream->level) && (!desc)) 1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_state; 1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 199594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* 1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for correct node-type. 1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project step = comp->steps[stepNr]; 1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.nodeType != nodeType) { 2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.nodeType == XML_ATTRIBUTE_NODE) { 2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Block this expression for deeper evaluation. 2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp->flags & XML_STREAM_DESC) == 0) 2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->blockLevel = stream->level +1; 2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_state; 2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (step.nodeType != XML_STREAM_ANY_NODE) 2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto next_state; 200994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare local/namespace-name. 2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = 0; 2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.nodeType == XML_STREAM_ANY_NODE) { 2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = 1; 2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (step.name == NULL) { 2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.ns == NULL) { 2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This lets through all elements/attributes. 2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = 1; 2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ns != NULL) 2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = xmlStrEqual(step.ns, ns); 2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((step.ns != NULL) == (ns != NULL)) && 2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (name != NULL) && 2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (step.name[0] == name[0]) && 2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrEqual(step.name, name) && 2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((step.ns == ns) || xmlStrEqual(step.ns, ns))) 2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 203094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun match = 1; 203194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 203294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#if 0 2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* TODO: Pointer comparison won't work, since not guaranteed that the given 2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* values are in the same dict; especially if it's the namespace name, 2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* normally coming from ns->href. We need a namespace dict mechanism ! 2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (comp->dict) { 2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.name == NULL) { 2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.ns == NULL) 2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = 1; 2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = (step.ns == ns); 2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = ((step.name == name) && (step.ns == ns)); 2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 204794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#endif /* if 0 ------------------------------------------------------- */ 204894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (match) { 2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final = step.flags & XML_STREAM_STEP_FINAL; 2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (desc) { 2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (final) { 2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* descending match create a new state */ 2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCtxtAddState(stream, stepNr + 1, 2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->level + 1); 2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (final) { 2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCtxtAddState(stream, stepNr + 1, 2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->level + 1); 2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret != 1) && (step.flags & XML_STREAM_STEP_IN_SET)) { 2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if we have a special case like "foo/bar//.", where 2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "foo" is selected as well. 2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 207394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((comp->flags & XML_STREAM_DESC) == 0) && 2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((! match) || final)) { 2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Mark this expression as blocked for any evaluation at 2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * deeper levels. Note that this includes "/foo" 2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * expressions if the *pattern* behaviour is used. 2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->blockLevel = stream->level +1; 2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_state: 2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project i++; 2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->level++; 2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Re/enter the expression. 2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Don't reenter if it's an absolute expression like "/foo", 2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * except "//foo". 2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project step = comp->steps[0]; 2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.flags & XML_STREAM_STEP_ROOT) 2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto stream_next; 2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project desc = step.flags & XML_STREAM_STEP_DESC; 2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->flags & XML_PATTERN_NOTPATTERN) { 2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Re/enter the expression if it is a "descendant" one, 2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or if we are at the 1st level of evaluation. 2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 210494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->level == 1) { 2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XML_STREAM_XS_IDC(stream)) { 2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XS-IDC: The missing "self::node()" will always 2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * match the first given node. 2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto stream_next; 2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto compare; 211494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A "//" is always reentrant. 2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (desc) 2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto compare; 2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XS-IDC: Process the 2nd level, since the missing 2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "self::node()" is responsible for the 2nd level being 212494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * the real start level. 212594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */ 2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((stream->level == 2) && XML_STREAM_XS_IDC(stream)) 2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto compare; 2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto stream_next; 2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 213194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcompare: 2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check expected node-type. 2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.nodeType != nodeType) { 2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nodeType == XML_ATTRIBUTE_NODE) 2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto stream_next; 2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (step.nodeType != XML_STREAM_ANY_NODE) 214094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun goto stream_next; 2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare local/namespace-name. 2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = 0; 2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.nodeType == XML_STREAM_ANY_NODE) { 2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = 1; 2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (step.name == NULL) { 2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (step.ns == NULL) { 2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This lets through all elements/attributes. 2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = 1; 2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ns != NULL) 2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project match = xmlStrEqual(step.ns, ns); 2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((step.ns != NULL) == (ns != NULL)) && 2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (name != NULL) && 2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (step.name[0] == name[0]) && 2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStrEqual(step.name, name) && 2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((step.ns == ns) || xmlStrEqual(step.ns, ns))) 2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project { 216294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun match = 1; 216394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project final = step.flags & XML_STREAM_STEP_FINAL; 216594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (match) { 2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (final) 2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCtxtAddState(stream, 1, stream->level); 2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret != 1) && (step.flags & XML_STREAM_STEP_IN_SET)) { 2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if we have a special case like "foo//.", where 2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * "foo" is selected as well. 2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 1; 2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((comp->flags & XML_STREAM_DESC) == 0) && 2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((! match) || final)) { 2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Mark this expression as blocked for any evaluation at 2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * deeper levels. 2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->blockLevel = stream->level; 2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstream_next: 2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = stream->next; 2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } /* while stream != NULL */ 219094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (err > 0) 2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = -1; 2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_STREAMING 2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDebugStreamCtxt(orig, ret); 2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStreamPush: 2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @stream: the stream context 2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the current name 2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the namespace name 2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push new data onto the stream. NOTE: if the call xmlPatterncompile() 2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * indicated a dictionary, then strings for name and ns will be expected 2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to come from the dictionary. 2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Both @name and @ns being NULL means the / i.e. the root of the document. 2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This can also act as a reset. 2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Otherwise the function will act as if it has been given an element-node. 2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: -1 in case of error, 1 if the current state in the stream is a 2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * match and 0 otherwise. 2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamPush(xmlStreamCtxtPtr stream, 2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, const xmlChar *ns) { 2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlStreamPushInternal(stream, name, ns, (int) XML_ELEMENT_NODE)); 2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStreamPushNode: 2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @stream: the stream context 2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the current name 2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the namespace name 2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodeType: the type of the node being pushed 2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push new data onto the stream. NOTE: if the call xmlPatterncompile() 2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * indicated a dictionary, then strings for name and ns will be expected 2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to come from the dictionary. 2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Both @name and @ns being NULL means the / i.e. the root of the document. 2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This can also act as a reset. 2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Different from xmlStreamPush() this function can be fed with nodes of type: 2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element-, attribute-, text-, cdata-section-, comment- and 2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processing-instruction-node. 2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: -1 in case of error, 1 if the current state in the stream is a 2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * match and 0 otherwise. 2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamPushNode(xmlStreamCtxtPtr stream, 2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, const xmlChar *ns, 2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nodeType) 2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlStreamPushInternal(stream, name, ns, 2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nodeType)); 2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlStreamPushAttr: 2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* @stream: the stream context 2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* @name: the current name 2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* @ns: the namespace name 2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Push new attribute data onto the stream. NOTE: if the call xmlPatterncompile() 2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* indicated a dictionary, then strings for name and ns will be expected 2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* to come from the dictionary. 2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Both @name and @ns being NULL means the / i.e. the root of the document. 2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* This can also act as a reset. 2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Otherwise the function will act as if it has been given an attribute-node. 2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Returns: -1 in case of error, 1 if the current state in the stream is a 2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* match and 0 otherwise. 2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/ 2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamPushAttr(xmlStreamCtxtPtr stream, 2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name, const xmlChar *ns) { 2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (xmlStreamPushInternal(stream, name, ns, (int) XML_ATTRIBUTE_NODE)); 2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStreamPop: 2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @stream: the stream context 2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * push one level from the stream. 2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: -1 in case of error, 0 otherwise. 2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamPop(xmlStreamCtxtPtr stream) { 2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i, lev; 228294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream == NULL) 2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (stream != NULL) { 2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reset block-level. 2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (stream->blockLevel == stream->level) 2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->blockLevel = -1; 2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 229260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* 229360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * stream->level can be zero when XML_FINAL_IS_ANY_NODE is set 229460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * (see the thread at 229560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * http://mail.gnome.org/archives/xslt/2008-July/msg00027.html) 229660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 229760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (stream->level) 229860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott stream->level--; 2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check evolution of existing states 230194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */ 2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = stream->nbState -1; i >= 0; i--) { 2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* discard obsoleted states */ 2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project lev = stream->states[(2 * i) + 1]; 2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lev > stream->level) 2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream->nbState--; 2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (lev <= stream->level) 2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project stream = stream->next; 2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStreamWantsAnyNode: 2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @streamCtxt: the stream context 2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Query if the streaming pattern additionally needs to be fed with 2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * text-, cdata-section-, comment- and processing-instruction-nodes. 2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the result is 0 then only element-nodes and attribute-nodes 2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * need to be pushed. 2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns: 1 in case of need of nodes of the above described types, 2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0 otherwise. -1 on API errors. 2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamWantsAnyNode(xmlStreamCtxtPtr streamCtxt) 232994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun{ 2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (streamCtxt == NULL) 2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (streamCtxt != NULL) { 233394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (streamCtxt->comp->flags & XML_STREAM_FINAL_IS_ANY_NODE) 2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project streamCtxt = streamCtxt->next; 2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The public interfaces * 2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatterncompile: 2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pattern: the pattern to compile 2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dict: an optional dictionary for interned strings 2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: compilation flags, see xmlPatternFlags 2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespaces: the prefix definitions, array of [URI, prefix] or NULL 2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile a pattern. 2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the compiled form of the pattern or NULL in case of error 2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatternPtr 2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatterncompile(const xmlChar *pattern, xmlDict *dict, int flags, 2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **namespaces) { 2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr ret = NULL, cur; 2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatParserContextPtr ctxt = NULL; 2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *or, *start; 2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *tmp = NULL; 2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int type = 0; 2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int streamable = 1; 2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pattern == NULL) 2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = pattern; 2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project or = start; 2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*or != 0) { 2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((*or != 0) && (*or != '|')) or++; 2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*or == 0) 2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlNewPatParserContext(start, dict, namespaces); 2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = xmlStrndup(start, or - start); 2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = xmlNewPatParserContext(tmp, dict, namespaces); 2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project or++; 2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 238494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (ctxt == NULL) goto error; 2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlNewPattern(); 2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) goto error; 2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Assign string dict. 2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 239094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (dict) { 2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->dict = dict; 2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(dict); 2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = cur; 2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->next = ret->next; 2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = cur; 2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->flags = flags; 2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->comp = cur; 2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (XML_STREAM_XS_IDC(cur)) 2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompileIDCXPathPath(ctxt); 2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCompilePathPattern(ctxt); 2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->error != 0) 2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePatParserContext(ctxt); 2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt = NULL; 2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (streamable) { 2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (type == 0) { 2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project type = cur->flags & (PAT_FROM_ROOT | PAT_FROM_CUR); 2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == PAT_FROM_ROOT) { 2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->flags & PAT_FROM_CUR) 2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project streamable = 0; 2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (type == PAT_FROM_CUR) { 2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->flags & PAT_FROM_ROOT) 2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project streamable = 0; 2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (streamable) 2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCompile(cur); 2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlReversePattern(cur) < 0) 2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto error; 2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) { 2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(tmp); 2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = NULL; 2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project start = or; 2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (streamable == 0) { 2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = ret; 2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->stream != NULL) { 2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeStreamComp(cur->stream); 2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->stream = NULL; 2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror: 2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) xmlFreePatParserContext(ctxt); 2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) xmlFreePattern(ret); 2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp != NULL) xmlFree(tmp); 2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatternMatch: 2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled pattern 2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a node 2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Test whether the node matches the pattern 2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if it matches, 0 if it doesn't and -1 in case of failure 2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatternMatch(xmlPatternPtr comp, xmlNodePtr node) 2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0; 2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp == NULL) || (node == NULL)) 2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (comp != NULL) { 2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlPatMatch(comp, node); 2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != 0) 2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = comp->next; 2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatternGetStreamCtxt: 2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled pattern 2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get a streaming context for that pattern 2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Use xmlFreeStreamCtxt to free the context. 2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to the context or NULL in case of failure 2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStreamCtxtPtr 2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatternGetStreamCtxt(xmlPatternPtr comp) 2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStreamCtxtPtr ret = NULL, cur; 2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((comp == NULL) || (comp->stream == NULL)) 2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (comp != NULL) { 2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream == NULL) 2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto failed; 2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlNewStreamCtxt(comp->stream); 2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) 2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto failed; 2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = cur; 2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->next = ret->next; 2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = cur; 2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->flags = comp->flags; 2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = comp->next; 2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfailed: 2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeStreamCtxt(ret); 2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatternStreamable: 2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled pattern 2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the pattern is streamable i.e. xmlPatternGetStreamCtxt() 2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should work. 2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if streamable, 0 if not and -1 in case of error. 2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatternStreamable(xmlPatternPtr comp) { 2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (comp != NULL) { 2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream == NULL) 2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = comp->next; 2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatternMaxDepth: 2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled pattern 2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the maximum depth reachable by a pattern 2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -2 if no limit (using //), otherwise the depth, 2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and -1 in case of error 2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatternMaxDepth(xmlPatternPtr comp) { 2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 0, i; 2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (comp != NULL) { 2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream == NULL) 2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < comp->stream->nbStep;i++) 2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream->steps[i].flags & XML_STREAM_STEP_DESC) 2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-2); 2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream->nbStep > ret) 2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = comp->stream->nbStep; 2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = comp->next; 2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatternMinDepth: 2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled pattern 2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the minimum depth reachable by a pattern, 0 mean the / or . are 2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * part of the set. 2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error otherwise the depth, 257394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatternMinDepth(xmlPatternPtr comp) { 2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret = 12345678; 2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (comp != NULL) { 2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream == NULL) 2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream->nbStep < ret) 2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = comp->stream->nbStep; 2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == 0) 2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = comp->next; 2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlPatternFromRoot: 2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp: the precompiled pattern 2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the pattern must be looked at from the root. 2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if true, 0 if false and -1 in case of error 2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlPatternFromRoot(xmlPatternPtr comp) { 2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) 2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (comp != NULL) { 2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->stream == NULL) 2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp->flags & PAT_FROM_ROOT) 2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = comp->next; 2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(0); 2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_pattern 2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_PATTERN_ENABLED */ 2618