pocjenkixx 0.30.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pocjenkixx might be problematic. Click here for more details.

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