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