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