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