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 � 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