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