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