xref: /aosp_15_r20/external/cronet/third_party/libxml/src/xmlreader.c (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker /*
2*6777b538SAndroid Build Coastguard Worker  * xmlreader.c: implements the xmlTextReader streaming node API
3*6777b538SAndroid Build Coastguard Worker  *
4*6777b538SAndroid Build Coastguard Worker  * NOTE:
5*6777b538SAndroid Build Coastguard Worker  *   XmlTextReader.Normalization Property won't be supported, since
6*6777b538SAndroid Build Coastguard Worker  *     it makes the parser non compliant to the XML recommendation
7*6777b538SAndroid Build Coastguard Worker  *
8*6777b538SAndroid Build Coastguard Worker  * See Copyright for the status of this software.
9*6777b538SAndroid Build Coastguard Worker  *
10*6777b538SAndroid Build Coastguard Worker  * [email protected]
11*6777b538SAndroid Build Coastguard Worker  */
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker /*
14*6777b538SAndroid Build Coastguard Worker  * TODOs:
15*6777b538SAndroid Build Coastguard Worker  *   - XML Schemas validation
16*6777b538SAndroid Build Coastguard Worker  */
17*6777b538SAndroid Build Coastguard Worker #define IN_LIBXML
18*6777b538SAndroid Build Coastguard Worker #include "libxml.h"
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_READER_ENABLED
21*6777b538SAndroid Build Coastguard Worker #include <string.h> /* for memset() only ! */
22*6777b538SAndroid Build Coastguard Worker #include <stdarg.h>
23*6777b538SAndroid Build Coastguard Worker #include <ctype.h>
24*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
27*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlIO.h>
28*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlreader.h>
29*6777b538SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
30*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
31*6777b538SAndroid Build Coastguard Worker #include <libxml/relaxng.h>
32*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlschemas.h>
33*6777b538SAndroid Build Coastguard Worker #endif
34*6777b538SAndroid Build Coastguard Worker #include <libxml/uri.h>
35*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
36*6777b538SAndroid Build Coastguard Worker #include <libxml/xinclude.h>
37*6777b538SAndroid Build Coastguard Worker #endif
38*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
39*6777b538SAndroid Build Coastguard Worker #include <libxml/pattern.h>
40*6777b538SAndroid Build Coastguard Worker #endif
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker #include "private/buf.h"
43*6777b538SAndroid Build Coastguard Worker #include "private/tree.h"
44*6777b538SAndroid Build Coastguard Worker #include "private/parser.h"
45*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
46*6777b538SAndroid Build Coastguard Worker #include "private/xinclude.h"
47*6777b538SAndroid Build Coastguard Worker #endif
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
50*6777b538SAndroid Build Coastguard Worker /* Keeping free objects can hide memory errors. */
51*6777b538SAndroid Build Coastguard Worker #define MAX_FREE_NODES 1
52*6777b538SAndroid Build Coastguard Worker #else
53*6777b538SAndroid Build Coastguard Worker #define MAX_FREE_NODES 100
54*6777b538SAndroid Build Coastguard Worker #endif
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker #ifndef va_copy
57*6777b538SAndroid Build Coastguard Worker   #ifdef __va_copy
58*6777b538SAndroid Build Coastguard Worker     #define va_copy(dest, src) __va_copy(dest, src)
59*6777b538SAndroid Build Coastguard Worker   #else
60*6777b538SAndroid Build Coastguard Worker     #define va_copy(dest, src) memcpy(dest, src, sizeof(va_list))
61*6777b538SAndroid Build Coastguard Worker   #endif
62*6777b538SAndroid Build Coastguard Worker #endif
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker #define CHUNK_SIZE 512
65*6777b538SAndroid Build Coastguard Worker /************************************************************************
66*6777b538SAndroid Build Coastguard Worker  *									*
67*6777b538SAndroid Build Coastguard Worker  *	The parser: maps the Text Reader API on top of the existing	*
68*6777b538SAndroid Build Coastguard Worker  *		parsing routines building a tree			*
69*6777b538SAndroid Build Coastguard Worker  *									*
70*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker #define XML_TEXTREADER_INPUT	1
73*6777b538SAndroid Build Coastguard Worker #define XML_TEXTREADER_CTXT	2
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker typedef enum {
76*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_NONE = -1,
77*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_START= 0,
78*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_ELEMENT= 1,
79*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_END= 2,
80*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_EMPTY= 3,
81*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_BACKTRACK= 4,
82*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_DONE= 5,
83*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_ERROR= 6
84*6777b538SAndroid Build Coastguard Worker } xmlTextReaderState;
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker typedef enum {
87*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_NOT_VALIDATE = 0,
88*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_VALIDATE_DTD = 1,
89*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_VALIDATE_RNG = 2,
90*6777b538SAndroid Build Coastguard Worker     XML_TEXTREADER_VALIDATE_XSD = 4
91*6777b538SAndroid Build Coastguard Worker } xmlTextReaderValidate;
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker struct _xmlTextReader {
94*6777b538SAndroid Build Coastguard Worker     int				mode;	/* the parsing mode */
95*6777b538SAndroid Build Coastguard Worker     xmlDocPtr			doc;    /* when walking an existing doc */
96*6777b538SAndroid Build Coastguard Worker     xmlTextReaderValidate       validate;/* is there any validation */
97*6777b538SAndroid Build Coastguard Worker     int				allocs;	/* what structure were deallocated */
98*6777b538SAndroid Build Coastguard Worker     xmlTextReaderState		state;
99*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr		ctxt;	/* the parser context */
100*6777b538SAndroid Build Coastguard Worker     xmlSAXHandlerPtr		sax;	/* the parser SAX callbacks */
101*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr	input;	/* the input */
102*6777b538SAndroid Build Coastguard Worker     startElementSAXFunc		startElement;/* initial SAX callbacks */
103*6777b538SAndroid Build Coastguard Worker     endElementSAXFunc		endElement;  /* idem */
104*6777b538SAndroid Build Coastguard Worker     startElementNsSAX2Func	startElementNs;/* idem */
105*6777b538SAndroid Build Coastguard Worker     endElementNsSAX2Func	endElementNs;  /* idem */
106*6777b538SAndroid Build Coastguard Worker     charactersSAXFunc		characters;
107*6777b538SAndroid Build Coastguard Worker     cdataBlockSAXFunc		cdataBlock;
108*6777b538SAndroid Build Coastguard Worker     unsigned int		base;	/* base of the segment in the input */
109*6777b538SAndroid Build Coastguard Worker     unsigned int		cur;	/* current position in the input */
110*6777b538SAndroid Build Coastguard Worker     xmlNodePtr			node;	/* current node */
111*6777b538SAndroid Build Coastguard Worker     xmlNodePtr			curnode;/* current attribute node */
112*6777b538SAndroid Build Coastguard Worker     int				depth;  /* depth of the current node */
113*6777b538SAndroid Build Coastguard Worker     xmlNodePtr			faketext;/* fake xmlNs chld */
114*6777b538SAndroid Build Coastguard Worker     int				preserve;/* preserve the resulting document */
115*6777b538SAndroid Build Coastguard Worker     xmlBufPtr		        buffer; /* used to return const xmlChar * */
116*6777b538SAndroid Build Coastguard Worker     xmlDictPtr			dict;	/* the context dictionary */
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker     /* entity stack when traversing entities content */
119*6777b538SAndroid Build Coastguard Worker     xmlNodePtr         ent;          /* Current Entity Ref Node */
120*6777b538SAndroid Build Coastguard Worker     int                entNr;        /* Depth of the entities stack */
121*6777b538SAndroid Build Coastguard Worker     int                entMax;       /* Max depth of the entities stack */
122*6777b538SAndroid Build Coastguard Worker     xmlNodePtr        *entTab;       /* array of entities */
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker     /* error handling */
125*6777b538SAndroid Build Coastguard Worker     xmlTextReaderErrorFunc errorFunc;    /* callback function */
126*6777b538SAndroid Build Coastguard Worker     void                  *errorFuncArg; /* callback function user argument */
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
129*6777b538SAndroid Build Coastguard Worker     /* Handling of RelaxNG validation */
130*6777b538SAndroid Build Coastguard Worker     xmlRelaxNGPtr          rngSchemas;	/* The Relax NG schemas */
131*6777b538SAndroid Build Coastguard Worker     xmlRelaxNGValidCtxtPtr rngValidCtxt;/* The Relax NG validation context */
132*6777b538SAndroid Build Coastguard Worker     int                    rngPreserveCtxt; /* 1 if the context was provided by the user */
133*6777b538SAndroid Build Coastguard Worker     int                    rngValidErrors;/* The number of errors detected */
134*6777b538SAndroid Build Coastguard Worker     xmlNodePtr             rngFullNode;	/* the node if RNG not progressive */
135*6777b538SAndroid Build Coastguard Worker     /* Handling of Schemas validation */
136*6777b538SAndroid Build Coastguard Worker     xmlSchemaPtr          xsdSchemas;	/* The Schemas schemas */
137*6777b538SAndroid Build Coastguard Worker     xmlSchemaValidCtxtPtr xsdValidCtxt;/* The Schemas validation context */
138*6777b538SAndroid Build Coastguard Worker     int                   xsdPreserveCtxt; /* 1 if the context was provided by the user */
139*6777b538SAndroid Build Coastguard Worker     int                   xsdValidErrors;/* The number of errors detected */
140*6777b538SAndroid Build Coastguard Worker     xmlSchemaSAXPlugPtr   xsdPlug;	/* the schemas plug in SAX pipeline */
141*6777b538SAndroid Build Coastguard Worker #endif
142*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
143*6777b538SAndroid Build Coastguard Worker     /* Handling of XInclude processing */
144*6777b538SAndroid Build Coastguard Worker     int                xinclude;	/* is xinclude asked for */
145*6777b538SAndroid Build Coastguard Worker     const xmlChar *    xinclude_name;	/* the xinclude name from dict */
146*6777b538SAndroid Build Coastguard Worker     xmlXIncludeCtxtPtr xincctxt;	/* the xinclude context */
147*6777b538SAndroid Build Coastguard Worker     int                in_xinclude;	/* counts for xinclude */
148*6777b538SAndroid Build Coastguard Worker #endif
149*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
150*6777b538SAndroid Build Coastguard Worker     int                patternNr;       /* number of preserve patterns */
151*6777b538SAndroid Build Coastguard Worker     int                patternMax;      /* max preserve patterns */
152*6777b538SAndroid Build Coastguard Worker     xmlPatternPtr     *patternTab;      /* array of preserve patterns */
153*6777b538SAndroid Build Coastguard Worker #endif
154*6777b538SAndroid Build Coastguard Worker     int                preserves;	/* level of preserves */
155*6777b538SAndroid Build Coastguard Worker     int                parserFlags;	/* the set of options set */
156*6777b538SAndroid Build Coastguard Worker     /* Structured error handling */
157*6777b538SAndroid Build Coastguard Worker     xmlStructuredErrorFunc sErrorFunc;  /* callback function */
158*6777b538SAndroid Build Coastguard Worker };
159*6777b538SAndroid Build Coastguard Worker 
160*6777b538SAndroid Build Coastguard Worker #define NODE_IS_EMPTY		0x1
161*6777b538SAndroid Build Coastguard Worker #define NODE_IS_PRESERVED	0x2
162*6777b538SAndroid Build Coastguard Worker #define NODE_IS_SPRESERVED	0x4
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker /**
165*6777b538SAndroid Build Coastguard Worker  * CONSTSTR:
166*6777b538SAndroid Build Coastguard Worker  *
167*6777b538SAndroid Build Coastguard Worker  * Macro used to return an interned string
168*6777b538SAndroid Build Coastguard Worker  */
169*6777b538SAndroid Build Coastguard Worker #define CONSTSTR(str) xmlDictLookup(reader->dict, (str), -1)
170*6777b538SAndroid Build Coastguard Worker #define CONSTQSTR(p, str) xmlDictQLookup(reader->dict, (p), (str))
171*6777b538SAndroid Build Coastguard Worker 
172*6777b538SAndroid Build Coastguard Worker static int xmlTextReaderReadTree(xmlTextReaderPtr reader);
173*6777b538SAndroid Build Coastguard Worker static int xmlTextReaderNextTree(xmlTextReaderPtr reader);
174*6777b538SAndroid Build Coastguard Worker 
175*6777b538SAndroid Build Coastguard Worker /************************************************************************
176*6777b538SAndroid Build Coastguard Worker  *									*
177*6777b538SAndroid Build Coastguard Worker  *	Our own version of the freeing routines as we recycle nodes	*
178*6777b538SAndroid Build Coastguard Worker  *									*
179*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
180*6777b538SAndroid Build Coastguard Worker /**
181*6777b538SAndroid Build Coastguard Worker  * DICT_FREE:
182*6777b538SAndroid Build Coastguard Worker  * @str:  a string
183*6777b538SAndroid Build Coastguard Worker  *
184*6777b538SAndroid Build Coastguard Worker  * Free a string if it is not owned by the "dict" dictionary in the
185*6777b538SAndroid Build Coastguard Worker  * current scope
186*6777b538SAndroid Build Coastguard Worker  */
187*6777b538SAndroid Build Coastguard Worker #define DICT_FREE(str)						\
188*6777b538SAndroid Build Coastguard Worker 	if ((str) && ((!dict) ||				\
189*6777b538SAndroid Build Coastguard Worker 	    (xmlDictOwns(dict, (const xmlChar *)(str)) == 0)))	\
190*6777b538SAndroid Build Coastguard Worker 	    xmlFree((char *)(str));
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur);
193*6777b538SAndroid Build Coastguard Worker static void xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur);
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderErrMemory(xmlTextReaderPtr reader)196*6777b538SAndroid Build Coastguard Worker xmlTextReaderErrMemory(xmlTextReaderPtr reader) {
197*6777b538SAndroid Build Coastguard Worker     xmlCtxtErrMemory(reader->ctxt);
198*6777b538SAndroid Build Coastguard Worker     reader->mode = XML_TEXTREADER_MODE_ERROR;
199*6777b538SAndroid Build Coastguard Worker     reader->state = XML_TEXTREADER_ERROR;
200*6777b538SAndroid Build Coastguard Worker }
201*6777b538SAndroid Build Coastguard Worker 
202*6777b538SAndroid Build Coastguard Worker /**
203*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderFreeProp:
204*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
205*6777b538SAndroid Build Coastguard Worker  * @cur:  the node
206*6777b538SAndroid Build Coastguard Worker  *
207*6777b538SAndroid Build Coastguard Worker  * Free a node.
208*6777b538SAndroid Build Coastguard Worker  */
209*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderFreeProp(xmlTextReaderPtr reader,xmlAttrPtr cur)210*6777b538SAndroid Build Coastguard Worker xmlTextReaderFreeProp(xmlTextReaderPtr reader, xmlAttrPtr cur) {
211*6777b538SAndroid Build Coastguard Worker     xmlDictPtr dict;
212*6777b538SAndroid Build Coastguard Worker 
213*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->ctxt != NULL))
214*6777b538SAndroid Build Coastguard Worker 	dict = reader->ctxt->dict;
215*6777b538SAndroid Build Coastguard Worker     else
216*6777b538SAndroid Build Coastguard Worker         dict = NULL;
217*6777b538SAndroid Build Coastguard Worker     if (cur == NULL) return;
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker     if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
220*6777b538SAndroid Build Coastguard Worker 	xmlDeregisterNodeDefaultValue((xmlNodePtr) cur);
221*6777b538SAndroid Build Coastguard Worker 
222*6777b538SAndroid Build Coastguard Worker     if (cur->children != NULL)
223*6777b538SAndroid Build Coastguard Worker         xmlTextReaderFreeNodeList(reader, cur->children);
224*6777b538SAndroid Build Coastguard Worker 
225*6777b538SAndroid Build Coastguard Worker     DICT_FREE(cur->name);
226*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->ctxt != NULL) &&
227*6777b538SAndroid Build Coastguard Worker         (reader->ctxt->freeAttrsNr < MAX_FREE_NODES)) {
228*6777b538SAndroid Build Coastguard Worker         cur->next = reader->ctxt->freeAttrs;
229*6777b538SAndroid Build Coastguard Worker 	reader->ctxt->freeAttrs = cur;
230*6777b538SAndroid Build Coastguard Worker 	reader->ctxt->freeAttrsNr++;
231*6777b538SAndroid Build Coastguard Worker     } else {
232*6777b538SAndroid Build Coastguard Worker 	xmlFree(cur);
233*6777b538SAndroid Build Coastguard Worker     }
234*6777b538SAndroid Build Coastguard Worker }
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker /**
237*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderFreePropList:
238*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
239*6777b538SAndroid Build Coastguard Worker  * @cur:  the first property in the list
240*6777b538SAndroid Build Coastguard Worker  *
241*6777b538SAndroid Build Coastguard Worker  * Free a property and all its siblings, all the children are freed too.
242*6777b538SAndroid Build Coastguard Worker  */
243*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderFreePropList(xmlTextReaderPtr reader,xmlAttrPtr cur)244*6777b538SAndroid Build Coastguard Worker xmlTextReaderFreePropList(xmlTextReaderPtr reader, xmlAttrPtr cur) {
245*6777b538SAndroid Build Coastguard Worker     xmlAttrPtr next;
246*6777b538SAndroid Build Coastguard Worker 
247*6777b538SAndroid Build Coastguard Worker     while (cur != NULL) {
248*6777b538SAndroid Build Coastguard Worker         next = cur->next;
249*6777b538SAndroid Build Coastguard Worker         xmlTextReaderFreeProp(reader, cur);
250*6777b538SAndroid Build Coastguard Worker 	cur = next;
251*6777b538SAndroid Build Coastguard Worker     }
252*6777b538SAndroid Build Coastguard Worker }
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker /**
255*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderFreeNodeList:
256*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
257*6777b538SAndroid Build Coastguard Worker  * @cur:  the first node in the list
258*6777b538SAndroid Build Coastguard Worker  *
259*6777b538SAndroid Build Coastguard Worker  * Free a node and all its siblings, this is a recursive behaviour, all
260*6777b538SAndroid Build Coastguard Worker  * the children are freed too.
261*6777b538SAndroid Build Coastguard Worker  */
262*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderFreeNodeList(xmlTextReaderPtr reader,xmlNodePtr cur)263*6777b538SAndroid Build Coastguard Worker xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur) {
264*6777b538SAndroid Build Coastguard Worker     xmlNodePtr next;
265*6777b538SAndroid Build Coastguard Worker     xmlNodePtr parent;
266*6777b538SAndroid Build Coastguard Worker     xmlDictPtr dict;
267*6777b538SAndroid Build Coastguard Worker     size_t depth = 0;
268*6777b538SAndroid Build Coastguard Worker 
269*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->ctxt != NULL))
270*6777b538SAndroid Build Coastguard Worker 	dict = reader->ctxt->dict;
271*6777b538SAndroid Build Coastguard Worker     else
272*6777b538SAndroid Build Coastguard Worker         dict = NULL;
273*6777b538SAndroid Build Coastguard Worker     if (cur == NULL) return;
274*6777b538SAndroid Build Coastguard Worker     if (cur->type == XML_NAMESPACE_DECL) {
275*6777b538SAndroid Build Coastguard Worker 	xmlFreeNsList((xmlNsPtr) cur);
276*6777b538SAndroid Build Coastguard Worker 	return;
277*6777b538SAndroid Build Coastguard Worker     }
278*6777b538SAndroid Build Coastguard Worker     if ((cur->type == XML_DOCUMENT_NODE) ||
279*6777b538SAndroid Build Coastguard Worker 	(cur->type == XML_HTML_DOCUMENT_NODE)) {
280*6777b538SAndroid Build Coastguard Worker 	xmlFreeDoc((xmlDocPtr) cur);
281*6777b538SAndroid Build Coastguard Worker 	return;
282*6777b538SAndroid Build Coastguard Worker     }
283*6777b538SAndroid Build Coastguard Worker     while (1) {
284*6777b538SAndroid Build Coastguard Worker         while ((cur->type != XML_DTD_NODE) &&
285*6777b538SAndroid Build Coastguard Worker                (cur->type != XML_ENTITY_REF_NODE) &&
286*6777b538SAndroid Build Coastguard Worker                (cur->children != NULL) &&
287*6777b538SAndroid Build Coastguard Worker                (cur->children->parent == cur)) {
288*6777b538SAndroid Build Coastguard Worker             cur = cur->children;
289*6777b538SAndroid Build Coastguard Worker             depth += 1;
290*6777b538SAndroid Build Coastguard Worker         }
291*6777b538SAndroid Build Coastguard Worker 
292*6777b538SAndroid Build Coastguard Worker         next = cur->next;
293*6777b538SAndroid Build Coastguard Worker         parent = cur->parent;
294*6777b538SAndroid Build Coastguard Worker 
295*6777b538SAndroid Build Coastguard Worker 	/* unroll to speed up freeing the document */
296*6777b538SAndroid Build Coastguard Worker 	if (cur->type != XML_DTD_NODE) {
297*6777b538SAndroid Build Coastguard Worker 
298*6777b538SAndroid Build Coastguard Worker 	    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
299*6777b538SAndroid Build Coastguard Worker 		xmlDeregisterNodeDefaultValue(cur);
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker 	    if (((cur->type == XML_ELEMENT_NODE) ||
302*6777b538SAndroid Build Coastguard Worker 		 (cur->type == XML_XINCLUDE_START) ||
303*6777b538SAndroid Build Coastguard Worker 		 (cur->type == XML_XINCLUDE_END)) &&
304*6777b538SAndroid Build Coastguard Worker 		(cur->properties != NULL))
305*6777b538SAndroid Build Coastguard Worker 		xmlTextReaderFreePropList(reader, cur->properties);
306*6777b538SAndroid Build Coastguard Worker 	    if ((cur->content != (xmlChar *) &(cur->properties)) &&
307*6777b538SAndroid Build Coastguard Worker 	        (cur->type != XML_ELEMENT_NODE) &&
308*6777b538SAndroid Build Coastguard Worker 		(cur->type != XML_XINCLUDE_START) &&
309*6777b538SAndroid Build Coastguard Worker 		(cur->type != XML_XINCLUDE_END) &&
310*6777b538SAndroid Build Coastguard Worker 		(cur->type != XML_ENTITY_REF_NODE)) {
311*6777b538SAndroid Build Coastguard Worker 		DICT_FREE(cur->content);
312*6777b538SAndroid Build Coastguard Worker 	    }
313*6777b538SAndroid Build Coastguard Worker 	    if (((cur->type == XML_ELEMENT_NODE) ||
314*6777b538SAndroid Build Coastguard Worker 	         (cur->type == XML_XINCLUDE_START) ||
315*6777b538SAndroid Build Coastguard Worker 		 (cur->type == XML_XINCLUDE_END)) &&
316*6777b538SAndroid Build Coastguard Worker 		(cur->nsDef != NULL))
317*6777b538SAndroid Build Coastguard Worker 		xmlFreeNsList(cur->nsDef);
318*6777b538SAndroid Build Coastguard Worker 
319*6777b538SAndroid Build Coastguard Worker 	    /*
320*6777b538SAndroid Build Coastguard Worker 	     * we don't free element names here they are interned now
321*6777b538SAndroid Build Coastguard Worker 	     */
322*6777b538SAndroid Build Coastguard Worker 	    if ((cur->type != XML_TEXT_NODE) &&
323*6777b538SAndroid Build Coastguard Worker 		(cur->type != XML_COMMENT_NODE))
324*6777b538SAndroid Build Coastguard Worker 		DICT_FREE(cur->name);
325*6777b538SAndroid Build Coastguard Worker 	    if (((cur->type == XML_ELEMENT_NODE) ||
326*6777b538SAndroid Build Coastguard Worker 		 (cur->type == XML_TEXT_NODE)) &&
327*6777b538SAndroid Build Coastguard Worker 	        (reader != NULL) && (reader->ctxt != NULL) &&
328*6777b538SAndroid Build Coastguard Worker 		(reader->ctxt->freeElemsNr < MAX_FREE_NODES)) {
329*6777b538SAndroid Build Coastguard Worker 	        cur->next = reader->ctxt->freeElems;
330*6777b538SAndroid Build Coastguard Worker 		reader->ctxt->freeElems = cur;
331*6777b538SAndroid Build Coastguard Worker 		reader->ctxt->freeElemsNr++;
332*6777b538SAndroid Build Coastguard Worker 	    } else {
333*6777b538SAndroid Build Coastguard Worker 		xmlFree(cur);
334*6777b538SAndroid Build Coastguard Worker 	    }
335*6777b538SAndroid Build Coastguard Worker 	}
336*6777b538SAndroid Build Coastguard Worker 
337*6777b538SAndroid Build Coastguard Worker         if (next != NULL) {
338*6777b538SAndroid Build Coastguard Worker 	    cur = next;
339*6777b538SAndroid Build Coastguard Worker         } else {
340*6777b538SAndroid Build Coastguard Worker             if ((depth == 0) || (parent == NULL))
341*6777b538SAndroid Build Coastguard Worker                 break;
342*6777b538SAndroid Build Coastguard Worker             depth -= 1;
343*6777b538SAndroid Build Coastguard Worker             cur = parent;
344*6777b538SAndroid Build Coastguard Worker             cur->children = NULL;
345*6777b538SAndroid Build Coastguard Worker         }
346*6777b538SAndroid Build Coastguard Worker     }
347*6777b538SAndroid Build Coastguard Worker }
348*6777b538SAndroid Build Coastguard Worker 
349*6777b538SAndroid Build Coastguard Worker /**
350*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderFreeNode:
351*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
352*6777b538SAndroid Build Coastguard Worker  * @cur:  the node
353*6777b538SAndroid Build Coastguard Worker  *
354*6777b538SAndroid Build Coastguard Worker  * Free a node, this is a recursive behaviour, all the children are freed too.
355*6777b538SAndroid Build Coastguard Worker  * This doesn't unlink the child from the list, use xmlUnlinkNode() first.
356*6777b538SAndroid Build Coastguard Worker  */
357*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderFreeNode(xmlTextReaderPtr reader,xmlNodePtr cur)358*6777b538SAndroid Build Coastguard Worker xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur) {
359*6777b538SAndroid Build Coastguard Worker     xmlDictPtr dict;
360*6777b538SAndroid Build Coastguard Worker 
361*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->ctxt != NULL))
362*6777b538SAndroid Build Coastguard Worker 	dict = reader->ctxt->dict;
363*6777b538SAndroid Build Coastguard Worker     else
364*6777b538SAndroid Build Coastguard Worker         dict = NULL;
365*6777b538SAndroid Build Coastguard Worker     if (cur->type == XML_DTD_NODE) {
366*6777b538SAndroid Build Coastguard Worker 	xmlFreeDtd((xmlDtdPtr) cur);
367*6777b538SAndroid Build Coastguard Worker 	return;
368*6777b538SAndroid Build Coastguard Worker     }
369*6777b538SAndroid Build Coastguard Worker     if (cur->type == XML_NAMESPACE_DECL) {
370*6777b538SAndroid Build Coastguard Worker 	xmlFreeNs((xmlNsPtr) cur);
371*6777b538SAndroid Build Coastguard Worker         return;
372*6777b538SAndroid Build Coastguard Worker     }
373*6777b538SAndroid Build Coastguard Worker     if (cur->type == XML_ATTRIBUTE_NODE) {
374*6777b538SAndroid Build Coastguard Worker 	xmlTextReaderFreeProp(reader, (xmlAttrPtr) cur);
375*6777b538SAndroid Build Coastguard Worker 	return;
376*6777b538SAndroid Build Coastguard Worker     }
377*6777b538SAndroid Build Coastguard Worker 
378*6777b538SAndroid Build Coastguard Worker     if ((cur->children != NULL) &&
379*6777b538SAndroid Build Coastguard Worker 	(cur->type != XML_ENTITY_REF_NODE)) {
380*6777b538SAndroid Build Coastguard Worker 	if (cur->children->parent == cur)
381*6777b538SAndroid Build Coastguard Worker 	    xmlTextReaderFreeNodeList(reader, cur->children);
382*6777b538SAndroid Build Coastguard Worker 	cur->children = NULL;
383*6777b538SAndroid Build Coastguard Worker     }
384*6777b538SAndroid Build Coastguard Worker 
385*6777b538SAndroid Build Coastguard Worker     if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
386*6777b538SAndroid Build Coastguard Worker 	xmlDeregisterNodeDefaultValue(cur);
387*6777b538SAndroid Build Coastguard Worker 
388*6777b538SAndroid Build Coastguard Worker     if (((cur->type == XML_ELEMENT_NODE) ||
389*6777b538SAndroid Build Coastguard Worker 	 (cur->type == XML_XINCLUDE_START) ||
390*6777b538SAndroid Build Coastguard Worker 	 (cur->type == XML_XINCLUDE_END)) &&
391*6777b538SAndroid Build Coastguard Worker 	(cur->properties != NULL))
392*6777b538SAndroid Build Coastguard Worker 	xmlTextReaderFreePropList(reader, cur->properties);
393*6777b538SAndroid Build Coastguard Worker     if ((cur->content != (xmlChar *) &(cur->properties)) &&
394*6777b538SAndroid Build Coastguard Worker         (cur->type != XML_ELEMENT_NODE) &&
395*6777b538SAndroid Build Coastguard Worker 	(cur->type != XML_XINCLUDE_START) &&
396*6777b538SAndroid Build Coastguard Worker 	(cur->type != XML_XINCLUDE_END) &&
397*6777b538SAndroid Build Coastguard Worker 	(cur->type != XML_ENTITY_REF_NODE)) {
398*6777b538SAndroid Build Coastguard Worker 	DICT_FREE(cur->content);
399*6777b538SAndroid Build Coastguard Worker     }
400*6777b538SAndroid Build Coastguard Worker     if (((cur->type == XML_ELEMENT_NODE) ||
401*6777b538SAndroid Build Coastguard Worker 	 (cur->type == XML_XINCLUDE_START) ||
402*6777b538SAndroid Build Coastguard Worker 	 (cur->type == XML_XINCLUDE_END)) &&
403*6777b538SAndroid Build Coastguard Worker 	(cur->nsDef != NULL))
404*6777b538SAndroid Build Coastguard Worker 	xmlFreeNsList(cur->nsDef);
405*6777b538SAndroid Build Coastguard Worker 
406*6777b538SAndroid Build Coastguard Worker     /*
407*6777b538SAndroid Build Coastguard Worker      * we don't free names here they are interned now
408*6777b538SAndroid Build Coastguard Worker      */
409*6777b538SAndroid Build Coastguard Worker     if ((cur->type != XML_TEXT_NODE) &&
410*6777b538SAndroid Build Coastguard Worker         (cur->type != XML_COMMENT_NODE))
411*6777b538SAndroid Build Coastguard Worker 	DICT_FREE(cur->name);
412*6777b538SAndroid Build Coastguard Worker 
413*6777b538SAndroid Build Coastguard Worker     if (((cur->type == XML_ELEMENT_NODE) ||
414*6777b538SAndroid Build Coastguard Worker 	 (cur->type == XML_TEXT_NODE)) &&
415*6777b538SAndroid Build Coastguard Worker 	(reader != NULL) && (reader->ctxt != NULL) &&
416*6777b538SAndroid Build Coastguard Worker 	(reader->ctxt->freeElemsNr < MAX_FREE_NODES)) {
417*6777b538SAndroid Build Coastguard Worker 	cur->next = reader->ctxt->freeElems;
418*6777b538SAndroid Build Coastguard Worker 	reader->ctxt->freeElems = cur;
419*6777b538SAndroid Build Coastguard Worker 	reader->ctxt->freeElemsNr++;
420*6777b538SAndroid Build Coastguard Worker     } else {
421*6777b538SAndroid Build Coastguard Worker 	xmlFree(cur);
422*6777b538SAndroid Build Coastguard Worker     }
423*6777b538SAndroid Build Coastguard Worker }
424*6777b538SAndroid Build Coastguard Worker 
425*6777b538SAndroid Build Coastguard Worker /**
426*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderFreeDoc:
427*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
428*6777b538SAndroid Build Coastguard Worker  * @cur:  pointer to the document
429*6777b538SAndroid Build Coastguard Worker  *
430*6777b538SAndroid Build Coastguard Worker  * Free up all the structures used by a document, tree included.
431*6777b538SAndroid Build Coastguard Worker  */
432*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderFreeDoc(xmlTextReaderPtr reader,xmlDocPtr cur)433*6777b538SAndroid Build Coastguard Worker xmlTextReaderFreeDoc(xmlTextReaderPtr reader, xmlDocPtr cur) {
434*6777b538SAndroid Build Coastguard Worker     xmlDtdPtr extSubset, intSubset;
435*6777b538SAndroid Build Coastguard Worker 
436*6777b538SAndroid Build Coastguard Worker     if (cur == NULL) return;
437*6777b538SAndroid Build Coastguard Worker 
438*6777b538SAndroid Build Coastguard Worker     if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
439*6777b538SAndroid Build Coastguard Worker 	xmlDeregisterNodeDefaultValue((xmlNodePtr) cur);
440*6777b538SAndroid Build Coastguard Worker 
441*6777b538SAndroid Build Coastguard Worker     /*
442*6777b538SAndroid Build Coastguard Worker      * Do this before freeing the children list to avoid ID lookups
443*6777b538SAndroid Build Coastguard Worker      */
444*6777b538SAndroid Build Coastguard Worker     if (cur->ids != NULL) xmlFreeIDTable((xmlIDTablePtr) cur->ids);
445*6777b538SAndroid Build Coastguard Worker     cur->ids = NULL;
446*6777b538SAndroid Build Coastguard Worker     if (cur->refs != NULL) xmlFreeRefTable((xmlRefTablePtr) cur->refs);
447*6777b538SAndroid Build Coastguard Worker     cur->refs = NULL;
448*6777b538SAndroid Build Coastguard Worker     extSubset = cur->extSubset;
449*6777b538SAndroid Build Coastguard Worker     intSubset = cur->intSubset;
450*6777b538SAndroid Build Coastguard Worker     if (intSubset == extSubset)
451*6777b538SAndroid Build Coastguard Worker 	extSubset = NULL;
452*6777b538SAndroid Build Coastguard Worker     if (extSubset != NULL) {
453*6777b538SAndroid Build Coastguard Worker 	xmlUnlinkNode((xmlNodePtr) cur->extSubset);
454*6777b538SAndroid Build Coastguard Worker 	cur->extSubset = NULL;
455*6777b538SAndroid Build Coastguard Worker 	xmlFreeDtd(extSubset);
456*6777b538SAndroid Build Coastguard Worker     }
457*6777b538SAndroid Build Coastguard Worker     if (intSubset != NULL) {
458*6777b538SAndroid Build Coastguard Worker 	xmlUnlinkNode((xmlNodePtr) cur->intSubset);
459*6777b538SAndroid Build Coastguard Worker 	cur->intSubset = NULL;
460*6777b538SAndroid Build Coastguard Worker 	xmlFreeDtd(intSubset);
461*6777b538SAndroid Build Coastguard Worker     }
462*6777b538SAndroid Build Coastguard Worker 
463*6777b538SAndroid Build Coastguard Worker     if (cur->children != NULL) xmlTextReaderFreeNodeList(reader, cur->children);
464*6777b538SAndroid Build Coastguard Worker 
465*6777b538SAndroid Build Coastguard Worker     if (cur->version != NULL) xmlFree((char *) cur->version);
466*6777b538SAndroid Build Coastguard Worker     if (cur->name != NULL) xmlFree((char *) cur->name);
467*6777b538SAndroid Build Coastguard Worker     if (cur->encoding != NULL) xmlFree((char *) cur->encoding);
468*6777b538SAndroid Build Coastguard Worker     if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs);
469*6777b538SAndroid Build Coastguard Worker     if (cur->URL != NULL) xmlFree((char *) cur->URL);
470*6777b538SAndroid Build Coastguard Worker     if (cur->dict != NULL) xmlDictFree(cur->dict);
471*6777b538SAndroid Build Coastguard Worker 
472*6777b538SAndroid Build Coastguard Worker     xmlFree(cur);
473*6777b538SAndroid Build Coastguard Worker }
474*6777b538SAndroid Build Coastguard Worker 
475*6777b538SAndroid Build Coastguard Worker /************************************************************************
476*6777b538SAndroid Build Coastguard Worker  *									*
477*6777b538SAndroid Build Coastguard Worker  *			The reader core parser				*
478*6777b538SAndroid Build Coastguard Worker  *									*
479*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
480*6777b538SAndroid Build Coastguard Worker 
481*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderStructuredRelay(void * userData,const xmlError * error)482*6777b538SAndroid Build Coastguard Worker xmlTextReaderStructuredRelay(void *userData, const xmlError *error)
483*6777b538SAndroid Build Coastguard Worker {
484*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader = (xmlTextReaderPtr) userData;
485*6777b538SAndroid Build Coastguard Worker 
486*6777b538SAndroid Build Coastguard Worker     if (reader->sErrorFunc != NULL) {
487*6777b538SAndroid Build Coastguard Worker         reader->sErrorFunc(reader->errorFuncArg, error);
488*6777b538SAndroid Build Coastguard Worker     } else if (reader->errorFunc != NULL) {
489*6777b538SAndroid Build Coastguard Worker         xmlParserSeverities severity;
490*6777b538SAndroid Build Coastguard Worker 
491*6777b538SAndroid Build Coastguard Worker         if ((error->domain == XML_FROM_VALID) ||
492*6777b538SAndroid Build Coastguard Worker             (error->domain == XML_FROM_DTD)) {
493*6777b538SAndroid Build Coastguard Worker             if (error->level == XML_ERR_WARNING)
494*6777b538SAndroid Build Coastguard Worker                 severity = XML_PARSER_SEVERITY_VALIDITY_WARNING;
495*6777b538SAndroid Build Coastguard Worker             else
496*6777b538SAndroid Build Coastguard Worker                 severity = XML_PARSER_SEVERITY_VALIDITY_ERROR;
497*6777b538SAndroid Build Coastguard Worker         } else {
498*6777b538SAndroid Build Coastguard Worker             if (error->level == XML_ERR_WARNING)
499*6777b538SAndroid Build Coastguard Worker                 severity = XML_PARSER_SEVERITY_WARNING;
500*6777b538SAndroid Build Coastguard Worker             else
501*6777b538SAndroid Build Coastguard Worker                 severity = XML_PARSER_SEVERITY_ERROR;
502*6777b538SAndroid Build Coastguard Worker         }
503*6777b538SAndroid Build Coastguard Worker 
504*6777b538SAndroid Build Coastguard Worker         reader->errorFunc(reader->errorFuncArg, error->message, severity,
505*6777b538SAndroid Build Coastguard Worker                           reader->ctxt);
506*6777b538SAndroid Build Coastguard Worker     }
507*6777b538SAndroid Build Coastguard Worker }
508*6777b538SAndroid Build Coastguard Worker 
509*6777b538SAndroid Build Coastguard Worker /**
510*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderEntPush:
511*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
512*6777b538SAndroid Build Coastguard Worker  * @value:  the entity reference node
513*6777b538SAndroid Build Coastguard Worker  *
514*6777b538SAndroid Build Coastguard Worker  * Pushes a new entity reference node on top of the entities stack
515*6777b538SAndroid Build Coastguard Worker  *
516*6777b538SAndroid Build Coastguard Worker  * Returns -1 in case of error, the index in the stack otherwise
517*6777b538SAndroid Build Coastguard Worker  */
518*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderEntPush(xmlTextReaderPtr reader,xmlNodePtr value)519*6777b538SAndroid Build Coastguard Worker xmlTextReaderEntPush(xmlTextReaderPtr reader, xmlNodePtr value)
520*6777b538SAndroid Build Coastguard Worker {
521*6777b538SAndroid Build Coastguard Worker     if (reader->entNr >= reader->entMax) {
522*6777b538SAndroid Build Coastguard Worker         size_t newSize = reader->entMax == 0 ? 10 : reader->entMax * 2;
523*6777b538SAndroid Build Coastguard Worker         xmlNodePtr *tmp;
524*6777b538SAndroid Build Coastguard Worker 
525*6777b538SAndroid Build Coastguard Worker         tmp = (xmlNodePtr *) xmlRealloc(reader->entTab,
526*6777b538SAndroid Build Coastguard Worker                                         newSize * sizeof(*tmp));
527*6777b538SAndroid Build Coastguard Worker         if (tmp == NULL) {
528*6777b538SAndroid Build Coastguard Worker             xmlTextReaderErrMemory(reader);
529*6777b538SAndroid Build Coastguard Worker             return (-1);
530*6777b538SAndroid Build Coastguard Worker         }
531*6777b538SAndroid Build Coastguard Worker         reader->entTab = tmp;
532*6777b538SAndroid Build Coastguard Worker         reader->entMax = newSize;
533*6777b538SAndroid Build Coastguard Worker     }
534*6777b538SAndroid Build Coastguard Worker     reader->entTab[reader->entNr] = value;
535*6777b538SAndroid Build Coastguard Worker     reader->ent = value;
536*6777b538SAndroid Build Coastguard Worker     return (reader->entNr++);
537*6777b538SAndroid Build Coastguard Worker }
538*6777b538SAndroid Build Coastguard Worker 
539*6777b538SAndroid Build Coastguard Worker /**
540*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderEntPop:
541*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
542*6777b538SAndroid Build Coastguard Worker  *
543*6777b538SAndroid Build Coastguard Worker  * Pops the top element entity from the entities stack
544*6777b538SAndroid Build Coastguard Worker  *
545*6777b538SAndroid Build Coastguard Worker  * Returns the entity just removed
546*6777b538SAndroid Build Coastguard Worker  */
547*6777b538SAndroid Build Coastguard Worker static xmlNodePtr
xmlTextReaderEntPop(xmlTextReaderPtr reader)548*6777b538SAndroid Build Coastguard Worker xmlTextReaderEntPop(xmlTextReaderPtr reader)
549*6777b538SAndroid Build Coastguard Worker {
550*6777b538SAndroid Build Coastguard Worker     xmlNodePtr ret;
551*6777b538SAndroid Build Coastguard Worker 
552*6777b538SAndroid Build Coastguard Worker     if (reader->entNr <= 0)
553*6777b538SAndroid Build Coastguard Worker         return (NULL);
554*6777b538SAndroid Build Coastguard Worker     reader->entNr--;
555*6777b538SAndroid Build Coastguard Worker     if (reader->entNr > 0)
556*6777b538SAndroid Build Coastguard Worker         reader->ent = reader->entTab[reader->entNr - 1];
557*6777b538SAndroid Build Coastguard Worker     else
558*6777b538SAndroid Build Coastguard Worker         reader->ent = NULL;
559*6777b538SAndroid Build Coastguard Worker     ret = reader->entTab[reader->entNr];
560*6777b538SAndroid Build Coastguard Worker     reader->entTab[reader->entNr] = NULL;
561*6777b538SAndroid Build Coastguard Worker     return (ret);
562*6777b538SAndroid Build Coastguard Worker }
563*6777b538SAndroid Build Coastguard Worker 
564*6777b538SAndroid Build Coastguard Worker /**
565*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderStartElement:
566*6777b538SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
567*6777b538SAndroid Build Coastguard Worker  * @fullname:  The element name, including namespace prefix
568*6777b538SAndroid Build Coastguard Worker  * @atts:  An array of name/value attributes pairs, NULL terminated
569*6777b538SAndroid Build Coastguard Worker  *
570*6777b538SAndroid Build Coastguard Worker  * called when an opening tag has been processed.
571*6777b538SAndroid Build Coastguard Worker  */
572*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderStartElement(void * ctx,const xmlChar * fullname,const xmlChar ** atts)573*6777b538SAndroid Build Coastguard Worker xmlTextReaderStartElement(void *ctx, const xmlChar *fullname,
574*6777b538SAndroid Build Coastguard Worker 	                  const xmlChar **atts) {
575*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
576*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader = ctxt->_private;
577*6777b538SAndroid Build Coastguard Worker 
578*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->startElement != NULL)) {
579*6777b538SAndroid Build Coastguard Worker 	reader->startElement(ctx, fullname, atts);
580*6777b538SAndroid Build Coastguard Worker 	if ((ctxt->node != NULL) && (ctxt->input != NULL) &&
581*6777b538SAndroid Build Coastguard Worker 	    (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') &&
582*6777b538SAndroid Build Coastguard Worker 	    (ctxt->input->cur[1] == '>'))
583*6777b538SAndroid Build Coastguard Worker 	    ctxt->node->extra = NODE_IS_EMPTY;
584*6777b538SAndroid Build Coastguard Worker     }
585*6777b538SAndroid Build Coastguard Worker     if (reader != NULL)
586*6777b538SAndroid Build Coastguard Worker 	reader->state = XML_TEXTREADER_ELEMENT;
587*6777b538SAndroid Build Coastguard Worker }
588*6777b538SAndroid Build Coastguard Worker 
589*6777b538SAndroid Build Coastguard Worker /**
590*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderEndElement:
591*6777b538SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
592*6777b538SAndroid Build Coastguard Worker  * @fullname:  The element name, including namespace prefix
593*6777b538SAndroid Build Coastguard Worker  *
594*6777b538SAndroid Build Coastguard Worker  * called when an ending tag has been processed.
595*6777b538SAndroid Build Coastguard Worker  */
596*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderEndElement(void * ctx,const xmlChar * fullname)597*6777b538SAndroid Build Coastguard Worker xmlTextReaderEndElement(void *ctx, const xmlChar *fullname) {
598*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
599*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader = ctxt->_private;
600*6777b538SAndroid Build Coastguard Worker 
601*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->endElement != NULL)) {
602*6777b538SAndroid Build Coastguard Worker 	reader->endElement(ctx, fullname);
603*6777b538SAndroid Build Coastguard Worker     }
604*6777b538SAndroid Build Coastguard Worker }
605*6777b538SAndroid Build Coastguard Worker 
606*6777b538SAndroid Build Coastguard Worker /**
607*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderStartElementNs:
608*6777b538SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
609*6777b538SAndroid Build Coastguard Worker  * @localname:  the local name of the element
610*6777b538SAndroid Build Coastguard Worker  * @prefix:  the element namespace prefix if available
611*6777b538SAndroid Build Coastguard Worker  * @URI:  the element namespace name if available
612*6777b538SAndroid Build Coastguard Worker  * @nb_namespaces:  number of namespace definitions on that node
613*6777b538SAndroid Build Coastguard Worker  * @namespaces:  pointer to the array of prefix/URI pairs namespace definitions
614*6777b538SAndroid Build Coastguard Worker  * @nb_attributes:  the number of attributes on that node
615*6777b538SAndroid Build Coastguard Worker  * nb_defaulted:  the number of defaulted attributes.
616*6777b538SAndroid Build Coastguard Worker  * @attributes:  pointer to the array of (localname/prefix/URI/value/end)
617*6777b538SAndroid Build Coastguard Worker  *               attribute values.
618*6777b538SAndroid Build Coastguard Worker  *
619*6777b538SAndroid Build Coastguard Worker  * called when an opening tag has been processed.
620*6777b538SAndroid Build Coastguard Worker  */
621*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderStartElementNs(void * ctx,const xmlChar * localname,const xmlChar * prefix,const xmlChar * URI,int nb_namespaces,const xmlChar ** namespaces,int nb_attributes,int nb_defaulted,const xmlChar ** attributes)622*6777b538SAndroid Build Coastguard Worker xmlTextReaderStartElementNs(void *ctx,
623*6777b538SAndroid Build Coastguard Worker                       const xmlChar *localname,
624*6777b538SAndroid Build Coastguard Worker 		      const xmlChar *prefix,
625*6777b538SAndroid Build Coastguard Worker 		      const xmlChar *URI,
626*6777b538SAndroid Build Coastguard Worker 		      int nb_namespaces,
627*6777b538SAndroid Build Coastguard Worker 		      const xmlChar **namespaces,
628*6777b538SAndroid Build Coastguard Worker 		      int nb_attributes,
629*6777b538SAndroid Build Coastguard Worker 		      int nb_defaulted,
630*6777b538SAndroid Build Coastguard Worker 		      const xmlChar **attributes)
631*6777b538SAndroid Build Coastguard Worker {
632*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
633*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader = ctxt->_private;
634*6777b538SAndroid Build Coastguard Worker 
635*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->startElementNs != NULL)) {
636*6777b538SAndroid Build Coastguard Worker 	reader->startElementNs(ctx, localname, prefix, URI, nb_namespaces,
637*6777b538SAndroid Build Coastguard Worker 	                       namespaces, nb_attributes, nb_defaulted,
638*6777b538SAndroid Build Coastguard Worker 			       attributes);
639*6777b538SAndroid Build Coastguard Worker 	if ((ctxt->node != NULL) && (ctxt->input != NULL) &&
640*6777b538SAndroid Build Coastguard Worker 	    (ctxt->input->cur != NULL) && (ctxt->input->cur[0] == '/') &&
641*6777b538SAndroid Build Coastguard Worker 	    (ctxt->input->cur[1] == '>'))
642*6777b538SAndroid Build Coastguard Worker 	    ctxt->node->extra = NODE_IS_EMPTY;
643*6777b538SAndroid Build Coastguard Worker     }
644*6777b538SAndroid Build Coastguard Worker     if (reader != NULL)
645*6777b538SAndroid Build Coastguard Worker 	reader->state = XML_TEXTREADER_ELEMENT;
646*6777b538SAndroid Build Coastguard Worker }
647*6777b538SAndroid Build Coastguard Worker 
648*6777b538SAndroid Build Coastguard Worker /**
649*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderEndElementNs:
650*6777b538SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
651*6777b538SAndroid Build Coastguard Worker  * @localname:  the local name of the element
652*6777b538SAndroid Build Coastguard Worker  * @prefix:  the element namespace prefix if available
653*6777b538SAndroid Build Coastguard Worker  * @URI:  the element namespace name if available
654*6777b538SAndroid Build Coastguard Worker  *
655*6777b538SAndroid Build Coastguard Worker  * called when an ending tag has been processed.
656*6777b538SAndroid Build Coastguard Worker  */
657*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderEndElementNs(void * ctx,const xmlChar * localname,const xmlChar * prefix,const xmlChar * URI)658*6777b538SAndroid Build Coastguard Worker xmlTextReaderEndElementNs(void *ctx,
659*6777b538SAndroid Build Coastguard Worker                           const xmlChar * localname,
660*6777b538SAndroid Build Coastguard Worker                           const xmlChar * prefix,
661*6777b538SAndroid Build Coastguard Worker 		          const xmlChar * URI)
662*6777b538SAndroid Build Coastguard Worker {
663*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
664*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader = ctxt->_private;
665*6777b538SAndroid Build Coastguard Worker 
666*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->endElementNs != NULL)) {
667*6777b538SAndroid Build Coastguard Worker 	reader->endElementNs(ctx, localname, prefix, URI);
668*6777b538SAndroid Build Coastguard Worker     }
669*6777b538SAndroid Build Coastguard Worker }
670*6777b538SAndroid Build Coastguard Worker 
671*6777b538SAndroid Build Coastguard Worker 
672*6777b538SAndroid Build Coastguard Worker /**
673*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderCharacters:
674*6777b538SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
675*6777b538SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
676*6777b538SAndroid Build Coastguard Worker  * @len: the number of xmlChar
677*6777b538SAndroid Build Coastguard Worker  *
678*6777b538SAndroid Build Coastguard Worker  * receiving some chars from the parser.
679*6777b538SAndroid Build Coastguard Worker  */
680*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderCharacters(void * ctx,const xmlChar * ch,int len)681*6777b538SAndroid Build Coastguard Worker xmlTextReaderCharacters(void *ctx, const xmlChar *ch, int len)
682*6777b538SAndroid Build Coastguard Worker {
683*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
684*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader = ctxt->_private;
685*6777b538SAndroid Build Coastguard Worker 
686*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->characters != NULL)) {
687*6777b538SAndroid Build Coastguard Worker 	reader->characters(ctx, ch, len);
688*6777b538SAndroid Build Coastguard Worker     }
689*6777b538SAndroid Build Coastguard Worker }
690*6777b538SAndroid Build Coastguard Worker 
691*6777b538SAndroid Build Coastguard Worker /**
692*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderCDataBlock:
693*6777b538SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
694*6777b538SAndroid Build Coastguard Worker  * @value:  The pcdata content
695*6777b538SAndroid Build Coastguard Worker  * @len:  the block length
696*6777b538SAndroid Build Coastguard Worker  *
697*6777b538SAndroid Build Coastguard Worker  * called when a pcdata block has been parsed
698*6777b538SAndroid Build Coastguard Worker  */
699*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderCDataBlock(void * ctx,const xmlChar * ch,int len)700*6777b538SAndroid Build Coastguard Worker xmlTextReaderCDataBlock(void *ctx, const xmlChar *ch, int len)
701*6777b538SAndroid Build Coastguard Worker {
702*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
703*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader = ctxt->_private;
704*6777b538SAndroid Build Coastguard Worker 
705*6777b538SAndroid Build Coastguard Worker     if ((reader != NULL) && (reader->cdataBlock != NULL)) {
706*6777b538SAndroid Build Coastguard Worker 	reader->cdataBlock(ctx, ch, len);
707*6777b538SAndroid Build Coastguard Worker     }
708*6777b538SAndroid Build Coastguard Worker }
709*6777b538SAndroid Build Coastguard Worker 
710*6777b538SAndroid Build Coastguard Worker /**
711*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderPushData:
712*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
713*6777b538SAndroid Build Coastguard Worker  *
714*6777b538SAndroid Build Coastguard Worker  * Push data down the progressive parser until a significant callback
715*6777b538SAndroid Build Coastguard Worker  * got raised.
716*6777b538SAndroid Build Coastguard Worker  *
717*6777b538SAndroid Build Coastguard Worker  * Returns -1 in case of failure, 0 otherwise
718*6777b538SAndroid Build Coastguard Worker  */
719*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderPushData(xmlTextReaderPtr reader)720*6777b538SAndroid Build Coastguard Worker xmlTextReaderPushData(xmlTextReaderPtr reader) {
721*6777b538SAndroid Build Coastguard Worker     xmlBufPtr inbuf;
722*6777b538SAndroid Build Coastguard Worker     int val, s;
723*6777b538SAndroid Build Coastguard Worker     xmlTextReaderState oldstate;
724*6777b538SAndroid Build Coastguard Worker 
725*6777b538SAndroid Build Coastguard Worker     if ((reader->input == NULL) || (reader->input->buffer == NULL))
726*6777b538SAndroid Build Coastguard Worker 	return(-1);
727*6777b538SAndroid Build Coastguard Worker 
728*6777b538SAndroid Build Coastguard Worker     oldstate = reader->state;
729*6777b538SAndroid Build Coastguard Worker     reader->state = XML_TEXTREADER_NONE;
730*6777b538SAndroid Build Coastguard Worker     inbuf = reader->input->buffer;
731*6777b538SAndroid Build Coastguard Worker 
732*6777b538SAndroid Build Coastguard Worker     while (reader->state == XML_TEXTREADER_NONE) {
733*6777b538SAndroid Build Coastguard Worker 	if (xmlBufUse(inbuf) < reader->cur + CHUNK_SIZE) {
734*6777b538SAndroid Build Coastguard Worker 	    /*
735*6777b538SAndroid Build Coastguard Worker 	     * Refill the buffer unless we are at the end of the stream
736*6777b538SAndroid Build Coastguard Worker 	     */
737*6777b538SAndroid Build Coastguard Worker 	    if (reader->mode != XML_TEXTREADER_MODE_EOF) {
738*6777b538SAndroid Build Coastguard Worker 		val = xmlParserInputBufferRead(reader->input, 4096);
739*6777b538SAndroid Build Coastguard Worker 		if (val == 0) {
740*6777b538SAndroid Build Coastguard Worker 		    if (xmlBufUse(inbuf) == reader->cur) {
741*6777b538SAndroid Build Coastguard Worker 			reader->mode = XML_TEXTREADER_MODE_EOF;
742*6777b538SAndroid Build Coastguard Worker                         break;
743*6777b538SAndroid Build Coastguard Worker 		    }
744*6777b538SAndroid Build Coastguard Worker 		} else if (val < 0) {
745*6777b538SAndroid Build Coastguard Worker                     xmlCtxtErrIO(reader->ctxt, reader->input->error, NULL);
746*6777b538SAndroid Build Coastguard Worker                     reader->mode = XML_TEXTREADER_MODE_ERROR;
747*6777b538SAndroid Build Coastguard Worker                     reader->state = XML_TEXTREADER_ERROR;
748*6777b538SAndroid Build Coastguard Worker                     return(-1);
749*6777b538SAndroid Build Coastguard Worker 		}
750*6777b538SAndroid Build Coastguard Worker 
751*6777b538SAndroid Build Coastguard Worker 	    } else
752*6777b538SAndroid Build Coastguard Worker 		break;
753*6777b538SAndroid Build Coastguard Worker 	}
754*6777b538SAndroid Build Coastguard Worker 	/*
755*6777b538SAndroid Build Coastguard Worker 	 * parse by block of CHUNK_SIZE bytes, various tests show that
756*6777b538SAndroid Build Coastguard Worker 	 * it's the best tradeoff at least on a 1.2GH Duron
757*6777b538SAndroid Build Coastguard Worker 	 */
758*6777b538SAndroid Build Coastguard Worker 	if (xmlBufUse(inbuf) >= reader->cur + CHUNK_SIZE) {
759*6777b538SAndroid Build Coastguard Worker 	    val = xmlParseChunk(reader->ctxt,
760*6777b538SAndroid Build Coastguard Worker                  (const char *) xmlBufContent(inbuf) + reader->cur,
761*6777b538SAndroid Build Coastguard Worker                                 CHUNK_SIZE, 0);
762*6777b538SAndroid Build Coastguard Worker 	    reader->cur += CHUNK_SIZE;
763*6777b538SAndroid Build Coastguard Worker 	    if (val != 0)
764*6777b538SAndroid Build Coastguard Worker 		reader->ctxt->wellFormed = 0;
765*6777b538SAndroid Build Coastguard Worker 	    if (reader->ctxt->wellFormed == 0)
766*6777b538SAndroid Build Coastguard Worker 		break;
767*6777b538SAndroid Build Coastguard Worker 	} else {
768*6777b538SAndroid Build Coastguard Worker 	    s = xmlBufUse(inbuf) - reader->cur;
769*6777b538SAndroid Build Coastguard Worker 	    val = xmlParseChunk(reader->ctxt,
770*6777b538SAndroid Build Coastguard Worker 		 (const char *) xmlBufContent(inbuf) + reader->cur,
771*6777b538SAndroid Build Coastguard Worker 			        s, 0);
772*6777b538SAndroid Build Coastguard Worker 	    reader->cur += s;
773*6777b538SAndroid Build Coastguard Worker 	    if (val != 0)
774*6777b538SAndroid Build Coastguard Worker 		reader->ctxt->wellFormed = 0;
775*6777b538SAndroid Build Coastguard Worker 	    break;
776*6777b538SAndroid Build Coastguard Worker 	}
777*6777b538SAndroid Build Coastguard Worker     }
778*6777b538SAndroid Build Coastguard Worker     reader->state = oldstate;
779*6777b538SAndroid Build Coastguard Worker 
780*6777b538SAndroid Build Coastguard Worker     /*
781*6777b538SAndroid Build Coastguard Worker      * Discard the consumed input when needed and possible
782*6777b538SAndroid Build Coastguard Worker      */
783*6777b538SAndroid Build Coastguard Worker     if (reader->mode == XML_TEXTREADER_MODE_INTERACTIVE) {
784*6777b538SAndroid Build Coastguard Worker         if (reader->input->readcallback != NULL) {
785*6777b538SAndroid Build Coastguard Worker 	    if ((reader->cur >= 4096) &&
786*6777b538SAndroid Build Coastguard Worker 		(xmlBufUse(inbuf) - reader->cur <= CHUNK_SIZE)) {
787*6777b538SAndroid Build Coastguard Worker 		val = xmlBufShrink(inbuf, reader->cur);
788*6777b538SAndroid Build Coastguard Worker 		if (val >= 0) {
789*6777b538SAndroid Build Coastguard Worker 		    reader->cur -= val;
790*6777b538SAndroid Build Coastguard Worker 		}
791*6777b538SAndroid Build Coastguard Worker 	    }
792*6777b538SAndroid Build Coastguard Worker 	}
793*6777b538SAndroid Build Coastguard Worker     }
794*6777b538SAndroid Build Coastguard Worker 
795*6777b538SAndroid Build Coastguard Worker     /*
796*6777b538SAndroid Build Coastguard Worker      * At the end of the stream signal that the work is done to the Push
797*6777b538SAndroid Build Coastguard Worker      * parser.
798*6777b538SAndroid Build Coastguard Worker      */
799*6777b538SAndroid Build Coastguard Worker     else if (reader->mode == XML_TEXTREADER_MODE_EOF) {
800*6777b538SAndroid Build Coastguard Worker 	if (reader->state != XML_TEXTREADER_DONE) {
801*6777b538SAndroid Build Coastguard Worker 	    s = xmlBufUse(inbuf) - reader->cur;
802*6777b538SAndroid Build Coastguard Worker 	    val = xmlParseChunk(reader->ctxt,
803*6777b538SAndroid Build Coastguard Worker 		 (const char *) xmlBufContent(inbuf) + reader->cur,
804*6777b538SAndroid Build Coastguard Worker 			        s, 1);
805*6777b538SAndroid Build Coastguard Worker 	    reader->cur = xmlBufUse(inbuf);
806*6777b538SAndroid Build Coastguard Worker 	    reader->state  = XML_TEXTREADER_DONE;
807*6777b538SAndroid Build Coastguard Worker 	    if (val != 0) {
808*6777b538SAndroid Build Coastguard Worker 	        if (reader->ctxt->wellFormed)
809*6777b538SAndroid Build Coastguard Worker 		    reader->ctxt->wellFormed = 0;
810*6777b538SAndroid Build Coastguard Worker 		else
811*6777b538SAndroid Build Coastguard Worker 		    return(-1);
812*6777b538SAndroid Build Coastguard Worker 	    }
813*6777b538SAndroid Build Coastguard Worker 	}
814*6777b538SAndroid Build Coastguard Worker     }
815*6777b538SAndroid Build Coastguard Worker     if (reader->ctxt->wellFormed == 0) {
816*6777b538SAndroid Build Coastguard Worker 	reader->mode = XML_TEXTREADER_MODE_EOF;
817*6777b538SAndroid Build Coastguard Worker         return(-1);
818*6777b538SAndroid Build Coastguard Worker     }
819*6777b538SAndroid Build Coastguard Worker 
820*6777b538SAndroid Build Coastguard Worker     return(0);
821*6777b538SAndroid Build Coastguard Worker }
822*6777b538SAndroid Build Coastguard Worker 
823*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_REGEXP_ENABLED
824*6777b538SAndroid Build Coastguard Worker /**
825*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderValidatePush:
826*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
827*6777b538SAndroid Build Coastguard Worker  *
828*6777b538SAndroid Build Coastguard Worker  * Push the current node for validation
829*6777b538SAndroid Build Coastguard Worker  */
830*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderValidatePush(xmlTextReaderPtr reader)831*6777b538SAndroid Build Coastguard Worker xmlTextReaderValidatePush(xmlTextReaderPtr reader) {
832*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node = reader->node;
833*6777b538SAndroid Build Coastguard Worker 
834*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
835*6777b538SAndroid Build Coastguard Worker     if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) &&
836*6777b538SAndroid Build Coastguard Worker         (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) {
837*6777b538SAndroid Build Coastguard Worker 	if ((node->ns == NULL) || (node->ns->prefix == NULL)) {
838*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->valid &= xmlValidatePushElement(&reader->ctxt->vctxt,
839*6777b538SAndroid Build Coastguard Worker 				    reader->ctxt->myDoc, node, node->name);
840*6777b538SAndroid Build Coastguard Worker 	} else {
841*6777b538SAndroid Build Coastguard Worker 	    /* TODO use the BuildQName interface */
842*6777b538SAndroid Build Coastguard Worker 	    xmlChar *qname;
843*6777b538SAndroid Build Coastguard Worker 
844*6777b538SAndroid Build Coastguard Worker 	    qname = xmlStrdup(node->ns->prefix);
845*6777b538SAndroid Build Coastguard Worker             if (qname == NULL) {
846*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderErrMemory(reader);
847*6777b538SAndroid Build Coastguard Worker                 return(-1);
848*6777b538SAndroid Build Coastguard Worker             }
849*6777b538SAndroid Build Coastguard Worker 	    qname = xmlStrcat(qname, BAD_CAST ":");
850*6777b538SAndroid Build Coastguard Worker             if (qname == NULL) {
851*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderErrMemory(reader);
852*6777b538SAndroid Build Coastguard Worker                 return(-1);
853*6777b538SAndroid Build Coastguard Worker             }
854*6777b538SAndroid Build Coastguard Worker 	    qname = xmlStrcat(qname, node->name);
855*6777b538SAndroid Build Coastguard Worker             if (qname == NULL) {
856*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderErrMemory(reader);
857*6777b538SAndroid Build Coastguard Worker                 return(-1);
858*6777b538SAndroid Build Coastguard Worker             }
859*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->valid &= xmlValidatePushElement(&reader->ctxt->vctxt,
860*6777b538SAndroid Build Coastguard Worker 				    reader->ctxt->myDoc, node, qname);
861*6777b538SAndroid Build Coastguard Worker 	    xmlFree(qname);
862*6777b538SAndroid Build Coastguard Worker 	}
863*6777b538SAndroid Build Coastguard Worker         /*if (reader->ctxt->errNo == XML_ERR_NO_MEMORY) {
864*6777b538SAndroid Build Coastguard Worker             reader->mode = XML_TEXTREADER_MODE_ERROR;
865*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_ERROR;
866*6777b538SAndroid Build Coastguard Worker             return(-1);
867*6777b538SAndroid Build Coastguard Worker         }*/
868*6777b538SAndroid Build Coastguard Worker     }
869*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
870*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
871*6777b538SAndroid Build Coastguard Worker     if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) &&
872*6777b538SAndroid Build Coastguard Worker                (reader->rngValidCtxt != NULL)) {
873*6777b538SAndroid Build Coastguard Worker 	int ret;
874*6777b538SAndroid Build Coastguard Worker 
875*6777b538SAndroid Build Coastguard Worker 	if (reader->rngFullNode != NULL) return(0);
876*6777b538SAndroid Build Coastguard Worker 	ret = xmlRelaxNGValidatePushElement(reader->rngValidCtxt,
877*6777b538SAndroid Build Coastguard Worker 	                                    reader->ctxt->myDoc,
878*6777b538SAndroid Build Coastguard Worker 					    node);
879*6777b538SAndroid Build Coastguard Worker 	if (ret == 0) {
880*6777b538SAndroid Build Coastguard Worker 	    /*
881*6777b538SAndroid Build Coastguard Worker 	     * this element requires a full tree
882*6777b538SAndroid Build Coastguard Worker 	     */
883*6777b538SAndroid Build Coastguard Worker 	    node = xmlTextReaderExpand(reader);
884*6777b538SAndroid Build Coastguard Worker 	    if (node == NULL) {
885*6777b538SAndroid Build Coastguard Worker 	        ret = -1;
886*6777b538SAndroid Build Coastguard Worker 	    } else {
887*6777b538SAndroid Build Coastguard Worker 		ret = xmlRelaxNGValidateFullElement(reader->rngValidCtxt,
888*6777b538SAndroid Build Coastguard Worker 						    reader->ctxt->myDoc,
889*6777b538SAndroid Build Coastguard Worker 						    node);
890*6777b538SAndroid Build Coastguard Worker 		reader->rngFullNode = node;
891*6777b538SAndroid Build Coastguard Worker 	    }
892*6777b538SAndroid Build Coastguard Worker 	}
893*6777b538SAndroid Build Coastguard Worker 	if (ret != 1)
894*6777b538SAndroid Build Coastguard Worker 	    reader->rngValidErrors++;
895*6777b538SAndroid Build Coastguard Worker     }
896*6777b538SAndroid Build Coastguard Worker #endif
897*6777b538SAndroid Build Coastguard Worker 
898*6777b538SAndroid Build Coastguard Worker     return(0);
899*6777b538SAndroid Build Coastguard Worker }
900*6777b538SAndroid Build Coastguard Worker 
901*6777b538SAndroid Build Coastguard Worker /**
902*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderValidateCData:
903*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
904*6777b538SAndroid Build Coastguard Worker  * @data:  pointer to the CData
905*6777b538SAndroid Build Coastguard Worker  * @len:  length of the CData block in bytes.
906*6777b538SAndroid Build Coastguard Worker  *
907*6777b538SAndroid Build Coastguard Worker  * Push some CData for validation
908*6777b538SAndroid Build Coastguard Worker  */
909*6777b538SAndroid Build Coastguard Worker static void
xmlTextReaderValidateCData(xmlTextReaderPtr reader,const xmlChar * data,int len)910*6777b538SAndroid Build Coastguard Worker xmlTextReaderValidateCData(xmlTextReaderPtr reader,
911*6777b538SAndroid Build Coastguard Worker                            const xmlChar *data, int len) {
912*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
913*6777b538SAndroid Build Coastguard Worker     if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) &&
914*6777b538SAndroid Build Coastguard Worker         (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) {
915*6777b538SAndroid Build Coastguard Worker 	reader->ctxt->valid &= xmlValidatePushCData(&reader->ctxt->vctxt,
916*6777b538SAndroid Build Coastguard Worker 	                                            data, len);
917*6777b538SAndroid Build Coastguard Worker     }
918*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
919*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
920*6777b538SAndroid Build Coastguard Worker     if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) &&
921*6777b538SAndroid Build Coastguard Worker                (reader->rngValidCtxt != NULL)) {
922*6777b538SAndroid Build Coastguard Worker 	int ret;
923*6777b538SAndroid Build Coastguard Worker 
924*6777b538SAndroid Build Coastguard Worker 	if (reader->rngFullNode != NULL) return;
925*6777b538SAndroid Build Coastguard Worker 	ret = xmlRelaxNGValidatePushCData(reader->rngValidCtxt, data, len);
926*6777b538SAndroid Build Coastguard Worker 	if (ret != 1)
927*6777b538SAndroid Build Coastguard Worker 	    reader->rngValidErrors++;
928*6777b538SAndroid Build Coastguard Worker     }
929*6777b538SAndroid Build Coastguard Worker #endif
930*6777b538SAndroid Build Coastguard Worker }
931*6777b538SAndroid Build Coastguard Worker 
932*6777b538SAndroid Build Coastguard Worker /**
933*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderValidatePop:
934*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
935*6777b538SAndroid Build Coastguard Worker  *
936*6777b538SAndroid Build Coastguard Worker  * Pop the current node from validation
937*6777b538SAndroid Build Coastguard Worker  */
938*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderValidatePop(xmlTextReaderPtr reader)939*6777b538SAndroid Build Coastguard Worker xmlTextReaderValidatePop(xmlTextReaderPtr reader) {
940*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node = reader->node;
941*6777b538SAndroid Build Coastguard Worker 
942*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
943*6777b538SAndroid Build Coastguard Worker     if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) &&
944*6777b538SAndroid Build Coastguard Worker         (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) {
945*6777b538SAndroid Build Coastguard Worker 	if ((node->ns == NULL) || (node->ns->prefix == NULL)) {
946*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->valid &= xmlValidatePopElement(&reader->ctxt->vctxt,
947*6777b538SAndroid Build Coastguard Worker 				    reader->ctxt->myDoc, node, node->name);
948*6777b538SAndroid Build Coastguard Worker 	} else {
949*6777b538SAndroid Build Coastguard Worker 	    /* TODO use the BuildQName interface */
950*6777b538SAndroid Build Coastguard Worker 	    xmlChar *qname;
951*6777b538SAndroid Build Coastguard Worker 
952*6777b538SAndroid Build Coastguard Worker 	    qname = xmlStrdup(node->ns->prefix);
953*6777b538SAndroid Build Coastguard Worker             if (qname == NULL) {
954*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderErrMemory(reader);
955*6777b538SAndroid Build Coastguard Worker                 return(-1);
956*6777b538SAndroid Build Coastguard Worker             }
957*6777b538SAndroid Build Coastguard Worker 	    qname = xmlStrcat(qname, BAD_CAST ":");
958*6777b538SAndroid Build Coastguard Worker             if (qname == NULL) {
959*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderErrMemory(reader);
960*6777b538SAndroid Build Coastguard Worker                 return(-1);
961*6777b538SAndroid Build Coastguard Worker             }
962*6777b538SAndroid Build Coastguard Worker 	    qname = xmlStrcat(qname, node->name);
963*6777b538SAndroid Build Coastguard Worker             if (qname == NULL) {
964*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderErrMemory(reader);
965*6777b538SAndroid Build Coastguard Worker                 return(-1);
966*6777b538SAndroid Build Coastguard Worker             }
967*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->valid &= xmlValidatePopElement(&reader->ctxt->vctxt,
968*6777b538SAndroid Build Coastguard Worker 				    reader->ctxt->myDoc, node, qname);
969*6777b538SAndroid Build Coastguard Worker 	    xmlFree(qname);
970*6777b538SAndroid Build Coastguard Worker 	}
971*6777b538SAndroid Build Coastguard Worker         /*if (reader->ctxt->errNo == XML_ERR_NO_MEMORY) {
972*6777b538SAndroid Build Coastguard Worker             reader->mode = XML_TEXTREADER_MODE_ERROR;
973*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_ERROR;
974*6777b538SAndroid Build Coastguard Worker             return(-1);
975*6777b538SAndroid Build Coastguard Worker         }*/
976*6777b538SAndroid Build Coastguard Worker     }
977*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
978*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
979*6777b538SAndroid Build Coastguard Worker     if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) &&
980*6777b538SAndroid Build Coastguard Worker                (reader->rngValidCtxt != NULL)) {
981*6777b538SAndroid Build Coastguard Worker 	int ret;
982*6777b538SAndroid Build Coastguard Worker 
983*6777b538SAndroid Build Coastguard Worker 	if (reader->rngFullNode != NULL) {
984*6777b538SAndroid Build Coastguard Worker 	    if (node == reader->rngFullNode)
985*6777b538SAndroid Build Coastguard Worker 	        reader->rngFullNode = NULL;
986*6777b538SAndroid Build Coastguard Worker 	    return(0);
987*6777b538SAndroid Build Coastguard Worker 	}
988*6777b538SAndroid Build Coastguard Worker 	ret = xmlRelaxNGValidatePopElement(reader->rngValidCtxt,
989*6777b538SAndroid Build Coastguard Worker 	                                   reader->ctxt->myDoc,
990*6777b538SAndroid Build Coastguard Worker 					   node);
991*6777b538SAndroid Build Coastguard Worker 	if (ret != 1)
992*6777b538SAndroid Build Coastguard Worker 	    reader->rngValidErrors++;
993*6777b538SAndroid Build Coastguard Worker     }
994*6777b538SAndroid Build Coastguard Worker #endif
995*6777b538SAndroid Build Coastguard Worker 
996*6777b538SAndroid Build Coastguard Worker     return(0);
997*6777b538SAndroid Build Coastguard Worker }
998*6777b538SAndroid Build Coastguard Worker 
999*6777b538SAndroid Build Coastguard Worker /**
1000*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderValidateEntity:
1001*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1002*6777b538SAndroid Build Coastguard Worker  *
1003*6777b538SAndroid Build Coastguard Worker  * Handle the validation when an entity reference is encountered and
1004*6777b538SAndroid Build Coastguard Worker  * entity substitution is not activated. As a result the parser interface
1005*6777b538SAndroid Build Coastguard Worker  * must walk through the entity and do the validation calls
1006*6777b538SAndroid Build Coastguard Worker  */
1007*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderValidateEntity(xmlTextReaderPtr reader)1008*6777b538SAndroid Build Coastguard Worker xmlTextReaderValidateEntity(xmlTextReaderPtr reader) {
1009*6777b538SAndroid Build Coastguard Worker     xmlNodePtr oldnode = reader->node;
1010*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node = reader->node;
1011*6777b538SAndroid Build Coastguard Worker 
1012*6777b538SAndroid Build Coastguard Worker     do {
1013*6777b538SAndroid Build Coastguard Worker 	if (node->type == XML_ENTITY_REF_NODE) {
1014*6777b538SAndroid Build Coastguard Worker 	    if ((node->children != NULL) &&
1015*6777b538SAndroid Build Coastguard Worker 		(node->children->type == XML_ENTITY_DECL) &&
1016*6777b538SAndroid Build Coastguard Worker 		(node->children->children != NULL)) {
1017*6777b538SAndroid Build Coastguard Worker 		if (xmlTextReaderEntPush(reader, node) < 0) {
1018*6777b538SAndroid Build Coastguard Worker                     if (node == oldnode)
1019*6777b538SAndroid Build Coastguard Worker                         break;
1020*6777b538SAndroid Build Coastguard Worker                     goto skip_children;
1021*6777b538SAndroid Build Coastguard Worker                 }
1022*6777b538SAndroid Build Coastguard Worker 		node = node->children->children;
1023*6777b538SAndroid Build Coastguard Worker 		continue;
1024*6777b538SAndroid Build Coastguard Worker 	    } else {
1025*6777b538SAndroid Build Coastguard Worker 		/*
1026*6777b538SAndroid Build Coastguard Worker 		 * The error has probably been raised already.
1027*6777b538SAndroid Build Coastguard Worker 		 */
1028*6777b538SAndroid Build Coastguard Worker 		if (node == oldnode)
1029*6777b538SAndroid Build Coastguard Worker 		    break;
1030*6777b538SAndroid Build Coastguard Worker                 goto skip_children;
1031*6777b538SAndroid Build Coastguard Worker 	    }
1032*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_REGEXP_ENABLED
1033*6777b538SAndroid Build Coastguard Worker 	} else if (node->type == XML_ELEMENT_NODE) {
1034*6777b538SAndroid Build Coastguard Worker 	    reader->node = node;
1035*6777b538SAndroid Build Coastguard Worker 	    if (xmlTextReaderValidatePush(reader) < 0)
1036*6777b538SAndroid Build Coastguard Worker                 return(-1);
1037*6777b538SAndroid Build Coastguard Worker 	} else if ((node->type == XML_TEXT_NODE) ||
1038*6777b538SAndroid Build Coastguard Worker 		   (node->type == XML_CDATA_SECTION_NODE)) {
1039*6777b538SAndroid Build Coastguard Worker             xmlTextReaderValidateCData(reader, node->content,
1040*6777b538SAndroid Build Coastguard Worker 	                               xmlStrlen(node->content));
1041*6777b538SAndroid Build Coastguard Worker #endif
1042*6777b538SAndroid Build Coastguard Worker 	}
1043*6777b538SAndroid Build Coastguard Worker 
1044*6777b538SAndroid Build Coastguard Worker 	/*
1045*6777b538SAndroid Build Coastguard Worker 	 * go to next node
1046*6777b538SAndroid Build Coastguard Worker 	 */
1047*6777b538SAndroid Build Coastguard Worker 	if (node->children != NULL) {
1048*6777b538SAndroid Build Coastguard Worker 	    node = node->children;
1049*6777b538SAndroid Build Coastguard Worker 	    continue;
1050*6777b538SAndroid Build Coastguard Worker 	} else if (node->type == XML_ELEMENT_NODE) {
1051*6777b538SAndroid Build Coastguard Worker 	    if (xmlTextReaderValidatePop(reader) < 0)
1052*6777b538SAndroid Build Coastguard Worker                 return(-1);
1053*6777b538SAndroid Build Coastguard Worker 	}
1054*6777b538SAndroid Build Coastguard Worker skip_children:
1055*6777b538SAndroid Build Coastguard Worker 	if (node->next != NULL) {
1056*6777b538SAndroid Build Coastguard Worker 	    node = node->next;
1057*6777b538SAndroid Build Coastguard Worker 	    continue;
1058*6777b538SAndroid Build Coastguard Worker 	}
1059*6777b538SAndroid Build Coastguard Worker 	do {
1060*6777b538SAndroid Build Coastguard Worker 	    node = node->parent;
1061*6777b538SAndroid Build Coastguard Worker 	    if (node->type == XML_ELEMENT_NODE) {
1062*6777b538SAndroid Build Coastguard Worker 	        xmlNodePtr tmp;
1063*6777b538SAndroid Build Coastguard Worker 		if (reader->entNr == 0) {
1064*6777b538SAndroid Build Coastguard Worker 		    while ((tmp = node->last) != NULL) {
1065*6777b538SAndroid Build Coastguard Worker 			if ((tmp->extra & NODE_IS_PRESERVED) == 0) {
1066*6777b538SAndroid Build Coastguard Worker 			    xmlUnlinkNode(tmp);
1067*6777b538SAndroid Build Coastguard Worker 			    xmlTextReaderFreeNode(reader, tmp);
1068*6777b538SAndroid Build Coastguard Worker 			} else
1069*6777b538SAndroid Build Coastguard Worker 			    break;
1070*6777b538SAndroid Build Coastguard Worker 		    }
1071*6777b538SAndroid Build Coastguard Worker 		}
1072*6777b538SAndroid Build Coastguard Worker 		reader->node = node;
1073*6777b538SAndroid Build Coastguard Worker 		if (xmlTextReaderValidatePop(reader) < 0)
1074*6777b538SAndroid Build Coastguard Worker                     return(-1);
1075*6777b538SAndroid Build Coastguard Worker 	    }
1076*6777b538SAndroid Build Coastguard Worker 	    if ((node->type == XML_ENTITY_DECL) &&
1077*6777b538SAndroid Build Coastguard Worker 		(reader->ent != NULL) && (reader->ent->children == node)) {
1078*6777b538SAndroid Build Coastguard Worker 		node = xmlTextReaderEntPop(reader);
1079*6777b538SAndroid Build Coastguard Worker 	    }
1080*6777b538SAndroid Build Coastguard Worker 	    if (node == oldnode)
1081*6777b538SAndroid Build Coastguard Worker 		break;
1082*6777b538SAndroid Build Coastguard Worker 	    if (node->next != NULL) {
1083*6777b538SAndroid Build Coastguard Worker 		node = node->next;
1084*6777b538SAndroid Build Coastguard Worker 		break;
1085*6777b538SAndroid Build Coastguard Worker 	    }
1086*6777b538SAndroid Build Coastguard Worker 	} while ((node != NULL) && (node != oldnode));
1087*6777b538SAndroid Build Coastguard Worker     } while ((node != NULL) && (node != oldnode));
1088*6777b538SAndroid Build Coastguard Worker     reader->node = oldnode;
1089*6777b538SAndroid Build Coastguard Worker 
1090*6777b538SAndroid Build Coastguard Worker     return(0);
1091*6777b538SAndroid Build Coastguard Worker }
1092*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_REGEXP_ENABLED */
1093*6777b538SAndroid Build Coastguard Worker 
1094*6777b538SAndroid Build Coastguard Worker 
1095*6777b538SAndroid Build Coastguard Worker /**
1096*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderGetSuccessor:
1097*6777b538SAndroid Build Coastguard Worker  * @cur:  the current node
1098*6777b538SAndroid Build Coastguard Worker  *
1099*6777b538SAndroid Build Coastguard Worker  * Get the successor of a node if available.
1100*6777b538SAndroid Build Coastguard Worker  *
1101*6777b538SAndroid Build Coastguard Worker  * Returns the successor node or NULL
1102*6777b538SAndroid Build Coastguard Worker  */
1103*6777b538SAndroid Build Coastguard Worker static xmlNodePtr
xmlTextReaderGetSuccessor(xmlNodePtr cur)1104*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetSuccessor(xmlNodePtr cur) {
1105*6777b538SAndroid Build Coastguard Worker     if (cur == NULL) return(NULL) ; /* ERROR */
1106*6777b538SAndroid Build Coastguard Worker     if (cur->next != NULL) return(cur->next) ;
1107*6777b538SAndroid Build Coastguard Worker     do {
1108*6777b538SAndroid Build Coastguard Worker         cur = cur->parent;
1109*6777b538SAndroid Build Coastguard Worker         if (cur == NULL) break;
1110*6777b538SAndroid Build Coastguard Worker         if (cur->next != NULL) return(cur->next);
1111*6777b538SAndroid Build Coastguard Worker     } while (cur != NULL);
1112*6777b538SAndroid Build Coastguard Worker     return(cur);
1113*6777b538SAndroid Build Coastguard Worker }
1114*6777b538SAndroid Build Coastguard Worker 
1115*6777b538SAndroid Build Coastguard Worker /**
1116*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderDoExpand:
1117*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1118*6777b538SAndroid Build Coastguard Worker  *
1119*6777b538SAndroid Build Coastguard Worker  * Makes sure that the current node is fully read as well as all its
1120*6777b538SAndroid Build Coastguard Worker  * descendant. It means the full DOM subtree must be available at the
1121*6777b538SAndroid Build Coastguard Worker  * end of the call.
1122*6777b538SAndroid Build Coastguard Worker  *
1123*6777b538SAndroid Build Coastguard Worker  * Returns 1 if the node was expanded successfully, 0 if there is no more
1124*6777b538SAndroid Build Coastguard Worker  *          nodes to read, or -1 in case of error
1125*6777b538SAndroid Build Coastguard Worker  */
1126*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderDoExpand(xmlTextReaderPtr reader)1127*6777b538SAndroid Build Coastguard Worker xmlTextReaderDoExpand(xmlTextReaderPtr reader) {
1128*6777b538SAndroid Build Coastguard Worker     int val;
1129*6777b538SAndroid Build Coastguard Worker 
1130*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL) || (reader->ctxt == NULL))
1131*6777b538SAndroid Build Coastguard Worker         return(-1);
1132*6777b538SAndroid Build Coastguard Worker     do {
1133*6777b538SAndroid Build Coastguard Worker 	if (PARSER_STOPPED(reader->ctxt))
1134*6777b538SAndroid Build Coastguard Worker             return(1);
1135*6777b538SAndroid Build Coastguard Worker 
1136*6777b538SAndroid Build Coastguard Worker         if (xmlTextReaderGetSuccessor(reader->node) != NULL)
1137*6777b538SAndroid Build Coastguard Worker 	    return(1);
1138*6777b538SAndroid Build Coastguard Worker 	if (reader->ctxt->nodeNr < reader->depth)
1139*6777b538SAndroid Build Coastguard Worker 	    return(1);
1140*6777b538SAndroid Build Coastguard Worker 	if (reader->mode == XML_TEXTREADER_MODE_EOF)
1141*6777b538SAndroid Build Coastguard Worker 	    return(1);
1142*6777b538SAndroid Build Coastguard Worker 	val = xmlTextReaderPushData(reader);
1143*6777b538SAndroid Build Coastguard Worker 	if (val < 0){
1144*6777b538SAndroid Build Coastguard Worker 	    reader->mode = XML_TEXTREADER_MODE_ERROR;
1145*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_ERROR;
1146*6777b538SAndroid Build Coastguard Worker 	    return(-1);
1147*6777b538SAndroid Build Coastguard Worker 	}
1148*6777b538SAndroid Build Coastguard Worker     } while(reader->mode != XML_TEXTREADER_MODE_EOF);
1149*6777b538SAndroid Build Coastguard Worker     return(1);
1150*6777b538SAndroid Build Coastguard Worker }
1151*6777b538SAndroid Build Coastguard Worker 
1152*6777b538SAndroid Build Coastguard Worker /**
1153*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderCollectSiblings:
1154*6777b538SAndroid Build Coastguard Worker  * @node:    the first child
1155*6777b538SAndroid Build Coastguard Worker  *
1156*6777b538SAndroid Build Coastguard Worker  *  Traverse depth-first through all sibling nodes and their children
1157*6777b538SAndroid Build Coastguard Worker  *  nodes and concatenate their content. This is an auxiliary function
1158*6777b538SAndroid Build Coastguard Worker  *  to xmlTextReaderReadString.
1159*6777b538SAndroid Build Coastguard Worker  *
1160*6777b538SAndroid Build Coastguard Worker  *  Returns a string containing the content, or NULL in case of error.
1161*6777b538SAndroid Build Coastguard Worker  */
1162*6777b538SAndroid Build Coastguard Worker static xmlChar *
xmlTextReaderCollectSiblings(xmlNodePtr node)1163*6777b538SAndroid Build Coastguard Worker xmlTextReaderCollectSiblings(xmlNodePtr node)
1164*6777b538SAndroid Build Coastguard Worker {
1165*6777b538SAndroid Build Coastguard Worker     xmlBufferPtr buffer;
1166*6777b538SAndroid Build Coastguard Worker     xmlChar *ret;
1167*6777b538SAndroid Build Coastguard Worker 
1168*6777b538SAndroid Build Coastguard Worker     if ((node == NULL) || (node->type == XML_NAMESPACE_DECL))
1169*6777b538SAndroid Build Coastguard Worker         return(NULL);
1170*6777b538SAndroid Build Coastguard Worker 
1171*6777b538SAndroid Build Coastguard Worker     buffer = xmlBufferCreate();
1172*6777b538SAndroid Build Coastguard Worker     if (buffer == NULL)
1173*6777b538SAndroid Build Coastguard Worker        return NULL;
1174*6777b538SAndroid Build Coastguard Worker     xmlBufferSetAllocationScheme(buffer, XML_BUFFER_ALLOC_DOUBLEIT);
1175*6777b538SAndroid Build Coastguard Worker 
1176*6777b538SAndroid Build Coastguard Worker     for ( ; node != NULL; node = node->next) {
1177*6777b538SAndroid Build Coastguard Worker        switch (node->type) {
1178*6777b538SAndroid Build Coastguard Worker        case XML_TEXT_NODE:
1179*6777b538SAndroid Build Coastguard Worker        case XML_CDATA_SECTION_NODE:
1180*6777b538SAndroid Build Coastguard Worker            xmlBufferCat(buffer, node->content);
1181*6777b538SAndroid Build Coastguard Worker            break;
1182*6777b538SAndroid Build Coastguard Worker        case XML_ELEMENT_NODE: {
1183*6777b538SAndroid Build Coastguard Worker            xmlChar *tmp;
1184*6777b538SAndroid Build Coastguard Worker 
1185*6777b538SAndroid Build Coastguard Worker 	   tmp = xmlTextReaderCollectSiblings(node->children);
1186*6777b538SAndroid Build Coastguard Worker            xmlBufferCat(buffer, tmp);
1187*6777b538SAndroid Build Coastguard Worker 	   xmlFree(tmp);
1188*6777b538SAndroid Build Coastguard Worker 	   break;
1189*6777b538SAndroid Build Coastguard Worker        }
1190*6777b538SAndroid Build Coastguard Worker        default:
1191*6777b538SAndroid Build Coastguard Worker            break;
1192*6777b538SAndroid Build Coastguard Worker        }
1193*6777b538SAndroid Build Coastguard Worker     }
1194*6777b538SAndroid Build Coastguard Worker     ret = buffer->content;
1195*6777b538SAndroid Build Coastguard Worker     buffer->content = NULL;
1196*6777b538SAndroid Build Coastguard Worker     xmlBufferFree(buffer);
1197*6777b538SAndroid Build Coastguard Worker     return(ret);
1198*6777b538SAndroid Build Coastguard Worker }
1199*6777b538SAndroid Build Coastguard Worker 
1200*6777b538SAndroid Build Coastguard Worker /**
1201*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderRead:
1202*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1203*6777b538SAndroid Build Coastguard Worker  *
1204*6777b538SAndroid Build Coastguard Worker  *  Moves the position of the current instance to the next node in
1205*6777b538SAndroid Build Coastguard Worker  *  the stream, exposing its properties.
1206*6777b538SAndroid Build Coastguard Worker  *
1207*6777b538SAndroid Build Coastguard Worker  *  Returns 1 if the node was read successfully, 0 if there is no more
1208*6777b538SAndroid Build Coastguard Worker  *          nodes to read, or -1 in case of error
1209*6777b538SAndroid Build Coastguard Worker  */
1210*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderRead(xmlTextReaderPtr reader)1211*6777b538SAndroid Build Coastguard Worker xmlTextReaderRead(xmlTextReaderPtr reader) {
1212*6777b538SAndroid Build Coastguard Worker     int val, olddepth = 0;
1213*6777b538SAndroid Build Coastguard Worker     xmlTextReaderState oldstate = XML_TEXTREADER_START;
1214*6777b538SAndroid Build Coastguard Worker     xmlNodePtr oldnode = NULL;
1215*6777b538SAndroid Build Coastguard Worker 
1216*6777b538SAndroid Build Coastguard Worker 
1217*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
1218*6777b538SAndroid Build Coastguard Worker 	return(-1);
1219*6777b538SAndroid Build Coastguard Worker     reader->curnode = NULL;
1220*6777b538SAndroid Build Coastguard Worker     if (reader->doc != NULL)
1221*6777b538SAndroid Build Coastguard Worker         return(xmlTextReaderReadTree(reader));
1222*6777b538SAndroid Build Coastguard Worker     if (reader->ctxt == NULL)
1223*6777b538SAndroid Build Coastguard Worker 	return(-1);
1224*6777b538SAndroid Build Coastguard Worker     if (reader->state == XML_TEXTREADER_ERROR)
1225*6777b538SAndroid Build Coastguard Worker         return(-1);
1226*6777b538SAndroid Build Coastguard Worker 
1227*6777b538SAndroid Build Coastguard Worker     if (reader->mode == XML_TEXTREADER_MODE_INITIAL) {
1228*6777b538SAndroid Build Coastguard Worker 	reader->mode = XML_TEXTREADER_MODE_INTERACTIVE;
1229*6777b538SAndroid Build Coastguard Worker 	/*
1230*6777b538SAndroid Build Coastguard Worker 	 * Initial state
1231*6777b538SAndroid Build Coastguard Worker 	 */
1232*6777b538SAndroid Build Coastguard Worker 	do {
1233*6777b538SAndroid Build Coastguard Worker 	    val = xmlTextReaderPushData(reader);
1234*6777b538SAndroid Build Coastguard Worker             if (val < 0) {
1235*6777b538SAndroid Build Coastguard Worker                 reader->mode = XML_TEXTREADER_MODE_ERROR;
1236*6777b538SAndroid Build Coastguard Worker                 reader->state = XML_TEXTREADER_ERROR;
1237*6777b538SAndroid Build Coastguard Worker                 return(-1);
1238*6777b538SAndroid Build Coastguard Worker             }
1239*6777b538SAndroid Build Coastguard Worker 	} while ((reader->ctxt->node == NULL) &&
1240*6777b538SAndroid Build Coastguard Worker 		 ((reader->mode != XML_TEXTREADER_MODE_EOF) &&
1241*6777b538SAndroid Build Coastguard Worker 		  (reader->state != XML_TEXTREADER_DONE)));
1242*6777b538SAndroid Build Coastguard Worker 	if (reader->ctxt->node == NULL) {
1243*6777b538SAndroid Build Coastguard Worker 	    if (reader->ctxt->myDoc != NULL) {
1244*6777b538SAndroid Build Coastguard Worker 		reader->node = reader->ctxt->myDoc->children;
1245*6777b538SAndroid Build Coastguard Worker 	    }
1246*6777b538SAndroid Build Coastguard Worker 	    if (reader->node == NULL) {
1247*6777b538SAndroid Build Coastguard Worker                 reader->mode = XML_TEXTREADER_MODE_ERROR;
1248*6777b538SAndroid Build Coastguard Worker                 reader->state = XML_TEXTREADER_ERROR;
1249*6777b538SAndroid Build Coastguard Worker 		return(-1);
1250*6777b538SAndroid Build Coastguard Worker 	    }
1251*6777b538SAndroid Build Coastguard Worker 	    reader->state = XML_TEXTREADER_ELEMENT;
1252*6777b538SAndroid Build Coastguard Worker 	} else {
1253*6777b538SAndroid Build Coastguard Worker 	    if (reader->ctxt->myDoc != NULL) {
1254*6777b538SAndroid Build Coastguard Worker 		reader->node = reader->ctxt->myDoc->children;
1255*6777b538SAndroid Build Coastguard Worker 	    }
1256*6777b538SAndroid Build Coastguard Worker 	    if (reader->node == NULL)
1257*6777b538SAndroid Build Coastguard Worker 		reader->node = reader->ctxt->nodeTab[0];
1258*6777b538SAndroid Build Coastguard Worker 	    reader->state = XML_TEXTREADER_ELEMENT;
1259*6777b538SAndroid Build Coastguard Worker 	}
1260*6777b538SAndroid Build Coastguard Worker 	reader->depth = 0;
1261*6777b538SAndroid Build Coastguard Worker 	reader->ctxt->parseMode = XML_PARSE_READER;
1262*6777b538SAndroid Build Coastguard Worker 	goto node_found;
1263*6777b538SAndroid Build Coastguard Worker     }
1264*6777b538SAndroid Build Coastguard Worker     oldstate = reader->state;
1265*6777b538SAndroid Build Coastguard Worker     olddepth = reader->ctxt->nodeNr;
1266*6777b538SAndroid Build Coastguard Worker     oldnode = reader->node;
1267*6777b538SAndroid Build Coastguard Worker 
1268*6777b538SAndroid Build Coastguard Worker get_next_node:
1269*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL) {
1270*6777b538SAndroid Build Coastguard Worker 	if (reader->mode == XML_TEXTREADER_MODE_EOF) {
1271*6777b538SAndroid Build Coastguard Worker 	    return(0);
1272*6777b538SAndroid Build Coastguard Worker         } else {
1273*6777b538SAndroid Build Coastguard Worker             reader->mode = XML_TEXTREADER_MODE_ERROR;
1274*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_ERROR;
1275*6777b538SAndroid Build Coastguard Worker 	    return(-1);
1276*6777b538SAndroid Build Coastguard Worker         }
1277*6777b538SAndroid Build Coastguard Worker     }
1278*6777b538SAndroid Build Coastguard Worker 
1279*6777b538SAndroid Build Coastguard Worker     /*
1280*6777b538SAndroid Build Coastguard Worker      * If we are not backtracking on ancestors or examined nodes,
1281*6777b538SAndroid Build Coastguard Worker      * that the parser didn't finished or that we aren't at the end
1282*6777b538SAndroid Build Coastguard Worker      * of stream, continue processing.
1283*6777b538SAndroid Build Coastguard Worker      */
1284*6777b538SAndroid Build Coastguard Worker     while ((reader->node != NULL) && (reader->node->next == NULL) &&
1285*6777b538SAndroid Build Coastguard Worker 	   (reader->ctxt->nodeNr == olddepth) &&
1286*6777b538SAndroid Build Coastguard Worker            ((oldstate == XML_TEXTREADER_BACKTRACK) ||
1287*6777b538SAndroid Build Coastguard Worker             (reader->node->children == NULL) ||
1288*6777b538SAndroid Build Coastguard Worker 	    (reader->node->type == XML_ENTITY_REF_NODE) ||
1289*6777b538SAndroid Build Coastguard Worker 	    ((reader->node->children != NULL) &&
1290*6777b538SAndroid Build Coastguard Worker 	     (reader->node->children->type == XML_TEXT_NODE) &&
1291*6777b538SAndroid Build Coastguard Worker 	     (reader->node->children->next == NULL)) ||
1292*6777b538SAndroid Build Coastguard Worker 	    (reader->node->type == XML_DTD_NODE) ||
1293*6777b538SAndroid Build Coastguard Worker 	    (reader->node->type == XML_DOCUMENT_NODE) ||
1294*6777b538SAndroid Build Coastguard Worker 	    (reader->node->type == XML_HTML_DOCUMENT_NODE)) &&
1295*6777b538SAndroid Build Coastguard Worker 	   ((reader->ctxt->node == NULL) ||
1296*6777b538SAndroid Build Coastguard Worker 	    (reader->ctxt->node == reader->node) ||
1297*6777b538SAndroid Build Coastguard Worker 	    (reader->ctxt->node == reader->node->parent)) &&
1298*6777b538SAndroid Build Coastguard Worker 	   (reader->ctxt->instate != XML_PARSER_EOF) &&
1299*6777b538SAndroid Build Coastguard Worker 	   (PARSER_STOPPED(reader->ctxt) == 0)) {
1300*6777b538SAndroid Build Coastguard Worker 	val = xmlTextReaderPushData(reader);
1301*6777b538SAndroid Build Coastguard Worker 	if (val < 0) {
1302*6777b538SAndroid Build Coastguard Worker             reader->mode = XML_TEXTREADER_MODE_ERROR;
1303*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_ERROR;
1304*6777b538SAndroid Build Coastguard Worker 	    return(-1);
1305*6777b538SAndroid Build Coastguard Worker         }
1306*6777b538SAndroid Build Coastguard Worker 	if (reader->node == NULL)
1307*6777b538SAndroid Build Coastguard Worker 	    goto node_end;
1308*6777b538SAndroid Build Coastguard Worker     }
1309*6777b538SAndroid Build Coastguard Worker     if (oldstate != XML_TEXTREADER_BACKTRACK) {
1310*6777b538SAndroid Build Coastguard Worker 	if ((reader->node->children != NULL) &&
1311*6777b538SAndroid Build Coastguard Worker 	    (reader->node->type != XML_ENTITY_REF_NODE) &&
1312*6777b538SAndroid Build Coastguard Worker 	    (reader->node->type != XML_XINCLUDE_START) &&
1313*6777b538SAndroid Build Coastguard Worker 	    (reader->node->type != XML_DTD_NODE)) {
1314*6777b538SAndroid Build Coastguard Worker 	    reader->node = reader->node->children;
1315*6777b538SAndroid Build Coastguard Worker 	    reader->depth++;
1316*6777b538SAndroid Build Coastguard Worker 	    reader->state = XML_TEXTREADER_ELEMENT;
1317*6777b538SAndroid Build Coastguard Worker 	    goto node_found;
1318*6777b538SAndroid Build Coastguard Worker 	}
1319*6777b538SAndroid Build Coastguard Worker     }
1320*6777b538SAndroid Build Coastguard Worker     if (reader->node->next != NULL) {
1321*6777b538SAndroid Build Coastguard Worker 	if ((oldstate == XML_TEXTREADER_ELEMENT) &&
1322*6777b538SAndroid Build Coastguard Worker             (reader->node->type == XML_ELEMENT_NODE) &&
1323*6777b538SAndroid Build Coastguard Worker 	    (reader->node->children == NULL) &&
1324*6777b538SAndroid Build Coastguard Worker 	    ((reader->node->extra & NODE_IS_EMPTY) == 0)
1325*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
1326*6777b538SAndroid Build Coastguard Worker 	    && (reader->in_xinclude <= 0)
1327*6777b538SAndroid Build Coastguard Worker #endif
1328*6777b538SAndroid Build Coastguard Worker 	    ) {
1329*6777b538SAndroid Build Coastguard Worker 	    reader->state = XML_TEXTREADER_END;
1330*6777b538SAndroid Build Coastguard Worker 	    goto node_found;
1331*6777b538SAndroid Build Coastguard Worker 	}
1332*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_REGEXP_ENABLED
1333*6777b538SAndroid Build Coastguard Worker 	if ((reader->validate) &&
1334*6777b538SAndroid Build Coastguard Worker 	    (reader->node->type == XML_ELEMENT_NODE))
1335*6777b538SAndroid Build Coastguard Worker 	    if (xmlTextReaderValidatePop(reader) < 0)
1336*6777b538SAndroid Build Coastguard Worker                 return(-1);
1337*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_REGEXP_ENABLED */
1338*6777b538SAndroid Build Coastguard Worker         if ((reader->preserves > 0) &&
1339*6777b538SAndroid Build Coastguard Worker 	    (reader->node->extra & NODE_IS_SPRESERVED))
1340*6777b538SAndroid Build Coastguard Worker 	    reader->preserves--;
1341*6777b538SAndroid Build Coastguard Worker 	reader->node = reader->node->next;
1342*6777b538SAndroid Build Coastguard Worker 	reader->state = XML_TEXTREADER_ELEMENT;
1343*6777b538SAndroid Build Coastguard Worker 
1344*6777b538SAndroid Build Coastguard Worker 	/*
1345*6777b538SAndroid Build Coastguard Worker 	 * Cleanup of the old node
1346*6777b538SAndroid Build Coastguard Worker 	 */
1347*6777b538SAndroid Build Coastguard Worker 	if ((reader->preserves == 0) &&
1348*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
1349*6777b538SAndroid Build Coastguard Worker 	    (reader->in_xinclude == 0) &&
1350*6777b538SAndroid Build Coastguard Worker #endif
1351*6777b538SAndroid Build Coastguard Worker 	    (reader->entNr == 0) &&
1352*6777b538SAndroid Build Coastguard Worker 	    (reader->node->prev != NULL) &&
1353*6777b538SAndroid Build Coastguard Worker             (reader->node->prev->type != XML_DTD_NODE)) {
1354*6777b538SAndroid Build Coastguard Worker 	    xmlNodePtr tmp = reader->node->prev;
1355*6777b538SAndroid Build Coastguard Worker 	    if ((tmp->extra & NODE_IS_PRESERVED) == 0) {
1356*6777b538SAndroid Build Coastguard Worker                 if (oldnode == tmp)
1357*6777b538SAndroid Build Coastguard Worker                     oldnode = NULL;
1358*6777b538SAndroid Build Coastguard Worker 		xmlUnlinkNode(tmp);
1359*6777b538SAndroid Build Coastguard Worker 		xmlTextReaderFreeNode(reader, tmp);
1360*6777b538SAndroid Build Coastguard Worker 	    }
1361*6777b538SAndroid Build Coastguard Worker 	}
1362*6777b538SAndroid Build Coastguard Worker 
1363*6777b538SAndroid Build Coastguard Worker 	goto node_found;
1364*6777b538SAndroid Build Coastguard Worker     }
1365*6777b538SAndroid Build Coastguard Worker     if ((oldstate == XML_TEXTREADER_ELEMENT) &&
1366*6777b538SAndroid Build Coastguard Worker 	(reader->node->type == XML_ELEMENT_NODE) &&
1367*6777b538SAndroid Build Coastguard Worker 	(reader->node->children == NULL) &&
1368*6777b538SAndroid Build Coastguard Worker 	((reader->node->extra & NODE_IS_EMPTY) == 0)) {;
1369*6777b538SAndroid Build Coastguard Worker 	reader->state = XML_TEXTREADER_END;
1370*6777b538SAndroid Build Coastguard Worker 	goto node_found;
1371*6777b538SAndroid Build Coastguard Worker     }
1372*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_REGEXP_ENABLED
1373*6777b538SAndroid Build Coastguard Worker     if ((reader->validate != XML_TEXTREADER_NOT_VALIDATE) &&
1374*6777b538SAndroid Build Coastguard Worker         (reader->node->type == XML_ELEMENT_NODE)) {
1375*6777b538SAndroid Build Coastguard Worker         if (xmlTextReaderValidatePop(reader) < 0)
1376*6777b538SAndroid Build Coastguard Worker             return(-1);
1377*6777b538SAndroid Build Coastguard Worker     }
1378*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_REGEXP_ENABLED */
1379*6777b538SAndroid Build Coastguard Worker     if ((reader->preserves > 0) &&
1380*6777b538SAndroid Build Coastguard Worker 	(reader->node->extra & NODE_IS_SPRESERVED))
1381*6777b538SAndroid Build Coastguard Worker 	reader->preserves--;
1382*6777b538SAndroid Build Coastguard Worker     reader->node = reader->node->parent;
1383*6777b538SAndroid Build Coastguard Worker     if ((reader->node == NULL) ||
1384*6777b538SAndroid Build Coastguard Worker 	(reader->node->type == XML_DOCUMENT_NODE) ||
1385*6777b538SAndroid Build Coastguard Worker 	(reader->node->type == XML_HTML_DOCUMENT_NODE)) {
1386*6777b538SAndroid Build Coastguard Worker 	if (reader->mode != XML_TEXTREADER_MODE_EOF) {
1387*6777b538SAndroid Build Coastguard Worker 	    val = xmlParseChunk(reader->ctxt, "", 0, 1);
1388*6777b538SAndroid Build Coastguard Worker 	    reader->state = XML_TEXTREADER_DONE;
1389*6777b538SAndroid Build Coastguard Worker 	    if (val != 0) {
1390*6777b538SAndroid Build Coastguard Worker                 reader->mode = XML_TEXTREADER_MODE_ERROR;
1391*6777b538SAndroid Build Coastguard Worker                 reader->state = XML_TEXTREADER_ERROR;
1392*6777b538SAndroid Build Coastguard Worker 	        return(-1);
1393*6777b538SAndroid Build Coastguard Worker             }
1394*6777b538SAndroid Build Coastguard Worker 	}
1395*6777b538SAndroid Build Coastguard Worker 	reader->node = NULL;
1396*6777b538SAndroid Build Coastguard Worker 	reader->depth = -1;
1397*6777b538SAndroid Build Coastguard Worker 
1398*6777b538SAndroid Build Coastguard Worker 	/*
1399*6777b538SAndroid Build Coastguard Worker 	 * Cleanup of the old node
1400*6777b538SAndroid Build Coastguard Worker 	 */
1401*6777b538SAndroid Build Coastguard Worker 	if ((oldnode != NULL) && (reader->preserves == 0) &&
1402*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
1403*6777b538SAndroid Build Coastguard Worker 	    (reader->in_xinclude == 0) &&
1404*6777b538SAndroid Build Coastguard Worker #endif
1405*6777b538SAndroid Build Coastguard Worker 	    (reader->entNr == 0) &&
1406*6777b538SAndroid Build Coastguard Worker 	    (oldnode->type != XML_DTD_NODE) &&
1407*6777b538SAndroid Build Coastguard Worker 	    ((oldnode->extra & NODE_IS_PRESERVED) == 0)) {
1408*6777b538SAndroid Build Coastguard Worker 	    xmlUnlinkNode(oldnode);
1409*6777b538SAndroid Build Coastguard Worker 	    xmlTextReaderFreeNode(reader, oldnode);
1410*6777b538SAndroid Build Coastguard Worker 	}
1411*6777b538SAndroid Build Coastguard Worker 
1412*6777b538SAndroid Build Coastguard Worker 	goto node_end;
1413*6777b538SAndroid Build Coastguard Worker     }
1414*6777b538SAndroid Build Coastguard Worker     if ((reader->preserves == 0) &&
1415*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
1416*6777b538SAndroid Build Coastguard Worker         (reader->in_xinclude == 0) &&
1417*6777b538SAndroid Build Coastguard Worker #endif
1418*6777b538SAndroid Build Coastguard Worker 	(reader->entNr == 0) &&
1419*6777b538SAndroid Build Coastguard Worker         (reader->node->last != NULL) &&
1420*6777b538SAndroid Build Coastguard Worker         ((reader->node->last->extra & NODE_IS_PRESERVED) == 0)) {
1421*6777b538SAndroid Build Coastguard Worker 	xmlNodePtr tmp = reader->node->last;
1422*6777b538SAndroid Build Coastguard Worker 	xmlUnlinkNode(tmp);
1423*6777b538SAndroid Build Coastguard Worker 	xmlTextReaderFreeNode(reader, tmp);
1424*6777b538SAndroid Build Coastguard Worker     }
1425*6777b538SAndroid Build Coastguard Worker     reader->depth--;
1426*6777b538SAndroid Build Coastguard Worker     reader->state = XML_TEXTREADER_BACKTRACK;
1427*6777b538SAndroid Build Coastguard Worker 
1428*6777b538SAndroid Build Coastguard Worker node_found:
1429*6777b538SAndroid Build Coastguard Worker     /*
1430*6777b538SAndroid Build Coastguard Worker      * If we are in the middle of a piece of CDATA make sure it's finished
1431*6777b538SAndroid Build Coastguard Worker      */
1432*6777b538SAndroid Build Coastguard Worker     if ((reader->node != NULL) &&
1433*6777b538SAndroid Build Coastguard Worker         (reader->node->next == NULL) &&
1434*6777b538SAndroid Build Coastguard Worker         ((reader->node->type == XML_TEXT_NODE) ||
1435*6777b538SAndroid Build Coastguard Worker 	 (reader->node->type == XML_CDATA_SECTION_NODE))) {
1436*6777b538SAndroid Build Coastguard Worker             if (xmlTextReaderExpand(reader) == NULL)
1437*6777b538SAndroid Build Coastguard Worker 	        return -1;
1438*6777b538SAndroid Build Coastguard Worker     }
1439*6777b538SAndroid Build Coastguard Worker 
1440*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
1441*6777b538SAndroid Build Coastguard Worker     /*
1442*6777b538SAndroid Build Coastguard Worker      * Handle XInclude if asked for
1443*6777b538SAndroid Build Coastguard Worker      */
1444*6777b538SAndroid Build Coastguard Worker     if ((reader->xinclude) && (reader->in_xinclude == 0) &&
1445*6777b538SAndroid Build Coastguard Worker         (reader->state != XML_TEXTREADER_BACKTRACK) &&
1446*6777b538SAndroid Build Coastguard Worker         (reader->node != NULL) &&
1447*6777b538SAndroid Build Coastguard Worker 	(reader->node->type == XML_ELEMENT_NODE) &&
1448*6777b538SAndroid Build Coastguard Worker 	(reader->node->ns != NULL) &&
1449*6777b538SAndroid Build Coastguard Worker 	((xmlStrEqual(reader->node->ns->href, XINCLUDE_NS)) ||
1450*6777b538SAndroid Build Coastguard Worker 	 (xmlStrEqual(reader->node->ns->href, XINCLUDE_OLD_NS)))) {
1451*6777b538SAndroid Build Coastguard Worker 	if (reader->xincctxt == NULL) {
1452*6777b538SAndroid Build Coastguard Worker 	    reader->xincctxt = xmlXIncludeNewContext(reader->ctxt->myDoc);
1453*6777b538SAndroid Build Coastguard Worker             if (reader->xincctxt == NULL) {
1454*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderErrMemory(reader);
1455*6777b538SAndroid Build Coastguard Worker                 return(-1);
1456*6777b538SAndroid Build Coastguard Worker             }
1457*6777b538SAndroid Build Coastguard Worker 	    xmlXIncludeSetFlags(reader->xincctxt,
1458*6777b538SAndroid Build Coastguard Worker 	                        reader->parserFlags & (~XML_PARSE_NOXINCNODE));
1459*6777b538SAndroid Build Coastguard Worker             xmlXIncludeSetStreamingMode(reader->xincctxt, 1);
1460*6777b538SAndroid Build Coastguard Worker             if ((reader->errorFunc != NULL) || (reader->sErrorFunc != NULL))
1461*6777b538SAndroid Build Coastguard Worker                 xmlXIncludeSetErrorHandler(reader->xincctxt,
1462*6777b538SAndroid Build Coastguard Worker                         xmlTextReaderStructuredRelay, reader);
1463*6777b538SAndroid Build Coastguard Worker 	}
1464*6777b538SAndroid Build Coastguard Worker 	/*
1465*6777b538SAndroid Build Coastguard Worker 	 * expand that node and process it
1466*6777b538SAndroid Build Coastguard Worker 	 */
1467*6777b538SAndroid Build Coastguard Worker 	if (xmlTextReaderExpand(reader) == NULL)
1468*6777b538SAndroid Build Coastguard Worker 	    return(-1);
1469*6777b538SAndroid Build Coastguard Worker         if (xmlXIncludeProcessNode(reader->xincctxt, reader->node) < 0) {
1470*6777b538SAndroid Build Coastguard Worker             int err = xmlXIncludeGetLastError(reader->xincctxt);
1471*6777b538SAndroid Build Coastguard Worker 
1472*6777b538SAndroid Build Coastguard Worker             if (err == XML_ERR_NO_MEMORY)
1473*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderErrMemory(reader);
1474*6777b538SAndroid Build Coastguard Worker             return(-1);
1475*6777b538SAndroid Build Coastguard Worker         }
1476*6777b538SAndroid Build Coastguard Worker     }
1477*6777b538SAndroid Build Coastguard Worker     if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_START)) {
1478*6777b538SAndroid Build Coastguard Worker         reader->in_xinclude++;
1479*6777b538SAndroid Build Coastguard Worker 	goto get_next_node;
1480*6777b538SAndroid Build Coastguard Worker     }
1481*6777b538SAndroid Build Coastguard Worker     if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_END)) {
1482*6777b538SAndroid Build Coastguard Worker         reader->in_xinclude--;
1483*6777b538SAndroid Build Coastguard Worker 	goto get_next_node;
1484*6777b538SAndroid Build Coastguard Worker     }
1485*6777b538SAndroid Build Coastguard Worker #endif
1486*6777b538SAndroid Build Coastguard Worker     /*
1487*6777b538SAndroid Build Coastguard Worker      * Handle entities enter and exit when in entity replacement mode
1488*6777b538SAndroid Build Coastguard Worker      */
1489*6777b538SAndroid Build Coastguard Worker     if ((reader->node != NULL) &&
1490*6777b538SAndroid Build Coastguard Worker 	(reader->node->type == XML_ENTITY_REF_NODE) &&
1491*6777b538SAndroid Build Coastguard Worker 	(reader->ctxt != NULL) && (reader->ctxt->replaceEntities == 1)) {
1492*6777b538SAndroid Build Coastguard Worker 	if ((reader->node->children != NULL) &&
1493*6777b538SAndroid Build Coastguard Worker 	    (reader->node->children->type == XML_ENTITY_DECL) &&
1494*6777b538SAndroid Build Coastguard Worker 	    (reader->node->children->children != NULL)) {
1495*6777b538SAndroid Build Coastguard Worker 	    if (xmlTextReaderEntPush(reader, reader->node) < 0)
1496*6777b538SAndroid Build Coastguard Worker                 goto get_next_node;
1497*6777b538SAndroid Build Coastguard Worker 	    reader->node = reader->node->children->children;
1498*6777b538SAndroid Build Coastguard Worker 	}
1499*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_REGEXP_ENABLED
1500*6777b538SAndroid Build Coastguard Worker     } else if ((reader->node != NULL) &&
1501*6777b538SAndroid Build Coastguard Worker 	       (reader->node->type == XML_ENTITY_REF_NODE) &&
1502*6777b538SAndroid Build Coastguard Worker 	       (reader->ctxt != NULL) && (reader->validate)) {
1503*6777b538SAndroid Build Coastguard Worker 	if (xmlTextReaderValidateEntity(reader) < 0)
1504*6777b538SAndroid Build Coastguard Worker             return(-1);
1505*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_REGEXP_ENABLED */
1506*6777b538SAndroid Build Coastguard Worker     }
1507*6777b538SAndroid Build Coastguard Worker     if ((reader->node != NULL) &&
1508*6777b538SAndroid Build Coastguard Worker 	(reader->node->type == XML_ENTITY_DECL) &&
1509*6777b538SAndroid Build Coastguard Worker 	(reader->ent != NULL) && (reader->ent->children == reader->node)) {
1510*6777b538SAndroid Build Coastguard Worker 	reader->node = xmlTextReaderEntPop(reader);
1511*6777b538SAndroid Build Coastguard Worker 	reader->depth++;
1512*6777b538SAndroid Build Coastguard Worker         goto get_next_node;
1513*6777b538SAndroid Build Coastguard Worker     }
1514*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_REGEXP_ENABLED
1515*6777b538SAndroid Build Coastguard Worker     if ((reader->validate != XML_TEXTREADER_NOT_VALIDATE) && (reader->node != NULL)) {
1516*6777b538SAndroid Build Coastguard Worker 	xmlNodePtr node = reader->node;
1517*6777b538SAndroid Build Coastguard Worker 
1518*6777b538SAndroid Build Coastguard Worker 	if ((node->type == XML_ELEMENT_NODE) &&
1519*6777b538SAndroid Build Coastguard Worker             ((reader->state != XML_TEXTREADER_END) &&
1520*6777b538SAndroid Build Coastguard Worker 	     (reader->state != XML_TEXTREADER_BACKTRACK))) {
1521*6777b538SAndroid Build Coastguard Worker 	    if (xmlTextReaderValidatePush(reader) < 0)
1522*6777b538SAndroid Build Coastguard Worker                 return(-1);
1523*6777b538SAndroid Build Coastguard Worker 	} else if ((node->type == XML_TEXT_NODE) ||
1524*6777b538SAndroid Build Coastguard Worker 		   (node->type == XML_CDATA_SECTION_NODE)) {
1525*6777b538SAndroid Build Coastguard Worker             xmlTextReaderValidateCData(reader, node->content,
1526*6777b538SAndroid Build Coastguard Worker 	                               xmlStrlen(node->content));
1527*6777b538SAndroid Build Coastguard Worker 	}
1528*6777b538SAndroid Build Coastguard Worker     }
1529*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_REGEXP_ENABLED */
1530*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
1531*6777b538SAndroid Build Coastguard Worker     if ((reader->patternNr > 0) && (reader->state != XML_TEXTREADER_END) &&
1532*6777b538SAndroid Build Coastguard Worker         (reader->state != XML_TEXTREADER_BACKTRACK)) {
1533*6777b538SAndroid Build Coastguard Worker         int i;
1534*6777b538SAndroid Build Coastguard Worker 	for (i = 0;i < reader->patternNr;i++) {
1535*6777b538SAndroid Build Coastguard Worker 	     if (xmlPatternMatch(reader->patternTab[i], reader->node) == 1) {
1536*6777b538SAndroid Build Coastguard Worker 	         xmlTextReaderPreserve(reader);
1537*6777b538SAndroid Build Coastguard Worker 		 break;
1538*6777b538SAndroid Build Coastguard Worker              }
1539*6777b538SAndroid Build Coastguard Worker 	}
1540*6777b538SAndroid Build Coastguard Worker     }
1541*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_PATTERN_ENABLED */
1542*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
1543*6777b538SAndroid Build Coastguard Worker     if ((reader->validate == XML_TEXTREADER_VALIDATE_XSD) &&
1544*6777b538SAndroid Build Coastguard Worker         (reader->xsdValidErrors == 0) &&
1545*6777b538SAndroid Build Coastguard Worker 	(reader->xsdValidCtxt != NULL)) {
1546*6777b538SAndroid Build Coastguard Worker 	reader->xsdValidErrors = !xmlSchemaIsValid(reader->xsdValidCtxt);
1547*6777b538SAndroid Build Coastguard Worker     }
1548*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_PATTERN_ENABLED */
1549*6777b538SAndroid Build Coastguard Worker     return(1);
1550*6777b538SAndroid Build Coastguard Worker node_end:
1551*6777b538SAndroid Build Coastguard Worker     reader->state = XML_TEXTREADER_DONE;
1552*6777b538SAndroid Build Coastguard Worker     return(0);
1553*6777b538SAndroid Build Coastguard Worker }
1554*6777b538SAndroid Build Coastguard Worker 
1555*6777b538SAndroid Build Coastguard Worker /**
1556*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderReadState:
1557*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1558*6777b538SAndroid Build Coastguard Worker  *
1559*6777b538SAndroid Build Coastguard Worker  * Gets the read state of the reader.
1560*6777b538SAndroid Build Coastguard Worker  *
1561*6777b538SAndroid Build Coastguard Worker  * Returns the state value, or -1 in case of error
1562*6777b538SAndroid Build Coastguard Worker  */
1563*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderReadState(xmlTextReaderPtr reader)1564*6777b538SAndroid Build Coastguard Worker xmlTextReaderReadState(xmlTextReaderPtr reader) {
1565*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
1566*6777b538SAndroid Build Coastguard Worker 	return(-1);
1567*6777b538SAndroid Build Coastguard Worker     return(reader->mode);
1568*6777b538SAndroid Build Coastguard Worker }
1569*6777b538SAndroid Build Coastguard Worker 
1570*6777b538SAndroid Build Coastguard Worker /**
1571*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderExpand:
1572*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1573*6777b538SAndroid Build Coastguard Worker  *
1574*6777b538SAndroid Build Coastguard Worker  * Reads the contents of the current node and the full subtree. It then makes
1575*6777b538SAndroid Build Coastguard Worker  * the subtree available until the next xmlTextReaderRead() call
1576*6777b538SAndroid Build Coastguard Worker  *
1577*6777b538SAndroid Build Coastguard Worker  * Returns a node pointer valid until the next xmlTextReaderRead() call
1578*6777b538SAndroid Build Coastguard Worker  *         or NULL in case of error.
1579*6777b538SAndroid Build Coastguard Worker  */
1580*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlTextReaderExpand(xmlTextReaderPtr reader)1581*6777b538SAndroid Build Coastguard Worker xmlTextReaderExpand(xmlTextReaderPtr reader) {
1582*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
1583*6777b538SAndroid Build Coastguard Worker         return(NULL);
1584*6777b538SAndroid Build Coastguard Worker     if (reader->doc != NULL)
1585*6777b538SAndroid Build Coastguard Worker         return(reader->node);
1586*6777b538SAndroid Build Coastguard Worker     if (reader->ctxt == NULL)
1587*6777b538SAndroid Build Coastguard Worker         return(NULL);
1588*6777b538SAndroid Build Coastguard Worker     if (xmlTextReaderDoExpand(reader) < 0)
1589*6777b538SAndroid Build Coastguard Worker         return(NULL);
1590*6777b538SAndroid Build Coastguard Worker     return(reader->node);
1591*6777b538SAndroid Build Coastguard Worker }
1592*6777b538SAndroid Build Coastguard Worker 
1593*6777b538SAndroid Build Coastguard Worker /**
1594*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderNext:
1595*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1596*6777b538SAndroid Build Coastguard Worker  *
1597*6777b538SAndroid Build Coastguard Worker  * Skip to the node following the current one in document order while
1598*6777b538SAndroid Build Coastguard Worker  * avoiding the subtree if any.
1599*6777b538SAndroid Build Coastguard Worker  *
1600*6777b538SAndroid Build Coastguard Worker  * Returns 1 if the node was read successfully, 0 if there is no more
1601*6777b538SAndroid Build Coastguard Worker  *          nodes to read, or -1 in case of error
1602*6777b538SAndroid Build Coastguard Worker  */
1603*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderNext(xmlTextReaderPtr reader)1604*6777b538SAndroid Build Coastguard Worker xmlTextReaderNext(xmlTextReaderPtr reader) {
1605*6777b538SAndroid Build Coastguard Worker     int ret;
1606*6777b538SAndroid Build Coastguard Worker     xmlNodePtr cur;
1607*6777b538SAndroid Build Coastguard Worker 
1608*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
1609*6777b538SAndroid Build Coastguard Worker 	return(-1);
1610*6777b538SAndroid Build Coastguard Worker     if (reader->doc != NULL)
1611*6777b538SAndroid Build Coastguard Worker         return(xmlTextReaderNextTree(reader));
1612*6777b538SAndroid Build Coastguard Worker     cur = reader->node;
1613*6777b538SAndroid Build Coastguard Worker     if ((cur == NULL) || (cur->type != XML_ELEMENT_NODE))
1614*6777b538SAndroid Build Coastguard Worker         return(xmlTextReaderRead(reader));
1615*6777b538SAndroid Build Coastguard Worker     if (reader->state == XML_TEXTREADER_END || reader->state == XML_TEXTREADER_BACKTRACK)
1616*6777b538SAndroid Build Coastguard Worker         return(xmlTextReaderRead(reader));
1617*6777b538SAndroid Build Coastguard Worker     if (cur->extra & NODE_IS_EMPTY)
1618*6777b538SAndroid Build Coastguard Worker         return(xmlTextReaderRead(reader));
1619*6777b538SAndroid Build Coastguard Worker     do {
1620*6777b538SAndroid Build Coastguard Worker         ret = xmlTextReaderRead(reader);
1621*6777b538SAndroid Build Coastguard Worker 	if (ret != 1)
1622*6777b538SAndroid Build Coastguard Worker 	    return(ret);
1623*6777b538SAndroid Build Coastguard Worker     } while (reader->node != cur);
1624*6777b538SAndroid Build Coastguard Worker     return(xmlTextReaderRead(reader));
1625*6777b538SAndroid Build Coastguard Worker }
1626*6777b538SAndroid Build Coastguard Worker 
1627*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_WRITER_ENABLED
1628*6777b538SAndroid Build Coastguard Worker /**
1629*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderReadInnerXml:
1630*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1631*6777b538SAndroid Build Coastguard Worker  *
1632*6777b538SAndroid Build Coastguard Worker  * Reads the contents of the current node, including child nodes and markup.
1633*6777b538SAndroid Build Coastguard Worker  *
1634*6777b538SAndroid Build Coastguard Worker  * Returns a string containing the XML content, or NULL if the current node
1635*6777b538SAndroid Build Coastguard Worker  *         is neither an element nor attribute, or has no child nodes. The
1636*6777b538SAndroid Build Coastguard Worker  *         string must be deallocated by the caller.
1637*6777b538SAndroid Build Coastguard Worker  */
1638*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED)1639*6777b538SAndroid Build Coastguard Worker xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED)
1640*6777b538SAndroid Build Coastguard Worker {
1641*6777b538SAndroid Build Coastguard Worker     xmlChar *resbuf;
1642*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node, cur_node;
1643*6777b538SAndroid Build Coastguard Worker     xmlBufferPtr buff, buff2;
1644*6777b538SAndroid Build Coastguard Worker     xmlDocPtr doc;
1645*6777b538SAndroid Build Coastguard Worker 
1646*6777b538SAndroid Build Coastguard Worker     if (xmlTextReaderExpand(reader) == NULL) {
1647*6777b538SAndroid Build Coastguard Worker         return NULL;
1648*6777b538SAndroid Build Coastguard Worker     }
1649*6777b538SAndroid Build Coastguard Worker     doc = reader->node->doc;
1650*6777b538SAndroid Build Coastguard Worker     buff = xmlBufferCreate();
1651*6777b538SAndroid Build Coastguard Worker     if (buff == NULL)
1652*6777b538SAndroid Build Coastguard Worker         return NULL;
1653*6777b538SAndroid Build Coastguard Worker     xmlBufferSetAllocationScheme(buff, XML_BUFFER_ALLOC_DOUBLEIT);
1654*6777b538SAndroid Build Coastguard Worker     for (cur_node = reader->node->children; cur_node != NULL;
1655*6777b538SAndroid Build Coastguard Worker          cur_node = cur_node->next) {
1656*6777b538SAndroid Build Coastguard Worker         /* XXX: Why is the node copied? */
1657*6777b538SAndroid Build Coastguard Worker         node = xmlDocCopyNode(cur_node, doc, 1);
1658*6777b538SAndroid Build Coastguard Worker         /* XXX: Why do we need a second buffer? */
1659*6777b538SAndroid Build Coastguard Worker         buff2 = xmlBufferCreate();
1660*6777b538SAndroid Build Coastguard Worker         xmlBufferSetAllocationScheme(buff2, XML_BUFFER_ALLOC_DOUBLEIT);
1661*6777b538SAndroid Build Coastguard Worker         if (xmlNodeDump(buff2, doc, node, 0, 0) == -1) {
1662*6777b538SAndroid Build Coastguard Worker             xmlFreeNode(node);
1663*6777b538SAndroid Build Coastguard Worker             xmlBufferFree(buff2);
1664*6777b538SAndroid Build Coastguard Worker             xmlBufferFree(buff);
1665*6777b538SAndroid Build Coastguard Worker             return NULL;
1666*6777b538SAndroid Build Coastguard Worker         }
1667*6777b538SAndroid Build Coastguard Worker         xmlBufferCat(buff, buff2->content);
1668*6777b538SAndroid Build Coastguard Worker         xmlFreeNode(node);
1669*6777b538SAndroid Build Coastguard Worker         xmlBufferFree(buff2);
1670*6777b538SAndroid Build Coastguard Worker     }
1671*6777b538SAndroid Build Coastguard Worker     resbuf = buff->content;
1672*6777b538SAndroid Build Coastguard Worker     buff->content = NULL;
1673*6777b538SAndroid Build Coastguard Worker 
1674*6777b538SAndroid Build Coastguard Worker     xmlBufferFree(buff);
1675*6777b538SAndroid Build Coastguard Worker     return resbuf;
1676*6777b538SAndroid Build Coastguard Worker }
1677*6777b538SAndroid Build Coastguard Worker #endif
1678*6777b538SAndroid Build Coastguard Worker 
1679*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_WRITER_ENABLED
1680*6777b538SAndroid Build Coastguard Worker /**
1681*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderReadOuterXml:
1682*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1683*6777b538SAndroid Build Coastguard Worker  *
1684*6777b538SAndroid Build Coastguard Worker  * Reads the contents of the current node, including child nodes and markup.
1685*6777b538SAndroid Build Coastguard Worker  *
1686*6777b538SAndroid Build Coastguard Worker  * Returns a string containing the node and any XML content, or NULL if the
1687*6777b538SAndroid Build Coastguard Worker  *         current node cannot be serialized. The string must be deallocated
1688*6777b538SAndroid Build Coastguard Worker  *         by the caller.
1689*6777b538SAndroid Build Coastguard Worker  */
1690*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED)1691*6777b538SAndroid Build Coastguard Worker xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED)
1692*6777b538SAndroid Build Coastguard Worker {
1693*6777b538SAndroid Build Coastguard Worker     xmlChar *resbuf;
1694*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
1695*6777b538SAndroid Build Coastguard Worker     xmlBufferPtr buff;
1696*6777b538SAndroid Build Coastguard Worker     xmlDocPtr doc;
1697*6777b538SAndroid Build Coastguard Worker 
1698*6777b538SAndroid Build Coastguard Worker     if (xmlTextReaderExpand(reader) == NULL) {
1699*6777b538SAndroid Build Coastguard Worker         return NULL;
1700*6777b538SAndroid Build Coastguard Worker     }
1701*6777b538SAndroid Build Coastguard Worker     node = reader->node;
1702*6777b538SAndroid Build Coastguard Worker     doc = node->doc;
1703*6777b538SAndroid Build Coastguard Worker     /* XXX: Why is the node copied? */
1704*6777b538SAndroid Build Coastguard Worker 	if (node->type == XML_DTD_NODE) {
1705*6777b538SAndroid Build Coastguard Worker 		node = (xmlNodePtr) xmlCopyDtd((xmlDtdPtr) node);
1706*6777b538SAndroid Build Coastguard Worker 	} else {
1707*6777b538SAndroid Build Coastguard Worker 		node = xmlDocCopyNode(node, doc, 1);
1708*6777b538SAndroid Build Coastguard Worker 	}
1709*6777b538SAndroid Build Coastguard Worker     buff = xmlBufferCreate();
1710*6777b538SAndroid Build Coastguard Worker     xmlBufferSetAllocationScheme(buff, XML_BUFFER_ALLOC_DOUBLEIT);
1711*6777b538SAndroid Build Coastguard Worker     if (xmlNodeDump(buff, doc, node, 0, 0) == -1) {
1712*6777b538SAndroid Build Coastguard Worker         xmlFreeNode(node);
1713*6777b538SAndroid Build Coastguard Worker         xmlBufferFree(buff);
1714*6777b538SAndroid Build Coastguard Worker         return NULL;
1715*6777b538SAndroid Build Coastguard Worker     }
1716*6777b538SAndroid Build Coastguard Worker 
1717*6777b538SAndroid Build Coastguard Worker     resbuf = buff->content;
1718*6777b538SAndroid Build Coastguard Worker     buff->content = NULL;
1719*6777b538SAndroid Build Coastguard Worker 
1720*6777b538SAndroid Build Coastguard Worker     xmlFreeNode(node);
1721*6777b538SAndroid Build Coastguard Worker     xmlBufferFree(buff);
1722*6777b538SAndroid Build Coastguard Worker     return resbuf;
1723*6777b538SAndroid Build Coastguard Worker }
1724*6777b538SAndroid Build Coastguard Worker #endif
1725*6777b538SAndroid Build Coastguard Worker 
1726*6777b538SAndroid Build Coastguard Worker /**
1727*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderReadString:
1728*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1729*6777b538SAndroid Build Coastguard Worker  *
1730*6777b538SAndroid Build Coastguard Worker  * Reads the contents of an element or a text node as a string.
1731*6777b538SAndroid Build Coastguard Worker  *
1732*6777b538SAndroid Build Coastguard Worker  * Returns a string containing the contents of the Element or Text node,
1733*6777b538SAndroid Build Coastguard Worker  *         or NULL if the reader is positioned on any other type of node.
1734*6777b538SAndroid Build Coastguard Worker  *         The string must be deallocated by the caller.
1735*6777b538SAndroid Build Coastguard Worker  */
1736*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderReadString(xmlTextReaderPtr reader)1737*6777b538SAndroid Build Coastguard Worker xmlTextReaderReadString(xmlTextReaderPtr reader)
1738*6777b538SAndroid Build Coastguard Worker {
1739*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
1740*6777b538SAndroid Build Coastguard Worker 
1741*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
1742*6777b538SAndroid Build Coastguard Worker        return(NULL);
1743*6777b538SAndroid Build Coastguard Worker 
1744*6777b538SAndroid Build Coastguard Worker     node = (reader->curnode != NULL) ? reader->curnode : reader->node;
1745*6777b538SAndroid Build Coastguard Worker     switch (node->type) {
1746*6777b538SAndroid Build Coastguard Worker     case XML_TEXT_NODE:
1747*6777b538SAndroid Build Coastguard Worker        if (node->content != NULL)
1748*6777b538SAndroid Build Coastguard Worker            return(xmlStrdup(node->content));
1749*6777b538SAndroid Build Coastguard Worker        break;
1750*6777b538SAndroid Build Coastguard Worker     case XML_ELEMENT_NODE:
1751*6777b538SAndroid Build Coastguard Worker 	if (xmlTextReaderDoExpand(reader) != -1) {
1752*6777b538SAndroid Build Coastguard Worker 	    return xmlTextReaderCollectSiblings(node->children);
1753*6777b538SAndroid Build Coastguard Worker 	}
1754*6777b538SAndroid Build Coastguard Worker 	break;
1755*6777b538SAndroid Build Coastguard Worker     case XML_ATTRIBUTE_NODE:
1756*6777b538SAndroid Build Coastguard Worker 	/* TODO */
1757*6777b538SAndroid Build Coastguard Worker 	break;
1758*6777b538SAndroid Build Coastguard Worker     default:
1759*6777b538SAndroid Build Coastguard Worker        break;
1760*6777b538SAndroid Build Coastguard Worker     }
1761*6777b538SAndroid Build Coastguard Worker     return(NULL);
1762*6777b538SAndroid Build Coastguard Worker }
1763*6777b538SAndroid Build Coastguard Worker 
1764*6777b538SAndroid Build Coastguard Worker #if 0
1765*6777b538SAndroid Build Coastguard Worker /**
1766*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderReadBase64:
1767*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1768*6777b538SAndroid Build Coastguard Worker  * @array:  a byte array to store the content.
1769*6777b538SAndroid Build Coastguard Worker  * @offset:  the zero-based index into array where the method should
1770*6777b538SAndroid Build Coastguard Worker  *           begin to write.
1771*6777b538SAndroid Build Coastguard Worker  * @len:  the number of bytes to write.
1772*6777b538SAndroid Build Coastguard Worker  *
1773*6777b538SAndroid Build Coastguard Worker  * Reads and decodes the Base64 encoded contents of an element and
1774*6777b538SAndroid Build Coastguard Worker  * stores the result in a byte buffer.
1775*6777b538SAndroid Build Coastguard Worker  *
1776*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes written to array, or zero if the current
1777*6777b538SAndroid Build Coastguard Worker  *         instance is not positioned on an element or -1 in case of error.
1778*6777b538SAndroid Build Coastguard Worker  */
1779*6777b538SAndroid Build Coastguard Worker int
1780*6777b538SAndroid Build Coastguard Worker xmlTextReaderReadBase64(xmlTextReaderPtr reader,
1781*6777b538SAndroid Build Coastguard Worker                         unsigned char *array ATTRIBUTE_UNUSED,
1782*6777b538SAndroid Build Coastguard Worker 	                int offset ATTRIBUTE_UNUSED,
1783*6777b538SAndroid Build Coastguard Worker 			int len ATTRIBUTE_UNUSED) {
1784*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->ctxt == NULL))
1785*6777b538SAndroid Build Coastguard Worker 	return(-1);
1786*6777b538SAndroid Build Coastguard Worker     if (reader->ctxt->wellFormed != 1)
1787*6777b538SAndroid Build Coastguard Worker 	return(-1);
1788*6777b538SAndroid Build Coastguard Worker 
1789*6777b538SAndroid Build Coastguard Worker     if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE))
1790*6777b538SAndroid Build Coastguard Worker 	return(0);
1791*6777b538SAndroid Build Coastguard Worker     return(0);
1792*6777b538SAndroid Build Coastguard Worker }
1793*6777b538SAndroid Build Coastguard Worker 
1794*6777b538SAndroid Build Coastguard Worker /**
1795*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderReadBinHex:
1796*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1797*6777b538SAndroid Build Coastguard Worker  * @array:  a byte array to store the content.
1798*6777b538SAndroid Build Coastguard Worker  * @offset:  the zero-based index into array where the method should
1799*6777b538SAndroid Build Coastguard Worker  *           begin to write.
1800*6777b538SAndroid Build Coastguard Worker  * @len:  the number of bytes to write.
1801*6777b538SAndroid Build Coastguard Worker  *
1802*6777b538SAndroid Build Coastguard Worker  * Reads and decodes the BinHex encoded contents of an element and
1803*6777b538SAndroid Build Coastguard Worker  * stores the result in a byte buffer.
1804*6777b538SAndroid Build Coastguard Worker  *
1805*6777b538SAndroid Build Coastguard Worker  * Returns the number of bytes written to array, or zero if the current
1806*6777b538SAndroid Build Coastguard Worker  *         instance is not positioned on an element or -1 in case of error.
1807*6777b538SAndroid Build Coastguard Worker  */
1808*6777b538SAndroid Build Coastguard Worker int
1809*6777b538SAndroid Build Coastguard Worker xmlTextReaderReadBinHex(xmlTextReaderPtr reader,
1810*6777b538SAndroid Build Coastguard Worker                         unsigned char *array ATTRIBUTE_UNUSED,
1811*6777b538SAndroid Build Coastguard Worker 	                int offset ATTRIBUTE_UNUSED,
1812*6777b538SAndroid Build Coastguard Worker 			int len ATTRIBUTE_UNUSED) {
1813*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->ctxt == NULL))
1814*6777b538SAndroid Build Coastguard Worker 	return(-1);
1815*6777b538SAndroid Build Coastguard Worker     if (reader->ctxt->wellFormed != 1)
1816*6777b538SAndroid Build Coastguard Worker 	return(-1);
1817*6777b538SAndroid Build Coastguard Worker 
1818*6777b538SAndroid Build Coastguard Worker     if ((reader->node == NULL) || (reader->node->type == XML_ELEMENT_NODE))
1819*6777b538SAndroid Build Coastguard Worker 	return(0);
1820*6777b538SAndroid Build Coastguard Worker     return(0);
1821*6777b538SAndroid Build Coastguard Worker }
1822*6777b538SAndroid Build Coastguard Worker #endif
1823*6777b538SAndroid Build Coastguard Worker 
1824*6777b538SAndroid Build Coastguard Worker /************************************************************************
1825*6777b538SAndroid Build Coastguard Worker  *									*
1826*6777b538SAndroid Build Coastguard Worker  *			Operating on a preparsed tree			*
1827*6777b538SAndroid Build Coastguard Worker  *									*
1828*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
1829*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderNextTree(xmlTextReaderPtr reader)1830*6777b538SAndroid Build Coastguard Worker xmlTextReaderNextTree(xmlTextReaderPtr reader)
1831*6777b538SAndroid Build Coastguard Worker {
1832*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
1833*6777b538SAndroid Build Coastguard Worker         return(-1);
1834*6777b538SAndroid Build Coastguard Worker 
1835*6777b538SAndroid Build Coastguard Worker     if (reader->state == XML_TEXTREADER_END)
1836*6777b538SAndroid Build Coastguard Worker         return(0);
1837*6777b538SAndroid Build Coastguard Worker 
1838*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL) {
1839*6777b538SAndroid Build Coastguard Worker         if (reader->doc->children == NULL) {
1840*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_END;
1841*6777b538SAndroid Build Coastguard Worker             return(0);
1842*6777b538SAndroid Build Coastguard Worker         }
1843*6777b538SAndroid Build Coastguard Worker 
1844*6777b538SAndroid Build Coastguard Worker         reader->node = reader->doc->children;
1845*6777b538SAndroid Build Coastguard Worker         reader->state = XML_TEXTREADER_START;
1846*6777b538SAndroid Build Coastguard Worker         return(1);
1847*6777b538SAndroid Build Coastguard Worker     }
1848*6777b538SAndroid Build Coastguard Worker 
1849*6777b538SAndroid Build Coastguard Worker     if (reader->state != XML_TEXTREADER_BACKTRACK) {
1850*6777b538SAndroid Build Coastguard Worker 	/* Here removed traversal to child, because we want to skip the subtree,
1851*6777b538SAndroid Build Coastguard Worker 	replace with traversal to sibling to skip subtree */
1852*6777b538SAndroid Build Coastguard Worker         if (reader->node->next != 0) {
1853*6777b538SAndroid Build Coastguard Worker 	    /* Move to sibling if present,skipping sub-tree */
1854*6777b538SAndroid Build Coastguard Worker             reader->node = reader->node->next;
1855*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_START;
1856*6777b538SAndroid Build Coastguard Worker             return(1);
1857*6777b538SAndroid Build Coastguard Worker         }
1858*6777b538SAndroid Build Coastguard Worker 
1859*6777b538SAndroid Build Coastguard Worker 	/* if reader->node->next is NULL mean no subtree for current node,
1860*6777b538SAndroid Build Coastguard Worker 	so need to move to sibling of parent node if present */
1861*6777b538SAndroid Build Coastguard Worker 	reader->state = XML_TEXTREADER_BACKTRACK;
1862*6777b538SAndroid Build Coastguard Worker 	/* This will move to parent if present */
1863*6777b538SAndroid Build Coastguard Worker 	xmlTextReaderRead(reader);
1864*6777b538SAndroid Build Coastguard Worker     }
1865*6777b538SAndroid Build Coastguard Worker 
1866*6777b538SAndroid Build Coastguard Worker     if (reader->node->next != 0) {
1867*6777b538SAndroid Build Coastguard Worker         reader->node = reader->node->next;
1868*6777b538SAndroid Build Coastguard Worker         reader->state = XML_TEXTREADER_START;
1869*6777b538SAndroid Build Coastguard Worker         return(1);
1870*6777b538SAndroid Build Coastguard Worker     }
1871*6777b538SAndroid Build Coastguard Worker 
1872*6777b538SAndroid Build Coastguard Worker     if (reader->node->parent != 0) {
1873*6777b538SAndroid Build Coastguard Worker         if (reader->node->parent->type == XML_DOCUMENT_NODE) {
1874*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_END;
1875*6777b538SAndroid Build Coastguard Worker             return(0);
1876*6777b538SAndroid Build Coastguard Worker         }
1877*6777b538SAndroid Build Coastguard Worker 
1878*6777b538SAndroid Build Coastguard Worker         reader->node = reader->node->parent;
1879*6777b538SAndroid Build Coastguard Worker         reader->depth--;
1880*6777b538SAndroid Build Coastguard Worker         reader->state = XML_TEXTREADER_BACKTRACK;
1881*6777b538SAndroid Build Coastguard Worker 	/* Repeat process to move to sibling of parent node if present */
1882*6777b538SAndroid Build Coastguard Worker         xmlTextReaderNextTree(reader);
1883*6777b538SAndroid Build Coastguard Worker     }
1884*6777b538SAndroid Build Coastguard Worker 
1885*6777b538SAndroid Build Coastguard Worker     reader->state = XML_TEXTREADER_END;
1886*6777b538SAndroid Build Coastguard Worker 
1887*6777b538SAndroid Build Coastguard Worker     return(1);
1888*6777b538SAndroid Build Coastguard Worker }
1889*6777b538SAndroid Build Coastguard Worker 
1890*6777b538SAndroid Build Coastguard Worker /**
1891*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderReadTree:
1892*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1893*6777b538SAndroid Build Coastguard Worker  *
1894*6777b538SAndroid Build Coastguard Worker  *  Moves the position of the current instance to the next node in
1895*6777b538SAndroid Build Coastguard Worker  *  the stream, exposing its properties.
1896*6777b538SAndroid Build Coastguard Worker  *
1897*6777b538SAndroid Build Coastguard Worker  *  Returns 1 if the node was read successfully, 0 if there is no more
1898*6777b538SAndroid Build Coastguard Worker  *          nodes to read, or -1 in case of error
1899*6777b538SAndroid Build Coastguard Worker  */
1900*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderReadTree(xmlTextReaderPtr reader)1901*6777b538SAndroid Build Coastguard Worker xmlTextReaderReadTree(xmlTextReaderPtr reader) {
1902*6777b538SAndroid Build Coastguard Worker     if (reader->state == XML_TEXTREADER_END)
1903*6777b538SAndroid Build Coastguard Worker         return(0);
1904*6777b538SAndroid Build Coastguard Worker 
1905*6777b538SAndroid Build Coastguard Worker next_node:
1906*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL) {
1907*6777b538SAndroid Build Coastguard Worker         if (reader->doc->children == NULL) {
1908*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_END;
1909*6777b538SAndroid Build Coastguard Worker             return(0);
1910*6777b538SAndroid Build Coastguard Worker         }
1911*6777b538SAndroid Build Coastguard Worker 
1912*6777b538SAndroid Build Coastguard Worker         reader->node = reader->doc->children;
1913*6777b538SAndroid Build Coastguard Worker         reader->state = XML_TEXTREADER_START;
1914*6777b538SAndroid Build Coastguard Worker         goto found_node;
1915*6777b538SAndroid Build Coastguard Worker     }
1916*6777b538SAndroid Build Coastguard Worker 
1917*6777b538SAndroid Build Coastguard Worker     if ((reader->state != XML_TEXTREADER_BACKTRACK) &&
1918*6777b538SAndroid Build Coastguard Worker         (reader->node->type != XML_DTD_NODE) &&
1919*6777b538SAndroid Build Coastguard Worker         (reader->node->type != XML_XINCLUDE_START) &&
1920*6777b538SAndroid Build Coastguard Worker 	(reader->node->type != XML_ENTITY_REF_NODE)) {
1921*6777b538SAndroid Build Coastguard Worker         if (reader->node->children != NULL) {
1922*6777b538SAndroid Build Coastguard Worker             reader->node = reader->node->children;
1923*6777b538SAndroid Build Coastguard Worker             reader->depth++;
1924*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_START;
1925*6777b538SAndroid Build Coastguard Worker             goto found_node;
1926*6777b538SAndroid Build Coastguard Worker         }
1927*6777b538SAndroid Build Coastguard Worker 
1928*6777b538SAndroid Build Coastguard Worker         if (reader->node->type == XML_ATTRIBUTE_NODE) {
1929*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_BACKTRACK;
1930*6777b538SAndroid Build Coastguard Worker             goto found_node;
1931*6777b538SAndroid Build Coastguard Worker         }
1932*6777b538SAndroid Build Coastguard Worker     }
1933*6777b538SAndroid Build Coastguard Worker 
1934*6777b538SAndroid Build Coastguard Worker     if (reader->node->next != NULL) {
1935*6777b538SAndroid Build Coastguard Worker         reader->node = reader->node->next;
1936*6777b538SAndroid Build Coastguard Worker         reader->state = XML_TEXTREADER_START;
1937*6777b538SAndroid Build Coastguard Worker         goto found_node;
1938*6777b538SAndroid Build Coastguard Worker     }
1939*6777b538SAndroid Build Coastguard Worker 
1940*6777b538SAndroid Build Coastguard Worker     if (reader->node->parent != NULL) {
1941*6777b538SAndroid Build Coastguard Worker         if ((reader->node->parent->type == XML_DOCUMENT_NODE) ||
1942*6777b538SAndroid Build Coastguard Worker 	    (reader->node->parent->type == XML_HTML_DOCUMENT_NODE)) {
1943*6777b538SAndroid Build Coastguard Worker             reader->state = XML_TEXTREADER_END;
1944*6777b538SAndroid Build Coastguard Worker             return(0);
1945*6777b538SAndroid Build Coastguard Worker         }
1946*6777b538SAndroid Build Coastguard Worker 
1947*6777b538SAndroid Build Coastguard Worker         reader->node = reader->node->parent;
1948*6777b538SAndroid Build Coastguard Worker         reader->depth--;
1949*6777b538SAndroid Build Coastguard Worker         reader->state = XML_TEXTREADER_BACKTRACK;
1950*6777b538SAndroid Build Coastguard Worker         goto found_node;
1951*6777b538SAndroid Build Coastguard Worker     }
1952*6777b538SAndroid Build Coastguard Worker 
1953*6777b538SAndroid Build Coastguard Worker     reader->state = XML_TEXTREADER_END;
1954*6777b538SAndroid Build Coastguard Worker 
1955*6777b538SAndroid Build Coastguard Worker found_node:
1956*6777b538SAndroid Build Coastguard Worker     if ((reader->node->type == XML_XINCLUDE_START) ||
1957*6777b538SAndroid Build Coastguard Worker         (reader->node->type == XML_XINCLUDE_END))
1958*6777b538SAndroid Build Coastguard Worker 	goto next_node;
1959*6777b538SAndroid Build Coastguard Worker 
1960*6777b538SAndroid Build Coastguard Worker     return(1);
1961*6777b538SAndroid Build Coastguard Worker }
1962*6777b538SAndroid Build Coastguard Worker 
1963*6777b538SAndroid Build Coastguard Worker /**
1964*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderNextSibling:
1965*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
1966*6777b538SAndroid Build Coastguard Worker  *
1967*6777b538SAndroid Build Coastguard Worker  * Skip to the node following the current one in document order while
1968*6777b538SAndroid Build Coastguard Worker  * avoiding the subtree if any.
1969*6777b538SAndroid Build Coastguard Worker  * Currently implemented only for Readers built on a document
1970*6777b538SAndroid Build Coastguard Worker  *
1971*6777b538SAndroid Build Coastguard Worker  * Returns 1 if the node was read successfully, 0 if there is no more
1972*6777b538SAndroid Build Coastguard Worker  *          nodes to read, or -1 in case of error
1973*6777b538SAndroid Build Coastguard Worker  */
1974*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderNextSibling(xmlTextReaderPtr reader)1975*6777b538SAndroid Build Coastguard Worker xmlTextReaderNextSibling(xmlTextReaderPtr reader) {
1976*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
1977*6777b538SAndroid Build Coastguard Worker         return(-1);
1978*6777b538SAndroid Build Coastguard Worker     if (reader->doc == NULL) {
1979*6777b538SAndroid Build Coastguard Worker         /* TODO */
1980*6777b538SAndroid Build Coastguard Worker 	return(-1);
1981*6777b538SAndroid Build Coastguard Worker     }
1982*6777b538SAndroid Build Coastguard Worker 
1983*6777b538SAndroid Build Coastguard Worker     if (reader->state == XML_TEXTREADER_END)
1984*6777b538SAndroid Build Coastguard Worker         return(0);
1985*6777b538SAndroid Build Coastguard Worker 
1986*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
1987*6777b538SAndroid Build Coastguard Worker         return(xmlTextReaderNextTree(reader));
1988*6777b538SAndroid Build Coastguard Worker 
1989*6777b538SAndroid Build Coastguard Worker     if (reader->node->next != NULL) {
1990*6777b538SAndroid Build Coastguard Worker         reader->node = reader->node->next;
1991*6777b538SAndroid Build Coastguard Worker         reader->state = XML_TEXTREADER_START;
1992*6777b538SAndroid Build Coastguard Worker         return(1);
1993*6777b538SAndroid Build Coastguard Worker     }
1994*6777b538SAndroid Build Coastguard Worker 
1995*6777b538SAndroid Build Coastguard Worker     return(0);
1996*6777b538SAndroid Build Coastguard Worker }
1997*6777b538SAndroid Build Coastguard Worker 
1998*6777b538SAndroid Build Coastguard Worker /************************************************************************
1999*6777b538SAndroid Build Coastguard Worker  *									*
2000*6777b538SAndroid Build Coastguard Worker  *			Constructor and destructors			*
2001*6777b538SAndroid Build Coastguard Worker  *									*
2002*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
2003*6777b538SAndroid Build Coastguard Worker /**
2004*6777b538SAndroid Build Coastguard Worker  * xmlNewTextReader:
2005*6777b538SAndroid Build Coastguard Worker  * @input: the xmlParserInputBufferPtr used to read data
2006*6777b538SAndroid Build Coastguard Worker  * @URI: the URI information for the source if available
2007*6777b538SAndroid Build Coastguard Worker  *
2008*6777b538SAndroid Build Coastguard Worker  * Create an xmlTextReader structure fed with @input
2009*6777b538SAndroid Build Coastguard Worker  *
2010*6777b538SAndroid Build Coastguard Worker  * Returns the new xmlTextReaderPtr or NULL in case of error
2011*6777b538SAndroid Build Coastguard Worker  */
2012*6777b538SAndroid Build Coastguard Worker xmlTextReaderPtr
xmlNewTextReader(xmlParserInputBufferPtr input,const char * URI)2013*6777b538SAndroid Build Coastguard Worker xmlNewTextReader(xmlParserInputBufferPtr input, const char *URI) {
2014*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr ret;
2015*6777b538SAndroid Build Coastguard Worker 
2016*6777b538SAndroid Build Coastguard Worker     if (input == NULL)
2017*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2018*6777b538SAndroid Build Coastguard Worker     ret = xmlMalloc(sizeof(xmlTextReader));
2019*6777b538SAndroid Build Coastguard Worker     if (ret == NULL)
2020*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2021*6777b538SAndroid Build Coastguard Worker     memset(ret, 0, sizeof(xmlTextReader));
2022*6777b538SAndroid Build Coastguard Worker     ret->doc = NULL;
2023*6777b538SAndroid Build Coastguard Worker     ret->entTab = NULL;
2024*6777b538SAndroid Build Coastguard Worker     ret->entMax = 0;
2025*6777b538SAndroid Build Coastguard Worker     ret->entNr = 0;
2026*6777b538SAndroid Build Coastguard Worker     ret->input = input;
2027*6777b538SAndroid Build Coastguard Worker     ret->buffer = xmlBufCreateSize(100);
2028*6777b538SAndroid Build Coastguard Worker     if (ret->buffer == NULL) {
2029*6777b538SAndroid Build Coastguard Worker         xmlFree(ret);
2030*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2031*6777b538SAndroid Build Coastguard Worker     }
2032*6777b538SAndroid Build Coastguard Worker     /* no operation on a reader should require a huge buffer */
2033*6777b538SAndroid Build Coastguard Worker     xmlBufSetAllocationScheme(ret->buffer,
2034*6777b538SAndroid Build Coastguard Worker 			      XML_BUFFER_ALLOC_DOUBLEIT);
2035*6777b538SAndroid Build Coastguard Worker     ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler));
2036*6777b538SAndroid Build Coastguard Worker     if (ret->sax == NULL) {
2037*6777b538SAndroid Build Coastguard Worker 	xmlBufFree(ret->buffer);
2038*6777b538SAndroid Build Coastguard Worker 	xmlFree(ret);
2039*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2040*6777b538SAndroid Build Coastguard Worker     }
2041*6777b538SAndroid Build Coastguard Worker     xmlSAXVersion(ret->sax, 2);
2042*6777b538SAndroid Build Coastguard Worker     ret->startElement = ret->sax->startElement;
2043*6777b538SAndroid Build Coastguard Worker     ret->sax->startElement = xmlTextReaderStartElement;
2044*6777b538SAndroid Build Coastguard Worker     ret->endElement = ret->sax->endElement;
2045*6777b538SAndroid Build Coastguard Worker     ret->sax->endElement = xmlTextReaderEndElement;
2046*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
2047*6777b538SAndroid Build Coastguard Worker     if (ret->sax->initialized == XML_SAX2_MAGIC) {
2048*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
2049*6777b538SAndroid Build Coastguard Worker 	ret->startElementNs = ret->sax->startElementNs;
2050*6777b538SAndroid Build Coastguard Worker 	ret->sax->startElementNs = xmlTextReaderStartElementNs;
2051*6777b538SAndroid Build Coastguard Worker 	ret->endElementNs = ret->sax->endElementNs;
2052*6777b538SAndroid Build Coastguard Worker 	ret->sax->endElementNs = xmlTextReaderEndElementNs;
2053*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
2054*6777b538SAndroid Build Coastguard Worker     } else {
2055*6777b538SAndroid Build Coastguard Worker 	ret->startElementNs = NULL;
2056*6777b538SAndroid Build Coastguard Worker 	ret->endElementNs = NULL;
2057*6777b538SAndroid Build Coastguard Worker     }
2058*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
2059*6777b538SAndroid Build Coastguard Worker     ret->characters = ret->sax->characters;
2060*6777b538SAndroid Build Coastguard Worker     ret->sax->characters = xmlTextReaderCharacters;
2061*6777b538SAndroid Build Coastguard Worker     ret->sax->ignorableWhitespace = xmlTextReaderCharacters;
2062*6777b538SAndroid Build Coastguard Worker     ret->cdataBlock = ret->sax->cdataBlock;
2063*6777b538SAndroid Build Coastguard Worker     ret->sax->cdataBlock = xmlTextReaderCDataBlock;
2064*6777b538SAndroid Build Coastguard Worker 
2065*6777b538SAndroid Build Coastguard Worker     ret->mode = XML_TEXTREADER_MODE_INITIAL;
2066*6777b538SAndroid Build Coastguard Worker     ret->node = NULL;
2067*6777b538SAndroid Build Coastguard Worker     ret->curnode = NULL;
2068*6777b538SAndroid Build Coastguard Worker     if (xmlBufUse(ret->input->buffer) < 4) {
2069*6777b538SAndroid Build Coastguard Worker 	xmlParserInputBufferRead(input, 4);
2070*6777b538SAndroid Build Coastguard Worker     }
2071*6777b538SAndroid Build Coastguard Worker     if (xmlBufUse(ret->input->buffer) >= 4) {
2072*6777b538SAndroid Build Coastguard Worker 	ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL,
2073*6777b538SAndroid Build Coastguard Worker 			     (const char *) xmlBufContent(ret->input->buffer),
2074*6777b538SAndroid Build Coastguard Worker                                             4, URI);
2075*6777b538SAndroid Build Coastguard Worker 	ret->base = 0;
2076*6777b538SAndroid Build Coastguard Worker 	ret->cur = 4;
2077*6777b538SAndroid Build Coastguard Worker     } else {
2078*6777b538SAndroid Build Coastguard Worker 	ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, NULL, 0, URI);
2079*6777b538SAndroid Build Coastguard Worker 	ret->base = 0;
2080*6777b538SAndroid Build Coastguard Worker 	ret->cur = 0;
2081*6777b538SAndroid Build Coastguard Worker     }
2082*6777b538SAndroid Build Coastguard Worker 
2083*6777b538SAndroid Build Coastguard Worker     if (ret->ctxt == NULL) {
2084*6777b538SAndroid Build Coastguard Worker 	xmlBufFree(ret->buffer);
2085*6777b538SAndroid Build Coastguard Worker 	xmlFree(ret->sax);
2086*6777b538SAndroid Build Coastguard Worker 	xmlFree(ret);
2087*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2088*6777b538SAndroid Build Coastguard Worker     }
2089*6777b538SAndroid Build Coastguard Worker     ret->ctxt->parseMode = XML_PARSE_READER;
2090*6777b538SAndroid Build Coastguard Worker     ret->ctxt->_private = ret;
2091*6777b538SAndroid Build Coastguard Worker     ret->ctxt->linenumbers = 1;
2092*6777b538SAndroid Build Coastguard Worker     ret->ctxt->dictNames = 1;
2093*6777b538SAndroid Build Coastguard Worker     ret->allocs = XML_TEXTREADER_CTXT;
2094*6777b538SAndroid Build Coastguard Worker     /*
2095*6777b538SAndroid Build Coastguard Worker      * use the parser dictionary to allocate all elements and attributes names
2096*6777b538SAndroid Build Coastguard Worker      */
2097*6777b538SAndroid Build Coastguard Worker     ret->dict = ret->ctxt->dict;
2098*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
2099*6777b538SAndroid Build Coastguard Worker     ret->xinclude = 0;
2100*6777b538SAndroid Build Coastguard Worker #endif
2101*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
2102*6777b538SAndroid Build Coastguard Worker     ret->patternMax = 0;
2103*6777b538SAndroid Build Coastguard Worker     ret->patternTab = NULL;
2104*6777b538SAndroid Build Coastguard Worker #endif
2105*6777b538SAndroid Build Coastguard Worker     return(ret);
2106*6777b538SAndroid Build Coastguard Worker }
2107*6777b538SAndroid Build Coastguard Worker 
2108*6777b538SAndroid Build Coastguard Worker /**
2109*6777b538SAndroid Build Coastguard Worker  * xmlNewTextReaderFilename:
2110*6777b538SAndroid Build Coastguard Worker  * @URI: the URI of the resource to process
2111*6777b538SAndroid Build Coastguard Worker  *
2112*6777b538SAndroid Build Coastguard Worker  * Create an xmlTextReader structure fed with the resource at @URI
2113*6777b538SAndroid Build Coastguard Worker  *
2114*6777b538SAndroid Build Coastguard Worker  * Returns the new xmlTextReaderPtr or NULL in case of error
2115*6777b538SAndroid Build Coastguard Worker  */
2116*6777b538SAndroid Build Coastguard Worker xmlTextReaderPtr
xmlNewTextReaderFilename(const char * URI)2117*6777b538SAndroid Build Coastguard Worker xmlNewTextReaderFilename(const char *URI) {
2118*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr input;
2119*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr ret;
2120*6777b538SAndroid Build Coastguard Worker 
2121*6777b538SAndroid Build Coastguard Worker     input = xmlParserInputBufferCreateFilename(URI, XML_CHAR_ENCODING_NONE);
2122*6777b538SAndroid Build Coastguard Worker     if (input == NULL)
2123*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2124*6777b538SAndroid Build Coastguard Worker     ret = xmlNewTextReader(input, URI);
2125*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
2126*6777b538SAndroid Build Coastguard Worker 	xmlFreeParserInputBuffer(input);
2127*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2128*6777b538SAndroid Build Coastguard Worker     }
2129*6777b538SAndroid Build Coastguard Worker     ret->allocs |= XML_TEXTREADER_INPUT;
2130*6777b538SAndroid Build Coastguard Worker     return(ret);
2131*6777b538SAndroid Build Coastguard Worker }
2132*6777b538SAndroid Build Coastguard Worker 
2133*6777b538SAndroid Build Coastguard Worker /**
2134*6777b538SAndroid Build Coastguard Worker  * xmlFreeTextReader:
2135*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr
2136*6777b538SAndroid Build Coastguard Worker  *
2137*6777b538SAndroid Build Coastguard Worker  * Deallocate all the resources associated to the reader
2138*6777b538SAndroid Build Coastguard Worker  */
2139*6777b538SAndroid Build Coastguard Worker void
xmlFreeTextReader(xmlTextReaderPtr reader)2140*6777b538SAndroid Build Coastguard Worker xmlFreeTextReader(xmlTextReaderPtr reader) {
2141*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2142*6777b538SAndroid Build Coastguard Worker 	return;
2143*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
2144*6777b538SAndroid Build Coastguard Worker     if (reader->rngSchemas != NULL) {
2145*6777b538SAndroid Build Coastguard Worker 	xmlRelaxNGFree(reader->rngSchemas);
2146*6777b538SAndroid Build Coastguard Worker 	reader->rngSchemas = NULL;
2147*6777b538SAndroid Build Coastguard Worker     }
2148*6777b538SAndroid Build Coastguard Worker     if (reader->rngValidCtxt != NULL) {
2149*6777b538SAndroid Build Coastguard Worker 	if (! reader->rngPreserveCtxt)
2150*6777b538SAndroid Build Coastguard Worker 	    xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt);
2151*6777b538SAndroid Build Coastguard Worker 	reader->rngValidCtxt = NULL;
2152*6777b538SAndroid Build Coastguard Worker     }
2153*6777b538SAndroid Build Coastguard Worker     if (reader->xsdPlug != NULL) {
2154*6777b538SAndroid Build Coastguard Worker 	xmlSchemaSAXUnplug(reader->xsdPlug);
2155*6777b538SAndroid Build Coastguard Worker 	reader->xsdPlug = NULL;
2156*6777b538SAndroid Build Coastguard Worker     }
2157*6777b538SAndroid Build Coastguard Worker     if (reader->xsdValidCtxt != NULL) {
2158*6777b538SAndroid Build Coastguard Worker 	if (! reader->xsdPreserveCtxt)
2159*6777b538SAndroid Build Coastguard Worker 	    xmlSchemaFreeValidCtxt(reader->xsdValidCtxt);
2160*6777b538SAndroid Build Coastguard Worker 	reader->xsdValidCtxt = NULL;
2161*6777b538SAndroid Build Coastguard Worker     }
2162*6777b538SAndroid Build Coastguard Worker     if (reader->xsdSchemas != NULL) {
2163*6777b538SAndroid Build Coastguard Worker 	xmlSchemaFree(reader->xsdSchemas);
2164*6777b538SAndroid Build Coastguard Worker 	reader->xsdSchemas = NULL;
2165*6777b538SAndroid Build Coastguard Worker     }
2166*6777b538SAndroid Build Coastguard Worker #endif
2167*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
2168*6777b538SAndroid Build Coastguard Worker     if (reader->xincctxt != NULL)
2169*6777b538SAndroid Build Coastguard Worker 	xmlXIncludeFreeContext(reader->xincctxt);
2170*6777b538SAndroid Build Coastguard Worker #endif
2171*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
2172*6777b538SAndroid Build Coastguard Worker     if (reader->patternTab != NULL) {
2173*6777b538SAndroid Build Coastguard Worker         int i;
2174*6777b538SAndroid Build Coastguard Worker 	for (i = 0;i < reader->patternNr;i++) {
2175*6777b538SAndroid Build Coastguard Worker 	    if (reader->patternTab[i] != NULL)
2176*6777b538SAndroid Build Coastguard Worker 	        xmlFreePattern(reader->patternTab[i]);
2177*6777b538SAndroid Build Coastguard Worker 	}
2178*6777b538SAndroid Build Coastguard Worker 	xmlFree(reader->patternTab);
2179*6777b538SAndroid Build Coastguard Worker     }
2180*6777b538SAndroid Build Coastguard Worker #endif
2181*6777b538SAndroid Build Coastguard Worker     if (reader->mode != XML_TEXTREADER_MODE_CLOSED)
2182*6777b538SAndroid Build Coastguard Worker         xmlTextReaderClose(reader);
2183*6777b538SAndroid Build Coastguard Worker     if (reader->ctxt != NULL) {
2184*6777b538SAndroid Build Coastguard Worker         if (reader->dict == reader->ctxt->dict)
2185*6777b538SAndroid Build Coastguard Worker 	    reader->dict = NULL;
2186*6777b538SAndroid Build Coastguard Worker 	if (reader->allocs & XML_TEXTREADER_CTXT)
2187*6777b538SAndroid Build Coastguard Worker 	    xmlFreeParserCtxt(reader->ctxt);
2188*6777b538SAndroid Build Coastguard Worker     }
2189*6777b538SAndroid Build Coastguard Worker     if (reader->sax != NULL)
2190*6777b538SAndroid Build Coastguard Worker 	xmlFree(reader->sax);
2191*6777b538SAndroid Build Coastguard Worker     if (reader->buffer != NULL)
2192*6777b538SAndroid Build Coastguard Worker         xmlBufFree(reader->buffer);
2193*6777b538SAndroid Build Coastguard Worker     if (reader->entTab != NULL)
2194*6777b538SAndroid Build Coastguard Worker 	xmlFree(reader->entTab);
2195*6777b538SAndroid Build Coastguard Worker     if (reader->dict != NULL)
2196*6777b538SAndroid Build Coastguard Worker         xmlDictFree(reader->dict);
2197*6777b538SAndroid Build Coastguard Worker     xmlFree(reader);
2198*6777b538SAndroid Build Coastguard Worker }
2199*6777b538SAndroid Build Coastguard Worker 
2200*6777b538SAndroid Build Coastguard Worker /************************************************************************
2201*6777b538SAndroid Build Coastguard Worker  *									*
2202*6777b538SAndroid Build Coastguard Worker  *			Methods for XmlTextReader			*
2203*6777b538SAndroid Build Coastguard Worker  *									*
2204*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
2205*6777b538SAndroid Build Coastguard Worker /**
2206*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderClose:
2207*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2208*6777b538SAndroid Build Coastguard Worker  *
2209*6777b538SAndroid Build Coastguard Worker  * This method releases any resources allocated by the current instance
2210*6777b538SAndroid Build Coastguard Worker  * changes the state to Closed and close any underlying input.
2211*6777b538SAndroid Build Coastguard Worker  *
2212*6777b538SAndroid Build Coastguard Worker  * Returns 0 or -1 in case of error
2213*6777b538SAndroid Build Coastguard Worker  */
2214*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderClose(xmlTextReaderPtr reader)2215*6777b538SAndroid Build Coastguard Worker xmlTextReaderClose(xmlTextReaderPtr reader) {
2216*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2217*6777b538SAndroid Build Coastguard Worker 	return(-1);
2218*6777b538SAndroid Build Coastguard Worker     reader->node = NULL;
2219*6777b538SAndroid Build Coastguard Worker     reader->curnode = NULL;
2220*6777b538SAndroid Build Coastguard Worker     reader->mode = XML_TEXTREADER_MODE_CLOSED;
2221*6777b538SAndroid Build Coastguard Worker     if (reader->faketext != NULL) {
2222*6777b538SAndroid Build Coastguard Worker         xmlFreeNode(reader->faketext);
2223*6777b538SAndroid Build Coastguard Worker         reader->faketext = NULL;
2224*6777b538SAndroid Build Coastguard Worker     }
2225*6777b538SAndroid Build Coastguard Worker     if (reader->ctxt != NULL) {
2226*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
2227*6777b538SAndroid Build Coastguard Worker 	if ((reader->ctxt->vctxt.vstateTab != NULL) &&
2228*6777b538SAndroid Build Coastguard Worker 	    (reader->ctxt->vctxt.vstateMax > 0)){
2229*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_REGEXP_ENABLED
2230*6777b538SAndroid Build Coastguard Worker             while (reader->ctxt->vctxt.vstateNr > 0)
2231*6777b538SAndroid Build Coastguard Worker                 xmlValidatePopElement(&reader->ctxt->vctxt, NULL, NULL, NULL);
2232*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_REGEXP_ENABLED */
2233*6777b538SAndroid Build Coastguard Worker 	    xmlFree(reader->ctxt->vctxt.vstateTab);
2234*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->vctxt.vstateTab = NULL;
2235*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->vctxt.vstateMax = 0;
2236*6777b538SAndroid Build Coastguard Worker 	}
2237*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
2238*6777b538SAndroid Build Coastguard Worker 	xmlStopParser(reader->ctxt);
2239*6777b538SAndroid Build Coastguard Worker 	if (reader->ctxt->myDoc != NULL) {
2240*6777b538SAndroid Build Coastguard Worker 	    if (reader->preserve == 0)
2241*6777b538SAndroid Build Coastguard Worker 		xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc);
2242*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->myDoc = NULL;
2243*6777b538SAndroid Build Coastguard Worker 	}
2244*6777b538SAndroid Build Coastguard Worker     }
2245*6777b538SAndroid Build Coastguard Worker     if ((reader->input != NULL)  && (reader->allocs & XML_TEXTREADER_INPUT)) {
2246*6777b538SAndroid Build Coastguard Worker 	xmlFreeParserInputBuffer(reader->input);
2247*6777b538SAndroid Build Coastguard Worker 	reader->allocs -= XML_TEXTREADER_INPUT;
2248*6777b538SAndroid Build Coastguard Worker     }
2249*6777b538SAndroid Build Coastguard Worker     return(0);
2250*6777b538SAndroid Build Coastguard Worker }
2251*6777b538SAndroid Build Coastguard Worker 
2252*6777b538SAndroid Build Coastguard Worker /**
2253*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderGetAttributeNo:
2254*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2255*6777b538SAndroid Build Coastguard Worker  * @no: the zero-based index of the attribute relative to the containing element
2256*6777b538SAndroid Build Coastguard Worker  *
2257*6777b538SAndroid Build Coastguard Worker  * Provides the value of the attribute with the specified index relative
2258*6777b538SAndroid Build Coastguard Worker  * to the containing element.
2259*6777b538SAndroid Build Coastguard Worker  *
2260*6777b538SAndroid Build Coastguard Worker  * Returns a string containing the value of the specified attribute, or NULL
2261*6777b538SAndroid Build Coastguard Worker  *    in case of error. The string must be deallocated by the caller.
2262*6777b538SAndroid Build Coastguard Worker  */
2263*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderGetAttributeNo(xmlTextReaderPtr reader,int no)2264*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetAttributeNo(xmlTextReaderPtr reader, int no) {
2265*6777b538SAndroid Build Coastguard Worker     xmlChar *ret;
2266*6777b538SAndroid Build Coastguard Worker     int i;
2267*6777b538SAndroid Build Coastguard Worker     xmlAttrPtr cur;
2268*6777b538SAndroid Build Coastguard Worker     xmlNsPtr ns;
2269*6777b538SAndroid Build Coastguard Worker 
2270*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2271*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2272*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2273*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2274*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
2275*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2276*6777b538SAndroid Build Coastguard Worker     /* TODO: handle the xmlDecl */
2277*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
2278*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2279*6777b538SAndroid Build Coastguard Worker 
2280*6777b538SAndroid Build Coastguard Worker     ns = reader->node->nsDef;
2281*6777b538SAndroid Build Coastguard Worker     for (i = 0;(i < no) && (ns != NULL);i++) {
2282*6777b538SAndroid Build Coastguard Worker 	ns = ns->next;
2283*6777b538SAndroid Build Coastguard Worker     }
2284*6777b538SAndroid Build Coastguard Worker     if (ns != NULL)
2285*6777b538SAndroid Build Coastguard Worker 	return(xmlStrdup(ns->href));
2286*6777b538SAndroid Build Coastguard Worker 
2287*6777b538SAndroid Build Coastguard Worker     cur = reader->node->properties;
2288*6777b538SAndroid Build Coastguard Worker     if (cur == NULL)
2289*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2290*6777b538SAndroid Build Coastguard Worker     for (;i < no;i++) {
2291*6777b538SAndroid Build Coastguard Worker 	cur = cur->next;
2292*6777b538SAndroid Build Coastguard Worker 	if (cur == NULL)
2293*6777b538SAndroid Build Coastguard Worker 	    return(NULL);
2294*6777b538SAndroid Build Coastguard Worker     }
2295*6777b538SAndroid Build Coastguard Worker     /* TODO walk the DTD if present */
2296*6777b538SAndroid Build Coastguard Worker 
2297*6777b538SAndroid Build Coastguard Worker     ret = xmlNodeListGetString(reader->node->doc, cur->children, 1);
2298*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) return(xmlStrdup((xmlChar *)""));
2299*6777b538SAndroid Build Coastguard Worker     return(ret);
2300*6777b538SAndroid Build Coastguard Worker }
2301*6777b538SAndroid Build Coastguard Worker 
2302*6777b538SAndroid Build Coastguard Worker /**
2303*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderGetAttribute:
2304*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2305*6777b538SAndroid Build Coastguard Worker  * @name: the qualified name of the attribute.
2306*6777b538SAndroid Build Coastguard Worker  *
2307*6777b538SAndroid Build Coastguard Worker  * Provides the value of the attribute with the specified qualified name.
2308*6777b538SAndroid Build Coastguard Worker  *
2309*6777b538SAndroid Build Coastguard Worker  * Returns a string containing the value of the specified attribute, or NULL
2310*6777b538SAndroid Build Coastguard Worker  *    in case of error. The string must be deallocated by the caller.
2311*6777b538SAndroid Build Coastguard Worker  */
2312*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderGetAttribute(xmlTextReaderPtr reader,const xmlChar * name)2313*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetAttribute(xmlTextReaderPtr reader, const xmlChar *name) {
2314*6777b538SAndroid Build Coastguard Worker     xmlChar *prefix = NULL;
2315*6777b538SAndroid Build Coastguard Worker     xmlChar *localname;
2316*6777b538SAndroid Build Coastguard Worker     xmlNsPtr ns;
2317*6777b538SAndroid Build Coastguard Worker     xmlChar *ret = NULL;
2318*6777b538SAndroid Build Coastguard Worker 
2319*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (name == NULL))
2320*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2321*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2322*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2323*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
2324*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2325*6777b538SAndroid Build Coastguard Worker 
2326*6777b538SAndroid Build Coastguard Worker     /* TODO: handle the xmlDecl */
2327*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
2328*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2329*6777b538SAndroid Build Coastguard Worker 
2330*6777b538SAndroid Build Coastguard Worker     localname = xmlSplitQName2(name, &prefix);
2331*6777b538SAndroid Build Coastguard Worker     if (localname == NULL) {
2332*6777b538SAndroid Build Coastguard Worker 		/*
2333*6777b538SAndroid Build Coastguard Worker 		 * Namespace default decl
2334*6777b538SAndroid Build Coastguard Worker 		 */
2335*6777b538SAndroid Build Coastguard Worker 		if (xmlStrEqual(name, BAD_CAST "xmlns")) {
2336*6777b538SAndroid Build Coastguard Worker 			ns = reader->node->nsDef;
2337*6777b538SAndroid Build Coastguard Worker 			while (ns != NULL) {
2338*6777b538SAndroid Build Coastguard Worker 				if (ns->prefix == NULL) {
2339*6777b538SAndroid Build Coastguard Worker 					return(xmlStrdup(ns->href));
2340*6777b538SAndroid Build Coastguard Worker 				}
2341*6777b538SAndroid Build Coastguard Worker 				ns = ns->next;
2342*6777b538SAndroid Build Coastguard Worker 			}
2343*6777b538SAndroid Build Coastguard Worker 			return NULL;
2344*6777b538SAndroid Build Coastguard Worker 		}
2345*6777b538SAndroid Build Coastguard Worker 		return(xmlGetNoNsProp(reader->node, name));
2346*6777b538SAndroid Build Coastguard Worker 	}
2347*6777b538SAndroid Build Coastguard Worker 
2348*6777b538SAndroid Build Coastguard Worker     /*
2349*6777b538SAndroid Build Coastguard Worker      * Namespace default decl
2350*6777b538SAndroid Build Coastguard Worker      */
2351*6777b538SAndroid Build Coastguard Worker     if (xmlStrEqual(prefix, BAD_CAST "xmlns")) {
2352*6777b538SAndroid Build Coastguard Worker 		ns = reader->node->nsDef;
2353*6777b538SAndroid Build Coastguard Worker 		while (ns != NULL) {
2354*6777b538SAndroid Build Coastguard Worker 			if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) {
2355*6777b538SAndroid Build Coastguard Worker 				ret = xmlStrdup(ns->href);
2356*6777b538SAndroid Build Coastguard Worker 				break;
2357*6777b538SAndroid Build Coastguard Worker 			}
2358*6777b538SAndroid Build Coastguard Worker 			ns = ns->next;
2359*6777b538SAndroid Build Coastguard Worker 		}
2360*6777b538SAndroid Build Coastguard Worker     } else {
2361*6777b538SAndroid Build Coastguard Worker 		ns = xmlSearchNs(reader->node->doc, reader->node, prefix);
2362*6777b538SAndroid Build Coastguard Worker 		if (ns != NULL)
2363*6777b538SAndroid Build Coastguard Worker 			ret = xmlGetNsProp(reader->node, localname, ns->href);
2364*6777b538SAndroid Build Coastguard Worker 	}
2365*6777b538SAndroid Build Coastguard Worker 
2366*6777b538SAndroid Build Coastguard Worker     xmlFree(localname);
2367*6777b538SAndroid Build Coastguard Worker     if (prefix != NULL)
2368*6777b538SAndroid Build Coastguard Worker         xmlFree(prefix);
2369*6777b538SAndroid Build Coastguard Worker     return(ret);
2370*6777b538SAndroid Build Coastguard Worker }
2371*6777b538SAndroid Build Coastguard Worker 
2372*6777b538SAndroid Build Coastguard Worker 
2373*6777b538SAndroid Build Coastguard Worker /**
2374*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderGetAttributeNs:
2375*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2376*6777b538SAndroid Build Coastguard Worker  * @localName: the local name of the attribute.
2377*6777b538SAndroid Build Coastguard Worker  * @namespaceURI: the namespace URI of the attribute.
2378*6777b538SAndroid Build Coastguard Worker  *
2379*6777b538SAndroid Build Coastguard Worker  * Provides the value of the specified attribute
2380*6777b538SAndroid Build Coastguard Worker  *
2381*6777b538SAndroid Build Coastguard Worker  * Returns a string containing the value of the specified attribute, or NULL
2382*6777b538SAndroid Build Coastguard Worker  *    in case of error. The string must be deallocated by the caller.
2383*6777b538SAndroid Build Coastguard Worker  */
2384*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderGetAttributeNs(xmlTextReaderPtr reader,const xmlChar * localName,const xmlChar * namespaceURI)2385*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetAttributeNs(xmlTextReaderPtr reader, const xmlChar *localName,
2386*6777b538SAndroid Build Coastguard Worker 			    const xmlChar *namespaceURI) {
2387*6777b538SAndroid Build Coastguard Worker     xmlChar *prefix = NULL;
2388*6777b538SAndroid Build Coastguard Worker     xmlNsPtr ns;
2389*6777b538SAndroid Build Coastguard Worker 
2390*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (localName == NULL))
2391*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2392*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2393*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2394*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
2395*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2396*6777b538SAndroid Build Coastguard Worker 
2397*6777b538SAndroid Build Coastguard Worker     /* TODO: handle the xmlDecl */
2398*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
2399*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2400*6777b538SAndroid Build Coastguard Worker 
2401*6777b538SAndroid Build Coastguard Worker     if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) {
2402*6777b538SAndroid Build Coastguard Worker 		if (! xmlStrEqual(localName, BAD_CAST "xmlns")) {
2403*6777b538SAndroid Build Coastguard Worker 			prefix = BAD_CAST localName;
2404*6777b538SAndroid Build Coastguard Worker 		}
2405*6777b538SAndroid Build Coastguard Worker 		ns = reader->node->nsDef;
2406*6777b538SAndroid Build Coastguard Worker 		while (ns != NULL) {
2407*6777b538SAndroid Build Coastguard Worker 			if ((prefix == NULL && ns->prefix == NULL) ||
2408*6777b538SAndroid Build Coastguard Worker 				((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) {
2409*6777b538SAndroid Build Coastguard Worker 				return xmlStrdup(ns->href);
2410*6777b538SAndroid Build Coastguard Worker 			}
2411*6777b538SAndroid Build Coastguard Worker 			ns = ns->next;
2412*6777b538SAndroid Build Coastguard Worker 		}
2413*6777b538SAndroid Build Coastguard Worker 		return NULL;
2414*6777b538SAndroid Build Coastguard Worker     }
2415*6777b538SAndroid Build Coastguard Worker 
2416*6777b538SAndroid Build Coastguard Worker     return(xmlGetNsProp(reader->node, localName, namespaceURI));
2417*6777b538SAndroid Build Coastguard Worker }
2418*6777b538SAndroid Build Coastguard Worker 
2419*6777b538SAndroid Build Coastguard Worker /**
2420*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderGetRemainder:
2421*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2422*6777b538SAndroid Build Coastguard Worker  *
2423*6777b538SAndroid Build Coastguard Worker  * Method to get the remainder of the buffered XML. this method stops the
2424*6777b538SAndroid Build Coastguard Worker  * parser, set its state to End Of File and return the input stream with
2425*6777b538SAndroid Build Coastguard Worker  * what is left that the parser did not use.
2426*6777b538SAndroid Build Coastguard Worker  *
2427*6777b538SAndroid Build Coastguard Worker  * The implementation is not good, the parser certainly progressed past
2428*6777b538SAndroid Build Coastguard Worker  * what's left in reader->input, and there is an allocation problem. Best
2429*6777b538SAndroid Build Coastguard Worker  * would be to rewrite it differently.
2430*6777b538SAndroid Build Coastguard Worker  *
2431*6777b538SAndroid Build Coastguard Worker  * Returns the xmlParserInputBufferPtr attached to the XML or NULL
2432*6777b538SAndroid Build Coastguard Worker  *    in case of error.
2433*6777b538SAndroid Build Coastguard Worker  */
2434*6777b538SAndroid Build Coastguard Worker xmlParserInputBufferPtr
xmlTextReaderGetRemainder(xmlTextReaderPtr reader)2435*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetRemainder(xmlTextReaderPtr reader) {
2436*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr ret = NULL;
2437*6777b538SAndroid Build Coastguard Worker 
2438*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2439*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2440*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2441*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2442*6777b538SAndroid Build Coastguard Worker 
2443*6777b538SAndroid Build Coastguard Worker     reader->node = NULL;
2444*6777b538SAndroid Build Coastguard Worker     reader->curnode = NULL;
2445*6777b538SAndroid Build Coastguard Worker     reader->mode = XML_TEXTREADER_MODE_EOF;
2446*6777b538SAndroid Build Coastguard Worker     if (reader->ctxt != NULL) {
2447*6777b538SAndroid Build Coastguard Worker 	xmlStopParser(reader->ctxt);
2448*6777b538SAndroid Build Coastguard Worker 	if (reader->ctxt->myDoc != NULL) {
2449*6777b538SAndroid Build Coastguard Worker 	    if (reader->preserve == 0)
2450*6777b538SAndroid Build Coastguard Worker 		xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc);
2451*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->myDoc = NULL;
2452*6777b538SAndroid Build Coastguard Worker 	}
2453*6777b538SAndroid Build Coastguard Worker     }
2454*6777b538SAndroid Build Coastguard Worker     if (reader->allocs & XML_TEXTREADER_INPUT) {
2455*6777b538SAndroid Build Coastguard Worker 	ret = reader->input;
2456*6777b538SAndroid Build Coastguard Worker 	reader->input = NULL;
2457*6777b538SAndroid Build Coastguard Worker 	reader->allocs -= XML_TEXTREADER_INPUT;
2458*6777b538SAndroid Build Coastguard Worker     } else {
2459*6777b538SAndroid Build Coastguard Worker 	/*
2460*6777b538SAndroid Build Coastguard Worker 	 * Hum, one may need to duplicate the data structure because
2461*6777b538SAndroid Build Coastguard Worker 	 * without reference counting the input may be freed twice:
2462*6777b538SAndroid Build Coastguard Worker 	 *   - by the layer which allocated it.
2463*6777b538SAndroid Build Coastguard Worker 	 *   - by the layer to which would have been returned to.
2464*6777b538SAndroid Build Coastguard Worker 	 */
2465*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2466*6777b538SAndroid Build Coastguard Worker     }
2467*6777b538SAndroid Build Coastguard Worker     return(ret);
2468*6777b538SAndroid Build Coastguard Worker }
2469*6777b538SAndroid Build Coastguard Worker 
2470*6777b538SAndroid Build Coastguard Worker /**
2471*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderLookupNamespace:
2472*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2473*6777b538SAndroid Build Coastguard Worker  * @prefix: the prefix whose namespace URI is to be resolved. To return
2474*6777b538SAndroid Build Coastguard Worker  *          the default namespace, specify NULL
2475*6777b538SAndroid Build Coastguard Worker  *
2476*6777b538SAndroid Build Coastguard Worker  * Resolves a namespace prefix in the scope of the current element.
2477*6777b538SAndroid Build Coastguard Worker  *
2478*6777b538SAndroid Build Coastguard Worker  * Returns a string containing the namespace URI to which the prefix maps
2479*6777b538SAndroid Build Coastguard Worker  *    or NULL in case of error. The string must be deallocated by the caller.
2480*6777b538SAndroid Build Coastguard Worker  */
2481*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderLookupNamespace(xmlTextReaderPtr reader,const xmlChar * prefix)2482*6777b538SAndroid Build Coastguard Worker xmlTextReaderLookupNamespace(xmlTextReaderPtr reader, const xmlChar *prefix) {
2483*6777b538SAndroid Build Coastguard Worker     xmlNsPtr ns;
2484*6777b538SAndroid Build Coastguard Worker 
2485*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2486*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2487*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2488*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2489*6777b538SAndroid Build Coastguard Worker 
2490*6777b538SAndroid Build Coastguard Worker     ns = xmlSearchNs(reader->node->doc, reader->node, prefix);
2491*6777b538SAndroid Build Coastguard Worker     if (ns == NULL)
2492*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2493*6777b538SAndroid Build Coastguard Worker     return(xmlStrdup(ns->href));
2494*6777b538SAndroid Build Coastguard Worker }
2495*6777b538SAndroid Build Coastguard Worker 
2496*6777b538SAndroid Build Coastguard Worker /**
2497*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderMoveToAttributeNo:
2498*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2499*6777b538SAndroid Build Coastguard Worker  * @no: the zero-based index of the attribute relative to the containing
2500*6777b538SAndroid Build Coastguard Worker  *      element.
2501*6777b538SAndroid Build Coastguard Worker  *
2502*6777b538SAndroid Build Coastguard Worker  * Moves the position of the current instance to the attribute with
2503*6777b538SAndroid Build Coastguard Worker  * the specified index relative to the containing element.
2504*6777b538SAndroid Build Coastguard Worker  *
2505*6777b538SAndroid Build Coastguard Worker  * Returns 1 in case of success, -1 in case of error, 0 if not found
2506*6777b538SAndroid Build Coastguard Worker  */
2507*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader,int no)2508*6777b538SAndroid Build Coastguard Worker xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader, int no) {
2509*6777b538SAndroid Build Coastguard Worker     int i;
2510*6777b538SAndroid Build Coastguard Worker     xmlAttrPtr cur;
2511*6777b538SAndroid Build Coastguard Worker     xmlNsPtr ns;
2512*6777b538SAndroid Build Coastguard Worker 
2513*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2514*6777b538SAndroid Build Coastguard Worker 	return(-1);
2515*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2516*6777b538SAndroid Build Coastguard Worker 	return(-1);
2517*6777b538SAndroid Build Coastguard Worker     /* TODO: handle the xmlDecl */
2518*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
2519*6777b538SAndroid Build Coastguard Worker 	return(-1);
2520*6777b538SAndroid Build Coastguard Worker 
2521*6777b538SAndroid Build Coastguard Worker     reader->curnode = NULL;
2522*6777b538SAndroid Build Coastguard Worker 
2523*6777b538SAndroid Build Coastguard Worker     ns = reader->node->nsDef;
2524*6777b538SAndroid Build Coastguard Worker     for (i = 0;(i < no) && (ns != NULL);i++) {
2525*6777b538SAndroid Build Coastguard Worker 	ns = ns->next;
2526*6777b538SAndroid Build Coastguard Worker     }
2527*6777b538SAndroid Build Coastguard Worker     if (ns != NULL) {
2528*6777b538SAndroid Build Coastguard Worker 	reader->curnode = (xmlNodePtr) ns;
2529*6777b538SAndroid Build Coastguard Worker 	return(1);
2530*6777b538SAndroid Build Coastguard Worker     }
2531*6777b538SAndroid Build Coastguard Worker 
2532*6777b538SAndroid Build Coastguard Worker     cur = reader->node->properties;
2533*6777b538SAndroid Build Coastguard Worker     if (cur == NULL)
2534*6777b538SAndroid Build Coastguard Worker 	return(0);
2535*6777b538SAndroid Build Coastguard Worker     for (;i < no;i++) {
2536*6777b538SAndroid Build Coastguard Worker 	cur = cur->next;
2537*6777b538SAndroid Build Coastguard Worker 	if (cur == NULL)
2538*6777b538SAndroid Build Coastguard Worker 	    return(0);
2539*6777b538SAndroid Build Coastguard Worker     }
2540*6777b538SAndroid Build Coastguard Worker     /* TODO walk the DTD if present */
2541*6777b538SAndroid Build Coastguard Worker 
2542*6777b538SAndroid Build Coastguard Worker     reader->curnode = (xmlNodePtr) cur;
2543*6777b538SAndroid Build Coastguard Worker     return(1);
2544*6777b538SAndroid Build Coastguard Worker }
2545*6777b538SAndroid Build Coastguard Worker 
2546*6777b538SAndroid Build Coastguard Worker /**
2547*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderMoveToAttribute:
2548*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2549*6777b538SAndroid Build Coastguard Worker  * @name: the qualified name of the attribute.
2550*6777b538SAndroid Build Coastguard Worker  *
2551*6777b538SAndroid Build Coastguard Worker  * Moves the position of the current instance to the attribute with
2552*6777b538SAndroid Build Coastguard Worker  * the specified qualified name.
2553*6777b538SAndroid Build Coastguard Worker  *
2554*6777b538SAndroid Build Coastguard Worker  * Returns 1 in case of success, -1 in case of error, 0 if not found
2555*6777b538SAndroid Build Coastguard Worker  */
2556*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader,const xmlChar * name)2557*6777b538SAndroid Build Coastguard Worker xmlTextReaderMoveToAttribute(xmlTextReaderPtr reader, const xmlChar *name) {
2558*6777b538SAndroid Build Coastguard Worker     xmlChar *prefix = NULL;
2559*6777b538SAndroid Build Coastguard Worker     xmlChar *localname;
2560*6777b538SAndroid Build Coastguard Worker     xmlNsPtr ns;
2561*6777b538SAndroid Build Coastguard Worker     xmlAttrPtr prop;
2562*6777b538SAndroid Build Coastguard Worker 
2563*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (name == NULL))
2564*6777b538SAndroid Build Coastguard Worker 	return(-1);
2565*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2566*6777b538SAndroid Build Coastguard Worker 	return(-1);
2567*6777b538SAndroid Build Coastguard Worker 
2568*6777b538SAndroid Build Coastguard Worker     /* TODO: handle the xmlDecl */
2569*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
2570*6777b538SAndroid Build Coastguard Worker 	return(0);
2571*6777b538SAndroid Build Coastguard Worker 
2572*6777b538SAndroid Build Coastguard Worker     localname = xmlSplitQName2(name, &prefix);
2573*6777b538SAndroid Build Coastguard Worker     if (localname == NULL) {
2574*6777b538SAndroid Build Coastguard Worker 	/*
2575*6777b538SAndroid Build Coastguard Worker 	 * Namespace default decl
2576*6777b538SAndroid Build Coastguard Worker 	 */
2577*6777b538SAndroid Build Coastguard Worker 	if (xmlStrEqual(name, BAD_CAST "xmlns")) {
2578*6777b538SAndroid Build Coastguard Worker 	    ns = reader->node->nsDef;
2579*6777b538SAndroid Build Coastguard Worker 	    while (ns != NULL) {
2580*6777b538SAndroid Build Coastguard Worker 		if (ns->prefix == NULL) {
2581*6777b538SAndroid Build Coastguard Worker 		    reader->curnode = (xmlNodePtr) ns;
2582*6777b538SAndroid Build Coastguard Worker 		    return(1);
2583*6777b538SAndroid Build Coastguard Worker 		}
2584*6777b538SAndroid Build Coastguard Worker 		ns = ns->next;
2585*6777b538SAndroid Build Coastguard Worker 	    }
2586*6777b538SAndroid Build Coastguard Worker 	    return(0);
2587*6777b538SAndroid Build Coastguard Worker 	}
2588*6777b538SAndroid Build Coastguard Worker 
2589*6777b538SAndroid Build Coastguard Worker 	prop = reader->node->properties;
2590*6777b538SAndroid Build Coastguard Worker 	while (prop != NULL) {
2591*6777b538SAndroid Build Coastguard Worker 	    /*
2592*6777b538SAndroid Build Coastguard Worker 	     * One need to have
2593*6777b538SAndroid Build Coastguard Worker 	     *   - same attribute names
2594*6777b538SAndroid Build Coastguard Worker 	     *   - and the attribute carrying that namespace
2595*6777b538SAndroid Build Coastguard Worker 	     */
2596*6777b538SAndroid Build Coastguard Worker 	    if ((xmlStrEqual(prop->name, name)) &&
2597*6777b538SAndroid Build Coastguard Worker 		((prop->ns == NULL) || (prop->ns->prefix == NULL))) {
2598*6777b538SAndroid Build Coastguard Worker 		reader->curnode = (xmlNodePtr) prop;
2599*6777b538SAndroid Build Coastguard Worker 		return(1);
2600*6777b538SAndroid Build Coastguard Worker 	    }
2601*6777b538SAndroid Build Coastguard Worker 	    prop = prop->next;
2602*6777b538SAndroid Build Coastguard Worker 	}
2603*6777b538SAndroid Build Coastguard Worker 	return(0);
2604*6777b538SAndroid Build Coastguard Worker     }
2605*6777b538SAndroid Build Coastguard Worker 
2606*6777b538SAndroid Build Coastguard Worker     /*
2607*6777b538SAndroid Build Coastguard Worker      * Namespace default decl
2608*6777b538SAndroid Build Coastguard Worker      */
2609*6777b538SAndroid Build Coastguard Worker     if (xmlStrEqual(prefix, BAD_CAST "xmlns")) {
2610*6777b538SAndroid Build Coastguard Worker 	ns = reader->node->nsDef;
2611*6777b538SAndroid Build Coastguard Worker 	while (ns != NULL) {
2612*6777b538SAndroid Build Coastguard Worker 	    if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) {
2613*6777b538SAndroid Build Coastguard Worker 		reader->curnode = (xmlNodePtr) ns;
2614*6777b538SAndroid Build Coastguard Worker 		goto found;
2615*6777b538SAndroid Build Coastguard Worker 	    }
2616*6777b538SAndroid Build Coastguard Worker 	    ns = ns->next;
2617*6777b538SAndroid Build Coastguard Worker 	}
2618*6777b538SAndroid Build Coastguard Worker 	goto not_found;
2619*6777b538SAndroid Build Coastguard Worker     }
2620*6777b538SAndroid Build Coastguard Worker     prop = reader->node->properties;
2621*6777b538SAndroid Build Coastguard Worker     while (prop != NULL) {
2622*6777b538SAndroid Build Coastguard Worker 	/*
2623*6777b538SAndroid Build Coastguard Worker 	 * One need to have
2624*6777b538SAndroid Build Coastguard Worker 	 *   - same attribute names
2625*6777b538SAndroid Build Coastguard Worker 	 *   - and the attribute carrying that namespace
2626*6777b538SAndroid Build Coastguard Worker 	 */
2627*6777b538SAndroid Build Coastguard Worker 	if ((xmlStrEqual(prop->name, localname)) &&
2628*6777b538SAndroid Build Coastguard Worker 	    (prop->ns != NULL) && (xmlStrEqual(prop->ns->prefix, prefix))) {
2629*6777b538SAndroid Build Coastguard Worker 	    reader->curnode = (xmlNodePtr) prop;
2630*6777b538SAndroid Build Coastguard Worker 	    goto found;
2631*6777b538SAndroid Build Coastguard Worker 	}
2632*6777b538SAndroid Build Coastguard Worker 	prop = prop->next;
2633*6777b538SAndroid Build Coastguard Worker     }
2634*6777b538SAndroid Build Coastguard Worker not_found:
2635*6777b538SAndroid Build Coastguard Worker     if (localname != NULL)
2636*6777b538SAndroid Build Coastguard Worker         xmlFree(localname);
2637*6777b538SAndroid Build Coastguard Worker     if (prefix != NULL)
2638*6777b538SAndroid Build Coastguard Worker         xmlFree(prefix);
2639*6777b538SAndroid Build Coastguard Worker     return(0);
2640*6777b538SAndroid Build Coastguard Worker 
2641*6777b538SAndroid Build Coastguard Worker found:
2642*6777b538SAndroid Build Coastguard Worker     if (localname != NULL)
2643*6777b538SAndroid Build Coastguard Worker         xmlFree(localname);
2644*6777b538SAndroid Build Coastguard Worker     if (prefix != NULL)
2645*6777b538SAndroid Build Coastguard Worker         xmlFree(prefix);
2646*6777b538SAndroid Build Coastguard Worker     return(1);
2647*6777b538SAndroid Build Coastguard Worker }
2648*6777b538SAndroid Build Coastguard Worker 
2649*6777b538SAndroid Build Coastguard Worker /**
2650*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderMoveToAttributeNs:
2651*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2652*6777b538SAndroid Build Coastguard Worker  * @localName:  the local name of the attribute.
2653*6777b538SAndroid Build Coastguard Worker  * @namespaceURI:  the namespace URI of the attribute.
2654*6777b538SAndroid Build Coastguard Worker  *
2655*6777b538SAndroid Build Coastguard Worker  * Moves the position of the current instance to the attribute with the
2656*6777b538SAndroid Build Coastguard Worker  * specified local name and namespace URI.
2657*6777b538SAndroid Build Coastguard Worker  *
2658*6777b538SAndroid Build Coastguard Worker  * Returns 1 in case of success, -1 in case of error, 0 if not found
2659*6777b538SAndroid Build Coastguard Worker  */
2660*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader,const xmlChar * localName,const xmlChar * namespaceURI)2661*6777b538SAndroid Build Coastguard Worker xmlTextReaderMoveToAttributeNs(xmlTextReaderPtr reader,
2662*6777b538SAndroid Build Coastguard Worker 	const xmlChar *localName, const xmlChar *namespaceURI) {
2663*6777b538SAndroid Build Coastguard Worker     xmlAttrPtr prop;
2664*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
2665*6777b538SAndroid Build Coastguard Worker     xmlNsPtr ns;
2666*6777b538SAndroid Build Coastguard Worker     xmlChar *prefix = NULL;
2667*6777b538SAndroid Build Coastguard Worker 
2668*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (localName == NULL) || (namespaceURI == NULL))
2669*6777b538SAndroid Build Coastguard Worker 	return(-1);
2670*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2671*6777b538SAndroid Build Coastguard Worker 	return(-1);
2672*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
2673*6777b538SAndroid Build Coastguard Worker 	return(0);
2674*6777b538SAndroid Build Coastguard Worker     node = reader->node;
2675*6777b538SAndroid Build Coastguard Worker 
2676*6777b538SAndroid Build Coastguard Worker     if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) {
2677*6777b538SAndroid Build Coastguard Worker 		if (! xmlStrEqual(localName, BAD_CAST "xmlns")) {
2678*6777b538SAndroid Build Coastguard Worker 			prefix = BAD_CAST localName;
2679*6777b538SAndroid Build Coastguard Worker 		}
2680*6777b538SAndroid Build Coastguard Worker 		ns = reader->node->nsDef;
2681*6777b538SAndroid Build Coastguard Worker 		while (ns != NULL) {
2682*6777b538SAndroid Build Coastguard Worker 			if ((prefix == NULL && ns->prefix == NULL) ||
2683*6777b538SAndroid Build Coastguard Worker 				((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localName)))) {
2684*6777b538SAndroid Build Coastguard Worker 				reader->curnode = (xmlNodePtr) ns;
2685*6777b538SAndroid Build Coastguard Worker 				return(1);
2686*6777b538SAndroid Build Coastguard Worker 			}
2687*6777b538SAndroid Build Coastguard Worker 			ns = ns->next;
2688*6777b538SAndroid Build Coastguard Worker 		}
2689*6777b538SAndroid Build Coastguard Worker 		return(0);
2690*6777b538SAndroid Build Coastguard Worker     }
2691*6777b538SAndroid Build Coastguard Worker 
2692*6777b538SAndroid Build Coastguard Worker     prop = node->properties;
2693*6777b538SAndroid Build Coastguard Worker     while (prop != NULL) {
2694*6777b538SAndroid Build Coastguard Worker 	/*
2695*6777b538SAndroid Build Coastguard Worker 	 * One need to have
2696*6777b538SAndroid Build Coastguard Worker 	 *   - same attribute names
2697*6777b538SAndroid Build Coastguard Worker 	 *   - and the attribute carrying that namespace
2698*6777b538SAndroid Build Coastguard Worker 	 */
2699*6777b538SAndroid Build Coastguard Worker         if (xmlStrEqual(prop->name, localName) &&
2700*6777b538SAndroid Build Coastguard Worker 	    ((prop->ns != NULL) &&
2701*6777b538SAndroid Build Coastguard Worker 	     (xmlStrEqual(prop->ns->href, namespaceURI)))) {
2702*6777b538SAndroid Build Coastguard Worker 	    reader->curnode = (xmlNodePtr) prop;
2703*6777b538SAndroid Build Coastguard Worker 	    return(1);
2704*6777b538SAndroid Build Coastguard Worker         }
2705*6777b538SAndroid Build Coastguard Worker 	prop = prop->next;
2706*6777b538SAndroid Build Coastguard Worker     }
2707*6777b538SAndroid Build Coastguard Worker     return(0);
2708*6777b538SAndroid Build Coastguard Worker }
2709*6777b538SAndroid Build Coastguard Worker 
2710*6777b538SAndroid Build Coastguard Worker /**
2711*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderMoveToFirstAttribute:
2712*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2713*6777b538SAndroid Build Coastguard Worker  *
2714*6777b538SAndroid Build Coastguard Worker  * Moves the position of the current instance to the first attribute
2715*6777b538SAndroid Build Coastguard Worker  * associated with the current node.
2716*6777b538SAndroid Build Coastguard Worker  *
2717*6777b538SAndroid Build Coastguard Worker  * Returns 1 in case of success, -1 in case of error, 0 if not found
2718*6777b538SAndroid Build Coastguard Worker  */
2719*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader)2720*6777b538SAndroid Build Coastguard Worker xmlTextReaderMoveToFirstAttribute(xmlTextReaderPtr reader) {
2721*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2722*6777b538SAndroid Build Coastguard Worker 	return(-1);
2723*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2724*6777b538SAndroid Build Coastguard Worker 	return(-1);
2725*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
2726*6777b538SAndroid Build Coastguard Worker 	return(0);
2727*6777b538SAndroid Build Coastguard Worker 
2728*6777b538SAndroid Build Coastguard Worker     if (reader->node->nsDef != NULL) {
2729*6777b538SAndroid Build Coastguard Worker 	reader->curnode = (xmlNodePtr) reader->node->nsDef;
2730*6777b538SAndroid Build Coastguard Worker 	return(1);
2731*6777b538SAndroid Build Coastguard Worker     }
2732*6777b538SAndroid Build Coastguard Worker     if (reader->node->properties != NULL) {
2733*6777b538SAndroid Build Coastguard Worker 	reader->curnode = (xmlNodePtr) reader->node->properties;
2734*6777b538SAndroid Build Coastguard Worker 	return(1);
2735*6777b538SAndroid Build Coastguard Worker     }
2736*6777b538SAndroid Build Coastguard Worker     return(0);
2737*6777b538SAndroid Build Coastguard Worker }
2738*6777b538SAndroid Build Coastguard Worker 
2739*6777b538SAndroid Build Coastguard Worker /**
2740*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderMoveToNextAttribute:
2741*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2742*6777b538SAndroid Build Coastguard Worker  *
2743*6777b538SAndroid Build Coastguard Worker  * Moves the position of the current instance to the next attribute
2744*6777b538SAndroid Build Coastguard Worker  * associated with the current node.
2745*6777b538SAndroid Build Coastguard Worker  *
2746*6777b538SAndroid Build Coastguard Worker  * Returns 1 in case of success, -1 in case of error, 0 if not found
2747*6777b538SAndroid Build Coastguard Worker  */
2748*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader)2749*6777b538SAndroid Build Coastguard Worker xmlTextReaderMoveToNextAttribute(xmlTextReaderPtr reader) {
2750*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2751*6777b538SAndroid Build Coastguard Worker 	return(-1);
2752*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2753*6777b538SAndroid Build Coastguard Worker 	return(-1);
2754*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
2755*6777b538SAndroid Build Coastguard Worker 	return(0);
2756*6777b538SAndroid Build Coastguard Worker     if (reader->curnode == NULL)
2757*6777b538SAndroid Build Coastguard Worker 	return(xmlTextReaderMoveToFirstAttribute(reader));
2758*6777b538SAndroid Build Coastguard Worker 
2759*6777b538SAndroid Build Coastguard Worker     if (reader->curnode->type == XML_NAMESPACE_DECL) {
2760*6777b538SAndroid Build Coastguard Worker 	xmlNsPtr ns = (xmlNsPtr) reader->curnode;
2761*6777b538SAndroid Build Coastguard Worker 	if (ns->next != NULL) {
2762*6777b538SAndroid Build Coastguard Worker 	    reader->curnode = (xmlNodePtr) ns->next;
2763*6777b538SAndroid Build Coastguard Worker 	    return(1);
2764*6777b538SAndroid Build Coastguard Worker 	}
2765*6777b538SAndroid Build Coastguard Worker 	if (reader->node->properties != NULL) {
2766*6777b538SAndroid Build Coastguard Worker 	    reader->curnode = (xmlNodePtr) reader->node->properties;
2767*6777b538SAndroid Build Coastguard Worker 	    return(1);
2768*6777b538SAndroid Build Coastguard Worker 	}
2769*6777b538SAndroid Build Coastguard Worker 	return(0);
2770*6777b538SAndroid Build Coastguard Worker     } else if ((reader->curnode->type == XML_ATTRIBUTE_NODE) &&
2771*6777b538SAndroid Build Coastguard Worker 	       (reader->curnode->next != NULL)) {
2772*6777b538SAndroid Build Coastguard Worker 	reader->curnode = reader->curnode->next;
2773*6777b538SAndroid Build Coastguard Worker 	return(1);
2774*6777b538SAndroid Build Coastguard Worker     }
2775*6777b538SAndroid Build Coastguard Worker     return(0);
2776*6777b538SAndroid Build Coastguard Worker }
2777*6777b538SAndroid Build Coastguard Worker 
2778*6777b538SAndroid Build Coastguard Worker /**
2779*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderMoveToElement:
2780*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2781*6777b538SAndroid Build Coastguard Worker  *
2782*6777b538SAndroid Build Coastguard Worker  * Moves the position of the current instance to the node that
2783*6777b538SAndroid Build Coastguard Worker  * contains the current Attribute  node.
2784*6777b538SAndroid Build Coastguard Worker  *
2785*6777b538SAndroid Build Coastguard Worker  * Returns 1 in case of success, -1 in case of error, 0 if not moved
2786*6777b538SAndroid Build Coastguard Worker  */
2787*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderMoveToElement(xmlTextReaderPtr reader)2788*6777b538SAndroid Build Coastguard Worker xmlTextReaderMoveToElement(xmlTextReaderPtr reader) {
2789*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2790*6777b538SAndroid Build Coastguard Worker 	return(-1);
2791*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2792*6777b538SAndroid Build Coastguard Worker 	return(-1);
2793*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
2794*6777b538SAndroid Build Coastguard Worker 	return(0);
2795*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL) {
2796*6777b538SAndroid Build Coastguard Worker 	reader->curnode = NULL;
2797*6777b538SAndroid Build Coastguard Worker 	return(1);
2798*6777b538SAndroid Build Coastguard Worker     }
2799*6777b538SAndroid Build Coastguard Worker     return(0);
2800*6777b538SAndroid Build Coastguard Worker }
2801*6777b538SAndroid Build Coastguard Worker 
2802*6777b538SAndroid Build Coastguard Worker /**
2803*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderReadAttributeValue:
2804*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2805*6777b538SAndroid Build Coastguard Worker  *
2806*6777b538SAndroid Build Coastguard Worker  * Parses an attribute value into one or more Text and EntityReference nodes.
2807*6777b538SAndroid Build Coastguard Worker  *
2808*6777b538SAndroid Build Coastguard Worker  * Returns 1 in case of success, 0 if the reader was not positioned on an
2809*6777b538SAndroid Build Coastguard Worker  *         attribute node or all the attribute values have been read, or -1
2810*6777b538SAndroid Build Coastguard Worker  *         in case of error.
2811*6777b538SAndroid Build Coastguard Worker  */
2812*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader)2813*6777b538SAndroid Build Coastguard Worker xmlTextReaderReadAttributeValue(xmlTextReaderPtr reader) {
2814*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2815*6777b538SAndroid Build Coastguard Worker 	return(-1);
2816*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2817*6777b538SAndroid Build Coastguard Worker 	return(-1);
2818*6777b538SAndroid Build Coastguard Worker     if (reader->curnode == NULL)
2819*6777b538SAndroid Build Coastguard Worker 	return(0);
2820*6777b538SAndroid Build Coastguard Worker     if (reader->curnode->type == XML_ATTRIBUTE_NODE) {
2821*6777b538SAndroid Build Coastguard Worker 	if (reader->curnode->children == NULL)
2822*6777b538SAndroid Build Coastguard Worker 	    return(0);
2823*6777b538SAndroid Build Coastguard Worker 	reader->curnode = reader->curnode->children;
2824*6777b538SAndroid Build Coastguard Worker     } else if (reader->curnode->type == XML_NAMESPACE_DECL) {
2825*6777b538SAndroid Build Coastguard Worker 	xmlNsPtr ns = (xmlNsPtr) reader->curnode;
2826*6777b538SAndroid Build Coastguard Worker 
2827*6777b538SAndroid Build Coastguard Worker 	if (reader->faketext == NULL) {
2828*6777b538SAndroid Build Coastguard Worker 	    reader->faketext = xmlNewDocText(reader->node->doc,
2829*6777b538SAndroid Build Coastguard Worker 		                             ns->href);
2830*6777b538SAndroid Build Coastguard Worker             if (reader->faketext == NULL) {
2831*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderErrMemory(reader);
2832*6777b538SAndroid Build Coastguard Worker                 return(-1);
2833*6777b538SAndroid Build Coastguard Worker             }
2834*6777b538SAndroid Build Coastguard Worker 	} else {
2835*6777b538SAndroid Build Coastguard Worker             if ((reader->faketext->content != NULL) &&
2836*6777b538SAndroid Build Coastguard Worker 	        (reader->faketext->content !=
2837*6777b538SAndroid Build Coastguard Worker 		 (xmlChar *) &(reader->faketext->properties)))
2838*6777b538SAndroid Build Coastguard Worker 		xmlFree(reader->faketext->content);
2839*6777b538SAndroid Build Coastguard Worker             if (ns->href == NULL) {
2840*6777b538SAndroid Build Coastguard Worker                 reader->faketext->content = NULL;
2841*6777b538SAndroid Build Coastguard Worker             } else {
2842*6777b538SAndroid Build Coastguard Worker                 reader->faketext->content = xmlStrdup(ns->href);
2843*6777b538SAndroid Build Coastguard Worker                 if (reader->faketext->content == NULL) {
2844*6777b538SAndroid Build Coastguard Worker                     xmlTextReaderErrMemory(reader);
2845*6777b538SAndroid Build Coastguard Worker                     return(-1);
2846*6777b538SAndroid Build Coastguard Worker                 }
2847*6777b538SAndroid Build Coastguard Worker             }
2848*6777b538SAndroid Build Coastguard Worker 	}
2849*6777b538SAndroid Build Coastguard Worker 	reader->curnode = reader->faketext;
2850*6777b538SAndroid Build Coastguard Worker     } else {
2851*6777b538SAndroid Build Coastguard Worker 	if (reader->curnode->next == NULL)
2852*6777b538SAndroid Build Coastguard Worker 	    return(0);
2853*6777b538SAndroid Build Coastguard Worker 	reader->curnode = reader->curnode->next;
2854*6777b538SAndroid Build Coastguard Worker     }
2855*6777b538SAndroid Build Coastguard Worker     return(1);
2856*6777b538SAndroid Build Coastguard Worker }
2857*6777b538SAndroid Build Coastguard Worker 
2858*6777b538SAndroid Build Coastguard Worker /**
2859*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstEncoding:
2860*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2861*6777b538SAndroid Build Coastguard Worker  *
2862*6777b538SAndroid Build Coastguard Worker  * Determine the encoding of the document being read.
2863*6777b538SAndroid Build Coastguard Worker  *
2864*6777b538SAndroid Build Coastguard Worker  * Returns a string containing the encoding of the document or NULL in
2865*6777b538SAndroid Build Coastguard Worker  * case of error.  The string is deallocated with the reader.
2866*6777b538SAndroid Build Coastguard Worker  */
2867*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstEncoding(xmlTextReaderPtr reader)2868*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstEncoding(xmlTextReaderPtr reader) {
2869*6777b538SAndroid Build Coastguard Worker     xmlDocPtr doc = NULL;
2870*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2871*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2872*6777b538SAndroid Build Coastguard Worker     if (reader->doc != NULL)
2873*6777b538SAndroid Build Coastguard Worker         doc = reader->doc;
2874*6777b538SAndroid Build Coastguard Worker     else if (reader->ctxt != NULL)
2875*6777b538SAndroid Build Coastguard Worker 	doc = reader->ctxt->myDoc;
2876*6777b538SAndroid Build Coastguard Worker     if (doc == NULL)
2877*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2878*6777b538SAndroid Build Coastguard Worker 
2879*6777b538SAndroid Build Coastguard Worker     if (doc->encoding == NULL)
2880*6777b538SAndroid Build Coastguard Worker 	return(NULL);
2881*6777b538SAndroid Build Coastguard Worker     else
2882*6777b538SAndroid Build Coastguard Worker       return(CONSTSTR(doc->encoding));
2883*6777b538SAndroid Build Coastguard Worker }
2884*6777b538SAndroid Build Coastguard Worker 
2885*6777b538SAndroid Build Coastguard Worker 
2886*6777b538SAndroid Build Coastguard Worker /************************************************************************
2887*6777b538SAndroid Build Coastguard Worker  *									*
2888*6777b538SAndroid Build Coastguard Worker  *			Access API to the current node			*
2889*6777b538SAndroid Build Coastguard Worker  *									*
2890*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
2891*6777b538SAndroid Build Coastguard Worker /**
2892*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderAttributeCount:
2893*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2894*6777b538SAndroid Build Coastguard Worker  *
2895*6777b538SAndroid Build Coastguard Worker  * Provides the number of attributes of the current node
2896*6777b538SAndroid Build Coastguard Worker  *
2897*6777b538SAndroid Build Coastguard Worker  * Returns 0 i no attributes, -1 in case of error or the attribute count
2898*6777b538SAndroid Build Coastguard Worker  */
2899*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderAttributeCount(xmlTextReaderPtr reader)2900*6777b538SAndroid Build Coastguard Worker xmlTextReaderAttributeCount(xmlTextReaderPtr reader) {
2901*6777b538SAndroid Build Coastguard Worker     int ret;
2902*6777b538SAndroid Build Coastguard Worker     xmlAttrPtr attr;
2903*6777b538SAndroid Build Coastguard Worker     xmlNsPtr ns;
2904*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
2905*6777b538SAndroid Build Coastguard Worker 
2906*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2907*6777b538SAndroid Build Coastguard Worker 	return(-1);
2908*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2909*6777b538SAndroid Build Coastguard Worker 	return(0);
2910*6777b538SAndroid Build Coastguard Worker 
2911*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
2912*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
2913*6777b538SAndroid Build Coastguard Worker     else
2914*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
2915*6777b538SAndroid Build Coastguard Worker 
2916*6777b538SAndroid Build Coastguard Worker     if (node->type != XML_ELEMENT_NODE)
2917*6777b538SAndroid Build Coastguard Worker 	return(0);
2918*6777b538SAndroid Build Coastguard Worker     if ((reader->state == XML_TEXTREADER_END) ||
2919*6777b538SAndroid Build Coastguard Worker 	(reader->state == XML_TEXTREADER_BACKTRACK))
2920*6777b538SAndroid Build Coastguard Worker 	return(0);
2921*6777b538SAndroid Build Coastguard Worker     ret = 0;
2922*6777b538SAndroid Build Coastguard Worker     attr = node->properties;
2923*6777b538SAndroid Build Coastguard Worker     while (attr != NULL) {
2924*6777b538SAndroid Build Coastguard Worker 	ret++;
2925*6777b538SAndroid Build Coastguard Worker 	attr = attr->next;
2926*6777b538SAndroid Build Coastguard Worker     }
2927*6777b538SAndroid Build Coastguard Worker     ns = node->nsDef;
2928*6777b538SAndroid Build Coastguard Worker     while (ns != NULL) {
2929*6777b538SAndroid Build Coastguard Worker 	ret++;
2930*6777b538SAndroid Build Coastguard Worker 	ns = ns->next;
2931*6777b538SAndroid Build Coastguard Worker     }
2932*6777b538SAndroid Build Coastguard Worker     return(ret);
2933*6777b538SAndroid Build Coastguard Worker }
2934*6777b538SAndroid Build Coastguard Worker 
2935*6777b538SAndroid Build Coastguard Worker /**
2936*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderNodeType:
2937*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
2938*6777b538SAndroid Build Coastguard Worker  *
2939*6777b538SAndroid Build Coastguard Worker  * Get the node type of the current node
2940*6777b538SAndroid Build Coastguard Worker  * Reference:
2941*6777b538SAndroid Build Coastguard Worker  * http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Xml/XmlNodeType.html
2942*6777b538SAndroid Build Coastguard Worker  *
2943*6777b538SAndroid Build Coastguard Worker  * Returns the xmlReaderTypes of the current node or -1 in case of error
2944*6777b538SAndroid Build Coastguard Worker  */
2945*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderNodeType(xmlTextReaderPtr reader)2946*6777b538SAndroid Build Coastguard Worker xmlTextReaderNodeType(xmlTextReaderPtr reader) {
2947*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
2948*6777b538SAndroid Build Coastguard Worker 
2949*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
2950*6777b538SAndroid Build Coastguard Worker 	return(-1);
2951*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
2952*6777b538SAndroid Build Coastguard Worker 	return(XML_READER_TYPE_NONE);
2953*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
2954*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
2955*6777b538SAndroid Build Coastguard Worker     else
2956*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
2957*6777b538SAndroid Build Coastguard Worker     switch (node->type) {
2958*6777b538SAndroid Build Coastguard Worker         case XML_ELEMENT_NODE:
2959*6777b538SAndroid Build Coastguard Worker 	    if ((reader->state == XML_TEXTREADER_END) ||
2960*6777b538SAndroid Build Coastguard Worker 		(reader->state == XML_TEXTREADER_BACKTRACK))
2961*6777b538SAndroid Build Coastguard Worker 		return(XML_READER_TYPE_END_ELEMENT);
2962*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_ELEMENT);
2963*6777b538SAndroid Build Coastguard Worker         case XML_NAMESPACE_DECL:
2964*6777b538SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_NODE:
2965*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_ATTRIBUTE);
2966*6777b538SAndroid Build Coastguard Worker         case XML_TEXT_NODE:
2967*6777b538SAndroid Build Coastguard Worker 	    if (xmlIsBlankNode(reader->node)) {
2968*6777b538SAndroid Build Coastguard Worker 		if (xmlNodeGetSpacePreserve(reader->node))
2969*6777b538SAndroid Build Coastguard Worker 		    return(XML_READER_TYPE_SIGNIFICANT_WHITESPACE);
2970*6777b538SAndroid Build Coastguard Worker 		else
2971*6777b538SAndroid Build Coastguard Worker 		    return(XML_READER_TYPE_WHITESPACE);
2972*6777b538SAndroid Build Coastguard Worker 	    } else {
2973*6777b538SAndroid Build Coastguard Worker 		return(XML_READER_TYPE_TEXT);
2974*6777b538SAndroid Build Coastguard Worker 	    }
2975*6777b538SAndroid Build Coastguard Worker         case XML_CDATA_SECTION_NODE:
2976*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_CDATA);
2977*6777b538SAndroid Build Coastguard Worker         case XML_ENTITY_REF_NODE:
2978*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_ENTITY_REFERENCE);
2979*6777b538SAndroid Build Coastguard Worker         case XML_ENTITY_NODE:
2980*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_ENTITY);
2981*6777b538SAndroid Build Coastguard Worker         case XML_PI_NODE:
2982*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_PROCESSING_INSTRUCTION);
2983*6777b538SAndroid Build Coastguard Worker         case XML_COMMENT_NODE:
2984*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_COMMENT);
2985*6777b538SAndroid Build Coastguard Worker         case XML_DOCUMENT_NODE:
2986*6777b538SAndroid Build Coastguard Worker         case XML_HTML_DOCUMENT_NODE:
2987*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_DOCUMENT);
2988*6777b538SAndroid Build Coastguard Worker         case XML_DOCUMENT_FRAG_NODE:
2989*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_DOCUMENT_FRAGMENT);
2990*6777b538SAndroid Build Coastguard Worker         case XML_NOTATION_NODE:
2991*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_NOTATION);
2992*6777b538SAndroid Build Coastguard Worker         case XML_DOCUMENT_TYPE_NODE:
2993*6777b538SAndroid Build Coastguard Worker         case XML_DTD_NODE:
2994*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_DOCUMENT_TYPE);
2995*6777b538SAndroid Build Coastguard Worker 
2996*6777b538SAndroid Build Coastguard Worker         case XML_ELEMENT_DECL:
2997*6777b538SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_DECL:
2998*6777b538SAndroid Build Coastguard Worker         case XML_ENTITY_DECL:
2999*6777b538SAndroid Build Coastguard Worker         case XML_XINCLUDE_START:
3000*6777b538SAndroid Build Coastguard Worker         case XML_XINCLUDE_END:
3001*6777b538SAndroid Build Coastguard Worker 	    return(XML_READER_TYPE_NONE);
3002*6777b538SAndroid Build Coastguard Worker     }
3003*6777b538SAndroid Build Coastguard Worker     return(-1);
3004*6777b538SAndroid Build Coastguard Worker }
3005*6777b538SAndroid Build Coastguard Worker 
3006*6777b538SAndroid Build Coastguard Worker /**
3007*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderIsEmptyElement:
3008*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3009*6777b538SAndroid Build Coastguard Worker  *
3010*6777b538SAndroid Build Coastguard Worker  * Check if the current node is empty
3011*6777b538SAndroid Build Coastguard Worker  *
3012*6777b538SAndroid Build Coastguard Worker  * Returns 1 if empty, 0 if not and -1 in case of error
3013*6777b538SAndroid Build Coastguard Worker  */
3014*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader)3015*6777b538SAndroid Build Coastguard Worker xmlTextReaderIsEmptyElement(xmlTextReaderPtr reader) {
3016*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3017*6777b538SAndroid Build Coastguard Worker 	return(-1);
3018*6777b538SAndroid Build Coastguard Worker     if (reader->node->type != XML_ELEMENT_NODE)
3019*6777b538SAndroid Build Coastguard Worker 	return(0);
3020*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3021*6777b538SAndroid Build Coastguard Worker 	return(0);
3022*6777b538SAndroid Build Coastguard Worker     if (reader->node->children != NULL)
3023*6777b538SAndroid Build Coastguard Worker 	return(0);
3024*6777b538SAndroid Build Coastguard Worker     if (reader->state == XML_TEXTREADER_END)
3025*6777b538SAndroid Build Coastguard Worker 	return(0);
3026*6777b538SAndroid Build Coastguard Worker     if (reader->doc != NULL)
3027*6777b538SAndroid Build Coastguard Worker         return(1);
3028*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
3029*6777b538SAndroid Build Coastguard Worker     if (reader->in_xinclude > 0)
3030*6777b538SAndroid Build Coastguard Worker         return(1);
3031*6777b538SAndroid Build Coastguard Worker #endif
3032*6777b538SAndroid Build Coastguard Worker     return((reader->node->extra & NODE_IS_EMPTY) != 0);
3033*6777b538SAndroid Build Coastguard Worker }
3034*6777b538SAndroid Build Coastguard Worker 
3035*6777b538SAndroid Build Coastguard Worker /**
3036*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderLocalName:
3037*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3038*6777b538SAndroid Build Coastguard Worker  *
3039*6777b538SAndroid Build Coastguard Worker  * The local name of the node.
3040*6777b538SAndroid Build Coastguard Worker  *
3041*6777b538SAndroid Build Coastguard Worker  * Returns the local name or NULL if not available,
3042*6777b538SAndroid Build Coastguard Worker  *   if non NULL it need to be freed by the caller.
3043*6777b538SAndroid Build Coastguard Worker  */
3044*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderLocalName(xmlTextReaderPtr reader)3045*6777b538SAndroid Build Coastguard Worker xmlTextReaderLocalName(xmlTextReaderPtr reader) {
3046*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3047*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3048*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3049*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3050*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3051*6777b538SAndroid Build Coastguard Worker     else
3052*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3053*6777b538SAndroid Build Coastguard Worker     if (node->type == XML_NAMESPACE_DECL) {
3054*6777b538SAndroid Build Coastguard Worker 	xmlNsPtr ns = (xmlNsPtr) node;
3055*6777b538SAndroid Build Coastguard Worker 	if (ns->prefix == NULL)
3056*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(BAD_CAST "xmlns"));
3057*6777b538SAndroid Build Coastguard Worker 	else
3058*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(ns->prefix));
3059*6777b538SAndroid Build Coastguard Worker     }
3060*6777b538SAndroid Build Coastguard Worker     if ((node->type != XML_ELEMENT_NODE) &&
3061*6777b538SAndroid Build Coastguard Worker 	(node->type != XML_ATTRIBUTE_NODE))
3062*6777b538SAndroid Build Coastguard Worker 	return(xmlTextReaderName(reader));
3063*6777b538SAndroid Build Coastguard Worker     return(xmlStrdup(node->name));
3064*6777b538SAndroid Build Coastguard Worker }
3065*6777b538SAndroid Build Coastguard Worker 
3066*6777b538SAndroid Build Coastguard Worker /**
3067*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstLocalName:
3068*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3069*6777b538SAndroid Build Coastguard Worker  *
3070*6777b538SAndroid Build Coastguard Worker  * The local name of the node.
3071*6777b538SAndroid Build Coastguard Worker  *
3072*6777b538SAndroid Build Coastguard Worker  * Returns the local name or NULL if not available, the
3073*6777b538SAndroid Build Coastguard Worker  *         string will be deallocated with the reader.
3074*6777b538SAndroid Build Coastguard Worker  */
3075*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstLocalName(xmlTextReaderPtr reader)3076*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstLocalName(xmlTextReaderPtr reader) {
3077*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3078*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3079*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3080*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3081*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3082*6777b538SAndroid Build Coastguard Worker     else
3083*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3084*6777b538SAndroid Build Coastguard Worker     if (node->type == XML_NAMESPACE_DECL) {
3085*6777b538SAndroid Build Coastguard Worker 	xmlNsPtr ns = (xmlNsPtr) node;
3086*6777b538SAndroid Build Coastguard Worker 	if (ns->prefix == NULL)
3087*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(BAD_CAST "xmlns"));
3088*6777b538SAndroid Build Coastguard Worker 	else
3089*6777b538SAndroid Build Coastguard Worker 	    return(ns->prefix);
3090*6777b538SAndroid Build Coastguard Worker     }
3091*6777b538SAndroid Build Coastguard Worker     if ((node->type != XML_ELEMENT_NODE) &&
3092*6777b538SAndroid Build Coastguard Worker 	(node->type != XML_ATTRIBUTE_NODE))
3093*6777b538SAndroid Build Coastguard Worker 	return(xmlTextReaderConstName(reader));
3094*6777b538SAndroid Build Coastguard Worker     return(node->name);
3095*6777b538SAndroid Build Coastguard Worker }
3096*6777b538SAndroid Build Coastguard Worker 
3097*6777b538SAndroid Build Coastguard Worker /**
3098*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderName:
3099*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3100*6777b538SAndroid Build Coastguard Worker  *
3101*6777b538SAndroid Build Coastguard Worker  * The qualified name of the node, equal to Prefix :LocalName.
3102*6777b538SAndroid Build Coastguard Worker  *
3103*6777b538SAndroid Build Coastguard Worker  * Returns the local name or NULL if not available,
3104*6777b538SAndroid Build Coastguard Worker  *   if non NULL it need to be freed by the caller.
3105*6777b538SAndroid Build Coastguard Worker  */
3106*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderName(xmlTextReaderPtr reader)3107*6777b538SAndroid Build Coastguard Worker xmlTextReaderName(xmlTextReaderPtr reader) {
3108*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3109*6777b538SAndroid Build Coastguard Worker     xmlChar *ret;
3110*6777b538SAndroid Build Coastguard Worker 
3111*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3112*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3113*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3114*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3115*6777b538SAndroid Build Coastguard Worker     else
3116*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3117*6777b538SAndroid Build Coastguard Worker     switch (node->type) {
3118*6777b538SAndroid Build Coastguard Worker         case XML_ELEMENT_NODE:
3119*6777b538SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_NODE:
3120*6777b538SAndroid Build Coastguard Worker 	    if ((node->ns == NULL) ||
3121*6777b538SAndroid Build Coastguard Worker 		(node->ns->prefix == NULL))
3122*6777b538SAndroid Build Coastguard Worker 		return(xmlStrdup(node->name));
3123*6777b538SAndroid Build Coastguard Worker 
3124*6777b538SAndroid Build Coastguard Worker 	    ret = xmlStrdup(node->ns->prefix);
3125*6777b538SAndroid Build Coastguard Worker 	    ret = xmlStrcat(ret, BAD_CAST ":");
3126*6777b538SAndroid Build Coastguard Worker 	    ret = xmlStrcat(ret, node->name);
3127*6777b538SAndroid Build Coastguard Worker 	    return(ret);
3128*6777b538SAndroid Build Coastguard Worker         case XML_TEXT_NODE:
3129*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(BAD_CAST "#text"));
3130*6777b538SAndroid Build Coastguard Worker         case XML_CDATA_SECTION_NODE:
3131*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(BAD_CAST "#cdata-section"));
3132*6777b538SAndroid Build Coastguard Worker         case XML_ENTITY_NODE:
3133*6777b538SAndroid Build Coastguard Worker         case XML_ENTITY_REF_NODE:
3134*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(node->name));
3135*6777b538SAndroid Build Coastguard Worker         case XML_PI_NODE:
3136*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(node->name));
3137*6777b538SAndroid Build Coastguard Worker         case XML_COMMENT_NODE:
3138*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(BAD_CAST "#comment"));
3139*6777b538SAndroid Build Coastguard Worker         case XML_DOCUMENT_NODE:
3140*6777b538SAndroid Build Coastguard Worker         case XML_HTML_DOCUMENT_NODE:
3141*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(BAD_CAST "#document"));
3142*6777b538SAndroid Build Coastguard Worker         case XML_DOCUMENT_FRAG_NODE:
3143*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(BAD_CAST "#document-fragment"));
3144*6777b538SAndroid Build Coastguard Worker         case XML_NOTATION_NODE:
3145*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(node->name));
3146*6777b538SAndroid Build Coastguard Worker         case XML_DOCUMENT_TYPE_NODE:
3147*6777b538SAndroid Build Coastguard Worker         case XML_DTD_NODE:
3148*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(node->name));
3149*6777b538SAndroid Build Coastguard Worker         case XML_NAMESPACE_DECL: {
3150*6777b538SAndroid Build Coastguard Worker 	    xmlNsPtr ns = (xmlNsPtr) node;
3151*6777b538SAndroid Build Coastguard Worker 
3152*6777b538SAndroid Build Coastguard Worker 	    ret = xmlStrdup(BAD_CAST "xmlns");
3153*6777b538SAndroid Build Coastguard Worker 	    if (ns->prefix == NULL)
3154*6777b538SAndroid Build Coastguard Worker 		return(ret);
3155*6777b538SAndroid Build Coastguard Worker 	    ret = xmlStrcat(ret, BAD_CAST ":");
3156*6777b538SAndroid Build Coastguard Worker 	    ret = xmlStrcat(ret, ns->prefix);
3157*6777b538SAndroid Build Coastguard Worker 	    return(ret);
3158*6777b538SAndroid Build Coastguard Worker 	}
3159*6777b538SAndroid Build Coastguard Worker 
3160*6777b538SAndroid Build Coastguard Worker         case XML_ELEMENT_DECL:
3161*6777b538SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_DECL:
3162*6777b538SAndroid Build Coastguard Worker         case XML_ENTITY_DECL:
3163*6777b538SAndroid Build Coastguard Worker         case XML_XINCLUDE_START:
3164*6777b538SAndroid Build Coastguard Worker         case XML_XINCLUDE_END:
3165*6777b538SAndroid Build Coastguard Worker 	    return(NULL);
3166*6777b538SAndroid Build Coastguard Worker     }
3167*6777b538SAndroid Build Coastguard Worker     return(NULL);
3168*6777b538SAndroid Build Coastguard Worker }
3169*6777b538SAndroid Build Coastguard Worker 
3170*6777b538SAndroid Build Coastguard Worker /**
3171*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstName:
3172*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3173*6777b538SAndroid Build Coastguard Worker  *
3174*6777b538SAndroid Build Coastguard Worker  * The qualified name of the node, equal to Prefix :LocalName.
3175*6777b538SAndroid Build Coastguard Worker  *
3176*6777b538SAndroid Build Coastguard Worker  * Returns the local name or NULL if not available, the string is
3177*6777b538SAndroid Build Coastguard Worker  *         deallocated with the reader.
3178*6777b538SAndroid Build Coastguard Worker  */
3179*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstName(xmlTextReaderPtr reader)3180*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstName(xmlTextReaderPtr reader) {
3181*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3182*6777b538SAndroid Build Coastguard Worker 
3183*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3184*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3185*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3186*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3187*6777b538SAndroid Build Coastguard Worker     else
3188*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3189*6777b538SAndroid Build Coastguard Worker     switch (node->type) {
3190*6777b538SAndroid Build Coastguard Worker         case XML_ELEMENT_NODE:
3191*6777b538SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_NODE:
3192*6777b538SAndroid Build Coastguard Worker 	    if ((node->ns == NULL) ||
3193*6777b538SAndroid Build Coastguard Worker 		(node->ns->prefix == NULL))
3194*6777b538SAndroid Build Coastguard Worker 		return(node->name);
3195*6777b538SAndroid Build Coastguard Worker 	    return(CONSTQSTR(node->ns->prefix, node->name));
3196*6777b538SAndroid Build Coastguard Worker         case XML_TEXT_NODE:
3197*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(BAD_CAST "#text"));
3198*6777b538SAndroid Build Coastguard Worker         case XML_CDATA_SECTION_NODE:
3199*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(BAD_CAST "#cdata-section"));
3200*6777b538SAndroid Build Coastguard Worker         case XML_ENTITY_NODE:
3201*6777b538SAndroid Build Coastguard Worker         case XML_ENTITY_REF_NODE:
3202*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(node->name));
3203*6777b538SAndroid Build Coastguard Worker         case XML_PI_NODE:
3204*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(node->name));
3205*6777b538SAndroid Build Coastguard Worker         case XML_COMMENT_NODE:
3206*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(BAD_CAST "#comment"));
3207*6777b538SAndroid Build Coastguard Worker         case XML_DOCUMENT_NODE:
3208*6777b538SAndroid Build Coastguard Worker         case XML_HTML_DOCUMENT_NODE:
3209*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(BAD_CAST "#document"));
3210*6777b538SAndroid Build Coastguard Worker         case XML_DOCUMENT_FRAG_NODE:
3211*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(BAD_CAST "#document-fragment"));
3212*6777b538SAndroid Build Coastguard Worker         case XML_NOTATION_NODE:
3213*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(node->name));
3214*6777b538SAndroid Build Coastguard Worker         case XML_DOCUMENT_TYPE_NODE:
3215*6777b538SAndroid Build Coastguard Worker         case XML_DTD_NODE:
3216*6777b538SAndroid Build Coastguard Worker 	    return(CONSTSTR(node->name));
3217*6777b538SAndroid Build Coastguard Worker         case XML_NAMESPACE_DECL: {
3218*6777b538SAndroid Build Coastguard Worker 	    xmlNsPtr ns = (xmlNsPtr) node;
3219*6777b538SAndroid Build Coastguard Worker 
3220*6777b538SAndroid Build Coastguard Worker 	    if (ns->prefix == NULL)
3221*6777b538SAndroid Build Coastguard Worker 		return(CONSTSTR(BAD_CAST "xmlns"));
3222*6777b538SAndroid Build Coastguard Worker 	    return(CONSTQSTR(BAD_CAST "xmlns", ns->prefix));
3223*6777b538SAndroid Build Coastguard Worker 	}
3224*6777b538SAndroid Build Coastguard Worker 
3225*6777b538SAndroid Build Coastguard Worker         case XML_ELEMENT_DECL:
3226*6777b538SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_DECL:
3227*6777b538SAndroid Build Coastguard Worker         case XML_ENTITY_DECL:
3228*6777b538SAndroid Build Coastguard Worker         case XML_XINCLUDE_START:
3229*6777b538SAndroid Build Coastguard Worker         case XML_XINCLUDE_END:
3230*6777b538SAndroid Build Coastguard Worker 	    return(NULL);
3231*6777b538SAndroid Build Coastguard Worker     }
3232*6777b538SAndroid Build Coastguard Worker     return(NULL);
3233*6777b538SAndroid Build Coastguard Worker }
3234*6777b538SAndroid Build Coastguard Worker 
3235*6777b538SAndroid Build Coastguard Worker /**
3236*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderPrefix:
3237*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3238*6777b538SAndroid Build Coastguard Worker  *
3239*6777b538SAndroid Build Coastguard Worker  * A shorthand reference to the namespace associated with the node.
3240*6777b538SAndroid Build Coastguard Worker  *
3241*6777b538SAndroid Build Coastguard Worker  * Returns the prefix or NULL if not available,
3242*6777b538SAndroid Build Coastguard Worker  *    if non NULL it need to be freed by the caller.
3243*6777b538SAndroid Build Coastguard Worker  */
3244*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderPrefix(xmlTextReaderPtr reader)3245*6777b538SAndroid Build Coastguard Worker xmlTextReaderPrefix(xmlTextReaderPtr reader) {
3246*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3247*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3248*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3249*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3250*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3251*6777b538SAndroid Build Coastguard Worker     else
3252*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3253*6777b538SAndroid Build Coastguard Worker     if (node->type == XML_NAMESPACE_DECL) {
3254*6777b538SAndroid Build Coastguard Worker 	xmlNsPtr ns = (xmlNsPtr) node;
3255*6777b538SAndroid Build Coastguard Worker 	if (ns->prefix == NULL)
3256*6777b538SAndroid Build Coastguard Worker 	    return(NULL);
3257*6777b538SAndroid Build Coastguard Worker 	return(xmlStrdup(BAD_CAST "xmlns"));
3258*6777b538SAndroid Build Coastguard Worker     }
3259*6777b538SAndroid Build Coastguard Worker     if ((node->type != XML_ELEMENT_NODE) &&
3260*6777b538SAndroid Build Coastguard Worker 	(node->type != XML_ATTRIBUTE_NODE))
3261*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3262*6777b538SAndroid Build Coastguard Worker     if ((node->ns != NULL) && (node->ns->prefix != NULL))
3263*6777b538SAndroid Build Coastguard Worker 	return(xmlStrdup(node->ns->prefix));
3264*6777b538SAndroid Build Coastguard Worker     return(NULL);
3265*6777b538SAndroid Build Coastguard Worker }
3266*6777b538SAndroid Build Coastguard Worker 
3267*6777b538SAndroid Build Coastguard Worker /**
3268*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstPrefix:
3269*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3270*6777b538SAndroid Build Coastguard Worker  *
3271*6777b538SAndroid Build Coastguard Worker  * A shorthand reference to the namespace associated with the node.
3272*6777b538SAndroid Build Coastguard Worker  *
3273*6777b538SAndroid Build Coastguard Worker  * Returns the prefix or NULL if not available, the string is deallocated
3274*6777b538SAndroid Build Coastguard Worker  *         with the reader.
3275*6777b538SAndroid Build Coastguard Worker  */
3276*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstPrefix(xmlTextReaderPtr reader)3277*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstPrefix(xmlTextReaderPtr reader) {
3278*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3279*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3280*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3281*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3282*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3283*6777b538SAndroid Build Coastguard Worker     else
3284*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3285*6777b538SAndroid Build Coastguard Worker     if (node->type == XML_NAMESPACE_DECL) {
3286*6777b538SAndroid Build Coastguard Worker 	xmlNsPtr ns = (xmlNsPtr) node;
3287*6777b538SAndroid Build Coastguard Worker 	if (ns->prefix == NULL)
3288*6777b538SAndroid Build Coastguard Worker 	    return(NULL);
3289*6777b538SAndroid Build Coastguard Worker 	return(CONSTSTR(BAD_CAST "xmlns"));
3290*6777b538SAndroid Build Coastguard Worker     }
3291*6777b538SAndroid Build Coastguard Worker     if ((node->type != XML_ELEMENT_NODE) &&
3292*6777b538SAndroid Build Coastguard Worker 	(node->type != XML_ATTRIBUTE_NODE))
3293*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3294*6777b538SAndroid Build Coastguard Worker     if ((node->ns != NULL) && (node->ns->prefix != NULL))
3295*6777b538SAndroid Build Coastguard Worker 	return(CONSTSTR(node->ns->prefix));
3296*6777b538SAndroid Build Coastguard Worker     return(NULL);
3297*6777b538SAndroid Build Coastguard Worker }
3298*6777b538SAndroid Build Coastguard Worker 
3299*6777b538SAndroid Build Coastguard Worker /**
3300*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderNamespaceUri:
3301*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3302*6777b538SAndroid Build Coastguard Worker  *
3303*6777b538SAndroid Build Coastguard Worker  * The URI defining the namespace associated with the node.
3304*6777b538SAndroid Build Coastguard Worker  *
3305*6777b538SAndroid Build Coastguard Worker  * Returns the namespace URI or NULL if not available,
3306*6777b538SAndroid Build Coastguard Worker  *    if non NULL it need to be freed by the caller.
3307*6777b538SAndroid Build Coastguard Worker  */
3308*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderNamespaceUri(xmlTextReaderPtr reader)3309*6777b538SAndroid Build Coastguard Worker xmlTextReaderNamespaceUri(xmlTextReaderPtr reader) {
3310*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3311*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3312*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3313*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3314*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3315*6777b538SAndroid Build Coastguard Worker     else
3316*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3317*6777b538SAndroid Build Coastguard Worker     if (node->type == XML_NAMESPACE_DECL)
3318*6777b538SAndroid Build Coastguard Worker 	return(xmlStrdup(BAD_CAST "http://www.w3.org/2000/xmlns/"));
3319*6777b538SAndroid Build Coastguard Worker     if ((node->type != XML_ELEMENT_NODE) &&
3320*6777b538SAndroid Build Coastguard Worker 	(node->type != XML_ATTRIBUTE_NODE))
3321*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3322*6777b538SAndroid Build Coastguard Worker     if (node->ns != NULL)
3323*6777b538SAndroid Build Coastguard Worker 	return(xmlStrdup(node->ns->href));
3324*6777b538SAndroid Build Coastguard Worker     return(NULL);
3325*6777b538SAndroid Build Coastguard Worker }
3326*6777b538SAndroid Build Coastguard Worker 
3327*6777b538SAndroid Build Coastguard Worker /**
3328*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstNamespaceUri:
3329*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3330*6777b538SAndroid Build Coastguard Worker  *
3331*6777b538SAndroid Build Coastguard Worker  * The URI defining the namespace associated with the node.
3332*6777b538SAndroid Build Coastguard Worker  *
3333*6777b538SAndroid Build Coastguard Worker  * Returns the namespace URI or NULL if not available, the string
3334*6777b538SAndroid Build Coastguard Worker  *         will be deallocated with the reader
3335*6777b538SAndroid Build Coastguard Worker  */
3336*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader)3337*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstNamespaceUri(xmlTextReaderPtr reader) {
3338*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3339*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3340*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3341*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3342*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3343*6777b538SAndroid Build Coastguard Worker     else
3344*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3345*6777b538SAndroid Build Coastguard Worker     if (node->type == XML_NAMESPACE_DECL)
3346*6777b538SAndroid Build Coastguard Worker 	return(CONSTSTR(BAD_CAST "http://www.w3.org/2000/xmlns/"));
3347*6777b538SAndroid Build Coastguard Worker     if ((node->type != XML_ELEMENT_NODE) &&
3348*6777b538SAndroid Build Coastguard Worker 	(node->type != XML_ATTRIBUTE_NODE))
3349*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3350*6777b538SAndroid Build Coastguard Worker     if (node->ns != NULL)
3351*6777b538SAndroid Build Coastguard Worker 	return(CONSTSTR(node->ns->href));
3352*6777b538SAndroid Build Coastguard Worker     return(NULL);
3353*6777b538SAndroid Build Coastguard Worker }
3354*6777b538SAndroid Build Coastguard Worker 
3355*6777b538SAndroid Build Coastguard Worker /**
3356*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderBaseUri:
3357*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3358*6777b538SAndroid Build Coastguard Worker  *
3359*6777b538SAndroid Build Coastguard Worker  * The base URI of the node.
3360*6777b538SAndroid Build Coastguard Worker  *
3361*6777b538SAndroid Build Coastguard Worker  * Returns the base URI or NULL if not available,
3362*6777b538SAndroid Build Coastguard Worker  *    if non NULL it need to be freed by the caller.
3363*6777b538SAndroid Build Coastguard Worker  */
3364*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderBaseUri(xmlTextReaderPtr reader)3365*6777b538SAndroid Build Coastguard Worker xmlTextReaderBaseUri(xmlTextReaderPtr reader) {
3366*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3367*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3368*6777b538SAndroid Build Coastguard Worker     return(xmlNodeGetBase(NULL, reader->node));
3369*6777b538SAndroid Build Coastguard Worker }
3370*6777b538SAndroid Build Coastguard Worker 
3371*6777b538SAndroid Build Coastguard Worker /**
3372*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstBaseUri:
3373*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3374*6777b538SAndroid Build Coastguard Worker  *
3375*6777b538SAndroid Build Coastguard Worker  * The base URI of the node.
3376*6777b538SAndroid Build Coastguard Worker  *
3377*6777b538SAndroid Build Coastguard Worker  * Returns the base URI or NULL if not available, the string
3378*6777b538SAndroid Build Coastguard Worker  *         will be deallocated with the reader
3379*6777b538SAndroid Build Coastguard Worker  */
3380*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstBaseUri(xmlTextReaderPtr reader)3381*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstBaseUri(xmlTextReaderPtr reader) {
3382*6777b538SAndroid Build Coastguard Worker     xmlChar *tmp;
3383*6777b538SAndroid Build Coastguard Worker     const xmlChar *ret;
3384*6777b538SAndroid Build Coastguard Worker 
3385*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->node == NULL))
3386*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3387*6777b538SAndroid Build Coastguard Worker     tmp = xmlNodeGetBase(NULL, reader->node);
3388*6777b538SAndroid Build Coastguard Worker     if (tmp == NULL)
3389*6777b538SAndroid Build Coastguard Worker         return(NULL);
3390*6777b538SAndroid Build Coastguard Worker     ret = CONSTSTR(tmp);
3391*6777b538SAndroid Build Coastguard Worker     xmlFree(tmp);
3392*6777b538SAndroid Build Coastguard Worker     return(ret);
3393*6777b538SAndroid Build Coastguard Worker }
3394*6777b538SAndroid Build Coastguard Worker 
3395*6777b538SAndroid Build Coastguard Worker /**
3396*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderDepth:
3397*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3398*6777b538SAndroid Build Coastguard Worker  *
3399*6777b538SAndroid Build Coastguard Worker  * The depth of the node in the tree.
3400*6777b538SAndroid Build Coastguard Worker  *
3401*6777b538SAndroid Build Coastguard Worker  * Returns the depth or -1 in case of error
3402*6777b538SAndroid Build Coastguard Worker  */
3403*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderDepth(xmlTextReaderPtr reader)3404*6777b538SAndroid Build Coastguard Worker xmlTextReaderDepth(xmlTextReaderPtr reader) {
3405*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3406*6777b538SAndroid Build Coastguard Worker 	return(-1);
3407*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
3408*6777b538SAndroid Build Coastguard Worker 	return(0);
3409*6777b538SAndroid Build Coastguard Worker 
3410*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL) {
3411*6777b538SAndroid Build Coastguard Worker 	if ((reader->curnode->type == XML_ATTRIBUTE_NODE) ||
3412*6777b538SAndroid Build Coastguard Worker 	    (reader->curnode->type == XML_NAMESPACE_DECL))
3413*6777b538SAndroid Build Coastguard Worker 	    return(reader->depth + 1);
3414*6777b538SAndroid Build Coastguard Worker 	return(reader->depth + 2);
3415*6777b538SAndroid Build Coastguard Worker     }
3416*6777b538SAndroid Build Coastguard Worker     return(reader->depth);
3417*6777b538SAndroid Build Coastguard Worker }
3418*6777b538SAndroid Build Coastguard Worker 
3419*6777b538SAndroid Build Coastguard Worker /**
3420*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderHasAttributes:
3421*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3422*6777b538SAndroid Build Coastguard Worker  *
3423*6777b538SAndroid Build Coastguard Worker  * Whether the node has attributes.
3424*6777b538SAndroid Build Coastguard Worker  *
3425*6777b538SAndroid Build Coastguard Worker  * Returns 1 if true, 0 if false, and -1 in case or error
3426*6777b538SAndroid Build Coastguard Worker  */
3427*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderHasAttributes(xmlTextReaderPtr reader)3428*6777b538SAndroid Build Coastguard Worker xmlTextReaderHasAttributes(xmlTextReaderPtr reader) {
3429*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3430*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3431*6777b538SAndroid Build Coastguard Worker 	return(-1);
3432*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
3433*6777b538SAndroid Build Coastguard Worker 	return(0);
3434*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3435*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3436*6777b538SAndroid Build Coastguard Worker     else
3437*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3438*6777b538SAndroid Build Coastguard Worker 
3439*6777b538SAndroid Build Coastguard Worker     if ((node->type == XML_ELEMENT_NODE) &&
3440*6777b538SAndroid Build Coastguard Worker 	((node->properties != NULL) || (node->nsDef != NULL)))
3441*6777b538SAndroid Build Coastguard Worker 	return(1);
3442*6777b538SAndroid Build Coastguard Worker     /* TODO: handle the xmlDecl */
3443*6777b538SAndroid Build Coastguard Worker     return(0);
3444*6777b538SAndroid Build Coastguard Worker }
3445*6777b538SAndroid Build Coastguard Worker 
3446*6777b538SAndroid Build Coastguard Worker /**
3447*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderHasValue:
3448*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3449*6777b538SAndroid Build Coastguard Worker  *
3450*6777b538SAndroid Build Coastguard Worker  * Whether the node can have a text value.
3451*6777b538SAndroid Build Coastguard Worker  *
3452*6777b538SAndroid Build Coastguard Worker  * Returns 1 if true, 0 if false, and -1 in case or error
3453*6777b538SAndroid Build Coastguard Worker  */
3454*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderHasValue(xmlTextReaderPtr reader)3455*6777b538SAndroid Build Coastguard Worker xmlTextReaderHasValue(xmlTextReaderPtr reader) {
3456*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3457*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3458*6777b538SAndroid Build Coastguard Worker 	return(-1);
3459*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
3460*6777b538SAndroid Build Coastguard Worker 	return(0);
3461*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3462*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3463*6777b538SAndroid Build Coastguard Worker     else
3464*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3465*6777b538SAndroid Build Coastguard Worker 
3466*6777b538SAndroid Build Coastguard Worker     switch (node->type) {
3467*6777b538SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_NODE:
3468*6777b538SAndroid Build Coastguard Worker         case XML_TEXT_NODE:
3469*6777b538SAndroid Build Coastguard Worker         case XML_CDATA_SECTION_NODE:
3470*6777b538SAndroid Build Coastguard Worker         case XML_PI_NODE:
3471*6777b538SAndroid Build Coastguard Worker         case XML_COMMENT_NODE:
3472*6777b538SAndroid Build Coastguard Worker         case XML_NAMESPACE_DECL:
3473*6777b538SAndroid Build Coastguard Worker 	    return(1);
3474*6777b538SAndroid Build Coastguard Worker 	default:
3475*6777b538SAndroid Build Coastguard Worker 	    break;
3476*6777b538SAndroid Build Coastguard Worker     }
3477*6777b538SAndroid Build Coastguard Worker     return(0);
3478*6777b538SAndroid Build Coastguard Worker }
3479*6777b538SAndroid Build Coastguard Worker 
3480*6777b538SAndroid Build Coastguard Worker /**
3481*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderValue:
3482*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3483*6777b538SAndroid Build Coastguard Worker  *
3484*6777b538SAndroid Build Coastguard Worker  * Provides the text value of the node if present
3485*6777b538SAndroid Build Coastguard Worker  *
3486*6777b538SAndroid Build Coastguard Worker  * Returns the string or NULL if not available. The result must be deallocated
3487*6777b538SAndroid Build Coastguard Worker  *     with xmlFree()
3488*6777b538SAndroid Build Coastguard Worker  */
3489*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderValue(xmlTextReaderPtr reader)3490*6777b538SAndroid Build Coastguard Worker xmlTextReaderValue(xmlTextReaderPtr reader) {
3491*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3492*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3493*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3494*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
3495*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3496*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3497*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3498*6777b538SAndroid Build Coastguard Worker     else
3499*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3500*6777b538SAndroid Build Coastguard Worker 
3501*6777b538SAndroid Build Coastguard Worker     switch (node->type) {
3502*6777b538SAndroid Build Coastguard Worker         case XML_NAMESPACE_DECL:
3503*6777b538SAndroid Build Coastguard Worker 	    return(xmlStrdup(((xmlNsPtr) node)->href));
3504*6777b538SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_NODE:{
3505*6777b538SAndroid Build Coastguard Worker 	    xmlAttrPtr attr = (xmlAttrPtr) node;
3506*6777b538SAndroid Build Coastguard Worker 
3507*6777b538SAndroid Build Coastguard Worker 	    if (attr->parent != NULL)
3508*6777b538SAndroid Build Coastguard Worker 		return (xmlNodeListGetString
3509*6777b538SAndroid Build Coastguard Worker 			(attr->parent->doc, attr->children, 1));
3510*6777b538SAndroid Build Coastguard Worker 	    else
3511*6777b538SAndroid Build Coastguard Worker 		return (xmlNodeListGetString(NULL, attr->children, 1));
3512*6777b538SAndroid Build Coastguard Worker 	    break;
3513*6777b538SAndroid Build Coastguard Worker 	}
3514*6777b538SAndroid Build Coastguard Worker         case XML_TEXT_NODE:
3515*6777b538SAndroid Build Coastguard Worker         case XML_CDATA_SECTION_NODE:
3516*6777b538SAndroid Build Coastguard Worker         case XML_PI_NODE:
3517*6777b538SAndroid Build Coastguard Worker         case XML_COMMENT_NODE:
3518*6777b538SAndroid Build Coastguard Worker             if (node->content != NULL)
3519*6777b538SAndroid Build Coastguard Worker                 return (xmlStrdup(node->content));
3520*6777b538SAndroid Build Coastguard Worker 	default:
3521*6777b538SAndroid Build Coastguard Worker 	    break;
3522*6777b538SAndroid Build Coastguard Worker     }
3523*6777b538SAndroid Build Coastguard Worker     return(NULL);
3524*6777b538SAndroid Build Coastguard Worker }
3525*6777b538SAndroid Build Coastguard Worker 
3526*6777b538SAndroid Build Coastguard Worker /**
3527*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstValue:
3528*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3529*6777b538SAndroid Build Coastguard Worker  *
3530*6777b538SAndroid Build Coastguard Worker  * Provides the text value of the node if present
3531*6777b538SAndroid Build Coastguard Worker  *
3532*6777b538SAndroid Build Coastguard Worker  * Returns the string or NULL if not available. The result will be
3533*6777b538SAndroid Build Coastguard Worker  *     deallocated on the next Read() operation.
3534*6777b538SAndroid Build Coastguard Worker  */
3535*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstValue(xmlTextReaderPtr reader)3536*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstValue(xmlTextReaderPtr reader) {
3537*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
3538*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3539*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3540*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
3541*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3542*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3543*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
3544*6777b538SAndroid Build Coastguard Worker     else
3545*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
3546*6777b538SAndroid Build Coastguard Worker 
3547*6777b538SAndroid Build Coastguard Worker     switch (node->type) {
3548*6777b538SAndroid Build Coastguard Worker         case XML_NAMESPACE_DECL:
3549*6777b538SAndroid Build Coastguard Worker 	    return(((xmlNsPtr) node)->href);
3550*6777b538SAndroid Build Coastguard Worker         case XML_ATTRIBUTE_NODE:{
3551*6777b538SAndroid Build Coastguard Worker 	    xmlAttrPtr attr = (xmlAttrPtr) node;
3552*6777b538SAndroid Build Coastguard Worker 	    const xmlChar *ret;
3553*6777b538SAndroid Build Coastguard Worker 
3554*6777b538SAndroid Build Coastguard Worker 	    if ((attr->children != NULL) &&
3555*6777b538SAndroid Build Coastguard Worker 	        (attr->children->type == XML_TEXT_NODE) &&
3556*6777b538SAndroid Build Coastguard Worker 		(attr->children->next == NULL))
3557*6777b538SAndroid Build Coastguard Worker 		return(attr->children->content);
3558*6777b538SAndroid Build Coastguard Worker 	    else {
3559*6777b538SAndroid Build Coastguard Worker 		if (reader->buffer == NULL) {
3560*6777b538SAndroid Build Coastguard Worker 		    reader->buffer = xmlBufCreateSize(100);
3561*6777b538SAndroid Build Coastguard Worker                     if (reader->buffer == NULL)
3562*6777b538SAndroid Build Coastguard Worker                         return (NULL);
3563*6777b538SAndroid Build Coastguard Worker 		    xmlBufSetAllocationScheme(reader->buffer,
3564*6777b538SAndroid Build Coastguard Worker 		                              XML_BUFFER_ALLOC_DOUBLEIT);
3565*6777b538SAndroid Build Coastguard Worker                 } else
3566*6777b538SAndroid Build Coastguard Worker                     xmlBufEmpty(reader->buffer);
3567*6777b538SAndroid Build Coastguard Worker 	        xmlBufGetNodeContent(reader->buffer, node);
3568*6777b538SAndroid Build Coastguard Worker 		ret = xmlBufContent(reader->buffer);
3569*6777b538SAndroid Build Coastguard Worker 		if (ret == NULL) {
3570*6777b538SAndroid Build Coastguard Worker 		    /* error on the buffer best to reallocate */
3571*6777b538SAndroid Build Coastguard Worker 		    xmlBufFree(reader->buffer);
3572*6777b538SAndroid Build Coastguard Worker 		    reader->buffer = xmlBufCreateSize(100);
3573*6777b538SAndroid Build Coastguard Worker 		    xmlBufSetAllocationScheme(reader->buffer,
3574*6777b538SAndroid Build Coastguard Worker 		                              XML_BUFFER_ALLOC_DOUBLEIT);
3575*6777b538SAndroid Build Coastguard Worker 		    ret = BAD_CAST "";
3576*6777b538SAndroid Build Coastguard Worker 		}
3577*6777b538SAndroid Build Coastguard Worker 		return(ret);
3578*6777b538SAndroid Build Coastguard Worker 	    }
3579*6777b538SAndroid Build Coastguard Worker 	    break;
3580*6777b538SAndroid Build Coastguard Worker 	}
3581*6777b538SAndroid Build Coastguard Worker         case XML_TEXT_NODE:
3582*6777b538SAndroid Build Coastguard Worker         case XML_CDATA_SECTION_NODE:
3583*6777b538SAndroid Build Coastguard Worker         case XML_PI_NODE:
3584*6777b538SAndroid Build Coastguard Worker         case XML_COMMENT_NODE:
3585*6777b538SAndroid Build Coastguard Worker 	    return(node->content);
3586*6777b538SAndroid Build Coastguard Worker 	default:
3587*6777b538SAndroid Build Coastguard Worker 	    break;
3588*6777b538SAndroid Build Coastguard Worker     }
3589*6777b538SAndroid Build Coastguard Worker     return(NULL);
3590*6777b538SAndroid Build Coastguard Worker }
3591*6777b538SAndroid Build Coastguard Worker 
3592*6777b538SAndroid Build Coastguard Worker /**
3593*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderIsDefault:
3594*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3595*6777b538SAndroid Build Coastguard Worker  *
3596*6777b538SAndroid Build Coastguard Worker  * Whether an Attribute  node was generated from the default value
3597*6777b538SAndroid Build Coastguard Worker  * defined in the DTD or schema.
3598*6777b538SAndroid Build Coastguard Worker  *
3599*6777b538SAndroid Build Coastguard Worker  * Returns 0 if not defaulted, 1 if defaulted, and -1 in case of error
3600*6777b538SAndroid Build Coastguard Worker  */
3601*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderIsDefault(xmlTextReaderPtr reader)3602*6777b538SAndroid Build Coastguard Worker xmlTextReaderIsDefault(xmlTextReaderPtr reader) {
3603*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3604*6777b538SAndroid Build Coastguard Worker 	return(-1);
3605*6777b538SAndroid Build Coastguard Worker     return(0);
3606*6777b538SAndroid Build Coastguard Worker }
3607*6777b538SAndroid Build Coastguard Worker 
3608*6777b538SAndroid Build Coastguard Worker /**
3609*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderQuoteChar:
3610*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3611*6777b538SAndroid Build Coastguard Worker  *
3612*6777b538SAndroid Build Coastguard Worker  * The quotation mark character used to enclose the value of an attribute.
3613*6777b538SAndroid Build Coastguard Worker  *
3614*6777b538SAndroid Build Coastguard Worker  * Returns " or ' and -1 in case of error
3615*6777b538SAndroid Build Coastguard Worker  */
3616*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderQuoteChar(xmlTextReaderPtr reader)3617*6777b538SAndroid Build Coastguard Worker xmlTextReaderQuoteChar(xmlTextReaderPtr reader) {
3618*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3619*6777b538SAndroid Build Coastguard Worker 	return(-1);
3620*6777b538SAndroid Build Coastguard Worker     /* TODO maybe lookup the attribute value for " first */
3621*6777b538SAndroid Build Coastguard Worker     return('"');
3622*6777b538SAndroid Build Coastguard Worker }
3623*6777b538SAndroid Build Coastguard Worker 
3624*6777b538SAndroid Build Coastguard Worker /**
3625*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderXmlLang:
3626*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3627*6777b538SAndroid Build Coastguard Worker  *
3628*6777b538SAndroid Build Coastguard Worker  * The xml:lang scope within which the node resides.
3629*6777b538SAndroid Build Coastguard Worker  *
3630*6777b538SAndroid Build Coastguard Worker  * Returns the xml:lang value or NULL if none exists.,
3631*6777b538SAndroid Build Coastguard Worker  *    if non NULL it need to be freed by the caller.
3632*6777b538SAndroid Build Coastguard Worker  */
3633*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderXmlLang(xmlTextReaderPtr reader)3634*6777b538SAndroid Build Coastguard Worker xmlTextReaderXmlLang(xmlTextReaderPtr reader) {
3635*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3636*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3637*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
3638*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3639*6777b538SAndroid Build Coastguard Worker     return(xmlNodeGetLang(reader->node));
3640*6777b538SAndroid Build Coastguard Worker }
3641*6777b538SAndroid Build Coastguard Worker 
3642*6777b538SAndroid Build Coastguard Worker /**
3643*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstXmlLang:
3644*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3645*6777b538SAndroid Build Coastguard Worker  *
3646*6777b538SAndroid Build Coastguard Worker  * The xml:lang scope within which the node resides.
3647*6777b538SAndroid Build Coastguard Worker  *
3648*6777b538SAndroid Build Coastguard Worker  * Returns the xml:lang value or NULL if none exists.
3649*6777b538SAndroid Build Coastguard Worker  */
3650*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstXmlLang(xmlTextReaderPtr reader)3651*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstXmlLang(xmlTextReaderPtr reader) {
3652*6777b538SAndroid Build Coastguard Worker     xmlChar *tmp;
3653*6777b538SAndroid Build Coastguard Worker     const xmlChar *ret;
3654*6777b538SAndroid Build Coastguard Worker 
3655*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3656*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3657*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
3658*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3659*6777b538SAndroid Build Coastguard Worker     tmp = xmlNodeGetLang(reader->node);
3660*6777b538SAndroid Build Coastguard Worker     if (tmp == NULL)
3661*6777b538SAndroid Build Coastguard Worker         return(NULL);
3662*6777b538SAndroid Build Coastguard Worker     ret = CONSTSTR(tmp);
3663*6777b538SAndroid Build Coastguard Worker     xmlFree(tmp);
3664*6777b538SAndroid Build Coastguard Worker     return(ret);
3665*6777b538SAndroid Build Coastguard Worker }
3666*6777b538SAndroid Build Coastguard Worker 
3667*6777b538SAndroid Build Coastguard Worker /**
3668*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstString:
3669*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3670*6777b538SAndroid Build Coastguard Worker  * @str:  the string to intern.
3671*6777b538SAndroid Build Coastguard Worker  *
3672*6777b538SAndroid Build Coastguard Worker  * Get an interned string from the reader, allows for example to
3673*6777b538SAndroid Build Coastguard Worker  * speedup string name comparisons
3674*6777b538SAndroid Build Coastguard Worker  *
3675*6777b538SAndroid Build Coastguard Worker  * Returns an interned copy of the string or NULL in case of error. The
3676*6777b538SAndroid Build Coastguard Worker  *         string will be deallocated with the reader.
3677*6777b538SAndroid Build Coastguard Worker  */
3678*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstString(xmlTextReaderPtr reader,const xmlChar * str)3679*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstString(xmlTextReaderPtr reader, const xmlChar *str) {
3680*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3681*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3682*6777b538SAndroid Build Coastguard Worker     return(CONSTSTR(str));
3683*6777b538SAndroid Build Coastguard Worker }
3684*6777b538SAndroid Build Coastguard Worker 
3685*6777b538SAndroid Build Coastguard Worker /**
3686*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderNormalization:
3687*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3688*6777b538SAndroid Build Coastguard Worker  *
3689*6777b538SAndroid Build Coastguard Worker  * The value indicating whether to normalize white space and attribute values.
3690*6777b538SAndroid Build Coastguard Worker  * Since attribute value and end of line normalizations are a MUST in the XML
3691*6777b538SAndroid Build Coastguard Worker  * specification only the value true is accepted. The broken behaviour of
3692*6777b538SAndroid Build Coastguard Worker  * accepting out of range character entities like &#0; is of course not
3693*6777b538SAndroid Build Coastguard Worker  * supported either.
3694*6777b538SAndroid Build Coastguard Worker  *
3695*6777b538SAndroid Build Coastguard Worker  * Returns 1 or -1 in case of error.
3696*6777b538SAndroid Build Coastguard Worker  */
3697*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderNormalization(xmlTextReaderPtr reader)3698*6777b538SAndroid Build Coastguard Worker xmlTextReaderNormalization(xmlTextReaderPtr reader) {
3699*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3700*6777b538SAndroid Build Coastguard Worker 	return(-1);
3701*6777b538SAndroid Build Coastguard Worker     return(1);
3702*6777b538SAndroid Build Coastguard Worker }
3703*6777b538SAndroid Build Coastguard Worker 
3704*6777b538SAndroid Build Coastguard Worker /************************************************************************
3705*6777b538SAndroid Build Coastguard Worker  *									*
3706*6777b538SAndroid Build Coastguard Worker  *			Extensions to the base APIs			*
3707*6777b538SAndroid Build Coastguard Worker  *									*
3708*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
3709*6777b538SAndroid Build Coastguard Worker 
3710*6777b538SAndroid Build Coastguard Worker /**
3711*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderSetParserProp:
3712*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3713*6777b538SAndroid Build Coastguard Worker  * @prop:  the xmlParserProperties to set
3714*6777b538SAndroid Build Coastguard Worker  * @value:  usually 0 or 1 to (de)activate it
3715*6777b538SAndroid Build Coastguard Worker  *
3716*6777b538SAndroid Build Coastguard Worker  * Change the parser processing behaviour by changing some of its internal
3717*6777b538SAndroid Build Coastguard Worker  * properties. Note that some properties can only be changed before any
3718*6777b538SAndroid Build Coastguard Worker  * read has been done.
3719*6777b538SAndroid Build Coastguard Worker  *
3720*6777b538SAndroid Build Coastguard Worker  * Returns 0 if the call was successful, or -1 in case of error
3721*6777b538SAndroid Build Coastguard Worker  */
3722*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderSetParserProp(xmlTextReaderPtr reader,int prop,int value)3723*6777b538SAndroid Build Coastguard Worker xmlTextReaderSetParserProp(xmlTextReaderPtr reader, int prop, int value) {
3724*6777b538SAndroid Build Coastguard Worker     xmlParserProperties p = (xmlParserProperties) prop;
3725*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
3726*6777b538SAndroid Build Coastguard Worker 
3727*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->ctxt == NULL))
3728*6777b538SAndroid Build Coastguard Worker 	return(-1);
3729*6777b538SAndroid Build Coastguard Worker     ctxt = reader->ctxt;
3730*6777b538SAndroid Build Coastguard Worker 
3731*6777b538SAndroid Build Coastguard Worker     switch (p) {
3732*6777b538SAndroid Build Coastguard Worker         case XML_PARSER_LOADDTD:
3733*6777b538SAndroid Build Coastguard Worker 	    if (value != 0) {
3734*6777b538SAndroid Build Coastguard Worker 		if (ctxt->loadsubset == 0) {
3735*6777b538SAndroid Build Coastguard Worker 		    if (reader->mode != XML_TEXTREADER_MODE_INITIAL)
3736*6777b538SAndroid Build Coastguard Worker 			return(-1);
3737*6777b538SAndroid Build Coastguard Worker                     ctxt->options |= XML_PARSE_DTDLOAD;
3738*6777b538SAndroid Build Coastguard Worker 		    ctxt->loadsubset |= XML_DETECT_IDS;
3739*6777b538SAndroid Build Coastguard Worker 		}
3740*6777b538SAndroid Build Coastguard Worker 	    } else {
3741*6777b538SAndroid Build Coastguard Worker                 ctxt->options &= ~XML_PARSE_DTDLOAD;
3742*6777b538SAndroid Build Coastguard Worker 		ctxt->loadsubset &= ~XML_DETECT_IDS;
3743*6777b538SAndroid Build Coastguard Worker 	    }
3744*6777b538SAndroid Build Coastguard Worker 	    return(0);
3745*6777b538SAndroid Build Coastguard Worker         case XML_PARSER_DEFAULTATTRS:
3746*6777b538SAndroid Build Coastguard Worker 	    if (value != 0) {
3747*6777b538SAndroid Build Coastguard Worker                 ctxt->options |= XML_PARSE_DTDATTR;
3748*6777b538SAndroid Build Coastguard Worker 		ctxt->loadsubset |= XML_COMPLETE_ATTRS;
3749*6777b538SAndroid Build Coastguard Worker 	    } else {
3750*6777b538SAndroid Build Coastguard Worker                 ctxt->options &= ~XML_PARSE_DTDATTR;
3751*6777b538SAndroid Build Coastguard Worker 		ctxt->loadsubset &= ~XML_COMPLETE_ATTRS;
3752*6777b538SAndroid Build Coastguard Worker 	    }
3753*6777b538SAndroid Build Coastguard Worker 	    return(0);
3754*6777b538SAndroid Build Coastguard Worker         case XML_PARSER_VALIDATE:
3755*6777b538SAndroid Build Coastguard Worker 	    if (value != 0) {
3756*6777b538SAndroid Build Coastguard Worker                 ctxt->options |= XML_PARSE_DTDVALID;
3757*6777b538SAndroid Build Coastguard Worker 		ctxt->validate = 1;
3758*6777b538SAndroid Build Coastguard Worker 		reader->validate = XML_TEXTREADER_VALIDATE_DTD;
3759*6777b538SAndroid Build Coastguard Worker 	    } else {
3760*6777b538SAndroid Build Coastguard Worker                 ctxt->options &= ~XML_PARSE_DTDVALID;
3761*6777b538SAndroid Build Coastguard Worker 		ctxt->validate = 0;
3762*6777b538SAndroid Build Coastguard Worker 	    }
3763*6777b538SAndroid Build Coastguard Worker 	    return(0);
3764*6777b538SAndroid Build Coastguard Worker         case XML_PARSER_SUBST_ENTITIES:
3765*6777b538SAndroid Build Coastguard Worker 	    if (value != 0) {
3766*6777b538SAndroid Build Coastguard Worker                 ctxt->options |= XML_PARSE_NOENT;
3767*6777b538SAndroid Build Coastguard Worker 		ctxt->replaceEntities = 1;
3768*6777b538SAndroid Build Coastguard Worker 	    } else {
3769*6777b538SAndroid Build Coastguard Worker                 ctxt->options &= ~XML_PARSE_NOENT;
3770*6777b538SAndroid Build Coastguard Worker 		ctxt->replaceEntities = 0;
3771*6777b538SAndroid Build Coastguard Worker 	    }
3772*6777b538SAndroid Build Coastguard Worker 	    return(0);
3773*6777b538SAndroid Build Coastguard Worker     }
3774*6777b538SAndroid Build Coastguard Worker     return(-1);
3775*6777b538SAndroid Build Coastguard Worker }
3776*6777b538SAndroid Build Coastguard Worker 
3777*6777b538SAndroid Build Coastguard Worker /**
3778*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderGetParserProp:
3779*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3780*6777b538SAndroid Build Coastguard Worker  * @prop:  the xmlParserProperties to get
3781*6777b538SAndroid Build Coastguard Worker  *
3782*6777b538SAndroid Build Coastguard Worker  * Read the parser internal property.
3783*6777b538SAndroid Build Coastguard Worker  *
3784*6777b538SAndroid Build Coastguard Worker  * Returns the value, usually 0 or 1, or -1 in case of error.
3785*6777b538SAndroid Build Coastguard Worker  */
3786*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderGetParserProp(xmlTextReaderPtr reader,int prop)3787*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetParserProp(xmlTextReaderPtr reader, int prop) {
3788*6777b538SAndroid Build Coastguard Worker     xmlParserProperties p = (xmlParserProperties) prop;
3789*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
3790*6777b538SAndroid Build Coastguard Worker 
3791*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->ctxt == NULL))
3792*6777b538SAndroid Build Coastguard Worker 	return(-1);
3793*6777b538SAndroid Build Coastguard Worker     ctxt = reader->ctxt;
3794*6777b538SAndroid Build Coastguard Worker 
3795*6777b538SAndroid Build Coastguard Worker     switch (p) {
3796*6777b538SAndroid Build Coastguard Worker         case XML_PARSER_LOADDTD:
3797*6777b538SAndroid Build Coastguard Worker 	    if ((ctxt->loadsubset != 0) || (ctxt->validate != 0))
3798*6777b538SAndroid Build Coastguard Worker 		return(1);
3799*6777b538SAndroid Build Coastguard Worker 	    return(0);
3800*6777b538SAndroid Build Coastguard Worker         case XML_PARSER_DEFAULTATTRS:
3801*6777b538SAndroid Build Coastguard Worker 	    if (ctxt->loadsubset & XML_COMPLETE_ATTRS)
3802*6777b538SAndroid Build Coastguard Worker 		return(1);
3803*6777b538SAndroid Build Coastguard Worker 	    return(0);
3804*6777b538SAndroid Build Coastguard Worker         case XML_PARSER_VALIDATE:
3805*6777b538SAndroid Build Coastguard Worker 	    return(reader->validate);
3806*6777b538SAndroid Build Coastguard Worker 	case XML_PARSER_SUBST_ENTITIES:
3807*6777b538SAndroid Build Coastguard Worker 	    return(ctxt->replaceEntities);
3808*6777b538SAndroid Build Coastguard Worker     }
3809*6777b538SAndroid Build Coastguard Worker     return(-1);
3810*6777b538SAndroid Build Coastguard Worker }
3811*6777b538SAndroid Build Coastguard Worker 
3812*6777b538SAndroid Build Coastguard Worker 
3813*6777b538SAndroid Build Coastguard Worker /**
3814*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderGetParserLineNumber:
3815*6777b538SAndroid Build Coastguard Worker  * @reader: the user data (XML reader context)
3816*6777b538SAndroid Build Coastguard Worker  *
3817*6777b538SAndroid Build Coastguard Worker  * Provide the line number of the current parsing point.
3818*6777b538SAndroid Build Coastguard Worker  *
3819*6777b538SAndroid Build Coastguard Worker  * Returns an int or 0 if not available
3820*6777b538SAndroid Build Coastguard Worker  */
3821*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader)3822*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetParserLineNumber(xmlTextReaderPtr reader)
3823*6777b538SAndroid Build Coastguard Worker {
3824*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->ctxt == NULL) ||
3825*6777b538SAndroid Build Coastguard Worker         (reader->ctxt->input == NULL)) {
3826*6777b538SAndroid Build Coastguard Worker         return (0);
3827*6777b538SAndroid Build Coastguard Worker     }
3828*6777b538SAndroid Build Coastguard Worker     return (reader->ctxt->input->line);
3829*6777b538SAndroid Build Coastguard Worker }
3830*6777b538SAndroid Build Coastguard Worker 
3831*6777b538SAndroid Build Coastguard Worker /**
3832*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderGetParserColumnNumber:
3833*6777b538SAndroid Build Coastguard Worker  * @reader: the user data (XML reader context)
3834*6777b538SAndroid Build Coastguard Worker  *
3835*6777b538SAndroid Build Coastguard Worker  * Provide the column number of the current parsing point.
3836*6777b538SAndroid Build Coastguard Worker  *
3837*6777b538SAndroid Build Coastguard Worker  * Returns an int or 0 if not available
3838*6777b538SAndroid Build Coastguard Worker  */
3839*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader)3840*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetParserColumnNumber(xmlTextReaderPtr reader)
3841*6777b538SAndroid Build Coastguard Worker {
3842*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->ctxt == NULL) ||
3843*6777b538SAndroid Build Coastguard Worker         (reader->ctxt->input == NULL)) {
3844*6777b538SAndroid Build Coastguard Worker         return (0);
3845*6777b538SAndroid Build Coastguard Worker     }
3846*6777b538SAndroid Build Coastguard Worker     return (reader->ctxt->input->col);
3847*6777b538SAndroid Build Coastguard Worker }
3848*6777b538SAndroid Build Coastguard Worker 
3849*6777b538SAndroid Build Coastguard Worker /**
3850*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderCurrentNode:
3851*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3852*6777b538SAndroid Build Coastguard Worker  *
3853*6777b538SAndroid Build Coastguard Worker  * Hacking interface allowing to get the xmlNodePtr corresponding to the
3854*6777b538SAndroid Build Coastguard Worker  * current node being accessed by the xmlTextReader. This is dangerous
3855*6777b538SAndroid Build Coastguard Worker  * because the underlying node may be destroyed on the next Reads.
3856*6777b538SAndroid Build Coastguard Worker  *
3857*6777b538SAndroid Build Coastguard Worker  * Returns the xmlNodePtr or NULL in case of error.
3858*6777b538SAndroid Build Coastguard Worker  */
3859*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlTextReaderCurrentNode(xmlTextReaderPtr reader)3860*6777b538SAndroid Build Coastguard Worker xmlTextReaderCurrentNode(xmlTextReaderPtr reader) {
3861*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3862*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3863*6777b538SAndroid Build Coastguard Worker 
3864*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3865*6777b538SAndroid Build Coastguard Worker 	return(reader->curnode);
3866*6777b538SAndroid Build Coastguard Worker     return(reader->node);
3867*6777b538SAndroid Build Coastguard Worker }
3868*6777b538SAndroid Build Coastguard Worker 
3869*6777b538SAndroid Build Coastguard Worker /**
3870*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderPreserve:
3871*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3872*6777b538SAndroid Build Coastguard Worker  *
3873*6777b538SAndroid Build Coastguard Worker  * This tells the XML Reader to preserve the current node.
3874*6777b538SAndroid Build Coastguard Worker  * The caller must also use xmlTextReaderCurrentDoc() to
3875*6777b538SAndroid Build Coastguard Worker  * keep an handle on the resulting document once parsing has finished
3876*6777b538SAndroid Build Coastguard Worker  *
3877*6777b538SAndroid Build Coastguard Worker  * Returns the xmlNodePtr or NULL in case of error.
3878*6777b538SAndroid Build Coastguard Worker  */
3879*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlTextReaderPreserve(xmlTextReaderPtr reader)3880*6777b538SAndroid Build Coastguard Worker xmlTextReaderPreserve(xmlTextReaderPtr reader) {
3881*6777b538SAndroid Build Coastguard Worker     xmlNodePtr cur, parent;
3882*6777b538SAndroid Build Coastguard Worker 
3883*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3884*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3885*6777b538SAndroid Build Coastguard Worker 
3886*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
3887*6777b538SAndroid Build Coastguard Worker         cur = reader->curnode;
3888*6777b538SAndroid Build Coastguard Worker     else
3889*6777b538SAndroid Build Coastguard Worker         cur = reader->node;
3890*6777b538SAndroid Build Coastguard Worker     if (cur == NULL)
3891*6777b538SAndroid Build Coastguard Worker         return(NULL);
3892*6777b538SAndroid Build Coastguard Worker 
3893*6777b538SAndroid Build Coastguard Worker     if ((cur->type != XML_DOCUMENT_NODE) && (cur->type != XML_DTD_NODE)) {
3894*6777b538SAndroid Build Coastguard Worker 	cur->extra |= NODE_IS_PRESERVED;
3895*6777b538SAndroid Build Coastguard Worker 	cur->extra |= NODE_IS_SPRESERVED;
3896*6777b538SAndroid Build Coastguard Worker     }
3897*6777b538SAndroid Build Coastguard Worker     reader->preserves++;
3898*6777b538SAndroid Build Coastguard Worker 
3899*6777b538SAndroid Build Coastguard Worker     parent = cur->parent;;
3900*6777b538SAndroid Build Coastguard Worker     while (parent != NULL) {
3901*6777b538SAndroid Build Coastguard Worker         if (parent->type == XML_ELEMENT_NODE)
3902*6777b538SAndroid Build Coastguard Worker 	    parent->extra |= NODE_IS_PRESERVED;
3903*6777b538SAndroid Build Coastguard Worker 	parent = parent->parent;
3904*6777b538SAndroid Build Coastguard Worker     }
3905*6777b538SAndroid Build Coastguard Worker     return(cur);
3906*6777b538SAndroid Build Coastguard Worker }
3907*6777b538SAndroid Build Coastguard Worker 
3908*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
3909*6777b538SAndroid Build Coastguard Worker /**
3910*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderPreservePattern:
3911*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3912*6777b538SAndroid Build Coastguard Worker  * @pattern:  an XPath subset pattern
3913*6777b538SAndroid Build Coastguard Worker  * @namespaces: the prefix definitions, array of [URI, prefix] or NULL
3914*6777b538SAndroid Build Coastguard Worker  *
3915*6777b538SAndroid Build Coastguard Worker  * This tells the XML Reader to preserve all nodes matched by the
3916*6777b538SAndroid Build Coastguard Worker  * pattern. The caller must also use xmlTextReaderCurrentDoc() to
3917*6777b538SAndroid Build Coastguard Worker  * keep an handle on the resulting document once parsing has finished
3918*6777b538SAndroid Build Coastguard Worker  *
3919*6777b538SAndroid Build Coastguard Worker  * Returns a non-negative number in case of success and -1 in case of error
3920*6777b538SAndroid Build Coastguard Worker  */
3921*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderPreservePattern(xmlTextReaderPtr reader,const xmlChar * pattern,const xmlChar ** namespaces)3922*6777b538SAndroid Build Coastguard Worker xmlTextReaderPreservePattern(xmlTextReaderPtr reader, const xmlChar *pattern,
3923*6777b538SAndroid Build Coastguard Worker                              const xmlChar **namespaces)
3924*6777b538SAndroid Build Coastguard Worker {
3925*6777b538SAndroid Build Coastguard Worker     xmlPatternPtr comp;
3926*6777b538SAndroid Build Coastguard Worker 
3927*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (pattern == NULL))
3928*6777b538SAndroid Build Coastguard Worker 	return(-1);
3929*6777b538SAndroid Build Coastguard Worker 
3930*6777b538SAndroid Build Coastguard Worker     comp = xmlPatterncompile(pattern, reader->dict, 0, namespaces);
3931*6777b538SAndroid Build Coastguard Worker     if (comp == NULL)
3932*6777b538SAndroid Build Coastguard Worker         return(-1);
3933*6777b538SAndroid Build Coastguard Worker 
3934*6777b538SAndroid Build Coastguard Worker     if (reader->patternMax <= 0) {
3935*6777b538SAndroid Build Coastguard Worker 	reader->patternMax = 4;
3936*6777b538SAndroid Build Coastguard Worker 	reader->patternTab = (xmlPatternPtr *) xmlMalloc(reader->patternMax *
3937*6777b538SAndroid Build Coastguard Worker 					      sizeof(reader->patternTab[0]));
3938*6777b538SAndroid Build Coastguard Worker         if (reader->patternTab == NULL) {
3939*6777b538SAndroid Build Coastguard Worker             xmlTextReaderErrMemory(reader);
3940*6777b538SAndroid Build Coastguard Worker             return (-1);
3941*6777b538SAndroid Build Coastguard Worker         }
3942*6777b538SAndroid Build Coastguard Worker     }
3943*6777b538SAndroid Build Coastguard Worker     if (reader->patternNr >= reader->patternMax) {
3944*6777b538SAndroid Build Coastguard Worker         xmlPatternPtr *tmp;
3945*6777b538SAndroid Build Coastguard Worker         reader->patternMax *= 2;
3946*6777b538SAndroid Build Coastguard Worker 	tmp = (xmlPatternPtr *) xmlRealloc(reader->patternTab,
3947*6777b538SAndroid Build Coastguard Worker                                       reader->patternMax *
3948*6777b538SAndroid Build Coastguard Worker                                       sizeof(reader->patternTab[0]));
3949*6777b538SAndroid Build Coastguard Worker         if (tmp == NULL) {
3950*6777b538SAndroid Build Coastguard Worker             xmlTextReaderErrMemory(reader);
3951*6777b538SAndroid Build Coastguard Worker 	    reader->patternMax /= 2;
3952*6777b538SAndroid Build Coastguard Worker             return (-1);
3953*6777b538SAndroid Build Coastguard Worker         }
3954*6777b538SAndroid Build Coastguard Worker 	reader->patternTab = tmp;
3955*6777b538SAndroid Build Coastguard Worker     }
3956*6777b538SAndroid Build Coastguard Worker     reader->patternTab[reader->patternNr] = comp;
3957*6777b538SAndroid Build Coastguard Worker     return(reader->patternNr++);
3958*6777b538SAndroid Build Coastguard Worker }
3959*6777b538SAndroid Build Coastguard Worker #endif
3960*6777b538SAndroid Build Coastguard Worker 
3961*6777b538SAndroid Build Coastguard Worker /**
3962*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderCurrentDoc:
3963*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3964*6777b538SAndroid Build Coastguard Worker  *
3965*6777b538SAndroid Build Coastguard Worker  * Hacking interface allowing to get the xmlDocPtr corresponding to the
3966*6777b538SAndroid Build Coastguard Worker  * current document being accessed by the xmlTextReader.
3967*6777b538SAndroid Build Coastguard Worker  * NOTE: as a result of this call, the reader will not destroy the
3968*6777b538SAndroid Build Coastguard Worker  *       associated XML document and calling xmlFreeDoc() on the result
3969*6777b538SAndroid Build Coastguard Worker  *       is needed once the reader parsing has finished.
3970*6777b538SAndroid Build Coastguard Worker  *
3971*6777b538SAndroid Build Coastguard Worker  * Returns the xmlDocPtr or NULL in case of error.
3972*6777b538SAndroid Build Coastguard Worker  */
3973*6777b538SAndroid Build Coastguard Worker xmlDocPtr
xmlTextReaderCurrentDoc(xmlTextReaderPtr reader)3974*6777b538SAndroid Build Coastguard Worker xmlTextReaderCurrentDoc(xmlTextReaderPtr reader) {
3975*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
3976*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3977*6777b538SAndroid Build Coastguard Worker     if (reader->doc != NULL)
3978*6777b538SAndroid Build Coastguard Worker         return(reader->doc);
3979*6777b538SAndroid Build Coastguard Worker     if ((reader->ctxt == NULL) || (reader->ctxt->myDoc == NULL))
3980*6777b538SAndroid Build Coastguard Worker 	return(NULL);
3981*6777b538SAndroid Build Coastguard Worker 
3982*6777b538SAndroid Build Coastguard Worker     reader->preserve = 1;
3983*6777b538SAndroid Build Coastguard Worker     return(reader->ctxt->myDoc);
3984*6777b538SAndroid Build Coastguard Worker }
3985*6777b538SAndroid Build Coastguard Worker 
3986*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
3987*6777b538SAndroid Build Coastguard Worker /**
3988*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderRelaxNGSetSchema:
3989*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
3990*6777b538SAndroid Build Coastguard Worker  * @schema:  a precompiled RelaxNG schema
3991*6777b538SAndroid Build Coastguard Worker  *
3992*6777b538SAndroid Build Coastguard Worker  * Use RelaxNG to validate the document as it is processed.
3993*6777b538SAndroid Build Coastguard Worker  * Activation is only possible before the first Read().
3994*6777b538SAndroid Build Coastguard Worker  * if @schema is NULL, then RelaxNG validation is deactivated.
3995*6777b538SAndroid Build Coastguard Worker  @ The @schema should not be freed until the reader is deallocated
3996*6777b538SAndroid Build Coastguard Worker  * or its use has been deactivated.
3997*6777b538SAndroid Build Coastguard Worker  *
3998*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case the RelaxNG validation could be (de)activated and
3999*6777b538SAndroid Build Coastguard Worker  *         -1 in case of error.
4000*6777b538SAndroid Build Coastguard Worker  */
4001*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader,xmlRelaxNGPtr schema)4002*6777b538SAndroid Build Coastguard Worker xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema) {
4003*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
4004*6777b538SAndroid Build Coastguard Worker         return(-1);
4005*6777b538SAndroid Build Coastguard Worker     if (schema == NULL) {
4006*6777b538SAndroid Build Coastguard Worker         if (reader->rngSchemas != NULL) {
4007*6777b538SAndroid Build Coastguard Worker 	    xmlRelaxNGFree(reader->rngSchemas);
4008*6777b538SAndroid Build Coastguard Worker 	    reader->rngSchemas = NULL;
4009*6777b538SAndroid Build Coastguard Worker 	}
4010*6777b538SAndroid Build Coastguard Worker         if (reader->rngValidCtxt != NULL) {
4011*6777b538SAndroid Build Coastguard Worker 	    if (! reader->rngPreserveCtxt)
4012*6777b538SAndroid Build Coastguard Worker 		xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt);
4013*6777b538SAndroid Build Coastguard Worker 	    reader->rngValidCtxt = NULL;
4014*6777b538SAndroid Build Coastguard Worker         }
4015*6777b538SAndroid Build Coastguard Worker 	reader->rngPreserveCtxt = 0;
4016*6777b538SAndroid Build Coastguard Worker 	return(0);
4017*6777b538SAndroid Build Coastguard Worker     }
4018*6777b538SAndroid Build Coastguard Worker     if (reader->mode != XML_TEXTREADER_MODE_INITIAL)
4019*6777b538SAndroid Build Coastguard Worker 	return(-1);
4020*6777b538SAndroid Build Coastguard Worker     if (reader->rngSchemas != NULL) {
4021*6777b538SAndroid Build Coastguard Worker 	xmlRelaxNGFree(reader->rngSchemas);
4022*6777b538SAndroid Build Coastguard Worker 	reader->rngSchemas = NULL;
4023*6777b538SAndroid Build Coastguard Worker     }
4024*6777b538SAndroid Build Coastguard Worker     if (reader->rngValidCtxt != NULL) {
4025*6777b538SAndroid Build Coastguard Worker 	if (! reader->rngPreserveCtxt)
4026*6777b538SAndroid Build Coastguard Worker 	    xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt);
4027*6777b538SAndroid Build Coastguard Worker 	reader->rngValidCtxt = NULL;
4028*6777b538SAndroid Build Coastguard Worker     }
4029*6777b538SAndroid Build Coastguard Worker     reader->rngPreserveCtxt = 0;
4030*6777b538SAndroid Build Coastguard Worker     reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(schema);
4031*6777b538SAndroid Build Coastguard Worker     if (reader->rngValidCtxt == NULL)
4032*6777b538SAndroid Build Coastguard Worker         return(-1);
4033*6777b538SAndroid Build Coastguard Worker     if ((reader->errorFunc != NULL) || (reader->sErrorFunc != NULL))
4034*6777b538SAndroid Build Coastguard Worker 	xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
4035*6777b538SAndroid Build Coastguard Worker 			xmlTextReaderStructuredRelay, reader);
4036*6777b538SAndroid Build Coastguard Worker     reader->rngValidErrors = 0;
4037*6777b538SAndroid Build Coastguard Worker     reader->rngFullNode = NULL;
4038*6777b538SAndroid Build Coastguard Worker     reader->validate = XML_TEXTREADER_VALIDATE_RNG;
4039*6777b538SAndroid Build Coastguard Worker     return(0);
4040*6777b538SAndroid Build Coastguard Worker }
4041*6777b538SAndroid Build Coastguard Worker 
4042*6777b538SAndroid Build Coastguard Worker /**
4043*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderLocator:
4044*6777b538SAndroid Build Coastguard Worker  * @ctx: the xmlTextReaderPtr used
4045*6777b538SAndroid Build Coastguard Worker  * @file: returned file information
4046*6777b538SAndroid Build Coastguard Worker  * @line: returned line information
4047*6777b538SAndroid Build Coastguard Worker  *
4048*6777b538SAndroid Build Coastguard Worker  * Internal locator function for the readers
4049*6777b538SAndroid Build Coastguard Worker  *
4050*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case the Schema validation could be (de)activated and
4051*6777b538SAndroid Build Coastguard Worker  *         -1 in case of error.
4052*6777b538SAndroid Build Coastguard Worker  */
4053*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderLocator(void * ctx,const char ** file,unsigned long * line)4054*6777b538SAndroid Build Coastguard Worker xmlTextReaderLocator(void *ctx, const char **file, unsigned long *line) {
4055*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
4056*6777b538SAndroid Build Coastguard Worker 
4057*6777b538SAndroid Build Coastguard Worker     if ((ctx == NULL) || ((file == NULL) && (line == NULL)))
4058*6777b538SAndroid Build Coastguard Worker         return(-1);
4059*6777b538SAndroid Build Coastguard Worker 
4060*6777b538SAndroid Build Coastguard Worker     if (file != NULL)
4061*6777b538SAndroid Build Coastguard Worker         *file = NULL;
4062*6777b538SAndroid Build Coastguard Worker     if (line != NULL)
4063*6777b538SAndroid Build Coastguard Worker         *line = 0;
4064*6777b538SAndroid Build Coastguard Worker 
4065*6777b538SAndroid Build Coastguard Worker     reader = (xmlTextReaderPtr) ctx;
4066*6777b538SAndroid Build Coastguard Worker     if ((reader->ctxt != NULL) && (reader->ctxt->input != NULL)) {
4067*6777b538SAndroid Build Coastguard Worker 	if (file != NULL)
4068*6777b538SAndroid Build Coastguard Worker 	    *file = reader->ctxt->input->filename;
4069*6777b538SAndroid Build Coastguard Worker 	if (line != NULL)
4070*6777b538SAndroid Build Coastguard Worker 	    *line = reader->ctxt->input->line;
4071*6777b538SAndroid Build Coastguard Worker 	return(0);
4072*6777b538SAndroid Build Coastguard Worker     }
4073*6777b538SAndroid Build Coastguard Worker     if (reader->node != NULL) {
4074*6777b538SAndroid Build Coastguard Worker         long res;
4075*6777b538SAndroid Build Coastguard Worker 	int ret = 0;
4076*6777b538SAndroid Build Coastguard Worker 
4077*6777b538SAndroid Build Coastguard Worker 	if (line != NULL) {
4078*6777b538SAndroid Build Coastguard Worker 	    res = xmlGetLineNo(reader->node);
4079*6777b538SAndroid Build Coastguard Worker 	    if (res > 0)
4080*6777b538SAndroid Build Coastguard Worker 	        *line = (unsigned long) res;
4081*6777b538SAndroid Build Coastguard Worker 	    else
4082*6777b538SAndroid Build Coastguard Worker                 ret = -1;
4083*6777b538SAndroid Build Coastguard Worker 	}
4084*6777b538SAndroid Build Coastguard Worker         if (file != NULL) {
4085*6777b538SAndroid Build Coastguard Worker 	    xmlDocPtr doc = reader->node->doc;
4086*6777b538SAndroid Build Coastguard Worker 	    if ((doc != NULL) && (doc->URL != NULL))
4087*6777b538SAndroid Build Coastguard Worker 	        *file = (const char *) doc->URL;
4088*6777b538SAndroid Build Coastguard Worker 	    else
4089*6777b538SAndroid Build Coastguard Worker                 ret = -1;
4090*6777b538SAndroid Build Coastguard Worker 	}
4091*6777b538SAndroid Build Coastguard Worker 	return(ret);
4092*6777b538SAndroid Build Coastguard Worker     }
4093*6777b538SAndroid Build Coastguard Worker     return(-1);
4094*6777b538SAndroid Build Coastguard Worker }
4095*6777b538SAndroid Build Coastguard Worker 
4096*6777b538SAndroid Build Coastguard Worker /**
4097*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderSetSchema:
4098*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4099*6777b538SAndroid Build Coastguard Worker  * @schema:  a precompiled Schema schema
4100*6777b538SAndroid Build Coastguard Worker  *
4101*6777b538SAndroid Build Coastguard Worker  * Use XSD Schema to validate the document as it is processed.
4102*6777b538SAndroid Build Coastguard Worker  * Activation is only possible before the first Read().
4103*6777b538SAndroid Build Coastguard Worker  * if @schema is NULL, then Schema validation is deactivated.
4104*6777b538SAndroid Build Coastguard Worker  * The @schema should not be freed until the reader is deallocated
4105*6777b538SAndroid Build Coastguard Worker  * or its use has been deactivated.
4106*6777b538SAndroid Build Coastguard Worker  *
4107*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case the Schema validation could be (de)activated and
4108*6777b538SAndroid Build Coastguard Worker  *         -1 in case of error.
4109*6777b538SAndroid Build Coastguard Worker  */
4110*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderSetSchema(xmlTextReaderPtr reader,xmlSchemaPtr schema)4111*6777b538SAndroid Build Coastguard Worker xmlTextReaderSetSchema(xmlTextReaderPtr reader, xmlSchemaPtr schema) {
4112*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
4113*6777b538SAndroid Build Coastguard Worker         return(-1);
4114*6777b538SAndroid Build Coastguard Worker     if (schema == NULL) {
4115*6777b538SAndroid Build Coastguard Worker 	if (reader->xsdPlug != NULL) {
4116*6777b538SAndroid Build Coastguard Worker 	    xmlSchemaSAXUnplug(reader->xsdPlug);
4117*6777b538SAndroid Build Coastguard Worker 	    reader->xsdPlug = NULL;
4118*6777b538SAndroid Build Coastguard Worker 	}
4119*6777b538SAndroid Build Coastguard Worker         if (reader->xsdValidCtxt != NULL) {
4120*6777b538SAndroid Build Coastguard Worker 	    if (! reader->xsdPreserveCtxt)
4121*6777b538SAndroid Build Coastguard Worker 		xmlSchemaFreeValidCtxt(reader->xsdValidCtxt);
4122*6777b538SAndroid Build Coastguard Worker 	    reader->xsdValidCtxt = NULL;
4123*6777b538SAndroid Build Coastguard Worker         }
4124*6777b538SAndroid Build Coastguard Worker 	reader->xsdPreserveCtxt = 0;
4125*6777b538SAndroid Build Coastguard Worker         if (reader->xsdSchemas != NULL) {
4126*6777b538SAndroid Build Coastguard Worker 	    xmlSchemaFree(reader->xsdSchemas);
4127*6777b538SAndroid Build Coastguard Worker 	    reader->xsdSchemas = NULL;
4128*6777b538SAndroid Build Coastguard Worker 	}
4129*6777b538SAndroid Build Coastguard Worker 	return(0);
4130*6777b538SAndroid Build Coastguard Worker     }
4131*6777b538SAndroid Build Coastguard Worker     if (reader->mode != XML_TEXTREADER_MODE_INITIAL)
4132*6777b538SAndroid Build Coastguard Worker 	return(-1);
4133*6777b538SAndroid Build Coastguard Worker     if (reader->xsdPlug != NULL) {
4134*6777b538SAndroid Build Coastguard Worker 	xmlSchemaSAXUnplug(reader->xsdPlug);
4135*6777b538SAndroid Build Coastguard Worker 	reader->xsdPlug = NULL;
4136*6777b538SAndroid Build Coastguard Worker     }
4137*6777b538SAndroid Build Coastguard Worker     if (reader->xsdValidCtxt != NULL) {
4138*6777b538SAndroid Build Coastguard Worker 	if (! reader->xsdPreserveCtxt)
4139*6777b538SAndroid Build Coastguard Worker 	    xmlSchemaFreeValidCtxt(reader->xsdValidCtxt);
4140*6777b538SAndroid Build Coastguard Worker 	reader->xsdValidCtxt = NULL;
4141*6777b538SAndroid Build Coastguard Worker     }
4142*6777b538SAndroid Build Coastguard Worker     reader->xsdPreserveCtxt = 0;
4143*6777b538SAndroid Build Coastguard Worker     if (reader->xsdSchemas != NULL) {
4144*6777b538SAndroid Build Coastguard Worker 	xmlSchemaFree(reader->xsdSchemas);
4145*6777b538SAndroid Build Coastguard Worker 	reader->xsdSchemas = NULL;
4146*6777b538SAndroid Build Coastguard Worker     }
4147*6777b538SAndroid Build Coastguard Worker     reader->xsdValidCtxt = xmlSchemaNewValidCtxt(schema);
4148*6777b538SAndroid Build Coastguard Worker     if (reader->xsdValidCtxt == NULL) {
4149*6777b538SAndroid Build Coastguard Worker 	xmlSchemaFree(reader->xsdSchemas);
4150*6777b538SAndroid Build Coastguard Worker 	reader->xsdSchemas = NULL;
4151*6777b538SAndroid Build Coastguard Worker         return(-1);
4152*6777b538SAndroid Build Coastguard Worker     }
4153*6777b538SAndroid Build Coastguard Worker     reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt,
4154*6777b538SAndroid Build Coastguard Worker                                        &(reader->ctxt->sax),
4155*6777b538SAndroid Build Coastguard Worker 				       &(reader->ctxt->userData));
4156*6777b538SAndroid Build Coastguard Worker     if (reader->xsdPlug == NULL) {
4157*6777b538SAndroid Build Coastguard Worker 	xmlSchemaFree(reader->xsdSchemas);
4158*6777b538SAndroid Build Coastguard Worker 	reader->xsdSchemas = NULL;
4159*6777b538SAndroid Build Coastguard Worker 	xmlSchemaFreeValidCtxt(reader->xsdValidCtxt);
4160*6777b538SAndroid Build Coastguard Worker 	reader->xsdValidCtxt = NULL;
4161*6777b538SAndroid Build Coastguard Worker 	return(-1);
4162*6777b538SAndroid Build Coastguard Worker     }
4163*6777b538SAndroid Build Coastguard Worker     xmlSchemaValidateSetLocator(reader->xsdValidCtxt,
4164*6777b538SAndroid Build Coastguard Worker                                 xmlTextReaderLocator,
4165*6777b538SAndroid Build Coastguard Worker 				(void *) reader);
4166*6777b538SAndroid Build Coastguard Worker 
4167*6777b538SAndroid Build Coastguard Worker     if ((reader->errorFunc != NULL) || (reader->sErrorFunc != NULL))
4168*6777b538SAndroid Build Coastguard Worker 	xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
4169*6777b538SAndroid Build Coastguard Worker 			xmlTextReaderStructuredRelay, reader);
4170*6777b538SAndroid Build Coastguard Worker     reader->xsdValidErrors = 0;
4171*6777b538SAndroid Build Coastguard Worker     reader->validate = XML_TEXTREADER_VALIDATE_XSD;
4172*6777b538SAndroid Build Coastguard Worker     return(0);
4173*6777b538SAndroid Build Coastguard Worker }
4174*6777b538SAndroid Build Coastguard Worker 
4175*6777b538SAndroid Build Coastguard Worker /**
4176*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderRelaxNGValidateInternal:
4177*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4178*6777b538SAndroid Build Coastguard Worker  * @rng:  the path to a RelaxNG schema or NULL
4179*6777b538SAndroid Build Coastguard Worker  * @ctxt: the RelaxNG schema validation context or NULL
4180*6777b538SAndroid Build Coastguard Worker  * @options: options (not yet used)
4181*6777b538SAndroid Build Coastguard Worker  *
4182*6777b538SAndroid Build Coastguard Worker  * Use RelaxNG to validate the document as it is processed.
4183*6777b538SAndroid Build Coastguard Worker  * Activation is only possible before the first Read().
4184*6777b538SAndroid Build Coastguard Worker  * If both @rng and @ctxt are NULL, then RelaxNG validation is deactivated.
4185*6777b538SAndroid Build Coastguard Worker  *
4186*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case the RelaxNG validation could be (de)activated and
4187*6777b538SAndroid Build Coastguard Worker  *	   -1 in case of error.
4188*6777b538SAndroid Build Coastguard Worker  */
4189*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderRelaxNGValidateInternal(xmlTextReaderPtr reader,const char * rng,xmlRelaxNGValidCtxtPtr ctxt,int options ATTRIBUTE_UNUSED)4190*6777b538SAndroid Build Coastguard Worker xmlTextReaderRelaxNGValidateInternal(xmlTextReaderPtr reader,
4191*6777b538SAndroid Build Coastguard Worker 				     const char *rng,
4192*6777b538SAndroid Build Coastguard Worker 				     xmlRelaxNGValidCtxtPtr ctxt,
4193*6777b538SAndroid Build Coastguard Worker 				     int options ATTRIBUTE_UNUSED)
4194*6777b538SAndroid Build Coastguard Worker {
4195*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
4196*6777b538SAndroid Build Coastguard Worker 	return(-1);
4197*6777b538SAndroid Build Coastguard Worker 
4198*6777b538SAndroid Build Coastguard Worker     if ((rng != NULL) && (ctxt != NULL))
4199*6777b538SAndroid Build Coastguard Worker 	return (-1);
4200*6777b538SAndroid Build Coastguard Worker 
4201*6777b538SAndroid Build Coastguard Worker     if (((rng != NULL) || (ctxt != NULL)) &&
4202*6777b538SAndroid Build Coastguard Worker 	((reader->mode != XML_TEXTREADER_MODE_INITIAL) ||
4203*6777b538SAndroid Build Coastguard Worker 	 (reader->ctxt == NULL)))
4204*6777b538SAndroid Build Coastguard Worker 	return(-1);
4205*6777b538SAndroid Build Coastguard Worker 
4206*6777b538SAndroid Build Coastguard Worker     /* Cleanup previous validation stuff. */
4207*6777b538SAndroid Build Coastguard Worker     if (reader->rngValidCtxt != NULL) {
4208*6777b538SAndroid Build Coastguard Worker 	if ( !reader->rngPreserveCtxt)
4209*6777b538SAndroid Build Coastguard Worker 	    xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt);
4210*6777b538SAndroid Build Coastguard Worker 	reader->rngValidCtxt = NULL;
4211*6777b538SAndroid Build Coastguard Worker     }
4212*6777b538SAndroid Build Coastguard Worker     reader->rngPreserveCtxt = 0;
4213*6777b538SAndroid Build Coastguard Worker     if (reader->rngSchemas != NULL) {
4214*6777b538SAndroid Build Coastguard Worker 	xmlRelaxNGFree(reader->rngSchemas);
4215*6777b538SAndroid Build Coastguard Worker 	reader->rngSchemas = NULL;
4216*6777b538SAndroid Build Coastguard Worker     }
4217*6777b538SAndroid Build Coastguard Worker 
4218*6777b538SAndroid Build Coastguard Worker     if ((rng == NULL) && (ctxt == NULL)) {
4219*6777b538SAndroid Build Coastguard Worker 	/* We just want to deactivate the validation, so get out. */
4220*6777b538SAndroid Build Coastguard Worker 	return(0);
4221*6777b538SAndroid Build Coastguard Worker     }
4222*6777b538SAndroid Build Coastguard Worker 
4223*6777b538SAndroid Build Coastguard Worker 
4224*6777b538SAndroid Build Coastguard Worker     if (rng != NULL) {
4225*6777b538SAndroid Build Coastguard Worker 	xmlRelaxNGParserCtxtPtr pctxt;
4226*6777b538SAndroid Build Coastguard Worker 	/* Parse the schema and create validation environment. */
4227*6777b538SAndroid Build Coastguard Worker 
4228*6777b538SAndroid Build Coastguard Worker 	pctxt = xmlRelaxNGNewParserCtxt(rng);
4229*6777b538SAndroid Build Coastguard Worker 	if ((reader->errorFunc != NULL) || (reader->sErrorFunc != NULL))
4230*6777b538SAndroid Build Coastguard Worker 	    xmlRelaxNGSetParserStructuredErrors(pctxt,
4231*6777b538SAndroid Build Coastguard Worker                     xmlTextReaderStructuredRelay, reader);
4232*6777b538SAndroid Build Coastguard Worker 	reader->rngSchemas = xmlRelaxNGParse(pctxt);
4233*6777b538SAndroid Build Coastguard Worker 	xmlRelaxNGFreeParserCtxt(pctxt);
4234*6777b538SAndroid Build Coastguard Worker 	if (reader->rngSchemas == NULL)
4235*6777b538SAndroid Build Coastguard Worker 	    return(-1);
4236*6777b538SAndroid Build Coastguard Worker 
4237*6777b538SAndroid Build Coastguard Worker 	reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(reader->rngSchemas);
4238*6777b538SAndroid Build Coastguard Worker 	if (reader->rngValidCtxt == NULL) {
4239*6777b538SAndroid Build Coastguard Worker 	    xmlRelaxNGFree(reader->rngSchemas);
4240*6777b538SAndroid Build Coastguard Worker 	    reader->rngSchemas = NULL;
4241*6777b538SAndroid Build Coastguard Worker 	    return(-1);
4242*6777b538SAndroid Build Coastguard Worker 	}
4243*6777b538SAndroid Build Coastguard Worker     } else {
4244*6777b538SAndroid Build Coastguard Worker 	/* Use the given validation context. */
4245*6777b538SAndroid Build Coastguard Worker 	reader->rngValidCtxt = ctxt;
4246*6777b538SAndroid Build Coastguard Worker 	reader->rngPreserveCtxt = 1;
4247*6777b538SAndroid Build Coastguard Worker     }
4248*6777b538SAndroid Build Coastguard Worker     /*
4249*6777b538SAndroid Build Coastguard Worker     * Redirect the validation context's error channels to use
4250*6777b538SAndroid Build Coastguard Worker     * the reader channels.
4251*6777b538SAndroid Build Coastguard Worker     * TODO: In case the user provides the validation context we
4252*6777b538SAndroid Build Coastguard Worker     *	could make this redirection optional.
4253*6777b538SAndroid Build Coastguard Worker     */
4254*6777b538SAndroid Build Coastguard Worker     if ((reader->errorFunc != NULL) || (reader->sErrorFunc != NULL))
4255*6777b538SAndroid Build Coastguard Worker         xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
4256*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderStructuredRelay, reader);
4257*6777b538SAndroid Build Coastguard Worker     reader->rngValidErrors = 0;
4258*6777b538SAndroid Build Coastguard Worker     reader->rngFullNode = NULL;
4259*6777b538SAndroid Build Coastguard Worker     reader->validate = XML_TEXTREADER_VALIDATE_RNG;
4260*6777b538SAndroid Build Coastguard Worker     return(0);
4261*6777b538SAndroid Build Coastguard Worker }
4262*6777b538SAndroid Build Coastguard Worker 
4263*6777b538SAndroid Build Coastguard Worker /**
4264*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderSchemaValidateInternal:
4265*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4266*6777b538SAndroid Build Coastguard Worker  * @xsd:  the path to a W3C XSD schema or NULL
4267*6777b538SAndroid Build Coastguard Worker  * @ctxt: the XML Schema validation context or NULL
4268*6777b538SAndroid Build Coastguard Worker  * @options: options (not used yet)
4269*6777b538SAndroid Build Coastguard Worker  *
4270*6777b538SAndroid Build Coastguard Worker  * Validate the document as it is processed using XML Schema.
4271*6777b538SAndroid Build Coastguard Worker  * Activation is only possible before the first Read().
4272*6777b538SAndroid Build Coastguard Worker  * If both @xsd and @ctxt are NULL then XML Schema validation is deactivated.
4273*6777b538SAndroid Build Coastguard Worker  *
4274*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case the schemas validation could be (de)activated and
4275*6777b538SAndroid Build Coastguard Worker  *         -1 in case of error.
4276*6777b538SAndroid Build Coastguard Worker  */
4277*6777b538SAndroid Build Coastguard Worker static int
xmlTextReaderSchemaValidateInternal(xmlTextReaderPtr reader,const char * xsd,xmlSchemaValidCtxtPtr ctxt,int options ATTRIBUTE_UNUSED)4278*6777b538SAndroid Build Coastguard Worker xmlTextReaderSchemaValidateInternal(xmlTextReaderPtr reader,
4279*6777b538SAndroid Build Coastguard Worker 				    const char *xsd,
4280*6777b538SAndroid Build Coastguard Worker 				    xmlSchemaValidCtxtPtr ctxt,
4281*6777b538SAndroid Build Coastguard Worker 				    int options ATTRIBUTE_UNUSED)
4282*6777b538SAndroid Build Coastguard Worker {
4283*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
4284*6777b538SAndroid Build Coastguard Worker         return(-1);
4285*6777b538SAndroid Build Coastguard Worker 
4286*6777b538SAndroid Build Coastguard Worker     if ((xsd != NULL) && (ctxt != NULL))
4287*6777b538SAndroid Build Coastguard Worker 	return(-1);
4288*6777b538SAndroid Build Coastguard Worker 
4289*6777b538SAndroid Build Coastguard Worker     if (((xsd != NULL) || (ctxt != NULL)) &&
4290*6777b538SAndroid Build Coastguard Worker 	((reader->mode != XML_TEXTREADER_MODE_INITIAL) ||
4291*6777b538SAndroid Build Coastguard Worker         (reader->ctxt == NULL)))
4292*6777b538SAndroid Build Coastguard Worker 	return(-1);
4293*6777b538SAndroid Build Coastguard Worker 
4294*6777b538SAndroid Build Coastguard Worker     /* Cleanup previous validation stuff. */
4295*6777b538SAndroid Build Coastguard Worker     if (reader->xsdPlug != NULL) {
4296*6777b538SAndroid Build Coastguard Worker 	xmlSchemaSAXUnplug(reader->xsdPlug);
4297*6777b538SAndroid Build Coastguard Worker 	reader->xsdPlug = NULL;
4298*6777b538SAndroid Build Coastguard Worker     }
4299*6777b538SAndroid Build Coastguard Worker     if (reader->xsdValidCtxt != NULL) {
4300*6777b538SAndroid Build Coastguard Worker 	if (! reader->xsdPreserveCtxt)
4301*6777b538SAndroid Build Coastguard Worker 	    xmlSchemaFreeValidCtxt(reader->xsdValidCtxt);
4302*6777b538SAndroid Build Coastguard Worker 	reader->xsdValidCtxt = NULL;
4303*6777b538SAndroid Build Coastguard Worker     }
4304*6777b538SAndroid Build Coastguard Worker     reader->xsdPreserveCtxt = 0;
4305*6777b538SAndroid Build Coastguard Worker     if (reader->xsdSchemas != NULL) {
4306*6777b538SAndroid Build Coastguard Worker 	xmlSchemaFree(reader->xsdSchemas);
4307*6777b538SAndroid Build Coastguard Worker 	reader->xsdSchemas = NULL;
4308*6777b538SAndroid Build Coastguard Worker     }
4309*6777b538SAndroid Build Coastguard Worker 
4310*6777b538SAndroid Build Coastguard Worker     if ((xsd == NULL) && (ctxt == NULL)) {
4311*6777b538SAndroid Build Coastguard Worker 	/* We just want to deactivate the validation, so get out. */
4312*6777b538SAndroid Build Coastguard Worker 	return(0);
4313*6777b538SAndroid Build Coastguard Worker     }
4314*6777b538SAndroid Build Coastguard Worker 
4315*6777b538SAndroid Build Coastguard Worker     if (xsd != NULL) {
4316*6777b538SAndroid Build Coastguard Worker 	xmlSchemaParserCtxtPtr pctxt;
4317*6777b538SAndroid Build Coastguard Worker 	/* Parse the schema and create validation environment. */
4318*6777b538SAndroid Build Coastguard Worker 	pctxt = xmlSchemaNewParserCtxt(xsd);
4319*6777b538SAndroid Build Coastguard Worker 	if ((reader->errorFunc != NULL) || (reader->sErrorFunc != NULL))
4320*6777b538SAndroid Build Coastguard Worker 	    xmlSchemaSetParserStructuredErrors(pctxt,
4321*6777b538SAndroid Build Coastguard Worker                     xmlTextReaderStructuredRelay, reader);
4322*6777b538SAndroid Build Coastguard Worker 	reader->xsdSchemas = xmlSchemaParse(pctxt);
4323*6777b538SAndroid Build Coastguard Worker 	xmlSchemaFreeParserCtxt(pctxt);
4324*6777b538SAndroid Build Coastguard Worker 	if (reader->xsdSchemas == NULL)
4325*6777b538SAndroid Build Coastguard Worker 	    return(-1);
4326*6777b538SAndroid Build Coastguard Worker 	reader->xsdValidCtxt = xmlSchemaNewValidCtxt(reader->xsdSchemas);
4327*6777b538SAndroid Build Coastguard Worker 	if (reader->xsdValidCtxt == NULL) {
4328*6777b538SAndroid Build Coastguard Worker 	    xmlSchemaFree(reader->xsdSchemas);
4329*6777b538SAndroid Build Coastguard Worker 	    reader->xsdSchemas = NULL;
4330*6777b538SAndroid Build Coastguard Worker 	    return(-1);
4331*6777b538SAndroid Build Coastguard Worker 	}
4332*6777b538SAndroid Build Coastguard Worker 	reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt,
4333*6777b538SAndroid Build Coastguard Worker 	    &(reader->ctxt->sax),
4334*6777b538SAndroid Build Coastguard Worker 	    &(reader->ctxt->userData));
4335*6777b538SAndroid Build Coastguard Worker 	if (reader->xsdPlug == NULL) {
4336*6777b538SAndroid Build Coastguard Worker 	    xmlSchemaFree(reader->xsdSchemas);
4337*6777b538SAndroid Build Coastguard Worker 	    reader->xsdSchemas = NULL;
4338*6777b538SAndroid Build Coastguard Worker 	    xmlSchemaFreeValidCtxt(reader->xsdValidCtxt);
4339*6777b538SAndroid Build Coastguard Worker 	    reader->xsdValidCtxt = NULL;
4340*6777b538SAndroid Build Coastguard Worker 	    return(-1);
4341*6777b538SAndroid Build Coastguard Worker 	}
4342*6777b538SAndroid Build Coastguard Worker     } else {
4343*6777b538SAndroid Build Coastguard Worker 	/* Use the given validation context. */
4344*6777b538SAndroid Build Coastguard Worker 	reader->xsdValidCtxt = ctxt;
4345*6777b538SAndroid Build Coastguard Worker 	reader->xsdPreserveCtxt = 1;
4346*6777b538SAndroid Build Coastguard Worker 	reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt,
4347*6777b538SAndroid Build Coastguard Worker 	    &(reader->ctxt->sax),
4348*6777b538SAndroid Build Coastguard Worker 	    &(reader->ctxt->userData));
4349*6777b538SAndroid Build Coastguard Worker 	if (reader->xsdPlug == NULL) {
4350*6777b538SAndroid Build Coastguard Worker 	    reader->xsdValidCtxt = NULL;
4351*6777b538SAndroid Build Coastguard Worker 	    reader->xsdPreserveCtxt = 0;
4352*6777b538SAndroid Build Coastguard Worker 	    return(-1);
4353*6777b538SAndroid Build Coastguard Worker 	}
4354*6777b538SAndroid Build Coastguard Worker     }
4355*6777b538SAndroid Build Coastguard Worker     xmlSchemaValidateSetLocator(reader->xsdValidCtxt,
4356*6777b538SAndroid Build Coastguard Worker                                 xmlTextReaderLocator,
4357*6777b538SAndroid Build Coastguard Worker 				(void *) reader);
4358*6777b538SAndroid Build Coastguard Worker     /*
4359*6777b538SAndroid Build Coastguard Worker     * Redirect the validation context's error channels to use
4360*6777b538SAndroid Build Coastguard Worker     * the reader channels.
4361*6777b538SAndroid Build Coastguard Worker     * TODO: In case the user provides the validation context we
4362*6777b538SAndroid Build Coastguard Worker     *   could make this redirection optional.
4363*6777b538SAndroid Build Coastguard Worker     */
4364*6777b538SAndroid Build Coastguard Worker     if ((reader->errorFunc != NULL) || (reader->sErrorFunc != NULL))
4365*6777b538SAndroid Build Coastguard Worker 	xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
4366*6777b538SAndroid Build Coastguard Worker 			xmlTextReaderStructuredRelay, reader);
4367*6777b538SAndroid Build Coastguard Worker     reader->xsdValidErrors = 0;
4368*6777b538SAndroid Build Coastguard Worker     reader->validate = XML_TEXTREADER_VALIDATE_XSD;
4369*6777b538SAndroid Build Coastguard Worker     return(0);
4370*6777b538SAndroid Build Coastguard Worker }
4371*6777b538SAndroid Build Coastguard Worker 
4372*6777b538SAndroid Build Coastguard Worker /**
4373*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderSchemaValidateCtxt:
4374*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4375*6777b538SAndroid Build Coastguard Worker  * @ctxt: the XML Schema validation context or NULL
4376*6777b538SAndroid Build Coastguard Worker  * @options: options (not used yet)
4377*6777b538SAndroid Build Coastguard Worker  *
4378*6777b538SAndroid Build Coastguard Worker  * Use W3C XSD schema context to validate the document as it is processed.
4379*6777b538SAndroid Build Coastguard Worker  * Activation is only possible before the first Read().
4380*6777b538SAndroid Build Coastguard Worker  * If @ctxt is NULL, then XML Schema validation is deactivated.
4381*6777b538SAndroid Build Coastguard Worker  *
4382*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case the schemas validation could be (de)activated and
4383*6777b538SAndroid Build Coastguard Worker  *         -1 in case of error.
4384*6777b538SAndroid Build Coastguard Worker  */
4385*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader,xmlSchemaValidCtxtPtr ctxt,int options)4386*6777b538SAndroid Build Coastguard Worker xmlTextReaderSchemaValidateCtxt(xmlTextReaderPtr reader,
4387*6777b538SAndroid Build Coastguard Worker 				    xmlSchemaValidCtxtPtr ctxt,
4388*6777b538SAndroid Build Coastguard Worker 				    int options)
4389*6777b538SAndroid Build Coastguard Worker {
4390*6777b538SAndroid Build Coastguard Worker     return(xmlTextReaderSchemaValidateInternal(reader, NULL, ctxt, options));
4391*6777b538SAndroid Build Coastguard Worker }
4392*6777b538SAndroid Build Coastguard Worker 
4393*6777b538SAndroid Build Coastguard Worker /**
4394*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderSchemaValidate:
4395*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4396*6777b538SAndroid Build Coastguard Worker  * @xsd:  the path to a W3C XSD schema or NULL
4397*6777b538SAndroid Build Coastguard Worker  *
4398*6777b538SAndroid Build Coastguard Worker  * Use W3C XSD schema to validate the document as it is processed.
4399*6777b538SAndroid Build Coastguard Worker  * Activation is only possible before the first Read().
4400*6777b538SAndroid Build Coastguard Worker  * If @xsd is NULL, then XML Schema validation is deactivated.
4401*6777b538SAndroid Build Coastguard Worker  *
4402*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case the schemas validation could be (de)activated and
4403*6777b538SAndroid Build Coastguard Worker  *         -1 in case of error.
4404*6777b538SAndroid Build Coastguard Worker  */
4405*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderSchemaValidate(xmlTextReaderPtr reader,const char * xsd)4406*6777b538SAndroid Build Coastguard Worker xmlTextReaderSchemaValidate(xmlTextReaderPtr reader, const char *xsd)
4407*6777b538SAndroid Build Coastguard Worker {
4408*6777b538SAndroid Build Coastguard Worker     return(xmlTextReaderSchemaValidateInternal(reader, xsd, NULL, 0));
4409*6777b538SAndroid Build Coastguard Worker }
4410*6777b538SAndroid Build Coastguard Worker 
4411*6777b538SAndroid Build Coastguard Worker /**
4412*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderRelaxNGValidateCtxt:
4413*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4414*6777b538SAndroid Build Coastguard Worker  * @ctxt: the RelaxNG schema validation context or NULL
4415*6777b538SAndroid Build Coastguard Worker  * @options: options (not used yet)
4416*6777b538SAndroid Build Coastguard Worker  *
4417*6777b538SAndroid Build Coastguard Worker  * Use RelaxNG schema context to validate the document as it is processed.
4418*6777b538SAndroid Build Coastguard Worker  * Activation is only possible before the first Read().
4419*6777b538SAndroid Build Coastguard Worker  * If @ctxt is NULL, then RelaxNG schema validation is deactivated.
4420*6777b538SAndroid Build Coastguard Worker  *
4421*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case the schemas validation could be (de)activated and
4422*6777b538SAndroid Build Coastguard Worker  *         -1 in case of error.
4423*6777b538SAndroid Build Coastguard Worker  */
4424*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderRelaxNGValidateCtxt(xmlTextReaderPtr reader,xmlRelaxNGValidCtxtPtr ctxt,int options)4425*6777b538SAndroid Build Coastguard Worker xmlTextReaderRelaxNGValidateCtxt(xmlTextReaderPtr reader,
4426*6777b538SAndroid Build Coastguard Worker 				 xmlRelaxNGValidCtxtPtr ctxt,
4427*6777b538SAndroid Build Coastguard Worker 				 int options)
4428*6777b538SAndroid Build Coastguard Worker {
4429*6777b538SAndroid Build Coastguard Worker     return(xmlTextReaderRelaxNGValidateInternal(reader, NULL, ctxt, options));
4430*6777b538SAndroid Build Coastguard Worker }
4431*6777b538SAndroid Build Coastguard Worker 
4432*6777b538SAndroid Build Coastguard Worker /**
4433*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderRelaxNGValidate:
4434*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4435*6777b538SAndroid Build Coastguard Worker  * @rng:  the path to a RelaxNG schema or NULL
4436*6777b538SAndroid Build Coastguard Worker  *
4437*6777b538SAndroid Build Coastguard Worker  * Use RelaxNG schema to validate the document as it is processed.
4438*6777b538SAndroid Build Coastguard Worker  * Activation is only possible before the first Read().
4439*6777b538SAndroid Build Coastguard Worker  * If @rng is NULL, then RelaxNG schema validation is deactivated.
4440*6777b538SAndroid Build Coastguard Worker  *
4441*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case the schemas validation could be (de)activated and
4442*6777b538SAndroid Build Coastguard Worker  *         -1 in case of error.
4443*6777b538SAndroid Build Coastguard Worker  */
4444*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader,const char * rng)4445*6777b538SAndroid Build Coastguard Worker xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng)
4446*6777b538SAndroid Build Coastguard Worker {
4447*6777b538SAndroid Build Coastguard Worker     return(xmlTextReaderRelaxNGValidateInternal(reader, rng, NULL, 0));
4448*6777b538SAndroid Build Coastguard Worker }
4449*6777b538SAndroid Build Coastguard Worker 
4450*6777b538SAndroid Build Coastguard Worker #endif
4451*6777b538SAndroid Build Coastguard Worker 
4452*6777b538SAndroid Build Coastguard Worker /**
4453*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderIsNamespaceDecl:
4454*6777b538SAndroid Build Coastguard Worker  * @reader: the xmlTextReaderPtr used
4455*6777b538SAndroid Build Coastguard Worker  *
4456*6777b538SAndroid Build Coastguard Worker  * Determine whether the current node is a namespace declaration
4457*6777b538SAndroid Build Coastguard Worker  * rather than a regular attribute.
4458*6777b538SAndroid Build Coastguard Worker  *
4459*6777b538SAndroid Build Coastguard Worker  * Returns 1 if the current node is a namespace declaration, 0 if it
4460*6777b538SAndroid Build Coastguard Worker  * is a regular attribute or other type of node, or -1 in case of
4461*6777b538SAndroid Build Coastguard Worker  * error.
4462*6777b538SAndroid Build Coastguard Worker  */
4463*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader)4464*6777b538SAndroid Build Coastguard Worker xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader) {
4465*6777b538SAndroid Build Coastguard Worker     xmlNodePtr node;
4466*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
4467*6777b538SAndroid Build Coastguard Worker 	return(-1);
4468*6777b538SAndroid Build Coastguard Worker     if (reader->node == NULL)
4469*6777b538SAndroid Build Coastguard Worker 	return(-1);
4470*6777b538SAndroid Build Coastguard Worker     if (reader->curnode != NULL)
4471*6777b538SAndroid Build Coastguard Worker 	node = reader->curnode;
4472*6777b538SAndroid Build Coastguard Worker     else
4473*6777b538SAndroid Build Coastguard Worker 	node = reader->node;
4474*6777b538SAndroid Build Coastguard Worker 
4475*6777b538SAndroid Build Coastguard Worker     if (XML_NAMESPACE_DECL == node->type)
4476*6777b538SAndroid Build Coastguard Worker 	return(1);
4477*6777b538SAndroid Build Coastguard Worker     else
4478*6777b538SAndroid Build Coastguard Worker 	return(0);
4479*6777b538SAndroid Build Coastguard Worker }
4480*6777b538SAndroid Build Coastguard Worker 
4481*6777b538SAndroid Build Coastguard Worker /**
4482*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderConstXmlVersion:
4483*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4484*6777b538SAndroid Build Coastguard Worker  *
4485*6777b538SAndroid Build Coastguard Worker  * Determine the XML version of the document being read.
4486*6777b538SAndroid Build Coastguard Worker  *
4487*6777b538SAndroid Build Coastguard Worker  * Returns a string containing the XML version of the document or NULL
4488*6777b538SAndroid Build Coastguard Worker  * in case of error.  The string is deallocated with the reader.
4489*6777b538SAndroid Build Coastguard Worker  */
4490*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader)4491*6777b538SAndroid Build Coastguard Worker xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader) {
4492*6777b538SAndroid Build Coastguard Worker     xmlDocPtr doc = NULL;
4493*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
4494*6777b538SAndroid Build Coastguard Worker 	return(NULL);
4495*6777b538SAndroid Build Coastguard Worker     if (reader->doc != NULL)
4496*6777b538SAndroid Build Coastguard Worker         doc = reader->doc;
4497*6777b538SAndroid Build Coastguard Worker     else if (reader->ctxt != NULL)
4498*6777b538SAndroid Build Coastguard Worker 	doc = reader->ctxt->myDoc;
4499*6777b538SAndroid Build Coastguard Worker     if (doc == NULL)
4500*6777b538SAndroid Build Coastguard Worker 	return(NULL);
4501*6777b538SAndroid Build Coastguard Worker 
4502*6777b538SAndroid Build Coastguard Worker     if (doc->version == NULL)
4503*6777b538SAndroid Build Coastguard Worker 	return(NULL);
4504*6777b538SAndroid Build Coastguard Worker     else
4505*6777b538SAndroid Build Coastguard Worker       return(CONSTSTR(doc->version));
4506*6777b538SAndroid Build Coastguard Worker }
4507*6777b538SAndroid Build Coastguard Worker 
4508*6777b538SAndroid Build Coastguard Worker /**
4509*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderStandalone:
4510*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4511*6777b538SAndroid Build Coastguard Worker  *
4512*6777b538SAndroid Build Coastguard Worker  * Determine the standalone status of the document being read.
4513*6777b538SAndroid Build Coastguard Worker  *
4514*6777b538SAndroid Build Coastguard Worker  * Returns 1 if the document was declared to be standalone, 0 if it
4515*6777b538SAndroid Build Coastguard Worker  * was declared to be not standalone, or -1 if the document did not
4516*6777b538SAndroid Build Coastguard Worker  * specify its standalone status or in case of error.
4517*6777b538SAndroid Build Coastguard Worker  */
4518*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderStandalone(xmlTextReaderPtr reader)4519*6777b538SAndroid Build Coastguard Worker xmlTextReaderStandalone(xmlTextReaderPtr reader) {
4520*6777b538SAndroid Build Coastguard Worker     xmlDocPtr doc = NULL;
4521*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
4522*6777b538SAndroid Build Coastguard Worker 	return(-1);
4523*6777b538SAndroid Build Coastguard Worker     if (reader->doc != NULL)
4524*6777b538SAndroid Build Coastguard Worker         doc = reader->doc;
4525*6777b538SAndroid Build Coastguard Worker     else if (reader->ctxt != NULL)
4526*6777b538SAndroid Build Coastguard Worker 	doc = reader->ctxt->myDoc;
4527*6777b538SAndroid Build Coastguard Worker     if (doc == NULL)
4528*6777b538SAndroid Build Coastguard Worker 	return(-1);
4529*6777b538SAndroid Build Coastguard Worker 
4530*6777b538SAndroid Build Coastguard Worker     return(doc->standalone);
4531*6777b538SAndroid Build Coastguard Worker }
4532*6777b538SAndroid Build Coastguard Worker 
4533*6777b538SAndroid Build Coastguard Worker /************************************************************************
4534*6777b538SAndroid Build Coastguard Worker  *									*
4535*6777b538SAndroid Build Coastguard Worker  *			Error Handling Extensions                       *
4536*6777b538SAndroid Build Coastguard Worker  *									*
4537*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
4538*6777b538SAndroid Build Coastguard Worker 
4539*6777b538SAndroid Build Coastguard Worker /**
4540*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderLocatorLineNumber:
4541*6777b538SAndroid Build Coastguard Worker  * @locator: the xmlTextReaderLocatorPtr used
4542*6777b538SAndroid Build Coastguard Worker  *
4543*6777b538SAndroid Build Coastguard Worker  * Obtain the line number for the given locator.
4544*6777b538SAndroid Build Coastguard Worker  *
4545*6777b538SAndroid Build Coastguard Worker  * Returns the line number or -1 in case of error.
4546*6777b538SAndroid Build Coastguard Worker  */
4547*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator)4548*6777b538SAndroid Build Coastguard Worker xmlTextReaderLocatorLineNumber(xmlTextReaderLocatorPtr locator) {
4549*6777b538SAndroid Build Coastguard Worker     /* we know that locator is a xmlParserCtxtPtr */
4550*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator;
4551*6777b538SAndroid Build Coastguard Worker     int ret = -1;
4552*6777b538SAndroid Build Coastguard Worker 
4553*6777b538SAndroid Build Coastguard Worker     if (locator == NULL)
4554*6777b538SAndroid Build Coastguard Worker         return(-1);
4555*6777b538SAndroid Build Coastguard Worker     if (ctx->node != NULL) {
4556*6777b538SAndroid Build Coastguard Worker 	ret = xmlGetLineNo(ctx->node);
4557*6777b538SAndroid Build Coastguard Worker     }
4558*6777b538SAndroid Build Coastguard Worker     else {
4559*6777b538SAndroid Build Coastguard Worker 	/* inspired from error.c */
4560*6777b538SAndroid Build Coastguard Worker 	xmlParserInputPtr input;
4561*6777b538SAndroid Build Coastguard Worker 	input = ctx->input;
4562*6777b538SAndroid Build Coastguard Worker 	if ((input->filename == NULL) && (ctx->inputNr > 1))
4563*6777b538SAndroid Build Coastguard Worker 	    input = ctx->inputTab[ctx->inputNr - 2];
4564*6777b538SAndroid Build Coastguard Worker 	if (input != NULL) {
4565*6777b538SAndroid Build Coastguard Worker 	    ret = input->line;
4566*6777b538SAndroid Build Coastguard Worker 	}
4567*6777b538SAndroid Build Coastguard Worker 	else {
4568*6777b538SAndroid Build Coastguard Worker 	    ret = -1;
4569*6777b538SAndroid Build Coastguard Worker 	}
4570*6777b538SAndroid Build Coastguard Worker     }
4571*6777b538SAndroid Build Coastguard Worker 
4572*6777b538SAndroid Build Coastguard Worker     return ret;
4573*6777b538SAndroid Build Coastguard Worker }
4574*6777b538SAndroid Build Coastguard Worker 
4575*6777b538SAndroid Build Coastguard Worker /**
4576*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderLocatorBaseURI:
4577*6777b538SAndroid Build Coastguard Worker  * @locator: the xmlTextReaderLocatorPtr used
4578*6777b538SAndroid Build Coastguard Worker  *
4579*6777b538SAndroid Build Coastguard Worker  * Obtain the base URI for the given locator.
4580*6777b538SAndroid Build Coastguard Worker  *
4581*6777b538SAndroid Build Coastguard Worker  * Returns the base URI or NULL in case of error,
4582*6777b538SAndroid Build Coastguard Worker  *    if non NULL it need to be freed by the caller.
4583*6777b538SAndroid Build Coastguard Worker  */
4584*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlTextReaderLocatorBaseURI(xmlTextReaderLocatorPtr locator)4585*6777b538SAndroid Build Coastguard Worker xmlTextReaderLocatorBaseURI(xmlTextReaderLocatorPtr locator) {
4586*6777b538SAndroid Build Coastguard Worker     /* we know that locator is a xmlParserCtxtPtr */
4587*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator;
4588*6777b538SAndroid Build Coastguard Worker     xmlChar *ret = NULL;
4589*6777b538SAndroid Build Coastguard Worker 
4590*6777b538SAndroid Build Coastguard Worker     if (locator == NULL)
4591*6777b538SAndroid Build Coastguard Worker         return(NULL);
4592*6777b538SAndroid Build Coastguard Worker     if (ctx->node != NULL) {
4593*6777b538SAndroid Build Coastguard Worker 	ret = xmlNodeGetBase(NULL,ctx->node);
4594*6777b538SAndroid Build Coastguard Worker     }
4595*6777b538SAndroid Build Coastguard Worker     else {
4596*6777b538SAndroid Build Coastguard Worker 	/* inspired from error.c */
4597*6777b538SAndroid Build Coastguard Worker 	xmlParserInputPtr input;
4598*6777b538SAndroid Build Coastguard Worker 	input = ctx->input;
4599*6777b538SAndroid Build Coastguard Worker 	if ((input->filename == NULL) && (ctx->inputNr > 1))
4600*6777b538SAndroid Build Coastguard Worker 	    input = ctx->inputTab[ctx->inputNr - 2];
4601*6777b538SAndroid Build Coastguard Worker 	if (input != NULL) {
4602*6777b538SAndroid Build Coastguard Worker 	    ret = xmlStrdup(BAD_CAST input->filename);
4603*6777b538SAndroid Build Coastguard Worker 	}
4604*6777b538SAndroid Build Coastguard Worker 	else {
4605*6777b538SAndroid Build Coastguard Worker 	    ret = NULL;
4606*6777b538SAndroid Build Coastguard Worker 	}
4607*6777b538SAndroid Build Coastguard Worker     }
4608*6777b538SAndroid Build Coastguard Worker 
4609*6777b538SAndroid Build Coastguard Worker     return ret;
4610*6777b538SAndroid Build Coastguard Worker }
4611*6777b538SAndroid Build Coastguard Worker 
4612*6777b538SAndroid Build Coastguard Worker /**
4613*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderSetErrorHandler:
4614*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4615*6777b538SAndroid Build Coastguard Worker  * @f:	the callback function to call on error and warnings
4616*6777b538SAndroid Build Coastguard Worker  * @arg:    a user argument to pass to the callback function
4617*6777b538SAndroid Build Coastguard Worker  *
4618*6777b538SAndroid Build Coastguard Worker  * DEPRECATED: Use xmlTextReaderSetStructuredErrorHandler.
4619*6777b538SAndroid Build Coastguard Worker  *
4620*6777b538SAndroid Build Coastguard Worker  * Register a callback function that will be called on error and warnings.
4621*6777b538SAndroid Build Coastguard Worker  *
4622*6777b538SAndroid Build Coastguard Worker  * If @f is NULL, the default error and warning handlers are restored.
4623*6777b538SAndroid Build Coastguard Worker  */
4624*6777b538SAndroid Build Coastguard Worker void
xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader,xmlTextReaderErrorFunc f,void * arg)4625*6777b538SAndroid Build Coastguard Worker xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader,
4626*6777b538SAndroid Build Coastguard Worker                              xmlTextReaderErrorFunc f, void *arg)
4627*6777b538SAndroid Build Coastguard Worker {
4628*6777b538SAndroid Build Coastguard Worker     if (f != NULL) {
4629*6777b538SAndroid Build Coastguard Worker         reader->errorFunc = f;
4630*6777b538SAndroid Build Coastguard Worker         reader->sErrorFunc = NULL;
4631*6777b538SAndroid Build Coastguard Worker         reader->errorFuncArg = arg;
4632*6777b538SAndroid Build Coastguard Worker         xmlCtxtSetErrorHandler(reader->ctxt,
4633*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderStructuredRelay, reader);
4634*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
4635*6777b538SAndroid Build Coastguard Worker         if (reader->rngValidCtxt) {
4636*6777b538SAndroid Build Coastguard Worker             xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
4637*6777b538SAndroid Build Coastguard Worker                     xmlTextReaderStructuredRelay, reader);
4638*6777b538SAndroid Build Coastguard Worker         }
4639*6777b538SAndroid Build Coastguard Worker         if (reader->xsdValidCtxt) {
4640*6777b538SAndroid Build Coastguard Worker             xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
4641*6777b538SAndroid Build Coastguard Worker                     xmlTextReaderStructuredRelay, reader);
4642*6777b538SAndroid Build Coastguard Worker         }
4643*6777b538SAndroid Build Coastguard Worker #endif
4644*6777b538SAndroid Build Coastguard Worker     } else {
4645*6777b538SAndroid Build Coastguard Worker         /* restore defaults */
4646*6777b538SAndroid Build Coastguard Worker         reader->errorFunc = NULL;
4647*6777b538SAndroid Build Coastguard Worker         reader->sErrorFunc = NULL;
4648*6777b538SAndroid Build Coastguard Worker         reader->errorFuncArg = NULL;
4649*6777b538SAndroid Build Coastguard Worker         xmlCtxtSetErrorHandler(reader->ctxt, NULL, NULL);
4650*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
4651*6777b538SAndroid Build Coastguard Worker         if (reader->rngValidCtxt) {
4652*6777b538SAndroid Build Coastguard Worker             xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL,
4653*6777b538SAndroid Build Coastguard Worker                                                NULL);
4654*6777b538SAndroid Build Coastguard Worker         }
4655*6777b538SAndroid Build Coastguard Worker         if (reader->xsdValidCtxt) {
4656*6777b538SAndroid Build Coastguard Worker             xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL,
4657*6777b538SAndroid Build Coastguard Worker                                               NULL);
4658*6777b538SAndroid Build Coastguard Worker         }
4659*6777b538SAndroid Build Coastguard Worker #endif
4660*6777b538SAndroid Build Coastguard Worker     }
4661*6777b538SAndroid Build Coastguard Worker }
4662*6777b538SAndroid Build Coastguard Worker 
4663*6777b538SAndroid Build Coastguard Worker /**
4664*6777b538SAndroid Build Coastguard Worker * xmlTextReaderSetStructuredErrorHandler:
4665*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4666*6777b538SAndroid Build Coastguard Worker  * @f:	the callback function to call on error and warnings
4667*6777b538SAndroid Build Coastguard Worker  * @arg:    a user argument to pass to the callback function
4668*6777b538SAndroid Build Coastguard Worker  *
4669*6777b538SAndroid Build Coastguard Worker  * Register a callback function that will be called on error and warnings.
4670*6777b538SAndroid Build Coastguard Worker  *
4671*6777b538SAndroid Build Coastguard Worker  * If @f is NULL, the default error and warning handlers are restored.
4672*6777b538SAndroid Build Coastguard Worker  */
4673*6777b538SAndroid Build Coastguard Worker void
xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader,xmlStructuredErrorFunc f,void * arg)4674*6777b538SAndroid Build Coastguard Worker xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader,
4675*6777b538SAndroid Build Coastguard Worker                                        xmlStructuredErrorFunc f, void *arg)
4676*6777b538SAndroid Build Coastguard Worker {
4677*6777b538SAndroid Build Coastguard Worker     if (f != NULL) {
4678*6777b538SAndroid Build Coastguard Worker         reader->sErrorFunc = f;
4679*6777b538SAndroid Build Coastguard Worker         reader->errorFunc = NULL;
4680*6777b538SAndroid Build Coastguard Worker         reader->errorFuncArg = arg;
4681*6777b538SAndroid Build Coastguard Worker         xmlCtxtSetErrorHandler(reader->ctxt,
4682*6777b538SAndroid Build Coastguard Worker                 xmlTextReaderStructuredRelay, reader);
4683*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
4684*6777b538SAndroid Build Coastguard Worker         if (reader->rngValidCtxt) {
4685*6777b538SAndroid Build Coastguard Worker             xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
4686*6777b538SAndroid Build Coastguard Worker                     xmlTextReaderStructuredRelay, reader);
4687*6777b538SAndroid Build Coastguard Worker         }
4688*6777b538SAndroid Build Coastguard Worker         if (reader->xsdValidCtxt) {
4689*6777b538SAndroid Build Coastguard Worker             xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
4690*6777b538SAndroid Build Coastguard Worker                     xmlTextReaderStructuredRelay, reader);
4691*6777b538SAndroid Build Coastguard Worker         }
4692*6777b538SAndroid Build Coastguard Worker #endif
4693*6777b538SAndroid Build Coastguard Worker     } else {
4694*6777b538SAndroid Build Coastguard Worker         /* restore defaults */
4695*6777b538SAndroid Build Coastguard Worker         reader->errorFunc = NULL;
4696*6777b538SAndroid Build Coastguard Worker         reader->sErrorFunc = NULL;
4697*6777b538SAndroid Build Coastguard Worker         reader->errorFuncArg = NULL;
4698*6777b538SAndroid Build Coastguard Worker         xmlCtxtSetErrorHandler(reader->ctxt, NULL, NULL);
4699*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
4700*6777b538SAndroid Build Coastguard Worker         if (reader->rngValidCtxt) {
4701*6777b538SAndroid Build Coastguard Worker             xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL,
4702*6777b538SAndroid Build Coastguard Worker                                                NULL);
4703*6777b538SAndroid Build Coastguard Worker         }
4704*6777b538SAndroid Build Coastguard Worker         if (reader->xsdValidCtxt) {
4705*6777b538SAndroid Build Coastguard Worker             xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL,
4706*6777b538SAndroid Build Coastguard Worker                                               NULL);
4707*6777b538SAndroid Build Coastguard Worker         }
4708*6777b538SAndroid Build Coastguard Worker #endif
4709*6777b538SAndroid Build Coastguard Worker     }
4710*6777b538SAndroid Build Coastguard Worker }
4711*6777b538SAndroid Build Coastguard Worker 
4712*6777b538SAndroid Build Coastguard Worker /**
4713*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderIsValid:
4714*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4715*6777b538SAndroid Build Coastguard Worker  *
4716*6777b538SAndroid Build Coastguard Worker  * Retrieve the validity status from the parser context
4717*6777b538SAndroid Build Coastguard Worker  *
4718*6777b538SAndroid Build Coastguard Worker  * Returns the flag value 1 if valid, 0 if no, and -1 in case of error
4719*6777b538SAndroid Build Coastguard Worker  */
4720*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderIsValid(xmlTextReaderPtr reader)4721*6777b538SAndroid Build Coastguard Worker xmlTextReaderIsValid(xmlTextReaderPtr reader)
4722*6777b538SAndroid Build Coastguard Worker {
4723*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
4724*6777b538SAndroid Build Coastguard Worker         return (-1);
4725*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SCHEMAS_ENABLED
4726*6777b538SAndroid Build Coastguard Worker     if (reader->validate == XML_TEXTREADER_VALIDATE_RNG)
4727*6777b538SAndroid Build Coastguard Worker         return (reader->rngValidErrors == 0);
4728*6777b538SAndroid Build Coastguard Worker     if (reader->validate == XML_TEXTREADER_VALIDATE_XSD)
4729*6777b538SAndroid Build Coastguard Worker         return (reader->xsdValidErrors == 0);
4730*6777b538SAndroid Build Coastguard Worker #endif
4731*6777b538SAndroid Build Coastguard Worker     if ((reader->ctxt != NULL) && (reader->ctxt->validate == 1))
4732*6777b538SAndroid Build Coastguard Worker         return (reader->ctxt->valid);
4733*6777b538SAndroid Build Coastguard Worker     return (0);
4734*6777b538SAndroid Build Coastguard Worker }
4735*6777b538SAndroid Build Coastguard Worker 
4736*6777b538SAndroid Build Coastguard Worker /**
4737*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderGetErrorHandler:
4738*6777b538SAndroid Build Coastguard Worker  * @reader:  the xmlTextReaderPtr used
4739*6777b538SAndroid Build Coastguard Worker  * @f:	the callback function or NULL is no callback has been registered
4740*6777b538SAndroid Build Coastguard Worker  * @arg:    a user argument
4741*6777b538SAndroid Build Coastguard Worker  *
4742*6777b538SAndroid Build Coastguard Worker  * Retrieve the error callback function and user argument.
4743*6777b538SAndroid Build Coastguard Worker  */
4744*6777b538SAndroid Build Coastguard Worker void
xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader,xmlTextReaderErrorFunc * f,void ** arg)4745*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader,
4746*6777b538SAndroid Build Coastguard Worker                              xmlTextReaderErrorFunc * f, void **arg)
4747*6777b538SAndroid Build Coastguard Worker {
4748*6777b538SAndroid Build Coastguard Worker     if (f != NULL)
4749*6777b538SAndroid Build Coastguard Worker         *f = reader->errorFunc;
4750*6777b538SAndroid Build Coastguard Worker     if (arg != NULL)
4751*6777b538SAndroid Build Coastguard Worker         *arg = reader->errorFuncArg;
4752*6777b538SAndroid Build Coastguard Worker }
4753*6777b538SAndroid Build Coastguard Worker /************************************************************************
4754*6777b538SAndroid Build Coastguard Worker  *									*
4755*6777b538SAndroid Build Coastguard Worker  *	New set (2.6.0) of simpler and more flexible APIs		*
4756*6777b538SAndroid Build Coastguard Worker  *									*
4757*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
4758*6777b538SAndroid Build Coastguard Worker 
4759*6777b538SAndroid Build Coastguard Worker /**
4760*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderSetup:
4761*6777b538SAndroid Build Coastguard Worker  * @reader:  an XML reader
4762*6777b538SAndroid Build Coastguard Worker  * @input: xmlParserInputBufferPtr used to feed the reader, will
4763*6777b538SAndroid Build Coastguard Worker  *         be destroyed with it.
4764*6777b538SAndroid Build Coastguard Worker  * @URL:  the base URL to use for the document
4765*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
4766*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
4767*6777b538SAndroid Build Coastguard Worker  *
4768*6777b538SAndroid Build Coastguard Worker  * Setup an XML reader with new options
4769*6777b538SAndroid Build Coastguard Worker  *
4770*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case of success and -1 in case of error.
4771*6777b538SAndroid Build Coastguard Worker  */
4772*6777b538SAndroid Build Coastguard Worker int
xmlTextReaderSetup(xmlTextReaderPtr reader,xmlParserInputBufferPtr input,const char * URL,const char * encoding,int options)4773*6777b538SAndroid Build Coastguard Worker xmlTextReaderSetup(xmlTextReaderPtr reader,
4774*6777b538SAndroid Build Coastguard Worker                    xmlParserInputBufferPtr input, const char *URL,
4775*6777b538SAndroid Build Coastguard Worker                    const char *encoding, int options)
4776*6777b538SAndroid Build Coastguard Worker {
4777*6777b538SAndroid Build Coastguard Worker     if (reader == NULL) {
4778*6777b538SAndroid Build Coastguard Worker         if (input != NULL)
4779*6777b538SAndroid Build Coastguard Worker 	    xmlFreeParserInputBuffer(input);
4780*6777b538SAndroid Build Coastguard Worker         return (-1);
4781*6777b538SAndroid Build Coastguard Worker     }
4782*6777b538SAndroid Build Coastguard Worker 
4783*6777b538SAndroid Build Coastguard Worker     /*
4784*6777b538SAndroid Build Coastguard Worker      * we force the generation of compact text nodes on the reader
4785*6777b538SAndroid Build Coastguard Worker      * since usr applications should never modify the tree
4786*6777b538SAndroid Build Coastguard Worker      */
4787*6777b538SAndroid Build Coastguard Worker     options |= XML_PARSE_COMPACT;
4788*6777b538SAndroid Build Coastguard Worker 
4789*6777b538SAndroid Build Coastguard Worker     reader->doc = NULL;
4790*6777b538SAndroid Build Coastguard Worker     reader->entNr = 0;
4791*6777b538SAndroid Build Coastguard Worker     reader->parserFlags = options;
4792*6777b538SAndroid Build Coastguard Worker     reader->validate = XML_TEXTREADER_NOT_VALIDATE;
4793*6777b538SAndroid Build Coastguard Worker     if ((input != NULL) && (reader->input != NULL) &&
4794*6777b538SAndroid Build Coastguard Worker         (reader->allocs & XML_TEXTREADER_INPUT)) {
4795*6777b538SAndroid Build Coastguard Worker 	xmlFreeParserInputBuffer(reader->input);
4796*6777b538SAndroid Build Coastguard Worker 	reader->input = NULL;
4797*6777b538SAndroid Build Coastguard Worker 	reader->allocs -= XML_TEXTREADER_INPUT;
4798*6777b538SAndroid Build Coastguard Worker     }
4799*6777b538SAndroid Build Coastguard Worker     if (input != NULL) {
4800*6777b538SAndroid Build Coastguard Worker 	reader->input = input;
4801*6777b538SAndroid Build Coastguard Worker 	reader->allocs |= XML_TEXTREADER_INPUT;
4802*6777b538SAndroid Build Coastguard Worker     }
4803*6777b538SAndroid Build Coastguard Worker     if (reader->buffer == NULL)
4804*6777b538SAndroid Build Coastguard Worker         reader->buffer = xmlBufCreateSize(100);
4805*6777b538SAndroid Build Coastguard Worker     if (reader->buffer == NULL) {
4806*6777b538SAndroid Build Coastguard Worker         return (-1);
4807*6777b538SAndroid Build Coastguard Worker     }
4808*6777b538SAndroid Build Coastguard Worker     /* no operation on a reader should require a huge buffer */
4809*6777b538SAndroid Build Coastguard Worker     xmlBufSetAllocationScheme(reader->buffer,
4810*6777b538SAndroid Build Coastguard Worker 			      XML_BUFFER_ALLOC_DOUBLEIT);
4811*6777b538SAndroid Build Coastguard Worker     if (reader->sax == NULL)
4812*6777b538SAndroid Build Coastguard Worker 	reader->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler));
4813*6777b538SAndroid Build Coastguard Worker     if (reader->sax == NULL) {
4814*6777b538SAndroid Build Coastguard Worker         return (-1);
4815*6777b538SAndroid Build Coastguard Worker     }
4816*6777b538SAndroid Build Coastguard Worker     xmlSAXVersion(reader->sax, 2);
4817*6777b538SAndroid Build Coastguard Worker     reader->startElement = reader->sax->startElement;
4818*6777b538SAndroid Build Coastguard Worker     reader->sax->startElement = xmlTextReaderStartElement;
4819*6777b538SAndroid Build Coastguard Worker     reader->endElement = reader->sax->endElement;
4820*6777b538SAndroid Build Coastguard Worker     reader->sax->endElement = xmlTextReaderEndElement;
4821*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
4822*6777b538SAndroid Build Coastguard Worker     if (reader->sax->initialized == XML_SAX2_MAGIC) {
4823*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
4824*6777b538SAndroid Build Coastguard Worker         reader->startElementNs = reader->sax->startElementNs;
4825*6777b538SAndroid Build Coastguard Worker         reader->sax->startElementNs = xmlTextReaderStartElementNs;
4826*6777b538SAndroid Build Coastguard Worker         reader->endElementNs = reader->sax->endElementNs;
4827*6777b538SAndroid Build Coastguard Worker         reader->sax->endElementNs = xmlTextReaderEndElementNs;
4828*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
4829*6777b538SAndroid Build Coastguard Worker     } else {
4830*6777b538SAndroid Build Coastguard Worker         reader->startElementNs = NULL;
4831*6777b538SAndroid Build Coastguard Worker         reader->endElementNs = NULL;
4832*6777b538SAndroid Build Coastguard Worker     }
4833*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
4834*6777b538SAndroid Build Coastguard Worker     reader->characters = reader->sax->characters;
4835*6777b538SAndroid Build Coastguard Worker     reader->sax->characters = xmlTextReaderCharacters;
4836*6777b538SAndroid Build Coastguard Worker     reader->sax->ignorableWhitespace = xmlTextReaderCharacters;
4837*6777b538SAndroid Build Coastguard Worker     reader->cdataBlock = reader->sax->cdataBlock;
4838*6777b538SAndroid Build Coastguard Worker     reader->sax->cdataBlock = xmlTextReaderCDataBlock;
4839*6777b538SAndroid Build Coastguard Worker 
4840*6777b538SAndroid Build Coastguard Worker     reader->mode = XML_TEXTREADER_MODE_INITIAL;
4841*6777b538SAndroid Build Coastguard Worker     reader->node = NULL;
4842*6777b538SAndroid Build Coastguard Worker     reader->curnode = NULL;
4843*6777b538SAndroid Build Coastguard Worker     if (input != NULL) {
4844*6777b538SAndroid Build Coastguard Worker         if (xmlBufUse(reader->input->buffer) < 4) {
4845*6777b538SAndroid Build Coastguard Worker             xmlParserInputBufferRead(input, 4);
4846*6777b538SAndroid Build Coastguard Worker         }
4847*6777b538SAndroid Build Coastguard Worker         if (reader->ctxt == NULL) {
4848*6777b538SAndroid Build Coastguard Worker             if (xmlBufUse(reader->input->buffer) >= 4) {
4849*6777b538SAndroid Build Coastguard Worker                 reader->ctxt = xmlCreatePushParserCtxt(reader->sax, NULL,
4850*6777b538SAndroid Build Coastguard Worker 		       (const char *) xmlBufContent(reader->input->buffer),
4851*6777b538SAndroid Build Coastguard Worker                                       4, URL);
4852*6777b538SAndroid Build Coastguard Worker                 reader->base = 0;
4853*6777b538SAndroid Build Coastguard Worker                 reader->cur = 4;
4854*6777b538SAndroid Build Coastguard Worker             } else {
4855*6777b538SAndroid Build Coastguard Worker                 reader->ctxt =
4856*6777b538SAndroid Build Coastguard Worker                     xmlCreatePushParserCtxt(reader->sax, NULL, NULL, 0, URL);
4857*6777b538SAndroid Build Coastguard Worker                 reader->base = 0;
4858*6777b538SAndroid Build Coastguard Worker                 reader->cur = 0;
4859*6777b538SAndroid Build Coastguard Worker             }
4860*6777b538SAndroid Build Coastguard Worker             if (reader->ctxt == NULL) {
4861*6777b538SAndroid Build Coastguard Worker                 return (-1);
4862*6777b538SAndroid Build Coastguard Worker             }
4863*6777b538SAndroid Build Coastguard Worker         } else {
4864*6777b538SAndroid Build Coastguard Worker 	    xmlParserInputPtr inputStream;
4865*6777b538SAndroid Build Coastguard Worker 	    xmlParserInputBufferPtr buf;
4866*6777b538SAndroid Build Coastguard Worker 
4867*6777b538SAndroid Build Coastguard Worker 	    xmlCtxtReset(reader->ctxt);
4868*6777b538SAndroid Build Coastguard Worker 	    buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
4869*6777b538SAndroid Build Coastguard Worker 	    if (buf == NULL) return(-1);
4870*6777b538SAndroid Build Coastguard Worker 	    inputStream = xmlNewInputStream(reader->ctxt);
4871*6777b538SAndroid Build Coastguard Worker 	    if (inputStream == NULL) {
4872*6777b538SAndroid Build Coastguard Worker 		xmlFreeParserInputBuffer(buf);
4873*6777b538SAndroid Build Coastguard Worker 		return(-1);
4874*6777b538SAndroid Build Coastguard Worker 	    }
4875*6777b538SAndroid Build Coastguard Worker 
4876*6777b538SAndroid Build Coastguard Worker 	    if (URL == NULL)
4877*6777b538SAndroid Build Coastguard Worker 		inputStream->filename = NULL;
4878*6777b538SAndroid Build Coastguard Worker 	    else
4879*6777b538SAndroid Build Coastguard Worker 		inputStream->filename = (char *)
4880*6777b538SAndroid Build Coastguard Worker 		    xmlCanonicPath((const xmlChar *) URL);
4881*6777b538SAndroid Build Coastguard Worker 	    inputStream->buf = buf;
4882*6777b538SAndroid Build Coastguard Worker             xmlBufResetInput(buf->buffer, inputStream);
4883*6777b538SAndroid Build Coastguard Worker 
4884*6777b538SAndroid Build Coastguard Worker 	    inputPush(reader->ctxt, inputStream);
4885*6777b538SAndroid Build Coastguard Worker 	    reader->cur = 0;
4886*6777b538SAndroid Build Coastguard Worker 	}
4887*6777b538SAndroid Build Coastguard Worker     }
4888*6777b538SAndroid Build Coastguard Worker     if (reader->dict != NULL) {
4889*6777b538SAndroid Build Coastguard Worker         if (reader->ctxt->dict != NULL) {
4890*6777b538SAndroid Build Coastguard Worker 	    if (reader->dict != reader->ctxt->dict) {
4891*6777b538SAndroid Build Coastguard Worker 		xmlDictFree(reader->dict);
4892*6777b538SAndroid Build Coastguard Worker 		reader->dict = reader->ctxt->dict;
4893*6777b538SAndroid Build Coastguard Worker 	    }
4894*6777b538SAndroid Build Coastguard Worker 	} else {
4895*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->dict = reader->dict;
4896*6777b538SAndroid Build Coastguard Worker 	}
4897*6777b538SAndroid Build Coastguard Worker     } else {
4898*6777b538SAndroid Build Coastguard Worker 	if (reader->ctxt->dict == NULL)
4899*6777b538SAndroid Build Coastguard Worker 	    reader->ctxt->dict = xmlDictCreate();
4900*6777b538SAndroid Build Coastguard Worker         reader->dict = reader->ctxt->dict;
4901*6777b538SAndroid Build Coastguard Worker     }
4902*6777b538SAndroid Build Coastguard Worker     reader->ctxt->_private = reader;
4903*6777b538SAndroid Build Coastguard Worker     reader->ctxt->linenumbers = 1;
4904*6777b538SAndroid Build Coastguard Worker     reader->ctxt->dictNames = 1;
4905*6777b538SAndroid Build Coastguard Worker     /*
4906*6777b538SAndroid Build Coastguard Worker      * use the parser dictionary to allocate all elements and attributes names
4907*6777b538SAndroid Build Coastguard Worker      */
4908*6777b538SAndroid Build Coastguard Worker     reader->ctxt->parseMode = XML_PARSE_READER;
4909*6777b538SAndroid Build Coastguard Worker 
4910*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_XINCLUDE_ENABLED
4911*6777b538SAndroid Build Coastguard Worker     if (reader->xincctxt != NULL) {
4912*6777b538SAndroid Build Coastguard Worker 	xmlXIncludeFreeContext(reader->xincctxt);
4913*6777b538SAndroid Build Coastguard Worker 	reader->xincctxt = NULL;
4914*6777b538SAndroid Build Coastguard Worker     }
4915*6777b538SAndroid Build Coastguard Worker     if (options & XML_PARSE_XINCLUDE) {
4916*6777b538SAndroid Build Coastguard Worker         reader->xinclude = 1;
4917*6777b538SAndroid Build Coastguard Worker 	reader->xinclude_name = xmlDictLookup(reader->dict, XINCLUDE_NODE, -1);
4918*6777b538SAndroid Build Coastguard Worker 	options -= XML_PARSE_XINCLUDE;
4919*6777b538SAndroid Build Coastguard Worker     } else
4920*6777b538SAndroid Build Coastguard Worker         reader->xinclude = 0;
4921*6777b538SAndroid Build Coastguard Worker     reader->in_xinclude = 0;
4922*6777b538SAndroid Build Coastguard Worker #endif
4923*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_PATTERN_ENABLED
4924*6777b538SAndroid Build Coastguard Worker     if (reader->patternTab == NULL) {
4925*6777b538SAndroid Build Coastguard Worker         reader->patternNr = 0;
4926*6777b538SAndroid Build Coastguard Worker 	reader->patternMax = 0;
4927*6777b538SAndroid Build Coastguard Worker     }
4928*6777b538SAndroid Build Coastguard Worker     while (reader->patternNr > 0) {
4929*6777b538SAndroid Build Coastguard Worker         reader->patternNr--;
4930*6777b538SAndroid Build Coastguard Worker 	if (reader->patternTab[reader->patternNr] != NULL) {
4931*6777b538SAndroid Build Coastguard Worker 	    xmlFreePattern(reader->patternTab[reader->patternNr]);
4932*6777b538SAndroid Build Coastguard Worker             reader->patternTab[reader->patternNr] = NULL;
4933*6777b538SAndroid Build Coastguard Worker 	}
4934*6777b538SAndroid Build Coastguard Worker     }
4935*6777b538SAndroid Build Coastguard Worker #endif
4936*6777b538SAndroid Build Coastguard Worker 
4937*6777b538SAndroid Build Coastguard Worker     if (options & XML_PARSE_DTDVALID)
4938*6777b538SAndroid Build Coastguard Worker         reader->validate = XML_TEXTREADER_VALIDATE_DTD;
4939*6777b538SAndroid Build Coastguard Worker 
4940*6777b538SAndroid Build Coastguard Worker     xmlCtxtUseOptions(reader->ctxt, options);
4941*6777b538SAndroid Build Coastguard Worker     if (encoding != NULL)
4942*6777b538SAndroid Build Coastguard Worker         xmlSwitchEncodingName(reader->ctxt, encoding);
4943*6777b538SAndroid Build Coastguard Worker     if ((URL != NULL) && (reader->ctxt->input != NULL) &&
4944*6777b538SAndroid Build Coastguard Worker         (reader->ctxt->input->filename == NULL))
4945*6777b538SAndroid Build Coastguard Worker         reader->ctxt->input->filename = (char *)
4946*6777b538SAndroid Build Coastguard Worker             xmlStrdup((const xmlChar *) URL);
4947*6777b538SAndroid Build Coastguard Worker 
4948*6777b538SAndroid Build Coastguard Worker     reader->doc = NULL;
4949*6777b538SAndroid Build Coastguard Worker 
4950*6777b538SAndroid Build Coastguard Worker     return (0);
4951*6777b538SAndroid Build Coastguard Worker }
4952*6777b538SAndroid Build Coastguard Worker 
4953*6777b538SAndroid Build Coastguard Worker /**
4954*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderSetMaxAmplification:
4955*6777b538SAndroid Build Coastguard Worker  * @reader: an XML reader
4956*6777b538SAndroid Build Coastguard Worker  * @maxAmpl:  maximum amplification factor
4957*6777b538SAndroid Build Coastguard Worker  *
4958*6777b538SAndroid Build Coastguard Worker  * Set the maximum amplification factor. See xmlCtxtSetMaxAmplification.
4959*6777b538SAndroid Build Coastguard Worker  */
4960*6777b538SAndroid Build Coastguard Worker void
xmlTextReaderSetMaxAmplification(xmlTextReaderPtr reader,unsigned maxAmpl)4961*6777b538SAndroid Build Coastguard Worker xmlTextReaderSetMaxAmplification(xmlTextReaderPtr reader, unsigned maxAmpl)
4962*6777b538SAndroid Build Coastguard Worker {
4963*6777b538SAndroid Build Coastguard Worker     xmlCtxtSetMaxAmplification(reader->ctxt, maxAmpl);
4964*6777b538SAndroid Build Coastguard Worker }
4965*6777b538SAndroid Build Coastguard Worker 
4966*6777b538SAndroid Build Coastguard Worker const xmlError *
xmlTextReaderGetLastError(xmlTextReaderPtr reader)4967*6777b538SAndroid Build Coastguard Worker xmlTextReaderGetLastError(xmlTextReaderPtr reader)
4968*6777b538SAndroid Build Coastguard Worker {
4969*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
4970*6777b538SAndroid Build Coastguard Worker         return(NULL);
4971*6777b538SAndroid Build Coastguard Worker     return(&reader->ctxt->lastError);
4972*6777b538SAndroid Build Coastguard Worker }
4973*6777b538SAndroid Build Coastguard Worker 
4974*6777b538SAndroid Build Coastguard Worker /**
4975*6777b538SAndroid Build Coastguard Worker  * xmlTextReaderByteConsumed:
4976*6777b538SAndroid Build Coastguard Worker  * @reader: an XML reader
4977*6777b538SAndroid Build Coastguard Worker  *
4978*6777b538SAndroid Build Coastguard Worker  * This function provides the current index of the parser used
4979*6777b538SAndroid Build Coastguard Worker  * by the reader, relative to the start of the current entity.
4980*6777b538SAndroid Build Coastguard Worker  * This function actually just wraps a call to xmlBytesConsumed()
4981*6777b538SAndroid Build Coastguard Worker  * for the parser context associated with the reader.
4982*6777b538SAndroid Build Coastguard Worker  * See xmlBytesConsumed() for more information.
4983*6777b538SAndroid Build Coastguard Worker  *
4984*6777b538SAndroid Build Coastguard Worker  * Returns the index in bytes from the beginning of the entity or -1
4985*6777b538SAndroid Build Coastguard Worker  *         in case the index could not be computed.
4986*6777b538SAndroid Build Coastguard Worker  */
4987*6777b538SAndroid Build Coastguard Worker long
xmlTextReaderByteConsumed(xmlTextReaderPtr reader)4988*6777b538SAndroid Build Coastguard Worker xmlTextReaderByteConsumed(xmlTextReaderPtr reader) {
4989*6777b538SAndroid Build Coastguard Worker     if ((reader == NULL) || (reader->ctxt == NULL))
4990*6777b538SAndroid Build Coastguard Worker         return(-1);
4991*6777b538SAndroid Build Coastguard Worker     return(xmlByteConsumed(reader->ctxt));
4992*6777b538SAndroid Build Coastguard Worker }
4993*6777b538SAndroid Build Coastguard Worker 
4994*6777b538SAndroid Build Coastguard Worker 
4995*6777b538SAndroid Build Coastguard Worker /**
4996*6777b538SAndroid Build Coastguard Worker  * xmlReaderWalker:
4997*6777b538SAndroid Build Coastguard Worker  * @doc:  a preparsed document
4998*6777b538SAndroid Build Coastguard Worker  *
4999*6777b538SAndroid Build Coastguard Worker  * Create an xmltextReader for a preparsed document.
5000*6777b538SAndroid Build Coastguard Worker  *
5001*6777b538SAndroid Build Coastguard Worker  * Returns the new reader or NULL in case of error.
5002*6777b538SAndroid Build Coastguard Worker  */
5003*6777b538SAndroid Build Coastguard Worker xmlTextReaderPtr
xmlReaderWalker(xmlDocPtr doc)5004*6777b538SAndroid Build Coastguard Worker xmlReaderWalker(xmlDocPtr doc)
5005*6777b538SAndroid Build Coastguard Worker {
5006*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr ret;
5007*6777b538SAndroid Build Coastguard Worker 
5008*6777b538SAndroid Build Coastguard Worker     if (doc == NULL)
5009*6777b538SAndroid Build Coastguard Worker         return(NULL);
5010*6777b538SAndroid Build Coastguard Worker 
5011*6777b538SAndroid Build Coastguard Worker     ret = xmlMalloc(sizeof(xmlTextReader));
5012*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
5013*6777b538SAndroid Build Coastguard Worker 	return(NULL);
5014*6777b538SAndroid Build Coastguard Worker     }
5015*6777b538SAndroid Build Coastguard Worker     memset(ret, 0, sizeof(xmlTextReader));
5016*6777b538SAndroid Build Coastguard Worker     ret->entNr = 0;
5017*6777b538SAndroid Build Coastguard Worker     ret->input = NULL;
5018*6777b538SAndroid Build Coastguard Worker     ret->mode = XML_TEXTREADER_MODE_INITIAL;
5019*6777b538SAndroid Build Coastguard Worker     ret->node = NULL;
5020*6777b538SAndroid Build Coastguard Worker     ret->curnode = NULL;
5021*6777b538SAndroid Build Coastguard Worker     ret->base = 0;
5022*6777b538SAndroid Build Coastguard Worker     ret->cur = 0;
5023*6777b538SAndroid Build Coastguard Worker     ret->allocs = XML_TEXTREADER_CTXT;
5024*6777b538SAndroid Build Coastguard Worker     ret->doc = doc;
5025*6777b538SAndroid Build Coastguard Worker     ret->state = XML_TEXTREADER_START;
5026*6777b538SAndroid Build Coastguard Worker     ret->dict = xmlDictCreate();
5027*6777b538SAndroid Build Coastguard Worker     return(ret);
5028*6777b538SAndroid Build Coastguard Worker }
5029*6777b538SAndroid Build Coastguard Worker 
5030*6777b538SAndroid Build Coastguard Worker /**
5031*6777b538SAndroid Build Coastguard Worker  * xmlReaderForDoc:
5032*6777b538SAndroid Build Coastguard Worker  * @cur:  a pointer to a zero terminated string
5033*6777b538SAndroid Build Coastguard Worker  * @URL:  the base URL to use for the document
5034*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5035*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5036*6777b538SAndroid Build Coastguard Worker  *
5037*6777b538SAndroid Build Coastguard Worker  * Create an xmltextReader for an XML in-memory document.
5038*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5039*6777b538SAndroid Build Coastguard Worker  *
5040*6777b538SAndroid Build Coastguard Worker  * Returns the new reader or NULL in case of error.
5041*6777b538SAndroid Build Coastguard Worker  */
5042*6777b538SAndroid Build Coastguard Worker xmlTextReaderPtr
xmlReaderForDoc(const xmlChar * cur,const char * URL,const char * encoding,int options)5043*6777b538SAndroid Build Coastguard Worker xmlReaderForDoc(const xmlChar * cur, const char *URL, const char *encoding,
5044*6777b538SAndroid Build Coastguard Worker                 int options)
5045*6777b538SAndroid Build Coastguard Worker {
5046*6777b538SAndroid Build Coastguard Worker     int len;
5047*6777b538SAndroid Build Coastguard Worker 
5048*6777b538SAndroid Build Coastguard Worker     if (cur == NULL)
5049*6777b538SAndroid Build Coastguard Worker         return (NULL);
5050*6777b538SAndroid Build Coastguard Worker     len = xmlStrlen(cur);
5051*6777b538SAndroid Build Coastguard Worker 
5052*6777b538SAndroid Build Coastguard Worker     return (xmlReaderForMemory
5053*6777b538SAndroid Build Coastguard Worker             ((const char *) cur, len, URL, encoding, options));
5054*6777b538SAndroid Build Coastguard Worker }
5055*6777b538SAndroid Build Coastguard Worker 
5056*6777b538SAndroid Build Coastguard Worker /**
5057*6777b538SAndroid Build Coastguard Worker  * xmlReaderForFile:
5058*6777b538SAndroid Build Coastguard Worker  * @filename:  a file or URL
5059*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5060*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5061*6777b538SAndroid Build Coastguard Worker  *
5062*6777b538SAndroid Build Coastguard Worker  * parse an XML file from the filesystem or the network.
5063*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5064*6777b538SAndroid Build Coastguard Worker  *
5065*6777b538SAndroid Build Coastguard Worker  * Returns the new reader or NULL in case of error.
5066*6777b538SAndroid Build Coastguard Worker  */
5067*6777b538SAndroid Build Coastguard Worker xmlTextReaderPtr
xmlReaderForFile(const char * filename,const char * encoding,int options)5068*6777b538SAndroid Build Coastguard Worker xmlReaderForFile(const char *filename, const char *encoding, int options)
5069*6777b538SAndroid Build Coastguard Worker {
5070*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
5071*6777b538SAndroid Build Coastguard Worker 
5072*6777b538SAndroid Build Coastguard Worker     reader = xmlNewTextReaderFilename(filename);
5073*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
5074*6777b538SAndroid Build Coastguard Worker         return (NULL);
5075*6777b538SAndroid Build Coastguard Worker     xmlTextReaderSetup(reader, NULL, NULL, encoding, options);
5076*6777b538SAndroid Build Coastguard Worker     return (reader);
5077*6777b538SAndroid Build Coastguard Worker }
5078*6777b538SAndroid Build Coastguard Worker 
5079*6777b538SAndroid Build Coastguard Worker /**
5080*6777b538SAndroid Build Coastguard Worker  * xmlReaderForMemory:
5081*6777b538SAndroid Build Coastguard Worker  * @buffer:  a pointer to a char array
5082*6777b538SAndroid Build Coastguard Worker  * @size:  the size of the array
5083*6777b538SAndroid Build Coastguard Worker  * @URL:  the base URL to use for the document
5084*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5085*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5086*6777b538SAndroid Build Coastguard Worker  *
5087*6777b538SAndroid Build Coastguard Worker  * Create an xmltextReader for an XML in-memory document.
5088*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5089*6777b538SAndroid Build Coastguard Worker  *
5090*6777b538SAndroid Build Coastguard Worker  * Returns the new reader or NULL in case of error.
5091*6777b538SAndroid Build Coastguard Worker  */
5092*6777b538SAndroid Build Coastguard Worker xmlTextReaderPtr
xmlReaderForMemory(const char * buffer,int size,const char * URL,const char * encoding,int options)5093*6777b538SAndroid Build Coastguard Worker xmlReaderForMemory(const char *buffer, int size, const char *URL,
5094*6777b538SAndroid Build Coastguard Worker                    const char *encoding, int options)
5095*6777b538SAndroid Build Coastguard Worker {
5096*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
5097*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr buf;
5098*6777b538SAndroid Build Coastguard Worker 
5099*6777b538SAndroid Build Coastguard Worker     buf = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE);
5100*6777b538SAndroid Build Coastguard Worker     if (buf == NULL) {
5101*6777b538SAndroid Build Coastguard Worker         return (NULL);
5102*6777b538SAndroid Build Coastguard Worker     }
5103*6777b538SAndroid Build Coastguard Worker     reader = xmlNewTextReader(buf, URL);
5104*6777b538SAndroid Build Coastguard Worker     if (reader == NULL) {
5105*6777b538SAndroid Build Coastguard Worker         xmlFreeParserInputBuffer(buf);
5106*6777b538SAndroid Build Coastguard Worker         return (NULL);
5107*6777b538SAndroid Build Coastguard Worker     }
5108*6777b538SAndroid Build Coastguard Worker     reader->allocs |= XML_TEXTREADER_INPUT;
5109*6777b538SAndroid Build Coastguard Worker     xmlTextReaderSetup(reader, NULL, URL, encoding, options);
5110*6777b538SAndroid Build Coastguard Worker     return (reader);
5111*6777b538SAndroid Build Coastguard Worker }
5112*6777b538SAndroid Build Coastguard Worker 
5113*6777b538SAndroid Build Coastguard Worker /**
5114*6777b538SAndroid Build Coastguard Worker  * xmlReaderForFd:
5115*6777b538SAndroid Build Coastguard Worker  * @fd:  an open file descriptor
5116*6777b538SAndroid Build Coastguard Worker  * @URL:  the base URL to use for the document
5117*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5118*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5119*6777b538SAndroid Build Coastguard Worker  *
5120*6777b538SAndroid Build Coastguard Worker  * Create an xmltextReader for an XML from a file descriptor.
5121*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5122*6777b538SAndroid Build Coastguard Worker  * NOTE that the file descriptor will not be closed when the
5123*6777b538SAndroid Build Coastguard Worker  *      reader is closed or reset.
5124*6777b538SAndroid Build Coastguard Worker  *
5125*6777b538SAndroid Build Coastguard Worker  * Returns the new reader or NULL in case of error.
5126*6777b538SAndroid Build Coastguard Worker  */
5127*6777b538SAndroid Build Coastguard Worker xmlTextReaderPtr
xmlReaderForFd(int fd,const char * URL,const char * encoding,int options)5128*6777b538SAndroid Build Coastguard Worker xmlReaderForFd(int fd, const char *URL, const char *encoding, int options)
5129*6777b538SAndroid Build Coastguard Worker {
5130*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
5131*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr input;
5132*6777b538SAndroid Build Coastguard Worker 
5133*6777b538SAndroid Build Coastguard Worker     if (fd < 0)
5134*6777b538SAndroid Build Coastguard Worker         return (NULL);
5135*6777b538SAndroid Build Coastguard Worker 
5136*6777b538SAndroid Build Coastguard Worker     input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE);
5137*6777b538SAndroid Build Coastguard Worker     if (input == NULL)
5138*6777b538SAndroid Build Coastguard Worker         return (NULL);
5139*6777b538SAndroid Build Coastguard Worker     input->closecallback = NULL;
5140*6777b538SAndroid Build Coastguard Worker     reader = xmlNewTextReader(input, URL);
5141*6777b538SAndroid Build Coastguard Worker     if (reader == NULL) {
5142*6777b538SAndroid Build Coastguard Worker         xmlFreeParserInputBuffer(input);
5143*6777b538SAndroid Build Coastguard Worker         return (NULL);
5144*6777b538SAndroid Build Coastguard Worker     }
5145*6777b538SAndroid Build Coastguard Worker     reader->allocs |= XML_TEXTREADER_INPUT;
5146*6777b538SAndroid Build Coastguard Worker     xmlTextReaderSetup(reader, NULL, URL, encoding, options);
5147*6777b538SAndroid Build Coastguard Worker     return (reader);
5148*6777b538SAndroid Build Coastguard Worker }
5149*6777b538SAndroid Build Coastguard Worker 
5150*6777b538SAndroid Build Coastguard Worker /**
5151*6777b538SAndroid Build Coastguard Worker  * xmlReaderForIO:
5152*6777b538SAndroid Build Coastguard Worker  * @ioread:  an I/O read function
5153*6777b538SAndroid Build Coastguard Worker  * @ioclose:  an I/O close function
5154*6777b538SAndroid Build Coastguard Worker  * @ioctx:  an I/O handler
5155*6777b538SAndroid Build Coastguard Worker  * @URL:  the base URL to use for the document
5156*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5157*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5158*6777b538SAndroid Build Coastguard Worker  *
5159*6777b538SAndroid Build Coastguard Worker  * Create an xmltextReader for an XML document from I/O functions and source.
5160*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5161*6777b538SAndroid Build Coastguard Worker  *
5162*6777b538SAndroid Build Coastguard Worker  * Returns the new reader or NULL in case of error.
5163*6777b538SAndroid Build Coastguard Worker  */
5164*6777b538SAndroid Build Coastguard Worker xmlTextReaderPtr
xmlReaderForIO(xmlInputReadCallback ioread,xmlInputCloseCallback ioclose,void * ioctx,const char * URL,const char * encoding,int options)5165*6777b538SAndroid Build Coastguard Worker xmlReaderForIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose,
5166*6777b538SAndroid Build Coastguard Worker                void *ioctx, const char *URL, const char *encoding,
5167*6777b538SAndroid Build Coastguard Worker                int options)
5168*6777b538SAndroid Build Coastguard Worker {
5169*6777b538SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
5170*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr input;
5171*6777b538SAndroid Build Coastguard Worker 
5172*6777b538SAndroid Build Coastguard Worker     if (ioread == NULL)
5173*6777b538SAndroid Build Coastguard Worker         return (NULL);
5174*6777b538SAndroid Build Coastguard Worker 
5175*6777b538SAndroid Build Coastguard Worker     input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx,
5176*6777b538SAndroid Build Coastguard Worker                                          XML_CHAR_ENCODING_NONE);
5177*6777b538SAndroid Build Coastguard Worker     if (input == NULL) {
5178*6777b538SAndroid Build Coastguard Worker         if (ioclose != NULL)
5179*6777b538SAndroid Build Coastguard Worker             ioclose(ioctx);
5180*6777b538SAndroid Build Coastguard Worker         return (NULL);
5181*6777b538SAndroid Build Coastguard Worker     }
5182*6777b538SAndroid Build Coastguard Worker     reader = xmlNewTextReader(input, URL);
5183*6777b538SAndroid Build Coastguard Worker     if (reader == NULL) {
5184*6777b538SAndroid Build Coastguard Worker         xmlFreeParserInputBuffer(input);
5185*6777b538SAndroid Build Coastguard Worker         return (NULL);
5186*6777b538SAndroid Build Coastguard Worker     }
5187*6777b538SAndroid Build Coastguard Worker     reader->allocs |= XML_TEXTREADER_INPUT;
5188*6777b538SAndroid Build Coastguard Worker     xmlTextReaderSetup(reader, NULL, URL, encoding, options);
5189*6777b538SAndroid Build Coastguard Worker     return (reader);
5190*6777b538SAndroid Build Coastguard Worker }
5191*6777b538SAndroid Build Coastguard Worker 
5192*6777b538SAndroid Build Coastguard Worker /**
5193*6777b538SAndroid Build Coastguard Worker  * xmlReaderNewWalker:
5194*6777b538SAndroid Build Coastguard Worker  * @reader:  an XML reader
5195*6777b538SAndroid Build Coastguard Worker  * @doc:  a preparsed document
5196*6777b538SAndroid Build Coastguard Worker  *
5197*6777b538SAndroid Build Coastguard Worker  * Setup an xmltextReader to parse a preparsed XML document.
5198*6777b538SAndroid Build Coastguard Worker  * This reuses the existing @reader xmlTextReader.
5199*6777b538SAndroid Build Coastguard Worker  *
5200*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case of success and -1 in case of error
5201*6777b538SAndroid Build Coastguard Worker  */
5202*6777b538SAndroid Build Coastguard Worker int
xmlReaderNewWalker(xmlTextReaderPtr reader,xmlDocPtr doc)5203*6777b538SAndroid Build Coastguard Worker xmlReaderNewWalker(xmlTextReaderPtr reader, xmlDocPtr doc)
5204*6777b538SAndroid Build Coastguard Worker {
5205*6777b538SAndroid Build Coastguard Worker     if (doc == NULL)
5206*6777b538SAndroid Build Coastguard Worker         return (-1);
5207*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
5208*6777b538SAndroid Build Coastguard Worker         return (-1);
5209*6777b538SAndroid Build Coastguard Worker 
5210*6777b538SAndroid Build Coastguard Worker     if (reader->input != NULL) {
5211*6777b538SAndroid Build Coastguard Worker         xmlFreeParserInputBuffer(reader->input);
5212*6777b538SAndroid Build Coastguard Worker     }
5213*6777b538SAndroid Build Coastguard Worker     if (reader->ctxt != NULL) {
5214*6777b538SAndroid Build Coastguard Worker 	xmlCtxtReset(reader->ctxt);
5215*6777b538SAndroid Build Coastguard Worker     }
5216*6777b538SAndroid Build Coastguard Worker 
5217*6777b538SAndroid Build Coastguard Worker     reader->entNr = 0;
5218*6777b538SAndroid Build Coastguard Worker     reader->input = NULL;
5219*6777b538SAndroid Build Coastguard Worker     reader->mode = XML_TEXTREADER_MODE_INITIAL;
5220*6777b538SAndroid Build Coastguard Worker     reader->node = NULL;
5221*6777b538SAndroid Build Coastguard Worker     reader->curnode = NULL;
5222*6777b538SAndroid Build Coastguard Worker     reader->base = 0;
5223*6777b538SAndroid Build Coastguard Worker     reader->cur = 0;
5224*6777b538SAndroid Build Coastguard Worker     reader->allocs = XML_TEXTREADER_CTXT;
5225*6777b538SAndroid Build Coastguard Worker     reader->doc = doc;
5226*6777b538SAndroid Build Coastguard Worker     reader->state = XML_TEXTREADER_START;
5227*6777b538SAndroid Build Coastguard Worker     if (reader->dict == NULL) {
5228*6777b538SAndroid Build Coastguard Worker         if ((reader->ctxt != NULL) && (reader->ctxt->dict != NULL))
5229*6777b538SAndroid Build Coastguard Worker 	    reader->dict = reader->ctxt->dict;
5230*6777b538SAndroid Build Coastguard Worker 	else
5231*6777b538SAndroid Build Coastguard Worker 	    reader->dict = xmlDictCreate();
5232*6777b538SAndroid Build Coastguard Worker     }
5233*6777b538SAndroid Build Coastguard Worker     return(0);
5234*6777b538SAndroid Build Coastguard Worker }
5235*6777b538SAndroid Build Coastguard Worker 
5236*6777b538SAndroid Build Coastguard Worker /**
5237*6777b538SAndroid Build Coastguard Worker  * xmlReaderNewDoc:
5238*6777b538SAndroid Build Coastguard Worker  * @reader:  an XML reader
5239*6777b538SAndroid Build Coastguard Worker  * @cur:  a pointer to a zero terminated string
5240*6777b538SAndroid Build Coastguard Worker  * @URL:  the base URL to use for the document
5241*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5242*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5243*6777b538SAndroid Build Coastguard Worker  *
5244*6777b538SAndroid Build Coastguard Worker  * Setup an xmltextReader to parse an XML in-memory document.
5245*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5246*6777b538SAndroid Build Coastguard Worker  * This reuses the existing @reader xmlTextReader.
5247*6777b538SAndroid Build Coastguard Worker  *
5248*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case of success and -1 in case of error
5249*6777b538SAndroid Build Coastguard Worker  */
5250*6777b538SAndroid Build Coastguard Worker int
xmlReaderNewDoc(xmlTextReaderPtr reader,const xmlChar * cur,const char * URL,const char * encoding,int options)5251*6777b538SAndroid Build Coastguard Worker xmlReaderNewDoc(xmlTextReaderPtr reader, const xmlChar * cur,
5252*6777b538SAndroid Build Coastguard Worker                 const char *URL, const char *encoding, int options)
5253*6777b538SAndroid Build Coastguard Worker {
5254*6777b538SAndroid Build Coastguard Worker 
5255*6777b538SAndroid Build Coastguard Worker     int len;
5256*6777b538SAndroid Build Coastguard Worker 
5257*6777b538SAndroid Build Coastguard Worker     if (cur == NULL)
5258*6777b538SAndroid Build Coastguard Worker         return (-1);
5259*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
5260*6777b538SAndroid Build Coastguard Worker         return (-1);
5261*6777b538SAndroid Build Coastguard Worker 
5262*6777b538SAndroid Build Coastguard Worker     len = xmlStrlen(cur);
5263*6777b538SAndroid Build Coastguard Worker     return (xmlReaderNewMemory(reader, (const char *)cur, len,
5264*6777b538SAndroid Build Coastguard Worker                                URL, encoding, options));
5265*6777b538SAndroid Build Coastguard Worker }
5266*6777b538SAndroid Build Coastguard Worker 
5267*6777b538SAndroid Build Coastguard Worker /**
5268*6777b538SAndroid Build Coastguard Worker  * xmlReaderNewFile:
5269*6777b538SAndroid Build Coastguard Worker  * @reader:  an XML reader
5270*6777b538SAndroid Build Coastguard Worker  * @filename:  a file or URL
5271*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5272*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5273*6777b538SAndroid Build Coastguard Worker  *
5274*6777b538SAndroid Build Coastguard Worker  * parse an XML file from the filesystem or the network.
5275*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5276*6777b538SAndroid Build Coastguard Worker  * This reuses the existing @reader xmlTextReader.
5277*6777b538SAndroid Build Coastguard Worker  *
5278*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case of success and -1 in case of error
5279*6777b538SAndroid Build Coastguard Worker  */
5280*6777b538SAndroid Build Coastguard Worker int
xmlReaderNewFile(xmlTextReaderPtr reader,const char * filename,const char * encoding,int options)5281*6777b538SAndroid Build Coastguard Worker xmlReaderNewFile(xmlTextReaderPtr reader, const char *filename,
5282*6777b538SAndroid Build Coastguard Worker                  const char *encoding, int options)
5283*6777b538SAndroid Build Coastguard Worker {
5284*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr input;
5285*6777b538SAndroid Build Coastguard Worker 
5286*6777b538SAndroid Build Coastguard Worker     if (filename == NULL)
5287*6777b538SAndroid Build Coastguard Worker         return (-1);
5288*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
5289*6777b538SAndroid Build Coastguard Worker         return (-1);
5290*6777b538SAndroid Build Coastguard Worker 
5291*6777b538SAndroid Build Coastguard Worker     input =
5292*6777b538SAndroid Build Coastguard Worker         xmlParserInputBufferCreateFilename(filename,
5293*6777b538SAndroid Build Coastguard Worker                                            XML_CHAR_ENCODING_NONE);
5294*6777b538SAndroid Build Coastguard Worker     if (input == NULL)
5295*6777b538SAndroid Build Coastguard Worker         return (-1);
5296*6777b538SAndroid Build Coastguard Worker     return (xmlTextReaderSetup(reader, input, filename, encoding, options));
5297*6777b538SAndroid Build Coastguard Worker }
5298*6777b538SAndroid Build Coastguard Worker 
5299*6777b538SAndroid Build Coastguard Worker /**
5300*6777b538SAndroid Build Coastguard Worker  * xmlReaderNewMemory:
5301*6777b538SAndroid Build Coastguard Worker  * @reader:  an XML reader
5302*6777b538SAndroid Build Coastguard Worker  * @buffer:  a pointer to a char array
5303*6777b538SAndroid Build Coastguard Worker  * @size:  the size of the array
5304*6777b538SAndroid Build Coastguard Worker  * @URL:  the base URL to use for the document
5305*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5306*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5307*6777b538SAndroid Build Coastguard Worker  *
5308*6777b538SAndroid Build Coastguard Worker  * Setup an xmltextReader to parse an XML in-memory document.
5309*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5310*6777b538SAndroid Build Coastguard Worker  * This reuses the existing @reader xmlTextReader.
5311*6777b538SAndroid Build Coastguard Worker  *
5312*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case of success and -1 in case of error
5313*6777b538SAndroid Build Coastguard Worker  */
5314*6777b538SAndroid Build Coastguard Worker int
xmlReaderNewMemory(xmlTextReaderPtr reader,const char * buffer,int size,const char * URL,const char * encoding,int options)5315*6777b538SAndroid Build Coastguard Worker xmlReaderNewMemory(xmlTextReaderPtr reader, const char *buffer, int size,
5316*6777b538SAndroid Build Coastguard Worker                    const char *URL, const char *encoding, int options)
5317*6777b538SAndroid Build Coastguard Worker {
5318*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr input;
5319*6777b538SAndroid Build Coastguard Worker 
5320*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
5321*6777b538SAndroid Build Coastguard Worker         return (-1);
5322*6777b538SAndroid Build Coastguard Worker     if (buffer == NULL)
5323*6777b538SAndroid Build Coastguard Worker         return (-1);
5324*6777b538SAndroid Build Coastguard Worker 
5325*6777b538SAndroid Build Coastguard Worker     input = xmlParserInputBufferCreateMem(buffer, size,
5326*6777b538SAndroid Build Coastguard Worker                                       XML_CHAR_ENCODING_NONE);
5327*6777b538SAndroid Build Coastguard Worker     if (input == NULL) {
5328*6777b538SAndroid Build Coastguard Worker         return (-1);
5329*6777b538SAndroid Build Coastguard Worker     }
5330*6777b538SAndroid Build Coastguard Worker     return (xmlTextReaderSetup(reader, input, URL, encoding, options));
5331*6777b538SAndroid Build Coastguard Worker }
5332*6777b538SAndroid Build Coastguard Worker 
5333*6777b538SAndroid Build Coastguard Worker /**
5334*6777b538SAndroid Build Coastguard Worker  * xmlReaderNewFd:
5335*6777b538SAndroid Build Coastguard Worker  * @reader:  an XML reader
5336*6777b538SAndroid Build Coastguard Worker  * @fd:  an open file descriptor
5337*6777b538SAndroid Build Coastguard Worker  * @URL:  the base URL to use for the document
5338*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5339*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5340*6777b538SAndroid Build Coastguard Worker  *
5341*6777b538SAndroid Build Coastguard Worker  * Setup an xmltextReader to parse an XML from a file descriptor.
5342*6777b538SAndroid Build Coastguard Worker  * NOTE that the file descriptor will not be closed when the
5343*6777b538SAndroid Build Coastguard Worker  *      reader is closed or reset.
5344*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5345*6777b538SAndroid Build Coastguard Worker  * This reuses the existing @reader xmlTextReader.
5346*6777b538SAndroid Build Coastguard Worker  *
5347*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case of success and -1 in case of error
5348*6777b538SAndroid Build Coastguard Worker  */
5349*6777b538SAndroid Build Coastguard Worker int
xmlReaderNewFd(xmlTextReaderPtr reader,int fd,const char * URL,const char * encoding,int options)5350*6777b538SAndroid Build Coastguard Worker xmlReaderNewFd(xmlTextReaderPtr reader, int fd,
5351*6777b538SAndroid Build Coastguard Worker                const char *URL, const char *encoding, int options)
5352*6777b538SAndroid Build Coastguard Worker {
5353*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr input;
5354*6777b538SAndroid Build Coastguard Worker 
5355*6777b538SAndroid Build Coastguard Worker     if (fd < 0)
5356*6777b538SAndroid Build Coastguard Worker         return (-1);
5357*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
5358*6777b538SAndroid Build Coastguard Worker         return (-1);
5359*6777b538SAndroid Build Coastguard Worker 
5360*6777b538SAndroid Build Coastguard Worker     input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE);
5361*6777b538SAndroid Build Coastguard Worker     if (input == NULL)
5362*6777b538SAndroid Build Coastguard Worker         return (-1);
5363*6777b538SAndroid Build Coastguard Worker     input->closecallback = NULL;
5364*6777b538SAndroid Build Coastguard Worker     return (xmlTextReaderSetup(reader, input, URL, encoding, options));
5365*6777b538SAndroid Build Coastguard Worker }
5366*6777b538SAndroid Build Coastguard Worker 
5367*6777b538SAndroid Build Coastguard Worker /**
5368*6777b538SAndroid Build Coastguard Worker  * xmlReaderNewIO:
5369*6777b538SAndroid Build Coastguard Worker  * @reader:  an XML reader
5370*6777b538SAndroid Build Coastguard Worker  * @ioread:  an I/O read function
5371*6777b538SAndroid Build Coastguard Worker  * @ioclose:  an I/O close function
5372*6777b538SAndroid Build Coastguard Worker  * @ioctx:  an I/O handler
5373*6777b538SAndroid Build Coastguard Worker  * @URL:  the base URL to use for the document
5374*6777b538SAndroid Build Coastguard Worker  * @encoding:  the document encoding, or NULL
5375*6777b538SAndroid Build Coastguard Worker  * @options:  a combination of xmlParserOption
5376*6777b538SAndroid Build Coastguard Worker  *
5377*6777b538SAndroid Build Coastguard Worker  * Setup an xmltextReader to parse an XML document from I/O functions
5378*6777b538SAndroid Build Coastguard Worker  * and source.
5379*6777b538SAndroid Build Coastguard Worker  * The parsing flags @options are a combination of xmlParserOption.
5380*6777b538SAndroid Build Coastguard Worker  * This reuses the existing @reader xmlTextReader.
5381*6777b538SAndroid Build Coastguard Worker  *
5382*6777b538SAndroid Build Coastguard Worker  * Returns 0 in case of success and -1 in case of error
5383*6777b538SAndroid Build Coastguard Worker  */
5384*6777b538SAndroid Build Coastguard Worker int
xmlReaderNewIO(xmlTextReaderPtr reader,xmlInputReadCallback ioread,xmlInputCloseCallback ioclose,void * ioctx,const char * URL,const char * encoding,int options)5385*6777b538SAndroid Build Coastguard Worker xmlReaderNewIO(xmlTextReaderPtr reader, xmlInputReadCallback ioread,
5386*6777b538SAndroid Build Coastguard Worker                xmlInputCloseCallback ioclose, void *ioctx,
5387*6777b538SAndroid Build Coastguard Worker                const char *URL, const char *encoding, int options)
5388*6777b538SAndroid Build Coastguard Worker {
5389*6777b538SAndroid Build Coastguard Worker     xmlParserInputBufferPtr input;
5390*6777b538SAndroid Build Coastguard Worker 
5391*6777b538SAndroid Build Coastguard Worker     if (ioread == NULL)
5392*6777b538SAndroid Build Coastguard Worker         return (-1);
5393*6777b538SAndroid Build Coastguard Worker     if (reader == NULL)
5394*6777b538SAndroid Build Coastguard Worker         return (-1);
5395*6777b538SAndroid Build Coastguard Worker 
5396*6777b538SAndroid Build Coastguard Worker     input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx,
5397*6777b538SAndroid Build Coastguard Worker                                          XML_CHAR_ENCODING_NONE);
5398*6777b538SAndroid Build Coastguard Worker     if (input == NULL) {
5399*6777b538SAndroid Build Coastguard Worker         if (ioclose != NULL)
5400*6777b538SAndroid Build Coastguard Worker             ioclose(ioctx);
5401*6777b538SAndroid Build Coastguard Worker         return (-1);
5402*6777b538SAndroid Build Coastguard Worker     }
5403*6777b538SAndroid Build Coastguard Worker     return (xmlTextReaderSetup(reader, input, URL, encoding, options));
5404*6777b538SAndroid Build Coastguard Worker }
5405*6777b538SAndroid Build Coastguard Worker 
5406*6777b538SAndroid Build Coastguard Worker /************************************************************************
5407*6777b538SAndroid Build Coastguard Worker  *									*
5408*6777b538SAndroid Build Coastguard Worker  *			Utilities					*
5409*6777b538SAndroid Build Coastguard Worker  *									*
5410*6777b538SAndroid Build Coastguard Worker  ************************************************************************/
5411*6777b538SAndroid Build Coastguard Worker #ifdef NOT_USED_YET
5412*6777b538SAndroid Build Coastguard Worker 
5413*6777b538SAndroid Build Coastguard Worker /**
5414*6777b538SAndroid Build Coastguard Worker  * xmlBase64Decode:
5415*6777b538SAndroid Build Coastguard Worker  * @in:  the input buffer
5416*6777b538SAndroid Build Coastguard Worker  * @inlen:  the size of the input (in), the size read from it (out)
5417*6777b538SAndroid Build Coastguard Worker  * @to:  the output buffer
5418*6777b538SAndroid Build Coastguard Worker  * @tolen:  the size of the output (in), the size written to (out)
5419*6777b538SAndroid Build Coastguard Worker  *
5420*6777b538SAndroid Build Coastguard Worker  * Base64 decoder, reads from @in and save in @to
5421*6777b538SAndroid Build Coastguard Worker  * TODO: tell jody when this is actually exported
5422*6777b538SAndroid Build Coastguard Worker  *
5423*6777b538SAndroid Build Coastguard Worker  * Returns 0 if all the input was consumer, 1 if the Base64 end was reached,
5424*6777b538SAndroid Build Coastguard Worker  *         2 if there wasn't enough space on the output or -1 in case of error.
5425*6777b538SAndroid Build Coastguard Worker  */
5426*6777b538SAndroid Build Coastguard Worker static int
xmlBase64Decode(const unsigned char * in,unsigned long * inlen,unsigned char * to,unsigned long * tolen)5427*6777b538SAndroid Build Coastguard Worker xmlBase64Decode(const unsigned char *in, unsigned long *inlen,
5428*6777b538SAndroid Build Coastguard Worker                 unsigned char *to, unsigned long *tolen)
5429*6777b538SAndroid Build Coastguard Worker {
5430*6777b538SAndroid Build Coastguard Worker     unsigned long incur;        /* current index in in[] */
5431*6777b538SAndroid Build Coastguard Worker 
5432*6777b538SAndroid Build Coastguard Worker     unsigned long inblk;        /* last block index in in[] */
5433*6777b538SAndroid Build Coastguard Worker 
5434*6777b538SAndroid Build Coastguard Worker     unsigned long outcur;       /* current index in out[] */
5435*6777b538SAndroid Build Coastguard Worker 
5436*6777b538SAndroid Build Coastguard Worker     unsigned long inmax;        /* size of in[] */
5437*6777b538SAndroid Build Coastguard Worker 
5438*6777b538SAndroid Build Coastguard Worker     unsigned long outmax;       /* size of out[] */
5439*6777b538SAndroid Build Coastguard Worker 
5440*6777b538SAndroid Build Coastguard Worker     unsigned char cur;          /* the current value read from in[] */
5441*6777b538SAndroid Build Coastguard Worker 
5442*6777b538SAndroid Build Coastguard Worker     unsigned char intmp[4], outtmp[4];  /* temporary buffers for the convert */
5443*6777b538SAndroid Build Coastguard Worker 
5444*6777b538SAndroid Build Coastguard Worker     int nbintmp;                /* number of byte in intmp[] */
5445*6777b538SAndroid Build Coastguard Worker 
5446*6777b538SAndroid Build Coastguard Worker     int is_ignore;              /* cur should be ignored */
5447*6777b538SAndroid Build Coastguard Worker 
5448*6777b538SAndroid Build Coastguard Worker     int is_end = 0;             /* the end of the base64 was found */
5449*6777b538SAndroid Build Coastguard Worker 
5450*6777b538SAndroid Build Coastguard Worker     int retval = 1;
5451*6777b538SAndroid Build Coastguard Worker 
5452*6777b538SAndroid Build Coastguard Worker     int i;
5453*6777b538SAndroid Build Coastguard Worker 
5454*6777b538SAndroid Build Coastguard Worker     if ((in == NULL) || (inlen == NULL) || (to == NULL) || (tolen == NULL))
5455*6777b538SAndroid Build Coastguard Worker         return (-1);
5456*6777b538SAndroid Build Coastguard Worker 
5457*6777b538SAndroid Build Coastguard Worker     incur = 0;
5458*6777b538SAndroid Build Coastguard Worker     inblk = 0;
5459*6777b538SAndroid Build Coastguard Worker     outcur = 0;
5460*6777b538SAndroid Build Coastguard Worker     inmax = *inlen;
5461*6777b538SAndroid Build Coastguard Worker     outmax = *tolen;
5462*6777b538SAndroid Build Coastguard Worker     nbintmp = 0;
5463*6777b538SAndroid Build Coastguard Worker 
5464*6777b538SAndroid Build Coastguard Worker     while (1) {
5465*6777b538SAndroid Build Coastguard Worker         if (incur >= inmax)
5466*6777b538SAndroid Build Coastguard Worker             break;
5467*6777b538SAndroid Build Coastguard Worker         cur = in[incur++];
5468*6777b538SAndroid Build Coastguard Worker         is_ignore = 0;
5469*6777b538SAndroid Build Coastguard Worker         if ((cur >= 'A') && (cur <= 'Z'))
5470*6777b538SAndroid Build Coastguard Worker             cur = cur - 'A';
5471*6777b538SAndroid Build Coastguard Worker         else if ((cur >= 'a') && (cur <= 'z'))
5472*6777b538SAndroid Build Coastguard Worker             cur = cur - 'a' + 26;
5473*6777b538SAndroid Build Coastguard Worker         else if ((cur >= '0') && (cur <= '9'))
5474*6777b538SAndroid Build Coastguard Worker             cur = cur - '0' + 52;
5475*6777b538SAndroid Build Coastguard Worker         else if (cur == '+')
5476*6777b538SAndroid Build Coastguard Worker             cur = 62;
5477*6777b538SAndroid Build Coastguard Worker         else if (cur == '/')
5478*6777b538SAndroid Build Coastguard Worker             cur = 63;
5479*6777b538SAndroid Build Coastguard Worker         else if (cur == '.')
5480*6777b538SAndroid Build Coastguard Worker             cur = 0;
5481*6777b538SAndroid Build Coastguard Worker         else if (cur == '=')    /*no op , end of the base64 stream */
5482*6777b538SAndroid Build Coastguard Worker             is_end = 1;
5483*6777b538SAndroid Build Coastguard Worker         else {
5484*6777b538SAndroid Build Coastguard Worker             is_ignore = 1;
5485*6777b538SAndroid Build Coastguard Worker             if (nbintmp == 0)
5486*6777b538SAndroid Build Coastguard Worker                 inblk = incur;
5487*6777b538SAndroid Build Coastguard Worker         }
5488*6777b538SAndroid Build Coastguard Worker 
5489*6777b538SAndroid Build Coastguard Worker         if (!is_ignore) {
5490*6777b538SAndroid Build Coastguard Worker             int nbouttmp = 3;
5491*6777b538SAndroid Build Coastguard Worker 
5492*6777b538SAndroid Build Coastguard Worker             int is_break = 0;
5493*6777b538SAndroid Build Coastguard Worker 
5494*6777b538SAndroid Build Coastguard Worker             if (is_end) {
5495*6777b538SAndroid Build Coastguard Worker                 if (nbintmp == 0)
5496*6777b538SAndroid Build Coastguard Worker                     break;
5497*6777b538SAndroid Build Coastguard Worker                 if ((nbintmp == 1) || (nbintmp == 2))
5498*6777b538SAndroid Build Coastguard Worker                     nbouttmp = 1;
5499*6777b538SAndroid Build Coastguard Worker                 else
5500*6777b538SAndroid Build Coastguard Worker                     nbouttmp = 2;
5501*6777b538SAndroid Build Coastguard Worker                 nbintmp = 3;
5502*6777b538SAndroid Build Coastguard Worker                 is_break = 1;
5503*6777b538SAndroid Build Coastguard Worker             }
5504*6777b538SAndroid Build Coastguard Worker             intmp[nbintmp++] = cur;
5505*6777b538SAndroid Build Coastguard Worker             /*
5506*6777b538SAndroid Build Coastguard Worker              * if intmp is full, push the 4byte sequence as a 3 byte
5507*6777b538SAndroid Build Coastguard Worker              * sequence out
5508*6777b538SAndroid Build Coastguard Worker              */
5509*6777b538SAndroid Build Coastguard Worker             if (nbintmp == 4) {
5510*6777b538SAndroid Build Coastguard Worker                 nbintmp = 0;
5511*6777b538SAndroid Build Coastguard Worker                 outtmp[0] = (intmp[0] << 2) | ((intmp[1] & 0x30) >> 4);
5512*6777b538SAndroid Build Coastguard Worker                 outtmp[1] =
5513*6777b538SAndroid Build Coastguard Worker                     ((intmp[1] & 0x0F) << 4) | ((intmp[2] & 0x3C) >> 2);
5514*6777b538SAndroid Build Coastguard Worker                 outtmp[2] = ((intmp[2] & 0x03) << 6) | (intmp[3] & 0x3F);
5515*6777b538SAndroid Build Coastguard Worker                 if (outcur + 3 >= outmax) {
5516*6777b538SAndroid Build Coastguard Worker                     retval = 2;
5517*6777b538SAndroid Build Coastguard Worker                     break;
5518*6777b538SAndroid Build Coastguard Worker                 }
5519*6777b538SAndroid Build Coastguard Worker 
5520*6777b538SAndroid Build Coastguard Worker                 for (i = 0; i < nbouttmp; i++)
5521*6777b538SAndroid Build Coastguard Worker                     to[outcur++] = outtmp[i];
5522*6777b538SAndroid Build Coastguard Worker                 inblk = incur;
5523*6777b538SAndroid Build Coastguard Worker             }
5524*6777b538SAndroid Build Coastguard Worker 
5525*6777b538SAndroid Build Coastguard Worker             if (is_break) {
5526*6777b538SAndroid Build Coastguard Worker                 retval = 0;
5527*6777b538SAndroid Build Coastguard Worker                 break;
5528*6777b538SAndroid Build Coastguard Worker             }
5529*6777b538SAndroid Build Coastguard Worker         }
5530*6777b538SAndroid Build Coastguard Worker     }
5531*6777b538SAndroid Build Coastguard Worker 
5532*6777b538SAndroid Build Coastguard Worker     *tolen = outcur;
5533*6777b538SAndroid Build Coastguard Worker     *inlen = inblk;
5534*6777b538SAndroid Build Coastguard Worker     return (retval);
5535*6777b538SAndroid Build Coastguard Worker }
5536*6777b538SAndroid Build Coastguard Worker 
5537*6777b538SAndroid Build Coastguard Worker /*
5538*6777b538SAndroid Build Coastguard Worker  * Test routine for the xmlBase64Decode function
5539*6777b538SAndroid Build Coastguard Worker  */
5540*6777b538SAndroid Build Coastguard Worker #if 0
5541*6777b538SAndroid Build Coastguard Worker int
5542*6777b538SAndroid Build Coastguard Worker main(int argc, char **argv)
5543*6777b538SAndroid Build Coastguard Worker {
5544*6777b538SAndroid Build Coastguard Worker     char *input = "  VW4 gcGV0        \n      aXQgdGVzdCAuCg== ";
5545*6777b538SAndroid Build Coastguard Worker 
5546*6777b538SAndroid Build Coastguard Worker     char output[100];
5547*6777b538SAndroid Build Coastguard Worker 
5548*6777b538SAndroid Build Coastguard Worker     char output2[100];
5549*6777b538SAndroid Build Coastguard Worker 
5550*6777b538SAndroid Build Coastguard Worker     char output3[100];
5551*6777b538SAndroid Build Coastguard Worker 
5552*6777b538SAndroid Build Coastguard Worker     unsigned long inlen = strlen(input);
5553*6777b538SAndroid Build Coastguard Worker 
5554*6777b538SAndroid Build Coastguard Worker     unsigned long outlen = 100;
5555*6777b538SAndroid Build Coastguard Worker 
5556*6777b538SAndroid Build Coastguard Worker     int ret;
5557*6777b538SAndroid Build Coastguard Worker 
5558*6777b538SAndroid Build Coastguard Worker     unsigned long cons, tmp, tmp2, prod;
5559*6777b538SAndroid Build Coastguard Worker 
5560*6777b538SAndroid Build Coastguard Worker     /*
5561*6777b538SAndroid Build Coastguard Worker      * Direct
5562*6777b538SAndroid Build Coastguard Worker      */
5563*6777b538SAndroid Build Coastguard Worker     ret = xmlBase64Decode(input, &inlen, output, &outlen);
5564*6777b538SAndroid Build Coastguard Worker 
5565*6777b538SAndroid Build Coastguard Worker     output[outlen] = 0;
5566*6777b538SAndroid Build Coastguard Worker     printf("ret: %d, inlen: %ld , outlen: %ld, output: '%s'\n", ret, inlen,
5567*6777b538SAndroid Build Coastguard Worker            outlen, output)indent: Standard input:179: Error:Unmatched #endif
5568*6777b538SAndroid Build Coastguard Worker ;
5569*6777b538SAndroid Build Coastguard Worker 
5570*6777b538SAndroid Build Coastguard Worker     /*
5571*6777b538SAndroid Build Coastguard Worker      * output chunking
5572*6777b538SAndroid Build Coastguard Worker      */
5573*6777b538SAndroid Build Coastguard Worker     cons = 0;
5574*6777b538SAndroid Build Coastguard Worker     prod = 0;
5575*6777b538SAndroid Build Coastguard Worker     while (cons < inlen) {
5576*6777b538SAndroid Build Coastguard Worker         tmp = 5;
5577*6777b538SAndroid Build Coastguard Worker         tmp2 = inlen - cons;
5578*6777b538SAndroid Build Coastguard Worker 
5579*6777b538SAndroid Build Coastguard Worker         printf("%ld %ld\n", cons, prod);
5580*6777b538SAndroid Build Coastguard Worker         ret = xmlBase64Decode(&input[cons], &tmp2, &output2[prod], &tmp);
5581*6777b538SAndroid Build Coastguard Worker         cons += tmp2;
5582*6777b538SAndroid Build Coastguard Worker         prod += tmp;
5583*6777b538SAndroid Build Coastguard Worker         printf("%ld %ld\n", cons, prod);
5584*6777b538SAndroid Build Coastguard Worker     }
5585*6777b538SAndroid Build Coastguard Worker     output2[outlen] = 0;
5586*6777b538SAndroid Build Coastguard Worker     printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons,
5587*6777b538SAndroid Build Coastguard Worker            prod, output2);
5588*6777b538SAndroid Build Coastguard Worker 
5589*6777b538SAndroid Build Coastguard Worker     /*
5590*6777b538SAndroid Build Coastguard Worker      * input chunking
5591*6777b538SAndroid Build Coastguard Worker      */
5592*6777b538SAndroid Build Coastguard Worker     cons = 0;
5593*6777b538SAndroid Build Coastguard Worker     prod = 0;
5594*6777b538SAndroid Build Coastguard Worker     while (cons < inlen) {
5595*6777b538SAndroid Build Coastguard Worker         tmp = 100 - prod;
5596*6777b538SAndroid Build Coastguard Worker         tmp2 = inlen - cons;
5597*6777b538SAndroid Build Coastguard Worker         if (tmp2 > 5)
5598*6777b538SAndroid Build Coastguard Worker             tmp2 = 5;
5599*6777b538SAndroid Build Coastguard Worker 
5600*6777b538SAndroid Build Coastguard Worker         printf("%ld %ld\n", cons, prod);
5601*6777b538SAndroid Build Coastguard Worker         ret = xmlBase64Decode(&input[cons], &tmp2, &output3[prod], &tmp);
5602*6777b538SAndroid Build Coastguard Worker         cons += tmp2;
5603*6777b538SAndroid Build Coastguard Worker         prod += tmp;
5604*6777b538SAndroid Build Coastguard Worker         printf("%ld %ld\n", cons, prod);
5605*6777b538SAndroid Build Coastguard Worker     }
5606*6777b538SAndroid Build Coastguard Worker     output3[outlen] = 0;
5607*6777b538SAndroid Build Coastguard Worker     printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons,
5608*6777b538SAndroid Build Coastguard Worker            prod, output3);
5609*6777b538SAndroid Build Coastguard Worker     return (0);
5610*6777b538SAndroid Build Coastguard Worker 
5611*6777b538SAndroid Build Coastguard Worker }
5612*6777b538SAndroid Build Coastguard Worker #endif
5613*6777b538SAndroid Build Coastguard Worker #endif /* NOT_USED_YET */
5614*6777b538SAndroid Build Coastguard Worker 
5615*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_READER_ENABLED */
5616