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