xref: /aosp_15_r20/external/libxml2/SAX2.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker  * SAX2.c : Default SAX2 handler to build a tree.
3*7c568831SAndroid Build Coastguard Worker  *
4*7c568831SAndroid Build Coastguard Worker  * See Copyright for the status of this software.
5*7c568831SAndroid Build Coastguard Worker  *
6*7c568831SAndroid Build Coastguard Worker  * Daniel Veillard <[email protected]>
7*7c568831SAndroid Build Coastguard Worker  */
8*7c568831SAndroid Build Coastguard Worker 
9*7c568831SAndroid Build Coastguard Worker 
10*7c568831SAndroid Build Coastguard Worker #define IN_LIBXML
11*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
12*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
13*7c568831SAndroid Build Coastguard Worker #include <string.h>
14*7c568831SAndroid Build Coastguard Worker #include <limits.h>
15*7c568831SAndroid Build Coastguard Worker #include <stddef.h>
16*7c568831SAndroid Build Coastguard Worker #include <libxml/SAX2.h>
17*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
18*7c568831SAndroid Build Coastguard Worker #include <libxml/tree.h>
19*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
20*7c568831SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
21*7c568831SAndroid Build Coastguard Worker #include <libxml/valid.h>
22*7c568831SAndroid Build Coastguard Worker #include <libxml/entities.h>
23*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
24*7c568831SAndroid Build Coastguard Worker #include <libxml/debugXML.h>
25*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlIO.h>
26*7c568831SAndroid Build Coastguard Worker #include <libxml/uri.h>
27*7c568831SAndroid Build Coastguard Worker #include <libxml/valid.h>
28*7c568831SAndroid Build Coastguard Worker #include <libxml/HTMLtree.h>
29*7c568831SAndroid Build Coastguard Worker 
30*7c568831SAndroid Build Coastguard Worker #include "private/error.h"
31*7c568831SAndroid Build Coastguard Worker #include "private/parser.h"
32*7c568831SAndroid Build Coastguard Worker #include "private/tree.h"
33*7c568831SAndroid Build Coastguard Worker 
34*7c568831SAndroid Build Coastguard Worker /*
35*7c568831SAndroid Build Coastguard Worker  * xmlSAX2ErrMemory:
36*7c568831SAndroid Build Coastguard Worker  * @ctxt:  an XML validation parser context
37*7c568831SAndroid Build Coastguard Worker  * @msg:   a string to accompany the error message
38*7c568831SAndroid Build Coastguard Worker  */
39*7c568831SAndroid Build Coastguard Worker static void
xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt)40*7c568831SAndroid Build Coastguard Worker xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt) {
41*7c568831SAndroid Build Coastguard Worker     xmlCtxtErrMemory(ctxt);
42*7c568831SAndroid Build Coastguard Worker }
43*7c568831SAndroid Build Coastguard Worker 
44*7c568831SAndroid Build Coastguard Worker /**
45*7c568831SAndroid Build Coastguard Worker  * xmlValidError:
46*7c568831SAndroid Build Coastguard Worker  * @ctxt:  an XML validation parser context
47*7c568831SAndroid Build Coastguard Worker  * @error:  the error number
48*7c568831SAndroid Build Coastguard Worker  * @msg:  the error message
49*7c568831SAndroid Build Coastguard Worker  * @str1:  extra data
50*7c568831SAndroid Build Coastguard Worker  * @str2:  extra data
51*7c568831SAndroid Build Coastguard Worker  *
52*7c568831SAndroid Build Coastguard Worker  * Handle a validation error
53*7c568831SAndroid Build Coastguard Worker  */
54*7c568831SAndroid Build Coastguard Worker static void LIBXML_ATTR_FORMAT(3,0)
xmlErrValid(xmlParserCtxtPtr ctxt,xmlParserErrors error,const char * msg,const xmlChar * str1,const xmlChar * str2)55*7c568831SAndroid Build Coastguard Worker xmlErrValid(xmlParserCtxtPtr ctxt, xmlParserErrors error,
56*7c568831SAndroid Build Coastguard Worker             const char *msg, const xmlChar *str1, const xmlChar *str2)
57*7c568831SAndroid Build Coastguard Worker {
58*7c568831SAndroid Build Coastguard Worker     xmlCtxtErr(ctxt, NULL, XML_FROM_DTD, error, XML_ERR_ERROR,
59*7c568831SAndroid Build Coastguard Worker                str1, str2, NULL, 0, msg, str1, str2);
60*7c568831SAndroid Build Coastguard Worker     if (ctxt != NULL)
61*7c568831SAndroid Build Coastguard Worker 	ctxt->valid = 0;
62*7c568831SAndroid Build Coastguard Worker }
63*7c568831SAndroid Build Coastguard Worker 
64*7c568831SAndroid Build Coastguard Worker /**
65*7c568831SAndroid Build Coastguard Worker  * xmlFatalErrMsg:
66*7c568831SAndroid Build Coastguard Worker  * @ctxt:  an XML parser context
67*7c568831SAndroid Build Coastguard Worker  * @error:  the error number
68*7c568831SAndroid Build Coastguard Worker  * @msg:  the error message
69*7c568831SAndroid Build Coastguard Worker  * @str1:  an error string
70*7c568831SAndroid Build Coastguard Worker  * @str2:  an error string
71*7c568831SAndroid Build Coastguard Worker  *
72*7c568831SAndroid Build Coastguard Worker  * Handle a fatal parser error, i.e. violating Well-Formedness constraints
73*7c568831SAndroid Build Coastguard Worker  */
74*7c568831SAndroid Build Coastguard Worker static void LIBXML_ATTR_FORMAT(3,0)
xmlFatalErrMsg(xmlParserCtxtPtr ctxt,xmlParserErrors error,const char * msg,const xmlChar * str1,const xmlChar * str2)75*7c568831SAndroid Build Coastguard Worker xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error,
76*7c568831SAndroid Build Coastguard Worker                const char *msg, const xmlChar *str1, const xmlChar *str2)
77*7c568831SAndroid Build Coastguard Worker {
78*7c568831SAndroid Build Coastguard Worker     xmlCtxtErr(ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL,
79*7c568831SAndroid Build Coastguard Worker                str1, str2, NULL, 0, msg, str1, str2);
80*7c568831SAndroid Build Coastguard Worker }
81*7c568831SAndroid Build Coastguard Worker 
82*7c568831SAndroid Build Coastguard Worker /**
83*7c568831SAndroid Build Coastguard Worker  * xmlWarnMsg:
84*7c568831SAndroid Build Coastguard Worker  * @ctxt:  an XML parser context
85*7c568831SAndroid Build Coastguard Worker  * @error:  the error number
86*7c568831SAndroid Build Coastguard Worker  * @msg:  the error message
87*7c568831SAndroid Build Coastguard Worker  * @str1:  an error string
88*7c568831SAndroid Build Coastguard Worker  * @str2:  an error string
89*7c568831SAndroid Build Coastguard Worker  *
90*7c568831SAndroid Build Coastguard Worker  * Handle a parser warning
91*7c568831SAndroid Build Coastguard Worker  */
92*7c568831SAndroid Build Coastguard Worker static void LIBXML_ATTR_FORMAT(3,0)
xmlWarnMsg(xmlParserCtxtPtr ctxt,xmlParserErrors error,const char * msg,const xmlChar * str1)93*7c568831SAndroid Build Coastguard Worker xmlWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error,
94*7c568831SAndroid Build Coastguard Worker                const char *msg, const xmlChar *str1)
95*7c568831SAndroid Build Coastguard Worker {
96*7c568831SAndroid Build Coastguard Worker     xmlCtxtErr(ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_WARNING,
97*7c568831SAndroid Build Coastguard Worker                str1, NULL, NULL, 0, msg, str1);
98*7c568831SAndroid Build Coastguard Worker }
99*7c568831SAndroid Build Coastguard Worker 
100*7c568831SAndroid Build Coastguard Worker /**
101*7c568831SAndroid Build Coastguard Worker  * xmlNsWarnMsg:
102*7c568831SAndroid Build Coastguard Worker  * @ctxt:  an XML parser context
103*7c568831SAndroid Build Coastguard Worker  * @error:  the error number
104*7c568831SAndroid Build Coastguard Worker  * @msg:  the error message
105*7c568831SAndroid Build Coastguard Worker  * @str1:  an error string
106*7c568831SAndroid Build Coastguard Worker  *
107*7c568831SAndroid Build Coastguard Worker  * Handle a namespace warning
108*7c568831SAndroid Build Coastguard Worker  */
109*7c568831SAndroid Build Coastguard Worker static void LIBXML_ATTR_FORMAT(3,0)
xmlNsWarnMsg(xmlParserCtxtPtr ctxt,xmlParserErrors error,const char * msg,const xmlChar * str1,const xmlChar * str2)110*7c568831SAndroid Build Coastguard Worker xmlNsWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error,
111*7c568831SAndroid Build Coastguard Worker              const char *msg, const xmlChar *str1, const xmlChar *str2)
112*7c568831SAndroid Build Coastguard Worker {
113*7c568831SAndroid Build Coastguard Worker     xmlCtxtErr(ctxt, NULL, XML_FROM_NAMESPACE, error, XML_ERR_WARNING,
114*7c568831SAndroid Build Coastguard Worker                str1, str2, NULL, 0, msg, str1, str2);
115*7c568831SAndroid Build Coastguard Worker }
116*7c568831SAndroid Build Coastguard Worker 
117*7c568831SAndroid Build Coastguard Worker /**
118*7c568831SAndroid Build Coastguard Worker  * xmlSAX2GetPublicId:
119*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
120*7c568831SAndroid Build Coastguard Worker  *
121*7c568831SAndroid Build Coastguard Worker  * Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN"
122*7c568831SAndroid Build Coastguard Worker  *
123*7c568831SAndroid Build Coastguard Worker  * Returns a xmlChar *
124*7c568831SAndroid Build Coastguard Worker  */
125*7c568831SAndroid Build Coastguard Worker const xmlChar *
xmlSAX2GetPublicId(void * ctx ATTRIBUTE_UNUSED)126*7c568831SAndroid Build Coastguard Worker xmlSAX2GetPublicId(void *ctx ATTRIBUTE_UNUSED)
127*7c568831SAndroid Build Coastguard Worker {
128*7c568831SAndroid Build Coastguard Worker     /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
129*7c568831SAndroid Build Coastguard Worker     return(NULL);
130*7c568831SAndroid Build Coastguard Worker }
131*7c568831SAndroid Build Coastguard Worker 
132*7c568831SAndroid Build Coastguard Worker /**
133*7c568831SAndroid Build Coastguard Worker  * xmlSAX2GetSystemId:
134*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
135*7c568831SAndroid Build Coastguard Worker  *
136*7c568831SAndroid Build Coastguard Worker  * Provides the system ID, basically URL or filename e.g.
137*7c568831SAndroid Build Coastguard Worker  * http://www.sgmlsource.com/dtds/memo.dtd
138*7c568831SAndroid Build Coastguard Worker  *
139*7c568831SAndroid Build Coastguard Worker  * Returns a xmlChar *
140*7c568831SAndroid Build Coastguard Worker  */
141*7c568831SAndroid Build Coastguard Worker const xmlChar *
xmlSAX2GetSystemId(void * ctx)142*7c568831SAndroid Build Coastguard Worker xmlSAX2GetSystemId(void *ctx)
143*7c568831SAndroid Build Coastguard Worker {
144*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
145*7c568831SAndroid Build Coastguard Worker     if ((ctx == NULL) || (ctxt->input == NULL)) return(NULL);
146*7c568831SAndroid Build Coastguard Worker     return((const xmlChar *) ctxt->input->filename);
147*7c568831SAndroid Build Coastguard Worker }
148*7c568831SAndroid Build Coastguard Worker 
149*7c568831SAndroid Build Coastguard Worker /**
150*7c568831SAndroid Build Coastguard Worker  * xmlSAX2GetLineNumber:
151*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
152*7c568831SAndroid Build Coastguard Worker  *
153*7c568831SAndroid Build Coastguard Worker  * Provide the line number of the current parsing point.
154*7c568831SAndroid Build Coastguard Worker  *
155*7c568831SAndroid Build Coastguard Worker  * Returns an int
156*7c568831SAndroid Build Coastguard Worker  */
157*7c568831SAndroid Build Coastguard Worker int
xmlSAX2GetLineNumber(void * ctx)158*7c568831SAndroid Build Coastguard Worker xmlSAX2GetLineNumber(void *ctx)
159*7c568831SAndroid Build Coastguard Worker {
160*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
161*7c568831SAndroid Build Coastguard Worker     if ((ctx == NULL) || (ctxt->input == NULL)) return(0);
162*7c568831SAndroid Build Coastguard Worker     return(ctxt->input->line);
163*7c568831SAndroid Build Coastguard Worker }
164*7c568831SAndroid Build Coastguard Worker 
165*7c568831SAndroid Build Coastguard Worker /**
166*7c568831SAndroid Build Coastguard Worker  * xmlSAX2GetColumnNumber:
167*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
168*7c568831SAndroid Build Coastguard Worker  *
169*7c568831SAndroid Build Coastguard Worker  * Provide the column number of the current parsing point.
170*7c568831SAndroid Build Coastguard Worker  *
171*7c568831SAndroid Build Coastguard Worker  * Returns an int
172*7c568831SAndroid Build Coastguard Worker  */
173*7c568831SAndroid Build Coastguard Worker int
xmlSAX2GetColumnNumber(void * ctx)174*7c568831SAndroid Build Coastguard Worker xmlSAX2GetColumnNumber(void *ctx)
175*7c568831SAndroid Build Coastguard Worker {
176*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
177*7c568831SAndroid Build Coastguard Worker     if ((ctx == NULL) || (ctxt->input == NULL)) return(0);
178*7c568831SAndroid Build Coastguard Worker     return(ctxt->input->col);
179*7c568831SAndroid Build Coastguard Worker }
180*7c568831SAndroid Build Coastguard Worker 
181*7c568831SAndroid Build Coastguard Worker /**
182*7c568831SAndroid Build Coastguard Worker  * xmlSAX2IsStandalone:
183*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
184*7c568831SAndroid Build Coastguard Worker  *
185*7c568831SAndroid Build Coastguard Worker  * Is this document tagged standalone ?
186*7c568831SAndroid Build Coastguard Worker  *
187*7c568831SAndroid Build Coastguard Worker  * Returns 1 if true
188*7c568831SAndroid Build Coastguard Worker  */
189*7c568831SAndroid Build Coastguard Worker int
xmlSAX2IsStandalone(void * ctx)190*7c568831SAndroid Build Coastguard Worker xmlSAX2IsStandalone(void *ctx)
191*7c568831SAndroid Build Coastguard Worker {
192*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
193*7c568831SAndroid Build Coastguard Worker     if ((ctx == NULL) || (ctxt->myDoc == NULL)) return(0);
194*7c568831SAndroid Build Coastguard Worker     return(ctxt->myDoc->standalone == 1);
195*7c568831SAndroid Build Coastguard Worker }
196*7c568831SAndroid Build Coastguard Worker 
197*7c568831SAndroid Build Coastguard Worker /**
198*7c568831SAndroid Build Coastguard Worker  * xmlSAX2HasInternalSubset:
199*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
200*7c568831SAndroid Build Coastguard Worker  *
201*7c568831SAndroid Build Coastguard Worker  * Does this document has an internal subset
202*7c568831SAndroid Build Coastguard Worker  *
203*7c568831SAndroid Build Coastguard Worker  * Returns 1 if true
204*7c568831SAndroid Build Coastguard Worker  */
205*7c568831SAndroid Build Coastguard Worker int
xmlSAX2HasInternalSubset(void * ctx)206*7c568831SAndroid Build Coastguard Worker xmlSAX2HasInternalSubset(void *ctx)
207*7c568831SAndroid Build Coastguard Worker {
208*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
209*7c568831SAndroid Build Coastguard Worker     if ((ctxt == NULL) || (ctxt->myDoc == NULL)) return(0);
210*7c568831SAndroid Build Coastguard Worker     return(ctxt->myDoc->intSubset != NULL);
211*7c568831SAndroid Build Coastguard Worker }
212*7c568831SAndroid Build Coastguard Worker 
213*7c568831SAndroid Build Coastguard Worker /**
214*7c568831SAndroid Build Coastguard Worker  * xmlSAX2HasExternalSubset:
215*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
216*7c568831SAndroid Build Coastguard Worker  *
217*7c568831SAndroid Build Coastguard Worker  * Does this document has an external subset
218*7c568831SAndroid Build Coastguard Worker  *
219*7c568831SAndroid Build Coastguard Worker  * Returns 1 if true
220*7c568831SAndroid Build Coastguard Worker  */
221*7c568831SAndroid Build Coastguard Worker int
xmlSAX2HasExternalSubset(void * ctx)222*7c568831SAndroid Build Coastguard Worker xmlSAX2HasExternalSubset(void *ctx)
223*7c568831SAndroid Build Coastguard Worker {
224*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
225*7c568831SAndroid Build Coastguard Worker     if ((ctxt == NULL) || (ctxt->myDoc == NULL)) return(0);
226*7c568831SAndroid Build Coastguard Worker     return(ctxt->myDoc->extSubset != NULL);
227*7c568831SAndroid Build Coastguard Worker }
228*7c568831SAndroid Build Coastguard Worker 
229*7c568831SAndroid Build Coastguard Worker /**
230*7c568831SAndroid Build Coastguard Worker  * xmlSAX2InternalSubset:
231*7c568831SAndroid Build Coastguard Worker  * @ctx:  the user data (XML parser context)
232*7c568831SAndroid Build Coastguard Worker  * @name:  the root element name
233*7c568831SAndroid Build Coastguard Worker  * @ExternalID:  the external ID
234*7c568831SAndroid Build Coastguard Worker  * @SystemID:  the SYSTEM ID (e.g. filename or URL)
235*7c568831SAndroid Build Coastguard Worker  *
236*7c568831SAndroid Build Coastguard Worker  * Callback on internal subset declaration.
237*7c568831SAndroid Build Coastguard Worker  */
238*7c568831SAndroid Build Coastguard Worker void
xmlSAX2InternalSubset(void * ctx,const xmlChar * name,const xmlChar * ExternalID,const xmlChar * SystemID)239*7c568831SAndroid Build Coastguard Worker xmlSAX2InternalSubset(void *ctx, const xmlChar *name,
240*7c568831SAndroid Build Coastguard Worker 	       const xmlChar *ExternalID, const xmlChar *SystemID)
241*7c568831SAndroid Build Coastguard Worker {
242*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
243*7c568831SAndroid Build Coastguard Worker     xmlDtdPtr dtd;
244*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return;
245*7c568831SAndroid Build Coastguard Worker 
246*7c568831SAndroid Build Coastguard Worker     if (ctxt->myDoc == NULL)
247*7c568831SAndroid Build Coastguard Worker 	return;
248*7c568831SAndroid Build Coastguard Worker     if ((ctxt->html) && (ctxt->instate != XML_PARSER_MISC))
249*7c568831SAndroid Build Coastguard Worker         return;
250*7c568831SAndroid Build Coastguard Worker     dtd = xmlGetIntSubset(ctxt->myDoc);
251*7c568831SAndroid Build Coastguard Worker     if (dtd != NULL) {
252*7c568831SAndroid Build Coastguard Worker 	xmlUnlinkNode((xmlNodePtr) dtd);
253*7c568831SAndroid Build Coastguard Worker 	xmlFreeDtd(dtd);
254*7c568831SAndroid Build Coastguard Worker 	ctxt->myDoc->intSubset = NULL;
255*7c568831SAndroid Build Coastguard Worker     }
256*7c568831SAndroid Build Coastguard Worker     ctxt->myDoc->intSubset =
257*7c568831SAndroid Build Coastguard Worker 	xmlCreateIntSubset(ctxt->myDoc, name, ExternalID, SystemID);
258*7c568831SAndroid Build Coastguard Worker     if (ctxt->myDoc->intSubset == NULL)
259*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
260*7c568831SAndroid Build Coastguard Worker }
261*7c568831SAndroid Build Coastguard Worker 
262*7c568831SAndroid Build Coastguard Worker /**
263*7c568831SAndroid Build Coastguard Worker  * xmlSAX2ExternalSubset:
264*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
265*7c568831SAndroid Build Coastguard Worker  * @name:  the root element name
266*7c568831SAndroid Build Coastguard Worker  * @ExternalID:  the external ID
267*7c568831SAndroid Build Coastguard Worker  * @SystemID:  the SYSTEM ID (e.g. filename or URL)
268*7c568831SAndroid Build Coastguard Worker  *
269*7c568831SAndroid Build Coastguard Worker  * Callback on external subset declaration.
270*7c568831SAndroid Build Coastguard Worker  */
271*7c568831SAndroid Build Coastguard Worker void
xmlSAX2ExternalSubset(void * ctx,const xmlChar * name,const xmlChar * ExternalID,const xmlChar * SystemID)272*7c568831SAndroid Build Coastguard Worker xmlSAX2ExternalSubset(void *ctx, const xmlChar *name,
273*7c568831SAndroid Build Coastguard Worker 	       const xmlChar *ExternalID, const xmlChar *SystemID)
274*7c568831SAndroid Build Coastguard Worker {
275*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
276*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return;
277*7c568831SAndroid Build Coastguard Worker     if ((SystemID != NULL) &&
278*7c568831SAndroid Build Coastguard Worker         ((ctxt->options & XML_PARSE_NO_XXE) == 0) &&
279*7c568831SAndroid Build Coastguard Worker         (((ctxt->validate) || (ctxt->loadsubset)) &&
280*7c568831SAndroid Build Coastguard Worker 	 (ctxt->wellFormed && ctxt->myDoc))) {
281*7c568831SAndroid Build Coastguard Worker 	/*
282*7c568831SAndroid Build Coastguard Worker 	 * Try to fetch and parse the external subset.
283*7c568831SAndroid Build Coastguard Worker 	 */
284*7c568831SAndroid Build Coastguard Worker 	xmlParserInputPtr oldinput;
285*7c568831SAndroid Build Coastguard Worker 	int oldinputNr;
286*7c568831SAndroid Build Coastguard Worker 	int oldinputMax;
287*7c568831SAndroid Build Coastguard Worker 	xmlParserInputPtr *oldinputTab;
288*7c568831SAndroid Build Coastguard Worker 	xmlParserInputPtr input = NULL;
289*7c568831SAndroid Build Coastguard Worker 	const xmlChar *oldencoding;
290*7c568831SAndroid Build Coastguard Worker         unsigned long consumed;
291*7c568831SAndroid Build Coastguard Worker         size_t buffered;
292*7c568831SAndroid Build Coastguard Worker 
293*7c568831SAndroid Build Coastguard Worker 	/*
294*7c568831SAndroid Build Coastguard Worker 	 * Ask the Entity resolver to load the damn thing
295*7c568831SAndroid Build Coastguard Worker 	 */
296*7c568831SAndroid Build Coastguard Worker 	if ((ctxt->sax != NULL) && (ctxt->sax->resolveEntity != NULL))
297*7c568831SAndroid Build Coastguard Worker 	    input = ctxt->sax->resolveEntity(ctxt->userData, ExternalID,
298*7c568831SAndroid Build Coastguard Worker 	                                        SystemID);
299*7c568831SAndroid Build Coastguard Worker 	if (input == NULL) {
300*7c568831SAndroid Build Coastguard Worker 	    return;
301*7c568831SAndroid Build Coastguard Worker 	}
302*7c568831SAndroid Build Coastguard Worker 
303*7c568831SAndroid Build Coastguard Worker 	if (xmlNewDtd(ctxt->myDoc, name, ExternalID, SystemID) == NULL) {
304*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
305*7c568831SAndroid Build Coastguard Worker             xmlFreeInputStream(input);
306*7c568831SAndroid Build Coastguard Worker             return;
307*7c568831SAndroid Build Coastguard Worker         }
308*7c568831SAndroid Build Coastguard Worker 
309*7c568831SAndroid Build Coastguard Worker 	/*
310*7c568831SAndroid Build Coastguard Worker 	 * make sure we won't destroy the main document context
311*7c568831SAndroid Build Coastguard Worker 	 */
312*7c568831SAndroid Build Coastguard Worker 	oldinput = ctxt->input;
313*7c568831SAndroid Build Coastguard Worker 	oldinputNr = ctxt->inputNr;
314*7c568831SAndroid Build Coastguard Worker 	oldinputMax = ctxt->inputMax;
315*7c568831SAndroid Build Coastguard Worker 	oldinputTab = ctxt->inputTab;
316*7c568831SAndroid Build Coastguard Worker 	oldencoding = ctxt->encoding;
317*7c568831SAndroid Build Coastguard Worker 	ctxt->encoding = NULL;
318*7c568831SAndroid Build Coastguard Worker 
319*7c568831SAndroid Build Coastguard Worker 	ctxt->inputTab = (xmlParserInputPtr *)
320*7c568831SAndroid Build Coastguard Worker 	                 xmlMalloc(5 * sizeof(xmlParserInputPtr));
321*7c568831SAndroid Build Coastguard Worker 	if (ctxt->inputTab == NULL) {
322*7c568831SAndroid Build Coastguard Worker 	    xmlSAX2ErrMemory(ctxt);
323*7c568831SAndroid Build Coastguard Worker             goto error;
324*7c568831SAndroid Build Coastguard Worker 	}
325*7c568831SAndroid Build Coastguard Worker 	ctxt->inputNr = 0;
326*7c568831SAndroid Build Coastguard Worker 	ctxt->inputMax = 5;
327*7c568831SAndroid Build Coastguard Worker 	ctxt->input = NULL;
328*7c568831SAndroid Build Coastguard Worker 	if (xmlPushInput(ctxt, input) < 0)
329*7c568831SAndroid Build Coastguard Worker             goto error;
330*7c568831SAndroid Build Coastguard Worker 
331*7c568831SAndroid Build Coastguard Worker 	if (input->filename == NULL)
332*7c568831SAndroid Build Coastguard Worker 	    input->filename = (char *) xmlCanonicPath(SystemID);
333*7c568831SAndroid Build Coastguard Worker 	input->line = 1;
334*7c568831SAndroid Build Coastguard Worker 	input->col = 1;
335*7c568831SAndroid Build Coastguard Worker 	input->base = ctxt->input->cur;
336*7c568831SAndroid Build Coastguard Worker 	input->cur = ctxt->input->cur;
337*7c568831SAndroid Build Coastguard Worker 	input->free = NULL;
338*7c568831SAndroid Build Coastguard Worker 
339*7c568831SAndroid Build Coastguard Worker 	/*
340*7c568831SAndroid Build Coastguard Worker 	 * let's parse that entity knowing it's an external subset.
341*7c568831SAndroid Build Coastguard Worker 	 */
342*7c568831SAndroid Build Coastguard Worker 	xmlParseExternalSubset(ctxt, ExternalID, SystemID);
343*7c568831SAndroid Build Coastguard Worker 
344*7c568831SAndroid Build Coastguard Worker         /*
345*7c568831SAndroid Build Coastguard Worker 	 * Free up the external entities
346*7c568831SAndroid Build Coastguard Worker 	 */
347*7c568831SAndroid Build Coastguard Worker 
348*7c568831SAndroid Build Coastguard Worker 	while (ctxt->inputNr > 1)
349*7c568831SAndroid Build Coastguard Worker 	    xmlPopInput(ctxt);
350*7c568831SAndroid Build Coastguard Worker 
351*7c568831SAndroid Build Coastguard Worker         consumed = ctxt->input->consumed;
352*7c568831SAndroid Build Coastguard Worker         buffered = ctxt->input->cur - ctxt->input->base;
353*7c568831SAndroid Build Coastguard Worker         if (buffered > ULONG_MAX - consumed)
354*7c568831SAndroid Build Coastguard Worker             consumed = ULONG_MAX;
355*7c568831SAndroid Build Coastguard Worker         else
356*7c568831SAndroid Build Coastguard Worker             consumed += buffered;
357*7c568831SAndroid Build Coastguard Worker         if (consumed > ULONG_MAX - ctxt->sizeentities)
358*7c568831SAndroid Build Coastguard Worker             ctxt->sizeentities = ULONG_MAX;
359*7c568831SAndroid Build Coastguard Worker         else
360*7c568831SAndroid Build Coastguard Worker             ctxt->sizeentities += consumed;
361*7c568831SAndroid Build Coastguard Worker 
362*7c568831SAndroid Build Coastguard Worker error:
363*7c568831SAndroid Build Coastguard Worker 	xmlFreeInputStream(input);
364*7c568831SAndroid Build Coastguard Worker         xmlFree(ctxt->inputTab);
365*7c568831SAndroid Build Coastguard Worker 
366*7c568831SAndroid Build Coastguard Worker 	/*
367*7c568831SAndroid Build Coastguard Worker 	 * Restore the parsing context of the main entity
368*7c568831SAndroid Build Coastguard Worker 	 */
369*7c568831SAndroid Build Coastguard Worker 	ctxt->input = oldinput;
370*7c568831SAndroid Build Coastguard Worker 	ctxt->inputNr = oldinputNr;
371*7c568831SAndroid Build Coastguard Worker 	ctxt->inputMax = oldinputMax;
372*7c568831SAndroid Build Coastguard Worker 	ctxt->inputTab = oldinputTab;
373*7c568831SAndroid Build Coastguard Worker 	if ((ctxt->encoding != NULL) &&
374*7c568831SAndroid Build Coastguard Worker 	    ((ctxt->dict == NULL) ||
375*7c568831SAndroid Build Coastguard Worker 	     (!xmlDictOwns(ctxt->dict, ctxt->encoding))))
376*7c568831SAndroid Build Coastguard Worker 	    xmlFree((xmlChar *) ctxt->encoding);
377*7c568831SAndroid Build Coastguard Worker 	ctxt->encoding = oldencoding;
378*7c568831SAndroid Build Coastguard Worker 	/* ctxt->wellFormed = oldwellFormed; */
379*7c568831SAndroid Build Coastguard Worker     }
380*7c568831SAndroid Build Coastguard Worker }
381*7c568831SAndroid Build Coastguard Worker 
382*7c568831SAndroid Build Coastguard Worker /**
383*7c568831SAndroid Build Coastguard Worker  * xmlSAX2ResolveEntity:
384*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
385*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
386*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
387*7c568831SAndroid Build Coastguard Worker  *
388*7c568831SAndroid Build Coastguard Worker  * This is only used to load DTDs. The preferred way to install
389*7c568831SAndroid Build Coastguard Worker  * custom resolvers is xmlCtxtSetResourceLoader.
390*7c568831SAndroid Build Coastguard Worker  *
391*7c568831SAndroid Build Coastguard Worker  * Returns a parser input.
392*7c568831SAndroid Build Coastguard Worker  */
393*7c568831SAndroid Build Coastguard Worker xmlParserInputPtr
xmlSAX2ResolveEntity(void * ctx,const xmlChar * publicId,const xmlChar * systemId)394*7c568831SAndroid Build Coastguard Worker xmlSAX2ResolveEntity(void *ctx, const xmlChar *publicId,
395*7c568831SAndroid Build Coastguard Worker                      const xmlChar *systemId)
396*7c568831SAndroid Build Coastguard Worker {
397*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
398*7c568831SAndroid Build Coastguard Worker     xmlParserInputPtr ret = NULL;
399*7c568831SAndroid Build Coastguard Worker     xmlChar *URI;
400*7c568831SAndroid Build Coastguard Worker     const xmlChar *base = NULL;
401*7c568831SAndroid Build Coastguard Worker     int res;
402*7c568831SAndroid Build Coastguard Worker 
403*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return(NULL);
404*7c568831SAndroid Build Coastguard Worker     if (ctxt->input != NULL)
405*7c568831SAndroid Build Coastguard Worker 	base = BAD_CAST ctxt->input->filename;
406*7c568831SAndroid Build Coastguard Worker 
407*7c568831SAndroid Build Coastguard Worker     /*
408*7c568831SAndroid Build Coastguard Worker      * We don't really need the 'directory' struct member, but some
409*7c568831SAndroid Build Coastguard Worker      * users set it manually to a base URI for memory streams.
410*7c568831SAndroid Build Coastguard Worker      */
411*7c568831SAndroid Build Coastguard Worker     if (base == NULL)
412*7c568831SAndroid Build Coastguard Worker         base = BAD_CAST ctxt->directory;
413*7c568831SAndroid Build Coastguard Worker 
414*7c568831SAndroid Build Coastguard Worker     if ((xmlStrlen(systemId) > XML_MAX_URI_LENGTH) ||
415*7c568831SAndroid Build Coastguard Worker         (xmlStrlen(base) > XML_MAX_URI_LENGTH)) {
416*7c568831SAndroid Build Coastguard Worker         xmlFatalErr(ctxt, XML_ERR_RESOURCE_LIMIT, "URI too long");
417*7c568831SAndroid Build Coastguard Worker         return(NULL);
418*7c568831SAndroid Build Coastguard Worker     }
419*7c568831SAndroid Build Coastguard Worker     res = xmlBuildURISafe(systemId, base, &URI);
420*7c568831SAndroid Build Coastguard Worker     if (URI == NULL) {
421*7c568831SAndroid Build Coastguard Worker         if (res < 0)
422*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
423*7c568831SAndroid Build Coastguard Worker         else
424*7c568831SAndroid Build Coastguard Worker             xmlWarnMsg(ctxt, XML_ERR_INVALID_URI,
425*7c568831SAndroid Build Coastguard Worker                        "Can't resolve URI: %s\n", systemId);
426*7c568831SAndroid Build Coastguard Worker         return(NULL);
427*7c568831SAndroid Build Coastguard Worker     }
428*7c568831SAndroid Build Coastguard Worker     if (xmlStrlen(URI) > XML_MAX_URI_LENGTH) {
429*7c568831SAndroid Build Coastguard Worker         xmlFatalErr(ctxt, XML_ERR_RESOURCE_LIMIT, "URI too long");
430*7c568831SAndroid Build Coastguard Worker     } else {
431*7c568831SAndroid Build Coastguard Worker         ret = xmlLoadResource(ctxt, (const char *) URI,
432*7c568831SAndroid Build Coastguard Worker                               (const char *) publicId, XML_RESOURCE_DTD);
433*7c568831SAndroid Build Coastguard Worker     }
434*7c568831SAndroid Build Coastguard Worker 
435*7c568831SAndroid Build Coastguard Worker     xmlFree(URI);
436*7c568831SAndroid Build Coastguard Worker     return(ret);
437*7c568831SAndroid Build Coastguard Worker }
438*7c568831SAndroid Build Coastguard Worker 
439*7c568831SAndroid Build Coastguard Worker /**
440*7c568831SAndroid Build Coastguard Worker  * xmlSAX2GetEntity:
441*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
442*7c568831SAndroid Build Coastguard Worker  * @name: The entity name
443*7c568831SAndroid Build Coastguard Worker  *
444*7c568831SAndroid Build Coastguard Worker  * Get an entity by name
445*7c568831SAndroid Build Coastguard Worker  *
446*7c568831SAndroid Build Coastguard Worker  * Returns the xmlEntityPtr if found.
447*7c568831SAndroid Build Coastguard Worker  */
448*7c568831SAndroid Build Coastguard Worker xmlEntityPtr
xmlSAX2GetEntity(void * ctx,const xmlChar * name)449*7c568831SAndroid Build Coastguard Worker xmlSAX2GetEntity(void *ctx, const xmlChar *name)
450*7c568831SAndroid Build Coastguard Worker {
451*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
452*7c568831SAndroid Build Coastguard Worker     xmlEntityPtr ret = NULL;
453*7c568831SAndroid Build Coastguard Worker 
454*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return(NULL);
455*7c568831SAndroid Build Coastguard Worker 
456*7c568831SAndroid Build Coastguard Worker     if (ctxt->inSubset == 0) {
457*7c568831SAndroid Build Coastguard Worker 	ret = xmlGetPredefinedEntity(name);
458*7c568831SAndroid Build Coastguard Worker 	if (ret != NULL)
459*7c568831SAndroid Build Coastguard Worker 	    return(ret);
460*7c568831SAndroid Build Coastguard Worker     }
461*7c568831SAndroid Build Coastguard Worker     if ((ctxt->myDoc != NULL) && (ctxt->myDoc->standalone == 1)) {
462*7c568831SAndroid Build Coastguard Worker 	if (ctxt->inSubset == 2) {
463*7c568831SAndroid Build Coastguard Worker 	    ctxt->myDoc->standalone = 0;
464*7c568831SAndroid Build Coastguard Worker 	    ret = xmlGetDocEntity(ctxt->myDoc, name);
465*7c568831SAndroid Build Coastguard Worker 	    ctxt->myDoc->standalone = 1;
466*7c568831SAndroid Build Coastguard Worker 	} else {
467*7c568831SAndroid Build Coastguard Worker 	    ret = xmlGetDocEntity(ctxt->myDoc, name);
468*7c568831SAndroid Build Coastguard Worker 	    if (ret == NULL) {
469*7c568831SAndroid Build Coastguard Worker 		ctxt->myDoc->standalone = 0;
470*7c568831SAndroid Build Coastguard Worker 		ret = xmlGetDocEntity(ctxt->myDoc, name);
471*7c568831SAndroid Build Coastguard Worker 		if (ret != NULL) {
472*7c568831SAndroid Build Coastguard Worker 		    xmlFatalErrMsg(ctxt, XML_ERR_NOT_STANDALONE,
473*7c568831SAndroid Build Coastguard Worker 	 "Entity(%s) document marked standalone but requires external subset\n",
474*7c568831SAndroid Build Coastguard Worker 				   name, NULL);
475*7c568831SAndroid Build Coastguard Worker 		}
476*7c568831SAndroid Build Coastguard Worker 		ctxt->myDoc->standalone = 1;
477*7c568831SAndroid Build Coastguard Worker 	    }
478*7c568831SAndroid Build Coastguard Worker 	}
479*7c568831SAndroid Build Coastguard Worker     } else {
480*7c568831SAndroid Build Coastguard Worker 	ret = xmlGetDocEntity(ctxt->myDoc, name);
481*7c568831SAndroid Build Coastguard Worker     }
482*7c568831SAndroid Build Coastguard Worker     return(ret);
483*7c568831SAndroid Build Coastguard Worker }
484*7c568831SAndroid Build Coastguard Worker 
485*7c568831SAndroid Build Coastguard Worker /**
486*7c568831SAndroid Build Coastguard Worker  * xmlSAX2GetParameterEntity:
487*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
488*7c568831SAndroid Build Coastguard Worker  * @name: The entity name
489*7c568831SAndroid Build Coastguard Worker  *
490*7c568831SAndroid Build Coastguard Worker  * Get a parameter entity by name
491*7c568831SAndroid Build Coastguard Worker  *
492*7c568831SAndroid Build Coastguard Worker  * Returns the xmlEntityPtr if found.
493*7c568831SAndroid Build Coastguard Worker  */
494*7c568831SAndroid Build Coastguard Worker xmlEntityPtr
xmlSAX2GetParameterEntity(void * ctx,const xmlChar * name)495*7c568831SAndroid Build Coastguard Worker xmlSAX2GetParameterEntity(void *ctx, const xmlChar *name)
496*7c568831SAndroid Build Coastguard Worker {
497*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
498*7c568831SAndroid Build Coastguard Worker     xmlEntityPtr ret;
499*7c568831SAndroid Build Coastguard Worker 
500*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return(NULL);
501*7c568831SAndroid Build Coastguard Worker 
502*7c568831SAndroid Build Coastguard Worker     ret = xmlGetParameterEntity(ctxt->myDoc, name);
503*7c568831SAndroid Build Coastguard Worker     return(ret);
504*7c568831SAndroid Build Coastguard Worker }
505*7c568831SAndroid Build Coastguard Worker 
506*7c568831SAndroid Build Coastguard Worker 
507*7c568831SAndroid Build Coastguard Worker /**
508*7c568831SAndroid Build Coastguard Worker  * xmlSAX2EntityDecl:
509*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
510*7c568831SAndroid Build Coastguard Worker  * @name:  the entity name
511*7c568831SAndroid Build Coastguard Worker  * @type:  the entity type
512*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
513*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
514*7c568831SAndroid Build Coastguard Worker  * @content: the entity value (without processing).
515*7c568831SAndroid Build Coastguard Worker  *
516*7c568831SAndroid Build Coastguard Worker  * An entity definition has been parsed
517*7c568831SAndroid Build Coastguard Worker  */
518*7c568831SAndroid Build Coastguard Worker void
xmlSAX2EntityDecl(void * ctx,const xmlChar * name,int type,const xmlChar * publicId,const xmlChar * systemId,xmlChar * content)519*7c568831SAndroid Build Coastguard Worker xmlSAX2EntityDecl(void *ctx, const xmlChar *name, int type,
520*7c568831SAndroid Build Coastguard Worker           const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
521*7c568831SAndroid Build Coastguard Worker {
522*7c568831SAndroid Build Coastguard Worker     xmlEntityPtr ent;
523*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
524*7c568831SAndroid Build Coastguard Worker     int extSubset;
525*7c568831SAndroid Build Coastguard Worker     int res;
526*7c568831SAndroid Build Coastguard Worker 
527*7c568831SAndroid Build Coastguard Worker     if ((ctxt == NULL) || (ctxt->myDoc == NULL))
528*7c568831SAndroid Build Coastguard Worker         return;
529*7c568831SAndroid Build Coastguard Worker 
530*7c568831SAndroid Build Coastguard Worker     extSubset = ctxt->inSubset == 2;
531*7c568831SAndroid Build Coastguard Worker     res = xmlAddEntity(ctxt->myDoc, extSubset, name, type, publicId, systemId,
532*7c568831SAndroid Build Coastguard Worker                        content, &ent);
533*7c568831SAndroid Build Coastguard Worker     switch (res) {
534*7c568831SAndroid Build Coastguard Worker         case XML_ERR_OK:
535*7c568831SAndroid Build Coastguard Worker             break;
536*7c568831SAndroid Build Coastguard Worker         case XML_ERR_NO_MEMORY:
537*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
538*7c568831SAndroid Build Coastguard Worker             return;
539*7c568831SAndroid Build Coastguard Worker         case XML_WAR_ENTITY_REDEFINED:
540*7c568831SAndroid Build Coastguard Worker             if (ctxt->pedantic) {
541*7c568831SAndroid Build Coastguard Worker                 if (extSubset)
542*7c568831SAndroid Build Coastguard Worker                     xmlWarnMsg(ctxt, res, "Entity(%s) already defined in the"
543*7c568831SAndroid Build Coastguard Worker                                " external subset\n", name);
544*7c568831SAndroid Build Coastguard Worker                 else
545*7c568831SAndroid Build Coastguard Worker                     xmlWarnMsg(ctxt, res, "Entity(%s) already defined in the"
546*7c568831SAndroid Build Coastguard Worker                                " internal subset\n", name);
547*7c568831SAndroid Build Coastguard Worker             }
548*7c568831SAndroid Build Coastguard Worker             return;
549*7c568831SAndroid Build Coastguard Worker         case XML_ERR_REDECL_PREDEF_ENTITY:
550*7c568831SAndroid Build Coastguard Worker             /*
551*7c568831SAndroid Build Coastguard Worker              * Technically an error but it's a common mistake to get double
552*7c568831SAndroid Build Coastguard Worker              * escaping according to "4.6 Predefined Entities" wrong.
553*7c568831SAndroid Build Coastguard Worker              */
554*7c568831SAndroid Build Coastguard Worker             xmlWarnMsg(ctxt, res, "Invalid redeclaration of predefined"
555*7c568831SAndroid Build Coastguard Worker                        " entity '%s'", name);
556*7c568831SAndroid Build Coastguard Worker             return;
557*7c568831SAndroid Build Coastguard Worker         default:
558*7c568831SAndroid Build Coastguard Worker             xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR,
559*7c568831SAndroid Build Coastguard Worker                            "Unexpected error code from xmlAddEntity\n",
560*7c568831SAndroid Build Coastguard Worker                            NULL, NULL);
561*7c568831SAndroid Build Coastguard Worker             return;
562*7c568831SAndroid Build Coastguard Worker     }
563*7c568831SAndroid Build Coastguard Worker 
564*7c568831SAndroid Build Coastguard Worker     if ((ent->URI == NULL) && (systemId != NULL)) {
565*7c568831SAndroid Build Coastguard Worker         xmlChar *URI;
566*7c568831SAndroid Build Coastguard Worker         const char *base = NULL;
567*7c568831SAndroid Build Coastguard Worker         int i;
568*7c568831SAndroid Build Coastguard Worker 
569*7c568831SAndroid Build Coastguard Worker         for (i = ctxt->inputNr - 1; i >= 0; i--) {
570*7c568831SAndroid Build Coastguard Worker             if (ctxt->inputTab[i]->filename != NULL) {
571*7c568831SAndroid Build Coastguard Worker                 base = ctxt->inputTab[i]->filename;
572*7c568831SAndroid Build Coastguard Worker                 break;
573*7c568831SAndroid Build Coastguard Worker             }
574*7c568831SAndroid Build Coastguard Worker         }
575*7c568831SAndroid Build Coastguard Worker 
576*7c568831SAndroid Build Coastguard Worker         /*
577*7c568831SAndroid Build Coastguard Worker          * We don't really need the 'directory' struct member, but some
578*7c568831SAndroid Build Coastguard Worker          * users set it manually to a base URI for memory streams.
579*7c568831SAndroid Build Coastguard Worker          */
580*7c568831SAndroid Build Coastguard Worker         if (base == NULL)
581*7c568831SAndroid Build Coastguard Worker             base = ctxt->directory;
582*7c568831SAndroid Build Coastguard Worker 
583*7c568831SAndroid Build Coastguard Worker         res = xmlBuildURISafe(systemId, (const xmlChar *) base, &URI);
584*7c568831SAndroid Build Coastguard Worker 
585*7c568831SAndroid Build Coastguard Worker         if (URI == NULL) {
586*7c568831SAndroid Build Coastguard Worker             if (res < 0) {
587*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
588*7c568831SAndroid Build Coastguard Worker             } else {
589*7c568831SAndroid Build Coastguard Worker                 xmlWarnMsg(ctxt, XML_ERR_INVALID_URI,
590*7c568831SAndroid Build Coastguard Worker                            "Can't resolve URI: %s\n", systemId);
591*7c568831SAndroid Build Coastguard Worker             }
592*7c568831SAndroid Build Coastguard Worker         } else if (xmlStrlen(URI) > XML_MAX_URI_LENGTH) {
593*7c568831SAndroid Build Coastguard Worker             xmlFatalErr(ctxt, XML_ERR_RESOURCE_LIMIT, "URI too long");
594*7c568831SAndroid Build Coastguard Worker             xmlFree(URI);
595*7c568831SAndroid Build Coastguard Worker         } else {
596*7c568831SAndroid Build Coastguard Worker             ent->URI = URI;
597*7c568831SAndroid Build Coastguard Worker         }
598*7c568831SAndroid Build Coastguard Worker     }
599*7c568831SAndroid Build Coastguard Worker }
600*7c568831SAndroid Build Coastguard Worker 
601*7c568831SAndroid Build Coastguard Worker /**
602*7c568831SAndroid Build Coastguard Worker  * xmlSAX2AttributeDecl:
603*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
604*7c568831SAndroid Build Coastguard Worker  * @elem:  the name of the element
605*7c568831SAndroid Build Coastguard Worker  * @fullname:  the attribute name
606*7c568831SAndroid Build Coastguard Worker  * @type:  the attribute type
607*7c568831SAndroid Build Coastguard Worker  * @def:  the type of default value
608*7c568831SAndroid Build Coastguard Worker  * @defaultValue: the attribute default value
609*7c568831SAndroid Build Coastguard Worker  * @tree:  the tree of enumerated value set
610*7c568831SAndroid Build Coastguard Worker  *
611*7c568831SAndroid Build Coastguard Worker  * An attribute definition has been parsed
612*7c568831SAndroid Build Coastguard Worker  */
613*7c568831SAndroid Build Coastguard Worker void
xmlSAX2AttributeDecl(void * ctx,const xmlChar * elem,const xmlChar * fullname,int type,int def,const xmlChar * defaultValue,xmlEnumerationPtr tree)614*7c568831SAndroid Build Coastguard Worker xmlSAX2AttributeDecl(void *ctx, const xmlChar *elem, const xmlChar *fullname,
615*7c568831SAndroid Build Coastguard Worker               int type, int def, const xmlChar *defaultValue,
616*7c568831SAndroid Build Coastguard Worker 	      xmlEnumerationPtr tree)
617*7c568831SAndroid Build Coastguard Worker {
618*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
619*7c568831SAndroid Build Coastguard Worker     xmlAttributePtr attr;
620*7c568831SAndroid Build Coastguard Worker     const xmlChar *name = NULL;
621*7c568831SAndroid Build Coastguard Worker     xmlChar *prefix = NULL;
622*7c568831SAndroid Build Coastguard Worker 
623*7c568831SAndroid Build Coastguard Worker     /* Avoid unused variable warning if features are disabled. */
624*7c568831SAndroid Build Coastguard Worker     (void) attr;
625*7c568831SAndroid Build Coastguard Worker 
626*7c568831SAndroid Build Coastguard Worker     if ((ctxt == NULL) || (ctxt->myDoc == NULL))
627*7c568831SAndroid Build Coastguard Worker         return;
628*7c568831SAndroid Build Coastguard Worker 
629*7c568831SAndroid Build Coastguard Worker     if ((xmlStrEqual(fullname, BAD_CAST "xml:id")) &&
630*7c568831SAndroid Build Coastguard Worker         (type != XML_ATTRIBUTE_ID)) {
631*7c568831SAndroid Build Coastguard Worker 	/*
632*7c568831SAndroid Build Coastguard Worker 	 * Raise the error but keep the validity flag
633*7c568831SAndroid Build Coastguard Worker 	 */
634*7c568831SAndroid Build Coastguard Worker 	int tmp = ctxt->valid;
635*7c568831SAndroid Build Coastguard Worker 	xmlErrValid(ctxt, XML_DTD_XMLID_TYPE,
636*7c568831SAndroid Build Coastguard Worker 	      "xml:id : attribute type should be ID\n", NULL, NULL);
637*7c568831SAndroid Build Coastguard Worker 	ctxt->valid = tmp;
638*7c568831SAndroid Build Coastguard Worker     }
639*7c568831SAndroid Build Coastguard Worker     name = xmlSplitQName4(fullname, &prefix);
640*7c568831SAndroid Build Coastguard Worker     if (name == NULL)
641*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
642*7c568831SAndroid Build Coastguard Worker     ctxt->vctxt.valid = 1;
643*7c568831SAndroid Build Coastguard Worker     if (ctxt->inSubset == 1)
644*7c568831SAndroid Build Coastguard Worker 	attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, elem,
645*7c568831SAndroid Build Coastguard Worker 	       name, prefix, (xmlAttributeType) type,
646*7c568831SAndroid Build Coastguard Worker 	       (xmlAttributeDefault) def, defaultValue, tree);
647*7c568831SAndroid Build Coastguard Worker     else if (ctxt->inSubset == 2)
648*7c568831SAndroid Build Coastguard Worker 	attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, elem,
649*7c568831SAndroid Build Coastguard Worker 	   name, prefix, (xmlAttributeType) type,
650*7c568831SAndroid Build Coastguard Worker 	   (xmlAttributeDefault) def, defaultValue, tree);
651*7c568831SAndroid Build Coastguard Worker     else {
652*7c568831SAndroid Build Coastguard Worker         xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR,
653*7c568831SAndroid Build Coastguard Worker 	     "SAX.xmlSAX2AttributeDecl(%s) called while not in subset\n",
654*7c568831SAndroid Build Coastguard Worker 	               name, NULL);
655*7c568831SAndroid Build Coastguard Worker 	xmlFree(prefix);
656*7c568831SAndroid Build Coastguard Worker 	xmlFreeEnumeration(tree);
657*7c568831SAndroid Build Coastguard Worker 	return;
658*7c568831SAndroid Build Coastguard Worker     }
659*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
660*7c568831SAndroid Build Coastguard Worker     if (ctxt->vctxt.valid == 0)
661*7c568831SAndroid Build Coastguard Worker 	ctxt->valid = 0;
662*7c568831SAndroid Build Coastguard Worker     if ((attr != NULL) && (ctxt->validate) && (ctxt->wellFormed) &&
663*7c568831SAndroid Build Coastguard Worker         (ctxt->myDoc->intSubset != NULL))
664*7c568831SAndroid Build Coastguard Worker 	ctxt->valid &= xmlValidateAttributeDecl(&ctxt->vctxt, ctxt->myDoc,
665*7c568831SAndroid Build Coastguard Worker 	                                        attr);
666*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
667*7c568831SAndroid Build Coastguard Worker     if (prefix != NULL)
668*7c568831SAndroid Build Coastguard Worker 	xmlFree(prefix);
669*7c568831SAndroid Build Coastguard Worker }
670*7c568831SAndroid Build Coastguard Worker 
671*7c568831SAndroid Build Coastguard Worker /**
672*7c568831SAndroid Build Coastguard Worker  * xmlSAX2ElementDecl:
673*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
674*7c568831SAndroid Build Coastguard Worker  * @name:  the element name
675*7c568831SAndroid Build Coastguard Worker  * @type:  the element type
676*7c568831SAndroid Build Coastguard Worker  * @content: the element value tree
677*7c568831SAndroid Build Coastguard Worker  *
678*7c568831SAndroid Build Coastguard Worker  * An element definition has been parsed
679*7c568831SAndroid Build Coastguard Worker  */
680*7c568831SAndroid Build Coastguard Worker void
xmlSAX2ElementDecl(void * ctx,const xmlChar * name,int type,xmlElementContentPtr content)681*7c568831SAndroid Build Coastguard Worker xmlSAX2ElementDecl(void *ctx, const xmlChar * name, int type,
682*7c568831SAndroid Build Coastguard Worker             xmlElementContentPtr content)
683*7c568831SAndroid Build Coastguard Worker {
684*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
685*7c568831SAndroid Build Coastguard Worker     xmlElementPtr elem = NULL;
686*7c568831SAndroid Build Coastguard Worker 
687*7c568831SAndroid Build Coastguard Worker     /* Avoid unused variable warning if features are disabled. */
688*7c568831SAndroid Build Coastguard Worker     (void) elem;
689*7c568831SAndroid Build Coastguard Worker 
690*7c568831SAndroid Build Coastguard Worker     if ((ctxt == NULL) || (ctxt->myDoc == NULL))
691*7c568831SAndroid Build Coastguard Worker         return;
692*7c568831SAndroid Build Coastguard Worker 
693*7c568831SAndroid Build Coastguard Worker     if (ctxt->inSubset == 1)
694*7c568831SAndroid Build Coastguard Worker         elem = xmlAddElementDecl(&ctxt->vctxt, ctxt->myDoc->intSubset,
695*7c568831SAndroid Build Coastguard Worker                                  name, (xmlElementTypeVal) type, content);
696*7c568831SAndroid Build Coastguard Worker     else if (ctxt->inSubset == 2)
697*7c568831SAndroid Build Coastguard Worker         elem = xmlAddElementDecl(&ctxt->vctxt, ctxt->myDoc->extSubset,
698*7c568831SAndroid Build Coastguard Worker                                  name, (xmlElementTypeVal) type, content);
699*7c568831SAndroid Build Coastguard Worker     else {
700*7c568831SAndroid Build Coastguard Worker         xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR,
701*7c568831SAndroid Build Coastguard Worker 	     "SAX.xmlSAX2ElementDecl(%s) called while not in subset\n",
702*7c568831SAndroid Build Coastguard Worker 	               name, NULL);
703*7c568831SAndroid Build Coastguard Worker         return;
704*7c568831SAndroid Build Coastguard Worker     }
705*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
706*7c568831SAndroid Build Coastguard Worker     if (elem == NULL)
707*7c568831SAndroid Build Coastguard Worker         ctxt->valid = 0;
708*7c568831SAndroid Build Coastguard Worker     if (ctxt->validate && ctxt->wellFormed &&
709*7c568831SAndroid Build Coastguard Worker         ctxt->myDoc && ctxt->myDoc->intSubset)
710*7c568831SAndroid Build Coastguard Worker         ctxt->valid &=
711*7c568831SAndroid Build Coastguard Worker             xmlValidateElementDecl(&ctxt->vctxt, ctxt->myDoc, elem);
712*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
713*7c568831SAndroid Build Coastguard Worker }
714*7c568831SAndroid Build Coastguard Worker 
715*7c568831SAndroid Build Coastguard Worker /**
716*7c568831SAndroid Build Coastguard Worker  * xmlSAX2NotationDecl:
717*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
718*7c568831SAndroid Build Coastguard Worker  * @name: The name of the notation
719*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
720*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
721*7c568831SAndroid Build Coastguard Worker  *
722*7c568831SAndroid Build Coastguard Worker  * What to do when a notation declaration has been parsed.
723*7c568831SAndroid Build Coastguard Worker  */
724*7c568831SAndroid Build Coastguard Worker void
xmlSAX2NotationDecl(void * ctx,const xmlChar * name,const xmlChar * publicId,const xmlChar * systemId)725*7c568831SAndroid Build Coastguard Worker xmlSAX2NotationDecl(void *ctx, const xmlChar *name,
726*7c568831SAndroid Build Coastguard Worker 	     const xmlChar *publicId, const xmlChar *systemId)
727*7c568831SAndroid Build Coastguard Worker {
728*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
729*7c568831SAndroid Build Coastguard Worker     xmlNotationPtr nota = NULL;
730*7c568831SAndroid Build Coastguard Worker 
731*7c568831SAndroid Build Coastguard Worker     /* Avoid unused variable warning if features are disabled. */
732*7c568831SAndroid Build Coastguard Worker     (void) nota;
733*7c568831SAndroid Build Coastguard Worker 
734*7c568831SAndroid Build Coastguard Worker     if ((ctxt == NULL) || (ctxt->myDoc == NULL))
735*7c568831SAndroid Build Coastguard Worker         return;
736*7c568831SAndroid Build Coastguard Worker 
737*7c568831SAndroid Build Coastguard Worker     if ((publicId == NULL) && (systemId == NULL)) {
738*7c568831SAndroid Build Coastguard Worker 	xmlFatalErrMsg(ctxt, XML_ERR_NOTATION_PROCESSING,
739*7c568831SAndroid Build Coastguard Worker 	     "SAX.xmlSAX2NotationDecl(%s) externalID or PublicID missing\n",
740*7c568831SAndroid Build Coastguard Worker 	               name, NULL);
741*7c568831SAndroid Build Coastguard Worker 	return;
742*7c568831SAndroid Build Coastguard Worker     } else if (ctxt->inSubset == 1)
743*7c568831SAndroid Build Coastguard Worker 	nota = xmlAddNotationDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, name,
744*7c568831SAndroid Build Coastguard Worker                               publicId, systemId);
745*7c568831SAndroid Build Coastguard Worker     else if (ctxt->inSubset == 2)
746*7c568831SAndroid Build Coastguard Worker 	nota = xmlAddNotationDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, name,
747*7c568831SAndroid Build Coastguard Worker                               publicId, systemId);
748*7c568831SAndroid Build Coastguard Worker     else {
749*7c568831SAndroid Build Coastguard Worker 	xmlFatalErrMsg(ctxt, XML_ERR_NOTATION_PROCESSING,
750*7c568831SAndroid Build Coastguard Worker 	     "SAX.xmlSAX2NotationDecl(%s) called while not in subset\n",
751*7c568831SAndroid Build Coastguard Worker 	               name, NULL);
752*7c568831SAndroid Build Coastguard Worker 	return;
753*7c568831SAndroid Build Coastguard Worker     }
754*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
755*7c568831SAndroid Build Coastguard Worker     if (nota == NULL) ctxt->valid = 0;
756*7c568831SAndroid Build Coastguard Worker     if ((ctxt->validate) && (ctxt->wellFormed) &&
757*7c568831SAndroid Build Coastguard Worker         (ctxt->myDoc->intSubset != NULL))
758*7c568831SAndroid Build Coastguard Worker 	ctxt->valid &= xmlValidateNotationDecl(&ctxt->vctxt, ctxt->myDoc,
759*7c568831SAndroid Build Coastguard Worker 	                                       nota);
760*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
761*7c568831SAndroid Build Coastguard Worker }
762*7c568831SAndroid Build Coastguard Worker 
763*7c568831SAndroid Build Coastguard Worker /**
764*7c568831SAndroid Build Coastguard Worker  * xmlSAX2UnparsedEntityDecl:
765*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
766*7c568831SAndroid Build Coastguard Worker  * @name: The name of the entity
767*7c568831SAndroid Build Coastguard Worker  * @publicId: The public ID of the entity
768*7c568831SAndroid Build Coastguard Worker  * @systemId: The system ID of the entity
769*7c568831SAndroid Build Coastguard Worker  * @notationName: the name of the notation
770*7c568831SAndroid Build Coastguard Worker  *
771*7c568831SAndroid Build Coastguard Worker  * What to do when an unparsed entity declaration is parsed
772*7c568831SAndroid Build Coastguard Worker  */
773*7c568831SAndroid Build Coastguard Worker void
xmlSAX2UnparsedEntityDecl(void * ctx,const xmlChar * name,const xmlChar * publicId,const xmlChar * systemId,const xmlChar * notationName)774*7c568831SAndroid Build Coastguard Worker xmlSAX2UnparsedEntityDecl(void *ctx, const xmlChar *name,
775*7c568831SAndroid Build Coastguard Worker 		   const xmlChar *publicId, const xmlChar *systemId,
776*7c568831SAndroid Build Coastguard Worker 		   const xmlChar *notationName)
777*7c568831SAndroid Build Coastguard Worker {
778*7c568831SAndroid Build Coastguard Worker     xmlSAX2EntityDecl(ctx, name, XML_EXTERNAL_GENERAL_UNPARSED_ENTITY,
779*7c568831SAndroid Build Coastguard Worker                       publicId, systemId, (xmlChar *) notationName);
780*7c568831SAndroid Build Coastguard Worker }
781*7c568831SAndroid Build Coastguard Worker 
782*7c568831SAndroid Build Coastguard Worker /**
783*7c568831SAndroid Build Coastguard Worker  * xmlSAX2SetDocumentLocator:
784*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
785*7c568831SAndroid Build Coastguard Worker  * @loc: A SAX Locator
786*7c568831SAndroid Build Coastguard Worker  *
787*7c568831SAndroid Build Coastguard Worker  * Receive the document locator at startup, actually xmlDefaultSAXLocator
788*7c568831SAndroid Build Coastguard Worker  * Everything is available on the context, so this is useless in our case.
789*7c568831SAndroid Build Coastguard Worker  */
790*7c568831SAndroid Build Coastguard Worker void
xmlSAX2SetDocumentLocator(void * ctx ATTRIBUTE_UNUSED,xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)791*7c568831SAndroid Build Coastguard Worker xmlSAX2SetDocumentLocator(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
792*7c568831SAndroid Build Coastguard Worker {
793*7c568831SAndroid Build Coastguard Worker }
794*7c568831SAndroid Build Coastguard Worker 
795*7c568831SAndroid Build Coastguard Worker /**
796*7c568831SAndroid Build Coastguard Worker  * xmlSAX2StartDocument:
797*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
798*7c568831SAndroid Build Coastguard Worker  *
799*7c568831SAndroid Build Coastguard Worker  * called when the document start being processed.
800*7c568831SAndroid Build Coastguard Worker  */
801*7c568831SAndroid Build Coastguard Worker void
xmlSAX2StartDocument(void * ctx)802*7c568831SAndroid Build Coastguard Worker xmlSAX2StartDocument(void *ctx)
803*7c568831SAndroid Build Coastguard Worker {
804*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
805*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
806*7c568831SAndroid Build Coastguard Worker 
807*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return;
808*7c568831SAndroid Build Coastguard Worker 
809*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
810*7c568831SAndroid Build Coastguard Worker     if (ctxt->html) {
811*7c568831SAndroid Build Coastguard Worker 	if (ctxt->myDoc == NULL)
812*7c568831SAndroid Build Coastguard Worker 	    ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
813*7c568831SAndroid Build Coastguard Worker 	if (ctxt->myDoc == NULL) {
814*7c568831SAndroid Build Coastguard Worker 	    xmlSAX2ErrMemory(ctxt);
815*7c568831SAndroid Build Coastguard Worker 	    return;
816*7c568831SAndroid Build Coastguard Worker 	}
817*7c568831SAndroid Build Coastguard Worker 	ctxt->myDoc->properties = XML_DOC_HTML;
818*7c568831SAndroid Build Coastguard Worker 	ctxt->myDoc->parseFlags = ctxt->options;
819*7c568831SAndroid Build Coastguard Worker     } else
820*7c568831SAndroid Build Coastguard Worker #endif
821*7c568831SAndroid Build Coastguard Worker     {
822*7c568831SAndroid Build Coastguard Worker 	doc = ctxt->myDoc = xmlNewDoc(ctxt->version);
823*7c568831SAndroid Build Coastguard Worker 	if (doc != NULL) {
824*7c568831SAndroid Build Coastguard Worker 	    doc->properties = 0;
825*7c568831SAndroid Build Coastguard Worker 	    if (ctxt->options & XML_PARSE_OLD10)
826*7c568831SAndroid Build Coastguard Worker 	        doc->properties |= XML_DOC_OLD10;
827*7c568831SAndroid Build Coastguard Worker 	    doc->parseFlags = ctxt->options;
828*7c568831SAndroid Build Coastguard Worker 	    doc->standalone = ctxt->standalone;
829*7c568831SAndroid Build Coastguard Worker 	} else {
830*7c568831SAndroid Build Coastguard Worker 	    xmlSAX2ErrMemory(ctxt);
831*7c568831SAndroid Build Coastguard Worker 	    return;
832*7c568831SAndroid Build Coastguard Worker 	}
833*7c568831SAndroid Build Coastguard Worker 	if ((ctxt->dictNames) && (doc != NULL)) {
834*7c568831SAndroid Build Coastguard Worker 	    doc->dict = ctxt->dict;
835*7c568831SAndroid Build Coastguard Worker 	    xmlDictReference(doc->dict);
836*7c568831SAndroid Build Coastguard Worker 	}
837*7c568831SAndroid Build Coastguard Worker     }
838*7c568831SAndroid Build Coastguard Worker     if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) &&
839*7c568831SAndroid Build Coastguard Worker 	(ctxt->input != NULL) && (ctxt->input->filename != NULL)) {
840*7c568831SAndroid Build Coastguard Worker 	ctxt->myDoc->URL = xmlPathToURI((const xmlChar *)ctxt->input->filename);
841*7c568831SAndroid Build Coastguard Worker 	if (ctxt->myDoc->URL == NULL)
842*7c568831SAndroid Build Coastguard Worker 	    xmlSAX2ErrMemory(ctxt);
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  * xmlSAX2EndDocument:
848*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
849*7c568831SAndroid Build Coastguard Worker  *
850*7c568831SAndroid Build Coastguard Worker  * called when the document end has been detected.
851*7c568831SAndroid Build Coastguard Worker  */
852*7c568831SAndroid Build Coastguard Worker void
xmlSAX2EndDocument(void * ctx)853*7c568831SAndroid Build Coastguard Worker xmlSAX2EndDocument(void *ctx)
854*7c568831SAndroid Build Coastguard Worker {
855*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
856*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
857*7c568831SAndroid Build Coastguard Worker 
858*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return;
859*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
860*7c568831SAndroid Build Coastguard Worker     if (ctxt->validate && ctxt->wellFormed &&
861*7c568831SAndroid Build Coastguard Worker         ctxt->myDoc && ctxt->myDoc->intSubset)
862*7c568831SAndroid Build Coastguard Worker 	ctxt->valid &= xmlValidateDocumentFinal(&ctxt->vctxt, ctxt->myDoc);
863*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
864*7c568831SAndroid Build Coastguard Worker 
865*7c568831SAndroid Build Coastguard Worker     doc = ctxt->myDoc;
866*7c568831SAndroid Build Coastguard Worker     if ((doc != NULL) && (doc->encoding == NULL)) {
867*7c568831SAndroid Build Coastguard Worker         const xmlChar *encoding = xmlGetActualEncoding(ctxt);
868*7c568831SAndroid Build Coastguard Worker 
869*7c568831SAndroid Build Coastguard Worker         if (encoding != NULL) {
870*7c568831SAndroid Build Coastguard Worker             doc->encoding = xmlStrdup(encoding);
871*7c568831SAndroid Build Coastguard Worker             if (doc->encoding == NULL)
872*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
873*7c568831SAndroid Build Coastguard Worker         }
874*7c568831SAndroid Build Coastguard Worker     }
875*7c568831SAndroid Build Coastguard Worker }
876*7c568831SAndroid Build Coastguard Worker 
877*7c568831SAndroid Build Coastguard Worker static void
xmlSAX2AppendChild(xmlParserCtxtPtr ctxt,xmlNodePtr node)878*7c568831SAndroid Build Coastguard Worker xmlSAX2AppendChild(xmlParserCtxtPtr ctxt, xmlNodePtr node) {
879*7c568831SAndroid Build Coastguard Worker     xmlNodePtr parent;
880*7c568831SAndroid Build Coastguard Worker     xmlNodePtr last;
881*7c568831SAndroid Build Coastguard Worker 
882*7c568831SAndroid Build Coastguard Worker     if (ctxt->inSubset == 1) {
883*7c568831SAndroid Build Coastguard Worker 	parent = (xmlNodePtr) ctxt->myDoc->intSubset;
884*7c568831SAndroid Build Coastguard Worker     } else if (ctxt->inSubset == 2) {
885*7c568831SAndroid Build Coastguard Worker 	parent = (xmlNodePtr) ctxt->myDoc->extSubset;
886*7c568831SAndroid Build Coastguard Worker     } else {
887*7c568831SAndroid Build Coastguard Worker         parent = ctxt->node;
888*7c568831SAndroid Build Coastguard Worker         if (parent == NULL)
889*7c568831SAndroid Build Coastguard Worker             parent = (xmlNodePtr) ctxt->myDoc;
890*7c568831SAndroid Build Coastguard Worker     }
891*7c568831SAndroid Build Coastguard Worker 
892*7c568831SAndroid Build Coastguard Worker     last = parent->last;
893*7c568831SAndroid Build Coastguard Worker     if (last == NULL) {
894*7c568831SAndroid Build Coastguard Worker         parent->children = node;
895*7c568831SAndroid Build Coastguard Worker     } else {
896*7c568831SAndroid Build Coastguard Worker         last->next = node;
897*7c568831SAndroid Build Coastguard Worker         node->prev = last;
898*7c568831SAndroid Build Coastguard Worker     }
899*7c568831SAndroid Build Coastguard Worker 
900*7c568831SAndroid Build Coastguard Worker     parent->last = node;
901*7c568831SAndroid Build Coastguard Worker     node->parent = parent;
902*7c568831SAndroid Build Coastguard Worker 
903*7c568831SAndroid Build Coastguard Worker     if ((node->type != XML_TEXT_NODE) &&
904*7c568831SAndroid Build Coastguard Worker         (ctxt->linenumbers) &&
905*7c568831SAndroid Build Coastguard Worker 	(ctxt->input != NULL)) {
906*7c568831SAndroid Build Coastguard Worker         if ((unsigned) ctxt->input->line < (unsigned) USHRT_MAX)
907*7c568831SAndroid Build Coastguard Worker             node->line = ctxt->input->line;
908*7c568831SAndroid Build Coastguard Worker         else
909*7c568831SAndroid Build Coastguard Worker             node->line = USHRT_MAX;
910*7c568831SAndroid Build Coastguard Worker     }
911*7c568831SAndroid Build Coastguard Worker }
912*7c568831SAndroid Build Coastguard Worker 
913*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_SAX1_ENABLED)
914*7c568831SAndroid Build Coastguard Worker /**
915*7c568831SAndroid Build Coastguard Worker  * xmlNsErrMsg:
916*7c568831SAndroid Build Coastguard Worker  * @ctxt:  an XML parser context
917*7c568831SAndroid Build Coastguard Worker  * @error:  the error number
918*7c568831SAndroid Build Coastguard Worker  * @msg:  the error message
919*7c568831SAndroid Build Coastguard Worker  * @str1:  an error string
920*7c568831SAndroid Build Coastguard Worker  * @str2:  an error string
921*7c568831SAndroid Build Coastguard Worker  *
922*7c568831SAndroid Build Coastguard Worker  * Handle a namespace error
923*7c568831SAndroid Build Coastguard Worker  */
924*7c568831SAndroid Build Coastguard Worker static void LIBXML_ATTR_FORMAT(3,0)
xmlNsErrMsg(xmlParserCtxtPtr ctxt,xmlParserErrors error,const char * msg,const xmlChar * str1,const xmlChar * str2)925*7c568831SAndroid Build Coastguard Worker xmlNsErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error,
926*7c568831SAndroid Build Coastguard Worker             const char *msg, const xmlChar *str1, const xmlChar *str2)
927*7c568831SAndroid Build Coastguard Worker {
928*7c568831SAndroid Build Coastguard Worker     xmlCtxtErr(ctxt, NULL, XML_FROM_NAMESPACE, error, XML_ERR_ERROR,
929*7c568831SAndroid Build Coastguard Worker                str1, str2, NULL, 0, msg, str1, str2);
930*7c568831SAndroid Build Coastguard Worker }
931*7c568831SAndroid Build Coastguard Worker 
932*7c568831SAndroid Build Coastguard Worker /**
933*7c568831SAndroid Build Coastguard Worker  * xmlSAX1Attribute:
934*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
935*7c568831SAndroid Build Coastguard Worker  * @fullname:  The attribute name, including namespace prefix
936*7c568831SAndroid Build Coastguard Worker  * @value:  The attribute value
937*7c568831SAndroid Build Coastguard Worker  *
938*7c568831SAndroid Build Coastguard Worker  * Handle an attribute that has been read by the parser.
939*7c568831SAndroid Build Coastguard Worker  *
940*7c568831SAndroid Build Coastguard Worker  * Deprecated SAX1 interface.
941*7c568831SAndroid Build Coastguard Worker  */
942*7c568831SAndroid Build Coastguard Worker static void
xmlSAX1Attribute(xmlParserCtxtPtr ctxt,const xmlChar * fullname,const xmlChar * value,const xmlChar * prefix)943*7c568831SAndroid Build Coastguard Worker xmlSAX1Attribute(xmlParserCtxtPtr ctxt, const xmlChar *fullname,
944*7c568831SAndroid Build Coastguard Worker                  const xmlChar *value, const xmlChar *prefix)
945*7c568831SAndroid Build Coastguard Worker {
946*7c568831SAndroid Build Coastguard Worker     xmlAttrPtr ret;
947*7c568831SAndroid Build Coastguard Worker     const xmlChar *name;
948*7c568831SAndroid Build Coastguard Worker     xmlChar *ns;
949*7c568831SAndroid Build Coastguard Worker     xmlNsPtr namespace;
950*7c568831SAndroid Build Coastguard Worker 
951*7c568831SAndroid Build Coastguard Worker     /*
952*7c568831SAndroid Build Coastguard Worker      * Split the full name into a namespace prefix and the tag name
953*7c568831SAndroid Build Coastguard Worker      */
954*7c568831SAndroid Build Coastguard Worker     name = xmlSplitQName4(fullname, &ns);
955*7c568831SAndroid Build Coastguard Worker     if (name == NULL) {
956*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
957*7c568831SAndroid Build Coastguard Worker         return;
958*7c568831SAndroid Build Coastguard Worker     }
959*7c568831SAndroid Build Coastguard Worker 
960*7c568831SAndroid Build Coastguard Worker     /*
961*7c568831SAndroid Build Coastguard Worker      * Check whether it's a namespace definition
962*7c568831SAndroid Build Coastguard Worker      */
963*7c568831SAndroid Build Coastguard Worker     if ((ns == NULL) &&
964*7c568831SAndroid Build Coastguard Worker         (name[0] == 'x') && (name[1] == 'm') && (name[2] == 'l') &&
965*7c568831SAndroid Build Coastguard Worker         (name[3] == 'n') && (name[4] == 's') && (name[5] == 0)) {
966*7c568831SAndroid Build Coastguard Worker 	xmlNsPtr nsret;
967*7c568831SAndroid Build Coastguard Worker 	xmlChar *val;
968*7c568831SAndroid Build Coastguard Worker 
969*7c568831SAndroid Build Coastguard Worker         /* Avoid unused variable warning if features are disabled. */
970*7c568831SAndroid Build Coastguard Worker         (void) nsret;
971*7c568831SAndroid Build Coastguard Worker 
972*7c568831SAndroid Build Coastguard Worker         if (!ctxt->replaceEntities) {
973*7c568831SAndroid Build Coastguard Worker             /* TODO: normalize if needed */
974*7c568831SAndroid Build Coastguard Worker 	    val = xmlExpandEntitiesInAttValue(ctxt, value, /* normalize */ 0);
975*7c568831SAndroid Build Coastguard Worker 	    if (val == NULL) {
976*7c568831SAndroid Build Coastguard Worker 	        xmlSAX2ErrMemory(ctxt);
977*7c568831SAndroid Build Coastguard Worker 		return;
978*7c568831SAndroid Build Coastguard Worker 	    }
979*7c568831SAndroid Build Coastguard Worker 	} else {
980*7c568831SAndroid Build Coastguard Worker 	    val = (xmlChar *) value;
981*7c568831SAndroid Build Coastguard Worker 	}
982*7c568831SAndroid Build Coastguard Worker 
983*7c568831SAndroid Build Coastguard Worker 	if (val[0] != 0) {
984*7c568831SAndroid Build Coastguard Worker 	    xmlURIPtr uri;
985*7c568831SAndroid Build Coastguard Worker 
986*7c568831SAndroid Build Coastguard Worker 	    if (xmlParseURISafe((const char *)val, &uri) < 0)
987*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
988*7c568831SAndroid Build Coastguard Worker 	    if (uri == NULL) {
989*7c568831SAndroid Build Coastguard Worker                 xmlNsWarnMsg(ctxt, XML_WAR_NS_URI,
990*7c568831SAndroid Build Coastguard Worker                              "xmlns:%s: %s not a valid URI\n", name, value);
991*7c568831SAndroid Build Coastguard Worker 	    } else {
992*7c568831SAndroid Build Coastguard Worker 		if (uri->scheme == NULL) {
993*7c568831SAndroid Build Coastguard Worker                     xmlNsWarnMsg(ctxt, XML_WAR_NS_URI_RELATIVE,
994*7c568831SAndroid Build Coastguard Worker                                  "xmlns:%s: URI %s is not absolute\n",
995*7c568831SAndroid Build Coastguard Worker                                  name, value);
996*7c568831SAndroid Build Coastguard Worker 		}
997*7c568831SAndroid Build Coastguard Worker 		xmlFreeURI(uri);
998*7c568831SAndroid Build Coastguard Worker 	    }
999*7c568831SAndroid Build Coastguard Worker 	}
1000*7c568831SAndroid Build Coastguard Worker 
1001*7c568831SAndroid Build Coastguard Worker 	/* a default namespace definition */
1002*7c568831SAndroid Build Coastguard Worker 	nsret = xmlNewNs(ctxt->node, val, NULL);
1003*7c568831SAndroid Build Coastguard Worker         if (nsret == NULL) {
1004*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1005*7c568831SAndroid Build Coastguard Worker         }
1006*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
1007*7c568831SAndroid Build Coastguard Worker 	/*
1008*7c568831SAndroid Build Coastguard Worker 	 * Validate also for namespace decls, they are attributes from
1009*7c568831SAndroid Build Coastguard Worker 	 * an XML-1.0 perspective
1010*7c568831SAndroid Build Coastguard Worker 	 */
1011*7c568831SAndroid Build Coastguard Worker         else if (ctxt->validate && ctxt->wellFormed &&
1012*7c568831SAndroid Build Coastguard Worker                  ctxt->myDoc && ctxt->myDoc->intSubset) {
1013*7c568831SAndroid Build Coastguard Worker 	    ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc,
1014*7c568831SAndroid Build Coastguard Worker 					   ctxt->node, prefix, nsret, val);
1015*7c568831SAndroid Build Coastguard Worker         }
1016*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
1017*7c568831SAndroid Build Coastguard Worker 	if (val != value)
1018*7c568831SAndroid Build Coastguard Worker 	    xmlFree(val);
1019*7c568831SAndroid Build Coastguard Worker 	return;
1020*7c568831SAndroid Build Coastguard Worker     }
1021*7c568831SAndroid Build Coastguard Worker     if ((ns != NULL) && (ns[0] == 'x') && (ns[1] == 'm') && (ns[2] == 'l') &&
1022*7c568831SAndroid Build Coastguard Worker         (ns[3] == 'n') && (ns[4] == 's') && (ns[5] == 0)) {
1023*7c568831SAndroid Build Coastguard Worker 	xmlNsPtr nsret;
1024*7c568831SAndroid Build Coastguard Worker 	xmlChar *val;
1025*7c568831SAndroid Build Coastguard Worker 
1026*7c568831SAndroid Build Coastguard Worker         /* Avoid unused variable warning if features are disabled. */
1027*7c568831SAndroid Build Coastguard Worker         (void) nsret;
1028*7c568831SAndroid Build Coastguard Worker 
1029*7c568831SAndroid Build Coastguard Worker         if (!ctxt->replaceEntities) {
1030*7c568831SAndroid Build Coastguard Worker             /* TODO: normalize if needed */
1031*7c568831SAndroid Build Coastguard Worker 	    val = xmlExpandEntitiesInAttValue(ctxt, value, /* normalize */ 0);
1032*7c568831SAndroid Build Coastguard Worker 	    if (val == NULL) {
1033*7c568831SAndroid Build Coastguard Worker 	        xmlSAX2ErrMemory(ctxt);
1034*7c568831SAndroid Build Coastguard Worker 	        xmlFree(ns);
1035*7c568831SAndroid Build Coastguard Worker 		return;
1036*7c568831SAndroid Build Coastguard Worker 	    }
1037*7c568831SAndroid Build Coastguard Worker 	} else {
1038*7c568831SAndroid Build Coastguard Worker 	    val = (xmlChar *) value;
1039*7c568831SAndroid Build Coastguard Worker 	}
1040*7c568831SAndroid Build Coastguard Worker 
1041*7c568831SAndroid Build Coastguard Worker 	if (val[0] == 0) {
1042*7c568831SAndroid Build Coastguard Worker 	    xmlNsErrMsg(ctxt, XML_NS_ERR_EMPTY,
1043*7c568831SAndroid Build Coastguard Worker 		        "Empty namespace name for prefix %s\n", name, NULL);
1044*7c568831SAndroid Build Coastguard Worker 	}
1045*7c568831SAndroid Build Coastguard Worker 	if ((ctxt->pedantic != 0) && (val[0] != 0)) {
1046*7c568831SAndroid Build Coastguard Worker 	    xmlURIPtr uri;
1047*7c568831SAndroid Build Coastguard Worker 
1048*7c568831SAndroid Build Coastguard Worker 	    if (xmlParseURISafe((const char *)val, &uri) < 0)
1049*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
1050*7c568831SAndroid Build Coastguard Worker 	    if (uri == NULL) {
1051*7c568831SAndroid Build Coastguard Worker 	        xmlNsWarnMsg(ctxt, XML_WAR_NS_URI,
1052*7c568831SAndroid Build Coastguard Worker 			 "xmlns:%s: %s not a valid URI\n", name, value);
1053*7c568831SAndroid Build Coastguard Worker 	    } else {
1054*7c568831SAndroid Build Coastguard Worker 		if (uri->scheme == NULL) {
1055*7c568831SAndroid Build Coastguard Worker 		    xmlNsWarnMsg(ctxt, XML_WAR_NS_URI_RELATIVE,
1056*7c568831SAndroid Build Coastguard Worker 			   "xmlns:%s: URI %s is not absolute\n", name, value);
1057*7c568831SAndroid Build Coastguard Worker 		}
1058*7c568831SAndroid Build Coastguard Worker 		xmlFreeURI(uri);
1059*7c568831SAndroid Build Coastguard Worker 	    }
1060*7c568831SAndroid Build Coastguard Worker 	}
1061*7c568831SAndroid Build Coastguard Worker 
1062*7c568831SAndroid Build Coastguard Worker 	/* a standard namespace definition */
1063*7c568831SAndroid Build Coastguard Worker 	nsret = xmlNewNs(ctxt->node, val, name);
1064*7c568831SAndroid Build Coastguard Worker 	xmlFree(ns);
1065*7c568831SAndroid Build Coastguard Worker 
1066*7c568831SAndroid Build Coastguard Worker         if (nsret == NULL) {
1067*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1068*7c568831SAndroid Build Coastguard Worker         }
1069*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
1070*7c568831SAndroid Build Coastguard Worker 	/*
1071*7c568831SAndroid Build Coastguard Worker 	 * Validate also for namespace decls, they are attributes from
1072*7c568831SAndroid Build Coastguard Worker 	 * an XML-1.0 perspective
1073*7c568831SAndroid Build Coastguard Worker 	 */
1074*7c568831SAndroid Build Coastguard Worker         else if (ctxt->validate && ctxt->wellFormed &&
1075*7c568831SAndroid Build Coastguard Worker 	         ctxt->myDoc && ctxt->myDoc->intSubset) {
1076*7c568831SAndroid Build Coastguard Worker 	    ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc,
1077*7c568831SAndroid Build Coastguard Worker 					   ctxt->node, prefix, nsret, value);
1078*7c568831SAndroid Build Coastguard Worker         }
1079*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
1080*7c568831SAndroid Build Coastguard Worker 	if (val != value)
1081*7c568831SAndroid Build Coastguard Worker 	    xmlFree(val);
1082*7c568831SAndroid Build Coastguard Worker 	return;
1083*7c568831SAndroid Build Coastguard Worker     }
1084*7c568831SAndroid Build Coastguard Worker 
1085*7c568831SAndroid Build Coastguard Worker     if (ns != NULL) {
1086*7c568831SAndroid Build Coastguard Worker         int res;
1087*7c568831SAndroid Build Coastguard Worker 
1088*7c568831SAndroid Build Coastguard Worker 	res = xmlSearchNsSafe(ctxt->node, ns, &namespace);
1089*7c568831SAndroid Build Coastguard Worker         if (res < 0)
1090*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1091*7c568831SAndroid Build Coastguard Worker 
1092*7c568831SAndroid Build Coastguard Worker 	if (namespace == NULL) {
1093*7c568831SAndroid Build Coastguard Worker 	    xmlNsErrMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
1094*7c568831SAndroid Build Coastguard Worker 		    "Namespace prefix %s of attribute %s is not defined\n",
1095*7c568831SAndroid Build Coastguard Worker 		             ns, name);
1096*7c568831SAndroid Build Coastguard Worker 	} else {
1097*7c568831SAndroid Build Coastguard Worker             xmlAttrPtr prop;
1098*7c568831SAndroid Build Coastguard Worker 
1099*7c568831SAndroid Build Coastguard Worker             prop = ctxt->node->properties;
1100*7c568831SAndroid Build Coastguard Worker             while (prop != NULL) {
1101*7c568831SAndroid Build Coastguard Worker                 if (prop->ns != NULL) {
1102*7c568831SAndroid Build Coastguard Worker                     if ((xmlStrEqual(name, prop->name)) &&
1103*7c568831SAndroid Build Coastguard Worker                         ((namespace == prop->ns) ||
1104*7c568831SAndroid Build Coastguard Worker                          (xmlStrEqual(namespace->href, prop->ns->href)))) {
1105*7c568831SAndroid Build Coastguard Worker                         xmlCtxtErr(ctxt, NULL, XML_FROM_PARSER,
1106*7c568831SAndroid Build Coastguard Worker                                    XML_ERR_ATTRIBUTE_REDEFINED, XML_ERR_FATAL,
1107*7c568831SAndroid Build Coastguard Worker                                    name, NULL, NULL, 0,
1108*7c568831SAndroid Build Coastguard Worker                                    "Attribute %s in %s redefined\n",
1109*7c568831SAndroid Build Coastguard Worker                                    name, namespace->href);
1110*7c568831SAndroid Build Coastguard Worker                         goto error;
1111*7c568831SAndroid Build Coastguard Worker                     }
1112*7c568831SAndroid Build Coastguard Worker                 }
1113*7c568831SAndroid Build Coastguard Worker                 prop = prop->next;
1114*7c568831SAndroid Build Coastguard Worker             }
1115*7c568831SAndroid Build Coastguard Worker         }
1116*7c568831SAndroid Build Coastguard Worker     } else {
1117*7c568831SAndroid Build Coastguard Worker 	namespace = NULL;
1118*7c568831SAndroid Build Coastguard Worker     }
1119*7c568831SAndroid Build Coastguard Worker 
1120*7c568831SAndroid Build Coastguard Worker     /* !!!!!! <a toto:arg="" xmlns:toto="http://toto.com"> */
1121*7c568831SAndroid Build Coastguard Worker     ret = xmlNewNsProp(ctxt->node, namespace, name, NULL);
1122*7c568831SAndroid Build Coastguard Worker     if (ret == NULL) {
1123*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
1124*7c568831SAndroid Build Coastguard Worker         goto error;
1125*7c568831SAndroid Build Coastguard Worker     }
1126*7c568831SAndroid Build Coastguard Worker 
1127*7c568831SAndroid Build Coastguard Worker     if (ctxt->replaceEntities == 0) {
1128*7c568831SAndroid Build Coastguard Worker         if (xmlNodeParseContent((xmlNodePtr) ret, value, INT_MAX) < 0)
1129*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1130*7c568831SAndroid Build Coastguard Worker     } else if (value != NULL) {
1131*7c568831SAndroid Build Coastguard Worker         ret->children = xmlNewDocText(ctxt->myDoc, value);
1132*7c568831SAndroid Build Coastguard Worker         if (ret->children == NULL) {
1133*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1134*7c568831SAndroid Build Coastguard Worker         } else {
1135*7c568831SAndroid Build Coastguard Worker             ret->last = ret->children;
1136*7c568831SAndroid Build Coastguard Worker             ret->children->parent = (xmlNodePtr) ret;
1137*7c568831SAndroid Build Coastguard Worker         }
1138*7c568831SAndroid Build Coastguard Worker     }
1139*7c568831SAndroid Build Coastguard Worker 
1140*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
1141*7c568831SAndroid Build Coastguard Worker     if (ctxt->validate && ctxt->wellFormed &&
1142*7c568831SAndroid Build Coastguard Worker         ctxt->myDoc && ctxt->myDoc->intSubset) {
1143*7c568831SAndroid Build Coastguard Worker 
1144*7c568831SAndroid Build Coastguard Worker 	/*
1145*7c568831SAndroid Build Coastguard Worker 	 * If we don't substitute entities, the validation should be
1146*7c568831SAndroid Build Coastguard Worker 	 * done on a value with replaced entities anyway.
1147*7c568831SAndroid Build Coastguard Worker 	 */
1148*7c568831SAndroid Build Coastguard Worker         if (!ctxt->replaceEntities) {
1149*7c568831SAndroid Build Coastguard Worker 	    xmlChar *val;
1150*7c568831SAndroid Build Coastguard Worker 
1151*7c568831SAndroid Build Coastguard Worker             /* TODO: normalize if needed */
1152*7c568831SAndroid Build Coastguard Worker 	    val = xmlExpandEntitiesInAttValue(ctxt, value, /* normalize */ 0);
1153*7c568831SAndroid Build Coastguard Worker 
1154*7c568831SAndroid Build Coastguard Worker 	    if (val == NULL)
1155*7c568831SAndroid Build Coastguard Worker 		ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt,
1156*7c568831SAndroid Build Coastguard Worker 				ctxt->myDoc, ctxt->node, ret, value);
1157*7c568831SAndroid Build Coastguard Worker 	    else {
1158*7c568831SAndroid Build Coastguard Worker 		xmlChar *nvalnorm;
1159*7c568831SAndroid Build Coastguard Worker 
1160*7c568831SAndroid Build Coastguard Worker 		/*
1161*7c568831SAndroid Build Coastguard Worker 		 * Do the last stage of the attribute normalization
1162*7c568831SAndroid Build Coastguard Worker 		 * It need to be done twice ... it's an extra burden related
1163*7c568831SAndroid Build Coastguard Worker 		 * to the ability to keep xmlSAX2References in attributes
1164*7c568831SAndroid Build Coastguard Worker 		 */
1165*7c568831SAndroid Build Coastguard Worker                 nvalnorm = xmlValidCtxtNormalizeAttributeValue(
1166*7c568831SAndroid Build Coastguard Worker                                  &ctxt->vctxt, ctxt->myDoc,
1167*7c568831SAndroid Build Coastguard Worker                                  ctxt->node, fullname, val);
1168*7c568831SAndroid Build Coastguard Worker 		if (nvalnorm != NULL) {
1169*7c568831SAndroid Build Coastguard Worker 		    xmlFree(val);
1170*7c568831SAndroid Build Coastguard Worker 		    val = nvalnorm;
1171*7c568831SAndroid Build Coastguard Worker 		}
1172*7c568831SAndroid Build Coastguard Worker 
1173*7c568831SAndroid Build Coastguard Worker 		ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt,
1174*7c568831SAndroid Build Coastguard Worker 			        ctxt->myDoc, ctxt->node, ret, val);
1175*7c568831SAndroid Build Coastguard Worker                 xmlFree(val);
1176*7c568831SAndroid Build Coastguard Worker 	    }
1177*7c568831SAndroid Build Coastguard Worker 	} else {
1178*7c568831SAndroid Build Coastguard Worker 	    ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc,
1179*7c568831SAndroid Build Coastguard Worker 					       ctxt->node, ret, value);
1180*7c568831SAndroid Build Coastguard Worker 	}
1181*7c568831SAndroid Build Coastguard Worker     } else
1182*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
1183*7c568831SAndroid Build Coastguard Worker            if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) &&
1184*7c568831SAndroid Build Coastguard Worker                (ctxt->input->entity == NULL) &&
1185*7c568831SAndroid Build Coastguard Worker                /* Don't create IDs containing entity references */
1186*7c568831SAndroid Build Coastguard Worker                (ret->children != NULL) &&
1187*7c568831SAndroid Build Coastguard Worker                (ret->children->type == XML_TEXT_NODE) &&
1188*7c568831SAndroid Build Coastguard Worker                (ret->children->next == NULL)) {
1189*7c568831SAndroid Build Coastguard Worker         xmlChar *content = ret->children->content;
1190*7c568831SAndroid Build Coastguard Worker         /*
1191*7c568831SAndroid Build Coastguard Worker 	 * when validating, the ID registration is done at the attribute
1192*7c568831SAndroid Build Coastguard Worker 	 * validation level. Otherwise we have to do specific handling here.
1193*7c568831SAndroid Build Coastguard Worker 	 */
1194*7c568831SAndroid Build Coastguard Worker 	if (xmlStrEqual(fullname, BAD_CAST "xml:id")) {
1195*7c568831SAndroid Build Coastguard Worker 	    /*
1196*7c568831SAndroid Build Coastguard Worker 	     * Add the xml:id value
1197*7c568831SAndroid Build Coastguard Worker 	     *
1198*7c568831SAndroid Build Coastguard Worker 	     * Open issue: normalization of the value.
1199*7c568831SAndroid Build Coastguard Worker 	     */
1200*7c568831SAndroid Build Coastguard Worker 	    if (xmlValidateNCName(content, 1) != 0) {
1201*7c568831SAndroid Build Coastguard Worker 	        xmlErrValid(ctxt, XML_DTD_XMLID_VALUE,
1202*7c568831SAndroid Build Coastguard Worker 		            "xml:id : attribute value %s is not an NCName\n",
1203*7c568831SAndroid Build Coastguard Worker 		            content, NULL);
1204*7c568831SAndroid Build Coastguard Worker 	    }
1205*7c568831SAndroid Build Coastguard Worker 	    xmlAddID(&ctxt->vctxt, ctxt->myDoc, content, ret);
1206*7c568831SAndroid Build Coastguard Worker 	} else {
1207*7c568831SAndroid Build Coastguard Worker             int res = xmlIsID(ctxt->myDoc, ctxt->node, ret);
1208*7c568831SAndroid Build Coastguard Worker 
1209*7c568831SAndroid Build Coastguard Worker             if (res < 0)
1210*7c568831SAndroid Build Coastguard Worker                 xmlCtxtErrMemory(ctxt);
1211*7c568831SAndroid Build Coastguard Worker             else if (res > 0)
1212*7c568831SAndroid Build Coastguard Worker                 xmlAddID(&ctxt->vctxt, ctxt->myDoc, content, ret);
1213*7c568831SAndroid Build Coastguard Worker             else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret))
1214*7c568831SAndroid Build Coastguard Worker                 xmlAddRef(&ctxt->vctxt, ctxt->myDoc, content, ret);
1215*7c568831SAndroid Build Coastguard Worker         }
1216*7c568831SAndroid Build Coastguard Worker     }
1217*7c568831SAndroid Build Coastguard Worker 
1218*7c568831SAndroid Build Coastguard Worker error:
1219*7c568831SAndroid Build Coastguard Worker     if (ns != NULL)
1220*7c568831SAndroid Build Coastguard Worker 	xmlFree(ns);
1221*7c568831SAndroid Build Coastguard Worker }
1222*7c568831SAndroid Build Coastguard Worker 
1223*7c568831SAndroid Build Coastguard Worker /*
1224*7c568831SAndroid Build Coastguard Worker  * xmlCheckDefaultedAttributes:
1225*7c568831SAndroid Build Coastguard Worker  *
1226*7c568831SAndroid Build Coastguard Worker  * Check defaulted attributes from the DTD
1227*7c568831SAndroid Build Coastguard Worker  *
1228*7c568831SAndroid Build Coastguard Worker  * Deprecated SAX1 interface.
1229*7c568831SAndroid Build Coastguard Worker  */
1230*7c568831SAndroid Build Coastguard Worker static void
xmlCheckDefaultedAttributes(xmlParserCtxtPtr ctxt,const xmlChar * name,const xmlChar * prefix,const xmlChar ** atts)1231*7c568831SAndroid Build Coastguard Worker xmlCheckDefaultedAttributes(xmlParserCtxtPtr ctxt, const xmlChar *name,
1232*7c568831SAndroid Build Coastguard Worker 	const xmlChar *prefix, const xmlChar **atts) {
1233*7c568831SAndroid Build Coastguard Worker     xmlElementPtr elemDecl;
1234*7c568831SAndroid Build Coastguard Worker     const xmlChar *att;
1235*7c568831SAndroid Build Coastguard Worker     int internal = 1;
1236*7c568831SAndroid Build Coastguard Worker     int i;
1237*7c568831SAndroid Build Coastguard Worker 
1238*7c568831SAndroid Build Coastguard Worker     elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->intSubset, name, prefix);
1239*7c568831SAndroid Build Coastguard Worker     if (elemDecl == NULL) {
1240*7c568831SAndroid Build Coastguard Worker 	elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->extSubset, name, prefix);
1241*7c568831SAndroid Build Coastguard Worker 	internal = 0;
1242*7c568831SAndroid Build Coastguard Worker     }
1243*7c568831SAndroid Build Coastguard Worker 
1244*7c568831SAndroid Build Coastguard Worker process_external_subset:
1245*7c568831SAndroid Build Coastguard Worker 
1246*7c568831SAndroid Build Coastguard Worker     if (elemDecl != NULL) {
1247*7c568831SAndroid Build Coastguard Worker 	xmlAttributePtr attr = elemDecl->attributes;
1248*7c568831SAndroid Build Coastguard Worker 	/*
1249*7c568831SAndroid Build Coastguard Worker 	 * Check against defaulted attributes from the external subset
1250*7c568831SAndroid Build Coastguard Worker 	 * if the document is stamped as standalone
1251*7c568831SAndroid Build Coastguard Worker 	 */
1252*7c568831SAndroid Build Coastguard Worker 	if ((ctxt->myDoc->standalone == 1) &&
1253*7c568831SAndroid Build Coastguard Worker 	    (ctxt->myDoc->extSubset != NULL) &&
1254*7c568831SAndroid Build Coastguard Worker 	    (ctxt->validate)) {
1255*7c568831SAndroid Build Coastguard Worker 	    while (attr != NULL) {
1256*7c568831SAndroid Build Coastguard Worker 		if ((attr->defaultValue != NULL) &&
1257*7c568831SAndroid Build Coastguard Worker 		    (xmlGetDtdQAttrDesc(ctxt->myDoc->extSubset,
1258*7c568831SAndroid Build Coastguard Worker 					attr->elem, attr->name,
1259*7c568831SAndroid Build Coastguard Worker 					attr->prefix) == attr) &&
1260*7c568831SAndroid Build Coastguard Worker 		    (xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset,
1261*7c568831SAndroid Build Coastguard Worker 					attr->elem, attr->name,
1262*7c568831SAndroid Build Coastguard Worker 					attr->prefix) == NULL)) {
1263*7c568831SAndroid Build Coastguard Worker 		    xmlChar *fulln;
1264*7c568831SAndroid Build Coastguard Worker 
1265*7c568831SAndroid Build Coastguard Worker 		    if (attr->prefix != NULL) {
1266*7c568831SAndroid Build Coastguard Worker 			fulln = xmlStrdup(attr->prefix);
1267*7c568831SAndroid Build Coastguard Worker                         if (fulln != NULL)
1268*7c568831SAndroid Build Coastguard Worker 			    fulln = xmlStrcat(fulln, BAD_CAST ":");
1269*7c568831SAndroid Build Coastguard Worker                         if (fulln != NULL)
1270*7c568831SAndroid Build Coastguard Worker 			    fulln = xmlStrcat(fulln, attr->name);
1271*7c568831SAndroid Build Coastguard Worker 		    } else {
1272*7c568831SAndroid Build Coastguard Worker 			fulln = xmlStrdup(attr->name);
1273*7c568831SAndroid Build Coastguard Worker 		    }
1274*7c568831SAndroid Build Coastguard Worker                     if (fulln == NULL) {
1275*7c568831SAndroid Build Coastguard Worker                         xmlSAX2ErrMemory(ctxt);
1276*7c568831SAndroid Build Coastguard Worker                         break;
1277*7c568831SAndroid Build Coastguard Worker                     }
1278*7c568831SAndroid Build Coastguard Worker 
1279*7c568831SAndroid Build Coastguard Worker 		    /*
1280*7c568831SAndroid Build Coastguard Worker 		     * Check that the attribute is not declared in the
1281*7c568831SAndroid Build Coastguard Worker 		     * serialization
1282*7c568831SAndroid Build Coastguard Worker 		     */
1283*7c568831SAndroid Build Coastguard Worker 		    att = NULL;
1284*7c568831SAndroid Build Coastguard Worker 		    if (atts != NULL) {
1285*7c568831SAndroid Build Coastguard Worker 			i = 0;
1286*7c568831SAndroid Build Coastguard Worker 			att = atts[i];
1287*7c568831SAndroid Build Coastguard Worker 			while (att != NULL) {
1288*7c568831SAndroid Build Coastguard Worker 			    if (xmlStrEqual(att, fulln))
1289*7c568831SAndroid Build Coastguard Worker 				break;
1290*7c568831SAndroid Build Coastguard Worker 			    i += 2;
1291*7c568831SAndroid Build Coastguard Worker 			    att = atts[i];
1292*7c568831SAndroid Build Coastguard Worker 			}
1293*7c568831SAndroid Build Coastguard Worker 		    }
1294*7c568831SAndroid Build Coastguard Worker 		    if (att == NULL) {
1295*7c568831SAndroid Build Coastguard Worker 		        xmlErrValid(ctxt, XML_DTD_STANDALONE_DEFAULTED,
1296*7c568831SAndroid Build Coastguard Worker       "standalone: attribute %s on %s defaulted from external subset\n",
1297*7c568831SAndroid Build Coastguard Worker 				    fulln,
1298*7c568831SAndroid Build Coastguard Worker 				    attr->elem);
1299*7c568831SAndroid Build Coastguard Worker 		    }
1300*7c568831SAndroid Build Coastguard Worker                     xmlFree(fulln);
1301*7c568831SAndroid Build Coastguard Worker 		}
1302*7c568831SAndroid Build Coastguard Worker 		attr = attr->nexth;
1303*7c568831SAndroid Build Coastguard Worker 	    }
1304*7c568831SAndroid Build Coastguard Worker 	}
1305*7c568831SAndroid Build Coastguard Worker 
1306*7c568831SAndroid Build Coastguard Worker 	/*
1307*7c568831SAndroid Build Coastguard Worker 	 * Actually insert defaulted values when needed
1308*7c568831SAndroid Build Coastguard Worker 	 */
1309*7c568831SAndroid Build Coastguard Worker 	attr = elemDecl->attributes;
1310*7c568831SAndroid Build Coastguard Worker 	while (attr != NULL) {
1311*7c568831SAndroid Build Coastguard Worker 	    /*
1312*7c568831SAndroid Build Coastguard Worker 	     * Make sure that attributes redefinition occurring in the
1313*7c568831SAndroid Build Coastguard Worker 	     * internal subset are not overridden by definitions in the
1314*7c568831SAndroid Build Coastguard Worker 	     * external subset.
1315*7c568831SAndroid Build Coastguard Worker 	     */
1316*7c568831SAndroid Build Coastguard Worker 	    if (attr->defaultValue != NULL) {
1317*7c568831SAndroid Build Coastguard Worker 		/*
1318*7c568831SAndroid Build Coastguard Worker 		 * the element should be instantiated in the tree if:
1319*7c568831SAndroid Build Coastguard Worker 		 *  - this is a namespace prefix
1320*7c568831SAndroid Build Coastguard Worker 		 *  - the user required for completion in the tree
1321*7c568831SAndroid Build Coastguard Worker 		 *    like XSLT
1322*7c568831SAndroid Build Coastguard Worker 		 *  - there isn't already an attribute definition
1323*7c568831SAndroid Build Coastguard Worker 		 *    in the internal subset overriding it.
1324*7c568831SAndroid Build Coastguard Worker 		 */
1325*7c568831SAndroid Build Coastguard Worker 		if (((attr->prefix != NULL) &&
1326*7c568831SAndroid Build Coastguard Worker 		     (xmlStrEqual(attr->prefix, BAD_CAST "xmlns"))) ||
1327*7c568831SAndroid Build Coastguard Worker 		    ((attr->prefix == NULL) &&
1328*7c568831SAndroid Build Coastguard Worker 		     (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) ||
1329*7c568831SAndroid Build Coastguard Worker 		    (ctxt->loadsubset & XML_COMPLETE_ATTRS)) {
1330*7c568831SAndroid Build Coastguard Worker 		    xmlAttributePtr tst;
1331*7c568831SAndroid Build Coastguard Worker 
1332*7c568831SAndroid Build Coastguard Worker 		    tst = xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset,
1333*7c568831SAndroid Build Coastguard Worker 					     attr->elem, attr->name,
1334*7c568831SAndroid Build Coastguard Worker 					     attr->prefix);
1335*7c568831SAndroid Build Coastguard Worker 		    if ((tst == attr) || (tst == NULL)) {
1336*7c568831SAndroid Build Coastguard Worker 		        xmlChar fn[50];
1337*7c568831SAndroid Build Coastguard Worker 			xmlChar *fulln;
1338*7c568831SAndroid Build Coastguard Worker 
1339*7c568831SAndroid Build Coastguard Worker                         fulln = xmlBuildQName(attr->name, attr->prefix, fn, 50);
1340*7c568831SAndroid Build Coastguard Worker 			if (fulln == NULL) {
1341*7c568831SAndroid Build Coastguard Worker 			    xmlSAX2ErrMemory(ctxt);
1342*7c568831SAndroid Build Coastguard Worker 			    return;
1343*7c568831SAndroid Build Coastguard Worker 			}
1344*7c568831SAndroid Build Coastguard Worker 
1345*7c568831SAndroid Build Coastguard Worker 			/*
1346*7c568831SAndroid Build Coastguard Worker 			 * Check that the attribute is not declared in the
1347*7c568831SAndroid Build Coastguard Worker 			 * serialization
1348*7c568831SAndroid Build Coastguard Worker 			 */
1349*7c568831SAndroid Build Coastguard Worker 			att = NULL;
1350*7c568831SAndroid Build Coastguard Worker 			if (atts != NULL) {
1351*7c568831SAndroid Build Coastguard Worker 			    i = 0;
1352*7c568831SAndroid Build Coastguard Worker 			    att = atts[i];
1353*7c568831SAndroid Build Coastguard Worker 			    while (att != NULL) {
1354*7c568831SAndroid Build Coastguard Worker 				if (xmlStrEqual(att, fulln))
1355*7c568831SAndroid Build Coastguard Worker 				    break;
1356*7c568831SAndroid Build Coastguard Worker 				i += 2;
1357*7c568831SAndroid Build Coastguard Worker 				att = atts[i];
1358*7c568831SAndroid Build Coastguard Worker 			    }
1359*7c568831SAndroid Build Coastguard Worker 			}
1360*7c568831SAndroid Build Coastguard Worker 			if (att == NULL) {
1361*7c568831SAndroid Build Coastguard Worker 			    xmlSAX1Attribute(ctxt, fulln,
1362*7c568831SAndroid Build Coastguard Worker 					     attr->defaultValue, prefix);
1363*7c568831SAndroid Build Coastguard Worker 			}
1364*7c568831SAndroid Build Coastguard Worker 			if ((fulln != fn) && (fulln != attr->name))
1365*7c568831SAndroid Build Coastguard Worker 			    xmlFree(fulln);
1366*7c568831SAndroid Build Coastguard Worker 		    }
1367*7c568831SAndroid Build Coastguard Worker 		}
1368*7c568831SAndroid Build Coastguard Worker 	    }
1369*7c568831SAndroid Build Coastguard Worker 	    attr = attr->nexth;
1370*7c568831SAndroid Build Coastguard Worker 	}
1371*7c568831SAndroid Build Coastguard Worker 	if (internal == 1) {
1372*7c568831SAndroid Build Coastguard Worker 	    elemDecl = xmlGetDtdQElementDesc(ctxt->myDoc->extSubset,
1373*7c568831SAndroid Build Coastguard Worker 		                             name, prefix);
1374*7c568831SAndroid Build Coastguard Worker 	    internal = 0;
1375*7c568831SAndroid Build Coastguard Worker 	    goto process_external_subset;
1376*7c568831SAndroid Build Coastguard Worker 	}
1377*7c568831SAndroid Build Coastguard Worker     }
1378*7c568831SAndroid Build Coastguard Worker }
1379*7c568831SAndroid Build Coastguard Worker 
1380*7c568831SAndroid Build Coastguard Worker /**
1381*7c568831SAndroid Build Coastguard Worker  * xmlSAX1StartElement:
1382*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
1383*7c568831SAndroid Build Coastguard Worker  * @fullname:  The element name, including namespace prefix
1384*7c568831SAndroid Build Coastguard Worker  * @atts:  An array of name/value attributes pairs, NULL terminated
1385*7c568831SAndroid Build Coastguard Worker  *
1386*7c568831SAndroid Build Coastguard Worker  * called when an opening tag has been processed.
1387*7c568831SAndroid Build Coastguard Worker  *
1388*7c568831SAndroid Build Coastguard Worker  * Deprecated SAX1 interface.
1389*7c568831SAndroid Build Coastguard Worker  */
1390*7c568831SAndroid Build Coastguard Worker static void
xmlSAX1StartElement(void * ctx,const xmlChar * fullname,const xmlChar ** atts)1391*7c568831SAndroid Build Coastguard Worker xmlSAX1StartElement(void *ctx, const xmlChar *fullname, const xmlChar **atts)
1392*7c568831SAndroid Build Coastguard Worker {
1393*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
1394*7c568831SAndroid Build Coastguard Worker     xmlNodePtr ret;
1395*7c568831SAndroid Build Coastguard Worker     xmlNodePtr parent;
1396*7c568831SAndroid Build Coastguard Worker     xmlNsPtr ns;
1397*7c568831SAndroid Build Coastguard Worker     const xmlChar *name;
1398*7c568831SAndroid Build Coastguard Worker     xmlChar *prefix;
1399*7c568831SAndroid Build Coastguard Worker     const xmlChar *att;
1400*7c568831SAndroid Build Coastguard Worker     const xmlChar *value;
1401*7c568831SAndroid Build Coastguard Worker     int i, res;
1402*7c568831SAndroid Build Coastguard Worker 
1403*7c568831SAndroid Build Coastguard Worker     if ((ctx == NULL) || (fullname == NULL) || (ctxt->myDoc == NULL)) return;
1404*7c568831SAndroid Build Coastguard Worker 
1405*7c568831SAndroid Build Coastguard Worker     /*
1406*7c568831SAndroid Build Coastguard Worker      * First check on validity:
1407*7c568831SAndroid Build Coastguard Worker      */
1408*7c568831SAndroid Build Coastguard Worker     if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) &&
1409*7c568831SAndroid Build Coastguard Worker         ((ctxt->myDoc->intSubset == NULL) ||
1410*7c568831SAndroid Build Coastguard Worker 	 ((ctxt->myDoc->intSubset->notations == NULL) &&
1411*7c568831SAndroid Build Coastguard Worker 	  (ctxt->myDoc->intSubset->elements == NULL) &&
1412*7c568831SAndroid Build Coastguard Worker 	  (ctxt->myDoc->intSubset->attributes == NULL) &&
1413*7c568831SAndroid Build Coastguard Worker 	  (ctxt->myDoc->intSubset->entities == NULL)))) {
1414*7c568831SAndroid Build Coastguard Worker 	xmlErrValid(ctxt, XML_ERR_NO_DTD,
1415*7c568831SAndroid Build Coastguard Worker 	  "Validation failed: no DTD found !", NULL, NULL);
1416*7c568831SAndroid Build Coastguard Worker 	ctxt->validate = 0;
1417*7c568831SAndroid Build Coastguard Worker     }
1418*7c568831SAndroid Build Coastguard Worker 
1419*7c568831SAndroid Build Coastguard Worker     /*
1420*7c568831SAndroid Build Coastguard Worker      * Split the full name into a namespace prefix and the tag name
1421*7c568831SAndroid Build Coastguard Worker      */
1422*7c568831SAndroid Build Coastguard Worker     name = xmlSplitQName4(fullname, &prefix);
1423*7c568831SAndroid Build Coastguard Worker     if (name == NULL) {
1424*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
1425*7c568831SAndroid Build Coastguard Worker         return;
1426*7c568831SAndroid Build Coastguard Worker     }
1427*7c568831SAndroid Build Coastguard Worker 
1428*7c568831SAndroid Build Coastguard Worker     /*
1429*7c568831SAndroid Build Coastguard Worker      * Note : the namespace resolution is deferred until the end of the
1430*7c568831SAndroid Build Coastguard Worker      *        attributes parsing, since local namespace can be defined as
1431*7c568831SAndroid Build Coastguard Worker      *        an attribute at this level.
1432*7c568831SAndroid Build Coastguard Worker      */
1433*7c568831SAndroid Build Coastguard Worker     ret = xmlNewDocNode(ctxt->myDoc, NULL, name, NULL);
1434*7c568831SAndroid Build Coastguard Worker     if (ret == NULL) {
1435*7c568831SAndroid Build Coastguard Worker 	xmlFree(prefix);
1436*7c568831SAndroid Build Coastguard Worker 	xmlSAX2ErrMemory(ctxt);
1437*7c568831SAndroid Build Coastguard Worker         return;
1438*7c568831SAndroid Build Coastguard Worker     }
1439*7c568831SAndroid Build Coastguard Worker     ctxt->nodemem = -1;
1440*7c568831SAndroid Build Coastguard Worker 
1441*7c568831SAndroid Build Coastguard Worker     /* Initialize parent before pushing node */
1442*7c568831SAndroid Build Coastguard Worker     parent = ctxt->node;
1443*7c568831SAndroid Build Coastguard Worker     if (parent == NULL)
1444*7c568831SAndroid Build Coastguard Worker         parent = (xmlNodePtr) ctxt->myDoc;
1445*7c568831SAndroid Build Coastguard Worker 
1446*7c568831SAndroid Build Coastguard Worker     /*
1447*7c568831SAndroid Build Coastguard Worker      * Link the child element
1448*7c568831SAndroid Build Coastguard Worker      */
1449*7c568831SAndroid Build Coastguard Worker     xmlSAX2AppendChild(ctxt, ret);
1450*7c568831SAndroid Build Coastguard Worker 
1451*7c568831SAndroid Build Coastguard Worker     /*
1452*7c568831SAndroid Build Coastguard Worker      * We are parsing a new node.
1453*7c568831SAndroid Build Coastguard Worker      */
1454*7c568831SAndroid Build Coastguard Worker     if (nodePush(ctxt, ret) < 0) {
1455*7c568831SAndroid Build Coastguard Worker         xmlUnlinkNode(ret);
1456*7c568831SAndroid Build Coastguard Worker         xmlFreeNode(ret);
1457*7c568831SAndroid Build Coastguard Worker         if (prefix != NULL)
1458*7c568831SAndroid Build Coastguard Worker             xmlFree(prefix);
1459*7c568831SAndroid Build Coastguard Worker         return;
1460*7c568831SAndroid Build Coastguard Worker     }
1461*7c568831SAndroid Build Coastguard Worker 
1462*7c568831SAndroid Build Coastguard Worker     /*
1463*7c568831SAndroid Build Coastguard Worker      * Insert all the defaulted attributes from the DTD especially
1464*7c568831SAndroid Build Coastguard Worker      * namespaces
1465*7c568831SAndroid Build Coastguard Worker      */
1466*7c568831SAndroid Build Coastguard Worker     if ((ctxt->myDoc->intSubset != NULL) ||
1467*7c568831SAndroid Build Coastguard Worker         (ctxt->myDoc->extSubset != NULL)) {
1468*7c568831SAndroid Build Coastguard Worker         xmlCheckDefaultedAttributes(ctxt, name, prefix, atts);
1469*7c568831SAndroid Build Coastguard Worker     }
1470*7c568831SAndroid Build Coastguard Worker 
1471*7c568831SAndroid Build Coastguard Worker     /*
1472*7c568831SAndroid Build Coastguard Worker      * process all the attributes whose name start with "xmlns"
1473*7c568831SAndroid Build Coastguard Worker      */
1474*7c568831SAndroid Build Coastguard Worker     if (atts != NULL) {
1475*7c568831SAndroid Build Coastguard Worker         i = 0;
1476*7c568831SAndroid Build Coastguard Worker         att = atts[i++];
1477*7c568831SAndroid Build Coastguard Worker         value = atts[i++];
1478*7c568831SAndroid Build Coastguard Worker         while ((att != NULL) && (value != NULL)) {
1479*7c568831SAndroid Build Coastguard Worker             if ((att[0] == 'x') && (att[1] == 'm') && (att[2] == 'l') &&
1480*7c568831SAndroid Build Coastguard Worker                 (att[3] == 'n') && (att[4] == 's'))
1481*7c568831SAndroid Build Coastguard Worker                 xmlSAX1Attribute(ctxt, att, value, prefix);
1482*7c568831SAndroid Build Coastguard Worker 
1483*7c568831SAndroid Build Coastguard Worker             att = atts[i++];
1484*7c568831SAndroid Build Coastguard Worker             value = atts[i++];
1485*7c568831SAndroid Build Coastguard Worker         }
1486*7c568831SAndroid Build Coastguard Worker     }
1487*7c568831SAndroid Build Coastguard Worker 
1488*7c568831SAndroid Build Coastguard Worker     /*
1489*7c568831SAndroid Build Coastguard Worker      * Search the namespace, note that since the attributes have been
1490*7c568831SAndroid Build Coastguard Worker      * processed, the local namespaces are available.
1491*7c568831SAndroid Build Coastguard Worker      */
1492*7c568831SAndroid Build Coastguard Worker     res = xmlSearchNsSafe(ret, prefix, &ns);
1493*7c568831SAndroid Build Coastguard Worker     if (res < 0)
1494*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
1495*7c568831SAndroid Build Coastguard Worker     if ((ns == NULL) && (parent != NULL)) {
1496*7c568831SAndroid Build Coastguard Worker         res = xmlSearchNsSafe(parent, prefix, &ns);
1497*7c568831SAndroid Build Coastguard Worker         if (res < 0)
1498*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1499*7c568831SAndroid Build Coastguard Worker     }
1500*7c568831SAndroid Build Coastguard Worker     if ((prefix != NULL) && (ns == NULL)) {
1501*7c568831SAndroid Build Coastguard Worker         xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
1502*7c568831SAndroid Build Coastguard Worker                      "Namespace prefix %s is not defined\n",
1503*7c568831SAndroid Build Coastguard Worker                      prefix, NULL);
1504*7c568831SAndroid Build Coastguard Worker         ns = xmlNewNs(ret, NULL, prefix);
1505*7c568831SAndroid Build Coastguard Worker         if (ns == NULL)
1506*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1507*7c568831SAndroid Build Coastguard Worker     }
1508*7c568831SAndroid Build Coastguard Worker 
1509*7c568831SAndroid Build Coastguard Worker     /*
1510*7c568831SAndroid Build Coastguard Worker      * set the namespace node, making sure that if the default namespace
1511*7c568831SAndroid Build Coastguard Worker      * is unbound on a parent we simply keep it NULL
1512*7c568831SAndroid Build Coastguard Worker      */
1513*7c568831SAndroid Build Coastguard Worker     if ((ns != NULL) && (ns->href != NULL) &&
1514*7c568831SAndroid Build Coastguard Worker         ((ns->href[0] != 0) || (ns->prefix != NULL)))
1515*7c568831SAndroid Build Coastguard Worker         xmlSetNs(ret, ns);
1516*7c568831SAndroid Build Coastguard Worker 
1517*7c568831SAndroid Build Coastguard Worker     /*
1518*7c568831SAndroid Build Coastguard Worker      * process all the other attributes
1519*7c568831SAndroid Build Coastguard Worker      */
1520*7c568831SAndroid Build Coastguard Worker     if (atts != NULL) {
1521*7c568831SAndroid Build Coastguard Worker         i = 0;
1522*7c568831SAndroid Build Coastguard Worker 	att = atts[i++];
1523*7c568831SAndroid Build Coastguard Worker 	value = atts[i++];
1524*7c568831SAndroid Build Coastguard Worker         while ((att != NULL) && (value != NULL)) {
1525*7c568831SAndroid Build Coastguard Worker             if ((att[0] != 'x') || (att[1] != 'm') || (att[2] != 'l') ||
1526*7c568831SAndroid Build Coastguard Worker                 (att[3] != 'n') || (att[4] != 's'))
1527*7c568831SAndroid Build Coastguard Worker                 xmlSAX1Attribute(ctxt, att, value, NULL);
1528*7c568831SAndroid Build Coastguard Worker 
1529*7c568831SAndroid Build Coastguard Worker             /*
1530*7c568831SAndroid Build Coastguard Worker              * Next ones
1531*7c568831SAndroid Build Coastguard Worker              */
1532*7c568831SAndroid Build Coastguard Worker             att = atts[i++];
1533*7c568831SAndroid Build Coastguard Worker             value = atts[i++];
1534*7c568831SAndroid Build Coastguard Worker         }
1535*7c568831SAndroid Build Coastguard Worker     }
1536*7c568831SAndroid Build Coastguard Worker 
1537*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
1538*7c568831SAndroid Build Coastguard Worker     /*
1539*7c568831SAndroid Build Coastguard Worker      * If it's the Document root, finish the DTD validation and
1540*7c568831SAndroid Build Coastguard Worker      * check the document root element for validity
1541*7c568831SAndroid Build Coastguard Worker      */
1542*7c568831SAndroid Build Coastguard Worker     if ((ctxt->validate) &&
1543*7c568831SAndroid Build Coastguard Worker         ((ctxt->vctxt.flags & XML_VCTXT_DTD_VALIDATED) == 0)) {
1544*7c568831SAndroid Build Coastguard Worker 	int chk;
1545*7c568831SAndroid Build Coastguard Worker 
1546*7c568831SAndroid Build Coastguard Worker 	chk = xmlValidateDtdFinal(&ctxt->vctxt, ctxt->myDoc);
1547*7c568831SAndroid Build Coastguard Worker 	if (chk <= 0)
1548*7c568831SAndroid Build Coastguard Worker 	    ctxt->valid = 0;
1549*7c568831SAndroid Build Coastguard Worker 	if (chk < 0)
1550*7c568831SAndroid Build Coastguard Worker 	    ctxt->wellFormed = 0;
1551*7c568831SAndroid Build Coastguard Worker 	ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc);
1552*7c568831SAndroid Build Coastguard Worker 	ctxt->vctxt.flags |= XML_VCTXT_DTD_VALIDATED;
1553*7c568831SAndroid Build Coastguard Worker     }
1554*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
1555*7c568831SAndroid Build Coastguard Worker 
1556*7c568831SAndroid Build Coastguard Worker     if (prefix != NULL)
1557*7c568831SAndroid Build Coastguard Worker 	xmlFree(prefix);
1558*7c568831SAndroid Build Coastguard Worker 
1559*7c568831SAndroid Build Coastguard Worker }
1560*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
1561*7c568831SAndroid Build Coastguard Worker 
1562*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1563*7c568831SAndroid Build Coastguard Worker static void
xmlSAX2HtmlAttribute(xmlParserCtxtPtr ctxt,const xmlChar * fullname,const xmlChar * value)1564*7c568831SAndroid Build Coastguard Worker xmlSAX2HtmlAttribute(xmlParserCtxtPtr ctxt, const xmlChar *fullname,
1565*7c568831SAndroid Build Coastguard Worker                      const xmlChar *value) {
1566*7c568831SAndroid Build Coastguard Worker     xmlAttrPtr ret;
1567*7c568831SAndroid Build Coastguard Worker     xmlChar *nval = NULL;
1568*7c568831SAndroid Build Coastguard Worker 
1569*7c568831SAndroid Build Coastguard Worker     ret = xmlNewNsProp(ctxt->node, NULL, fullname, NULL);
1570*7c568831SAndroid Build Coastguard Worker     if (ret == NULL) {
1571*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
1572*7c568831SAndroid Build Coastguard Worker         return;
1573*7c568831SAndroid Build Coastguard Worker     }
1574*7c568831SAndroid Build Coastguard Worker 
1575*7c568831SAndroid Build Coastguard Worker     if ((value == NULL) && (htmlIsBooleanAttr(fullname))) {
1576*7c568831SAndroid Build Coastguard Worker         nval = xmlStrdup(fullname);
1577*7c568831SAndroid Build Coastguard Worker         if (nval == NULL) {
1578*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1579*7c568831SAndroid Build Coastguard Worker             return;
1580*7c568831SAndroid Build Coastguard Worker         }
1581*7c568831SAndroid Build Coastguard Worker         value = nval;
1582*7c568831SAndroid Build Coastguard Worker     }
1583*7c568831SAndroid Build Coastguard Worker 
1584*7c568831SAndroid Build Coastguard Worker     if (value != NULL) {
1585*7c568831SAndroid Build Coastguard Worker         ret->children = xmlNewDocText(ctxt->myDoc, value);
1586*7c568831SAndroid Build Coastguard Worker         if (ret->children == NULL) {
1587*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1588*7c568831SAndroid Build Coastguard Worker         } else {
1589*7c568831SAndroid Build Coastguard Worker             ret->last = ret->children;
1590*7c568831SAndroid Build Coastguard Worker             ret->children->parent = (xmlNodePtr) ret;
1591*7c568831SAndroid Build Coastguard Worker         }
1592*7c568831SAndroid Build Coastguard Worker     }
1593*7c568831SAndroid Build Coastguard Worker 
1594*7c568831SAndroid Build Coastguard Worker     if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) &&
1595*7c568831SAndroid Build Coastguard Worker         /*
1596*7c568831SAndroid Build Coastguard Worker          * Don't create IDs containing entity references (should
1597*7c568831SAndroid Build Coastguard Worker          * be always the case with HTML)
1598*7c568831SAndroid Build Coastguard Worker          */
1599*7c568831SAndroid Build Coastguard Worker         (ret->children != NULL) &&
1600*7c568831SAndroid Build Coastguard Worker         (ret->children->type == XML_TEXT_NODE) &&
1601*7c568831SAndroid Build Coastguard Worker         (ret->children->next == NULL)) {
1602*7c568831SAndroid Build Coastguard Worker         int res = xmlIsID(ctxt->myDoc, ctxt->node, ret);
1603*7c568831SAndroid Build Coastguard Worker 
1604*7c568831SAndroid Build Coastguard Worker         if (res < 0)
1605*7c568831SAndroid Build Coastguard Worker             xmlCtxtErrMemory(ctxt);
1606*7c568831SAndroid Build Coastguard Worker         else if (res > 0)
1607*7c568831SAndroid Build Coastguard Worker             xmlAddID(&ctxt->vctxt, ctxt->myDoc, ret->children->content, ret);
1608*7c568831SAndroid Build Coastguard Worker     }
1609*7c568831SAndroid Build Coastguard Worker 
1610*7c568831SAndroid Build Coastguard Worker     if (nval != NULL)
1611*7c568831SAndroid Build Coastguard Worker         xmlFree(nval);
1612*7c568831SAndroid Build Coastguard Worker }
1613*7c568831SAndroid Build Coastguard Worker 
1614*7c568831SAndroid Build Coastguard Worker /**
1615*7c568831SAndroid Build Coastguard Worker  * xmlSAX2StartHtmlElement:
1616*7c568831SAndroid Build Coastguard Worker  * @ctxt:  parser context
1617*7c568831SAndroid Build Coastguard Worker  * @fullname:  The element name, including namespace prefix
1618*7c568831SAndroid Build Coastguard Worker  * @atts:  An array of name/value attributes pairs, NULL terminated
1619*7c568831SAndroid Build Coastguard Worker  *
1620*7c568831SAndroid Build Coastguard Worker  * Called when an opening tag has been processed.
1621*7c568831SAndroid Build Coastguard Worker  */
1622*7c568831SAndroid Build Coastguard Worker static void
xmlSAX2StartHtmlElement(xmlParserCtxtPtr ctxt,const xmlChar * fullname,const xmlChar ** atts)1623*7c568831SAndroid Build Coastguard Worker xmlSAX2StartHtmlElement(xmlParserCtxtPtr ctxt, const xmlChar *fullname,
1624*7c568831SAndroid Build Coastguard Worker                         const xmlChar **atts) {
1625*7c568831SAndroid Build Coastguard Worker     xmlNodePtr ret;
1626*7c568831SAndroid Build Coastguard Worker     xmlNodePtr parent;
1627*7c568831SAndroid Build Coastguard Worker     const xmlChar *att;
1628*7c568831SAndroid Build Coastguard Worker     const xmlChar *value;
1629*7c568831SAndroid Build Coastguard Worker     int i;
1630*7c568831SAndroid Build Coastguard Worker 
1631*7c568831SAndroid Build Coastguard Worker     ret = xmlNewDocNode(ctxt->myDoc, NULL, fullname, NULL);
1632*7c568831SAndroid Build Coastguard Worker     if (ret == NULL) {
1633*7c568831SAndroid Build Coastguard Worker 	xmlSAX2ErrMemory(ctxt);
1634*7c568831SAndroid Build Coastguard Worker         return;
1635*7c568831SAndroid Build Coastguard Worker     }
1636*7c568831SAndroid Build Coastguard Worker     ctxt->nodemem = -1;
1637*7c568831SAndroid Build Coastguard Worker 
1638*7c568831SAndroid Build Coastguard Worker     /* Initialize parent before pushing node */
1639*7c568831SAndroid Build Coastguard Worker     parent = ctxt->node;
1640*7c568831SAndroid Build Coastguard Worker     if (parent == NULL)
1641*7c568831SAndroid Build Coastguard Worker         parent = (xmlNodePtr) ctxt->myDoc;
1642*7c568831SAndroid Build Coastguard Worker 
1643*7c568831SAndroid Build Coastguard Worker     /*
1644*7c568831SAndroid Build Coastguard Worker      * Link the child element
1645*7c568831SAndroid Build Coastguard Worker      */
1646*7c568831SAndroid Build Coastguard Worker     xmlSAX2AppendChild(ctxt, ret);
1647*7c568831SAndroid Build Coastguard Worker 
1648*7c568831SAndroid Build Coastguard Worker     /*
1649*7c568831SAndroid Build Coastguard Worker      * We are parsing a new node.
1650*7c568831SAndroid Build Coastguard Worker      */
1651*7c568831SAndroid Build Coastguard Worker     if (nodePush(ctxt, ret) < 0) {
1652*7c568831SAndroid Build Coastguard Worker         xmlUnlinkNode(ret);
1653*7c568831SAndroid Build Coastguard Worker         xmlFreeNode(ret);
1654*7c568831SAndroid Build Coastguard Worker         return;
1655*7c568831SAndroid Build Coastguard Worker     }
1656*7c568831SAndroid Build Coastguard Worker 
1657*7c568831SAndroid Build Coastguard Worker     if (atts != NULL) {
1658*7c568831SAndroid Build Coastguard Worker         i = 0;
1659*7c568831SAndroid Build Coastguard Worker 	att = atts[i++];
1660*7c568831SAndroid Build Coastguard Worker 	value = atts[i++];
1661*7c568831SAndroid Build Coastguard Worker         while (att != NULL) {
1662*7c568831SAndroid Build Coastguard Worker             xmlSAX2HtmlAttribute(ctxt, att, value);
1663*7c568831SAndroid Build Coastguard Worker             att = atts[i++];
1664*7c568831SAndroid Build Coastguard Worker             value = atts[i++];
1665*7c568831SAndroid Build Coastguard Worker         }
1666*7c568831SAndroid Build Coastguard Worker     }
1667*7c568831SAndroid Build Coastguard Worker }
1668*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_HTML_ENABLED */
1669*7c568831SAndroid Build Coastguard Worker 
1670*7c568831SAndroid Build Coastguard Worker /**
1671*7c568831SAndroid Build Coastguard Worker  * xmlSAX2StartElement:
1672*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
1673*7c568831SAndroid Build Coastguard Worker  * @fullname:  The element name, including namespace prefix
1674*7c568831SAndroid Build Coastguard Worker  * @atts:  An array of name/value attributes pairs, NULL terminated
1675*7c568831SAndroid Build Coastguard Worker  *
1676*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: Don't call this function directly.
1677*7c568831SAndroid Build Coastguard Worker  *
1678*7c568831SAndroid Build Coastguard Worker  * Called when an opening tag has been processed.
1679*7c568831SAndroid Build Coastguard Worker  *
1680*7c568831SAndroid Build Coastguard Worker  * Used for HTML and SAX1.
1681*7c568831SAndroid Build Coastguard Worker  */
1682*7c568831SAndroid Build Coastguard Worker void
xmlSAX2StartElement(void * ctx,const xmlChar * fullname,const xmlChar ** atts)1683*7c568831SAndroid Build Coastguard Worker xmlSAX2StartElement(void *ctx, const xmlChar *fullname, const xmlChar **atts) {
1684*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
1685*7c568831SAndroid Build Coastguard Worker 
1686*7c568831SAndroid Build Coastguard Worker     (void) atts;
1687*7c568831SAndroid Build Coastguard Worker 
1688*7c568831SAndroid Build Coastguard Worker     if ((ctxt == NULL) || (fullname == NULL) || (ctxt->myDoc == NULL))
1689*7c568831SAndroid Build Coastguard Worker         return;
1690*7c568831SAndroid Build Coastguard Worker 
1691*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
1692*7c568831SAndroid Build Coastguard Worker     if (!ctxt->html) {
1693*7c568831SAndroid Build Coastguard Worker         xmlSAX1StartElement(ctxt, fullname, atts);
1694*7c568831SAndroid Build Coastguard Worker         return;
1695*7c568831SAndroid Build Coastguard Worker     }
1696*7c568831SAndroid Build Coastguard Worker #endif
1697*7c568831SAndroid Build Coastguard Worker 
1698*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
1699*7c568831SAndroid Build Coastguard Worker     if (ctxt->html) {
1700*7c568831SAndroid Build Coastguard Worker         xmlSAX2StartHtmlElement(ctxt, fullname, atts);
1701*7c568831SAndroid Build Coastguard Worker         return;
1702*7c568831SAndroid Build Coastguard Worker     }
1703*7c568831SAndroid Build Coastguard Worker #endif
1704*7c568831SAndroid Build Coastguard Worker }
1705*7c568831SAndroid Build Coastguard Worker 
1706*7c568831SAndroid Build Coastguard Worker /**
1707*7c568831SAndroid Build Coastguard Worker  * xmlSAX2EndElement:
1708*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
1709*7c568831SAndroid Build Coastguard Worker  * @name:  The element name
1710*7c568831SAndroid Build Coastguard Worker  *
1711*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: Don't call this function directly.
1712*7c568831SAndroid Build Coastguard Worker  *
1713*7c568831SAndroid Build Coastguard Worker  * called when the end of an element has been detected.
1714*7c568831SAndroid Build Coastguard Worker  *
1715*7c568831SAndroid Build Coastguard Worker  * Used for HTML and SAX1.
1716*7c568831SAndroid Build Coastguard Worker  */
1717*7c568831SAndroid Build Coastguard Worker void
xmlSAX2EndElement(void * ctx,const xmlChar * name ATTRIBUTE_UNUSED)1718*7c568831SAndroid Build Coastguard Worker xmlSAX2EndElement(void *ctx, const xmlChar *name ATTRIBUTE_UNUSED)
1719*7c568831SAndroid Build Coastguard Worker {
1720*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
1721*7c568831SAndroid Build Coastguard Worker 
1722*7c568831SAndroid Build Coastguard Worker     if (ctxt == NULL)
1723*7c568831SAndroid Build Coastguard Worker         return;
1724*7c568831SAndroid Build Coastguard Worker 
1725*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_SAX1_ENABLED) && defined(LIBXML_VALID_ENABLED)
1726*7c568831SAndroid Build Coastguard Worker     if (!ctxt->html && ctxt->validate && ctxt->wellFormed &&
1727*7c568831SAndroid Build Coastguard Worker         ctxt->myDoc && ctxt->myDoc->intSubset)
1728*7c568831SAndroid Build Coastguard Worker         ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc,
1729*7c568831SAndroid Build Coastguard Worker 					     ctxt->node);
1730*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
1731*7c568831SAndroid Build Coastguard Worker 
1732*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED)
1733*7c568831SAndroid Build Coastguard Worker     ctxt->nodemem = -1;
1734*7c568831SAndroid Build Coastguard Worker 
1735*7c568831SAndroid Build Coastguard Worker     /*
1736*7c568831SAndroid Build Coastguard Worker      * end of parsing of this node.
1737*7c568831SAndroid Build Coastguard Worker      */
1738*7c568831SAndroid Build Coastguard Worker     nodePop(ctxt);
1739*7c568831SAndroid Build Coastguard Worker #endif
1740*7c568831SAndroid Build Coastguard Worker }
1741*7c568831SAndroid Build Coastguard Worker 
1742*7c568831SAndroid Build Coastguard Worker /*
1743*7c568831SAndroid Build Coastguard Worker  * xmlSAX2TextNode:
1744*7c568831SAndroid Build Coastguard Worker  * @ctxt:  the parser context
1745*7c568831SAndroid Build Coastguard Worker  * @str:  the input string
1746*7c568831SAndroid Build Coastguard Worker  * @len: the string length
1747*7c568831SAndroid Build Coastguard Worker  *
1748*7c568831SAndroid Build Coastguard Worker  * Callback for a text node
1749*7c568831SAndroid Build Coastguard Worker  *
1750*7c568831SAndroid Build Coastguard Worker  * Returns the newly allocated string or NULL if not needed or error
1751*7c568831SAndroid Build Coastguard Worker  */
1752*7c568831SAndroid Build Coastguard Worker static xmlNodePtr
xmlSAX2TextNode(xmlParserCtxtPtr ctxt,const xmlChar * str,int len)1753*7c568831SAndroid Build Coastguard Worker xmlSAX2TextNode(xmlParserCtxtPtr ctxt, const xmlChar *str, int len) {
1754*7c568831SAndroid Build Coastguard Worker     xmlNodePtr ret;
1755*7c568831SAndroid Build Coastguard Worker     const xmlChar *intern = NULL;
1756*7c568831SAndroid Build Coastguard Worker 
1757*7c568831SAndroid Build Coastguard Worker     /*
1758*7c568831SAndroid Build Coastguard Worker      * Allocate
1759*7c568831SAndroid Build Coastguard Worker      */
1760*7c568831SAndroid Build Coastguard Worker     if (ctxt->freeElems != NULL) {
1761*7c568831SAndroid Build Coastguard Worker 	ret = ctxt->freeElems;
1762*7c568831SAndroid Build Coastguard Worker 	ctxt->freeElems = ret->next;
1763*7c568831SAndroid Build Coastguard Worker 	ctxt->freeElemsNr--;
1764*7c568831SAndroid Build Coastguard Worker     } else {
1765*7c568831SAndroid Build Coastguard Worker 	ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
1766*7c568831SAndroid Build Coastguard Worker     }
1767*7c568831SAndroid Build Coastguard Worker     if (ret == NULL) {
1768*7c568831SAndroid Build Coastguard Worker         xmlCtxtErrMemory(ctxt);
1769*7c568831SAndroid Build Coastguard Worker 	return(NULL);
1770*7c568831SAndroid Build Coastguard Worker     }
1771*7c568831SAndroid Build Coastguard Worker     memset(ret, 0, sizeof(xmlNode));
1772*7c568831SAndroid Build Coastguard Worker     /*
1773*7c568831SAndroid Build Coastguard Worker      * intern the formatting blanks found between tags, or the
1774*7c568831SAndroid Build Coastguard Worker      * very short strings
1775*7c568831SAndroid Build Coastguard Worker      */
1776*7c568831SAndroid Build Coastguard Worker     if ((!ctxt->html) && (ctxt->dictNames)) {
1777*7c568831SAndroid Build Coastguard Worker         xmlChar cur = str[len];
1778*7c568831SAndroid Build Coastguard Worker 
1779*7c568831SAndroid Build Coastguard Worker 	if ((len < (int) (2 * sizeof(void *))) &&
1780*7c568831SAndroid Build Coastguard Worker 	    (ctxt->options & XML_PARSE_COMPACT)) {
1781*7c568831SAndroid Build Coastguard Worker 	    /* store the string in the node overriding properties and nsDef */
1782*7c568831SAndroid Build Coastguard Worker 	    xmlChar *tmp = (xmlChar *) &(ret->properties);
1783*7c568831SAndroid Build Coastguard Worker 	    memcpy(tmp, str, len);
1784*7c568831SAndroid Build Coastguard Worker 	    tmp[len] = 0;
1785*7c568831SAndroid Build Coastguard Worker 	    intern = tmp;
1786*7c568831SAndroid Build Coastguard Worker 	} else if ((len <= 3) && ((cur == '"') || (cur == '\'') ||
1787*7c568831SAndroid Build Coastguard Worker 	    ((cur == '<') && (str[len + 1] != '!')))) {
1788*7c568831SAndroid Build Coastguard Worker 	    intern = xmlDictLookup(ctxt->dict, str, len);
1789*7c568831SAndroid Build Coastguard Worker             if (intern == NULL) {
1790*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
1791*7c568831SAndroid Build Coastguard Worker                 xmlFree(ret);
1792*7c568831SAndroid Build Coastguard Worker                 return(NULL);
1793*7c568831SAndroid Build Coastguard Worker             }
1794*7c568831SAndroid Build Coastguard Worker 	} else if (IS_BLANK_CH(*str) && (len < 60) && (cur == '<') &&
1795*7c568831SAndroid Build Coastguard Worker 	           (str[len + 1] != '!')) {
1796*7c568831SAndroid Build Coastguard Worker 	    int i;
1797*7c568831SAndroid Build Coastguard Worker 
1798*7c568831SAndroid Build Coastguard Worker 	    for (i = 1;i < len;i++) {
1799*7c568831SAndroid Build Coastguard Worker 		if (!IS_BLANK_CH(str[i])) goto skip;
1800*7c568831SAndroid Build Coastguard Worker 	    }
1801*7c568831SAndroid Build Coastguard Worker 	    intern = xmlDictLookup(ctxt->dict, str, len);
1802*7c568831SAndroid Build Coastguard Worker             if (intern == NULL) {
1803*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
1804*7c568831SAndroid Build Coastguard Worker                 xmlFree(ret);
1805*7c568831SAndroid Build Coastguard Worker                 return(NULL);
1806*7c568831SAndroid Build Coastguard Worker             }
1807*7c568831SAndroid Build Coastguard Worker 	}
1808*7c568831SAndroid Build Coastguard Worker     }
1809*7c568831SAndroid Build Coastguard Worker skip:
1810*7c568831SAndroid Build Coastguard Worker     ret->type = XML_TEXT_NODE;
1811*7c568831SAndroid Build Coastguard Worker 
1812*7c568831SAndroid Build Coastguard Worker     ret->name = xmlStringText;
1813*7c568831SAndroid Build Coastguard Worker     if (intern == NULL) {
1814*7c568831SAndroid Build Coastguard Worker 	ret->content = xmlStrndup(str, len);
1815*7c568831SAndroid Build Coastguard Worker 	if (ret->content == NULL) {
1816*7c568831SAndroid Build Coastguard Worker 	    xmlSAX2ErrMemory(ctxt);
1817*7c568831SAndroid Build Coastguard Worker 	    xmlFree(ret);
1818*7c568831SAndroid Build Coastguard Worker 	    return(NULL);
1819*7c568831SAndroid Build Coastguard Worker 	}
1820*7c568831SAndroid Build Coastguard Worker     } else
1821*7c568831SAndroid Build Coastguard Worker 	ret->content = (xmlChar *) intern;
1822*7c568831SAndroid Build Coastguard Worker 
1823*7c568831SAndroid Build Coastguard Worker     if ((xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
1824*7c568831SAndroid Build Coastguard Worker 	xmlRegisterNodeDefaultValue(ret);
1825*7c568831SAndroid Build Coastguard Worker     return(ret);
1826*7c568831SAndroid Build Coastguard Worker }
1827*7c568831SAndroid Build Coastguard Worker 
1828*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
1829*7c568831SAndroid Build Coastguard Worker /*
1830*7c568831SAndroid Build Coastguard Worker  * xmlSAX2DecodeAttrEntities:
1831*7c568831SAndroid Build Coastguard Worker  * @ctxt:  the parser context
1832*7c568831SAndroid Build Coastguard Worker  * @str:  the input string
1833*7c568831SAndroid Build Coastguard Worker  * @len: the string length
1834*7c568831SAndroid Build Coastguard Worker  *
1835*7c568831SAndroid Build Coastguard Worker  * Remove the entities from an attribute value
1836*7c568831SAndroid Build Coastguard Worker  *
1837*7c568831SAndroid Build Coastguard Worker  * Returns the newly allocated string or NULL if not needed or error
1838*7c568831SAndroid Build Coastguard Worker  */
1839*7c568831SAndroid Build Coastguard Worker static xmlChar *
xmlSAX2DecodeAttrEntities(xmlParserCtxtPtr ctxt,const xmlChar * str,const xmlChar * end)1840*7c568831SAndroid Build Coastguard Worker xmlSAX2DecodeAttrEntities(xmlParserCtxtPtr ctxt, const xmlChar *str,
1841*7c568831SAndroid Build Coastguard Worker                           const xmlChar *end) {
1842*7c568831SAndroid Build Coastguard Worker     const xmlChar *in;
1843*7c568831SAndroid Build Coastguard Worker 
1844*7c568831SAndroid Build Coastguard Worker     in = str;
1845*7c568831SAndroid Build Coastguard Worker     while (in < end)
1846*7c568831SAndroid Build Coastguard Worker         if (*in++ == '&')
1847*7c568831SAndroid Build Coastguard Worker 	    goto decode;
1848*7c568831SAndroid Build Coastguard Worker     return(NULL);
1849*7c568831SAndroid Build Coastguard Worker decode:
1850*7c568831SAndroid Build Coastguard Worker     /*
1851*7c568831SAndroid Build Coastguard Worker      * If the value contains '&', we can be sure it was allocated and is
1852*7c568831SAndroid Build Coastguard Worker      * zero-terminated.
1853*7c568831SAndroid Build Coastguard Worker      */
1854*7c568831SAndroid Build Coastguard Worker     /* TODO: normalize if needed */
1855*7c568831SAndroid Build Coastguard Worker     return(xmlExpandEntitiesInAttValue(ctxt, str, /* normalize */ 0));
1856*7c568831SAndroid Build Coastguard Worker }
1857*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
1858*7c568831SAndroid Build Coastguard Worker 
1859*7c568831SAndroid Build Coastguard Worker /**
1860*7c568831SAndroid Build Coastguard Worker  * xmlSAX2AttributeNs:
1861*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
1862*7c568831SAndroid Build Coastguard Worker  * @localname:  the local name of the attribute
1863*7c568831SAndroid Build Coastguard Worker  * @prefix:  the attribute namespace prefix if available
1864*7c568831SAndroid Build Coastguard Worker  * @URI:  the attribute namespace name if available
1865*7c568831SAndroid Build Coastguard Worker  * @value:  Start of the attribute value
1866*7c568831SAndroid Build Coastguard Worker  * @valueend: end of the attribute value
1867*7c568831SAndroid Build Coastguard Worker  *
1868*7c568831SAndroid Build Coastguard Worker  * Handle an attribute that has been read by the parser.
1869*7c568831SAndroid Build Coastguard Worker  * The default handling is to convert the attribute into an
1870*7c568831SAndroid Build Coastguard Worker  * DOM subtree and past it in a new xmlAttr element added to
1871*7c568831SAndroid Build Coastguard Worker  * the element.
1872*7c568831SAndroid Build Coastguard Worker  *
1873*7c568831SAndroid Build Coastguard Worker  * Returns the new attribute or NULL in case of error.
1874*7c568831SAndroid Build Coastguard Worker  */
1875*7c568831SAndroid Build Coastguard Worker static xmlAttrPtr
xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt,const xmlChar * localname,const xmlChar * prefix,const xmlChar * value,const xmlChar * valueend)1876*7c568831SAndroid Build Coastguard Worker xmlSAX2AttributeNs(xmlParserCtxtPtr ctxt,
1877*7c568831SAndroid Build Coastguard Worker                    const xmlChar * localname,
1878*7c568831SAndroid Build Coastguard Worker                    const xmlChar * prefix,
1879*7c568831SAndroid Build Coastguard Worker 		   const xmlChar * value,
1880*7c568831SAndroid Build Coastguard Worker 		   const xmlChar * valueend)
1881*7c568831SAndroid Build Coastguard Worker {
1882*7c568831SAndroid Build Coastguard Worker     xmlAttrPtr ret;
1883*7c568831SAndroid Build Coastguard Worker     xmlNsPtr namespace = NULL;
1884*7c568831SAndroid Build Coastguard Worker     xmlChar *dup = NULL;
1885*7c568831SAndroid Build Coastguard Worker 
1886*7c568831SAndroid Build Coastguard Worker     /*
1887*7c568831SAndroid Build Coastguard Worker      * Note: if prefix == NULL, the attribute is not in the default namespace
1888*7c568831SAndroid Build Coastguard Worker      */
1889*7c568831SAndroid Build Coastguard Worker     if (prefix != NULL) {
1890*7c568831SAndroid Build Coastguard Worker 	namespace = xmlParserNsLookupSax(ctxt, prefix);
1891*7c568831SAndroid Build Coastguard Worker 	if ((namespace == NULL) && (xmlStrEqual(prefix, BAD_CAST "xml"))) {
1892*7c568831SAndroid Build Coastguard Worker             int res;
1893*7c568831SAndroid Build Coastguard Worker 
1894*7c568831SAndroid Build Coastguard Worker 	    res = xmlSearchNsSafe(ctxt->node, prefix, &namespace);
1895*7c568831SAndroid Build Coastguard Worker             if (res < 0)
1896*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
1897*7c568831SAndroid Build Coastguard Worker 	}
1898*7c568831SAndroid Build Coastguard Worker     }
1899*7c568831SAndroid Build Coastguard Worker 
1900*7c568831SAndroid Build Coastguard Worker     /*
1901*7c568831SAndroid Build Coastguard Worker      * allocate the node
1902*7c568831SAndroid Build Coastguard Worker      */
1903*7c568831SAndroid Build Coastguard Worker     if (ctxt->freeAttrs != NULL) {
1904*7c568831SAndroid Build Coastguard Worker         ret = ctxt->freeAttrs;
1905*7c568831SAndroid Build Coastguard Worker 	ctxt->freeAttrs = ret->next;
1906*7c568831SAndroid Build Coastguard Worker 	ctxt->freeAttrsNr--;
1907*7c568831SAndroid Build Coastguard Worker     } else {
1908*7c568831SAndroid Build Coastguard Worker         ret = xmlMalloc(sizeof(*ret));
1909*7c568831SAndroid Build Coastguard Worker         if (ret == NULL) {
1910*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1911*7c568831SAndroid Build Coastguard Worker             return(NULL);
1912*7c568831SAndroid Build Coastguard Worker         }
1913*7c568831SAndroid Build Coastguard Worker     }
1914*7c568831SAndroid Build Coastguard Worker 
1915*7c568831SAndroid Build Coastguard Worker     memset(ret, 0, sizeof(xmlAttr));
1916*7c568831SAndroid Build Coastguard Worker     ret->type = XML_ATTRIBUTE_NODE;
1917*7c568831SAndroid Build Coastguard Worker 
1918*7c568831SAndroid Build Coastguard Worker     /*
1919*7c568831SAndroid Build Coastguard Worker      * xmlParseBalancedChunkMemoryRecover had a bug that could result in
1920*7c568831SAndroid Build Coastguard Worker      * a mismatch between ctxt->node->doc and ctxt->myDoc. We use
1921*7c568831SAndroid Build Coastguard Worker      * ctxt->node->doc here, but we should somehow make sure that the
1922*7c568831SAndroid Build Coastguard Worker      * document pointers match.
1923*7c568831SAndroid Build Coastguard Worker      */
1924*7c568831SAndroid Build Coastguard Worker 
1925*7c568831SAndroid Build Coastguard Worker     /* assert(ctxt->node->doc == ctxt->myDoc); */
1926*7c568831SAndroid Build Coastguard Worker 
1927*7c568831SAndroid Build Coastguard Worker     ret->parent = ctxt->node;
1928*7c568831SAndroid Build Coastguard Worker     ret->doc = ctxt->node->doc;
1929*7c568831SAndroid Build Coastguard Worker     ret->ns = namespace;
1930*7c568831SAndroid Build Coastguard Worker 
1931*7c568831SAndroid Build Coastguard Worker     if (ctxt->dictNames) {
1932*7c568831SAndroid Build Coastguard Worker         ret->name = localname;
1933*7c568831SAndroid Build Coastguard Worker     } else {
1934*7c568831SAndroid Build Coastguard Worker         ret->name = xmlStrdup(localname);
1935*7c568831SAndroid Build Coastguard Worker         if (ret->name == NULL)
1936*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
1937*7c568831SAndroid Build Coastguard Worker     }
1938*7c568831SAndroid Build Coastguard Worker 
1939*7c568831SAndroid Build Coastguard Worker     if ((xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
1940*7c568831SAndroid Build Coastguard Worker         xmlRegisterNodeDefaultValue((xmlNodePtr)ret);
1941*7c568831SAndroid Build Coastguard Worker 
1942*7c568831SAndroid Build Coastguard Worker     if ((ctxt->replaceEntities == 0) && (!ctxt->html)) {
1943*7c568831SAndroid Build Coastguard Worker 	xmlNodePtr tmp;
1944*7c568831SAndroid Build Coastguard Worker 
1945*7c568831SAndroid Build Coastguard Worker 	/*
1946*7c568831SAndroid Build Coastguard Worker 	 * We know that if there is an entity reference, then
1947*7c568831SAndroid Build Coastguard Worker 	 * the string has been dup'ed and terminates with 0
1948*7c568831SAndroid Build Coastguard Worker 	 * otherwise with ' or "
1949*7c568831SAndroid Build Coastguard Worker 	 */
1950*7c568831SAndroid Build Coastguard Worker 	if (*valueend != 0) {
1951*7c568831SAndroid Build Coastguard Worker 	    tmp = xmlSAX2TextNode(ctxt, value, valueend - value);
1952*7c568831SAndroid Build Coastguard Worker 	    ret->children = tmp;
1953*7c568831SAndroid Build Coastguard Worker 	    ret->last = tmp;
1954*7c568831SAndroid Build Coastguard Worker 	    if (tmp != NULL) {
1955*7c568831SAndroid Build Coastguard Worker 		tmp->doc = ret->doc;
1956*7c568831SAndroid Build Coastguard Worker 		tmp->parent = (xmlNodePtr) ret;
1957*7c568831SAndroid Build Coastguard Worker 	    }
1958*7c568831SAndroid Build Coastguard Worker 	} else if (valueend > value) {
1959*7c568831SAndroid Build Coastguard Worker             if (xmlNodeParseContent((xmlNodePtr) ret, value,
1960*7c568831SAndroid Build Coastguard Worker                                     valueend - value) < 0)
1961*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
1962*7c568831SAndroid Build Coastguard Worker 	}
1963*7c568831SAndroid Build Coastguard Worker     } else if (value != NULL) {
1964*7c568831SAndroid Build Coastguard Worker 	xmlNodePtr tmp;
1965*7c568831SAndroid Build Coastguard Worker 
1966*7c568831SAndroid Build Coastguard Worker 	tmp = xmlSAX2TextNode(ctxt, value, valueend - value);
1967*7c568831SAndroid Build Coastguard Worker 	ret->children = tmp;
1968*7c568831SAndroid Build Coastguard Worker 	ret->last = tmp;
1969*7c568831SAndroid Build Coastguard Worker 	if (tmp != NULL) {
1970*7c568831SAndroid Build Coastguard Worker 	    tmp->doc = ret->doc;
1971*7c568831SAndroid Build Coastguard Worker 	    tmp->parent = (xmlNodePtr) ret;
1972*7c568831SAndroid Build Coastguard Worker 	}
1973*7c568831SAndroid Build Coastguard Worker     }
1974*7c568831SAndroid Build Coastguard Worker 
1975*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
1976*7c568831SAndroid Build Coastguard Worker     if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed &&
1977*7c568831SAndroid Build Coastguard Worker         ctxt->myDoc && ctxt->myDoc->intSubset) {
1978*7c568831SAndroid Build Coastguard Worker 	/*
1979*7c568831SAndroid Build Coastguard Worker 	 * If we don't substitute entities, the validation should be
1980*7c568831SAndroid Build Coastguard Worker 	 * done on a value with replaced entities anyway.
1981*7c568831SAndroid Build Coastguard Worker 	 */
1982*7c568831SAndroid Build Coastguard Worker         if (!ctxt->replaceEntities) {
1983*7c568831SAndroid Build Coastguard Worker 	    dup = xmlSAX2DecodeAttrEntities(ctxt, value, valueend);
1984*7c568831SAndroid Build Coastguard Worker 	    if (dup == NULL) {
1985*7c568831SAndroid Build Coastguard Worker 	        if (*valueend == 0) {
1986*7c568831SAndroid Build Coastguard Worker 		    ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt,
1987*7c568831SAndroid Build Coastguard Worker 				    ctxt->myDoc, ctxt->node, ret, value);
1988*7c568831SAndroid Build Coastguard Worker 		} else {
1989*7c568831SAndroid Build Coastguard Worker 		    /*
1990*7c568831SAndroid Build Coastguard Worker 		     * That should already be normalized.
1991*7c568831SAndroid Build Coastguard Worker 		     * cheaper to finally allocate here than duplicate
1992*7c568831SAndroid Build Coastguard Worker 		     * entry points in the full validation code
1993*7c568831SAndroid Build Coastguard Worker 		     */
1994*7c568831SAndroid Build Coastguard Worker 		    dup = xmlStrndup(value, valueend - value);
1995*7c568831SAndroid Build Coastguard Worker                     if (dup == NULL)
1996*7c568831SAndroid Build Coastguard Worker                         xmlSAX2ErrMemory(ctxt);
1997*7c568831SAndroid Build Coastguard Worker 
1998*7c568831SAndroid Build Coastguard Worker 		    ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt,
1999*7c568831SAndroid Build Coastguard Worker 				    ctxt->myDoc, ctxt->node, ret, dup);
2000*7c568831SAndroid Build Coastguard Worker 		}
2001*7c568831SAndroid Build Coastguard Worker 	    } else {
2002*7c568831SAndroid Build Coastguard Worker 	        /*
2003*7c568831SAndroid Build Coastguard Worker 		 * dup now contains a string of the flattened attribute
2004*7c568831SAndroid Build Coastguard Worker 		 * content with entities substituted. Check if we need to
2005*7c568831SAndroid Build Coastguard Worker 		 * apply an extra layer of normalization.
2006*7c568831SAndroid Build Coastguard Worker 		 * It need to be done twice ... it's an extra burden related
2007*7c568831SAndroid Build Coastguard Worker 		 * to the ability to keep references in attributes
2008*7c568831SAndroid Build Coastguard Worker 		 */
2009*7c568831SAndroid Build Coastguard Worker 		if (ctxt->attsSpecial != NULL) {
2010*7c568831SAndroid Build Coastguard Worker 		    xmlChar *nvalnorm;
2011*7c568831SAndroid Build Coastguard Worker 		    xmlChar fn[50];
2012*7c568831SAndroid Build Coastguard Worker 		    xmlChar *fullname;
2013*7c568831SAndroid Build Coastguard Worker 
2014*7c568831SAndroid Build Coastguard Worker 		    fullname = xmlBuildQName(localname, prefix, fn, 50);
2015*7c568831SAndroid Build Coastguard Worker                     if (fullname == NULL) {
2016*7c568831SAndroid Build Coastguard Worker                         xmlSAX2ErrMemory(ctxt);
2017*7c568831SAndroid Build Coastguard Worker                     } else {
2018*7c568831SAndroid Build Coastguard Worker 			ctxt->vctxt.valid = 1;
2019*7c568831SAndroid Build Coastguard Worker 		        nvalnorm = xmlValidCtxtNormalizeAttributeValue(
2020*7c568831SAndroid Build Coastguard Worker 			                 &ctxt->vctxt, ctxt->myDoc,
2021*7c568831SAndroid Build Coastguard Worker 					 ctxt->node, fullname, dup);
2022*7c568831SAndroid Build Coastguard Worker 			if (ctxt->vctxt.valid != 1)
2023*7c568831SAndroid Build Coastguard Worker 			    ctxt->valid = 0;
2024*7c568831SAndroid Build Coastguard Worker 
2025*7c568831SAndroid Build Coastguard Worker 			if ((fullname != fn) && (fullname != localname))
2026*7c568831SAndroid Build Coastguard Worker 			    xmlFree(fullname);
2027*7c568831SAndroid Build Coastguard Worker 			if (nvalnorm != NULL) {
2028*7c568831SAndroid Build Coastguard Worker 			    xmlFree(dup);
2029*7c568831SAndroid Build Coastguard Worker 			    dup = nvalnorm;
2030*7c568831SAndroid Build Coastguard Worker 			}
2031*7c568831SAndroid Build Coastguard Worker 		    }
2032*7c568831SAndroid Build Coastguard Worker 		}
2033*7c568831SAndroid Build Coastguard Worker 
2034*7c568831SAndroid Build Coastguard Worker 		ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt,
2035*7c568831SAndroid Build Coastguard Worker 			        ctxt->myDoc, ctxt->node, ret, dup);
2036*7c568831SAndroid Build Coastguard Worker 	    }
2037*7c568831SAndroid Build Coastguard Worker 	} else {
2038*7c568831SAndroid Build Coastguard Worker 	    /*
2039*7c568831SAndroid Build Coastguard Worker 	     * if entities already have been substituted, then
2040*7c568831SAndroid Build Coastguard Worker 	     * the attribute as passed is already normalized
2041*7c568831SAndroid Build Coastguard Worker 	     */
2042*7c568831SAndroid Build Coastguard Worker 	    dup = xmlStrndup(value, valueend - value);
2043*7c568831SAndroid Build Coastguard Worker             if (dup == NULL)
2044*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
2045*7c568831SAndroid Build Coastguard Worker 
2046*7c568831SAndroid Build Coastguard Worker 	    ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt,
2047*7c568831SAndroid Build Coastguard Worker 	                             ctxt->myDoc, ctxt->node, ret, dup);
2048*7c568831SAndroid Build Coastguard Worker 	}
2049*7c568831SAndroid Build Coastguard Worker     } else
2050*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
2051*7c568831SAndroid Build Coastguard Worker            if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) &&
2052*7c568831SAndroid Build Coastguard Worker                (ctxt->input->entity == NULL) &&
2053*7c568831SAndroid Build Coastguard Worker                /* Don't create IDs containing entity references */
2054*7c568831SAndroid Build Coastguard Worker                (ret->children != NULL) &&
2055*7c568831SAndroid Build Coastguard Worker                (ret->children->type == XML_TEXT_NODE) &&
2056*7c568831SAndroid Build Coastguard Worker                (ret->children->next == NULL)) {
2057*7c568831SAndroid Build Coastguard Worker         xmlChar *content = ret->children->content;
2058*7c568831SAndroid Build Coastguard Worker         /*
2059*7c568831SAndroid Build Coastguard Worker 	 * when validating, the ID registration is done at the attribute
2060*7c568831SAndroid Build Coastguard Worker 	 * validation level. Otherwise we have to do specific handling here.
2061*7c568831SAndroid Build Coastguard Worker 	 */
2062*7c568831SAndroid Build Coastguard Worker         if ((prefix == ctxt->str_xml) &&
2063*7c568831SAndroid Build Coastguard Worker 	           (localname[0] == 'i') && (localname[1] == 'd') &&
2064*7c568831SAndroid Build Coastguard Worker 		   (localname[2] == 0)) {
2065*7c568831SAndroid Build Coastguard Worker 	    /*
2066*7c568831SAndroid Build Coastguard Worker 	     * Add the xml:id value
2067*7c568831SAndroid Build Coastguard Worker 	     *
2068*7c568831SAndroid Build Coastguard Worker 	     * Open issue: normalization of the value.
2069*7c568831SAndroid Build Coastguard Worker 	     */
2070*7c568831SAndroid Build Coastguard Worker 	    if (xmlValidateNCName(content, 1) != 0) {
2071*7c568831SAndroid Build Coastguard Worker 	        xmlErrValid(ctxt, XML_DTD_XMLID_VALUE,
2072*7c568831SAndroid Build Coastguard Worker                             "xml:id : attribute value %s is not an NCName\n",
2073*7c568831SAndroid Build Coastguard Worker                             content, NULL);
2074*7c568831SAndroid Build Coastguard Worker 	    }
2075*7c568831SAndroid Build Coastguard Worker 	    xmlAddID(&ctxt->vctxt, ctxt->myDoc, content, ret);
2076*7c568831SAndroid Build Coastguard Worker 	} else {
2077*7c568831SAndroid Build Coastguard Worker             int res = xmlIsID(ctxt->myDoc, ctxt->node, ret);
2078*7c568831SAndroid Build Coastguard Worker 
2079*7c568831SAndroid Build Coastguard Worker             if (res < 0)
2080*7c568831SAndroid Build Coastguard Worker                 xmlCtxtErrMemory(ctxt);
2081*7c568831SAndroid Build Coastguard Worker             else if (res > 0)
2082*7c568831SAndroid Build Coastguard Worker                 xmlAddID(&ctxt->vctxt, ctxt->myDoc, content, ret);
2083*7c568831SAndroid Build Coastguard Worker             else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret))
2084*7c568831SAndroid Build Coastguard Worker                 xmlAddRef(&ctxt->vctxt, ctxt->myDoc, content, ret);
2085*7c568831SAndroid Build Coastguard Worker 	}
2086*7c568831SAndroid Build Coastguard Worker     }
2087*7c568831SAndroid Build Coastguard Worker     if (dup != NULL)
2088*7c568831SAndroid Build Coastguard Worker 	xmlFree(dup);
2089*7c568831SAndroid Build Coastguard Worker 
2090*7c568831SAndroid Build Coastguard Worker     return(ret);
2091*7c568831SAndroid Build Coastguard Worker }
2092*7c568831SAndroid Build Coastguard Worker 
2093*7c568831SAndroid Build Coastguard Worker /**
2094*7c568831SAndroid Build Coastguard Worker  * xmlSAX2StartElementNs:
2095*7c568831SAndroid Build Coastguard Worker  * @ctx:  the user data (XML parser context)
2096*7c568831SAndroid Build Coastguard Worker  * @localname:  the local name of the element
2097*7c568831SAndroid Build Coastguard Worker  * @prefix:  the element namespace prefix if available
2098*7c568831SAndroid Build Coastguard Worker  * @URI:  the element namespace name if available
2099*7c568831SAndroid Build Coastguard Worker  * @nb_namespaces:  number of namespace definitions on that node
2100*7c568831SAndroid Build Coastguard Worker  * @namespaces:  pointer to the array of prefix/URI pairs namespace definitions
2101*7c568831SAndroid Build Coastguard Worker  * @nb_attributes:  the number of attributes on that node
2102*7c568831SAndroid Build Coastguard Worker  * @nb_defaulted:  the number of defaulted attributes.
2103*7c568831SAndroid Build Coastguard Worker  * @attributes:  pointer to the array of (localname/prefix/URI/value/end)
2104*7c568831SAndroid Build Coastguard Worker  *               attribute values.
2105*7c568831SAndroid Build Coastguard Worker  *
2106*7c568831SAndroid Build Coastguard Worker  * SAX2 callback when an element start has been detected by the parser.
2107*7c568831SAndroid Build Coastguard Worker  * It provides the namespace information for the element, as well as
2108*7c568831SAndroid Build Coastguard Worker  * the new namespace declarations on the element.
2109*7c568831SAndroid Build Coastguard Worker  */
2110*7c568831SAndroid Build Coastguard Worker void
xmlSAX2StartElementNs(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)2111*7c568831SAndroid Build Coastguard Worker xmlSAX2StartElementNs(void *ctx,
2112*7c568831SAndroid Build Coastguard Worker                       const xmlChar *localname,
2113*7c568831SAndroid Build Coastguard Worker 		      const xmlChar *prefix,
2114*7c568831SAndroid Build Coastguard Worker 		      const xmlChar *URI,
2115*7c568831SAndroid Build Coastguard Worker 		      int nb_namespaces,
2116*7c568831SAndroid Build Coastguard Worker 		      const xmlChar **namespaces,
2117*7c568831SAndroid Build Coastguard Worker 		      int nb_attributes,
2118*7c568831SAndroid Build Coastguard Worker 		      int nb_defaulted,
2119*7c568831SAndroid Build Coastguard Worker 		      const xmlChar **attributes)
2120*7c568831SAndroid Build Coastguard Worker {
2121*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
2122*7c568831SAndroid Build Coastguard Worker     xmlNodePtr ret;
2123*7c568831SAndroid Build Coastguard Worker     xmlNsPtr last = NULL, ns;
2124*7c568831SAndroid Build Coastguard Worker     const xmlChar *uri, *pref;
2125*7c568831SAndroid Build Coastguard Worker     xmlChar *lname = NULL;
2126*7c568831SAndroid Build Coastguard Worker     int i, j;
2127*7c568831SAndroid Build Coastguard Worker 
2128*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return;
2129*7c568831SAndroid Build Coastguard Worker     /*
2130*7c568831SAndroid Build Coastguard Worker      * First check on validity:
2131*7c568831SAndroid Build Coastguard Worker      */
2132*7c568831SAndroid Build Coastguard Worker     if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) &&
2133*7c568831SAndroid Build Coastguard Worker         ((ctxt->myDoc->intSubset == NULL) ||
2134*7c568831SAndroid Build Coastguard Worker 	 ((ctxt->myDoc->intSubset->notations == NULL) &&
2135*7c568831SAndroid Build Coastguard Worker 	  (ctxt->myDoc->intSubset->elements == NULL) &&
2136*7c568831SAndroid Build Coastguard Worker 	  (ctxt->myDoc->intSubset->attributes == NULL) &&
2137*7c568831SAndroid Build Coastguard Worker 	  (ctxt->myDoc->intSubset->entities == NULL)))) {
2138*7c568831SAndroid Build Coastguard Worker 	xmlErrValid(ctxt, XML_DTD_NO_DTD,
2139*7c568831SAndroid Build Coastguard Worker 	  "Validation failed: no DTD found !", NULL, NULL);
2140*7c568831SAndroid Build Coastguard Worker 	ctxt->validate = 0;
2141*7c568831SAndroid Build Coastguard Worker     }
2142*7c568831SAndroid Build Coastguard Worker 
2143*7c568831SAndroid Build Coastguard Worker     /*
2144*7c568831SAndroid Build Coastguard Worker      * Take care of the rare case of an undefined namespace prefix
2145*7c568831SAndroid Build Coastguard Worker      */
2146*7c568831SAndroid Build Coastguard Worker     if ((prefix != NULL) && (URI == NULL)) {
2147*7c568831SAndroid Build Coastguard Worker         if (ctxt->dictNames) {
2148*7c568831SAndroid Build Coastguard Worker 	    const xmlChar *fullname;
2149*7c568831SAndroid Build Coastguard Worker 
2150*7c568831SAndroid Build Coastguard Worker 	    fullname = xmlDictQLookup(ctxt->dict, prefix, localname);
2151*7c568831SAndroid Build Coastguard Worker 	    if (fullname == NULL) {
2152*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
2153*7c568831SAndroid Build Coastguard Worker                 return;
2154*7c568831SAndroid Build Coastguard Worker             }
2155*7c568831SAndroid Build Coastguard Worker 	    localname = fullname;
2156*7c568831SAndroid Build Coastguard Worker 	} else {
2157*7c568831SAndroid Build Coastguard Worker 	    lname = xmlBuildQName(localname, prefix, NULL, 0);
2158*7c568831SAndroid Build Coastguard Worker             if (lname == NULL) {
2159*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
2160*7c568831SAndroid Build Coastguard Worker                 return;
2161*7c568831SAndroid Build Coastguard Worker             }
2162*7c568831SAndroid Build Coastguard Worker 	}
2163*7c568831SAndroid Build Coastguard Worker     }
2164*7c568831SAndroid Build Coastguard Worker     /*
2165*7c568831SAndroid Build Coastguard Worker      * allocate the node
2166*7c568831SAndroid Build Coastguard Worker      */
2167*7c568831SAndroid Build Coastguard Worker     if (ctxt->freeElems != NULL) {
2168*7c568831SAndroid Build Coastguard Worker         ret = ctxt->freeElems;
2169*7c568831SAndroid Build Coastguard Worker 	ctxt->freeElems = ret->next;
2170*7c568831SAndroid Build Coastguard Worker 	ctxt->freeElemsNr--;
2171*7c568831SAndroid Build Coastguard Worker 	memset(ret, 0, sizeof(xmlNode));
2172*7c568831SAndroid Build Coastguard Worker         ret->doc = ctxt->myDoc;
2173*7c568831SAndroid Build Coastguard Worker 	ret->type = XML_ELEMENT_NODE;
2174*7c568831SAndroid Build Coastguard Worker 
2175*7c568831SAndroid Build Coastguard Worker 	if (ctxt->dictNames)
2176*7c568831SAndroid Build Coastguard Worker 	    ret->name = localname;
2177*7c568831SAndroid Build Coastguard Worker 	else {
2178*7c568831SAndroid Build Coastguard Worker 	    if (lname == NULL)
2179*7c568831SAndroid Build Coastguard Worker 		ret->name = xmlStrdup(localname);
2180*7c568831SAndroid Build Coastguard Worker 	    else
2181*7c568831SAndroid Build Coastguard Worker 	        ret->name = lname;
2182*7c568831SAndroid Build Coastguard Worker 	    if (ret->name == NULL) {
2183*7c568831SAndroid Build Coastguard Worker 	        xmlSAX2ErrMemory(ctxt);
2184*7c568831SAndroid Build Coastguard Worker                 xmlFree(ret);
2185*7c568831SAndroid Build Coastguard Worker 		return;
2186*7c568831SAndroid Build Coastguard Worker 	    }
2187*7c568831SAndroid Build Coastguard Worker 	}
2188*7c568831SAndroid Build Coastguard Worker 	if ((xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2189*7c568831SAndroid Build Coastguard Worker 	    xmlRegisterNodeDefaultValue(ret);
2190*7c568831SAndroid Build Coastguard Worker     } else {
2191*7c568831SAndroid Build Coastguard Worker 	if (ctxt->dictNames)
2192*7c568831SAndroid Build Coastguard Worker 	    ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL,
2193*7c568831SAndroid Build Coastguard Worker 	                               (xmlChar *) localname, NULL);
2194*7c568831SAndroid Build Coastguard Worker 	else if (lname == NULL)
2195*7c568831SAndroid Build Coastguard Worker 	    ret = xmlNewDocNode(ctxt->myDoc, NULL, localname, NULL);
2196*7c568831SAndroid Build Coastguard Worker 	else
2197*7c568831SAndroid Build Coastguard Worker 	    ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, lname, NULL);
2198*7c568831SAndroid Build Coastguard Worker 	if (ret == NULL) {
2199*7c568831SAndroid Build Coastguard Worker 	    xmlSAX2ErrMemory(ctxt);
2200*7c568831SAndroid Build Coastguard Worker 	    return;
2201*7c568831SAndroid Build Coastguard Worker 	}
2202*7c568831SAndroid Build Coastguard Worker     }
2203*7c568831SAndroid Build Coastguard Worker 
2204*7c568831SAndroid Build Coastguard Worker     /*
2205*7c568831SAndroid Build Coastguard Worker      * Build the namespace list
2206*7c568831SAndroid Build Coastguard Worker      */
2207*7c568831SAndroid Build Coastguard Worker     for (i = 0,j = 0;j < nb_namespaces;j++) {
2208*7c568831SAndroid Build Coastguard Worker         pref = namespaces[i++];
2209*7c568831SAndroid Build Coastguard Worker 	uri = namespaces[i++];
2210*7c568831SAndroid Build Coastguard Worker 	ns = xmlNewNs(NULL, uri, pref);
2211*7c568831SAndroid Build Coastguard Worker 	if (ns != NULL) {
2212*7c568831SAndroid Build Coastguard Worker 	    if (last == NULL) {
2213*7c568831SAndroid Build Coastguard Worker 	        ret->nsDef = last = ns;
2214*7c568831SAndroid Build Coastguard Worker 	    } else {
2215*7c568831SAndroid Build Coastguard Worker 	        last->next = ns;
2216*7c568831SAndroid Build Coastguard Worker 		last = ns;
2217*7c568831SAndroid Build Coastguard Worker 	    }
2218*7c568831SAndroid Build Coastguard Worker 	    if ((URI != NULL) && (prefix == pref))
2219*7c568831SAndroid Build Coastguard Worker 		ret->ns = ns;
2220*7c568831SAndroid Build Coastguard Worker 	} else {
2221*7c568831SAndroid Build Coastguard Worker             xmlSAX2ErrMemory(ctxt);
2222*7c568831SAndroid Build Coastguard Worker 	    continue;
2223*7c568831SAndroid Build Coastguard Worker 	}
2224*7c568831SAndroid Build Coastguard Worker 
2225*7c568831SAndroid Build Coastguard Worker         xmlParserNsUpdateSax(ctxt, pref, ns);
2226*7c568831SAndroid Build Coastguard Worker 
2227*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
2228*7c568831SAndroid Build Coastguard Worker 	if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed &&
2229*7c568831SAndroid Build Coastguard Worker 	    ctxt->myDoc && ctxt->myDoc->intSubset) {
2230*7c568831SAndroid Build Coastguard Worker 	    ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc,
2231*7c568831SAndroid Build Coastguard Worker 	                                           ret, prefix, ns, uri);
2232*7c568831SAndroid Build Coastguard Worker 	}
2233*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
2234*7c568831SAndroid Build Coastguard Worker     }
2235*7c568831SAndroid Build Coastguard Worker     ctxt->nodemem = -1;
2236*7c568831SAndroid Build Coastguard Worker 
2237*7c568831SAndroid Build Coastguard Worker     /*
2238*7c568831SAndroid Build Coastguard Worker      * Link the child element
2239*7c568831SAndroid Build Coastguard Worker      */
2240*7c568831SAndroid Build Coastguard Worker     xmlSAX2AppendChild(ctxt, ret);
2241*7c568831SAndroid Build Coastguard Worker 
2242*7c568831SAndroid Build Coastguard Worker     /*
2243*7c568831SAndroid Build Coastguard Worker      * We are parsing a new node.
2244*7c568831SAndroid Build Coastguard Worker      */
2245*7c568831SAndroid Build Coastguard Worker     if (nodePush(ctxt, ret) < 0) {
2246*7c568831SAndroid Build Coastguard Worker         xmlUnlinkNode(ret);
2247*7c568831SAndroid Build Coastguard Worker         xmlFreeNode(ret);
2248*7c568831SAndroid Build Coastguard Worker         return;
2249*7c568831SAndroid Build Coastguard Worker     }
2250*7c568831SAndroid Build Coastguard Worker 
2251*7c568831SAndroid Build Coastguard Worker     /*
2252*7c568831SAndroid Build Coastguard Worker      * Insert the defaulted attributes from the DTD only if requested:
2253*7c568831SAndroid Build Coastguard Worker      */
2254*7c568831SAndroid Build Coastguard Worker     if ((nb_defaulted != 0) &&
2255*7c568831SAndroid Build Coastguard Worker         ((ctxt->loadsubset & XML_COMPLETE_ATTRS) == 0))
2256*7c568831SAndroid Build Coastguard Worker 	nb_attributes -= nb_defaulted;
2257*7c568831SAndroid Build Coastguard Worker 
2258*7c568831SAndroid Build Coastguard Worker     /*
2259*7c568831SAndroid Build Coastguard Worker      * Search the namespace if it wasn't already found
2260*7c568831SAndroid Build Coastguard Worker      * Note that, if prefix is NULL, this searches for the default Ns
2261*7c568831SAndroid Build Coastguard Worker      */
2262*7c568831SAndroid Build Coastguard Worker     if ((URI != NULL) && (ret->ns == NULL)) {
2263*7c568831SAndroid Build Coastguard Worker         ret->ns = xmlParserNsLookupSax(ctxt, prefix);
2264*7c568831SAndroid Build Coastguard Worker 	if ((ret->ns == NULL) && (xmlStrEqual(prefix, BAD_CAST "xml"))) {
2265*7c568831SAndroid Build Coastguard Worker             int res;
2266*7c568831SAndroid Build Coastguard Worker 
2267*7c568831SAndroid Build Coastguard Worker 	    res = xmlSearchNsSafe(ret, prefix, &ret->ns);
2268*7c568831SAndroid Build Coastguard Worker             if (res < 0)
2269*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
2270*7c568831SAndroid Build Coastguard Worker 	}
2271*7c568831SAndroid Build Coastguard Worker 	if (ret->ns == NULL) {
2272*7c568831SAndroid Build Coastguard Worker 	    ns = xmlNewNs(ret, NULL, prefix);
2273*7c568831SAndroid Build Coastguard Worker 	    if (ns == NULL) {
2274*7c568831SAndroid Build Coastguard Worker 
2275*7c568831SAndroid Build Coastguard Worker 	        xmlSAX2ErrMemory(ctxt);
2276*7c568831SAndroid Build Coastguard Worker 		return;
2277*7c568831SAndroid Build Coastguard Worker 	    }
2278*7c568831SAndroid Build Coastguard Worker             if (prefix != NULL)
2279*7c568831SAndroid Build Coastguard Worker                 xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
2280*7c568831SAndroid Build Coastguard Worker                              "Namespace prefix %s was not found\n",
2281*7c568831SAndroid Build Coastguard Worker                              prefix, NULL);
2282*7c568831SAndroid Build Coastguard Worker             else
2283*7c568831SAndroid Build Coastguard Worker                 xmlNsWarnMsg(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
2284*7c568831SAndroid Build Coastguard Worker                              "Namespace default prefix was not found\n",
2285*7c568831SAndroid Build Coastguard Worker                              NULL, NULL);
2286*7c568831SAndroid Build Coastguard Worker 	}
2287*7c568831SAndroid Build Coastguard Worker     }
2288*7c568831SAndroid Build Coastguard Worker 
2289*7c568831SAndroid Build Coastguard Worker     /*
2290*7c568831SAndroid Build Coastguard Worker      * process all the other attributes
2291*7c568831SAndroid Build Coastguard Worker      */
2292*7c568831SAndroid Build Coastguard Worker     if (nb_attributes > 0) {
2293*7c568831SAndroid Build Coastguard Worker         xmlAttrPtr prev = NULL;
2294*7c568831SAndroid Build Coastguard Worker 
2295*7c568831SAndroid Build Coastguard Worker         for (j = 0,i = 0;i < nb_attributes;i++,j+=5) {
2296*7c568831SAndroid Build Coastguard Worker             xmlAttrPtr attr = NULL;
2297*7c568831SAndroid Build Coastguard Worker 
2298*7c568831SAndroid Build Coastguard Worker 	    /*
2299*7c568831SAndroid Build Coastguard Worker 	     * Handle the rare case of an undefined attribute prefix
2300*7c568831SAndroid Build Coastguard Worker 	     */
2301*7c568831SAndroid Build Coastguard Worker 	    if ((attributes[j+1] != NULL) && (attributes[j+2] == NULL)) {
2302*7c568831SAndroid Build Coastguard Worker 		if (ctxt->dictNames) {
2303*7c568831SAndroid Build Coastguard Worker 		    const xmlChar *fullname;
2304*7c568831SAndroid Build Coastguard Worker 
2305*7c568831SAndroid Build Coastguard Worker 		    fullname = xmlDictQLookup(ctxt->dict, attributes[j+1],
2306*7c568831SAndroid Build Coastguard Worker 		                              attributes[j]);
2307*7c568831SAndroid Build Coastguard Worker 		    if (fullname == NULL) {
2308*7c568831SAndroid Build Coastguard Worker                         xmlSAX2ErrMemory(ctxt);
2309*7c568831SAndroid Build Coastguard Worker                         return;
2310*7c568831SAndroid Build Coastguard Worker                     }
2311*7c568831SAndroid Build Coastguard Worker                     attr = xmlSAX2AttributeNs(ctxt, fullname, NULL,
2312*7c568831SAndroid Build Coastguard Worker                                               attributes[j+3],
2313*7c568831SAndroid Build Coastguard Worker                                               attributes[j+4]);
2314*7c568831SAndroid Build Coastguard Worker                     goto have_attr;
2315*7c568831SAndroid Build Coastguard Worker 		} else {
2316*7c568831SAndroid Build Coastguard Worker 		    lname = xmlBuildQName(attributes[j], attributes[j+1],
2317*7c568831SAndroid Build Coastguard Worker 		                          NULL, 0);
2318*7c568831SAndroid Build Coastguard Worker 		    if (lname == NULL) {
2319*7c568831SAndroid Build Coastguard Worker                         xmlSAX2ErrMemory(ctxt);
2320*7c568831SAndroid Build Coastguard Worker                         return;
2321*7c568831SAndroid Build Coastguard Worker                     }
2322*7c568831SAndroid Build Coastguard Worker                     attr = xmlSAX2AttributeNs(ctxt, lname, NULL,
2323*7c568831SAndroid Build Coastguard Worker                                               attributes[j+3],
2324*7c568831SAndroid Build Coastguard Worker                                               attributes[j+4]);
2325*7c568831SAndroid Build Coastguard Worker                     xmlFree(lname);
2326*7c568831SAndroid Build Coastguard Worker                     goto have_attr;
2327*7c568831SAndroid Build Coastguard Worker 		}
2328*7c568831SAndroid Build Coastguard Worker 	    }
2329*7c568831SAndroid Build Coastguard Worker             attr = xmlSAX2AttributeNs(ctxt, attributes[j], attributes[j+1],
2330*7c568831SAndroid Build Coastguard Worker                                       attributes[j+3], attributes[j+4]);
2331*7c568831SAndroid Build Coastguard Worker have_attr:
2332*7c568831SAndroid Build Coastguard Worker             if (attr == NULL)
2333*7c568831SAndroid Build Coastguard Worker                 continue;
2334*7c568831SAndroid Build Coastguard Worker 
2335*7c568831SAndroid Build Coastguard Worker             /* link at the end to preserve order */
2336*7c568831SAndroid Build Coastguard Worker             if (prev == NULL) {
2337*7c568831SAndroid Build Coastguard Worker                 ctxt->node->properties = attr;
2338*7c568831SAndroid Build Coastguard Worker             } else {
2339*7c568831SAndroid Build Coastguard Worker                 prev->next = attr;
2340*7c568831SAndroid Build Coastguard Worker                 attr->prev = prev;
2341*7c568831SAndroid Build Coastguard Worker             }
2342*7c568831SAndroid Build Coastguard Worker 
2343*7c568831SAndroid Build Coastguard Worker             prev = attr;
2344*7c568831SAndroid Build Coastguard Worker 	}
2345*7c568831SAndroid Build Coastguard Worker     }
2346*7c568831SAndroid Build Coastguard Worker 
2347*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
2348*7c568831SAndroid Build Coastguard Worker     /*
2349*7c568831SAndroid Build Coastguard Worker      * If it's the Document root, finish the DTD validation and
2350*7c568831SAndroid Build Coastguard Worker      * check the document root element for validity
2351*7c568831SAndroid Build Coastguard Worker      */
2352*7c568831SAndroid Build Coastguard Worker     if ((ctxt->validate) &&
2353*7c568831SAndroid Build Coastguard Worker         ((ctxt->vctxt.flags & XML_VCTXT_DTD_VALIDATED) == 0)) {
2354*7c568831SAndroid Build Coastguard Worker 	int chk;
2355*7c568831SAndroid Build Coastguard Worker 
2356*7c568831SAndroid Build Coastguard Worker 	chk = xmlValidateDtdFinal(&ctxt->vctxt, ctxt->myDoc);
2357*7c568831SAndroid Build Coastguard Worker 	if (chk <= 0)
2358*7c568831SAndroid Build Coastguard Worker 	    ctxt->valid = 0;
2359*7c568831SAndroid Build Coastguard Worker 	if (chk < 0)
2360*7c568831SAndroid Build Coastguard Worker 	    ctxt->wellFormed = 0;
2361*7c568831SAndroid Build Coastguard Worker 	ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc);
2362*7c568831SAndroid Build Coastguard Worker 	ctxt->vctxt.flags |= XML_VCTXT_DTD_VALIDATED;
2363*7c568831SAndroid Build Coastguard Worker     }
2364*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
2365*7c568831SAndroid Build Coastguard Worker }
2366*7c568831SAndroid Build Coastguard Worker 
2367*7c568831SAndroid Build Coastguard Worker /**
2368*7c568831SAndroid Build Coastguard Worker  * xmlSAX2EndElementNs:
2369*7c568831SAndroid Build Coastguard Worker  * @ctx:  the user data (XML parser context)
2370*7c568831SAndroid Build Coastguard Worker  * @localname:  the local name of the element
2371*7c568831SAndroid Build Coastguard Worker  * @prefix:  the element namespace prefix if available
2372*7c568831SAndroid Build Coastguard Worker  * @URI:  the element namespace name if available
2373*7c568831SAndroid Build Coastguard Worker  *
2374*7c568831SAndroid Build Coastguard Worker  * SAX2 callback when an element end has been detected by the parser.
2375*7c568831SAndroid Build Coastguard Worker  * It provides the namespace information for the element.
2376*7c568831SAndroid Build Coastguard Worker  */
2377*7c568831SAndroid Build Coastguard Worker void
xmlSAX2EndElementNs(void * ctx,const xmlChar * localname ATTRIBUTE_UNUSED,const xmlChar * prefix ATTRIBUTE_UNUSED,const xmlChar * URI ATTRIBUTE_UNUSED)2378*7c568831SAndroid Build Coastguard Worker xmlSAX2EndElementNs(void *ctx,
2379*7c568831SAndroid Build Coastguard Worker                     const xmlChar * localname ATTRIBUTE_UNUSED,
2380*7c568831SAndroid Build Coastguard Worker                     const xmlChar * prefix ATTRIBUTE_UNUSED,
2381*7c568831SAndroid Build Coastguard Worker 		    const xmlChar * URI ATTRIBUTE_UNUSED)
2382*7c568831SAndroid Build Coastguard Worker {
2383*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
2384*7c568831SAndroid Build Coastguard Worker 
2385*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return;
2386*7c568831SAndroid Build Coastguard Worker     ctxt->nodemem = -1;
2387*7c568831SAndroid Build Coastguard Worker 
2388*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
2389*7c568831SAndroid Build Coastguard Worker     if (ctxt->validate && ctxt->wellFormed &&
2390*7c568831SAndroid Build Coastguard Worker         ctxt->myDoc && ctxt->myDoc->intSubset)
2391*7c568831SAndroid Build Coastguard Worker         ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc,
2392*7c568831SAndroid Build Coastguard Worker                                              ctxt->node);
2393*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
2394*7c568831SAndroid Build Coastguard Worker 
2395*7c568831SAndroid Build Coastguard Worker     /*
2396*7c568831SAndroid Build Coastguard Worker      * end of parsing of this node.
2397*7c568831SAndroid Build Coastguard Worker      */
2398*7c568831SAndroid Build Coastguard Worker     nodePop(ctxt);
2399*7c568831SAndroid Build Coastguard Worker }
2400*7c568831SAndroid Build Coastguard Worker 
2401*7c568831SAndroid Build Coastguard Worker /**
2402*7c568831SAndroid Build Coastguard Worker  * xmlSAX2Reference:
2403*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
2404*7c568831SAndroid Build Coastguard Worker  * @name:  The entity name
2405*7c568831SAndroid Build Coastguard Worker  *
2406*7c568831SAndroid Build Coastguard Worker  * called when an entity xmlSAX2Reference is detected.
2407*7c568831SAndroid Build Coastguard Worker  */
2408*7c568831SAndroid Build Coastguard Worker void
xmlSAX2Reference(void * ctx,const xmlChar * name)2409*7c568831SAndroid Build Coastguard Worker xmlSAX2Reference(void *ctx, const xmlChar *name)
2410*7c568831SAndroid Build Coastguard Worker {
2411*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
2412*7c568831SAndroid Build Coastguard Worker     xmlNodePtr ret;
2413*7c568831SAndroid Build Coastguard Worker 
2414*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return;
2415*7c568831SAndroid Build Coastguard Worker     ret = xmlNewReference(ctxt->myDoc, name);
2416*7c568831SAndroid Build Coastguard Worker     if (ret == NULL) {
2417*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
2418*7c568831SAndroid Build Coastguard Worker         return;
2419*7c568831SAndroid Build Coastguard Worker     }
2420*7c568831SAndroid Build Coastguard Worker 
2421*7c568831SAndroid Build Coastguard Worker     xmlSAX2AppendChild(ctxt, ret);
2422*7c568831SAndroid Build Coastguard Worker }
2423*7c568831SAndroid Build Coastguard Worker 
2424*7c568831SAndroid Build Coastguard Worker /**
2425*7c568831SAndroid Build Coastguard Worker  * xmlSAX2Text:
2426*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
2427*7c568831SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
2428*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
2429*7c568831SAndroid Build Coastguard Worker  * @type: text or cdata
2430*7c568831SAndroid Build Coastguard Worker  *
2431*7c568831SAndroid Build Coastguard Worker  * Append characters.
2432*7c568831SAndroid Build Coastguard Worker  */
2433*7c568831SAndroid Build Coastguard Worker static void
xmlSAX2Text(xmlParserCtxtPtr ctxt,const xmlChar * ch,int len,xmlElementType type)2434*7c568831SAndroid Build Coastguard Worker xmlSAX2Text(xmlParserCtxtPtr ctxt, const xmlChar *ch, int len,
2435*7c568831SAndroid Build Coastguard Worker             xmlElementType type)
2436*7c568831SAndroid Build Coastguard Worker {
2437*7c568831SAndroid Build Coastguard Worker     xmlNodePtr lastChild;
2438*7c568831SAndroid Build Coastguard Worker 
2439*7c568831SAndroid Build Coastguard Worker     if (ctxt == NULL) return;
2440*7c568831SAndroid Build Coastguard Worker     /*
2441*7c568831SAndroid Build Coastguard Worker      * Handle the data if any. If there is no child
2442*7c568831SAndroid Build Coastguard Worker      * add it as content, otherwise if the last child is text,
2443*7c568831SAndroid Build Coastguard Worker      * concatenate it, else create a new node of type text.
2444*7c568831SAndroid Build Coastguard Worker      */
2445*7c568831SAndroid Build Coastguard Worker 
2446*7c568831SAndroid Build Coastguard Worker     if (ctxt->node == NULL) {
2447*7c568831SAndroid Build Coastguard Worker         return;
2448*7c568831SAndroid Build Coastguard Worker     }
2449*7c568831SAndroid Build Coastguard Worker     lastChild = ctxt->node->last;
2450*7c568831SAndroid Build Coastguard Worker 
2451*7c568831SAndroid Build Coastguard Worker     /*
2452*7c568831SAndroid Build Coastguard Worker      * Here we needed an accelerator mechanism in case of very large
2453*7c568831SAndroid Build Coastguard Worker      * elements. Use an attribute in the structure !!!
2454*7c568831SAndroid Build Coastguard Worker      */
2455*7c568831SAndroid Build Coastguard Worker     if (lastChild == NULL) {
2456*7c568831SAndroid Build Coastguard Worker         if (type == XML_TEXT_NODE)
2457*7c568831SAndroid Build Coastguard Worker             lastChild = xmlSAX2TextNode(ctxt, ch, len);
2458*7c568831SAndroid Build Coastguard Worker         else
2459*7c568831SAndroid Build Coastguard Worker             lastChild = xmlNewCDataBlock(ctxt->myDoc, ch, len);
2460*7c568831SAndroid Build Coastguard Worker 	if (lastChild != NULL) {
2461*7c568831SAndroid Build Coastguard Worker 	    ctxt->node->children = lastChild;
2462*7c568831SAndroid Build Coastguard Worker 	    ctxt->node->last = lastChild;
2463*7c568831SAndroid Build Coastguard Worker 	    lastChild->parent = ctxt->node;
2464*7c568831SAndroid Build Coastguard Worker 	    lastChild->doc = ctxt->node->doc;
2465*7c568831SAndroid Build Coastguard Worker 	    ctxt->nodelen = len;
2466*7c568831SAndroid Build Coastguard Worker 	    ctxt->nodemem = len + 1;
2467*7c568831SAndroid Build Coastguard Worker 	} else {
2468*7c568831SAndroid Build Coastguard Worker 	    xmlSAX2ErrMemory(ctxt);
2469*7c568831SAndroid Build Coastguard Worker 	    return;
2470*7c568831SAndroid Build Coastguard Worker 	}
2471*7c568831SAndroid Build Coastguard Worker     } else {
2472*7c568831SAndroid Build Coastguard Worker 	int coalesceText = (lastChild != NULL) &&
2473*7c568831SAndroid Build Coastguard Worker 	    (lastChild->type == type) &&
2474*7c568831SAndroid Build Coastguard Worker 	    (((ctxt->html) && (type != XML_TEXT_NODE)) ||
2475*7c568831SAndroid Build Coastguard Worker              (lastChild->name == xmlStringText));
2476*7c568831SAndroid Build Coastguard Worker 	if ((coalesceText) && (ctxt->nodemem != 0)) {
2477*7c568831SAndroid Build Coastguard Worker             int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
2478*7c568831SAndroid Build Coastguard Worker                             XML_MAX_HUGE_LENGTH :
2479*7c568831SAndroid Build Coastguard Worker                             XML_MAX_TEXT_LENGTH;
2480*7c568831SAndroid Build Coastguard Worker 
2481*7c568831SAndroid Build Coastguard Worker 	    /*
2482*7c568831SAndroid Build Coastguard Worker 	     * The whole point of maintaining nodelen and nodemem,
2483*7c568831SAndroid Build Coastguard Worker 	     * xmlTextConcat is too costly, i.e. compute length,
2484*7c568831SAndroid Build Coastguard Worker 	     * reallocate a new buffer, move data, append ch. Here
2485*7c568831SAndroid Build Coastguard Worker 	     * We try to minimize realloc() uses and avoid copying
2486*7c568831SAndroid Build Coastguard Worker 	     * and recomputing length over and over.
2487*7c568831SAndroid Build Coastguard Worker 	     */
2488*7c568831SAndroid Build Coastguard Worker 	    if (lastChild->content == (xmlChar *)&(lastChild->properties)) {
2489*7c568831SAndroid Build Coastguard Worker 		lastChild->content = xmlStrdup(lastChild->content);
2490*7c568831SAndroid Build Coastguard Worker 		lastChild->properties = NULL;
2491*7c568831SAndroid Build Coastguard Worker 	    } else if ((ctxt->nodemem == ctxt->nodelen + 1) &&
2492*7c568831SAndroid Build Coastguard Worker 	               (xmlDictOwns(ctxt->dict, lastChild->content))) {
2493*7c568831SAndroid Build Coastguard Worker 		lastChild->content = xmlStrdup(lastChild->content);
2494*7c568831SAndroid Build Coastguard Worker 	    }
2495*7c568831SAndroid Build Coastguard Worker 	    if (lastChild->content == NULL) {
2496*7c568831SAndroid Build Coastguard Worker 		xmlSAX2ErrMemory(ctxt);
2497*7c568831SAndroid Build Coastguard Worker 		return;
2498*7c568831SAndroid Build Coastguard Worker  	    }
2499*7c568831SAndroid Build Coastguard Worker             if ((len > maxLength) || (ctxt->nodelen > maxLength - len)) {
2500*7c568831SAndroid Build Coastguard Worker                 xmlFatalErr(ctxt, XML_ERR_RESOURCE_LIMIT,
2501*7c568831SAndroid Build Coastguard Worker                             "Text node too long, try XML_PARSE_HUGE");
2502*7c568831SAndroid Build Coastguard Worker                 xmlHaltParser(ctxt);
2503*7c568831SAndroid Build Coastguard Worker                 return;
2504*7c568831SAndroid Build Coastguard Worker             }
2505*7c568831SAndroid Build Coastguard Worker 	    if (ctxt->nodelen + len >= ctxt->nodemem) {
2506*7c568831SAndroid Build Coastguard Worker 		xmlChar *newbuf;
2507*7c568831SAndroid Build Coastguard Worker 		int size;
2508*7c568831SAndroid Build Coastguard Worker 
2509*7c568831SAndroid Build Coastguard Worker 		size = ctxt->nodemem > INT_MAX - len ?
2510*7c568831SAndroid Build Coastguard Worker                        INT_MAX :
2511*7c568831SAndroid Build Coastguard Worker                        ctxt->nodemem + len;
2512*7c568831SAndroid Build Coastguard Worker 		size = size > INT_MAX / 2 ? INT_MAX : size * 2;
2513*7c568831SAndroid Build Coastguard Worker                 newbuf = (xmlChar *) xmlRealloc(lastChild->content,size);
2514*7c568831SAndroid Build Coastguard Worker 		if (newbuf == NULL) {
2515*7c568831SAndroid Build Coastguard Worker 		    xmlSAX2ErrMemory(ctxt);
2516*7c568831SAndroid Build Coastguard Worker 		    return;
2517*7c568831SAndroid Build Coastguard Worker 		}
2518*7c568831SAndroid Build Coastguard Worker 		ctxt->nodemem = size;
2519*7c568831SAndroid Build Coastguard Worker 		lastChild->content = newbuf;
2520*7c568831SAndroid Build Coastguard Worker 	    }
2521*7c568831SAndroid Build Coastguard Worker 	    memcpy(&lastChild->content[ctxt->nodelen], ch, len);
2522*7c568831SAndroid Build Coastguard Worker 	    ctxt->nodelen += len;
2523*7c568831SAndroid Build Coastguard Worker 	    lastChild->content[ctxt->nodelen] = 0;
2524*7c568831SAndroid Build Coastguard Worker 	} else if (coalesceText) {
2525*7c568831SAndroid Build Coastguard Worker 	    if (xmlTextConcat(lastChild, ch, len)) {
2526*7c568831SAndroid Build Coastguard Worker 		xmlSAX2ErrMemory(ctxt);
2527*7c568831SAndroid Build Coastguard Worker 	    }
2528*7c568831SAndroid Build Coastguard Worker 	    if (ctxt->node->children != NULL) {
2529*7c568831SAndroid Build Coastguard Worker 		ctxt->nodelen = xmlStrlen(lastChild->content);
2530*7c568831SAndroid Build Coastguard Worker 		ctxt->nodemem = ctxt->nodelen + 1;
2531*7c568831SAndroid Build Coastguard Worker 	    }
2532*7c568831SAndroid Build Coastguard Worker 	} else {
2533*7c568831SAndroid Build Coastguard Worker 	    /* Mixed content, first time */
2534*7c568831SAndroid Build Coastguard Worker             if (type == XML_TEXT_NODE) {
2535*7c568831SAndroid Build Coastguard Worker                 lastChild = xmlSAX2TextNode(ctxt, ch, len);
2536*7c568831SAndroid Build Coastguard Worker                 if (lastChild != NULL)
2537*7c568831SAndroid Build Coastguard Worker                     lastChild->doc = ctxt->myDoc;
2538*7c568831SAndroid Build Coastguard Worker             } else
2539*7c568831SAndroid Build Coastguard Worker                 lastChild = xmlNewCDataBlock(ctxt->myDoc, ch, len);
2540*7c568831SAndroid Build Coastguard Worker 	    if (lastChild == NULL) {
2541*7c568831SAndroid Build Coastguard Worker                 xmlSAX2ErrMemory(ctxt);
2542*7c568831SAndroid Build Coastguard Worker             } else {
2543*7c568831SAndroid Build Coastguard Worker 		xmlSAX2AppendChild(ctxt, lastChild);
2544*7c568831SAndroid Build Coastguard Worker 		if (ctxt->node->children != NULL) {
2545*7c568831SAndroid Build Coastguard Worker 		    ctxt->nodelen = len;
2546*7c568831SAndroid Build Coastguard Worker 		    ctxt->nodemem = len + 1;
2547*7c568831SAndroid Build Coastguard Worker 		}
2548*7c568831SAndroid Build Coastguard Worker 	    }
2549*7c568831SAndroid Build Coastguard Worker 	}
2550*7c568831SAndroid Build Coastguard Worker     }
2551*7c568831SAndroid Build Coastguard Worker 
2552*7c568831SAndroid Build Coastguard Worker     if ((lastChild != NULL) &&
2553*7c568831SAndroid Build Coastguard Worker         (type == XML_TEXT_NODE) &&
2554*7c568831SAndroid Build Coastguard Worker         (ctxt->linenumbers) &&
2555*7c568831SAndroid Build Coastguard Worker         (ctxt->input != NULL)) {
2556*7c568831SAndroid Build Coastguard Worker         if ((unsigned) ctxt->input->line < (unsigned) USHRT_MAX)
2557*7c568831SAndroid Build Coastguard Worker             lastChild->line = ctxt->input->line;
2558*7c568831SAndroid Build Coastguard Worker         else {
2559*7c568831SAndroid Build Coastguard Worker             lastChild->line = USHRT_MAX;
2560*7c568831SAndroid Build Coastguard Worker             if (ctxt->options & XML_PARSE_BIG_LINES)
2561*7c568831SAndroid Build Coastguard Worker                 lastChild->psvi = (void *) (ptrdiff_t) ctxt->input->line;
2562*7c568831SAndroid Build Coastguard Worker         }
2563*7c568831SAndroid Build Coastguard Worker     }
2564*7c568831SAndroid Build Coastguard Worker }
2565*7c568831SAndroid Build Coastguard Worker 
2566*7c568831SAndroid Build Coastguard Worker /**
2567*7c568831SAndroid Build Coastguard Worker  * xmlSAX2Characters:
2568*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
2569*7c568831SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
2570*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
2571*7c568831SAndroid Build Coastguard Worker  *
2572*7c568831SAndroid Build Coastguard Worker  * receiving some chars from the parser.
2573*7c568831SAndroid Build Coastguard Worker  */
2574*7c568831SAndroid Build Coastguard Worker void
xmlSAX2Characters(void * ctx,const xmlChar * ch,int len)2575*7c568831SAndroid Build Coastguard Worker xmlSAX2Characters(void *ctx, const xmlChar *ch, int len)
2576*7c568831SAndroid Build Coastguard Worker {
2577*7c568831SAndroid Build Coastguard Worker     xmlSAX2Text((xmlParserCtxtPtr) ctx, ch, len, XML_TEXT_NODE);
2578*7c568831SAndroid Build Coastguard Worker }
2579*7c568831SAndroid Build Coastguard Worker 
2580*7c568831SAndroid Build Coastguard Worker /**
2581*7c568831SAndroid Build Coastguard Worker  * xmlSAX2IgnorableWhitespace:
2582*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
2583*7c568831SAndroid Build Coastguard Worker  * @ch:  a xmlChar string
2584*7c568831SAndroid Build Coastguard Worker  * @len: the number of xmlChar
2585*7c568831SAndroid Build Coastguard Worker  *
2586*7c568831SAndroid Build Coastguard Worker  * receiving some ignorable whitespaces from the parser.
2587*7c568831SAndroid Build Coastguard Worker  * UNUSED: by default the DOM building will use xmlSAX2Characters
2588*7c568831SAndroid Build Coastguard Worker  */
2589*7c568831SAndroid Build Coastguard Worker void
xmlSAX2IgnorableWhitespace(void * ctx ATTRIBUTE_UNUSED,const xmlChar * ch ATTRIBUTE_UNUSED,int len ATTRIBUTE_UNUSED)2590*7c568831SAndroid Build Coastguard Worker xmlSAX2IgnorableWhitespace(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED)
2591*7c568831SAndroid Build Coastguard Worker {
2592*7c568831SAndroid Build Coastguard Worker }
2593*7c568831SAndroid Build Coastguard Worker 
2594*7c568831SAndroid Build Coastguard Worker /**
2595*7c568831SAndroid Build Coastguard Worker  * xmlSAX2ProcessingInstruction:
2596*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
2597*7c568831SAndroid Build Coastguard Worker  * @target:  the target name
2598*7c568831SAndroid Build Coastguard Worker  * @data: the PI data's
2599*7c568831SAndroid Build Coastguard Worker  *
2600*7c568831SAndroid Build Coastguard Worker  * A processing instruction has been parsed.
2601*7c568831SAndroid Build Coastguard Worker  */
2602*7c568831SAndroid Build Coastguard Worker void
xmlSAX2ProcessingInstruction(void * ctx,const xmlChar * target,const xmlChar * data)2603*7c568831SAndroid Build Coastguard Worker xmlSAX2ProcessingInstruction(void *ctx, const xmlChar *target,
2604*7c568831SAndroid Build Coastguard Worker                       const xmlChar *data)
2605*7c568831SAndroid Build Coastguard Worker {
2606*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
2607*7c568831SAndroid Build Coastguard Worker     xmlNodePtr ret;
2608*7c568831SAndroid Build Coastguard Worker 
2609*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return;
2610*7c568831SAndroid Build Coastguard Worker 
2611*7c568831SAndroid Build Coastguard Worker     ret = xmlNewDocPI(ctxt->myDoc, target, data);
2612*7c568831SAndroid Build Coastguard Worker     if (ret == NULL) {
2613*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
2614*7c568831SAndroid Build Coastguard Worker         return;
2615*7c568831SAndroid Build Coastguard Worker     }
2616*7c568831SAndroid Build Coastguard Worker 
2617*7c568831SAndroid Build Coastguard Worker     xmlSAX2AppendChild(ctxt, ret);
2618*7c568831SAndroid Build Coastguard Worker }
2619*7c568831SAndroid Build Coastguard Worker 
2620*7c568831SAndroid Build Coastguard Worker /**
2621*7c568831SAndroid Build Coastguard Worker  * xmlSAX2Comment:
2622*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
2623*7c568831SAndroid Build Coastguard Worker  * @value:  the xmlSAX2Comment content
2624*7c568831SAndroid Build Coastguard Worker  *
2625*7c568831SAndroid Build Coastguard Worker  * A xmlSAX2Comment has been parsed.
2626*7c568831SAndroid Build Coastguard Worker  */
2627*7c568831SAndroid Build Coastguard Worker void
xmlSAX2Comment(void * ctx,const xmlChar * value)2628*7c568831SAndroid Build Coastguard Worker xmlSAX2Comment(void *ctx, const xmlChar *value)
2629*7c568831SAndroid Build Coastguard Worker {
2630*7c568831SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
2631*7c568831SAndroid Build Coastguard Worker     xmlNodePtr ret;
2632*7c568831SAndroid Build Coastguard Worker 
2633*7c568831SAndroid Build Coastguard Worker     if (ctx == NULL) return;
2634*7c568831SAndroid Build Coastguard Worker 
2635*7c568831SAndroid Build Coastguard Worker     ret = xmlNewDocComment(ctxt->myDoc, value);
2636*7c568831SAndroid Build Coastguard Worker     if (ret == NULL) {
2637*7c568831SAndroid Build Coastguard Worker         xmlSAX2ErrMemory(ctxt);
2638*7c568831SAndroid Build Coastguard Worker         return;
2639*7c568831SAndroid Build Coastguard Worker     }
2640*7c568831SAndroid Build Coastguard Worker 
2641*7c568831SAndroid Build Coastguard Worker     xmlSAX2AppendChild(ctxt, ret);
2642*7c568831SAndroid Build Coastguard Worker }
2643*7c568831SAndroid Build Coastguard Worker 
2644*7c568831SAndroid Build Coastguard Worker /**
2645*7c568831SAndroid Build Coastguard Worker  * xmlSAX2CDataBlock:
2646*7c568831SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
2647*7c568831SAndroid Build Coastguard Worker  * @value:  The pcdata content
2648*7c568831SAndroid Build Coastguard Worker  * @len:  the block length
2649*7c568831SAndroid Build Coastguard Worker  *
2650*7c568831SAndroid Build Coastguard Worker  * called when a pcdata block has been parsed
2651*7c568831SAndroid Build Coastguard Worker  */
2652*7c568831SAndroid Build Coastguard Worker void
xmlSAX2CDataBlock(void * ctx,const xmlChar * value,int len)2653*7c568831SAndroid Build Coastguard Worker xmlSAX2CDataBlock(void *ctx, const xmlChar *value, int len)
2654*7c568831SAndroid Build Coastguard Worker {
2655*7c568831SAndroid Build Coastguard Worker     xmlSAX2Text((xmlParserCtxtPtr) ctx, value, len, XML_CDATA_SECTION_NODE);
2656*7c568831SAndroid Build Coastguard Worker }
2657*7c568831SAndroid Build Coastguard Worker 
2658*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
2659*7c568831SAndroid Build Coastguard Worker /**
2660*7c568831SAndroid Build Coastguard Worker  * xmlSAXDefaultVersion:
2661*7c568831SAndroid Build Coastguard Worker  * @version:  the version, must be 2
2662*7c568831SAndroid Build Coastguard Worker  *
2663*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: Use parser option XML_PARSE_SAX1.
2664*7c568831SAndroid Build Coastguard Worker  *
2665*7c568831SAndroid Build Coastguard Worker  * Has no effect.
2666*7c568831SAndroid Build Coastguard Worker  *
2667*7c568831SAndroid Build Coastguard Worker  * Returns 2 in case of success and -1 in case of error.
2668*7c568831SAndroid Build Coastguard Worker  */
2669*7c568831SAndroid Build Coastguard Worker int
xmlSAXDefaultVersion(int version)2670*7c568831SAndroid Build Coastguard Worker xmlSAXDefaultVersion(int version)
2671*7c568831SAndroid Build Coastguard Worker {
2672*7c568831SAndroid Build Coastguard Worker     if (version != 2)
2673*7c568831SAndroid Build Coastguard Worker         return(-1);
2674*7c568831SAndroid Build Coastguard Worker     return(2);
2675*7c568831SAndroid Build Coastguard Worker }
2676*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
2677*7c568831SAndroid Build Coastguard Worker 
2678*7c568831SAndroid Build Coastguard Worker /**
2679*7c568831SAndroid Build Coastguard Worker  * xmlSAXVersion:
2680*7c568831SAndroid Build Coastguard Worker  * @hdlr:  the SAX handler
2681*7c568831SAndroid Build Coastguard Worker  * @version:  the version, 1 or 2
2682*7c568831SAndroid Build Coastguard Worker  *
2683*7c568831SAndroid Build Coastguard Worker  * Initialize the default XML SAX handler according to the version
2684*7c568831SAndroid Build Coastguard Worker  *
2685*7c568831SAndroid Build Coastguard Worker  * Returns 0 in case of success and -1 in case of error.
2686*7c568831SAndroid Build Coastguard Worker  */
2687*7c568831SAndroid Build Coastguard Worker int
xmlSAXVersion(xmlSAXHandler * hdlr,int version)2688*7c568831SAndroid Build Coastguard Worker xmlSAXVersion(xmlSAXHandler *hdlr, int version)
2689*7c568831SAndroid Build Coastguard Worker {
2690*7c568831SAndroid Build Coastguard Worker     if (hdlr == NULL) return(-1);
2691*7c568831SAndroid Build Coastguard Worker     if (version == 2) {
2692*7c568831SAndroid Build Coastguard Worker 	hdlr->startElementNs = xmlSAX2StartElementNs;
2693*7c568831SAndroid Build Coastguard Worker 	hdlr->endElementNs = xmlSAX2EndElementNs;
2694*7c568831SAndroid Build Coastguard Worker 	hdlr->serror = NULL;
2695*7c568831SAndroid Build Coastguard Worker 	hdlr->initialized = XML_SAX2_MAGIC;
2696*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
2697*7c568831SAndroid Build Coastguard Worker     } else if (version == 1) {
2698*7c568831SAndroid Build Coastguard Worker 	hdlr->initialized = 1;
2699*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
2700*7c568831SAndroid Build Coastguard Worker     } else
2701*7c568831SAndroid Build Coastguard Worker         return(-1);
2702*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_SAX1_ENABLED
2703*7c568831SAndroid Build Coastguard Worker     hdlr->startElement = xmlSAX2StartElement;
2704*7c568831SAndroid Build Coastguard Worker     hdlr->endElement = xmlSAX2EndElement;
2705*7c568831SAndroid Build Coastguard Worker #else
2706*7c568831SAndroid Build Coastguard Worker     hdlr->startElement = NULL;
2707*7c568831SAndroid Build Coastguard Worker     hdlr->endElement = NULL;
2708*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_SAX1_ENABLED */
2709*7c568831SAndroid Build Coastguard Worker     hdlr->internalSubset = xmlSAX2InternalSubset;
2710*7c568831SAndroid Build Coastguard Worker     hdlr->externalSubset = xmlSAX2ExternalSubset;
2711*7c568831SAndroid Build Coastguard Worker     hdlr->isStandalone = xmlSAX2IsStandalone;
2712*7c568831SAndroid Build Coastguard Worker     hdlr->hasInternalSubset = xmlSAX2HasInternalSubset;
2713*7c568831SAndroid Build Coastguard Worker     hdlr->hasExternalSubset = xmlSAX2HasExternalSubset;
2714*7c568831SAndroid Build Coastguard Worker     hdlr->resolveEntity = xmlSAX2ResolveEntity;
2715*7c568831SAndroid Build Coastguard Worker     hdlr->getEntity = xmlSAX2GetEntity;
2716*7c568831SAndroid Build Coastguard Worker     hdlr->getParameterEntity = xmlSAX2GetParameterEntity;
2717*7c568831SAndroid Build Coastguard Worker     hdlr->entityDecl = xmlSAX2EntityDecl;
2718*7c568831SAndroid Build Coastguard Worker     hdlr->attributeDecl = xmlSAX2AttributeDecl;
2719*7c568831SAndroid Build Coastguard Worker     hdlr->elementDecl = xmlSAX2ElementDecl;
2720*7c568831SAndroid Build Coastguard Worker     hdlr->notationDecl = xmlSAX2NotationDecl;
2721*7c568831SAndroid Build Coastguard Worker     hdlr->unparsedEntityDecl = xmlSAX2UnparsedEntityDecl;
2722*7c568831SAndroid Build Coastguard Worker     hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator;
2723*7c568831SAndroid Build Coastguard Worker     hdlr->startDocument = xmlSAX2StartDocument;
2724*7c568831SAndroid Build Coastguard Worker     hdlr->endDocument = xmlSAX2EndDocument;
2725*7c568831SAndroid Build Coastguard Worker     hdlr->reference = xmlSAX2Reference;
2726*7c568831SAndroid Build Coastguard Worker     hdlr->characters = xmlSAX2Characters;
2727*7c568831SAndroid Build Coastguard Worker     hdlr->cdataBlock = xmlSAX2CDataBlock;
2728*7c568831SAndroid Build Coastguard Worker     hdlr->ignorableWhitespace = xmlSAX2Characters;
2729*7c568831SAndroid Build Coastguard Worker     hdlr->processingInstruction = xmlSAX2ProcessingInstruction;
2730*7c568831SAndroid Build Coastguard Worker     hdlr->comment = xmlSAX2Comment;
2731*7c568831SAndroid Build Coastguard Worker     hdlr->warning = xmlParserWarning;
2732*7c568831SAndroid Build Coastguard Worker     hdlr->error = xmlParserError;
2733*7c568831SAndroid Build Coastguard Worker     hdlr->fatalError = xmlParserError;
2734*7c568831SAndroid Build Coastguard Worker 
2735*7c568831SAndroid Build Coastguard Worker     return(0);
2736*7c568831SAndroid Build Coastguard Worker }
2737*7c568831SAndroid Build Coastguard Worker 
2738*7c568831SAndroid Build Coastguard Worker /**
2739*7c568831SAndroid Build Coastguard Worker  * xmlSAX2InitDefaultSAXHandler:
2740*7c568831SAndroid Build Coastguard Worker  * @hdlr:  the SAX handler
2741*7c568831SAndroid Build Coastguard Worker  * @warning:  flag if non-zero sets the handler warning procedure
2742*7c568831SAndroid Build Coastguard Worker  *
2743*7c568831SAndroid Build Coastguard Worker  * Initialize the default XML SAX2 handler
2744*7c568831SAndroid Build Coastguard Worker  */
2745*7c568831SAndroid Build Coastguard Worker void
xmlSAX2InitDefaultSAXHandler(xmlSAXHandler * hdlr,int warning)2746*7c568831SAndroid Build Coastguard Worker xmlSAX2InitDefaultSAXHandler(xmlSAXHandler *hdlr, int warning)
2747*7c568831SAndroid Build Coastguard Worker {
2748*7c568831SAndroid Build Coastguard Worker     if ((hdlr == NULL) || (hdlr->initialized != 0))
2749*7c568831SAndroid Build Coastguard Worker 	return;
2750*7c568831SAndroid Build Coastguard Worker 
2751*7c568831SAndroid Build Coastguard Worker     xmlSAXVersion(hdlr, 2);
2752*7c568831SAndroid Build Coastguard Worker     if (warning == 0)
2753*7c568831SAndroid Build Coastguard Worker 	hdlr->warning = NULL;
2754*7c568831SAndroid Build Coastguard Worker }
2755*7c568831SAndroid Build Coastguard Worker 
2756*7c568831SAndroid Build Coastguard Worker /**
2757*7c568831SAndroid Build Coastguard Worker  * xmlDefaultSAXHandlerInit:
2758*7c568831SAndroid Build Coastguard Worker  *
2759*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: This function is a no-op. Call xmlInitParser to
2760*7c568831SAndroid Build Coastguard Worker  * initialize the library.
2761*7c568831SAndroid Build Coastguard Worker  *
2762*7c568831SAndroid Build Coastguard Worker  * Initialize the default SAX2 handler
2763*7c568831SAndroid Build Coastguard Worker  */
2764*7c568831SAndroid Build Coastguard Worker void
xmlDefaultSAXHandlerInit(void)2765*7c568831SAndroid Build Coastguard Worker xmlDefaultSAXHandlerInit(void)
2766*7c568831SAndroid Build Coastguard Worker {
2767*7c568831SAndroid Build Coastguard Worker }
2768*7c568831SAndroid Build Coastguard Worker 
2769*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2770*7c568831SAndroid Build Coastguard Worker 
2771*7c568831SAndroid Build Coastguard Worker /**
2772*7c568831SAndroid Build Coastguard Worker  * xmlSAX2InitHtmlDefaultSAXHandler:
2773*7c568831SAndroid Build Coastguard Worker  * @hdlr:  the SAX handler
2774*7c568831SAndroid Build Coastguard Worker  *
2775*7c568831SAndroid Build Coastguard Worker  * Initialize the default HTML SAX2 handler
2776*7c568831SAndroid Build Coastguard Worker  */
2777*7c568831SAndroid Build Coastguard Worker void
xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler * hdlr)2778*7c568831SAndroid Build Coastguard Worker xmlSAX2InitHtmlDefaultSAXHandler(xmlSAXHandler *hdlr)
2779*7c568831SAndroid Build Coastguard Worker {
2780*7c568831SAndroid Build Coastguard Worker     if ((hdlr == NULL) || (hdlr->initialized != 0))
2781*7c568831SAndroid Build Coastguard Worker 	return;
2782*7c568831SAndroid Build Coastguard Worker 
2783*7c568831SAndroid Build Coastguard Worker     hdlr->internalSubset = xmlSAX2InternalSubset;
2784*7c568831SAndroid Build Coastguard Worker     hdlr->externalSubset = NULL;
2785*7c568831SAndroid Build Coastguard Worker     hdlr->isStandalone = NULL;
2786*7c568831SAndroid Build Coastguard Worker     hdlr->hasInternalSubset = NULL;
2787*7c568831SAndroid Build Coastguard Worker     hdlr->hasExternalSubset = NULL;
2788*7c568831SAndroid Build Coastguard Worker     hdlr->resolveEntity = NULL;
2789*7c568831SAndroid Build Coastguard Worker     hdlr->getEntity = xmlSAX2GetEntity;
2790*7c568831SAndroid Build Coastguard Worker     hdlr->getParameterEntity = NULL;
2791*7c568831SAndroid Build Coastguard Worker     hdlr->entityDecl = NULL;
2792*7c568831SAndroid Build Coastguard Worker     hdlr->attributeDecl = NULL;
2793*7c568831SAndroid Build Coastguard Worker     hdlr->elementDecl = NULL;
2794*7c568831SAndroid Build Coastguard Worker     hdlr->notationDecl = NULL;
2795*7c568831SAndroid Build Coastguard Worker     hdlr->unparsedEntityDecl = NULL;
2796*7c568831SAndroid Build Coastguard Worker     hdlr->setDocumentLocator = xmlSAX2SetDocumentLocator;
2797*7c568831SAndroid Build Coastguard Worker     hdlr->startDocument = xmlSAX2StartDocument;
2798*7c568831SAndroid Build Coastguard Worker     hdlr->endDocument = xmlSAX2EndDocument;
2799*7c568831SAndroid Build Coastguard Worker     hdlr->startElement = xmlSAX2StartElement;
2800*7c568831SAndroid Build Coastguard Worker     hdlr->endElement = xmlSAX2EndElement;
2801*7c568831SAndroid Build Coastguard Worker     hdlr->reference = NULL;
2802*7c568831SAndroid Build Coastguard Worker     hdlr->characters = xmlSAX2Characters;
2803*7c568831SAndroid Build Coastguard Worker     hdlr->cdataBlock = xmlSAX2CDataBlock;
2804*7c568831SAndroid Build Coastguard Worker     hdlr->ignorableWhitespace = xmlSAX2IgnorableWhitespace;
2805*7c568831SAndroid Build Coastguard Worker     hdlr->processingInstruction = xmlSAX2ProcessingInstruction;
2806*7c568831SAndroid Build Coastguard Worker     hdlr->comment = xmlSAX2Comment;
2807*7c568831SAndroid Build Coastguard Worker     hdlr->warning = xmlParserWarning;
2808*7c568831SAndroid Build Coastguard Worker     hdlr->error = xmlParserError;
2809*7c568831SAndroid Build Coastguard Worker     hdlr->fatalError = xmlParserError;
2810*7c568831SAndroid Build Coastguard Worker 
2811*7c568831SAndroid Build Coastguard Worker     hdlr->initialized = 1;
2812*7c568831SAndroid Build Coastguard Worker }
2813*7c568831SAndroid Build Coastguard Worker 
2814*7c568831SAndroid Build Coastguard Worker /**
2815*7c568831SAndroid Build Coastguard Worker  * htmlDefaultSAXHandlerInit:
2816*7c568831SAndroid Build Coastguard Worker  *
2817*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: This function is a no-op. Call xmlInitParser to
2818*7c568831SAndroid Build Coastguard Worker  * initialize the library.
2819*7c568831SAndroid Build Coastguard Worker  */
2820*7c568831SAndroid Build Coastguard Worker void
htmlDefaultSAXHandlerInit(void)2821*7c568831SAndroid Build Coastguard Worker htmlDefaultSAXHandlerInit(void)
2822*7c568831SAndroid Build Coastguard Worker {
2823*7c568831SAndroid Build Coastguard Worker }
2824*7c568831SAndroid Build Coastguard Worker 
2825*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_HTML_ENABLED */
2826