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