OLD | NEW |
1 /* | 1 /* |
2 * parser.c : an XML 1.0 parser, namespaces and validity support are mostly | 2 * parser.c : an XML 1.0 parser, namespaces and validity support are mostly |
3 * implemented on top of the SAX interfaces | 3 * implemented on top of the SAX interfaces |
4 * | 4 * |
5 * References: | 5 * References: |
6 * The XML specification: | 6 * The XML specification: |
7 * http://www.w3.org/TR/REC-xml | 7 * http://www.w3.org/TR/REC-xml |
8 * Original 1.0 version: | 8 * Original 1.0 version: |
9 * http://www.w3.org/TR/1998/REC-xml-19980210 | 9 * http://www.w3.org/TR/1998/REC-xml-19980210 |
10 * XML second edition working draft | 10 * XML second edition working draft |
11 * http://www.w3.org/TR/2000/WD-xml-2e-20000814 | 11 * http://www.w3.org/TR/2000/WD-xml-2e-20000814 |
12 * | 12 * |
13 * Okay this is a big file, the parser core is around 7000 lines, then it | 13 * Okay this is a big file, the parser core is around 7000 lines, then it |
14 * is followed by the progressive parser top routines, then the various | 14 * is followed by the progressive parser top routines, then the various |
15 * high level APIs to call the parser and a few miscellaneous functions. | 15 * high level APIs to call the parser and a few miscellaneous functions. |
16 * A number of helper functions and deprecated ones have been moved to | 16 * A number of helper functions and deprecated ones have been moved to |
17 * parserInternals.c to reduce this file size. | 17 * parserInternals.c to reduce this file size. |
18 * As much as possible the functions are associated with their relative | 18 * As much as possible the functions are associated with their relative |
19 * production in the XML specification. A few productions defining the | 19 * production in the XML specification. A few productions defining the |
20 * different ranges of character are actually implanted either in | 20 * different ranges of character are actually implanted either in |
21 * parserInternals.h or parserInternals.c | 21 * parserInternals.h or parserInternals.c |
22 * The DOM tree build is realized from the default SAX callbacks in | 22 * The DOM tree build is realized from the default SAX callbacks in |
23 * the module SAX.c. | 23 * the module SAX.c. |
24 * The routines doing the validation checks are in valid.c and called either | 24 * The routines doing the validation checks are in valid.c and called either |
25 * from the SAX callbacks or as standalone functions using a preparsed | 25 * from the SAX callbacks or as standalone functions using a preparsed |
26 * document. | 26 * document. |
27 * | 27 * |
28 * See Copyright for the status of this software. | 28 * See Copyright for the status of this software. |
29 * | 29 * |
30 * daniel@veillard.com | 30 * daniel@veillard.com |
31 */ | 31 */ |
32 | 32 |
33 #define IN_LIBXML | 33 #define IN_LIBXML |
34 #include "libxml.h" | 34 #include "libxml.h" |
35 | 35 |
36 #if defined(WIN32) && !defined (__CYGWIN__) | 36 #if defined(WIN32) && !defined (__CYGWIN__) |
37 #define XML_DIR_SEP '\\' | 37 #define XML_DIR_SEP '\\' |
38 #else | 38 #else |
39 #define XML_DIR_SEP '/' | 39 #define XML_DIR_SEP '/' |
40 #endif | 40 #endif |
41 | 41 |
42 #include <stdlib.h> | 42 #include <stdlib.h> |
| 43 #include <limits.h> |
43 #include <string.h> | 44 #include <string.h> |
44 #include <stdarg.h> | 45 #include <stdarg.h> |
45 #include <libxml/xmlmemory.h> | 46 #include <libxml/xmlmemory.h> |
46 #include <libxml/threads.h> | 47 #include <libxml/threads.h> |
47 #include <libxml/globals.h> | 48 #include <libxml/globals.h> |
48 #include <libxml/tree.h> | 49 #include <libxml/tree.h> |
49 #include <libxml/parser.h> | 50 #include <libxml/parser.h> |
50 #include <libxml/parserInternals.h> | 51 #include <libxml/parserInternals.h> |
51 #include <libxml/valid.h> | 52 #include <libxml/valid.h> |
52 #include <libxml/entities.h> | 53 #include <libxml/entities.h> |
(...skipping 19 matching lines...) Expand all Loading... |
72 #endif | 73 #endif |
73 #ifdef HAVE_FCNTL_H | 74 #ifdef HAVE_FCNTL_H |
74 #include <fcntl.h> | 75 #include <fcntl.h> |
75 #endif | 76 #endif |
76 #ifdef HAVE_UNISTD_H | 77 #ifdef HAVE_UNISTD_H |
77 #include <unistd.h> | 78 #include <unistd.h> |
78 #endif | 79 #endif |
79 #ifdef HAVE_ZLIB_H | 80 #ifdef HAVE_ZLIB_H |
80 #include <zlib.h> | 81 #include <zlib.h> |
81 #endif | 82 #endif |
| 83 #ifdef HAVE_LZMA_H |
| 84 #include <lzma.h> |
| 85 #endif |
| 86 |
| 87 #include "buf.h" |
| 88 #include "enc.h" |
82 | 89 |
83 static void | 90 static void |
84 xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info); | 91 xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info); |
85 | 92 |
86 static xmlParserCtxtPtr | 93 static xmlParserCtxtPtr |
87 xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID, | 94 xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID, |
88 const xmlChar *base, xmlParserCtxtPtr pctx); | 95 const xmlChar *base, xmlParserCtxtPtr pctx); |
89 | 96 |
90 /************************************************************************ | 97 /************************************************************************ |
91 * * | 98 * * |
(...skipping 15 matching lines...) Expand all Loading... |
107 /* | 114 /* |
108 * xmlParserEntityCheck | 115 * xmlParserEntityCheck |
109 * | 116 * |
110 * Function to check non-linear entity expansion behaviour | 117 * Function to check non-linear entity expansion behaviour |
111 * This is here to detect and stop exponential linear entity expansion | 118 * This is here to detect and stop exponential linear entity expansion |
112 * This is not a limitation of the parser but a safety | 119 * This is not a limitation of the parser but a safety |
113 * boundary feature. It can be disabled with the XML_PARSE_HUGE | 120 * boundary feature. It can be disabled with the XML_PARSE_HUGE |
114 * parser option. | 121 * parser option. |
115 */ | 122 */ |
116 static int | 123 static int |
117 xmlParserEntityCheck(xmlParserCtxtPtr ctxt, unsigned long size, | 124 xmlParserEntityCheck(xmlParserCtxtPtr ctxt, size_t size, |
118 xmlEntityPtr ent) | 125 xmlEntityPtr ent, size_t replacement) |
119 { | 126 { |
120 unsigned long consumed = 0; | 127 size_t consumed = 0; |
121 | 128 |
122 if ((ctxt == NULL) || (ctxt->options & XML_PARSE_HUGE)) | 129 if ((ctxt == NULL) || (ctxt->options & XML_PARSE_HUGE)) |
123 return (0); | 130 return (0); |
124 if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) | 131 if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) |
125 return (1); | 132 return (1); |
126 if (size != 0) { | 133 |
| 134 /* |
| 135 * This may look absurd but is needed to detect |
| 136 * entities problems |
| 137 */ |
| 138 if ((ent != NULL) && (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && |
| 139 » (ent->content != NULL) && (ent->checked == 0)) { |
| 140 » unsigned long oldnbent = ctxt->nbentities; |
| 141 » xmlChar *rep; |
| 142 |
| 143 » ent->checked = 1; |
| 144 |
| 145 » rep = xmlStringDecodeEntities(ctxt, ent->content, |
| 146 » » » » XML_SUBSTITUTE_REF, 0, 0, 0); |
| 147 |
| 148 » ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
| 149 » if (rep != NULL) { |
| 150 » if (xmlStrchr(rep, '<')) |
| 151 » » ent->checked |= 1; |
| 152 » xmlFree(rep); |
| 153 » rep = NULL; |
| 154 » } |
| 155 } |
| 156 if (replacement != 0) { |
| 157 » if (replacement < XML_MAX_TEXT_LENGTH) |
| 158 » return(0); |
| 159 |
| 160 /* |
| 161 » * If the volume of entity copy reaches 10 times the |
| 162 » * amount of parsed data and over the large text threshold |
| 163 » * then that's very likely to be an abuse. |
| 164 » */ |
| 165 if (ctxt->input != NULL) { |
| 166 » consumed = ctxt->input->consumed + |
| 167 » (ctxt->input->cur - ctxt->input->base); |
| 168 » } |
| 169 consumed += ctxt->sizeentities; |
| 170 |
| 171 if (replacement < XML_PARSER_NON_LINEAR * consumed) |
| 172 » return(0); |
| 173 } else if (size != 0) { |
127 /* | 174 /* |
128 * Do the check based on the replacement size of the entity | 175 * Do the check based on the replacement size of the entity |
129 */ | 176 */ |
130 if (size < XML_PARSER_BIG_ENTITY) | 177 if (size < XML_PARSER_BIG_ENTITY) |
131 return(0); | 178 return(0); |
132 | 179 |
133 /* | 180 /* |
134 * A limit on the amount of text data reasonably used | 181 * A limit on the amount of text data reasonably used |
135 */ | 182 */ |
136 if (ctxt->input != NULL) { | 183 if (ctxt->input != NULL) { |
137 consumed = ctxt->input->consumed + | 184 consumed = ctxt->input->consumed + |
138 (ctxt->input->cur - ctxt->input->base); | 185 (ctxt->input->cur - ctxt->input->base); |
139 } | 186 } |
140 consumed += ctxt->sizeentities; | 187 consumed += ctxt->sizeentities; |
141 | 188 |
142 if ((size < XML_PARSER_NON_LINEAR * consumed) && | 189 if ((size < XML_PARSER_NON_LINEAR * consumed) && |
143 (ctxt->nbentities * 3 < XML_PARSER_NON_LINEAR * consumed)) | 190 (ctxt->nbentities * 3 < XML_PARSER_NON_LINEAR * consumed)) |
144 return (0); | 191 return (0); |
145 } else if (ent != NULL) { | 192 } else if (ent != NULL) { |
146 /* | 193 /* |
147 * use the number of parsed entities in the replacement | 194 * use the number of parsed entities in the replacement |
148 */ | 195 */ |
149 size = ent->checked; | 196 size = ent->checked / 2; |
150 | 197 |
151 /* | 198 /* |
152 * The amount of data parsed counting entities size only once | 199 * The amount of data parsed counting entities size only once |
153 */ | 200 */ |
154 if (ctxt->input != NULL) { | 201 if (ctxt->input != NULL) { |
155 consumed = ctxt->input->consumed + | 202 consumed = ctxt->input->consumed + |
156 (ctxt->input->cur - ctxt->input->base); | 203 (ctxt->input->cur - ctxt->input->base); |
157 } | 204 } |
158 consumed += ctxt->sizeentities; | 205 consumed += ctxt->sizeentities; |
159 | 206 |
160 /* | 207 /* |
161 * Check the density of entities for the amount of data | 208 * Check the density of entities for the amount of data |
162 * knowing an entity reference will take at least 3 bytes | 209 * knowing an entity reference will take at least 3 bytes |
163 */ | 210 */ |
164 if (size * 3 < consumed * XML_PARSER_NON_LINEAR) | 211 if (size * 3 < consumed * XML_PARSER_NON_LINEAR) |
165 return (0); | 212 return (0); |
166 } else { | 213 } else { |
167 /* | 214 /* |
168 * strange we got no data for checking just return | 215 * strange we got no data for checking |
169 */ | 216 */ |
170 return (0); | 217 » if (((ctxt->lastError.code != XML_ERR_UNDECLARED_ENTITY) && |
| 218 » (ctxt->lastError.code != XML_WAR_UNDECLARED_ENTITY)) || |
| 219 » (ctxt->nbentities <= 10000)) |
| 220 » return (0); |
171 } | 221 } |
172 | |
173 xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); | 222 xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); |
174 return (1); | 223 return (1); |
175 } | 224 } |
176 | 225 |
177 /** | 226 /** |
178 * xmlParserMaxDepth: | 227 * xmlParserMaxDepth: |
179 * | 228 * |
180 * arbitrary depth limit for the XML documents that we allow to | 229 * arbitrary depth limit for the XML documents that we allow to |
181 * process. This is not a limitation of the parser but a safety | 230 * process. This is not a limitation of the parser but a safety |
182 * boundary feature. It can be disabled with the XML_PARSE_HUGE | 231 * boundary feature. It can be disabled with the XML_PARSE_HUGE |
183 * parser option. | 232 * parser option. |
184 */ | 233 */ |
185 unsigned int xmlParserMaxDepth = 256; | 234 unsigned int xmlParserMaxDepth = 256; |
186 | 235 |
187 | 236 |
188 | 237 |
189 #define SAX2 1 | 238 #define SAX2 1 |
190 #define XML_PARSER_BIG_BUFFER_SIZE 300 | 239 #define XML_PARSER_BIG_BUFFER_SIZE 300 |
191 #define XML_PARSER_BUFFER_SIZE 100 | 240 #define XML_PARSER_BUFFER_SIZE 100 |
192 #define SAX_COMPAT_MODE BAD_CAST "SAX compatibility mode document" | 241 #define SAX_COMPAT_MODE BAD_CAST "SAX compatibility mode document" |
193 | 242 |
| 243 /** |
| 244 * XML_PARSER_CHUNK_SIZE |
| 245 * |
| 246 * When calling GROW that's the minimal amount of data |
| 247 * the parser expected to have received. It is not a hard |
| 248 * limit but an optimization when reading strings like Names |
| 249 * It is not strictly needed as long as inputs available characters |
| 250 * are followed by 0, which should be provided by the I/O level |
| 251 */ |
| 252 #define XML_PARSER_CHUNK_SIZE 100 |
| 253 |
194 /* | 254 /* |
195 * List of XML prefixed PI allowed by W3C specs | 255 * List of XML prefixed PI allowed by W3C specs |
196 */ | 256 */ |
197 | 257 |
198 static const char *xmlW3CPIs[] = { | 258 static const char *xmlW3CPIs[] = { |
199 "xml-stylesheet", | 259 "xml-stylesheet", |
| 260 "xml-model", |
200 NULL | 261 NULL |
201 }; | 262 }; |
202 | 263 |
203 | 264 |
204 /* DEPR void xmlParserHandleReference(xmlParserCtxtPtr ctxt); */ | 265 /* DEPR void xmlParserHandleReference(xmlParserCtxtPtr ctxt); */ |
205 static xmlEntityPtr xmlParseStringPEReference(xmlParserCtxtPtr ctxt, | 266 static xmlEntityPtr xmlParseStringPEReference(xmlParserCtxtPtr ctxt, |
206 const xmlChar **str); | 267 const xmlChar **str); |
207 | 268 |
208 static xmlParserErrors | 269 static xmlParserErrors |
209 xmlParseExternalEntityPrivate(xmlDocPtr doc, xmlParserCtxtPtr oldctxt, | 270 xmlParseExternalEntityPrivate(xmlDocPtr doc, xmlParserCtxtPtr oldctxt, |
(...skipping 12 matching lines...) Expand all Loading... |
222 | 283 |
223 static xmlParserErrors | 284 static xmlParserErrors |
224 xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt, | 285 xmlParseBalancedChunkMemoryInternal(xmlParserCtxtPtr oldctxt, |
225 const xmlChar *string, void *user_data, xmlNodePtr *lst); | 286 const xmlChar *string, void *user_data, xmlNodePtr *lst); |
226 | 287 |
227 static int | 288 static int |
228 xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity); | 289 xmlLoadEntityContent(xmlParserCtxtPtr ctxt, xmlEntityPtr entity); |
229 | 290 |
230 /************************************************************************ | 291 /************************************************************************ |
231 * * | 292 * * |
232 * » » Some factorized error routines» » » » * | 293 *» » Some factorized error routines» » » » * |
233 * * | 294 * * |
234 ************************************************************************/ | 295 ************************************************************************/ |
235 | 296 |
236 /** | 297 /** |
237 * xmlErrAttributeDup: | 298 * xmlErrAttributeDup: |
238 * @ctxt: an XML parser context | 299 * @ctxt: an XML parser context |
239 * @prefix: the attribute prefix | 300 * @prefix: the attribute prefix |
240 * @localname: the attribute localname | 301 * @localname: the attribute localname |
241 * | 302 * |
242 * Handle a redefinition of attribute error | 303 * Handle a redefinition of attribute error |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 * @ctxt: an XML parser context | 335 * @ctxt: an XML parser context |
275 * @error: the error number | 336 * @error: the error number |
276 * @extra: extra information string | 337 * @extra: extra information string |
277 * | 338 * |
278 * Handle a fatal parser error, i.e. violating Well-Formedness constraints | 339 * Handle a fatal parser error, i.e. violating Well-Formedness constraints |
279 */ | 340 */ |
280 static void | 341 static void |
281 xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info) | 342 xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info) |
282 { | 343 { |
283 const char *errmsg; | 344 const char *errmsg; |
| 345 char errstr[129] = ""; |
284 | 346 |
285 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 347 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
286 (ctxt->instate == XML_PARSER_EOF)) | 348 (ctxt->instate == XML_PARSER_EOF)) |
287 return; | 349 return; |
288 switch (error) { | 350 switch (error) { |
289 case XML_ERR_INVALID_HEX_CHARREF: | 351 case XML_ERR_INVALID_HEX_CHARREF: |
290 errmsg = "CharRef: invalid hexadecimal value\n"; | 352 errmsg = "CharRef: invalid hexadecimal value"; |
291 break; | 353 break; |
292 case XML_ERR_INVALID_DEC_CHARREF: | 354 case XML_ERR_INVALID_DEC_CHARREF: |
293 errmsg = "CharRef: invalid decimal value\n"; | 355 errmsg = "CharRef: invalid decimal value"; |
294 break; | 356 break; |
295 case XML_ERR_INVALID_CHARREF: | 357 case XML_ERR_INVALID_CHARREF: |
296 errmsg = "CharRef: invalid value\n"; | 358 errmsg = "CharRef: invalid value"; |
297 break; | 359 break; |
298 case XML_ERR_INTERNAL_ERROR: | 360 case XML_ERR_INTERNAL_ERROR: |
299 errmsg = "internal error"; | 361 errmsg = "internal error"; |
300 break; | 362 break; |
301 case XML_ERR_PEREF_AT_EOF: | 363 case XML_ERR_PEREF_AT_EOF: |
302 errmsg = "PEReference at end of document\n"; | 364 errmsg = "PEReference at end of document"; |
303 break; | 365 break; |
304 case XML_ERR_PEREF_IN_PROLOG: | 366 case XML_ERR_PEREF_IN_PROLOG: |
305 errmsg = "PEReference in prolog\n"; | 367 errmsg = "PEReference in prolog"; |
306 break; | 368 break; |
307 case XML_ERR_PEREF_IN_EPILOG: | 369 case XML_ERR_PEREF_IN_EPILOG: |
308 errmsg = "PEReference in epilog\n"; | 370 errmsg = "PEReference in epilog"; |
309 break; | 371 break; |
310 case XML_ERR_PEREF_NO_NAME: | 372 case XML_ERR_PEREF_NO_NAME: |
311 errmsg = "PEReference: no name\n"; | 373 errmsg = "PEReference: no name"; |
312 break; | 374 break; |
313 case XML_ERR_PEREF_SEMICOL_MISSING: | 375 case XML_ERR_PEREF_SEMICOL_MISSING: |
314 errmsg = "PEReference: expecting ';'\n"; | 376 errmsg = "PEReference: expecting ';'"; |
315 break; | 377 break; |
316 case XML_ERR_ENTITY_LOOP: | 378 case XML_ERR_ENTITY_LOOP: |
317 errmsg = "Detected an entity reference loop\n"; | 379 errmsg = "Detected an entity reference loop"; |
318 break; | 380 break; |
319 case XML_ERR_ENTITY_NOT_STARTED: | 381 case XML_ERR_ENTITY_NOT_STARTED: |
320 errmsg = "EntityValue: \" or ' expected\n"; | 382 errmsg = "EntityValue: \" or ' expected"; |
321 break; | 383 break; |
322 case XML_ERR_ENTITY_PE_INTERNAL: | 384 case XML_ERR_ENTITY_PE_INTERNAL: |
323 errmsg = "PEReferences forbidden in internal subset\n"; | 385 errmsg = "PEReferences forbidden in internal subset"; |
324 break; | 386 break; |
325 case XML_ERR_ENTITY_NOT_FINISHED: | 387 case XML_ERR_ENTITY_NOT_FINISHED: |
326 errmsg = "EntityValue: \" or ' expected\n"; | 388 errmsg = "EntityValue: \" or ' expected"; |
327 break; | 389 break; |
328 case XML_ERR_ATTRIBUTE_NOT_STARTED: | 390 case XML_ERR_ATTRIBUTE_NOT_STARTED: |
329 errmsg = "AttValue: \" or ' expected\n"; | 391 errmsg = "AttValue: \" or ' expected"; |
330 break; | 392 break; |
331 case XML_ERR_LT_IN_ATTRIBUTE: | 393 case XML_ERR_LT_IN_ATTRIBUTE: |
332 errmsg = "Unescaped '<' not allowed in attributes values\n"; | 394 errmsg = "Unescaped '<' not allowed in attributes values"; |
333 break; | 395 break; |
334 case XML_ERR_LITERAL_NOT_STARTED: | 396 case XML_ERR_LITERAL_NOT_STARTED: |
335 errmsg = "SystemLiteral \" or ' expected\n"; | 397 errmsg = "SystemLiteral \" or ' expected"; |
336 break; | 398 break; |
337 case XML_ERR_LITERAL_NOT_FINISHED: | 399 case XML_ERR_LITERAL_NOT_FINISHED: |
338 errmsg = "Unfinished System or Public ID \" or ' expected\n"; | 400 errmsg = "Unfinished System or Public ID \" or ' expected"; |
339 break; | 401 break; |
340 case XML_ERR_MISPLACED_CDATA_END: | 402 case XML_ERR_MISPLACED_CDATA_END: |
341 errmsg = "Sequence ']]>' not allowed in content\n"; | 403 errmsg = "Sequence ']]>' not allowed in content"; |
342 break; | 404 break; |
343 case XML_ERR_URI_REQUIRED: | 405 case XML_ERR_URI_REQUIRED: |
344 errmsg = "SYSTEM or PUBLIC, the URI is missing\n"; | 406 errmsg = "SYSTEM or PUBLIC, the URI is missing"; |
345 break; | 407 break; |
346 case XML_ERR_PUBID_REQUIRED: | 408 case XML_ERR_PUBID_REQUIRED: |
347 errmsg = "PUBLIC, the Public Identifier is missing\n"; | 409 errmsg = "PUBLIC, the Public Identifier is missing"; |
348 break; | 410 break; |
349 case XML_ERR_HYPHEN_IN_COMMENT: | 411 case XML_ERR_HYPHEN_IN_COMMENT: |
350 errmsg = "Comment must not contain '--' (double-hyphen)\n"; | 412 errmsg = "Comment must not contain '--' (double-hyphen)"; |
351 break; | 413 break; |
352 case XML_ERR_PI_NOT_STARTED: | 414 case XML_ERR_PI_NOT_STARTED: |
353 errmsg = "xmlParsePI : no target name\n"; | 415 errmsg = "xmlParsePI : no target name"; |
354 break; | 416 break; |
355 case XML_ERR_RESERVED_XML_NAME: | 417 case XML_ERR_RESERVED_XML_NAME: |
356 errmsg = "Invalid PI name\n"; | 418 errmsg = "Invalid PI name"; |
357 break; | 419 break; |
358 case XML_ERR_NOTATION_NOT_STARTED: | 420 case XML_ERR_NOTATION_NOT_STARTED: |
359 errmsg = "NOTATION: Name expected here\n"; | 421 errmsg = "NOTATION: Name expected here"; |
360 break; | 422 break; |
361 case XML_ERR_NOTATION_NOT_FINISHED: | 423 case XML_ERR_NOTATION_NOT_FINISHED: |
362 errmsg = "'>' required to close NOTATION declaration\n"; | 424 errmsg = "'>' required to close NOTATION declaration"; |
363 break; | 425 break; |
364 case XML_ERR_VALUE_REQUIRED: | 426 case XML_ERR_VALUE_REQUIRED: |
365 errmsg = "Entity value required\n"; | 427 errmsg = "Entity value required"; |
366 break; | 428 break; |
367 case XML_ERR_URI_FRAGMENT: | 429 case XML_ERR_URI_FRAGMENT: |
368 errmsg = "Fragment not allowed"; | 430 errmsg = "Fragment not allowed"; |
369 break; | 431 break; |
370 case XML_ERR_ATTLIST_NOT_STARTED: | 432 case XML_ERR_ATTLIST_NOT_STARTED: |
371 errmsg = "'(' required to start ATTLIST enumeration\n"; | 433 errmsg = "'(' required to start ATTLIST enumeration"; |
372 break; | 434 break; |
373 case XML_ERR_NMTOKEN_REQUIRED: | 435 case XML_ERR_NMTOKEN_REQUIRED: |
374 errmsg = "NmToken expected in ATTLIST enumeration\n"; | 436 errmsg = "NmToken expected in ATTLIST enumeration"; |
375 break; | 437 break; |
376 case XML_ERR_ATTLIST_NOT_FINISHED: | 438 case XML_ERR_ATTLIST_NOT_FINISHED: |
377 errmsg = "')' required to finish ATTLIST enumeration\n"; | 439 errmsg = "')' required to finish ATTLIST enumeration"; |
378 break; | 440 break; |
379 case XML_ERR_MIXED_NOT_STARTED: | 441 case XML_ERR_MIXED_NOT_STARTED: |
380 errmsg = "MixedContentDecl : '|' or ')*' expected\n"; | 442 errmsg = "MixedContentDecl : '|' or ')*' expected"; |
381 break; | 443 break; |
382 case XML_ERR_PCDATA_REQUIRED: | 444 case XML_ERR_PCDATA_REQUIRED: |
383 errmsg = "MixedContentDecl : '#PCDATA' expected\n"; | 445 errmsg = "MixedContentDecl : '#PCDATA' expected"; |
384 break; | 446 break; |
385 case XML_ERR_ELEMCONTENT_NOT_STARTED: | 447 case XML_ERR_ELEMCONTENT_NOT_STARTED: |
386 errmsg = "ContentDecl : Name or '(' expected\n"; | 448 errmsg = "ContentDecl : Name or '(' expected"; |
387 break; | 449 break; |
388 case XML_ERR_ELEMCONTENT_NOT_FINISHED: | 450 case XML_ERR_ELEMCONTENT_NOT_FINISHED: |
389 errmsg = "ContentDecl : ',' '|' or ')' expected\n"; | 451 errmsg = "ContentDecl : ',' '|' or ')' expected"; |
390 break; | 452 break; |
391 case XML_ERR_PEREF_IN_INT_SUBSET: | 453 case XML_ERR_PEREF_IN_INT_SUBSET: |
392 errmsg = | 454 errmsg = |
393 "PEReference: forbidden within markup decl in internal subset\n"
; | 455 "PEReference: forbidden within markup decl in internal subset"; |
394 break; | 456 break; |
395 case XML_ERR_GT_REQUIRED: | 457 case XML_ERR_GT_REQUIRED: |
396 errmsg = "expected '>'\n"; | 458 errmsg = "expected '>'"; |
397 break; | 459 break; |
398 case XML_ERR_CONDSEC_INVALID: | 460 case XML_ERR_CONDSEC_INVALID: |
399 errmsg = "XML conditional section '[' expected\n"; | 461 errmsg = "XML conditional section '[' expected"; |
400 break; | 462 break; |
401 case XML_ERR_EXT_SUBSET_NOT_FINISHED: | 463 case XML_ERR_EXT_SUBSET_NOT_FINISHED: |
402 errmsg = "Content error in the external subset\n"; | 464 errmsg = "Content error in the external subset"; |
403 break; | 465 break; |
404 case XML_ERR_CONDSEC_INVALID_KEYWORD: | 466 case XML_ERR_CONDSEC_INVALID_KEYWORD: |
405 errmsg = | 467 errmsg = |
406 "conditional section INCLUDE or IGNORE keyword expected\n"; | 468 "conditional section INCLUDE or IGNORE keyword expected"; |
407 break; | 469 break; |
408 case XML_ERR_CONDSEC_NOT_FINISHED: | 470 case XML_ERR_CONDSEC_NOT_FINISHED: |
409 errmsg = "XML conditional section not closed\n"; | 471 errmsg = "XML conditional section not closed"; |
410 break; | 472 break; |
411 case XML_ERR_XMLDECL_NOT_STARTED: | 473 case XML_ERR_XMLDECL_NOT_STARTED: |
412 errmsg = "Text declaration '<?xml' required\n"; | 474 errmsg = "Text declaration '<?xml' required"; |
413 break; | 475 break; |
414 case XML_ERR_XMLDECL_NOT_FINISHED: | 476 case XML_ERR_XMLDECL_NOT_FINISHED: |
415 errmsg = "parsing XML declaration: '?>' expected\n"; | 477 errmsg = "parsing XML declaration: '?>' expected"; |
416 break; | 478 break; |
417 case XML_ERR_EXT_ENTITY_STANDALONE: | 479 case XML_ERR_EXT_ENTITY_STANDALONE: |
418 errmsg = "external parsed entities cannot be standalone\n"; | 480 errmsg = "external parsed entities cannot be standalone"; |
419 break; | 481 break; |
420 case XML_ERR_ENTITYREF_SEMICOL_MISSING: | 482 case XML_ERR_ENTITYREF_SEMICOL_MISSING: |
421 errmsg = "EntityRef: expecting ';'\n"; | 483 errmsg = "EntityRef: expecting ';'"; |
422 break; | 484 break; |
423 case XML_ERR_DOCTYPE_NOT_FINISHED: | 485 case XML_ERR_DOCTYPE_NOT_FINISHED: |
424 errmsg = "DOCTYPE improperly terminated\n"; | 486 errmsg = "DOCTYPE improperly terminated"; |
425 break; | 487 break; |
426 case XML_ERR_LTSLASH_REQUIRED: | 488 case XML_ERR_LTSLASH_REQUIRED: |
427 errmsg = "EndTag: '</' not found\n"; | 489 errmsg = "EndTag: '</' not found"; |
428 break; | 490 break; |
429 case XML_ERR_EQUAL_REQUIRED: | 491 case XML_ERR_EQUAL_REQUIRED: |
430 errmsg = "expected '='\n"; | 492 errmsg = "expected '='"; |
431 break; | 493 break; |
432 case XML_ERR_STRING_NOT_CLOSED: | 494 case XML_ERR_STRING_NOT_CLOSED: |
433 errmsg = "String not closed expecting \" or '\n"; | 495 errmsg = "String not closed expecting \" or '"; |
434 break; | 496 break; |
435 case XML_ERR_STRING_NOT_STARTED: | 497 case XML_ERR_STRING_NOT_STARTED: |
436 errmsg = "String not started expecting ' or \"\n"; | 498 errmsg = "String not started expecting ' or \""; |
437 break; | 499 break; |
438 case XML_ERR_ENCODING_NAME: | 500 case XML_ERR_ENCODING_NAME: |
439 errmsg = "Invalid XML encoding name\n"; | 501 errmsg = "Invalid XML encoding name"; |
440 break; | 502 break; |
441 case XML_ERR_STANDALONE_VALUE: | 503 case XML_ERR_STANDALONE_VALUE: |
442 errmsg = "standalone accepts only 'yes' or 'no'\n"; | 504 errmsg = "standalone accepts only 'yes' or 'no'"; |
443 break; | 505 break; |
444 case XML_ERR_DOCUMENT_EMPTY: | 506 case XML_ERR_DOCUMENT_EMPTY: |
445 errmsg = "Document is empty\n"; | 507 errmsg = "Document is empty"; |
446 break; | 508 break; |
447 case XML_ERR_DOCUMENT_END: | 509 case XML_ERR_DOCUMENT_END: |
448 errmsg = "Extra content at the end of the document\n"; | 510 errmsg = "Extra content at the end of the document"; |
449 break; | 511 break; |
450 case XML_ERR_NOT_WELL_BALANCED: | 512 case XML_ERR_NOT_WELL_BALANCED: |
451 errmsg = "chunk is not well balanced\n"; | 513 errmsg = "chunk is not well balanced"; |
452 break; | 514 break; |
453 case XML_ERR_EXTRA_CONTENT: | 515 case XML_ERR_EXTRA_CONTENT: |
454 errmsg = "extra content at the end of well balanced chunk\n"; | 516 errmsg = "extra content at the end of well balanced chunk"; |
455 break; | 517 break; |
456 case XML_ERR_VERSION_MISSING: | 518 case XML_ERR_VERSION_MISSING: |
457 errmsg = "Malformed declaration expecting version\n"; | 519 errmsg = "Malformed declaration expecting version"; |
| 520 break; |
| 521 case XML_ERR_NAME_TOO_LONG: |
| 522 errmsg = "Name too long use XML_PARSE_HUGE option"; |
458 break; | 523 break; |
459 #if 0 | 524 #if 0 |
460 case: | 525 case: |
461 errmsg = "\n"; | 526 errmsg = ""; |
462 break; | 527 break; |
463 #endif | 528 #endif |
464 default: | 529 default: |
465 errmsg = "Unregistered error message\n"; | 530 errmsg = "Unregistered error message"; |
466 } | 531 } |
| 532 if (info == NULL) |
| 533 snprintf(errstr, 128, "%s\n", errmsg); |
| 534 else |
| 535 snprintf(errstr, 128, "%s: %%s\n", errmsg); |
467 if (ctxt != NULL) | 536 if (ctxt != NULL) |
468 ctxt->errNo = error; | 537 ctxt->errNo = error; |
469 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, | 538 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, |
470 XML_ERR_FATAL, NULL, 0, info, NULL, NULL, 0, 0, errmsg, | 539 XML_ERR_FATAL, NULL, 0, info, NULL, NULL, 0, 0, &errstr[0], |
471 info); | 540 info); |
472 if (ctxt != NULL) { | 541 if (ctxt != NULL) { |
473 ctxt->wellFormed = 0; | 542 ctxt->wellFormed = 0; |
474 if (ctxt->recovery == 0) | 543 if (ctxt->recovery == 0) |
475 ctxt->disableSAX = 1; | 544 ctxt->disableSAX = 1; |
476 } | 545 } |
477 } | 546 } |
478 | 547 |
479 /** | 548 /** |
480 * xmlFatalErrMsg: | 549 * xmlFatalErrMsg: |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 * @error: the error number | 684 * @error: the error number |
616 * @msg: the error message | 685 * @msg: the error message |
617 * @str1: an string info | 686 * @str1: an string info |
618 * @val: an integer value | 687 * @val: an integer value |
619 * @str2: an string info | 688 * @str2: an string info |
620 * | 689 * |
621 * Handle a fatal parser error, i.e. violating Well-Formedness constraints | 690 * Handle a fatal parser error, i.e. violating Well-Formedness constraints |
622 */ | 691 */ |
623 static void | 692 static void |
624 xmlFatalErrMsgStrIntStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 693 xmlFatalErrMsgStrIntStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
625 const char *msg, const xmlChar *str1, int val, | 694 const char *msg, const xmlChar *str1, int val, |
626 const xmlChar *str2) | 695 const xmlChar *str2) |
627 { | 696 { |
628 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 697 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
629 (ctxt->instate == XML_PARSER_EOF)) | 698 (ctxt->instate == XML_PARSER_EOF)) |
630 return; | 699 return; |
631 if (ctxt != NULL) | 700 if (ctxt != NULL) |
632 ctxt->errNo = error; | 701 ctxt->errNo = error; |
633 __xmlRaiseError(NULL, NULL, NULL, | 702 __xmlRaiseError(NULL, NULL, NULL, |
634 ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, | 703 ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, |
635 NULL, 0, (const char *) str1, (const char *) str2, | 704 NULL, 0, (const char *) str1, (const char *) str2, |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
724 } | 793 } |
725 | 794 |
726 /** | 795 /** |
727 * xmlNsWarn | 796 * xmlNsWarn |
728 * @ctxt: an XML parser context | 797 * @ctxt: an XML parser context |
729 * @error: the error number | 798 * @error: the error number |
730 * @msg: the message | 799 * @msg: the message |
731 * @info1: extra information string | 800 * @info1: extra information string |
732 * @info2: extra information string | 801 * @info2: extra information string |
733 * | 802 * |
734 * Handle a fatal parser error, i.e. violating Well-Formedness constraints | 803 * Handle a namespace warning error |
735 */ | 804 */ |
736 static void | 805 static void |
737 xmlNsWarn(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 806 xmlNsWarn(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
738 const char *msg, | 807 const char *msg, |
739 const xmlChar * info1, const xmlChar * info2, | 808 const xmlChar * info1, const xmlChar * info2, |
740 const xmlChar * info3) | 809 const xmlChar * info3) |
741 { | 810 { |
742 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 811 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
743 (ctxt->instate == XML_PARSER_EOF)) | 812 (ctxt->instate == XML_PARSER_EOF)) |
744 return; | 813 return; |
745 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, | 814 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, |
746 XML_ERR_WARNING, NULL, 0, (const char *) info1, | 815 XML_ERR_WARNING, NULL, 0, (const char *) info1, |
747 (const char *) info2, (const char *) info3, 0, 0, msg, | 816 (const char *) info2, (const char *) info3, 0, 0, msg, |
748 info1, info2, info3); | 817 info1, info2, info3); |
749 } | 818 } |
750 | 819 |
751 /************************************************************************ | 820 /************************************************************************ |
752 * * | 821 * * |
753 * » » Library wide options» » » » » * | 822 *» » Library wide options» » » » » * |
754 * * | 823 * * |
755 ************************************************************************/ | 824 ************************************************************************/ |
756 | 825 |
757 /** | 826 /** |
758 * xmlHasFeature: | 827 * xmlHasFeature: |
759 * @feature: the feature to be examined | 828 * @feature: the feature to be examined |
760 * | 829 * |
761 * Examines if the library has been compiled with a given feature. | 830 * Examines if the library has been compiled with a given feature. |
762 * | 831 * |
763 * Returns a non-zero value if the feature exist, otherwise zero. | 832 * Returns a non-zero value if the feature exist, otherwise zero. |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 return(1); | 1016 return(1); |
948 #else | 1017 #else |
949 return(0); | 1018 return(0); |
950 #endif | 1019 #endif |
951 case XML_WITH_ZLIB: | 1020 case XML_WITH_ZLIB: |
952 #ifdef LIBXML_ZLIB_ENABLED | 1021 #ifdef LIBXML_ZLIB_ENABLED |
953 return(1); | 1022 return(1); |
954 #else | 1023 #else |
955 return(0); | 1024 return(0); |
956 #endif | 1025 #endif |
| 1026 case XML_WITH_LZMA: |
| 1027 #ifdef LIBXML_LZMA_ENABLED |
| 1028 return(1); |
| 1029 #else |
| 1030 return(0); |
| 1031 #endif |
957 case XML_WITH_ICU: | 1032 case XML_WITH_ICU: |
958 #ifdef LIBXML_ICU_ENABLED | 1033 #ifdef LIBXML_ICU_ENABLED |
959 return(1); | 1034 return(1); |
960 #else | 1035 #else |
961 return(0); | 1036 return(0); |
962 #endif | 1037 #endif |
963 default: | 1038 default: |
964 break; | 1039 break; |
965 } | 1040 } |
966 return(0); | 1041 return(0); |
967 } | 1042 } |
968 | 1043 |
969 /************************************************************************ | 1044 /************************************************************************ |
970 * * | 1045 * * |
971 * » » SAX2 defaulted attributes handling» » » * | 1046 *» » SAX2 defaulted attributes handling» » » * |
972 * * | 1047 * * |
973 ************************************************************************/ | 1048 ************************************************************************/ |
974 | 1049 |
975 /** | 1050 /** |
976 * xmlDetectSAX2: | 1051 * xmlDetectSAX2: |
977 * @ctxt: an XML parser context | 1052 * @ctxt: an XML parser context |
978 * | 1053 * |
979 * Do the SAX2 detection and specific intialization | 1054 * Do the SAX2 detection and specific intialization |
980 */ | 1055 */ |
981 static void | 1056 static void |
982 xmlDetectSAX2(xmlParserCtxtPtr ctxt) { | 1057 xmlDetectSAX2(xmlParserCtxtPtr ctxt) { |
983 if (ctxt == NULL) return; | 1058 if (ctxt == NULL) return; |
984 #ifdef LIBXML_SAX1_ENABLED | 1059 #ifdef LIBXML_SAX1_ENABLED |
985 if ((ctxt->sax) && (ctxt->sax->initialized == XML_SAX2_MAGIC) && | 1060 if ((ctxt->sax) && (ctxt->sax->initialized == XML_SAX2_MAGIC) && |
986 ((ctxt->sax->startElementNs != NULL) || | 1061 ((ctxt->sax->startElementNs != NULL) || |
987 (ctxt->sax->endElementNs != NULL))) ctxt->sax2 = 1; | 1062 (ctxt->sax->endElementNs != NULL))) ctxt->sax2 = 1; |
988 #else | 1063 #else |
989 ctxt->sax2 = 1; | 1064 ctxt->sax2 = 1; |
990 #endif /* LIBXML_SAX1_ENABLED */ | 1065 #endif /* LIBXML_SAX1_ENABLED */ |
991 | 1066 |
992 ctxt->str_xml = xmlDictLookup(ctxt->dict, BAD_CAST "xml", 3); | 1067 ctxt->str_xml = xmlDictLookup(ctxt->dict, BAD_CAST "xml", 3); |
993 ctxt->str_xmlns = xmlDictLookup(ctxt->dict, BAD_CAST "xmlns", 5); | 1068 ctxt->str_xmlns = xmlDictLookup(ctxt->dict, BAD_CAST "xmlns", 5); |
994 ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); | 1069 ctxt->str_xml_ns = xmlDictLookup(ctxt->dict, XML_XML_NAMESPACE, 36); |
995 if ((ctxt->str_xml==NULL) || (ctxt->str_xmlns==NULL) || | 1070 if ((ctxt->str_xml==NULL) || (ctxt->str_xmlns==NULL) || |
996 » » (ctxt->str_xml_ns == NULL)) { | 1071 » » (ctxt->str_xml_ns == NULL)) { |
997 xmlErrMemory(ctxt, NULL); | 1072 xmlErrMemory(ctxt, NULL); |
998 } | 1073 } |
999 } | 1074 } |
1000 | 1075 |
1001 typedef struct _xmlDefAttrs xmlDefAttrs; | 1076 typedef struct _xmlDefAttrs xmlDefAttrs; |
1002 typedef xmlDefAttrs *xmlDefAttrsPtr; | 1077 typedef xmlDefAttrs *xmlDefAttrsPtr; |
1003 struct _xmlDefAttrs { | 1078 struct _xmlDefAttrs { |
1004 int nbAttrs; /* number of defaulted attributes on that element */ | 1079 int nbAttrs; /* number of defaulted attributes on that element */ |
1005 int maxAttrs; /* the size of the array */ | 1080 int maxAttrs; /* the size of the array */ |
1006 const xmlChar *values[5]; /* array of localname/prefix/values/external */ | 1081 const xmlChar *values[5]; /* array of localname/prefix/values/external */ |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1296 * NOTE: this is somewhat deprecated, those productions were removed from | 1371 * NOTE: this is somewhat deprecated, those productions were removed from |
1297 * the XML Second edition. | 1372 * the XML Second edition. |
1298 * | 1373 * |
1299 * [33] LanguageID ::= Langcode ('-' Subcode)* | 1374 * [33] LanguageID ::= Langcode ('-' Subcode)* |
1300 * [34] Langcode ::= ISO639Code | IanaCode | UserCode | 1375 * [34] Langcode ::= ISO639Code | IanaCode | UserCode |
1301 * [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) | 1376 * [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z]) |
1302 * [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ | 1377 * [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+ |
1303 * [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ | 1378 * [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+ |
1304 * [38] Subcode ::= ([a-z] | [A-Z])+ | 1379 * [38] Subcode ::= ([a-z] | [A-Z])+ |
1305 * | 1380 * |
| 1381 * The current REC reference the sucessors of RFC 1766, currently 5646 |
| 1382 * |
| 1383 * http://www.rfc-editor.org/rfc/rfc5646.txt |
| 1384 * langtag = language |
| 1385 * ["-" script] |
| 1386 * ["-" region] |
| 1387 * *("-" variant) |
| 1388 * *("-" extension) |
| 1389 * ["-" privateuse] |
| 1390 * language = 2*3ALPHA ; shortest ISO 639 code |
| 1391 * ["-" extlang] ; sometimes followed by |
| 1392 * ; extended language subtags |
| 1393 * / 4ALPHA ; or reserved for future use |
| 1394 * / 5*8ALPHA ; or registered language subtag |
| 1395 * |
| 1396 * extlang = 3ALPHA ; selected ISO 639 codes |
| 1397 * *2("-" 3ALPHA) ; permanently reserved |
| 1398 * |
| 1399 * script = 4ALPHA ; ISO 15924 code |
| 1400 * |
| 1401 * region = 2ALPHA ; ISO 3166-1 code |
| 1402 * / 3DIGIT ; UN M.49 code |
| 1403 * |
| 1404 * variant = 5*8alphanum ; registered variants |
| 1405 * / (DIGIT 3alphanum) |
| 1406 * |
| 1407 * extension = singleton 1*("-" (2*8alphanum)) |
| 1408 * |
| 1409 * ; Single alphanumerics |
| 1410 * ; "x" reserved for private use |
| 1411 * singleton = DIGIT ; 0 - 9 |
| 1412 * / %x41-57 ; A - W |
| 1413 * / %x59-5A ; Y - Z |
| 1414 * / %x61-77 ; a - w |
| 1415 * / %x79-7A ; y - z |
| 1416 * |
| 1417 * it sounds right to still allow Irregular i-xxx IANA and user codes too |
| 1418 * The parser below doesn't try to cope with extension or privateuse |
| 1419 * that could be added but that's not interoperable anyway |
| 1420 * |
1306 * Returns 1 if correct 0 otherwise | 1421 * Returns 1 if correct 0 otherwise |
1307 **/ | 1422 **/ |
1308 int | 1423 int |
1309 xmlCheckLanguageID(const xmlChar * lang) | 1424 xmlCheckLanguageID(const xmlChar * lang) |
1310 { | 1425 { |
1311 const xmlChar *cur = lang; | 1426 const xmlChar *cur = lang, *nxt; |
1312 | 1427 |
1313 if (cur == NULL) | 1428 if (cur == NULL) |
1314 return (0); | 1429 return (0); |
1315 if (((cur[0] == 'i') && (cur[1] == '-')) || | 1430 if (((cur[0] == 'i') && (cur[1] == '-')) || |
1316 ((cur[0] == 'I') && (cur[1] == '-'))) { | 1431 ((cur[0] == 'I') && (cur[1] == '-')) || |
| 1432 ((cur[0] == 'x') && (cur[1] == '-')) || |
| 1433 ((cur[0] == 'X') && (cur[1] == '-'))) { |
1317 /* | 1434 /* |
1318 * IANA code | 1435 * Still allow IANA code and user code which were coming |
| 1436 * from the previous version of the XML-1.0 specification |
| 1437 * it's deprecated but we should not fail |
1319 */ | 1438 */ |
1320 cur += 2; | 1439 cur += 2; |
1321 while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || /* non input consuming *
/ | 1440 while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || |
1322 ((cur[0] >= 'a') && (cur[0] <= 'z'))) | 1441 ((cur[0] >= 'a') && (cur[0] <= 'z'))) |
1323 cur++; | 1442 cur++; |
1324 } else if (((cur[0] == 'x') && (cur[1] == '-')) || | 1443 return(cur[0] == 0); |
1325 ((cur[0] == 'X') && (cur[1] == '-'))) { | 1444 } |
| 1445 nxt = cur; |
| 1446 while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || |
| 1447 ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) |
| 1448 nxt++; |
| 1449 if (nxt - cur >= 4) { |
1326 /* | 1450 /* |
1327 * User code | 1451 * Reserved |
1328 */ | 1452 */ |
1329 cur += 2; | 1453 if ((nxt - cur > 8) || (nxt[0] != 0)) |
1330 while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || /* non input consuming *
/ | 1454 return(0); |
1331 ((cur[0] >= 'a') && (cur[0] <= 'z'))) | 1455 return(1); |
1332 cur++; | |
1333 } else if (((cur[0] >= 'A') && (cur[0] <= 'Z')) || | |
1334 ((cur[0] >= 'a') && (cur[0] <= 'z'))) { | |
1335 /* | |
1336 * ISO639 | |
1337 */ | |
1338 cur++; | |
1339 if (((cur[0] >= 'A') && (cur[0] <= 'Z')) || | |
1340 ((cur[0] >= 'a') && (cur[0] <= 'z'))) | |
1341 cur++; | |
1342 else | |
1343 return (0); | |
1344 } else | |
1345 return (0); | |
1346 while (cur[0] != 0) { /* non input consuming */ | |
1347 if (cur[0] != '-') | |
1348 return (0); | |
1349 cur++; | |
1350 if (((cur[0] >= 'A') && (cur[0] <= 'Z')) || | |
1351 ((cur[0] >= 'a') && (cur[0] <= 'z'))) | |
1352 cur++; | |
1353 else | |
1354 return (0); | |
1355 while (((cur[0] >= 'A') && (cur[0] <= 'Z')) || /* non input consuming *
/ | |
1356 ((cur[0] >= 'a') && (cur[0] <= 'z'))) | |
1357 cur++; | |
1358 } | 1456 } |
| 1457 if (nxt - cur < 2) |
| 1458 return(0); |
| 1459 /* we got an ISO 639 code */ |
| 1460 if (nxt[0] == 0) |
| 1461 return(1); |
| 1462 if (nxt[0] != '-') |
| 1463 return(0); |
| 1464 |
| 1465 nxt++; |
| 1466 cur = nxt; |
| 1467 /* now we can have extlang or script or region or variant */ |
| 1468 if ((nxt[0] >= '0') && (nxt[0] <= '9')) |
| 1469 goto region_m49; |
| 1470 |
| 1471 while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || |
| 1472 ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) |
| 1473 nxt++; |
| 1474 if (nxt - cur == 4) |
| 1475 goto script; |
| 1476 if (nxt - cur == 2) |
| 1477 goto region; |
| 1478 if ((nxt - cur >= 5) && (nxt - cur <= 8)) |
| 1479 goto variant; |
| 1480 if (nxt - cur != 3) |
| 1481 return(0); |
| 1482 /* we parsed an extlang */ |
| 1483 if (nxt[0] == 0) |
| 1484 return(1); |
| 1485 if (nxt[0] != '-') |
| 1486 return(0); |
| 1487 |
| 1488 nxt++; |
| 1489 cur = nxt; |
| 1490 /* now we can have script or region or variant */ |
| 1491 if ((nxt[0] >= '0') && (nxt[0] <= '9')) |
| 1492 goto region_m49; |
| 1493 |
| 1494 while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || |
| 1495 ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) |
| 1496 nxt++; |
| 1497 if (nxt - cur == 2) |
| 1498 goto region; |
| 1499 if ((nxt - cur >= 5) && (nxt - cur <= 8)) |
| 1500 goto variant; |
| 1501 if (nxt - cur != 4) |
| 1502 return(0); |
| 1503 /* we parsed a script */ |
| 1504 script: |
| 1505 if (nxt[0] == 0) |
| 1506 return(1); |
| 1507 if (nxt[0] != '-') |
| 1508 return(0); |
| 1509 |
| 1510 nxt++; |
| 1511 cur = nxt; |
| 1512 /* now we can have region or variant */ |
| 1513 if ((nxt[0] >= '0') && (nxt[0] <= '9')) |
| 1514 goto region_m49; |
| 1515 |
| 1516 while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || |
| 1517 ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) |
| 1518 nxt++; |
| 1519 |
| 1520 if ((nxt - cur >= 5) && (nxt - cur <= 8)) |
| 1521 goto variant; |
| 1522 if (nxt - cur != 2) |
| 1523 return(0); |
| 1524 /* we parsed a region */ |
| 1525 region: |
| 1526 if (nxt[0] == 0) |
| 1527 return(1); |
| 1528 if (nxt[0] != '-') |
| 1529 return(0); |
| 1530 |
| 1531 nxt++; |
| 1532 cur = nxt; |
| 1533 /* now we can just have a variant */ |
| 1534 while (((nxt[0] >= 'A') && (nxt[0] <= 'Z')) || |
| 1535 ((nxt[0] >= 'a') && (nxt[0] <= 'z'))) |
| 1536 nxt++; |
| 1537 |
| 1538 if ((nxt - cur < 5) || (nxt - cur > 8)) |
| 1539 return(0); |
| 1540 |
| 1541 /* we parsed a variant */ |
| 1542 variant: |
| 1543 if (nxt[0] == 0) |
| 1544 return(1); |
| 1545 if (nxt[0] != '-') |
| 1546 return(0); |
| 1547 /* extensions and private use subtags not checked */ |
1359 return (1); | 1548 return (1); |
| 1549 |
| 1550 region_m49: |
| 1551 if (((nxt[1] >= '0') && (nxt[1] <= '9')) && |
| 1552 ((nxt[2] >= '0') && (nxt[2] <= '9'))) { |
| 1553 nxt += 3; |
| 1554 goto region; |
| 1555 } |
| 1556 return(0); |
1360 } | 1557 } |
1361 | 1558 |
1362 /************************************************************************ | 1559 /************************************************************************ |
1363 * * | 1560 * * |
1364 * Parser stacks related functions and macros * | 1561 * Parser stacks related functions and macros * |
1365 * * | 1562 * * |
1366 ************************************************************************/ | 1563 ************************************************************************/ |
1367 | 1564 |
1368 static xmlEntityPtr xmlParseStringEntityRef(xmlParserCtxtPtr ctxt, | 1565 static xmlEntityPtr xmlParseStringEntityRef(xmlParserCtxtPtr ctxt, |
1369 const xmlChar ** str); | 1566 const xmlChar ** str); |
1370 | 1567 |
1371 #ifdef SAX2 | 1568 #ifdef SAX2 |
1372 /** | 1569 /** |
1373 * nsPush: | 1570 * nsPush: |
1374 * @ctxt: an XML parser context | 1571 * @ctxt: an XML parser context |
1375 * @prefix: the namespace prefix or NULL | 1572 * @prefix: the namespace prefix or NULL |
1376 * @URL: the namespace name | 1573 * @URL: the namespace name |
1377 * | 1574 * |
1378 * Pushes a new parser namespace on top of the ns stack | 1575 * Pushes a new parser namespace on top of the ns stack |
1379 * | 1576 * |
1380 * Returns -1 in case of error, -2 if the namespace should be discarded | 1577 * Returns -1 in case of error, -2 if the namespace should be discarded |
1381 * and the index in the stack otherwise. | 1578 * and the index in the stack otherwise. |
1382 */ | 1579 */ |
1383 static int | 1580 static int |
1384 nsPush(xmlParserCtxtPtr ctxt, const xmlChar *prefix, const xmlChar *URL) | 1581 nsPush(xmlParserCtxtPtr ctxt, const xmlChar *prefix, const xmlChar *URL) |
1385 { | 1582 { |
1386 if (ctxt->options & XML_PARSE_NSCLEAN) { | 1583 if (ctxt->options & XML_PARSE_NSCLEAN) { |
1387 int i; | 1584 int i; |
1388 » for (i = 0;i < ctxt->nsNr;i += 2) { | 1585 » for (i = ctxt->nsNr - 2;i >= 0;i -= 2) { |
1389 if (ctxt->nsTab[i] == prefix) { | 1586 if (ctxt->nsTab[i] == prefix) { |
1390 /* in scope */ | 1587 /* in scope */ |
1391 if (ctxt->nsTab[i + 1] == URL) | 1588 if (ctxt->nsTab[i + 1] == URL) |
1392 return(-2); | 1589 return(-2); |
1393 /* out of scope keep it */ | 1590 /* out of scope keep it */ |
1394 break; | 1591 break; |
1395 } | 1592 } |
1396 } | 1593 } |
1397 } | 1594 } |
1398 if ((ctxt->nsMax == 0) || (ctxt->nsTab == NULL)) { | 1595 if ((ctxt->nsMax == 0) || (ctxt->nsTab == NULL)) { |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1690 * | 1887 * |
1691 * Returns -1 in case of error, the index in the stack otherwise | 1888 * Returns -1 in case of error, the index in the stack otherwise |
1692 */ | 1889 */ |
1693 int | 1890 int |
1694 namePush(xmlParserCtxtPtr ctxt, const xmlChar * value) | 1891 namePush(xmlParserCtxtPtr ctxt, const xmlChar * value) |
1695 { | 1892 { |
1696 if (ctxt == NULL) return (-1); | 1893 if (ctxt == NULL) return (-1); |
1697 | 1894 |
1698 if (ctxt->nameNr >= ctxt->nameMax) { | 1895 if (ctxt->nameNr >= ctxt->nameMax) { |
1699 const xmlChar * *tmp; | 1896 const xmlChar * *tmp; |
1700 ctxt->nameMax *= 2; | |
1701 tmp = (const xmlChar * *) xmlRealloc((xmlChar * *)ctxt->nameTab, | 1897 tmp = (const xmlChar * *) xmlRealloc((xmlChar * *)ctxt->nameTab, |
1702 ctxt->nameMax * | 1898 ctxt->nameMax * 2 * |
1703 sizeof(ctxt->nameTab[0])); | 1899 sizeof(ctxt->nameTab[0])); |
1704 if (tmp == NULL) { | 1900 if (tmp == NULL) { |
1705 ctxt->nameMax /= 2; | |
1706 goto mem_error; | 1901 goto mem_error; |
1707 } | 1902 } |
1708 ctxt->nameTab = tmp; | 1903 ctxt->nameTab = tmp; |
| 1904 ctxt->nameMax *= 2; |
1709 } | 1905 } |
1710 ctxt->nameTab[ctxt->nameNr] = value; | 1906 ctxt->nameTab[ctxt->nameNr] = value; |
1711 ctxt->name = value; | 1907 ctxt->name = value; |
1712 return (ctxt->nameNr++); | 1908 return (ctxt->nameNr++); |
1713 mem_error: | 1909 mem_error: |
1714 xmlErrMemory(ctxt, NULL); | 1910 xmlErrMemory(ctxt, NULL); |
1715 return (-1); | 1911 return (-1); |
1716 } | 1912 } |
1717 /** | 1913 /** |
1718 * namePop: | 1914 * namePop: |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1784 * CUR returns the current xmlChar value, i.e. a 8 bit value if compiled | 1980 * CUR returns the current xmlChar value, i.e. a 8 bit value if compiled |
1785 * This should be used internally by the parser | 1981 * This should be used internally by the parser |
1786 * only to compare to ASCII values otherwise it would break when | 1982 * only to compare to ASCII values otherwise it would break when |
1787 * running with UTF-8 encoding. | 1983 * running with UTF-8 encoding. |
1788 * RAW same as CUR but in the input buffer, bypass any token | 1984 * RAW same as CUR but in the input buffer, bypass any token |
1789 * extraction that may have been done | 1985 * extraction that may have been done |
1790 * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only | 1986 * NXT(n) returns the n'th next xmlChar. Same as CUR is should be used only |
1791 * to compare on ASCII based substring. | 1987 * to compare on ASCII based substring. |
1792 * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined | 1988 * SKIP(n) Skip n xmlChar, and must also be used only to skip ASCII defined |
1793 * strings without newlines within the parser. | 1989 * strings without newlines within the parser. |
1794 * NEXT1(l) Skip 1 xmlChar, and must also be used only to skip 1 non-newline A
SCII | 1990 * NEXT1(l) Skip 1 xmlChar, and must also be used only to skip 1 non-newline A
SCII |
1795 * defined char within the parser. | 1991 * defined char within the parser. |
1796 * Clean macros, not dependent of an ASCII context, expect UTF-8 encoding | 1992 * Clean macros, not dependent of an ASCII context, expect UTF-8 encoding |
1797 * | 1993 * |
1798 * NEXT Skip to the next character, this does the proper decoding | 1994 * NEXT Skip to the next character, this does the proper decoding |
1799 * in UTF-8 mode. It also pop-up unfinished entities on the fly. | 1995 * in UTF-8 mode. It also pop-up unfinished entities on the fly. |
1800 * NEXTL(l) Skip the current unicode character of l xmlChars long. | 1996 * NEXTL(l) Skip the current unicode character of l xmlChars long. |
1801 * CUR_CHAR(l) returns the current unicode character (int), set l | 1997 * CUR_CHAR(l) returns the current unicode character (int), set l |
1802 * to the number of xmlChars used for the encoding [0-5]. | 1998 * to the number of xmlChars used for the encoding [0-5]. |
1803 * CUR_SCHAR same but operate on a string instead of the context | 1999 * CUR_SCHAR same but operate on a string instead of the context |
1804 * COPY_BUF copy the current unicode char to the target buffer, increment | 2000 * COPY_BUF copy the current unicode char to the target buffer, increment |
(...skipping 28 matching lines...) Expand all Loading... |
1833 ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val);
\ | 2029 ctxt->nbChars += (val),ctxt->input->cur += (val),ctxt->input->col+=(val);
\ |
1834 if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ | 2030 if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ |
1835 if ((*ctxt->input->cur == 0) && \ | 2031 if ((*ctxt->input->cur == 0) && \ |
1836 (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ | 2032 (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ |
1837 xmlPopInput(ctxt); \ | 2033 xmlPopInput(ctxt); \ |
1838 } while (0) | 2034 } while (0) |
1839 | 2035 |
1840 #define SKIPL(val) do { \ | 2036 #define SKIPL(val) do { \ |
1841 int skipl; \ | 2037 int skipl; \ |
1842 for(skipl=0; skipl<val; skipl++) { \ | 2038 for(skipl=0; skipl<val; skipl++) { \ |
1843 » if (*(ctxt->input->cur) == '\n') {» » » » \ | 2039 » if (*(ctxt->input->cur) == '\n') {» » » » \ |
1844 ctxt->input->line++; ctxt->input->col = 1; \ | 2040 ctxt->input->line++; ctxt->input->col = 1; \ |
1845 » } else ctxt->input->col++;» » » » » \ | 2041 » } else ctxt->input->col++;» » » » » \ |
1846 » ctxt->nbChars++;» » » » » » \ | 2042 » ctxt->nbChars++;» » » » » » \ |
1847 ctxt->input->cur++; \ | 2043 ctxt->input->cur++; \ |
1848 } \ | 2044 } \ |
1849 if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ | 2045 if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ |
1850 if ((*ctxt->input->cur == 0) && \ | 2046 if ((*ctxt->input->cur == 0) && \ |
1851 (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ | 2047 (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) \ |
1852 xmlPopInput(ctxt); \ | 2048 xmlPopInput(ctxt); \ |
1853 } while (0) | 2049 } while (0) |
1854 | 2050 |
1855 #define SHRINK if ((ctxt->progressive == 0) && \ | 2051 #define SHRINK if ((ctxt->progressive == 0) && \ |
1856 (ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ | 2052 (ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \ |
1857 (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ | 2053 (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \ |
1858 xmlSHRINK (ctxt); | 2054 xmlSHRINK (ctxt); |
1859 | 2055 |
1860 static void xmlSHRINK (xmlParserCtxtPtr ctxt) { | 2056 static void xmlSHRINK (xmlParserCtxtPtr ctxt) { |
1861 xmlParserInputShrink(ctxt->input); | 2057 xmlParserInputShrink(ctxt->input); |
1862 if ((*ctxt->input->cur == 0) && | 2058 if ((*ctxt->input->cur == 0) && |
1863 (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) | 2059 (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) |
1864 xmlPopInput(ctxt); | 2060 xmlPopInput(ctxt); |
1865 } | 2061 } |
1866 | 2062 |
1867 #define GROW if ((ctxt->progressive == 0) && \ | 2063 #define GROW if ((ctxt->progressive == 0) && \ |
1868 (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ | 2064 (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ |
1869 xmlGROW (ctxt); | 2065 xmlGROW (ctxt); |
1870 | 2066 |
1871 static void xmlGROW (xmlParserCtxtPtr ctxt) { | 2067 static void xmlGROW (xmlParserCtxtPtr ctxt) { |
| 2068 unsigned long curEnd = ctxt->input->end - ctxt->input->cur; |
| 2069 unsigned long curBase = ctxt->input->cur - ctxt->input->base; |
| 2070 |
| 2071 if (((curEnd > (unsigned long) XML_MAX_LOOKUP_LIMIT) || |
| 2072 (curBase > (unsigned long) XML_MAX_LOOKUP_LIMIT)) && |
| 2073 ((ctxt->input->buf) && (ctxt->input->buf->readcallback != (xmlInputRead
Callback) xmlNop)) && |
| 2074 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 2075 xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup"); |
| 2076 ctxt->instate = XML_PARSER_EOF; |
| 2077 } |
1872 xmlParserInputGrow(ctxt->input, INPUT_CHUNK); | 2078 xmlParserInputGrow(ctxt->input, INPUT_CHUNK); |
1873 if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0) && | 2079 if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0) && |
1874 (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) | 2080 (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) |
1875 xmlPopInput(ctxt); | 2081 xmlPopInput(ctxt); |
1876 } | 2082 } |
1877 | 2083 |
1878 #define SKIP_BLANKS xmlSkipBlankChars(ctxt) | 2084 #define SKIP_BLANKS xmlSkipBlankChars(ctxt) |
1879 | 2085 |
1880 #define NEXT xmlNextChar(ctxt) | 2086 #define NEXT xmlNextChar(ctxt) |
1881 | 2087 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1922 */ | 2128 */ |
1923 if ((ctxt->inputNr == 1) && (ctxt->instate != XML_PARSER_DTD)) { | 2129 if ((ctxt->inputNr == 1) && (ctxt->instate != XML_PARSER_DTD)) { |
1924 const xmlChar *cur; | 2130 const xmlChar *cur; |
1925 /* | 2131 /* |
1926 * if we are in the document content, go really fast | 2132 * if we are in the document content, go really fast |
1927 */ | 2133 */ |
1928 cur = ctxt->input->cur; | 2134 cur = ctxt->input->cur; |
1929 while (IS_BLANK_CH(*cur)) { | 2135 while (IS_BLANK_CH(*cur)) { |
1930 if (*cur == '\n') { | 2136 if (*cur == '\n') { |
1931 ctxt->input->line++; ctxt->input->col = 1; | 2137 ctxt->input->line++; ctxt->input->col = 1; |
| 2138 } else { |
| 2139 ctxt->input->col++; |
1932 } | 2140 } |
1933 cur++; | 2141 cur++; |
1934 res++; | 2142 res++; |
1935 if (*cur == 0) { | 2143 if (*cur == 0) { |
1936 ctxt->input->cur = cur; | 2144 ctxt->input->cur = cur; |
1937 xmlParserInputGrow(ctxt->input, INPUT_CHUNK); | 2145 xmlParserInputGrow(ctxt->input, INPUT_CHUNK); |
1938 cur = ctxt->input->cur; | 2146 cur = ctxt->input->cur; |
1939 } | 2147 } |
1940 } | 2148 } |
1941 ctxt->input->cur = cur; | 2149 ctxt->input->cur = cur; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2023 * xmlParseCharRef: | 2231 * xmlParseCharRef: |
2024 * @ctxt: an XML parser context | 2232 * @ctxt: an XML parser context |
2025 * | 2233 * |
2026 * parse Reference declarations | 2234 * parse Reference declarations |
2027 * | 2235 * |
2028 * [66] CharRef ::= '&#' [0-9]+ ';' | | 2236 * [66] CharRef ::= '&#' [0-9]+ ';' | |
2029 * '&#x' [0-9a-fA-F]+ ';' | 2237 * '&#x' [0-9a-fA-F]+ ';' |
2030 * | 2238 * |
2031 * [ WFC: Legal Character ] | 2239 * [ WFC: Legal Character ] |
2032 * Characters referred to using character references must match the | 2240 * Characters referred to using character references must match the |
2033 * production for Char. | 2241 * production for Char. |
2034 * | 2242 * |
2035 * Returns the value parsed (as an int), 0 in case of error | 2243 * Returns the value parsed (as an int), 0 in case of error |
2036 */ | 2244 */ |
2037 int | 2245 int |
2038 xmlParseCharRef(xmlParserCtxtPtr ctxt) { | 2246 xmlParseCharRef(xmlParserCtxtPtr ctxt) { |
2039 unsigned int val = 0; | 2247 unsigned int val = 0; |
2040 int count = 0; | 2248 int count = 0; |
2041 unsigned int outofrange = 0; | 2249 unsigned int outofrange = 0; |
2042 | 2250 |
2043 /* | 2251 /* |
2044 * Using RAW/CUR/NEXT is okay since we are working on ASCII range here | 2252 * Using RAW/CUR/NEXT is okay since we are working on ASCII range here |
2045 */ | 2253 */ |
2046 if ((RAW == '&') && (NXT(1) == '#') && | 2254 if ((RAW == '&') && (NXT(1) == '#') && |
2047 (NXT(2) == 'x')) { | 2255 (NXT(2) == 'x')) { |
2048 SKIP(3); | 2256 SKIP(3); |
2049 GROW; | 2257 GROW; |
2050 while (RAW != ';') { /* loop blocked by count */ | 2258 while (RAW != ';') { /* loop blocked by count */ |
2051 if (count++ > 20) { | 2259 if (count++ > 20) { |
2052 count = 0; | 2260 count = 0; |
2053 GROW; | 2261 GROW; |
2054 if (ctxt->instate == XML_PARSER_EOF) | 2262 if (ctxt->instate == XML_PARSER_EOF) |
2055 return(0); | 2263 return(0); |
2056 } | 2264 } |
2057 » if ((RAW >= '0') && (RAW <= '9')) | 2265 » if ((RAW >= '0') && (RAW <= '9')) |
2058 val = val * 16 + (CUR - '0'); | 2266 val = val * 16 + (CUR - '0'); |
2059 else if ((RAW >= 'a') && (RAW <= 'f') && (count < 20)) | 2267 else if ((RAW >= 'a') && (RAW <= 'f') && (count < 20)) |
2060 val = val * 16 + (CUR - 'a') + 10; | 2268 val = val * 16 + (CUR - 'a') + 10; |
2061 else if ((RAW >= 'A') && (RAW <= 'F') && (count < 20)) | 2269 else if ((RAW >= 'A') && (RAW <= 'F') && (count < 20)) |
2062 val = val * 16 + (CUR - 'A') + 10; | 2270 val = val * 16 + (CUR - 'A') + 10; |
2063 else { | 2271 else { |
2064 xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); | 2272 xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); |
2065 val = 0; | 2273 val = 0; |
2066 break; | 2274 break; |
2067 } | 2275 } |
(...skipping 12 matching lines...) Expand all Loading... |
2080 } else if ((RAW == '&') && (NXT(1) == '#')) { | 2288 } else if ((RAW == '&') && (NXT(1) == '#')) { |
2081 SKIP(2); | 2289 SKIP(2); |
2082 GROW; | 2290 GROW; |
2083 while (RAW != ';') { /* loop blocked by count */ | 2291 while (RAW != ';') { /* loop blocked by count */ |
2084 if (count++ > 20) { | 2292 if (count++ > 20) { |
2085 count = 0; | 2293 count = 0; |
2086 GROW; | 2294 GROW; |
2087 if (ctxt->instate == XML_PARSER_EOF) | 2295 if (ctxt->instate == XML_PARSER_EOF) |
2088 return(0); | 2296 return(0); |
2089 } | 2297 } |
2090 » if ((RAW >= '0') && (RAW <= '9')) | 2298 » if ((RAW >= '0') && (RAW <= '9')) |
2091 val = val * 10 + (CUR - '0'); | 2299 val = val * 10 + (CUR - '0'); |
2092 else { | 2300 else { |
2093 xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); | 2301 xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); |
2094 val = 0; | 2302 val = 0; |
2095 break; | 2303 break; |
2096 } | 2304 } |
2097 if (val > 0x10FFFF) | 2305 if (val > 0x10FFFF) |
2098 outofrange = val; | 2306 outofrange = val; |
2099 | 2307 |
2100 NEXT; | 2308 NEXT; |
2101 count++; | 2309 count++; |
2102 } | 2310 } |
2103 if (RAW == ';') { | 2311 if (RAW == ';') { |
2104 /* on purpose to avoid reentrancy problems with NEXT and SKIP */ | 2312 /* on purpose to avoid reentrancy problems with NEXT and SKIP */ |
2105 ctxt->input->col++; | 2313 ctxt->input->col++; |
2106 ctxt->nbChars ++; | 2314 ctxt->nbChars ++; |
2107 ctxt->input->cur++; | 2315 ctxt->input->cur++; |
2108 } | 2316 } |
2109 } else { | 2317 } else { |
2110 xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); | 2318 xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); |
2111 } | 2319 } |
2112 | 2320 |
2113 /* | 2321 /* |
2114 * [ WFC: Legal Character ] | 2322 * [ WFC: Legal Character ] |
2115 * Characters referred to using character references must match the | 2323 * Characters referred to using character references must match the |
2116 * production for Char. | 2324 * production for Char. |
2117 */ | 2325 */ |
2118 if ((IS_CHAR(val) && (outofrange == 0))) { | 2326 if ((IS_CHAR(val) && (outofrange == 0))) { |
2119 return(val); | 2327 return(val); |
2120 } else { | 2328 } else { |
2121 xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, | 2329 xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, |
2122 "xmlParseCharRef: invalid xmlChar value %d\n", | 2330 "xmlParseCharRef: invalid xmlChar value %d\n", |
2123 val); | 2331 val); |
2124 } | 2332 } |
2125 return(0); | 2333 return(0); |
2126 } | 2334 } |
2127 | 2335 |
2128 /** | 2336 /** |
2129 * xmlParseStringCharRef: | 2337 * xmlParseStringCharRef: |
2130 * @ctxt: an XML parser context | 2338 * @ctxt: an XML parser context |
2131 * @str: a pointer to an index in the string | 2339 * @str: a pointer to an index in the string |
2132 * | 2340 * |
2133 * parse Reference declarations, variant parsing from a string rather | 2341 * parse Reference declarations, variant parsing from a string rather |
2134 * than an an input flow. | 2342 * than an an input flow. |
2135 * | 2343 * |
2136 * [66] CharRef ::= '&#' [0-9]+ ';' | | 2344 * [66] CharRef ::= '&#' [0-9]+ ';' | |
2137 * '&#x' [0-9a-fA-F]+ ';' | 2345 * '&#x' [0-9a-fA-F]+ ';' |
2138 * | 2346 * |
2139 * [ WFC: Legal Character ] | 2347 * [ WFC: Legal Character ] |
2140 * Characters referred to using character references must match the | 2348 * Characters referred to using character references must match the |
2141 * production for Char. | 2349 * production for Char. |
2142 * | 2350 * |
2143 * Returns the value parsed (as an int), 0 in case of error, str will be | 2351 * Returns the value parsed (as an int), 0 in case of error, str will be |
2144 * updated to the current value of the index | 2352 * updated to the current value of the index |
2145 */ | 2353 */ |
2146 static int | 2354 static int |
2147 xmlParseStringCharRef(xmlParserCtxtPtr ctxt, const xmlChar **str) { | 2355 xmlParseStringCharRef(xmlParserCtxtPtr ctxt, const xmlChar **str) { |
2148 const xmlChar *ptr; | 2356 const xmlChar *ptr; |
2149 xmlChar cur; | 2357 xmlChar cur; |
2150 unsigned int val = 0; | 2358 unsigned int val = 0; |
2151 unsigned int outofrange = 0; | 2359 unsigned int outofrange = 0; |
2152 | 2360 |
2153 if ((str == NULL) || (*str == NULL)) return(0); | 2361 if ((str == NULL) || (*str == NULL)) return(0); |
2154 ptr = *str; | 2362 ptr = *str; |
2155 cur = *ptr; | 2363 cur = *ptr; |
2156 if ((cur == '&') && (ptr[1] == '#') && (ptr[2] == 'x')) { | 2364 if ((cur == '&') && (ptr[1] == '#') && (ptr[2] == 'x')) { |
2157 ptr += 3; | 2365 ptr += 3; |
2158 cur = *ptr; | 2366 cur = *ptr; |
2159 while (cur != ';') { /* Non input consuming loop */ | 2367 while (cur != ';') { /* Non input consuming loop */ |
2160 » if ((cur >= '0') && (cur <= '9')) | 2368 » if ((cur >= '0') && (cur <= '9')) |
2161 val = val * 16 + (cur - '0'); | 2369 val = val * 16 + (cur - '0'); |
2162 else if ((cur >= 'a') && (cur <= 'f')) | 2370 else if ((cur >= 'a') && (cur <= 'f')) |
2163 val = val * 16 + (cur - 'a') + 10; | 2371 val = val * 16 + (cur - 'a') + 10; |
2164 else if ((cur >= 'A') && (cur <= 'F')) | 2372 else if ((cur >= 'A') && (cur <= 'F')) |
2165 val = val * 16 + (cur - 'A') + 10; | 2373 val = val * 16 + (cur - 'A') + 10; |
2166 else { | 2374 else { |
2167 xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); | 2375 xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); |
2168 val = 0; | 2376 val = 0; |
2169 break; | 2377 break; |
2170 } | 2378 } |
2171 if (val > 0x10FFFF) | 2379 if (val > 0x10FFFF) |
2172 outofrange = val; | 2380 outofrange = val; |
2173 | 2381 |
2174 ptr++; | 2382 ptr++; |
2175 cur = *ptr; | 2383 cur = *ptr; |
2176 } | 2384 } |
2177 if (cur == ';') | 2385 if (cur == ';') |
2178 ptr++; | 2386 ptr++; |
2179 } else if ((cur == '&') && (ptr[1] == '#')){ | 2387 } else if ((cur == '&') && (ptr[1] == '#')){ |
2180 ptr += 2; | 2388 ptr += 2; |
2181 cur = *ptr; | 2389 cur = *ptr; |
2182 while (cur != ';') { /* Non input consuming loops */ | 2390 while (cur != ';') { /* Non input consuming loops */ |
2183 » if ((cur >= '0') && (cur <= '9')) | 2391 » if ((cur >= '0') && (cur <= '9')) |
2184 val = val * 10 + (cur - '0'); | 2392 val = val * 10 + (cur - '0'); |
2185 else { | 2393 else { |
2186 xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); | 2394 xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); |
2187 val = 0; | 2395 val = 0; |
2188 break; | 2396 break; |
2189 } | 2397 } |
2190 if (val > 0x10FFFF) | 2398 if (val > 0x10FFFF) |
2191 outofrange = val; | 2399 outofrange = val; |
2192 | 2400 |
2193 ptr++; | 2401 ptr++; |
2194 cur = *ptr; | 2402 cur = *ptr; |
2195 } | 2403 } |
2196 if (cur == ';') | 2404 if (cur == ';') |
2197 ptr++; | 2405 ptr++; |
2198 } else { | 2406 } else { |
2199 xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); | 2407 xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); |
2200 return(0); | 2408 return(0); |
2201 } | 2409 } |
2202 *str = ptr; | 2410 *str = ptr; |
2203 | 2411 |
2204 /* | 2412 /* |
2205 * [ WFC: Legal Character ] | 2413 * [ WFC: Legal Character ] |
2206 * Characters referred to using character references must match the | 2414 * Characters referred to using character references must match the |
2207 * production for Char. | 2415 * production for Char. |
2208 */ | 2416 */ |
2209 if ((IS_CHAR(val) && (outofrange == 0))) { | 2417 if ((IS_CHAR(val) && (outofrange == 0))) { |
2210 return(val); | 2418 return(val); |
2211 } else { | 2419 } else { |
2212 xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, | 2420 xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, |
2213 "xmlParseStringCharRef: invalid xmlChar value %d\n", | 2421 "xmlParseStringCharRef: invalid xmlChar value %d\n", |
2214 val); | 2422 val); |
2215 } | 2423 } |
2216 return(0); | 2424 return(0); |
2217 } | 2425 } |
2218 | 2426 |
2219 /** | 2427 /** |
2220 * xmlNewBlanksWrapperInputStream: | 2428 * xmlNewBlanksWrapperInputStream: |
2221 * @ctxt: an XML parser context | 2429 * @ctxt: an XML parser context |
2222 * @entity: an Entity pointer | 2430 * @entity: an Entity pointer |
2223 * | 2431 * |
2224 * Create a new input stream for wrapping | 2432 * Create a new input stream for wrapping |
2225 * blanks around a PEReference | 2433 * blanks around a PEReference |
2226 * | 2434 * |
2227 * Returns the new input stream or NULL | 2435 * Returns the new input stream or NULL |
2228 */ | 2436 */ |
2229 | 2437 |
2230 static void deallocblankswrapper (xmlChar *str) {xmlFree(str);} | 2438 static void deallocblankswrapper (xmlChar *str) {xmlFree(str);} |
2231 | 2439 |
2232 static xmlParserInputPtr | 2440 static xmlParserInputPtr |
2233 xmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { | 2441 xmlNewBlanksWrapperInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) { |
2234 xmlParserInputPtr input; | 2442 xmlParserInputPtr input; |
2235 xmlChar *buffer; | 2443 xmlChar *buffer; |
2236 size_t length; | 2444 size_t length; |
2237 if (entity == NULL) { | 2445 if (entity == NULL) { |
2238 xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, | 2446 xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, |
2239 "xmlNewBlanksWrapperInputStream entity\n"); | 2447 "xmlNewBlanksWrapperInputStream entity\n"); |
2240 return(NULL); | 2448 return(NULL); |
2241 } | 2449 } |
2242 if (xmlParserDebugEntities) | 2450 if (xmlParserDebugEntities) |
2243 xmlGenericError(xmlGenericErrorContext, | 2451 xmlGenericError(xmlGenericErrorContext, |
2244 "new blanks wrapper for entity: %s\n", entity->name); | 2452 "new blanks wrapper for entity: %s\n", entity->name); |
2245 input = xmlNewInputStream(ctxt); | 2453 input = xmlNewInputStream(ctxt); |
2246 if (input == NULL) { | 2454 if (input == NULL) { |
2247 return(NULL); | 2455 return(NULL); |
2248 } | 2456 } |
2249 length = xmlStrlen(entity->name) + 5; | 2457 length = xmlStrlen(entity->name) + 5; |
2250 buffer = xmlMallocAtomic(length); | 2458 buffer = xmlMallocAtomic(length); |
2251 if (buffer == NULL) { | 2459 if (buffer == NULL) { |
2252 xmlErrMemory(ctxt, NULL); | 2460 xmlErrMemory(ctxt, NULL); |
2253 xmlFree(input); | 2461 xmlFree(input); |
2254 » return(NULL); | 2462 » return(NULL); |
2255 } | 2463 } |
2256 buffer [0] = ' '; | 2464 buffer [0] = ' '; |
2257 buffer [1] = '%'; | 2465 buffer [1] = '%'; |
2258 buffer [length-3] = ';'; | 2466 buffer [length-3] = ';'; |
2259 buffer [length-2] = ' '; | 2467 buffer [length-2] = ' '; |
2260 buffer [length-1] = 0; | 2468 buffer [length-1] = 0; |
2261 memcpy(buffer + 2, entity->name, length - 5); | 2469 memcpy(buffer + 2, entity->name, length - 5); |
2262 input->free = deallocblankswrapper; | 2470 input->free = deallocblankswrapper; |
2263 input->base = buffer; | 2471 input->base = buffer; |
2264 input->cur = buffer; | 2472 input->cur = buffer; |
2265 input->length = length; | 2473 input->length = length; |
2266 input->end = &buffer[length]; | 2474 input->end = &buffer[length]; |
2267 return(input); | 2475 return(input); |
2268 } | 2476 } |
2269 | 2477 |
2270 /** | 2478 /** |
2271 * xmlParserHandlePEReference: | 2479 * xmlParserHandlePEReference: |
2272 * @ctxt: the parser context | 2480 * @ctxt: the parser context |
2273 * | 2481 * |
2274 * [69] PEReference ::= '%' Name ';' | 2482 * [69] PEReference ::= '%' Name ';' |
2275 * | 2483 * |
2276 * [ WFC: No Recursion ] | 2484 * [ WFC: No Recursion ] |
2277 * A parsed entity must not contain a recursive | 2485 * A parsed entity must not contain a recursive |
2278 * reference to itself, either directly or indirectly. | 2486 * reference to itself, either directly or indirectly. |
2279 * | 2487 * |
2280 * [ WFC: Entity Declared ] | 2488 * [ WFC: Entity Declared ] |
2281 * In a document without any DTD, a document with only an internal DTD | 2489 * In a document without any DTD, a document with only an internal DTD |
2282 * subset which contains no parameter entity references, or a document | 2490 * subset which contains no parameter entity references, or a document |
2283 * with "standalone='yes'", ... ... The declaration of a parameter | 2491 * with "standalone='yes'", ... ... The declaration of a parameter |
2284 * entity must precede any reference to it... | 2492 * entity must precede any reference to it... |
2285 * | 2493 * |
2286 * [ VC: Entity Declared ] | 2494 * [ VC: Entity Declared ] |
2287 * In a document with an external subset or external parameter entities | 2495 * In a document with an external subset or external parameter entities |
2288 * with "standalone='no'", ... ... The declaration of a parameter entity | 2496 * with "standalone='no'", ... ... The declaration of a parameter entity |
2289 * must precede any reference to it... | 2497 * must precede any reference to it... |
2290 * | 2498 * |
2291 * [ WFC: In DTD ] | 2499 * [ WFC: In DTD ] |
2292 * Parameter-entity references may only appear in the DTD. | 2500 * Parameter-entity references may only appear in the DTD. |
2293 * NOTE: misleading but this is handled. | 2501 * NOTE: misleading but this is handled. |
2294 * | 2502 * |
2295 * A PEReference may have been detected in the current input stream | 2503 * A PEReference may have been detected in the current input stream |
2296 * the handling is done accordingly to | 2504 * the handling is done accordingly to |
2297 * http://www.w3.org/TR/REC-xml#entproc | 2505 * http://www.w3.org/TR/REC-xml#entproc |
2298 * i.e. | 2506 * i.e. |
2299 * - Included in literal in entity values | 2507 * - Included in literal in entity values |
2300 * - Included as Parameter Entity reference within DTDs | 2508 * - Included as Parameter Entity reference within DTDs |
2301 */ | 2509 */ |
2302 void | 2510 void |
2303 xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { | 2511 xmlParserHandlePEReference(xmlParserCtxtPtr ctxt) { |
2304 const xmlChar *name; | 2512 const xmlChar *name; |
2305 xmlEntityPtr entity = NULL; | 2513 xmlEntityPtr entity = NULL; |
2306 xmlParserInputPtr input; | 2514 xmlParserInputPtr input; |
2307 | 2515 |
2308 if (RAW != '%') return; | 2516 if (RAW != '%') return; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2368 if (name == NULL) { | 2576 if (name == NULL) { |
2369 xmlFatalErr(ctxt, XML_ERR_PEREF_NO_NAME, NULL); | 2577 xmlFatalErr(ctxt, XML_ERR_PEREF_NO_NAME, NULL); |
2370 } else { | 2578 } else { |
2371 if (RAW == ';') { | 2579 if (RAW == ';') { |
2372 NEXT; | 2580 NEXT; |
2373 if ((ctxt->sax != NULL) && (ctxt->sax->getParameterEntity != NULL)) | 2581 if ((ctxt->sax != NULL) && (ctxt->sax->getParameterEntity != NULL)) |
2374 entity = ctxt->sax->getParameterEntity(ctxt->userData, name); | 2582 entity = ctxt->sax->getParameterEntity(ctxt->userData, name); |
2375 if (ctxt->instate == XML_PARSER_EOF) | 2583 if (ctxt->instate == XML_PARSER_EOF) |
2376 return; | 2584 return; |
2377 if (entity == NULL) { | 2585 if (entity == NULL) { |
2378 » | 2586 |
2379 /* | 2587 /* |
2380 * [ WFC: Entity Declared ] | 2588 * [ WFC: Entity Declared ] |
2381 * In a document without any DTD, a document with only an | 2589 * In a document without any DTD, a document with only an |
2382 * internal DTD subset which contains no parameter entity | 2590 * internal DTD subset which contains no parameter entity |
2383 * references, or a document with "standalone='yes'", ... | 2591 * references, or a document with "standalone='yes'", ... |
2384 * ... The declaration of a parameter entity must precede | 2592 * ... The declaration of a parameter entity must precede |
2385 * any reference to it... | 2593 * any reference to it... |
2386 */ | 2594 */ |
2387 if ((ctxt->standalone == 1) || | 2595 if ((ctxt->standalone == 1) || |
2388 ((ctxt->hasExternalSubset == 0) && | 2596 ((ctxt->hasExternalSubset == 0) && |
2389 (ctxt->hasPErefs == 0))) { | 2597 (ctxt->hasPErefs == 0))) { |
2390 xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, | 2598 xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, |
2391 "PEReference: %%%s; not found\n", name); | 2599 "PEReference: %%%s; not found\n", name); |
2392 } else { | 2600 } else { |
2393 /* | 2601 /* |
2394 * [ VC: Entity Declared ] | 2602 * [ VC: Entity Declared ] |
2395 * In a document with an external subset or external | 2603 * In a document with an external subset or external |
2396 * parameter entities with "standalone='no'", ... | 2604 * parameter entities with "standalone='no'", ... |
2397 * ... The declaration of a parameter entity must precede | 2605 * ... The declaration of a parameter entity must precede |
2398 * any reference to it... | 2606 * any reference to it... |
2399 */ | 2607 */ |
2400 if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) { | 2608 if ((ctxt->validate) && (ctxt->vctxt.error != NULL)) { |
2401 xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY, | 2609 xmlValidityError(ctxt, XML_WAR_UNDECLARED_ENTITY, |
2402 "PEReference: %%%s; not found\n", | 2610 "PEReference: %%%s; not found\n", |
2403 name, NULL); | 2611 name, NULL); |
2404 » » } else | 2612 » » } else |
2405 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, | 2613 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, |
2406 "PEReference: %%%s; not found\n", | 2614 "PEReference: %%%s; not found\n", |
2407 name, NULL); | 2615 name, NULL); |
2408 ctxt->valid = 0; | 2616 ctxt->valid = 0; |
2409 } | 2617 } |
| 2618 xmlParserEntityCheck(ctxt, 0, NULL, 0); |
2410 } else if (ctxt->input->free != deallocblankswrapper) { | 2619 } else if (ctxt->input->free != deallocblankswrapper) { |
2411 input = xmlNewBlanksWrapperInputStream(ctxt, entity); | 2620 input = xmlNewBlanksWrapperInputStream(ctxt, entity); |
2412 if (xmlPushInput(ctxt, input) < 0) | 2621 if (xmlPushInput(ctxt, input) < 0) |
2413 return; | 2622 return; |
2414 } else { | 2623 } else { |
2415 if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) || | 2624 if ((entity->etype == XML_INTERNAL_PARAMETER_ENTITY) || |
2416 (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) { | 2625 (entity->etype == XML_EXTERNAL_PARAMETER_ENTITY)) { |
2417 xmlChar start[4]; | 2626 xmlChar start[4]; |
2418 xmlCharEncoding enc; | 2627 xmlCharEncoding enc; |
2419 | 2628 |
2420 /* | 2629 /* |
| 2630 * Note: external parameter entities will not be loaded, it |
| 2631 * is not required for a non-validating parser, unless the |
| 2632 * option of validating, or substituting entities were |
| 2633 * given. Doing so is far more secure as the parser will |
| 2634 * only process data coming from the document entity by |
| 2635 * default. |
| 2636 */ |
| 2637 if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && |
| 2638 ((ctxt->options & XML_PARSE_NOENT) == 0) && |
| 2639 ((ctxt->options & XML_PARSE_DTDVALID) == 0) && |
| 2640 ((ctxt->options & XML_PARSE_DTDLOAD) == 0) && |
| 2641 ((ctxt->options & XML_PARSE_DTDATTR) == 0) && |
| 2642 (ctxt->replaceEntities == 0) && |
| 2643 (ctxt->validate == 0)) |
| 2644 return; |
| 2645 |
| 2646 /* |
2421 * handle the extra spaces added before and after | 2647 * handle the extra spaces added before and after |
2422 * c.f. http://www.w3.org/TR/REC-xml#as-PE | 2648 * c.f. http://www.w3.org/TR/REC-xml#as-PE |
2423 * this is done independently. | 2649 * this is done independently. |
2424 */ | 2650 */ |
2425 input = xmlNewEntityInputStream(ctxt, entity); | 2651 input = xmlNewEntityInputStream(ctxt, entity); |
2426 if (xmlPushInput(ctxt, input) < 0) | 2652 if (xmlPushInput(ctxt, input) < 0) |
2427 return; | 2653 return; |
2428 | 2654 |
2429 » » /* | 2655 » » /* |
2430 * Get the 4 first bytes and decode the charset | 2656 * Get the 4 first bytes and decode the charset |
2431 * if enc != XML_CHAR_ENCODING_NONE | 2657 * if enc != XML_CHAR_ENCODING_NONE |
2432 * plug some encoding conversion routines. | 2658 * plug some encoding conversion routines. |
2433 * Note that, since we may have some non-UTF8 | 2659 * Note that, since we may have some non-UTF8 |
2434 * encoding (like UTF16, bug 135229), the 'length' | 2660 * encoding (like UTF16, bug 135229), the 'length' |
2435 * is not known, but we can calculate based upon | 2661 * is not known, but we can calculate based upon |
2436 * the amount of data in the buffer. | 2662 * the amount of data in the buffer. |
2437 */ | 2663 */ |
2438 GROW | 2664 GROW |
2439 if (ctxt->instate == XML_PARSER_EOF) | 2665 if (ctxt->instate == XML_PARSER_EOF) |
(...skipping 21 matching lines...) Expand all Loading... |
2461 } | 2687 } |
2462 } | 2688 } |
2463 } else { | 2689 } else { |
2464 xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL); | 2690 xmlFatalErr(ctxt, XML_ERR_PEREF_SEMICOL_MISSING, NULL); |
2465 } | 2691 } |
2466 } | 2692 } |
2467 } | 2693 } |
2468 | 2694 |
2469 /* | 2695 /* |
2470 * Macro used to grow the current buffer. | 2696 * Macro used to grow the current buffer. |
| 2697 * buffer##_size is expected to be a size_t |
| 2698 * mem_error: is expected to handle memory allocation failures |
2471 */ | 2699 */ |
2472 #define growBuffer(buffer, n) { \ | 2700 #define growBuffer(buffer, n) { \ |
2473 xmlChar *tmp; \ | 2701 xmlChar *tmp; \ |
2474 buffer##_size *= 2;»» » » » » » \ | 2702 size_t new_size = buffer##_size * 2 + n; \ |
2475 buffer##_size += n;»» » » » » » \ | 2703 if (new_size < buffer##_size) goto mem_error; \ |
2476 tmp = (xmlChar *)» » » » » » » \ | 2704 tmp = (xmlChar *) xmlRealloc(buffer, new_size); \ |
2477 » » xmlRealloc(buffer, buffer##_size * sizeof(xmlChar));» \ | |
2478 if (tmp == NULL) goto mem_error; \ | 2705 if (tmp == NULL) goto mem_error; \ |
2479 buffer = tmp; \ | 2706 buffer = tmp; \ |
| 2707 buffer##_size = new_size; \ |
2480 } | 2708 } |
2481 | 2709 |
2482 /** | 2710 /** |
2483 * xmlStringLenDecodeEntities: | 2711 * xmlStringLenDecodeEntities: |
2484 * @ctxt: the parser context | 2712 * @ctxt: the parser context |
2485 * @str: the input string | 2713 * @str: the input string |
2486 * @len: the string length | 2714 * @len: the string length |
2487 * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF | 2715 * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF |
2488 * @end: an end marker xmlChar, 0 if none | 2716 * @end: an end marker xmlChar, 0 if none |
2489 * @end2: an end marker xmlChar, 0 if none | 2717 * @end2: an end marker xmlChar, 0 if none |
2490 * @end3: an end marker xmlChar, 0 if none | 2718 * @end3: an end marker xmlChar, 0 if none |
2491 * | 2719 * |
2492 * Takes a entity string content and process to do the adequate substitutions. | 2720 * Takes a entity string content and process to do the adequate substitutions. |
2493 * | 2721 * |
2494 * [67] Reference ::= EntityRef | CharRef | 2722 * [67] Reference ::= EntityRef | CharRef |
2495 * | 2723 * |
2496 * [69] PEReference ::= '%' Name ';' | 2724 * [69] PEReference ::= '%' Name ';' |
2497 * | 2725 * |
2498 * Returns A newly allocated string with the substitution done. The caller | 2726 * Returns A newly allocated string with the substitution done. The caller |
2499 * must deallocate it ! | 2727 * must deallocate it ! |
2500 */ | 2728 */ |
2501 xmlChar * | 2729 xmlChar * |
2502 xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, | 2730 xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, |
2503 int what, xmlChar end, xmlChar end2, xmlChar end3) { | 2731 int what, xmlChar end, xmlChar end2, xmlChar end3) { |
2504 xmlChar *buffer = NULL; | 2732 xmlChar *buffer = NULL; |
2505 int buffer_size = 0; | 2733 size_t buffer_size = 0; |
| 2734 size_t nbchars = 0; |
2506 | 2735 |
2507 xmlChar *current = NULL; | 2736 xmlChar *current = NULL; |
2508 xmlChar *rep = NULL; | 2737 xmlChar *rep = NULL; |
2509 const xmlChar *last; | 2738 const xmlChar *last; |
2510 xmlEntityPtr ent; | 2739 xmlEntityPtr ent; |
2511 int c,l; | 2740 int c,l; |
2512 int nbchars = 0; | |
2513 | 2741 |
2514 if ((ctxt == NULL) || (str == NULL) || (len < 0)) | 2742 if ((ctxt == NULL) || (str == NULL) || (len < 0)) |
2515 return(NULL); | 2743 return(NULL); |
2516 last = str + len; | 2744 last = str + len; |
2517 | 2745 |
2518 if (((ctxt->depth > 40) && | 2746 if (((ctxt->depth > 40) && |
2519 ((ctxt->options & XML_PARSE_HUGE) == 0)) || | 2747 ((ctxt->options & XML_PARSE_HUGE) == 0)) || |
2520 (ctxt->depth > 1024)) { | 2748 (ctxt->depth > 1024)) { |
2521 xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); | 2749 xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); |
2522 return(NULL); | 2750 return(NULL); |
2523 } | 2751 } |
2524 | 2752 |
2525 /* | 2753 /* |
2526 * allocate a translation buffer. | 2754 * allocate a translation buffer. |
2527 */ | 2755 */ |
2528 buffer_size = XML_PARSER_BIG_BUFFER_SIZE; | 2756 buffer_size = XML_PARSER_BIG_BUFFER_SIZE; |
2529 buffer = (xmlChar *) xmlMallocAtomic(buffer_size * sizeof(xmlChar)); | 2757 buffer = (xmlChar *) xmlMallocAtomic(buffer_size); |
2530 if (buffer == NULL) goto mem_error; | 2758 if (buffer == NULL) goto mem_error; |
2531 | 2759 |
2532 /* | 2760 /* |
2533 * OK loop until we reach one of the ending char or a size limit. | 2761 * OK loop until we reach one of the ending char or a size limit. |
2534 * we are operating on already parsed values. | 2762 * we are operating on already parsed values. |
2535 */ | 2763 */ |
2536 if (str < last) | 2764 if (str < last) |
2537 c = CUR_SCHAR(str, l); | 2765 c = CUR_SCHAR(str, l); |
2538 else | 2766 else |
2539 c = 0; | 2767 c = 0; |
2540 while ((c != 0) && (c != end) && /* non input consuming loop */ | 2768 while ((c != 0) && (c != end) && /* non input consuming loop */ |
2541 (c != end2) && (c != end3)) { | 2769 (c != end2) && (c != end3)) { |
2542 | 2770 |
2543 if (c == 0) break; | 2771 if (c == 0) break; |
2544 if ((c == '&') && (str[1] == '#')) { | 2772 if ((c == '&') && (str[1] == '#')) { |
2545 int val = xmlParseStringCharRef(ctxt, &str); | 2773 int val = xmlParseStringCharRef(ctxt, &str); |
2546 if (val != 0) { | 2774 if (val != 0) { |
2547 COPY_BUF(0,buffer,nbchars,val); | 2775 COPY_BUF(0,buffer,nbchars,val); |
2548 } | 2776 } |
2549 » if (nbchars > buffer_size - XML_PARSER_BUFFER_SIZE) { | 2777 » if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { |
2550 growBuffer(buffer, XML_PARSER_BUFFER_SIZE); | 2778 growBuffer(buffer, XML_PARSER_BUFFER_SIZE); |
2551 } | 2779 } |
2552 } else if ((c == '&') && (what & XML_SUBSTITUTE_REF)) { | 2780 } else if ((c == '&') && (what & XML_SUBSTITUTE_REF)) { |
2553 if (xmlParserDebugEntities) | 2781 if (xmlParserDebugEntities) |
2554 xmlGenericError(xmlGenericErrorContext, | 2782 xmlGenericError(xmlGenericErrorContext, |
2555 "String decoding Entity Reference: %.30s\n", | 2783 "String decoding Entity Reference: %.30s\n", |
2556 str); | 2784 str); |
2557 ent = xmlParseStringEntityRef(ctxt, &str); | 2785 ent = xmlParseStringEntityRef(ctxt, &str); |
2558 if ((ctxt->lastError.code == XML_ERR_ENTITY_LOOP) || | 2786 if ((ctxt->lastError.code == XML_ERR_ENTITY_LOOP) || |
2559 (ctxt->lastError.code == XML_ERR_INTERNAL_ERROR)) | 2787 (ctxt->lastError.code == XML_ERR_INTERNAL_ERROR)) |
2560 goto int_error; | 2788 goto int_error; |
| 2789 xmlParserEntityCheck(ctxt, 0, ent, 0); |
2561 if (ent != NULL) | 2790 if (ent != NULL) |
2562 » ctxt->nbentities += ent->checked; | 2791 » ctxt->nbentities += ent->checked / 2; |
2563 if ((ent != NULL) && | 2792 if ((ent != NULL) && |
2564 (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { | 2793 (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { |
2565 if (ent->content != NULL) { | 2794 if (ent->content != NULL) { |
2566 COPY_BUF(0,buffer,nbchars,ent->content[0]); | 2795 COPY_BUF(0,buffer,nbchars,ent->content[0]); |
2567 » » if (nbchars > buffer_size - XML_PARSER_BUFFER_SIZE) { | 2796 » » if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { |
2568 growBuffer(buffer, XML_PARSER_BUFFER_SIZE); | 2797 growBuffer(buffer, XML_PARSER_BUFFER_SIZE); |
2569 } | 2798 } |
2570 } else { | 2799 } else { |
2571 xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, | 2800 xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, |
2572 "predefined entity has no content\n"); | 2801 "predefined entity has no content\n"); |
2573 } | 2802 } |
2574 } else if ((ent != NULL) && (ent->content != NULL)) { | 2803 } else if ((ent != NULL) && (ent->content != NULL)) { |
2575 ctxt->depth++; | 2804 ctxt->depth++; |
2576 rep = xmlStringDecodeEntities(ctxt, ent->content, what, | 2805 rep = xmlStringDecodeEntities(ctxt, ent->content, what, |
2577 0, 0, 0); | 2806 0, 0, 0); |
2578 ctxt->depth--; | 2807 ctxt->depth--; |
2579 | 2808 |
2580 if (rep != NULL) { | 2809 if (rep != NULL) { |
2581 current = rep; | 2810 current = rep; |
2582 while (*current != 0) { /* non input consuming loop */ | 2811 while (*current != 0) { /* non input consuming loop */ |
2583 buffer[nbchars++] = *current++; | 2812 buffer[nbchars++] = *current++; |
2584 » » » if (nbchars > | 2813 » » » if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { |
2585 » » buffer_size - XML_PARSER_BUFFER_SIZE) { | 2814 » » » if (xmlParserEntityCheck(ctxt, nbchars, ent, 0)) |
2586 » » » if (xmlParserEntityCheck(ctxt, nbchars, ent)) | |
2587 goto int_error; | 2815 goto int_error; |
2588 growBuffer(buffer, XML_PARSER_BUFFER_SIZE); | 2816 growBuffer(buffer, XML_PARSER_BUFFER_SIZE); |
2589 } | 2817 } |
2590 } | 2818 } |
2591 xmlFree(rep); | 2819 xmlFree(rep); |
2592 rep = NULL; | 2820 rep = NULL; |
2593 } | 2821 } |
2594 } else if (ent != NULL) { | 2822 } else if (ent != NULL) { |
2595 int i = xmlStrlen(ent->name); | 2823 int i = xmlStrlen(ent->name); |
2596 const xmlChar *cur = ent->name; | 2824 const xmlChar *cur = ent->name; |
2597 | 2825 |
2598 buffer[nbchars++] = '&'; | 2826 buffer[nbchars++] = '&'; |
2599 » » if (nbchars > buffer_size - i - XML_PARSER_BUFFER_SIZE) { | 2827 » » if (nbchars + i + XML_PARSER_BUFFER_SIZE > buffer_size) { |
2600 growBuffer(buffer, i + XML_PARSER_BUFFER_SIZE); | 2828 growBuffer(buffer, i + XML_PARSER_BUFFER_SIZE); |
2601 } | 2829 } |
2602 for (;i > 0;i--) | 2830 for (;i > 0;i--) |
2603 buffer[nbchars++] = *cur++; | 2831 buffer[nbchars++] = *cur++; |
2604 buffer[nbchars++] = ';'; | 2832 buffer[nbchars++] = ';'; |
2605 } | 2833 } |
2606 } else if (c == '%' && (what & XML_SUBSTITUTE_PEREF)) { | 2834 } else if (c == '%' && (what & XML_SUBSTITUTE_PEREF)) { |
2607 if (xmlParserDebugEntities) | 2835 if (xmlParserDebugEntities) |
2608 xmlGenericError(xmlGenericErrorContext, | 2836 xmlGenericError(xmlGenericErrorContext, |
2609 "String decoding PE Reference: %.30s\n", str); | 2837 "String decoding PE Reference: %.30s\n", str); |
2610 ent = xmlParseStringPEReference(ctxt, &str); | 2838 ent = xmlParseStringPEReference(ctxt, &str); |
2611 if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) | 2839 if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) |
2612 goto int_error; | 2840 goto int_error; |
| 2841 xmlParserEntityCheck(ctxt, 0, ent, 0); |
2613 if (ent != NULL) | 2842 if (ent != NULL) |
2614 » ctxt->nbentities += ent->checked; | 2843 » ctxt->nbentities += ent->checked / 2; |
2615 if (ent != NULL) { | 2844 if (ent != NULL) { |
2616 if (ent->content == NULL) { | 2845 if (ent->content == NULL) { |
2617 xmlLoadEntityContent(ctxt, ent); | 2846 xmlLoadEntityContent(ctxt, ent); |
2618 } | 2847 } |
2619 ctxt->depth++; | 2848 ctxt->depth++; |
2620 rep = xmlStringDecodeEntities(ctxt, ent->content, what, | 2849 rep = xmlStringDecodeEntities(ctxt, ent->content, what, |
2621 0, 0, 0); | 2850 0, 0, 0); |
2622 ctxt->depth--; | 2851 ctxt->depth--; |
2623 if (rep != NULL) { | 2852 if (rep != NULL) { |
2624 current = rep; | 2853 current = rep; |
2625 while (*current != 0) { /* non input consuming loop */ | 2854 while (*current != 0) { /* non input consuming loop */ |
2626 buffer[nbchars++] = *current++; | 2855 buffer[nbchars++] = *current++; |
2627 » » » if (nbchars > | 2856 » » » if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { |
2628 » » buffer_size - XML_PARSER_BUFFER_SIZE) { | 2857 » » » if (xmlParserEntityCheck(ctxt, nbchars, ent, 0)) |
2629 » » » if (xmlParserEntityCheck(ctxt, nbchars, ent)) | |
2630 goto int_error; | 2858 goto int_error; |
2631 growBuffer(buffer, XML_PARSER_BUFFER_SIZE); | 2859 growBuffer(buffer, XML_PARSER_BUFFER_SIZE); |
2632 } | 2860 } |
2633 } | 2861 } |
2634 xmlFree(rep); | 2862 xmlFree(rep); |
2635 rep = NULL; | 2863 rep = NULL; |
2636 } | 2864 } |
2637 } | 2865 } |
2638 } else { | 2866 } else { |
2639 COPY_BUF(l,buffer,nbchars,c); | 2867 COPY_BUF(l,buffer,nbchars,c); |
2640 str += l; | 2868 str += l; |
2641 » if (nbchars > buffer_size - XML_PARSER_BUFFER_SIZE) { | 2869 » if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { |
2642 » growBuffer(buffer, XML_PARSER_BUFFER_SIZE); | 2870 » growBuffer(buffer, XML_PARSER_BUFFER_SIZE); |
2643 } | 2871 } |
2644 } | 2872 } |
2645 if (str < last) | 2873 if (str < last) |
2646 c = CUR_SCHAR(str, l); | 2874 c = CUR_SCHAR(str, l); |
2647 else | 2875 else |
2648 c = 0; | 2876 c = 0; |
2649 } | 2877 } |
2650 buffer[nbchars] = 0; | 2878 buffer[nbchars] = 0; |
2651 return(buffer); | 2879 return(buffer); |
2652 | 2880 |
2653 mem_error: | 2881 mem_error: |
2654 xmlErrMemory(ctxt, NULL); | 2882 xmlErrMemory(ctxt, NULL); |
2655 int_error: | 2883 int_error: |
2656 if (rep != NULL) | 2884 if (rep != NULL) |
2657 xmlFree(rep); | 2885 xmlFree(rep); |
2658 if (buffer != NULL) | 2886 if (buffer != NULL) |
2659 xmlFree(buffer); | 2887 xmlFree(buffer); |
2660 return(NULL); | 2888 return(NULL); |
2661 } | 2889 } |
2662 | 2890 |
2663 /** | 2891 /** |
2664 * xmlStringDecodeEntities: | 2892 * xmlStringDecodeEntities: |
2665 * @ctxt: the parser context | 2893 * @ctxt: the parser context |
2666 * @str: the input string | 2894 * @str: the input string |
2667 * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF | 2895 * @what: combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF |
2668 * @end: an end marker xmlChar, 0 if none | 2896 * @end: an end marker xmlChar, 0 if none |
2669 * @end2: an end marker xmlChar, 0 if none | 2897 * @end2: an end marker xmlChar, 0 if none |
2670 * @end3: an end marker xmlChar, 0 if none | 2898 * @end3: an end marker xmlChar, 0 if none |
2671 * | 2899 * |
2672 * Takes a entity string content and process to do the adequate substitutions. | 2900 * Takes a entity string content and process to do the adequate substitutions. |
2673 * | 2901 * |
2674 * [67] Reference ::= EntityRef | CharRef | 2902 * [67] Reference ::= EntityRef | CharRef |
2675 * | 2903 * |
2676 * [69] PEReference ::= '%' Name ';' | 2904 * [69] PEReference ::= '%' Name ';' |
2677 * | 2905 * |
2678 * Returns A newly allocated string with the substitution done. The caller | 2906 * Returns A newly allocated string with the substitution done. The caller |
2679 * must deallocate it ! | 2907 * must deallocate it ! |
2680 */ | 2908 */ |
2681 xmlChar * | 2909 xmlChar * |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3024 ((c >= 0x2070) && (c <= 0x218F)) || | 3252 ((c >= 0x2070) && (c <= 0x218F)) || |
3025 ((c >= 0x2C00) && (c <= 0x2FEF)) || | 3253 ((c >= 0x2C00) && (c <= 0x2FEF)) || |
3026 ((c >= 0x3001) && (c <= 0xD7FF)) || | 3254 ((c >= 0x3001) && (c <= 0xD7FF)) || |
3027 ((c >= 0xF900) && (c <= 0xFDCF)) || | 3255 ((c >= 0xF900) && (c <= 0xFDCF)) || |
3028 ((c >= 0xFDF0) && (c <= 0xFFFD)) || | 3256 ((c >= 0xFDF0) && (c <= 0xFFFD)) || |
3029 ((c >= 0x10000) && (c <= 0xEFFFF)))) | 3257 ((c >= 0x10000) && (c <= 0xEFFFF)))) |
3030 return(1); | 3258 return(1); |
3031 } else { | 3259 } else { |
3032 if ((IS_LETTER(c)) || (IS_DIGIT(c)) || | 3260 if ((IS_LETTER(c)) || (IS_DIGIT(c)) || |
3033 (c == '.') || (c == '-') || | 3261 (c == '.') || (c == '-') || |
3034 » (c == '_') || (c == ':') || | 3262 » (c == '_') || (c == ':') || |
3035 (IS_COMBINING(c)) || | 3263 (IS_COMBINING(c)) || |
3036 (IS_EXTENDER(c))) | 3264 (IS_EXTENDER(c))) |
3037 return(1); | 3265 return(1); |
3038 } | 3266 } |
3039 return(0); | 3267 return(0); |
3040 } | 3268 } |
3041 | 3269 |
3042 static xmlChar * xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, | 3270 static xmlChar * xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, |
3043 int *len, int *alloc, int normalize); | 3271 int *len, int *alloc, int normalize); |
3044 | 3272 |
3045 static const xmlChar * | 3273 static const xmlChar * |
3046 xmlParseNameComplex(xmlParserCtxtPtr ctxt) { | 3274 xmlParseNameComplex(xmlParserCtxtPtr ctxt) { |
3047 int len = 0, l; | 3275 int len = 0, l; |
3048 int c; | 3276 int c; |
3049 int count = 0; | 3277 int count = 0; |
3050 | 3278 |
3051 #ifdef DEBUG | 3279 #ifdef DEBUG |
3052 nbParseNameComplex++; | 3280 nbParseNameComplex++; |
3053 #endif | 3281 #endif |
3054 | 3282 |
3055 /* | 3283 /* |
3056 * Handler for more complex cases | 3284 * Handler for more complex cases |
3057 */ | 3285 */ |
3058 GROW; | 3286 GROW; |
3059 if (ctxt->instate == XML_PARSER_EOF) | 3287 if (ctxt->instate == XML_PARSER_EOF) |
3060 » return(NULL); | 3288 return(NULL); |
3061 c = CUR_CHAR(l); | 3289 c = CUR_CHAR(l); |
3062 if ((ctxt->options & XML_PARSE_OLD10) == 0) { | 3290 if ((ctxt->options & XML_PARSE_OLD10) == 0) { |
3063 /* | 3291 /* |
3064 * Use the new checks of production [4] [4a] amd [5] of the | 3292 * Use the new checks of production [4] [4a] amd [5] of the |
3065 * Update 5 of XML-1.0 | 3293 * Update 5 of XML-1.0 |
3066 */ | 3294 */ |
3067 if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ | 3295 if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ |
3068 (!(((c >= 'a') && (c <= 'z')) || | 3296 (!(((c >= 'a') && (c <= 'z')) || |
3069 ((c >= 'A') && (c <= 'Z')) || | 3297 ((c >= 'A') && (c <= 'Z')) || |
3070 (c == '_') || (c == ':') || | 3298 (c == '_') || (c == ':') || |
(...skipping 28 matching lines...) Expand all Loading... |
3099 ((c >= 0x37F) && (c <= 0x1FFF)) || | 3327 ((c >= 0x37F) && (c <= 0x1FFF)) || |
3100 ((c >= 0x200C) && (c <= 0x200D)) || | 3328 ((c >= 0x200C) && (c <= 0x200D)) || |
3101 ((c >= 0x203F) && (c <= 0x2040)) || /* !start */ | 3329 ((c >= 0x203F) && (c <= 0x2040)) || /* !start */ |
3102 ((c >= 0x2070) && (c <= 0x218F)) || | 3330 ((c >= 0x2070) && (c <= 0x218F)) || |
3103 ((c >= 0x2C00) && (c <= 0x2FEF)) || | 3331 ((c >= 0x2C00) && (c <= 0x2FEF)) || |
3104 ((c >= 0x3001) && (c <= 0xD7FF)) || | 3332 ((c >= 0x3001) && (c <= 0xD7FF)) || |
3105 ((c >= 0xF900) && (c <= 0xFDCF)) || | 3333 ((c >= 0xF900) && (c <= 0xFDCF)) || |
3106 ((c >= 0xFDF0) && (c <= 0xFFFD)) || | 3334 ((c >= 0xFDF0) && (c <= 0xFFFD)) || |
3107 ((c >= 0x10000) && (c <= 0xEFFFF)) | 3335 ((c >= 0x10000) && (c <= 0xEFFFF)) |
3108 )) { | 3336 )) { |
3109 » if (count++ > 100) { | 3337 » if (count++ > XML_PARSER_CHUNK_SIZE) { |
3110 count = 0; | 3338 count = 0; |
3111 GROW; | 3339 GROW; |
3112 if (ctxt->instate == XML_PARSER_EOF) | 3340 if (ctxt->instate == XML_PARSER_EOF) |
3113 return(NULL); | 3341 return(NULL); |
3114 } | 3342 } |
3115 len += l; | 3343 len += l; |
3116 NEXTL(l); | 3344 NEXTL(l); |
3117 c = CUR_CHAR(l); | 3345 c = CUR_CHAR(l); |
3118 } | 3346 } |
3119 } else { | 3347 } else { |
3120 if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ | 3348 if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ |
3121 (!IS_LETTER(c) && (c != '_') && | 3349 (!IS_LETTER(c) && (c != '_') && |
3122 (c != ':'))) { | 3350 (c != ':'))) { |
3123 return(NULL); | 3351 return(NULL); |
3124 } | 3352 } |
3125 len += l; | 3353 len += l; |
3126 NEXTL(l); | 3354 NEXTL(l); |
3127 c = CUR_CHAR(l); | 3355 c = CUR_CHAR(l); |
3128 | 3356 |
3129 while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ | 3357 while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ |
3130 ((IS_LETTER(c)) || (IS_DIGIT(c)) || | 3358 ((IS_LETTER(c)) || (IS_DIGIT(c)) || |
3131 (c == '.') || (c == '-') || | 3359 (c == '.') || (c == '-') || |
3132 » » (c == '_') || (c == ':') || | 3360 » » (c == '_') || (c == ':') || |
3133 (IS_COMBINING(c)) || | 3361 (IS_COMBINING(c)) || |
3134 (IS_EXTENDER(c)))) { | 3362 (IS_EXTENDER(c)))) { |
3135 » if (count++ > 100) { | 3363 » if (count++ > XML_PARSER_CHUNK_SIZE) { |
3136 count = 0; | 3364 count = 0; |
3137 GROW; | 3365 GROW; |
3138 if (ctxt->instate == XML_PARSER_EOF) | 3366 if (ctxt->instate == XML_PARSER_EOF) |
3139 return(NULL); | 3367 return(NULL); |
3140 } | 3368 } |
3141 len += l; | 3369 len += l; |
3142 NEXTL(l); | 3370 NEXTL(l); |
3143 c = CUR_CHAR(l); | 3371 c = CUR_CHAR(l); |
| 3372 if (c == 0) { |
| 3373 count = 0; |
| 3374 GROW; |
| 3375 if (ctxt->instate == XML_PARSER_EOF) |
| 3376 return(NULL); |
| 3377 c = CUR_CHAR(l); |
| 3378 } |
3144 } | 3379 } |
3145 } | 3380 } |
| 3381 if ((len > XML_MAX_NAME_LENGTH) && |
| 3382 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3383 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); |
| 3384 return(NULL); |
| 3385 } |
3146 if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) | 3386 if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) |
3147 return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len)); | 3387 return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len)); |
3148 return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); | 3388 return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); |
3149 } | 3389 } |
3150 | 3390 |
3151 /** | 3391 /** |
3152 * xmlParseName: | 3392 * xmlParseName: |
3153 * @ctxt: an XML parser context | 3393 * @ctxt: an XML parser context |
3154 * | 3394 * |
3155 * parse an XML name. | 3395 * parse an XML name. |
(...skipping 29 matching lines...) Expand all Loading... |
3185 (*in == '_') || (*in == ':')) { | 3425 (*in == '_') || (*in == ':')) { |
3186 in++; | 3426 in++; |
3187 while (((*in >= 0x61) && (*in <= 0x7A)) || | 3427 while (((*in >= 0x61) && (*in <= 0x7A)) || |
3188 ((*in >= 0x41) && (*in <= 0x5A)) || | 3428 ((*in >= 0x41) && (*in <= 0x5A)) || |
3189 ((*in >= 0x30) && (*in <= 0x39)) || | 3429 ((*in >= 0x30) && (*in <= 0x39)) || |
3190 (*in == '_') || (*in == '-') || | 3430 (*in == '_') || (*in == '-') || |
3191 (*in == ':') || (*in == '.')) | 3431 (*in == ':') || (*in == '.')) |
3192 in++; | 3432 in++; |
3193 if ((*in > 0) && (*in < 0x80)) { | 3433 if ((*in > 0) && (*in < 0x80)) { |
3194 count = in - ctxt->input->cur; | 3434 count = in - ctxt->input->cur; |
| 3435 if ((count > XML_MAX_NAME_LENGTH) && |
| 3436 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3437 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); |
| 3438 return(NULL); |
| 3439 } |
3195 ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); | 3440 ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); |
3196 ctxt->input->cur = in; | 3441 ctxt->input->cur = in; |
3197 ctxt->nbChars += count; | 3442 ctxt->nbChars += count; |
3198 ctxt->input->col += count; | 3443 ctxt->input->col += count; |
3199 if (ret == NULL) | 3444 if (ret == NULL) |
3200 xmlErrMemory(ctxt, NULL); | 3445 xmlErrMemory(ctxt, NULL); |
3201 return(ret); | 3446 return(ret); |
3202 } | 3447 } |
3203 } | 3448 } |
3204 /* accelerator for special cases */ | 3449 /* accelerator for special cases */ |
3205 return(xmlParseNameComplex(ctxt)); | 3450 return(xmlParseNameComplex(ctxt)); |
3206 } | 3451 } |
3207 | 3452 |
3208 static const xmlChar * | 3453 static const xmlChar * |
3209 xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) { | 3454 xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) { |
3210 int len = 0, l; | 3455 int len = 0, l; |
3211 int c; | 3456 int c; |
3212 int count = 0; | 3457 int count = 0; |
| 3458 const xmlChar *end; /* needed because CUR_CHAR() can move cur on \r\n */ |
3213 | 3459 |
3214 #ifdef DEBUG | 3460 #ifdef DEBUG |
3215 nbParseNCNameComplex++; | 3461 nbParseNCNameComplex++; |
3216 #endif | 3462 #endif |
3217 | 3463 |
3218 /* | 3464 /* |
3219 * Handler for more complex cases | 3465 * Handler for more complex cases |
3220 */ | 3466 */ |
3221 GROW; | 3467 GROW; |
| 3468 end = ctxt->input->cur; |
3222 c = CUR_CHAR(l); | 3469 c = CUR_CHAR(l); |
3223 if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ | 3470 if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ |
3224 (!xmlIsNameStartChar(ctxt, c) || (c == ':'))) { | 3471 (!xmlIsNameStartChar(ctxt, c) || (c == ':'))) { |
3225 return(NULL); | 3472 return(NULL); |
3226 } | 3473 } |
3227 | 3474 |
3228 while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ | 3475 while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ |
3229 (xmlIsNameChar(ctxt, c) && (c != ':'))) { | 3476 (xmlIsNameChar(ctxt, c) && (c != ':'))) { |
3230 » if (count++ > 100) { | 3477 » if (count++ > XML_PARSER_CHUNK_SIZE) { |
| 3478 if ((len > XML_MAX_NAME_LENGTH) && |
| 3479 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3480 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); |
| 3481 return(NULL); |
| 3482 } |
3231 count = 0; | 3483 count = 0; |
3232 GROW; | 3484 GROW; |
3233 if (ctxt->instate == XML_PARSER_EOF) | 3485 if (ctxt->instate == XML_PARSER_EOF) |
3234 return(NULL); | 3486 return(NULL); |
3235 } | 3487 } |
3236 len += l; | 3488 len += l; |
3237 NEXTL(l); | 3489 NEXTL(l); |
| 3490 end = ctxt->input->cur; |
3238 c = CUR_CHAR(l); | 3491 c = CUR_CHAR(l); |
| 3492 if (c == 0) { |
| 3493 count = 0; |
| 3494 GROW; |
| 3495 if (ctxt->instate == XML_PARSER_EOF) |
| 3496 return(NULL); |
| 3497 end = ctxt->input->cur; |
| 3498 c = CUR_CHAR(l); |
| 3499 } |
3239 } | 3500 } |
3240 return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); | 3501 if ((len > XML_MAX_NAME_LENGTH) && |
| 3502 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3503 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); |
| 3504 return(NULL); |
| 3505 } |
| 3506 return(xmlDictLookup(ctxt->dict, end - len, len)); |
3241 } | 3507 } |
3242 | 3508 |
3243 /** | 3509 /** |
3244 * xmlParseNCName: | 3510 * xmlParseNCName: |
3245 * @ctxt: an XML parser context | 3511 * @ctxt: an XML parser context |
3246 * @len: lenght of the string parsed | 3512 * @len: length of the string parsed |
3247 * | 3513 * |
3248 * parse an XML name. | 3514 * parse an XML name. |
3249 * | 3515 * |
3250 * [4NS] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | | 3516 * [4NS] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | |
3251 * CombiningChar | Extender | 3517 * CombiningChar | Extender |
3252 * | 3518 * |
3253 * [5NS] NCName ::= (Letter | '_') (NCNameChar)* | 3519 * [5NS] NCName ::= (Letter | '_') (NCNameChar)* |
3254 * | 3520 * |
3255 * Returns the Name parsed or NULL | 3521 * Returns the Name parsed or NULL |
3256 */ | 3522 */ |
(...skipping 17 matching lines...) Expand all Loading... |
3274 (*in == '_')) { | 3540 (*in == '_')) { |
3275 in++; | 3541 in++; |
3276 while (((*in >= 0x61) && (*in <= 0x7A)) || | 3542 while (((*in >= 0x61) && (*in <= 0x7A)) || |
3277 ((*in >= 0x41) && (*in <= 0x5A)) || | 3543 ((*in >= 0x41) && (*in <= 0x5A)) || |
3278 ((*in >= 0x30) && (*in <= 0x39)) || | 3544 ((*in >= 0x30) && (*in <= 0x39)) || |
3279 (*in == '_') || (*in == '-') || | 3545 (*in == '_') || (*in == '-') || |
3280 (*in == '.')) | 3546 (*in == '.')) |
3281 in++; | 3547 in++; |
3282 if ((*in > 0) && (*in < 0x80)) { | 3548 if ((*in > 0) && (*in < 0x80)) { |
3283 count = in - ctxt->input->cur; | 3549 count = in - ctxt->input->cur; |
| 3550 if ((count > XML_MAX_NAME_LENGTH) && |
| 3551 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3552 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); |
| 3553 return(NULL); |
| 3554 } |
3284 ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); | 3555 ret = xmlDictLookup(ctxt->dict, ctxt->input->cur, count); |
3285 ctxt->input->cur = in; | 3556 ctxt->input->cur = in; |
3286 ctxt->nbChars += count; | 3557 ctxt->nbChars += count; |
3287 ctxt->input->col += count; | 3558 ctxt->input->col += count; |
3288 if (ret == NULL) { | 3559 if (ret == NULL) { |
3289 xmlErrMemory(ctxt, NULL); | 3560 xmlErrMemory(ctxt, NULL); |
3290 } | 3561 } |
3291 return(ret); | 3562 return(ret); |
3292 } | 3563 } |
3293 } | 3564 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3342 * | 3613 * |
3343 * parse an XML name. | 3614 * parse an XML name. |
3344 * | 3615 * |
3345 * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | | 3616 * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | |
3346 * CombiningChar | Extender | 3617 * CombiningChar | Extender |
3347 * | 3618 * |
3348 * [5] Name ::= (Letter | '_' | ':') (NameChar)* | 3619 * [5] Name ::= (Letter | '_' | ':') (NameChar)* |
3349 * | 3620 * |
3350 * [6] Names ::= Name (#x20 Name)* | 3621 * [6] Names ::= Name (#x20 Name)* |
3351 * | 3622 * |
3352 * Returns the Name parsed or NULL. The @str pointer | 3623 * Returns the Name parsed or NULL. The @str pointer |
3353 * is updated to the current location in the string. | 3624 * is updated to the current location in the string. |
3354 */ | 3625 */ |
3355 | 3626 |
3356 static xmlChar * | 3627 static xmlChar * |
3357 xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) { | 3628 xmlParseStringName(xmlParserCtxtPtr ctxt, const xmlChar** str) { |
3358 xmlChar buf[XML_MAX_NAMELEN + 5]; | 3629 xmlChar buf[XML_MAX_NAMELEN + 5]; |
3359 const xmlChar *cur = *str; | 3630 const xmlChar *cur = *str; |
3360 int len = 0, l; | 3631 int len = 0, l; |
3361 int c; | 3632 int c; |
3362 | 3633 |
(...skipping 23 matching lines...) Expand all Loading... |
3386 | 3657 |
3387 buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); | 3658 buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); |
3388 if (buffer == NULL) { | 3659 if (buffer == NULL) { |
3389 xmlErrMemory(ctxt, NULL); | 3660 xmlErrMemory(ctxt, NULL); |
3390 return(NULL); | 3661 return(NULL); |
3391 } | 3662 } |
3392 memcpy(buffer, buf, len); | 3663 memcpy(buffer, buf, len); |
3393 while (xmlIsNameChar(ctxt, c)) { | 3664 while (xmlIsNameChar(ctxt, c)) { |
3394 if (len + 10 > max) { | 3665 if (len + 10 > max) { |
3395 xmlChar *tmp; | 3666 xmlChar *tmp; |
| 3667 |
| 3668 if ((len > XML_MAX_NAME_LENGTH) && |
| 3669 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3670 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); |
| 3671 xmlFree(buffer); |
| 3672 return(NULL); |
| 3673 } |
3396 max *= 2; | 3674 max *= 2; |
3397 tmp = (xmlChar *) xmlRealloc(buffer, | 3675 tmp = (xmlChar *) xmlRealloc(buffer, |
3398 max * sizeof(xmlChar)); | 3676 max * sizeof(xmlChar)); |
3399 if (tmp == NULL) { | 3677 if (tmp == NULL) { |
3400 xmlErrMemory(ctxt, NULL); | 3678 xmlErrMemory(ctxt, NULL); |
3401 xmlFree(buffer); | 3679 xmlFree(buffer); |
3402 return(NULL); | 3680 return(NULL); |
3403 } | 3681 } |
3404 buffer = tmp; | 3682 buffer = tmp; |
3405 } | 3683 } |
3406 COPY_BUF(l,buffer,len,c); | 3684 COPY_BUF(l,buffer,len,c); |
3407 cur += l; | 3685 cur += l; |
3408 c = CUR_SCHAR(cur, l); | 3686 c = CUR_SCHAR(cur, l); |
3409 } | 3687 } |
3410 buffer[len] = 0; | 3688 buffer[len] = 0; |
3411 *str = cur; | 3689 *str = cur; |
3412 return(buffer); | 3690 return(buffer); |
3413 } | 3691 } |
3414 } | 3692 } |
| 3693 if ((len > XML_MAX_NAME_LENGTH) && |
| 3694 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3695 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); |
| 3696 return(NULL); |
| 3697 } |
3415 *str = cur; | 3698 *str = cur; |
3416 return(xmlStrndup(buf, len)); | 3699 return(xmlStrndup(buf, len)); |
3417 } | 3700 } |
3418 | 3701 |
3419 /** | 3702 /** |
3420 * xmlParseNmtoken: | 3703 * xmlParseNmtoken: |
3421 * @ctxt: an XML parser context | 3704 * @ctxt: an XML parser context |
3422 * | 3705 * |
3423 * parse an XML Nmtoken. | 3706 * parse an XML Nmtoken. |
3424 * | 3707 * |
(...skipping 14 matching lines...) Expand all Loading... |
3439 #ifdef DEBUG | 3722 #ifdef DEBUG |
3440 nbParseNmToken++; | 3723 nbParseNmToken++; |
3441 #endif | 3724 #endif |
3442 | 3725 |
3443 GROW; | 3726 GROW; |
3444 if (ctxt->instate == XML_PARSER_EOF) | 3727 if (ctxt->instate == XML_PARSER_EOF) |
3445 return(NULL); | 3728 return(NULL); |
3446 c = CUR_CHAR(l); | 3729 c = CUR_CHAR(l); |
3447 | 3730 |
3448 while (xmlIsNameChar(ctxt, c)) { | 3731 while (xmlIsNameChar(ctxt, c)) { |
3449 » if (count++ > 100) { | 3732 » if (count++ > XML_PARSER_CHUNK_SIZE) { |
3450 count = 0; | 3733 count = 0; |
3451 GROW; | 3734 GROW; |
3452 } | 3735 } |
3453 COPY_BUF(l,buf,len,c); | 3736 COPY_BUF(l,buf,len,c); |
3454 NEXTL(l); | 3737 NEXTL(l); |
3455 c = CUR_CHAR(l); | 3738 c = CUR_CHAR(l); |
| 3739 if (c == 0) { |
| 3740 count = 0; |
| 3741 GROW; |
| 3742 if (ctxt->instate == XML_PARSER_EOF) |
| 3743 return(NULL); |
| 3744 c = CUR_CHAR(l); |
| 3745 } |
3456 if (len >= XML_MAX_NAMELEN) { | 3746 if (len >= XML_MAX_NAMELEN) { |
3457 /* | 3747 /* |
3458 * Okay someone managed to make a huge token, so he's ready to pay | 3748 * Okay someone managed to make a huge token, so he's ready to pay |
3459 * for the processing speed. | 3749 * for the processing speed. |
3460 */ | 3750 */ |
3461 xmlChar *buffer; | 3751 xmlChar *buffer; |
3462 int max = len * 2; | 3752 int max = len * 2; |
3463 | 3753 |
3464 buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); | 3754 buffer = (xmlChar *) xmlMallocAtomic(max * sizeof(xmlChar)); |
3465 if (buffer == NULL) { | 3755 if (buffer == NULL) { |
3466 xmlErrMemory(ctxt, NULL); | 3756 xmlErrMemory(ctxt, NULL); |
3467 return(NULL); | 3757 return(NULL); |
3468 } | 3758 } |
3469 memcpy(buffer, buf, len); | 3759 memcpy(buffer, buf, len); |
3470 while (xmlIsNameChar(ctxt, c)) { | 3760 while (xmlIsNameChar(ctxt, c)) { |
3471 » » if (count++ > 100) { | 3761 » » if (count++ > XML_PARSER_CHUNK_SIZE) { |
3472 count = 0; | 3762 count = 0; |
3473 GROW; | 3763 GROW; |
3474 if (ctxt->instate == XML_PARSER_EOF) { | 3764 if (ctxt->instate == XML_PARSER_EOF) { |
3475 xmlFree(buffer); | 3765 xmlFree(buffer); |
3476 return(NULL); | 3766 return(NULL); |
3477 } | 3767 } |
3478 } | 3768 } |
3479 if (len + 10 > max) { | 3769 if (len + 10 > max) { |
3480 xmlChar *tmp; | 3770 xmlChar *tmp; |
3481 | 3771 |
| 3772 if ((max > XML_MAX_NAME_LENGTH) && |
| 3773 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3774 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken"); |
| 3775 xmlFree(buffer); |
| 3776 return(NULL); |
| 3777 } |
3482 max *= 2; | 3778 max *= 2; |
3483 tmp = (xmlChar *) xmlRealloc(buffer, | 3779 tmp = (xmlChar *) xmlRealloc(buffer, |
3484 max * sizeof(xmlChar)); | 3780 max * sizeof(xmlChar)); |
3485 if (tmp == NULL) { | 3781 if (tmp == NULL) { |
3486 xmlErrMemory(ctxt, NULL); | 3782 xmlErrMemory(ctxt, NULL); |
3487 xmlFree(buffer); | 3783 xmlFree(buffer); |
3488 return(NULL); | 3784 return(NULL); |
3489 } | 3785 } |
3490 buffer = tmp; | 3786 buffer = tmp; |
3491 } | 3787 } |
3492 COPY_BUF(l,buffer,len,c); | 3788 COPY_BUF(l,buffer,len,c); |
3493 NEXTL(l); | 3789 NEXTL(l); |
3494 c = CUR_CHAR(l); | 3790 c = CUR_CHAR(l); |
3495 } | 3791 } |
3496 buffer[len] = 0; | 3792 buffer[len] = 0; |
3497 return(buffer); | 3793 return(buffer); |
3498 } | 3794 } |
3499 } | 3795 } |
3500 if (len == 0) | 3796 if (len == 0) |
3501 return(NULL); | 3797 return(NULL); |
| 3798 if ((len > XML_MAX_NAME_LENGTH) && |
| 3799 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3800 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken"); |
| 3801 return(NULL); |
| 3802 } |
3502 return(xmlStrndup(buf, len)); | 3803 return(xmlStrndup(buf, len)); |
3503 } | 3804 } |
3504 | 3805 |
3505 /** | 3806 /** |
3506 * xmlParseEntityValue: | 3807 * xmlParseEntityValue: |
3507 * @ctxt: an XML parser context | 3808 * @ctxt: an XML parser context |
3508 * @orig: if non-NULL store a copy of the original entity value | 3809 * @orig: if non-NULL store a copy of the original entity value |
3509 * | 3810 * |
3510 * parse a value for ENTITY declarations | 3811 * parse a value for ENTITY declarations |
3511 * | 3812 * |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3549 xmlFree(buf); | 3850 xmlFree(buf); |
3550 return(NULL); | 3851 return(NULL); |
3551 } | 3852 } |
3552 NEXT; | 3853 NEXT; |
3553 c = CUR_CHAR(l); | 3854 c = CUR_CHAR(l); |
3554 /* | 3855 /* |
3555 * NOTE: 4.4.5 Included in Literal | 3856 * NOTE: 4.4.5 Included in Literal |
3556 * When a parameter entity reference appears in a literal entity | 3857 * When a parameter entity reference appears in a literal entity |
3557 * value, ... a single or double quote character in the replacement | 3858 * value, ... a single or double quote character in the replacement |
3558 * text is always treated as a normal data character and will not | 3859 * text is always treated as a normal data character and will not |
3559 * terminate the literal. | 3860 * terminate the literal. |
3560 * In practice it means we stop the loop only when back at parsing | 3861 * In practice it means we stop the loop only when back at parsing |
3561 * the initial entity and the quote is found | 3862 * the initial entity and the quote is found |
3562 */ | 3863 */ |
3563 while (((IS_CHAR(c)) && ((c != stop) || /* checked */ | 3864 while (((IS_CHAR(c)) && ((c != stop) || /* checked */ |
3564 (ctxt->input != input))) && (ctxt->instate != XML_PARSER_EOF)) { | 3865 (ctxt->input != input))) && (ctxt->instate != XML_PARSER_EOF)) { |
3565 if (len + 5 >= size) { | 3866 if (len + 5 >= size) { |
3566 xmlChar *tmp; | 3867 xmlChar *tmp; |
3567 | 3868 |
3568 size *= 2; | 3869 size *= 2; |
3569 tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); | 3870 tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3660 * of xmlParseAttValue() when the attribute parsing requires handling | 3961 * of xmlParseAttValue() when the attribute parsing requires handling |
3661 * of non-ASCII characters, or normalization compaction. | 3962 * of non-ASCII characters, or normalization compaction. |
3662 * | 3963 * |
3663 * Returns the AttValue parsed or NULL. The value has to be freed by the caller. | 3964 * Returns the AttValue parsed or NULL. The value has to be freed by the caller. |
3664 */ | 3965 */ |
3665 static xmlChar * | 3966 static xmlChar * |
3666 xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { | 3967 xmlParseAttValueComplex(xmlParserCtxtPtr ctxt, int *attlen, int normalize) { |
3667 xmlChar limit = 0; | 3968 xmlChar limit = 0; |
3668 xmlChar *buf = NULL; | 3969 xmlChar *buf = NULL; |
3669 xmlChar *rep = NULL; | 3970 xmlChar *rep = NULL; |
3670 int len = 0; | 3971 size_t len = 0; |
3671 int buf_size = 0; | 3972 size_t buf_size = 0; |
3672 int c, l, in_space = 0; | 3973 int c, l, in_space = 0; |
3673 xmlChar *current = NULL; | 3974 xmlChar *current = NULL; |
3674 xmlEntityPtr ent; | 3975 xmlEntityPtr ent; |
3675 | 3976 |
3676 if (NXT(0) == '"') { | 3977 if (NXT(0) == '"') { |
3677 ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; | 3978 ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; |
3678 limit = '"'; | 3979 limit = '"'; |
3679 NEXT; | 3980 NEXT; |
3680 } else if (NXT(0) == '\'') { | 3981 } else if (NXT(0) == '\'') { |
3681 limit = '\''; | 3982 limit = '\''; |
3682 ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; | 3983 ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; |
3683 NEXT; | 3984 NEXT; |
3684 } else { | 3985 } else { |
3685 xmlFatalErr(ctxt, XML_ERR_ATTRIBUTE_NOT_STARTED, NULL); | 3986 xmlFatalErr(ctxt, XML_ERR_ATTRIBUTE_NOT_STARTED, NULL); |
3686 return(NULL); | 3987 return(NULL); |
3687 } | 3988 } |
3688 | 3989 |
3689 /* | 3990 /* |
3690 * allocate a translation buffer. | 3991 * allocate a translation buffer. |
3691 */ | 3992 */ |
3692 buf_size = XML_PARSER_BUFFER_SIZE; | 3993 buf_size = XML_PARSER_BUFFER_SIZE; |
3693 buf = (xmlChar *) xmlMallocAtomic(buf_size * sizeof(xmlChar)); | 3994 buf = (xmlChar *) xmlMallocAtomic(buf_size); |
3694 if (buf == NULL) goto mem_error; | 3995 if (buf == NULL) goto mem_error; |
3695 | 3996 |
3696 /* | 3997 /* |
3697 * OK loop until we reach one of the ending char or a size limit. | 3998 * OK loop until we reach one of the ending char or a size limit. |
3698 */ | 3999 */ |
3699 c = CUR_CHAR(l); | 4000 c = CUR_CHAR(l); |
3700 while (((NXT(0) != limit) && /* checked */ | 4001 while (((NXT(0) != limit) && /* checked */ |
3701 (IS_CHAR(c)) && (c != '<')) && | 4002 (IS_CHAR(c)) && (c != '<')) && |
3702 (ctxt->instate != XML_PARSER_EOF)) { | 4003 (ctxt->instate != XML_PARSER_EOF)) { |
| 4004 /* |
| 4005 * Impose a reasonable limit on attribute size, unless XML_PARSE_HUGE |
| 4006 * special option is given |
| 4007 */ |
| 4008 if ((len > XML_MAX_TEXT_LENGTH) && |
| 4009 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 4010 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, |
| 4011 "AttValue length too long\n"); |
| 4012 goto mem_error; |
| 4013 } |
3703 if (c == 0) break; | 4014 if (c == 0) break; |
3704 if (c == '&') { | 4015 if (c == '&') { |
3705 in_space = 0; | 4016 in_space = 0; |
3706 if (NXT(1) == '#') { | 4017 if (NXT(1) == '#') { |
3707 int val = xmlParseCharRef(ctxt); | 4018 int val = xmlParseCharRef(ctxt); |
3708 | 4019 |
3709 if (val == '&') { | 4020 if (val == '&') { |
3710 if (ctxt->replaceEntities) { | 4021 if (ctxt->replaceEntities) { |
3711 » » » if (len > buf_size - 10) { | 4022 » » » if (len + 10 > buf_size) { |
3712 growBuffer(buf, 10); | 4023 growBuffer(buf, 10); |
3713 } | 4024 } |
3714 buf[len++] = '&'; | 4025 buf[len++] = '&'; |
3715 } else { | 4026 } else { |
3716 /* | 4027 /* |
3717 * The reparsing will be done in xmlStringGetNodeList() | 4028 * The reparsing will be done in xmlStringGetNodeList() |
3718 * called by the attribute() function in SAX.c | 4029 * called by the attribute() function in SAX.c |
3719 */ | 4030 */ |
3720 » » » if (len > buf_size - 10) { | 4031 » » » if (len + 10 > buf_size) { |
3721 growBuffer(buf, 10); | 4032 growBuffer(buf, 10); |
3722 } | 4033 } |
3723 buf[len++] = '&'; | 4034 buf[len++] = '&'; |
3724 buf[len++] = '#'; | 4035 buf[len++] = '#'; |
3725 buf[len++] = '3'; | 4036 buf[len++] = '3'; |
3726 buf[len++] = '8'; | 4037 buf[len++] = '8'; |
3727 buf[len++] = ';'; | 4038 buf[len++] = ';'; |
3728 } | 4039 } |
3729 } else if (val != 0) { | 4040 } else if (val != 0) { |
3730 » » if (len > buf_size - 10) { | 4041 » » if (len + 10 > buf_size) { |
3731 growBuffer(buf, 10); | 4042 growBuffer(buf, 10); |
3732 } | 4043 } |
3733 len += xmlCopyChar(0, &buf[len], val); | 4044 len += xmlCopyChar(0, &buf[len], val); |
3734 } | 4045 } |
3735 } else { | 4046 } else { |
3736 ent = xmlParseEntityRef(ctxt); | 4047 ent = xmlParseEntityRef(ctxt); |
3737 ctxt->nbentities++; | 4048 ctxt->nbentities++; |
3738 if (ent != NULL) | 4049 if (ent != NULL) |
3739 ctxt->nbentities += ent->owner; | 4050 ctxt->nbentities += ent->owner; |
3740 if ((ent != NULL) && | 4051 if ((ent != NULL) && |
3741 (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { | 4052 (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) { |
3742 » » if (len > buf_size - 10) { | 4053 » » if (len + 10 > buf_size) { |
3743 growBuffer(buf, 10); | 4054 growBuffer(buf, 10); |
3744 } | 4055 } |
3745 if ((ctxt->replaceEntities == 0) && | 4056 if ((ctxt->replaceEntities == 0) && |
3746 (ent->content[0] == '&')) { | 4057 (ent->content[0] == '&')) { |
3747 buf[len++] = '&'; | 4058 buf[len++] = '&'; |
3748 buf[len++] = '#'; | 4059 buf[len++] = '#'; |
3749 buf[len++] = '3'; | 4060 buf[len++] = '3'; |
3750 buf[len++] = '8'; | 4061 buf[len++] = '8'; |
3751 buf[len++] = ';'; | 4062 buf[len++] = ';'; |
3752 } else { | 4063 } else { |
3753 buf[len++] = ent->content[0]; | 4064 buf[len++] = ent->content[0]; |
3754 } | 4065 } |
3755 » » } else if ((ent != NULL) && | 4066 » » } else if ((ent != NULL) && |
3756 (ctxt->replaceEntities != 0)) { | 4067 (ctxt->replaceEntities != 0)) { |
3757 if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { | 4068 if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { |
3758 rep = xmlStringDecodeEntities(ctxt, ent->content, | 4069 rep = xmlStringDecodeEntities(ctxt, ent->content, |
3759 XML_SUBSTITUTE_REF, | 4070 XML_SUBSTITUTE_REF, |
3760 0, 0, 0); | 4071 0, 0, 0); |
3761 if (rep != NULL) { | 4072 if (rep != NULL) { |
3762 current = rep; | 4073 current = rep; |
3763 while (*current != 0) { /* non input consuming */ | 4074 while (*current != 0) { /* non input consuming */ |
3764 if ((*current == 0xD) || (*current == 0xA) || | 4075 if ((*current == 0xD) || (*current == 0xA) || |
3765 (*current == 0x9)) { | 4076 (*current == 0x9)) { |
3766 buf[len++] = 0x20; | 4077 buf[len++] = 0x20; |
3767 current++; | 4078 current++; |
3768 } else | 4079 } else |
3769 buf[len++] = *current++; | 4080 buf[len++] = *current++; |
3770 » » » » if (len > buf_size - 10) { | 4081 » » » » if (len + 10 > buf_size) { |
3771 growBuffer(buf, 10); | 4082 growBuffer(buf, 10); |
3772 } | 4083 } |
3773 } | 4084 } |
3774 xmlFree(rep); | 4085 xmlFree(rep); |
3775 rep = NULL; | 4086 rep = NULL; |
3776 } | 4087 } |
3777 } else { | 4088 } else { |
3778 » » » if (len > buf_size - 10) { | 4089 » » » if (len + 10 > buf_size) { |
3779 growBuffer(buf, 10); | 4090 growBuffer(buf, 10); |
3780 } | 4091 } |
3781 if (ent->content != NULL) | 4092 if (ent->content != NULL) |
3782 buf[len++] = ent->content[0]; | 4093 buf[len++] = ent->content[0]; |
3783 } | 4094 } |
3784 } else if (ent != NULL) { | 4095 } else if (ent != NULL) { |
3785 int i = xmlStrlen(ent->name); | 4096 int i = xmlStrlen(ent->name); |
3786 const xmlChar *cur = ent->name; | 4097 const xmlChar *cur = ent->name; |
3787 | 4098 |
3788 /* | 4099 /* |
3789 * This may look absurd but is needed to detect | 4100 * This may look absurd but is needed to detect |
3790 * entities problems | 4101 * entities problems |
3791 */ | 4102 */ |
3792 if ((ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && | 4103 if ((ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && |
3793 » » » (ent->content != NULL)) { | 4104 » » » (ent->content != NULL) && (ent->checked == 0)) { |
| 4105 » » » unsigned long oldnbent = ctxt->nbentities; |
| 4106 |
3794 rep = xmlStringDecodeEntities(ctxt, ent->content, | 4107 rep = xmlStringDecodeEntities(ctxt, ent->content, |
3795 XML_SUBSTITUTE_REF, 0, 0, 0); | 4108 XML_SUBSTITUTE_REF, 0, 0, 0); |
| 4109 |
| 4110 ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
3796 if (rep != NULL) { | 4111 if (rep != NULL) { |
| 4112 if (xmlStrchr(rep, '<')) |
| 4113 ent->checked |= 1; |
3797 xmlFree(rep); | 4114 xmlFree(rep); |
3798 rep = NULL; | 4115 rep = NULL; |
3799 } | 4116 } |
3800 } | 4117 } |
3801 | 4118 |
3802 /* | 4119 /* |
3803 * Just output the reference | 4120 * Just output the reference |
3804 */ | 4121 */ |
3805 buf[len++] = '&'; | 4122 buf[len++] = '&'; |
3806 » » while (len > buf_size - i - 10) { | 4123 » » while (len + i + 10 > buf_size) { |
3807 growBuffer(buf, i + 10); | 4124 growBuffer(buf, i + 10); |
3808 } | 4125 } |
3809 for (;i > 0;i--) | 4126 for (;i > 0;i--) |
3810 buf[len++] = *cur++; | 4127 buf[len++] = *cur++; |
3811 buf[len++] = ';'; | 4128 buf[len++] = ';'; |
3812 } | 4129 } |
3813 } | 4130 } |
3814 } else { | 4131 } else { |
3815 if ((c == 0x20) || (c == 0xD) || (c == 0xA) || (c == 0x9)) { | 4132 if ((c == 0x20) || (c == 0xD) || (c == 0xA) || (c == 0x9)) { |
3816 if ((len != 0) || (!normalize)) { | 4133 if ((len != 0) || (!normalize)) { |
3817 if ((!normalize) || (!in_space)) { | 4134 if ((!normalize) || (!in_space)) { |
3818 COPY_BUF(l,buf,len,0x20); | 4135 COPY_BUF(l,buf,len,0x20); |
3819 » » » while (len > buf_size - 10) { | 4136 » » » while (len + 10 > buf_size) { |
3820 growBuffer(buf, 10); | 4137 growBuffer(buf, 10); |
3821 } | 4138 } |
3822 } | 4139 } |
3823 in_space = 1; | 4140 in_space = 1; |
3824 } | 4141 } |
3825 } else { | 4142 } else { |
3826 in_space = 0; | 4143 in_space = 0; |
3827 COPY_BUF(l,buf,len,c); | 4144 COPY_BUF(l,buf,len,c); |
3828 » » if (len > buf_size - 10) { | 4145 » » if (len + 10 > buf_size) { |
3829 growBuffer(buf, 10); | 4146 growBuffer(buf, 10); |
3830 } | 4147 } |
3831 } | 4148 } |
3832 NEXTL(l); | 4149 NEXTL(l); |
3833 } | 4150 } |
3834 GROW; | 4151 GROW; |
3835 c = CUR_CHAR(l); | 4152 c = CUR_CHAR(l); |
3836 } | 4153 } |
3837 if (ctxt->instate == XML_PARSER_EOF) | 4154 if (ctxt->instate == XML_PARSER_EOF) |
3838 goto error; | 4155 goto error; |
3839 | 4156 |
3840 if ((in_space) && (normalize)) { | 4157 if ((in_space) && (normalize)) { |
3841 while ((len > 0) && (buf[len - 1] == 0x20)) len--; | 4158 while ((len > 0) && (buf[len - 1] == 0x20)) len--; |
3842 } | 4159 } |
3843 buf[len] = 0; | 4160 buf[len] = 0; |
3844 if (RAW == '<') { | 4161 if (RAW == '<') { |
3845 xmlFatalErr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, NULL); | 4162 xmlFatalErr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, NULL); |
3846 } else if (RAW != limit) { | 4163 } else if (RAW != limit) { |
3847 if ((c != 0) && (!IS_CHAR(c))) { | 4164 if ((c != 0) && (!IS_CHAR(c))) { |
3848 xmlFatalErrMsg(ctxt, XML_ERR_INVALID_CHAR, | 4165 xmlFatalErrMsg(ctxt, XML_ERR_INVALID_CHAR, |
3849 "invalid character in attribute value\n"); | 4166 "invalid character in attribute value\n"); |
3850 } else { | 4167 } else { |
3851 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, | 4168 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, |
3852 "AttValue: ' expected\n"); | 4169 "AttValue: ' expected\n"); |
3853 } | 4170 } |
3854 } else | 4171 } else |
3855 NEXT; | 4172 NEXT; |
3856 if (attlen != NULL) *attlen = len; | 4173 |
| 4174 /* |
| 4175 * There we potentially risk an overflow, don't allow attribute value of |
| 4176 * length more than INT_MAX it is a very reasonnable assumption ! |
| 4177 */ |
| 4178 if (len >= INT_MAX) { |
| 4179 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, |
| 4180 "AttValue length too long\n"); |
| 4181 goto mem_error; |
| 4182 } |
| 4183 |
| 4184 if (attlen != NULL) *attlen = (int) len; |
3857 return(buf); | 4185 return(buf); |
3858 | 4186 |
3859 mem_error: | 4187 mem_error: |
3860 xmlErrMemory(ctxt, NULL); | 4188 xmlErrMemory(ctxt, NULL); |
3861 error: | 4189 error: |
3862 if (buf != NULL) | 4190 if (buf != NULL) |
3863 xmlFree(buf); | 4191 xmlFree(buf); |
3864 if (rep != NULL) | 4192 if (rep != NULL) |
3865 xmlFree(rep); | 4193 xmlFree(rep); |
3866 return(NULL); | 4194 return(NULL); |
3867 } | 4195 } |
3868 | 4196 |
3869 /** | 4197 /** |
3870 * xmlParseAttValue: | 4198 * xmlParseAttValue: |
3871 * @ctxt: an XML parser context | 4199 * @ctxt: an XML parser context |
3872 * | 4200 * |
3873 * parse a value for an attribute | 4201 * parse a value for an attribute |
3874 * Note: the parser won't do substitution of entities here, this | 4202 * Note: the parser won't do substitution of entities here, this |
3875 * will be handled later in xmlStringGetNodeList | 4203 * will be handled later in xmlStringGetNodeList |
3876 * | 4204 * |
3877 * [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | | 4205 * [10] AttValue ::= '"' ([^<&"] | Reference)* '"' | |
3878 * "'" ([^<&'] | Reference)* "'" | 4206 * "'" ([^<&'] | Reference)* "'" |
3879 * | 4207 * |
3880 * 3.3.3 Attribute-Value Normalization: | 4208 * 3.3.3 Attribute-Value Normalization: |
3881 * Before the value of an attribute is passed to the application or | 4209 * Before the value of an attribute is passed to the application or |
3882 * checked for validity, the XML processor must normalize it as follows: | 4210 * checked for validity, the XML processor must normalize it as follows: |
3883 * - a character reference is processed by appending the referenced | 4211 * - a character reference is processed by appending the referenced |
3884 * character to the attribute value | 4212 * character to the attribute value |
3885 * - an entity reference is processed by recursively processing the | 4213 * - an entity reference is processed by recursively processing the |
3886 * replacement text of the entity | 4214 * replacement text of the entity |
3887 * - a whitespace character (#x20, #xD, #xA, #x9) is processed by | 4215 * - a whitespace character (#x20, #xD, #xA, #x9) is processed by |
3888 * appending #x20 to the normalized value, except that only a single | 4216 * appending #x20 to the normalized value, except that only a single |
3889 * #x20 is appended for a "#xD#xA" sequence that is part of an external | 4217 * #x20 is appended for a "#xD#xA" sequence that is part of an external |
3890 * parsed entity or the literal entity value of an internal parsed entity | 4218 * parsed entity or the literal entity value of an internal parsed entity |
3891 * - other characters are processed by appending them to the normalized value | 4219 * - other characters are processed by appending them to the normalized value |
3892 * If the declared value is not CDATA, then the XML processor must further | 4220 * If the declared value is not CDATA, then the XML processor must further |
3893 * process the normalized attribute value by discarding any leading and | 4221 * process the normalized attribute value by discarding any leading and |
3894 * trailing space (#x20) characters, and by replacing sequences of space | 4222 * trailing space (#x20) characters, and by replacing sequences of space |
3895 * (#x20) characters by a single space (#x20) character. | 4223 * (#x20) characters by a single space (#x20) character. |
3896 * All attributes for which no declaration has been read should be treated | 4224 * All attributes for which no declaration has been read should be treated |
3897 * by a non-validating parser as if declared CDATA. | 4225 * by a non-validating parser as if declared CDATA. |
3898 * | 4226 * |
3899 * Returns the AttValue parsed or NULL. The value has to be freed by the caller. | 4227 * Returns the AttValue parsed or NULL. The value has to be freed by the caller. |
3900 */ | 4228 */ |
3901 | 4229 |
3902 | 4230 |
3903 xmlChar * | 4231 xmlChar * |
3904 xmlParseAttValue(xmlParserCtxtPtr ctxt) { | 4232 xmlParseAttValue(xmlParserCtxtPtr ctxt) { |
3905 if ((ctxt == NULL) || (ctxt->input == NULL)) return(NULL); | 4233 if ((ctxt == NULL) || (ctxt->input == NULL)) return(NULL); |
3906 return(xmlParseAttValueInternal(ctxt, NULL, NULL, 0)); | 4234 return(xmlParseAttValueInternal(ctxt, NULL, NULL, 0)); |
3907 } | 4235 } |
3908 | 4236 |
3909 /** | 4237 /** |
3910 * xmlParseSystemLiteral: | 4238 * xmlParseSystemLiteral: |
3911 * @ctxt: an XML parser context | 4239 * @ctxt: an XML parser context |
3912 * | 4240 * |
3913 * parse an XML Literal | 4241 * parse an XML Literal |
3914 * | 4242 * |
3915 * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") | 4243 * [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") |
3916 * | 4244 * |
3917 * Returns the SystemLiteral parsed or NULL | 4245 * Returns the SystemLiteral parsed or NULL |
3918 */ | 4246 */ |
3919 | 4247 |
3920 xmlChar * | 4248 xmlChar * |
3921 xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) { | 4249 xmlParseSystemLiteral(xmlParserCtxtPtr ctxt) { |
3922 xmlChar *buf = NULL; | 4250 xmlChar *buf = NULL; |
3923 int len = 0; | 4251 int len = 0; |
3924 int size = XML_PARSER_BUFFER_SIZE; | 4252 int size = XML_PARSER_BUFFER_SIZE; |
3925 int cur, l; | 4253 int cur, l; |
3926 xmlChar stop; | 4254 xmlChar stop; |
3927 int state = ctxt->instate; | 4255 int state = ctxt->instate; |
3928 int count = 0; | 4256 int count = 0; |
3929 | 4257 |
3930 SHRINK; | 4258 SHRINK; |
3931 if (RAW == '"') { | 4259 if (RAW == '"') { |
3932 NEXT; | 4260 NEXT; |
3933 stop = '"'; | 4261 stop = '"'; |
3934 } else if (RAW == '\'') { | 4262 } else if (RAW == '\'') { |
3935 NEXT; | 4263 NEXT; |
3936 stop = '\''; | 4264 stop = '\''; |
3937 } else { | 4265 } else { |
3938 xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, NULL); | 4266 xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_STARTED, NULL); |
3939 return(NULL); | 4267 return(NULL); |
3940 } | 4268 } |
3941 | 4269 |
3942 buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); | 4270 buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); |
3943 if (buf == NULL) { | 4271 if (buf == NULL) { |
3944 xmlErrMemory(ctxt, NULL); | 4272 xmlErrMemory(ctxt, NULL); |
3945 return(NULL); | 4273 return(NULL); |
3946 } | 4274 } |
3947 ctxt->instate = XML_PARSER_SYSTEM_LITERAL; | 4275 ctxt->instate = XML_PARSER_SYSTEM_LITERAL; |
3948 cur = CUR_CHAR(l); | 4276 cur = CUR_CHAR(l); |
3949 while ((IS_CHAR(cur)) && (cur != stop)) { /* checked */ | 4277 while ((IS_CHAR(cur)) && (cur != stop)) { /* checked */ |
3950 if (len + 5 >= size) { | 4278 if (len + 5 >= size) { |
3951 xmlChar *tmp; | 4279 xmlChar *tmp; |
3952 | 4280 |
| 4281 if ((size > XML_MAX_NAME_LENGTH) && |
| 4282 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 4283 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "SystemLiteral"); |
| 4284 xmlFree(buf); |
| 4285 ctxt->instate = (xmlParserInputState) state; |
| 4286 return(NULL); |
| 4287 } |
3953 size *= 2; | 4288 size *= 2; |
3954 tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); | 4289 tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); |
3955 if (tmp == NULL) { | 4290 if (tmp == NULL) { |
3956 xmlFree(buf); | 4291 xmlFree(buf); |
3957 xmlErrMemory(ctxt, NULL); | 4292 xmlErrMemory(ctxt, NULL); |
3958 ctxt->instate = (xmlParserInputState) state; | 4293 ctxt->instate = (xmlParserInputState) state; |
3959 return(NULL); | 4294 return(NULL); |
3960 } | 4295 } |
3961 buf = tmp; | 4296 buf = tmp; |
3962 } | 4297 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4024 if (buf == NULL) { | 4359 if (buf == NULL) { |
4025 xmlErrMemory(ctxt, NULL); | 4360 xmlErrMemory(ctxt, NULL); |
4026 return(NULL); | 4361 return(NULL); |
4027 } | 4362 } |
4028 ctxt->instate = XML_PARSER_PUBLIC_LITERAL; | 4363 ctxt->instate = XML_PARSER_PUBLIC_LITERAL; |
4029 cur = CUR; | 4364 cur = CUR; |
4030 while ((IS_PUBIDCHAR_CH(cur)) && (cur != stop)) { /* checked */ | 4365 while ((IS_PUBIDCHAR_CH(cur)) && (cur != stop)) { /* checked */ |
4031 if (len + 1 >= size) { | 4366 if (len + 1 >= size) { |
4032 xmlChar *tmp; | 4367 xmlChar *tmp; |
4033 | 4368 |
| 4369 if ((size > XML_MAX_NAME_LENGTH) && |
| 4370 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 4371 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Public ID"); |
| 4372 xmlFree(buf); |
| 4373 return(NULL); |
| 4374 } |
4034 size *= 2; | 4375 size *= 2; |
4035 tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); | 4376 tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); |
4036 if (tmp == NULL) { | 4377 if (tmp == NULL) { |
4037 xmlErrMemory(ctxt, NULL); | 4378 xmlErrMemory(ctxt, NULL); |
4038 xmlFree(buf); | 4379 xmlFree(buf); |
4039 return(NULL); | 4380 return(NULL); |
4040 } | 4381 } |
4041 buf = tmp; | 4382 buf = tmp; |
4042 } | 4383 } |
4043 buf[len++] = cur; | 4384 buf[len++] = cur; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4112 * xmlParseCharData: | 4453 * xmlParseCharData: |
4113 * @ctxt: an XML parser context | 4454 * @ctxt: an XML parser context |
4114 * @cdata: int indicating whether we are within a CDATA section | 4455 * @cdata: int indicating whether we are within a CDATA section |
4115 * | 4456 * |
4116 * parse a CharData section. | 4457 * parse a CharData section. |
4117 * if we are within a CDATA section ']]>' marks an end of section. | 4458 * if we are within a CDATA section ']]>' marks an end of section. |
4118 * | 4459 * |
4119 * The right angle bracket (>) may be represented using the string ">", | 4460 * The right angle bracket (>) may be represented using the string ">", |
4120 * and must, for compatibility, be escaped using ">" or a character | 4461 * and must, for compatibility, be escaped using ">" or a character |
4121 * reference when it appears in the string "]]>" in content, when that | 4462 * reference when it appears in the string "]]>" in content, when that |
4122 * string is not marking the end of a CDATA section. | 4463 * string is not marking the end of a CDATA section. |
4123 * | 4464 * |
4124 * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) | 4465 * [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) |
4125 */ | 4466 */ |
4126 | 4467 |
4127 void | 4468 void |
4128 xmlParseCharData(xmlParserCtxtPtr ctxt, int cdata) { | 4469 xmlParseCharData(xmlParserCtxtPtr ctxt, int cdata) { |
4129 const xmlChar *in; | 4470 const xmlChar *in; |
4130 int nbchar = 0; | 4471 int nbchar = 0; |
4131 int line = ctxt->input->line; | 4472 int line = ctxt->input->line; |
4132 int col = ctxt->input->col; | 4473 int col = ctxt->input->col; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4279 xmlParseCharDataComplex(xmlParserCtxtPtr ctxt, int cdata) { | 4620 xmlParseCharDataComplex(xmlParserCtxtPtr ctxt, int cdata) { |
4280 xmlChar buf[XML_PARSER_BIG_BUFFER_SIZE + 5]; | 4621 xmlChar buf[XML_PARSER_BIG_BUFFER_SIZE + 5]; |
4281 int nbchar = 0; | 4622 int nbchar = 0; |
4282 int cur, l; | 4623 int cur, l; |
4283 int count = 0; | 4624 int count = 0; |
4284 | 4625 |
4285 SHRINK; | 4626 SHRINK; |
4286 GROW; | 4627 GROW; |
4287 cur = CUR_CHAR(l); | 4628 cur = CUR_CHAR(l); |
4288 while ((cur != '<') && /* checked */ | 4629 while ((cur != '<') && /* checked */ |
4289 (cur != '&') && | 4630 (cur != '&') && |
4290 (IS_CHAR(cur))) /* test also done in xmlCurrentChar() */ { | 4631 (IS_CHAR(cur))) /* test also done in xmlCurrentChar() */ { |
4291 if ((cur == ']') && (NXT(1) == ']') && | 4632 if ((cur == ']') && (NXT(1) == ']') && |
4292 (NXT(2) == '>')) { | 4633 (NXT(2) == '>')) { |
4293 if (cdata) break; | 4634 if (cdata) break; |
4294 else { | 4635 else { |
4295 xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL); | 4636 xmlFatalErr(ctxt, XML_ERR_MISPLACED_CDATA_END, NULL); |
4296 } | 4637 } |
4297 } | 4638 } |
4298 COPY_BUF(l,buf,nbchar,cur); | 4639 COPY_BUF(l,buf,nbchar,cur); |
4299 if (nbchar >= XML_PARSER_BIG_BUFFER_SIZE) { | 4640 if (nbchar >= XML_PARSER_BIG_BUFFER_SIZE) { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4412 if (strict) { | 4753 if (strict) { |
4413 /* | 4754 /* |
4414 * We don't handle [83] so "S SystemLiteral" is required. | 4755 * We don't handle [83] so "S SystemLiteral" is required. |
4415 */ | 4756 */ |
4416 if (!IS_BLANK_CH(CUR)) { | 4757 if (!IS_BLANK_CH(CUR)) { |
4417 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 4758 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
4418 "Space required after the Public Identifier\n"); | 4759 "Space required after the Public Identifier\n"); |
4419 } | 4760 } |
4420 } else { | 4761 } else { |
4421 /* | 4762 /* |
4422 » * We handle [83] so we return immediately, if | 4763 » * We handle [83] so we return immediately, if |
4423 * "S SystemLiteral" is not detected. From a purely parsing | 4764 * "S SystemLiteral" is not detected. From a purely parsing |
4424 * point of view that's a nice mess. | 4765 * point of view that's a nice mess. |
4425 */ | 4766 */ |
4426 const xmlChar *ptr; | 4767 const xmlChar *ptr; |
4427 GROW; | 4768 GROW; |
4428 | 4769 |
4429 ptr = CUR_PTR; | 4770 ptr = CUR_PTR; |
4430 if (!IS_BLANK_CH(*ptr)) return(NULL); | 4771 if (!IS_BLANK_CH(*ptr)) return(NULL); |
4431 » | 4772 |
4432 while (IS_BLANK_CH(*ptr)) ptr++; /* TODO: dangerous, fix ! */ | 4773 while (IS_BLANK_CH(*ptr)) ptr++; /* TODO: dangerous, fix ! */ |
4433 if ((*ptr != '\'') && (*ptr != '"')) return(NULL); | 4774 if ((*ptr != '\'') && (*ptr != '"')) return(NULL); |
4434 } | 4775 } |
4435 SKIP_BLANKS; | 4776 SKIP_BLANKS; |
4436 URI = xmlParseSystemLiteral(ctxt); | 4777 URI = xmlParseSystemLiteral(ctxt); |
4437 if (URI == NULL) { | 4778 if (URI == NULL) { |
4438 xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); | 4779 xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL); |
4439 } | 4780 } |
4440 } | 4781 } |
4441 return(URI); | 4782 return(URI); |
4442 } | 4783 } |
4443 | 4784 |
4444 /** | 4785 /** |
4445 * xmlParseCommentComplex: | 4786 * xmlParseCommentComplex: |
4446 * @ctxt: an XML parser context | 4787 * @ctxt: an XML parser context |
4447 * @buf: the already parsed part of the buffer | 4788 * @buf: the already parsed part of the buffer |
4448 * @len: number of bytes filles in the buffer | 4789 * @len: number of bytes filles in the buffer |
4449 * @size: allocated size of the buffer | 4790 * @size: allocated size of the buffer |
4450 * | 4791 * |
4451 * Skip an XML (SGML) comment <!-- .... --> | 4792 * Skip an XML (SGML) comment <!-- .... --> |
4452 * The spec says that "For compatibility, the string "--" (double-hyphen) | 4793 * The spec says that "For compatibility, the string "--" (double-hyphen) |
4453 * must not occur within comments. " | 4794 * must not occur within comments. " |
4454 * This is the slow routine in case the accelerator for ascii didn't work | 4795 * This is the slow routine in case the accelerator for ascii didn't work |
4455 * | 4796 * |
4456 * [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' | 4797 * [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' |
4457 */ | 4798 */ |
4458 static void | 4799 static void |
4459 xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf, int len, int size) { | 4800 xmlParseCommentComplex(xmlParserCtxtPtr ctxt, xmlChar *buf, |
| 4801 size_t len, size_t size) { |
4460 int q, ql; | 4802 int q, ql; |
4461 int r, rl; | 4803 int r, rl; |
4462 int cur, l; | 4804 int cur, l; |
4463 int count = 0; | 4805 size_t count = 0; |
4464 int inputid; | 4806 int inputid; |
4465 | 4807 |
4466 inputid = ctxt->input->id; | 4808 inputid = ctxt->input->id; |
4467 | 4809 |
4468 if (buf == NULL) { | 4810 if (buf == NULL) { |
4469 len = 0; | 4811 len = 0; |
4470 size = XML_PARSER_BUFFER_SIZE; | 4812 size = XML_PARSER_BUFFER_SIZE; |
4471 buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); | 4813 buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); |
4472 if (buf == NULL) { | 4814 if (buf == NULL) { |
4473 xmlErrMemory(ctxt, NULL); | 4815 xmlErrMemory(ctxt, NULL); |
(...skipping 25 matching lines...) Expand all Loading... |
4499 NEXTL(rl); | 4841 NEXTL(rl); |
4500 cur = CUR_CHAR(l); | 4842 cur = CUR_CHAR(l); |
4501 if (cur == 0) | 4843 if (cur == 0) |
4502 goto not_terminated; | 4844 goto not_terminated; |
4503 while (IS_CHAR(cur) && /* checked */ | 4845 while (IS_CHAR(cur) && /* checked */ |
4504 ((cur != '>') || | 4846 ((cur != '>') || |
4505 (r != '-') || (q != '-'))) { | 4847 (r != '-') || (q != '-'))) { |
4506 if ((r == '-') && (q == '-')) { | 4848 if ((r == '-') && (q == '-')) { |
4507 xmlFatalErr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, NULL); | 4849 xmlFatalErr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, NULL); |
4508 } | 4850 } |
| 4851 if ((len > XML_MAX_TEXT_LENGTH) && |
| 4852 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 4853 xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, |
| 4854 "Comment too big found", NULL); |
| 4855 xmlFree (buf); |
| 4856 return; |
| 4857 } |
4509 if (len + 5 >= size) { | 4858 if (len + 5 >= size) { |
4510 xmlChar *new_buf; | 4859 xmlChar *new_buf; |
4511 » size *= 2; | 4860 size_t new_size; |
4512 » new_buf = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); | 4861 |
| 4862 » new_size = size * 2; |
| 4863 » new_buf = (xmlChar *) xmlRealloc(buf, new_size); |
4513 if (new_buf == NULL) { | 4864 if (new_buf == NULL) { |
4514 xmlFree (buf); | 4865 xmlFree (buf); |
4515 xmlErrMemory(ctxt, NULL); | 4866 xmlErrMemory(ctxt, NULL); |
4516 return; | 4867 return; |
4517 } | 4868 } |
4518 buf = new_buf; | 4869 buf = new_buf; |
| 4870 size = new_size; |
4519 } | 4871 } |
4520 COPY_BUF(ql,buf,len,q); | 4872 COPY_BUF(ql,buf,len,q); |
4521 q = r; | 4873 q = r; |
4522 ql = rl; | 4874 ql = rl; |
4523 r = cur; | 4875 r = cur; |
4524 rl = l; | 4876 rl = l; |
4525 | 4877 |
4526 count++; | 4878 count++; |
4527 if (count > 50) { | 4879 if (count > 50) { |
4528 GROW; | 4880 GROW; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4573 * | 4925 * |
4574 * Skip an XML (SGML) comment <!-- .... --> | 4926 * Skip an XML (SGML) comment <!-- .... --> |
4575 * The spec says that "For compatibility, the string "--" (double-hyphen) | 4927 * The spec says that "For compatibility, the string "--" (double-hyphen) |
4576 * must not occur within comments. " | 4928 * must not occur within comments. " |
4577 * | 4929 * |
4578 * [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' | 4930 * [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' |
4579 */ | 4931 */ |
4580 void | 4932 void |
4581 xmlParseComment(xmlParserCtxtPtr ctxt) { | 4933 xmlParseComment(xmlParserCtxtPtr ctxt) { |
4582 xmlChar *buf = NULL; | 4934 xmlChar *buf = NULL; |
4583 int size = XML_PARSER_BUFFER_SIZE; | 4935 size_t size = XML_PARSER_BUFFER_SIZE; |
4584 int len = 0; | 4936 size_t len = 0; |
4585 xmlParserInputState state; | 4937 xmlParserInputState state; |
4586 const xmlChar *in; | 4938 const xmlChar *in; |
4587 int nbchar = 0, ccol; | 4939 size_t nbchar = 0; |
| 4940 int ccol; |
4588 int inputid; | 4941 int inputid; |
4589 | 4942 |
4590 /* | 4943 /* |
4591 * Check that there is a comment right here. | 4944 * Check that there is a comment right here. |
4592 */ | 4945 */ |
4593 if ((RAW != '<') || (NXT(1) != '!') || | 4946 if ((RAW != '<') || (NXT(1) != '!') || |
4594 (NXT(2) != '-') || (NXT(3) != '-')) return; | 4947 (NXT(2) != '-') || (NXT(3) != '-')) return; |
4595 state = ctxt->instate; | 4948 state = ctxt->instate; |
4596 ctxt->instate = XML_PARSER_COMMENT; | 4949 ctxt->instate = XML_PARSER_COMMENT; |
4597 inputid = ctxt->input->id; | 4950 inputid = ctxt->input->id; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4657 ctxt->instate = state; | 5010 ctxt->instate = state; |
4658 return; | 5011 return; |
4659 } | 5012 } |
4660 buf = new_buf; | 5013 buf = new_buf; |
4661 } | 5014 } |
4662 memcpy(&buf[len], ctxt->input->cur, nbchar); | 5015 memcpy(&buf[len], ctxt->input->cur, nbchar); |
4663 len += nbchar; | 5016 len += nbchar; |
4664 buf[len] = 0; | 5017 buf[len] = 0; |
4665 } | 5018 } |
4666 } | 5019 } |
| 5020 if ((len > XML_MAX_TEXT_LENGTH) && |
| 5021 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 5022 xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, |
| 5023 "Comment too big found", NULL); |
| 5024 xmlFree (buf); |
| 5025 return; |
| 5026 } |
4667 ctxt->input->cur = in; | 5027 ctxt->input->cur = in; |
4668 if (*in == 0xA) { | 5028 if (*in == 0xA) { |
4669 in++; | 5029 in++; |
4670 ctxt->input->line++; ctxt->input->col = 1; | 5030 ctxt->input->line++; ctxt->input->col = 1; |
4671 } | 5031 } |
4672 if (*in == 0xD) { | 5032 if (*in == 0xD) { |
4673 in++; | 5033 in++; |
4674 if (*in == 0xA) { | 5034 if (*in == 0xA) { |
4675 ctxt->input->cur = in; | 5035 ctxt->input->cur = in; |
4676 in++; | 5036 in++; |
4677 ctxt->input->line++; ctxt->input->col = 1; | 5037 ctxt->input->line++; ctxt->input->col = 1; |
4678 continue; /* while */ | 5038 continue; /* while */ |
4679 } | 5039 } |
4680 in--; | 5040 in--; |
4681 } | 5041 } |
4682 SHRINK; | 5042 SHRINK; |
4683 GROW; | 5043 GROW; |
4684 if (ctxt->instate == XML_PARSER_EOF) { | 5044 if (ctxt->instate == XML_PARSER_EOF) { |
4685 xmlFree(buf); | 5045 xmlFree(buf); |
4686 return; | 5046 return; |
4687 » } | 5047 } |
4688 in = ctxt->input->cur; | 5048 in = ctxt->input->cur; |
4689 if (*in == '-') { | 5049 if (*in == '-') { |
4690 if (in[1] == '-') { | 5050 if (in[1] == '-') { |
4691 if (in[2] == '>') { | 5051 if (in[2] == '>') { |
4692 if (ctxt->input->id != inputid) { | 5052 if (ctxt->input->id != inputid) { |
4693 xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, | 5053 xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, |
4694 "comment doesn't start and stop in the same entity\n"); | 5054 "comment doesn't start and stop in the same entity\n"); |
4695 } | 5055 } |
4696 SKIP(3); | 5056 SKIP(3); |
4697 if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && | 5057 if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && |
4698 (!ctxt->disableSAX)) { | 5058 (!ctxt->disableSAX)) { |
4699 if (buf != NULL) | 5059 if (buf != NULL) |
4700 ctxt->sax->comment(ctxt->userData, buf); | 5060 ctxt->sax->comment(ctxt->userData, buf); |
4701 else | 5061 else |
4702 ctxt->sax->comment(ctxt->userData, BAD_CAST ""); | 5062 ctxt->sax->comment(ctxt->userData, BAD_CAST ""); |
4703 } | 5063 } |
4704 if (buf != NULL) | 5064 if (buf != NULL) |
4705 xmlFree(buf); | 5065 xmlFree(buf); |
4706 if (ctxt->instate != XML_PARSER_EOF) | 5066 if (ctxt->instate != XML_PARSER_EOF) |
4707 ctxt->instate = state; | 5067 ctxt->instate = state; |
4708 return; | 5068 return; |
4709 } | 5069 } |
4710 » » if (buf != NULL) | 5070 » » if (buf != NULL) { |
4711 » » xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, | 5071 » » xmlFatalErrMsgStr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, |
4712 » » "Comment not terminated \n<!--%.50s\n", | 5072 » » "Double hyphen within comment: " |
| 5073 "<!--%.50s\n", |
4713 buf); | 5074 buf); |
4714 » » else | 5075 » » } else |
4715 » » xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, | 5076 » » xmlFatalErrMsgStr(ctxt, XML_ERR_HYPHEN_IN_COMMENT, |
4716 » » "Comment not terminated \n", NULL); | 5077 » » "Double hyphen within comment\n", NULL); |
4717 in++; | 5078 in++; |
4718 ctxt->input->col++; | 5079 ctxt->input->col++; |
4719 } | 5080 } |
4720 in++; | 5081 in++; |
4721 ctxt->input->col++; | 5082 ctxt->input->col++; |
4722 goto get_more; | 5083 goto get_more; |
4723 } | 5084 } |
4724 } while (((*in >= 0x20) && (*in <= 0x7F)) || (*in == 0x09)); | 5085 } while (((*in >= 0x20) && (*in <= 0x7F)) || (*in == 0x09)); |
4725 xmlParseCommentComplex(ctxt, buf, len, size); | 5086 xmlParseCommentComplex(ctxt, buf, len, size); |
4726 ctxt->instate = state; | 5087 ctxt->instate = state; |
4727 return; | 5088 return; |
4728 } | 5089 } |
4729 | 5090 |
4730 | 5091 |
4731 /** | 5092 /** |
4732 * xmlParsePITarget: | 5093 * xmlParsePITarget: |
4733 * @ctxt: an XML parser context | 5094 * @ctxt: an XML parser context |
4734 * | 5095 * |
4735 * parse the name of a PI | 5096 * parse the name of a PI |
4736 * | 5097 * |
4737 * [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) | 5098 * [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) |
4738 * | 5099 * |
4739 * Returns the PITarget name or NULL | 5100 * Returns the PITarget name or NULL |
4740 */ | 5101 */ |
4741 | 5102 |
4742 const xmlChar * | 5103 const xmlChar * |
4743 xmlParsePITarget(xmlParserCtxtPtr ctxt) { | 5104 xmlParsePITarget(xmlParserCtxtPtr ctxt) { |
4744 const xmlChar *name; | 5105 const xmlChar *name; |
(...skipping 16 matching lines...) Expand all Loading... |
4761 for (i = 0;;i++) { | 5122 for (i = 0;;i++) { |
4762 if (xmlW3CPIs[i] == NULL) break; | 5123 if (xmlW3CPIs[i] == NULL) break; |
4763 if (xmlStrEqual(name, (const xmlChar *)xmlW3CPIs[i])) | 5124 if (xmlStrEqual(name, (const xmlChar *)xmlW3CPIs[i])) |
4764 return(name); | 5125 return(name); |
4765 } | 5126 } |
4766 xmlWarningMsg(ctxt, XML_ERR_RESERVED_XML_NAME, | 5127 xmlWarningMsg(ctxt, XML_ERR_RESERVED_XML_NAME, |
4767 "xmlParsePITarget: invalid name prefix 'xml'\n", | 5128 "xmlParsePITarget: invalid name prefix 'xml'\n", |
4768 NULL, NULL); | 5129 NULL, NULL); |
4769 } | 5130 } |
4770 if ((name != NULL) && (xmlStrchr(name, ':') != NULL)) { | 5131 if ((name != NULL) && (xmlStrchr(name, ':') != NULL)) { |
4771 » xmlNsErr(ctxt, XML_NS_ERR_COLON, | 5132 » xmlNsErr(ctxt, XML_NS_ERR_COLON, |
4772 » » "colon are forbidden from PI names '%s'\n", name, NULL, NULL); | 5133 » » "colons are forbidden from PI names '%s'\n", name, NULL, NULL); |
4773 } | 5134 } |
4774 return(name); | 5135 return(name); |
4775 } | 5136 } |
4776 | 5137 |
4777 #ifdef LIBXML_CATALOG_ENABLED | 5138 #ifdef LIBXML_CATALOG_ENABLED |
4778 /** | 5139 /** |
4779 * xmlParseCatalogPI: | 5140 * xmlParseCatalogPI: |
4780 * @ctxt: an XML parser context | 5141 * @ctxt: an XML parser context |
4781 * @catalog: the PI value string | 5142 * @catalog: the PI value string |
4782 * | 5143 * |
4783 * parse an XML Catalog Processing Instruction. | 5144 * parse an XML Catalog Processing Instruction. |
4784 * | 5145 * |
4785 * <?oasis-xml-catalog catalog="http://example.com/catalog.xml"?> | 5146 * <?oasis-xml-catalog catalog="http://example.com/catalog.xml"?> |
4786 * | 5147 * |
4787 * Occurs only if allowed by the user and if happening in the Misc | 5148 * Occurs only if allowed by the user and if happening in the Misc |
4788 * part of the document before any doctype informations | 5149 * part of the document before any doctype informations |
4789 * This will add the given catalog to the parsing context in order | 5150 * This will add the given catalog to the parsing context in order |
4790 * to be used if there is a resolution need further down in the document | 5151 * to be used if there is a resolution need further down in the document |
4791 */ | 5152 */ |
4792 | 5153 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4832 "Catalog PI syntax error: %s\n", | 5193 "Catalog PI syntax error: %s\n", |
4833 catalog, NULL); | 5194 catalog, NULL); |
4834 if (URL != NULL) | 5195 if (URL != NULL) |
4835 xmlFree(URL); | 5196 xmlFree(URL); |
4836 } | 5197 } |
4837 #endif | 5198 #endif |
4838 | 5199 |
4839 /** | 5200 /** |
4840 * xmlParsePI: | 5201 * xmlParsePI: |
4841 * @ctxt: an XML parser context | 5202 * @ctxt: an XML parser context |
4842 * | 5203 * |
4843 * parse an XML Processing Instruction. | 5204 * parse an XML Processing Instruction. |
4844 * | 5205 * |
4845 * [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' | 5206 * [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' |
4846 * | 5207 * |
4847 * The processing is transfered to SAX once parsed. | 5208 * The processing is transfered to SAX once parsed. |
4848 */ | 5209 */ |
4849 | 5210 |
4850 void | 5211 void |
4851 xmlParsePI(xmlParserCtxtPtr ctxt) { | 5212 xmlParsePI(xmlParserCtxtPtr ctxt) { |
4852 xmlChar *buf = NULL; | 5213 xmlChar *buf = NULL; |
4853 int len = 0; | 5214 size_t len = 0; |
4854 int size = XML_PARSER_BUFFER_SIZE; | 5215 size_t size = XML_PARSER_BUFFER_SIZE; |
4855 int cur, l; | 5216 int cur, l; |
4856 const xmlChar *target; | 5217 const xmlChar *target; |
4857 xmlParserInputState state; | 5218 xmlParserInputState state; |
4858 int count = 0; | 5219 int count = 0; |
4859 | 5220 |
4860 if ((RAW == '<') && (NXT(1) == '?')) { | 5221 if ((RAW == '<') && (NXT(1) == '?')) { |
4861 xmlParserInputPtr input = ctxt->input; | 5222 xmlParserInputPtr input = ctxt->input; |
4862 state = ctxt->instate; | 5223 state = ctxt->instate; |
4863 ctxt->instate = XML_PARSER_PI; | 5224 ctxt->instate = XML_PARSER_PI; |
4864 /* | 5225 /* |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4901 if (!IS_BLANK(cur)) { | 5262 if (!IS_BLANK(cur)) { |
4902 xmlFatalErrMsgStr(ctxt, XML_ERR_SPACE_REQUIRED, | 5263 xmlFatalErrMsgStr(ctxt, XML_ERR_SPACE_REQUIRED, |
4903 "ParsePI: PI %s space expected\n", target); | 5264 "ParsePI: PI %s space expected\n", target); |
4904 } | 5265 } |
4905 SKIP_BLANKS; | 5266 SKIP_BLANKS; |
4906 cur = CUR_CHAR(l); | 5267 cur = CUR_CHAR(l); |
4907 while (IS_CHAR(cur) && /* checked */ | 5268 while (IS_CHAR(cur) && /* checked */ |
4908 ((cur != '?') || (NXT(1) != '>'))) { | 5269 ((cur != '?') || (NXT(1) != '>'))) { |
4909 if (len + 5 >= size) { | 5270 if (len + 5 >= size) { |
4910 xmlChar *tmp; | 5271 xmlChar *tmp; |
4911 | 5272 size_t new_size = size * 2; |
4912 » » size *= 2; | 5273 » » tmp = (xmlChar *) xmlRealloc(buf, new_size); |
4913 » » tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); | |
4914 if (tmp == NULL) { | 5274 if (tmp == NULL) { |
4915 xmlErrMemory(ctxt, NULL); | 5275 xmlErrMemory(ctxt, NULL); |
4916 xmlFree(buf); | 5276 xmlFree(buf); |
4917 ctxt->instate = state; | 5277 ctxt->instate = state; |
4918 return; | 5278 return; |
4919 } | 5279 } |
4920 buf = tmp; | 5280 buf = tmp; |
| 5281 size = new_size; |
4921 } | 5282 } |
4922 count++; | 5283 count++; |
4923 if (count > 50) { | 5284 if (count > 50) { |
4924 GROW; | 5285 GROW; |
4925 if (ctxt->instate == XML_PARSER_EOF) { | 5286 if (ctxt->instate == XML_PARSER_EOF) { |
4926 xmlFree(buf); | 5287 xmlFree(buf); |
4927 return; | 5288 return; |
4928 } | 5289 } |
4929 count = 0; | 5290 count = 0; |
| 5291 if ((len > XML_MAX_TEXT_LENGTH) && |
| 5292 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 5293 xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED, |
| 5294 "PI %s too big found", target); |
| 5295 xmlFree(buf); |
| 5296 ctxt->instate = state; |
| 5297 return; |
| 5298 } |
4930 } | 5299 } |
4931 COPY_BUF(l,buf,len,cur); | 5300 COPY_BUF(l,buf,len,cur); |
4932 NEXTL(l); | 5301 NEXTL(l); |
4933 cur = CUR_CHAR(l); | 5302 cur = CUR_CHAR(l); |
4934 if (cur == 0) { | 5303 if (cur == 0) { |
4935 SHRINK; | 5304 SHRINK; |
4936 GROW; | 5305 GROW; |
4937 cur = CUR_CHAR(l); | 5306 cur = CUR_CHAR(l); |
4938 } | 5307 } |
4939 } | 5308 } |
| 5309 if ((len > XML_MAX_TEXT_LENGTH) && |
| 5310 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 5311 xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED, |
| 5312 "PI %s too big found", target); |
| 5313 xmlFree(buf); |
| 5314 ctxt->instate = state; |
| 5315 return; |
| 5316 } |
4940 buf[len] = 0; | 5317 buf[len] = 0; |
4941 if (cur != '?') { | 5318 if (cur != '?') { |
4942 xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED, | 5319 xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED, |
4943 "ParsePI: PI %s never end ...\n", target); | 5320 "ParsePI: PI %s never end ...\n", target); |
4944 } else { | 5321 } else { |
4945 if (input != ctxt->input) { | 5322 if (input != ctxt->input) { |
4946 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 5323 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
4947 "PI declaration doesn't start and stop in the same entity\n"); | 5324 "PI declaration doesn't start and stop in the same entity\n"); |
4948 } | 5325 } |
4949 SKIP(2); | 5326 SKIP(2); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4991 * and 'SYSTEM' S SystemLiteral | 5368 * and 'SYSTEM' S SystemLiteral |
4992 * | 5369 * |
4993 * See the NOTE on xmlParseExternalID(). | 5370 * See the NOTE on xmlParseExternalID(). |
4994 */ | 5371 */ |
4995 | 5372 |
4996 void | 5373 void |
4997 xmlParseNotationDecl(xmlParserCtxtPtr ctxt) { | 5374 xmlParseNotationDecl(xmlParserCtxtPtr ctxt) { |
4998 const xmlChar *name; | 5375 const xmlChar *name; |
4999 xmlChar *Pubid; | 5376 xmlChar *Pubid; |
5000 xmlChar *Systemid; | 5377 xmlChar *Systemid; |
5001 | 5378 |
5002 if (CMP10(CUR_PTR, '<', '!', 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) { | 5379 if (CMP10(CUR_PTR, '<', '!', 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) { |
5003 xmlParserInputPtr input = ctxt->input; | 5380 xmlParserInputPtr input = ctxt->input; |
5004 SHRINK; | 5381 SHRINK; |
5005 SKIP(10); | 5382 SKIP(10); |
5006 if (!IS_BLANK_CH(CUR)) { | 5383 if (!IS_BLANK_CH(CUR)) { |
5007 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 5384 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
5008 "Space required after '<!NOTATION'\n"); | 5385 "Space required after '<!NOTATION'\n"); |
5009 return; | 5386 return; |
5010 } | 5387 } |
5011 SKIP_BLANKS; | 5388 SKIP_BLANKS; |
5012 | 5389 |
5013 name = xmlParseName(ctxt); | 5390 name = xmlParseName(ctxt); |
5014 if (name == NULL) { | 5391 if (name == NULL) { |
5015 xmlFatalErr(ctxt, XML_ERR_NOTATION_NOT_STARTED, NULL); | 5392 xmlFatalErr(ctxt, XML_ERR_NOTATION_NOT_STARTED, NULL); |
5016 return; | 5393 return; |
5017 } | 5394 } |
5018 if (!IS_BLANK_CH(CUR)) { | 5395 if (!IS_BLANK_CH(CUR)) { |
5019 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 5396 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
5020 "Space required after the NOTATION name'\n"); | 5397 "Space required after the NOTATION name'\n"); |
5021 return; | 5398 return; |
5022 } | 5399 } |
5023 if (xmlStrchr(name, ':') != NULL) { | 5400 if (xmlStrchr(name, ':') != NULL) { |
5024 » xmlNsErr(ctxt, XML_NS_ERR_COLON, | 5401 » xmlNsErr(ctxt, XML_NS_ERR_COLON, |
5025 » » "colon are forbidden from notation names '%s'\n", | 5402 » » "colons are forbidden from notation names '%s'\n", |
5026 name, NULL, NULL); | 5403 name, NULL, NULL); |
5027 } | 5404 } |
5028 SKIP_BLANKS; | 5405 SKIP_BLANKS; |
5029 | 5406 |
5030 /* | 5407 /* |
5031 * Parse the IDs. | 5408 * Parse the IDs. |
5032 */ | 5409 */ |
5033 Systemid = xmlParseExternalID(ctxt, &Pubid, 0); | 5410 Systemid = xmlParseExternalID(ctxt, &Pubid, 0); |
5034 SKIP_BLANKS; | 5411 SKIP_BLANKS; |
5035 | 5412 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5074 | 5451 |
5075 void | 5452 void |
5076 xmlParseEntityDecl(xmlParserCtxtPtr ctxt) { | 5453 xmlParseEntityDecl(xmlParserCtxtPtr ctxt) { |
5077 const xmlChar *name = NULL; | 5454 const xmlChar *name = NULL; |
5078 xmlChar *value = NULL; | 5455 xmlChar *value = NULL; |
5079 xmlChar *URI = NULL, *literal = NULL; | 5456 xmlChar *URI = NULL, *literal = NULL; |
5080 const xmlChar *ndata = NULL; | 5457 const xmlChar *ndata = NULL; |
5081 int isParameter = 0; | 5458 int isParameter = 0; |
5082 xmlChar *orig = NULL; | 5459 xmlChar *orig = NULL; |
5083 int skipped; | 5460 int skipped; |
5084 | 5461 |
5085 /* GROW; done in the caller */ | 5462 /* GROW; done in the caller */ |
5086 if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) { | 5463 if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) { |
5087 xmlParserInputPtr input = ctxt->input; | 5464 xmlParserInputPtr input = ctxt->input; |
5088 SHRINK; | 5465 SHRINK; |
5089 SKIP(8); | 5466 SKIP(8); |
5090 skipped = SKIP_BLANKS; | 5467 skipped = SKIP_BLANKS; |
5091 if (skipped == 0) { | 5468 if (skipped == 0) { |
5092 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 5469 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
5093 "Space required after '<!ENTITY'\n"); | 5470 "Space required after '<!ENTITY'\n"); |
5094 } | 5471 } |
5095 | 5472 |
5096 if (RAW == '%') { | 5473 if (RAW == '%') { |
5097 NEXT; | 5474 NEXT; |
5098 skipped = SKIP_BLANKS; | 5475 skipped = SKIP_BLANKS; |
5099 if (skipped == 0) { | 5476 if (skipped == 0) { |
5100 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 5477 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
5101 "Space required after '%'\n"); | 5478 "Space required after '%'\n"); |
5102 } | 5479 } |
5103 isParameter = 1; | 5480 isParameter = 1; |
5104 } | 5481 } |
5105 | 5482 |
5106 name = xmlParseName(ctxt); | 5483 name = xmlParseName(ctxt); |
5107 if (name == NULL) { | 5484 if (name == NULL) { |
5108 xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, | 5485 xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, |
5109 "xmlParseEntityDecl: no name\n"); | 5486 "xmlParseEntityDecl: no name\n"); |
5110 return; | 5487 return; |
5111 } | 5488 } |
5112 if (xmlStrchr(name, ':') != NULL) { | 5489 if (xmlStrchr(name, ':') != NULL) { |
5113 » xmlNsErr(ctxt, XML_NS_ERR_COLON, | 5490 » xmlNsErr(ctxt, XML_NS_ERR_COLON, |
5114 » » "colon are forbidden from entities names '%s'\n", | 5491 » » "colons are forbidden from entities names '%s'\n", |
5115 name, NULL, NULL); | 5492 name, NULL, NULL); |
5116 } | 5493 } |
5117 skipped = SKIP_BLANKS; | 5494 skipped = SKIP_BLANKS; |
5118 if (skipped == 0) { | 5495 if (skipped == 0) { |
5119 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 5496 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
5120 "Space required after the entity name\n"); | 5497 "Space required after the entity name\n"); |
5121 } | 5498 } |
5122 | 5499 |
5123 ctxt->instate = XML_PARSER_ENTITY_DECL; | 5500 ctxt->instate = XML_PARSER_ENTITY_DECL; |
5124 /* | 5501 /* |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5333 * if the default declaration is the keyword #REQUIRED, then the | 5710 * if the default declaration is the keyword #REQUIRED, then the |
5334 * attribute must be specified for all elements of the type in the | 5711 * attribute must be specified for all elements of the type in the |
5335 * attribute-list declaration. | 5712 * attribute-list declaration. |
5336 * | 5713 * |
5337 * [ VC: Attribute Default Legal ] | 5714 * [ VC: Attribute Default Legal ] |
5338 * The declared default value must meet the lexical constraints of | 5715 * The declared default value must meet the lexical constraints of |
5339 * the declared attribute type c.f. xmlValidateAttributeDecl() | 5716 * the declared attribute type c.f. xmlValidateAttributeDecl() |
5340 * | 5717 * |
5341 * [ VC: Fixed Attribute Default ] | 5718 * [ VC: Fixed Attribute Default ] |
5342 * if an attribute has a default value declared with the #FIXED | 5719 * if an attribute has a default value declared with the #FIXED |
5343 * keyword, instances of that attribute must match the default value. | 5720 * keyword, instances of that attribute must match the default value. |
5344 * | 5721 * |
5345 * [ WFC: No < in Attribute Values ] | 5722 * [ WFC: No < in Attribute Values ] |
5346 * handled in xmlParseAttValue() | 5723 * handled in xmlParseAttValue() |
5347 * | 5724 * |
5348 * returns: XML_ATTRIBUTE_NONE, XML_ATTRIBUTE_REQUIRED, XML_ATTRIBUTE_IMPLIED | 5725 * returns: XML_ATTRIBUTE_NONE, XML_ATTRIBUTE_REQUIRED, XML_ATTRIBUTE_IMPLIED |
5349 * or XML_ATTRIBUTE_FIXED. | 5726 * or XML_ATTRIBUTE_FIXED. |
5350 */ | 5727 */ |
5351 | 5728 |
5352 int | 5729 int |
5353 xmlParseDefaultDecl(xmlParserCtxtPtr ctxt, xmlChar **value) { | 5730 xmlParseDefaultDecl(xmlParserCtxtPtr ctxt, xmlChar **value) { |
5354 int val; | 5731 int val; |
5355 xmlChar *ret; | 5732 xmlChar *ret; |
5356 | 5733 |
5357 *value = NULL; | 5734 *value = NULL; |
5358 if (CMP9(CUR_PTR, '#', 'R', 'E', 'Q', 'U', 'I', 'R', 'E', 'D')) { | 5735 if (CMP9(CUR_PTR, '#', 'R', 'E', 'Q', 'U', 'I', 'R', 'E', 'D')) { |
5359 SKIP(9); | 5736 SKIP(9); |
(...skipping 28 matching lines...) Expand all Loading... |
5388 * @ctxt: an XML parser context | 5765 * @ctxt: an XML parser context |
5389 * | 5766 * |
5390 * parse an Notation attribute type. | 5767 * parse an Notation attribute type. |
5391 * | 5768 * |
5392 * Note: the leading 'NOTATION' S part has already being parsed... | 5769 * Note: the leading 'NOTATION' S part has already being parsed... |
5393 * | 5770 * |
5394 * [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' | 5771 * [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' |
5395 * | 5772 * |
5396 * [ VC: Notation Attributes ] | 5773 * [ VC: Notation Attributes ] |
5397 * Values of this type must match one of the notation names included | 5774 * Values of this type must match one of the notation names included |
5398 * in the declaration; all notation names in the declaration must be declared. | 5775 * in the declaration; all notation names in the declaration must be declared. |
5399 * | 5776 * |
5400 * Returns: the notation attribute tree built while parsing | 5777 * Returns: the notation attribute tree built while parsing |
5401 */ | 5778 */ |
5402 | 5779 |
5403 xmlEnumerationPtr | 5780 xmlEnumerationPtr |
5404 xmlParseNotationType(xmlParserCtxtPtr ctxt) { | 5781 xmlParseNotationType(xmlParserCtxtPtr ctxt) { |
5405 const xmlChar *name; | 5782 const xmlChar *name; |
5406 xmlEnumerationPtr ret = NULL, last = NULL, cur, tmp; | 5783 xmlEnumerationPtr ret = NULL, last = NULL, cur, tmp; |
5407 | 5784 |
5408 if (RAW != '(') { | 5785 if (RAW != '(') { |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5588 * | 5965 * |
5589 * [ VC: IDREF ] | 5966 * [ VC: IDREF ] |
5590 * Values of type IDREF must match the Name production, and values | 5967 * Values of type IDREF must match the Name production, and values |
5591 * of type IDREFS must match Names; each IDREF Name must match the value | 5968 * of type IDREFS must match Names; each IDREF Name must match the value |
5592 * of an ID attribute on some element in the XML document; i.e. IDREF | 5969 * of an ID attribute on some element in the XML document; i.e. IDREF |
5593 * values must match the value of some ID attribute. | 5970 * values must match the value of some ID attribute. |
5594 * | 5971 * |
5595 * [ VC: Entity Name ] | 5972 * [ VC: Entity Name ] |
5596 * Values of type ENTITY must match the Name production, values | 5973 * Values of type ENTITY must match the Name production, values |
5597 * of type ENTITIES must match Names; each Entity Name must match the | 5974 * of type ENTITIES must match Names; each Entity Name must match the |
5598 * name of an unparsed entity declared in the DTD. | 5975 * name of an unparsed entity declared in the DTD. |
5599 * | 5976 * |
5600 * [ VC: Name Token ] | 5977 * [ VC: Name Token ] |
5601 * Values of type NMTOKEN must match the Nmtoken production; values | 5978 * Values of type NMTOKEN must match the Nmtoken production; values |
5602 * of type NMTOKENS must match Nmtokens. | 5979 * of type NMTOKENS must match Nmtokens. |
5603 * | 5980 * |
5604 * Returns the attribute type | 5981 * Returns the attribute type |
5605 */ | 5982 */ |
5606 int | 5983 int |
5607 xmlParseAttributeType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) { | 5984 xmlParseAttributeType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) { |
5608 SHRINK; | 5985 SHRINK; |
5609 if (CMP5(CUR_PTR, 'C', 'D', 'A', 'T', 'A')) { | 5986 if (CMP5(CUR_PTR, 'C', 'D', 'A', 'T', 'A')) { |
5610 SKIP(5); | 5987 SKIP(5); |
5611 return(XML_ATTRIBUTE_CDATA); | 5988 return(XML_ATTRIBUTE_CDATA); |
5612 } else if (CMP6(CUR_PTR, 'I', 'D', 'R', 'E', 'F', 'S')) { | 5989 } else if (CMP6(CUR_PTR, 'I', 'D', 'R', 'E', 'F', 'S')) { |
5613 SKIP(6); | 5990 SKIP(6); |
5614 return(XML_ATTRIBUTE_IDREFS); | 5991 return(XML_ATTRIBUTE_IDREFS); |
5615 } else if (CMP5(CUR_PTR, 'I', 'D', 'R', 'E', 'F')) { | 5992 } else if (CMP5(CUR_PTR, 'I', 'D', 'R', 'E', 'F')) { |
5616 SKIP(5); | 5993 SKIP(5); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5739 break; | 6116 break; |
5740 } | 6117 } |
5741 if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && | 6118 if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && |
5742 (ctxt->sax->attributeDecl != NULL)) | 6119 (ctxt->sax->attributeDecl != NULL)) |
5743 ctxt->sax->attributeDecl(ctxt->userData, elemName, attrName, | 6120 ctxt->sax->attributeDecl(ctxt->userData, elemName, attrName, |
5744 type, def, defaultValue, tree); | 6121 type, def, defaultValue, tree); |
5745 else if (tree != NULL) | 6122 else if (tree != NULL) |
5746 xmlFreeEnumeration(tree); | 6123 xmlFreeEnumeration(tree); |
5747 | 6124 |
5748 if ((ctxt->sax2) && (defaultValue != NULL) && | 6125 if ((ctxt->sax2) && (defaultValue != NULL) && |
5749 » (def != XML_ATTRIBUTE_IMPLIED) && | 6126 » (def != XML_ATTRIBUTE_IMPLIED) && |
5750 (def != XML_ATTRIBUTE_REQUIRED)) { | 6127 (def != XML_ATTRIBUTE_REQUIRED)) { |
5751 xmlAddDefAttrs(ctxt, elemName, attrName, defaultValue); | 6128 xmlAddDefAttrs(ctxt, elemName, attrName, defaultValue); |
5752 } | 6129 } |
5753 if (ctxt->sax2) { | 6130 if (ctxt->sax2) { |
5754 xmlAddSpecialAttr(ctxt, elemName, attrName, type); | 6131 xmlAddSpecialAttr(ctxt, elemName, attrName, type); |
5755 } | 6132 } |
5756 if (defaultValue != NULL) | 6133 if (defaultValue != NULL) |
5757 xmlFree(defaultValue); | 6134 xmlFree(defaultValue); |
5758 GROW; | 6135 GROW; |
5759 } | 6136 } |
5760 if (RAW == '>') { | 6137 if (RAW == '>') { |
5761 if (input != ctxt->input) { | 6138 if (input != ctxt->input) { |
5762 xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, | 6139 xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, |
5763 "Attribute list declaration doesn't start and stop in the same entity\n", | 6140 "Attribute list declaration doesn't start and stop in the same entity\n", |
5764 NULL, NULL); | 6141 NULL, NULL); |
5765 } | 6142 } |
5766 NEXT; | 6143 NEXT; |
5767 } | 6144 } |
5768 } | 6145 } |
5769 } | 6146 } |
5770 | 6147 |
5771 /** | 6148 /** |
5772 * xmlParseElementMixedContentDecl: | 6149 * xmlParseElementMixedContentDecl: |
5773 * @ctxt: an XML parser context | 6150 * @ctxt: an XML parser context |
5774 * @inputchk: the input used for the current entity, needed for boundary checks | 6151 * @inputchk: the input used for the current entity, needed for boundary checks |
5775 * | 6152 * |
5776 * parse the declaration for a Mixed Element content | 6153 * parse the declaration for a Mixed Element content |
5777 * The leading '(' and spaces have been skipped in xmlParseElementContentDecl | 6154 * The leading '(' and spaces have been skipped in xmlParseElementContentDecl |
5778 * | 6155 * |
5779 * [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | | 6156 * [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | |
5780 * '(' S? '#PCDATA' S? ')' | 6157 * '(' S? '#PCDATA' S? ')' |
5781 * | 6158 * |
5782 * [ VC: Proper Group/PE Nesting ] applies to [51] too (see [49]) | 6159 * [ VC: Proper Group/PE Nesting ] applies to [51] too (see [49]) |
5783 * | 6160 * |
5784 * [ VC: No Duplicate Types ] | 6161 * [ VC: No Duplicate Types ] |
5785 * The same name must not appear more than once in a single | 6162 * The same name must not appear more than once in a single |
5786 * mixed-content declaration. | 6163 * mixed-content declaration. |
5787 * | 6164 * |
5788 * returns: the list of the xmlElementContentPtr describing the element choices | 6165 * returns: the list of the xmlElementContentPtr describing the element choices |
5789 */ | 6166 */ |
5790 xmlElementContentPtr | 6167 xmlElementContentPtr |
5791 xmlParseElementMixedContentDecl(xmlParserCtxtPtr ctxt, int inputchk) { | 6168 xmlParseElementMixedContentDecl(xmlParserCtxtPtr ctxt, int inputchk) { |
5792 xmlElementContentPtr ret = NULL, cur = NULL, n; | 6169 xmlElementContentPtr ret = NULL, cur = NULL, n; |
5793 const xmlChar *elem = NULL; | 6170 const xmlChar *elem = NULL; |
5794 | 6171 |
5795 GROW; | 6172 GROW; |
5796 if (CMP7(CUR_PTR, '#', 'P', 'C', 'D', 'A', 'T', 'A')) { | 6173 if (CMP7(CUR_PTR, '#', 'P', 'C', 'D', 'A', 'T', 'A')) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5876 } | 6253 } |
5877 | 6254 |
5878 /** | 6255 /** |
5879 * xmlParseElementChildrenContentDeclPriv: | 6256 * xmlParseElementChildrenContentDeclPriv: |
5880 * @ctxt: an XML parser context | 6257 * @ctxt: an XML parser context |
5881 * @inputchk: the input used for the current entity, needed for boundary checks | 6258 * @inputchk: the input used for the current entity, needed for boundary checks |
5882 * @depth: the level of recursion | 6259 * @depth: the level of recursion |
5883 * | 6260 * |
5884 * parse the declaration for a Mixed Element content | 6261 * parse the declaration for a Mixed Element content |
5885 * The leading '(' and spaces have been skipped in xmlParseElementContentDecl | 6262 * The leading '(' and spaces have been skipped in xmlParseElementContentDecl |
5886 * | 6263 * |
5887 * | 6264 * |
5888 * [47] children ::= (choice | seq) ('?' | '*' | '+')? | 6265 * [47] children ::= (choice | seq) ('?' | '*' | '+')? |
5889 * | 6266 * |
5890 * [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? | 6267 * [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? |
5891 * | 6268 * |
5892 * [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' | 6269 * [49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' |
5893 * | 6270 * |
5894 * [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' | 6271 * [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' |
5895 * | 6272 * |
5896 * [ VC: Proper Group/PE Nesting ] applies to [49] and [50] | 6273 * [ VC: Proper Group/PE Nesting ] applies to [49] and [50] |
5897 * TODO Parameter-entity replacement text must be properly nested | 6274 * TODO Parameter-entity replacement text must be properly nested |
5898 * with parenthesized groups. That is to say, if either of the | 6275 * with parenthesized groups. That is to say, if either of the |
5899 * opening or closing parentheses in a choice, seq, or Mixed | 6276 * opening or closing parentheses in a choice, seq, or Mixed |
5900 * construct is contained in the replacement text for a parameter | 6277 * construct is contained in the replacement text for a parameter |
5901 * entity, both must be contained in the same replacement text. For | 6278 * entity, both must be contained in the same replacement text. For |
5902 * interoperability, if a parameter-entity reference appears in a | 6279 * interoperability, if a parameter-entity reference appears in a |
5903 * choice, seq, or Mixed construct, its replacement text should not | 6280 * choice, seq, or Mixed construct, its replacement text should not |
5904 * be empty, and neither the first nor last non-blank character of | 6281 * be empty, and neither the first nor last non-blank character of |
5905 * the replacement text should be a connector (| or ,). | 6282 * the replacement text should be a connector (| or ,). |
5906 * | 6283 * |
5907 * Returns the tree of xmlElementContentPtr describing the element | 6284 * Returns the tree of xmlElementContentPtr describing the element |
5908 * hierarchy. | 6285 * hierarchy. |
5909 */ | 6286 */ |
5910 static xmlElementContentPtr | 6287 static xmlElementContentPtr |
5911 xmlParseElementChildrenContentDeclPriv(xmlParserCtxtPtr ctxt, int inputchk, | 6288 xmlParseElementChildrenContentDeclPriv(xmlParserCtxtPtr ctxt, int inputchk, |
5912 int depth) { | 6289 int depth) { |
5913 xmlElementContentPtr ret = NULL, cur = NULL, last = NULL, op = NULL; | 6290 xmlElementContentPtr ret = NULL, cur = NULL, last = NULL, op = NULL; |
5914 const xmlChar *elem; | 6291 const xmlChar *elem; |
5915 xmlChar type = 0; | 6292 xmlChar type = 0; |
5916 | 6293 |
5917 if (((depth > 128) && ((ctxt->options & XML_PARSE_HUGE) == 0)) || | 6294 if (((depth > 128) && ((ctxt->options & XML_PARSE_HUGE) == 0)) || |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6210 } | 6587 } |
6211 | 6588 |
6212 /** | 6589 /** |
6213 * xmlParseElementContentDecl: | 6590 * xmlParseElementContentDecl: |
6214 * @ctxt: an XML parser context | 6591 * @ctxt: an XML parser context |
6215 * @name: the name of the element being defined. | 6592 * @name: the name of the element being defined. |
6216 * @result: the Element Content pointer will be stored here if any | 6593 * @result: the Element Content pointer will be stored here if any |
6217 * | 6594 * |
6218 * parse the declaration for an Element content either Mixed or Children, | 6595 * parse the declaration for an Element content either Mixed or Children, |
6219 * the cases EMPTY and ANY are handled directly in xmlParseElementDecl | 6596 * the cases EMPTY and ANY are handled directly in xmlParseElementDecl |
6220 * | 6597 * |
6221 * [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children | 6598 * [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children |
6222 * | 6599 * |
6223 * returns: the type of element content XML_ELEMENT_TYPE_xxx | 6600 * returns: the type of element content XML_ELEMENT_TYPE_xxx |
6224 */ | 6601 */ |
6225 | 6602 |
6226 int | 6603 int |
6227 xmlParseElementContentDecl(xmlParserCtxtPtr ctxt, const xmlChar *name, | 6604 xmlParseElementContentDecl(xmlParserCtxtPtr ctxt, const xmlChar *name, |
6228 xmlElementContentPtr *result) { | 6605 xmlElementContentPtr *result) { |
6229 | 6606 |
6230 xmlElementContentPtr tree = NULL; | 6607 xmlElementContentPtr tree = NULL; |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6338 if (RAW != '>') { | 6715 if (RAW != '>') { |
6339 xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); | 6716 xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); |
6340 if (content != NULL) { | 6717 if (content != NULL) { |
6341 xmlFreeDocElementContent(ctxt->myDoc, content); | 6718 xmlFreeDocElementContent(ctxt->myDoc, content); |
6342 } | 6719 } |
6343 } else { | 6720 } else { |
6344 if (input != ctxt->input) { | 6721 if (input != ctxt->input) { |
6345 xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, | 6722 xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, |
6346 "Element declaration doesn't start and stop in the same entity\n"); | 6723 "Element declaration doesn't start and stop in the same entity\n"); |
6347 } | 6724 } |
6348 » » | 6725 |
6349 NEXT; | 6726 NEXT; |
6350 if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && | 6727 if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && |
6351 (ctxt->sax->elementDecl != NULL)) { | 6728 (ctxt->sax->elementDecl != NULL)) { |
6352 if (content != NULL) | 6729 if (content != NULL) |
6353 content->parent = NULL; | 6730 content->parent = NULL; |
6354 ctxt->sax->elementDecl(ctxt->userData, name, ret, | 6731 ctxt->sax->elementDecl(ctxt->userData, name, ret, |
6355 content); | 6732 content); |
6356 if ((content != NULL) && (content->parent == NULL)) { | 6733 if ((content != NULL) && (content->parent == NULL)) { |
6357 /* | 6734 /* |
6358 * this is a trick: if xmlAddElementDecl is called, | 6735 * this is a trick: if xmlAddElementDecl is called, |
6359 * instead of copying the full tree it is plugged directly | 6736 * instead of copying the full tree it is plugged directly |
6360 » » * if called from the parser. Avoid duplicating the | 6737 » » * if called from the parser. Avoid duplicating the |
6361 * interfaces or change the API/ABI | 6738 * interfaces or change the API/ABI |
6362 */ | 6739 */ |
6363 xmlFreeDocElementContent(ctxt->myDoc, content); | 6740 xmlFreeDocElementContent(ctxt->myDoc, content); |
6364 } | 6741 } |
6365 } else if (content != NULL) { | 6742 } else if (content != NULL) { |
6366 xmlFreeDocElementContent(ctxt->myDoc, content); | 6743 xmlFreeDocElementContent(ctxt->myDoc, content); |
6367 } | 6744 } |
6368 } | 6745 } |
6369 } | 6746 } |
6370 return(ret); | 6747 return(ret); |
6371 } | 6748 } |
6372 | 6749 |
6373 /** | 6750 /** |
6374 * xmlParseConditionalSections | 6751 * xmlParseConditionalSections |
6375 * @ctxt: an XML parser context | 6752 * @ctxt: an XML parser context |
6376 * | 6753 * |
6377 * [61] conditionalSect ::= includeSect | ignoreSect | 6754 * [61] conditionalSect ::= includeSect | ignoreSect |
6378 * [62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>' | 6755 * [62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>' |
6379 * [63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>' | 6756 * [63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>' |
6380 * [64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)* | 6757 * [64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)* |
6381 * [65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*) | 6758 * [65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*) |
6382 */ | 6759 */ |
6383 | 6760 |
6384 static void | 6761 static void |
6385 xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { | 6762 xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { |
6386 int id = ctxt->input->id; | 6763 int id = ctxt->input->id; |
6387 | 6764 |
6388 SKIP(3); | 6765 SKIP(3); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6520 "All markup of the conditional section is not in the same entity\n", | 6897 "All markup of the conditional section is not in the same entity\n", |
6521 NULL, NULL); | 6898 NULL, NULL); |
6522 } | 6899 } |
6523 SKIP(3); | 6900 SKIP(3); |
6524 } | 6901 } |
6525 } | 6902 } |
6526 | 6903 |
6527 /** | 6904 /** |
6528 * xmlParseMarkupDecl: | 6905 * xmlParseMarkupDecl: |
6529 * @ctxt: an XML parser context | 6906 * @ctxt: an XML parser context |
6530 * | 6907 * |
6531 * parse Markup declarations | 6908 * parse Markup declarations |
6532 * | 6909 * |
6533 * [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | | 6910 * [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | |
6534 * NotationDecl | PI | Comment | 6911 * NotationDecl | PI | Comment |
6535 * | 6912 * |
6536 * [ VC: Proper Declaration/PE Nesting ] | 6913 * [ VC: Proper Declaration/PE Nesting ] |
6537 * Parameter-entity replacement text must be properly nested with | 6914 * Parameter-entity replacement text must be properly nested with |
6538 * markup declarations. That is to say, if either the first character | 6915 * markup declarations. That is to say, if either the first character |
6539 * or the last character of a markup declaration (markupdecl above) is | 6916 * or the last character of a markup declaration (markupdecl above) is |
6540 * contained in the replacement text for a parameter-entity reference, | 6917 * contained in the replacement text for a parameter-entity reference, |
6541 * both must be contained in the same replacement text. | 6918 * both must be contained in the same replacement text. |
6542 * | 6919 * |
6543 * [ WFC: PEs in Internal Subset ] | 6920 * [ WFC: PEs in Internal Subset ] |
6544 * In the internal DTD subset, parameter-entity references can occur | 6921 * In the internal DTD subset, parameter-entity references can occur |
6545 * only where markup declarations can occur, not within markup declarations. | 6922 * only where markup declarations can occur, not within markup declarations. |
6546 * (This does not apply to references that occur in external parameter | 6923 * (This does not apply to references that occur in external parameter |
6547 * entities or to the external subset.) | 6924 * entities or to the external subset.) |
6548 */ | 6925 */ |
6549 void | 6926 void |
6550 xmlParseMarkupDecl(xmlParserCtxtPtr ctxt) { | 6927 xmlParseMarkupDecl(xmlParserCtxtPtr ctxt) { |
6551 GROW; | 6928 GROW; |
6552 if (CUR == '<') { | 6929 if (CUR == '<') { |
6553 if (NXT(1) == '!') { | 6930 if (NXT(1) == '!') { |
6554 switch (NXT(2)) { | 6931 switch (NXT(2)) { |
6555 case 'E': | 6932 case 'E': |
6556 if (NXT(3) == 'L') | 6933 if (NXT(3) == 'L') |
6557 xmlParseElementDecl(ctxt); | 6934 xmlParseElementDecl(ctxt); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6666 MOVETO_ENDTAG(CUR_PTR); | 7043 MOVETO_ENDTAG(CUR_PTR); |
6667 NEXT; | 7044 NEXT; |
6668 } | 7045 } |
6669 } | 7046 } |
6670 | 7047 |
6671 /** | 7048 /** |
6672 * xmlParseExternalSubset: | 7049 * xmlParseExternalSubset: |
6673 * @ctxt: an XML parser context | 7050 * @ctxt: an XML parser context |
6674 * @ExternalID: the external identifier | 7051 * @ExternalID: the external identifier |
6675 * @SystemID: the system identifier (or URL) | 7052 * @SystemID: the system identifier (or URL) |
6676 * | 7053 * |
6677 * parse Markup declarations from an external subset | 7054 * parse Markup declarations from an external subset |
6678 * | 7055 * |
6679 * [30] extSubset ::= textDecl? extSubsetDecl | 7056 * [30] extSubset ::= textDecl? extSubsetDecl |
6680 * | 7057 * |
6681 * [31] extSubsetDecl ::= (markupdecl | conditionalSect | PEReference | S) * | 7058 * [31] extSubsetDecl ::= (markupdecl | conditionalSect | PEReference | S) * |
6682 */ | 7059 */ |
6683 void | 7060 void |
6684 xmlParseExternalSubset(xmlParserCtxtPtr ctxt, const xmlChar *ExternalID, | 7061 xmlParseExternalSubset(xmlParserCtxtPtr ctxt, const xmlChar *ExternalID, |
6685 const xmlChar *SystemID) { | 7062 const xmlChar *SystemID) { |
6686 xmlDetectSAX2(ctxt); | 7063 xmlDetectSAX2(ctxt); |
6687 GROW; | 7064 GROW; |
6688 | 7065 |
6689 if ((ctxt->encoding == (const xmlChar *)XML_CHAR_ENCODING_NONE) && | 7066 if ((ctxt->encoding == NULL) && |
6690 (ctxt->input->end - ctxt->input->cur >= 4)) { | 7067 (ctxt->input->end - ctxt->input->cur >= 4)) { |
6691 xmlChar start[4]; | 7068 xmlChar start[4]; |
6692 xmlCharEncoding enc; | 7069 xmlCharEncoding enc; |
6693 | 7070 |
6694 start[0] = RAW; | 7071 start[0] = RAW; |
6695 start[1] = NXT(1); | 7072 start[1] = NXT(1); |
6696 start[2] = NXT(2); | 7073 start[2] = NXT(2); |
6697 start[3] = NXT(3); | 7074 start[3] = NXT(3); |
6698 enc = xmlDetectCharEncoding(start, 4); | 7075 enc = xmlDetectCharEncoding(start, 4); |
6699 if (enc != XML_CHAR_ENCODING_NONE) | 7076 if (enc != XML_CHAR_ENCODING_NONE) |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6845 if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL) && | 7222 if ((ctxt->sax != NULL) && (ctxt->sax->characters != NULL) && |
6846 (!ctxt->disableSAX)) | 7223 (!ctxt->disableSAX)) |
6847 ctxt->sax->characters(ctxt->userData, val, xmlStrlen(val)); | 7224 ctxt->sax->characters(ctxt->userData, val, xmlStrlen(val)); |
6848 return; | 7225 return; |
6849 } | 7226 } |
6850 | 7227 |
6851 /* | 7228 /* |
6852 * The first reference to the entity trigger a parsing phase | 7229 * The first reference to the entity trigger a parsing phase |
6853 * where the ent->children is filled with the result from | 7230 * where the ent->children is filled with the result from |
6854 * the parsing. | 7231 * the parsing. |
| 7232 * Note: external parsed entities will not be loaded, it is not |
| 7233 * required for a non-validating parser, unless the parsing option |
| 7234 * of validating, or substituting entities were given. Doing so is |
| 7235 * far more secure as the parser will only process data coming from |
| 7236 * the document entity by default. |
6855 */ | 7237 */ |
6856 if (ent->checked == 0) { | 7238 if ((ent->checked == 0) && |
| 7239 ((ent->etype != XML_EXTERNAL_GENERAL_PARSED_ENTITY) || |
| 7240 (ctxt->options & (XML_PARSE_NOENT | XML_PARSE_DTDVALID)))) { |
6857 unsigned long oldnbent = ctxt->nbentities; | 7241 unsigned long oldnbent = ctxt->nbentities; |
6858 | 7242 |
6859 /* | 7243 /* |
6860 * This is a bit hackish but this seems the best | 7244 * This is a bit hackish but this seems the best |
6861 * way to make sure both SAX and DOM entity support | 7245 * way to make sure both SAX and DOM entity support |
6862 * behaves okay. | 7246 * behaves okay. |
6863 */ | 7247 */ |
6864 void *user_data; | 7248 void *user_data; |
6865 if (ctxt->userData == ctxt) | 7249 if (ctxt->userData == ctxt) |
6866 user_data = NULL; | 7250 user_data = NULL; |
(...skipping 21 matching lines...) Expand all Loading... |
6888 } else { | 7272 } else { |
6889 ret = XML_ERR_ENTITY_PE_INTERNAL; | 7273 ret = XML_ERR_ENTITY_PE_INTERNAL; |
6890 xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, | 7274 xmlErrMsgStr(ctxt, XML_ERR_INTERNAL_ERROR, |
6891 "invalid entity type found\n", NULL); | 7275 "invalid entity type found\n", NULL); |
6892 } | 7276 } |
6893 | 7277 |
6894 /* | 7278 /* |
6895 * Store the number of entities needing parsing for this entity | 7279 * Store the number of entities needing parsing for this entity |
6896 * content and do checkings | 7280 * content and do checkings |
6897 */ | 7281 */ |
6898 » ent->checked = ctxt->nbentities - oldnbent; | 7282 » ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
| 7283 » if ((ent->content != NULL) && (xmlStrchr(ent->content, '<'))) |
| 7284 » ent->checked |= 1; |
6899 if (ret == XML_ERR_ENTITY_LOOP) { | 7285 if (ret == XML_ERR_ENTITY_LOOP) { |
6900 xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); | 7286 xmlFatalErr(ctxt, XML_ERR_ENTITY_LOOP, NULL); |
6901 xmlFreeNodeList(list); | 7287 xmlFreeNodeList(list); |
6902 return; | 7288 return; |
6903 } | 7289 } |
6904 » if (xmlParserEntityCheck(ctxt, 0, ent)) { | 7290 » if (xmlParserEntityCheck(ctxt, 0, ent, 0)) { |
6905 xmlFreeNodeList(list); | 7291 xmlFreeNodeList(list); |
6906 return; | 7292 return; |
6907 } | 7293 } |
6908 | 7294 |
6909 if ((ret == XML_ERR_OK) && (list != NULL)) { | 7295 if ((ret == XML_ERR_OK) && (list != NULL)) { |
6910 if (((ent->etype == XML_INTERNAL_GENERAL_ENTITY) || | 7296 if (((ent->etype == XML_INTERNAL_GENERAL_ENTITY) || |
6911 (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY))&& | 7297 (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY))&& |
6912 (ent->children == NULL)) { | 7298 (ent->children == NULL)) { |
6913 ent->children = list; | 7299 ent->children = list; |
6914 if (ctxt->replaceEntities) { | 7300 if (ctxt->replaceEntities) { |
(...skipping 19 matching lines...) Expand all Loading... |
6934 list = ent->children; | 7320 list = ent->children; |
6935 #ifdef LIBXML_LEGACY_ENABLED | 7321 #ifdef LIBXML_LEGACY_ENABLED |
6936 if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) | 7322 if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) |
6937 xmlAddEntityReference(ent, list, NULL); | 7323 xmlAddEntityReference(ent, list, NULL); |
6938 #endif /* LIBXML_LEGACY_ENABLED */ | 7324 #endif /* LIBXML_LEGACY_ENABLED */ |
6939 } | 7325 } |
6940 } else { | 7326 } else { |
6941 ent->owner = 1; | 7327 ent->owner = 1; |
6942 while (list != NULL) { | 7328 while (list != NULL) { |
6943 list->parent = (xmlNodePtr) ent; | 7329 list->parent = (xmlNodePtr) ent; |
| 7330 xmlSetTreeDoc(list, ent->doc); |
6944 if (list->next == NULL) | 7331 if (list->next == NULL) |
6945 ent->last = list; | 7332 ent->last = list; |
6946 list = list->next; | 7333 list = list->next; |
6947 } | 7334 } |
6948 } | 7335 } |
6949 } else { | 7336 } else { |
6950 xmlFreeNodeList(list); | 7337 xmlFreeNodeList(list); |
6951 list = NULL; | 7338 list = NULL; |
6952 } | 7339 } |
6953 } else if ((ret != XML_ERR_OK) && | 7340 } else if ((ret != XML_ERR_OK) && |
6954 (ret != XML_WAR_UNDECLARED_ENTITY)) { | 7341 (ret != XML_WAR_UNDECLARED_ENTITY)) { |
6955 xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, | 7342 xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, |
6956 "Entity '%s' failed to parse\n", ent->name); | 7343 "Entity '%s' failed to parse\n", ent->name); |
| 7344 xmlParserEntityCheck(ctxt, 0, ent, 0); |
6957 } else if (list != NULL) { | 7345 } else if (list != NULL) { |
6958 xmlFreeNodeList(list); | 7346 xmlFreeNodeList(list); |
6959 list = NULL; | 7347 list = NULL; |
6960 } | 7348 } |
6961 if (ent->checked == 0) | 7349 if (ent->checked == 0) |
6962 » ent->checked = 1; | 7350 » ent->checked = 2; |
6963 } else if (ent->checked != 1) { | 7351 } else if (ent->checked != 1) { |
6964 » ctxt->nbentities += ent->checked; | 7352 » ctxt->nbentities += ent->checked / 2; |
6965 } | 7353 } |
6966 | 7354 |
6967 /* | 7355 /* |
6968 * Now that the entity content has been gathered | 7356 * Now that the entity content has been gathered |
6969 * provide it to the application, this can take different forms based | 7357 * provide it to the application, this can take different forms based |
6970 * on the parsing modes. | 7358 * on the parsing modes. |
6971 */ | 7359 */ |
6972 if (ent->children == NULL) { | 7360 if (ent->children == NULL) { |
6973 /* | 7361 /* |
6974 * Probably running in SAX mode and the callbacks don't | 7362 * Probably running in SAX mode and the callbacks don't |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7045 * and, if it's NULL, we copy in whatever was in the entity. | 7433 * and, if it's NULL, we copy in whatever was in the entity. |
7046 * If it's not NULL we leave it alone. This is somewhat of a | 7434 * If it's not NULL we leave it alone. This is somewhat of a |
7047 * hack - maybe we should have further tests to determine | 7435 * hack - maybe we should have further tests to determine |
7048 * what to do. | 7436 * what to do. |
7049 */ | 7437 */ |
7050 if ((ctxt->node != NULL) && (ent->children != NULL)) { | 7438 if ((ctxt->node != NULL) && (ent->children != NULL)) { |
7051 /* | 7439 /* |
7052 * Seems we are generating the DOM content, do | 7440 * Seems we are generating the DOM content, do |
7053 * a simple tree copy for all references except the first | 7441 * a simple tree copy for all references except the first |
7054 * In the first occurrence list contains the replacement. | 7442 * In the first occurrence list contains the replacement. |
7055 * progressive == 2 means we are operating on the Reader | |
7056 * and since nodes are discarded we must copy all the time. | |
7057 */ | 7443 */ |
7058 if (((list == NULL) && (ent->owner == 0)) || | 7444 if (((list == NULL) && (ent->owner == 0)) || |
7059 (ctxt->parseMode == XML_PARSE_READER)) { | 7445 (ctxt->parseMode == XML_PARSE_READER)) { |
7060 xmlNodePtr nw = NULL, cur, firstChild = NULL; | 7446 xmlNodePtr nw = NULL, cur, firstChild = NULL; |
7061 | 7447 |
7062 /* | 7448 /* |
| 7449 * We are copying here, make sure there is no abuse |
| 7450 */ |
| 7451 ctxt->sizeentcopy += ent->length + 5; |
| 7452 if (xmlParserEntityCheck(ctxt, 0, ent, ctxt->sizeentcopy)) |
| 7453 return; |
| 7454 |
| 7455 /* |
7063 * when operating on a reader, the entities definitions | 7456 * when operating on a reader, the entities definitions |
7064 * are always owning the entities subtree. | 7457 * are always owning the entities subtree. |
7065 if (ctxt->parseMode == XML_PARSE_READER) | 7458 if (ctxt->parseMode == XML_PARSE_READER) |
7066 ent->owner = 1; | 7459 ent->owner = 1; |
7067 */ | 7460 */ |
7068 | 7461 |
7069 cur = ent->children; | 7462 cur = ent->children; |
7070 while (cur != NULL) { | 7463 while (cur != NULL) { |
7071 nw = xmlDocCopyNode(cur, ctxt->myDoc, 1); | 7464 nw = xmlDocCopyNode(cur, ctxt->myDoc, 1); |
7072 if (nw != NULL) { | 7465 if (nw != NULL) { |
(...skipping 16 matching lines...) Expand all Loading... |
7089 nw->extra = 1; | 7482 nw->extra = 1; |
7090 | 7483 |
7091 break; | 7484 break; |
7092 } | 7485 } |
7093 cur = cur->next; | 7486 cur = cur->next; |
7094 } | 7487 } |
7095 #ifdef LIBXML_LEGACY_ENABLED | 7488 #ifdef LIBXML_LEGACY_ENABLED |
7096 if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) | 7489 if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY) |
7097 xmlAddEntityReference(ent, firstChild, nw); | 7490 xmlAddEntityReference(ent, firstChild, nw); |
7098 #endif /* LIBXML_LEGACY_ENABLED */ | 7491 #endif /* LIBXML_LEGACY_ENABLED */ |
7099 » } else if (list == NULL) { | 7492 » } else if ((list == NULL) || (ctxt->inputNr > 0)) { |
7100 xmlNodePtr nw = NULL, cur, next, last, | 7493 xmlNodePtr nw = NULL, cur, next, last, |
7101 firstChild = NULL; | 7494 firstChild = NULL; |
| 7495 |
| 7496 /* |
| 7497 * We are copying here, make sure there is no abuse |
| 7498 */ |
| 7499 ctxt->sizeentcopy += ent->length + 5; |
| 7500 if (xmlParserEntityCheck(ctxt, 0, ent, ctxt->sizeentcopy)) |
| 7501 return; |
| 7502 |
7102 /* | 7503 /* |
7103 * Copy the entity child list and make it the new | 7504 * Copy the entity child list and make it the new |
7104 * entity child list. The goal is to make sure any | 7505 * entity child list. The goal is to make sure any |
7105 * ID or REF referenced will be the one from the | 7506 * ID or REF referenced will be the one from the |
7106 * document content and not the entity copy. | 7507 * document content and not the entity copy. |
7107 */ | 7508 */ |
7108 cur = ent->children; | 7509 cur = ent->children; |
7109 ent->children = NULL; | 7510 ent->children = NULL; |
7110 last = ent->last; | 7511 last = ent->last; |
7111 ent->last = NULL; | 7512 ent->last = NULL; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7208 "xmlParseEntityRef: no name\n"); | 7609 "xmlParseEntityRef: no name\n"); |
7209 return(NULL); | 7610 return(NULL); |
7210 } | 7611 } |
7211 if (RAW != ';') { | 7612 if (RAW != ';') { |
7212 xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL); | 7613 xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL); |
7213 return(NULL); | 7614 return(NULL); |
7214 } | 7615 } |
7215 NEXT; | 7616 NEXT; |
7216 | 7617 |
7217 /* | 7618 /* |
7218 * Predefined entites override any extra definition | 7619 * Predefined entities override any extra definition |
7219 */ | 7620 */ |
7220 if ((ctxt->options & XML_PARSE_OLDSAX) == 0) { | 7621 if ((ctxt->options & XML_PARSE_OLDSAX) == 0) { |
7221 ent = xmlGetPredefinedEntity(name); | 7622 ent = xmlGetPredefinedEntity(name); |
7222 if (ent != NULL) | 7623 if (ent != NULL) |
7223 return(ent); | 7624 return(ent); |
7224 } | 7625 } |
7225 | 7626 |
7226 /* | 7627 /* |
7227 * Increate the number of entity references parsed | 7628 * Increase the number of entity references parsed |
7228 */ | 7629 */ |
7229 ctxt->nbentities++; | 7630 ctxt->nbentities++; |
7230 | 7631 |
7231 /* | 7632 /* |
7232 * Ask first SAX for entity resolution, otherwise try the | 7633 * Ask first SAX for entity resolution, otherwise try the |
7233 * entities which may have stored in the parser context. | 7634 * entities which may have stored in the parser context. |
7234 */ | 7635 */ |
7235 if (ctxt->sax != NULL) { | 7636 if (ctxt->sax != NULL) { |
7236 if (ctxt->sax->getEntity != NULL) | 7637 if (ctxt->sax->getEntity != NULL) |
7237 ent = ctxt->sax->getEntity(ctxt->userData, name); | 7638 ent = ctxt->sax->getEntity(ctxt->userData, name); |
7238 » if ((ctxt->wellFormed == 1 ) && (ent == NULL) && | 7639 » if ((ctxt->wellFormed == 1 ) && (ent == NULL) && |
7239 (ctxt->options & XML_PARSE_OLDSAX)) | 7640 (ctxt->options & XML_PARSE_OLDSAX)) |
7240 ent = xmlGetPredefinedEntity(name); | 7641 ent = xmlGetPredefinedEntity(name); |
7241 if ((ctxt->wellFormed == 1 ) && (ent == NULL) && | 7642 if ((ctxt->wellFormed == 1 ) && (ent == NULL) && |
7242 (ctxt->userData==ctxt)) { | 7643 (ctxt->userData==ctxt)) { |
7243 ent = xmlSAX2GetEntity(ctxt, name); | 7644 ent = xmlSAX2GetEntity(ctxt, name); |
7244 } | 7645 } |
7245 } | 7646 } |
7246 if (ctxt->instate == XML_PARSER_EOF) | 7647 if (ctxt->instate == XML_PARSER_EOF) |
7247 return(NULL); | 7648 return(NULL); |
7248 /* | 7649 /* |
(...skipping 25 matching lines...) Expand all Loading... |
7274 "Entity '%s' not defined\n", name); | 7675 "Entity '%s' not defined\n", name); |
7275 } else { | 7676 } else { |
7276 xmlErrMsgStr(ctxt, XML_WAR_UNDECLARED_ENTITY, | 7677 xmlErrMsgStr(ctxt, XML_WAR_UNDECLARED_ENTITY, |
7277 "Entity '%s' not defined\n", name); | 7678 "Entity '%s' not defined\n", name); |
7278 if ((ctxt->inSubset == 0) && | 7679 if ((ctxt->inSubset == 0) && |
7279 (ctxt->sax != NULL) && | 7680 (ctxt->sax != NULL) && |
7280 (ctxt->sax->reference != NULL)) { | 7681 (ctxt->sax->reference != NULL)) { |
7281 ctxt->sax->reference(ctxt->userData, name); | 7682 ctxt->sax->reference(ctxt->userData, name); |
7282 } | 7683 } |
7283 } | 7684 } |
| 7685 xmlParserEntityCheck(ctxt, 0, ent, 0); |
7284 ctxt->valid = 0; | 7686 ctxt->valid = 0; |
7285 } | 7687 } |
7286 | 7688 |
7287 /* | 7689 /* |
7288 * [ WFC: Parsed Entity ] | 7690 * [ WFC: Parsed Entity ] |
7289 * An entity reference must not contain the name of an | 7691 * An entity reference must not contain the name of an |
7290 * unparsed entity | 7692 * unparsed entity |
7291 */ | 7693 */ |
7292 else if (ent->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { | 7694 else if (ent->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { |
7293 xmlFatalErrMsgStr(ctxt, XML_ERR_UNPARSED_ENTITY, | 7695 xmlFatalErrMsgStr(ctxt, XML_ERR_UNPARSED_ENTITY, |
7294 "Entity reference to unparsed entity %s\n", name); | 7696 "Entity reference to unparsed entity %s\n", name); |
7295 } | 7697 } |
7296 | 7698 |
7297 /* | 7699 /* |
7298 * [ WFC: No External Entity References ] | 7700 * [ WFC: No External Entity References ] |
7299 * Attribute values cannot contain direct or indirect | 7701 * Attribute values cannot contain direct or indirect |
7300 * entity references to external entities. | 7702 * entity references to external entities. |
7301 */ | 7703 */ |
7302 else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && | 7704 else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && |
7303 (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) { | 7705 (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) { |
7304 xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_EXTERNAL, | 7706 xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_EXTERNAL, |
7305 "Attribute references external entity '%s'\n", name); | 7707 "Attribute references external entity '%s'\n", name); |
7306 } | 7708 } |
7307 /* | 7709 /* |
7308 * [ WFC: No < in Attribute Values ] | 7710 * [ WFC: No < in Attribute Values ] |
7309 * The replacement text of any entity referred to directly or | 7711 * The replacement text of any entity referred to directly or |
7310 * indirectly in an attribute value (other than "<") must | 7712 * indirectly in an attribute value (other than "<") must |
7311 * not contain a <. | 7713 * not contain a <. |
7312 */ | 7714 */ |
7313 else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && | 7715 else if ((ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE) && |
7314 » (ent != NULL) && (ent->content != NULL) && | 7716 » (ent != NULL) && |
7315 » (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && | 7717 » (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY)) { |
7316 » (xmlStrchr(ent->content, '<'))) { | 7718 » if (((ent->checked & 1) || (ent->checked == 0)) && |
7317 » xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, | 7719 » (ent->content != NULL) && (xmlStrchr(ent->content, '<'))) { |
7318 "'<' in entity '%s' is not allowed in attributes values\n", name); | 7720 » xmlFatalErrMsgStr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, |
| 7721 » "'<' in entity '%s' is not allowed in attributes values\n", name); |
| 7722 } |
7319 } | 7723 } |
7320 | 7724 |
7321 /* | 7725 /* |
7322 * Internal check, no parameter entities here ... | 7726 * Internal check, no parameter entities here ... |
7323 */ | 7727 */ |
7324 else { | 7728 else { |
7325 switch (ent->etype) { | 7729 switch (ent->etype) { |
7326 case XML_INTERNAL_PARAMETER_ENTITY: | 7730 case XML_INTERNAL_PARAMETER_ENTITY: |
7327 case XML_EXTERNAL_PARAMETER_ENTITY: | 7731 case XML_EXTERNAL_PARAMETER_ENTITY: |
7328 xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER, | 7732 xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_IS_PARAMETER, |
7329 "Attempt to reference the parameter entity '%s'\n", | 7733 "Attempt to reference the parameter entity '%s'\n", |
7330 name); | 7734 name); |
7331 break; | 7735 break; |
7332 default: | 7736 default: |
7333 break; | 7737 break; |
7334 } | 7738 } |
7335 } | 7739 } |
7336 | 7740 |
7337 /* | 7741 /* |
7338 * [ WFC: No Recursion ] | 7742 * [ WFC: No Recursion ] |
7339 * A parsed entity must not contain a recursive reference | 7743 * A parsed entity must not contain a recursive reference |
7340 * to itself, either directly or indirectly. | 7744 * to itself, either directly or indirectly. |
7341 * Done somewhere else | 7745 * Done somewhere else |
7342 */ | 7746 */ |
7343 return(ent); | 7747 return(ent); |
7344 } | 7748 } |
7345 | 7749 |
7346 /** | 7750 /** |
7347 * xmlParseStringEntityRef: | 7751 * xmlParseStringEntityRef: |
7348 * @ctxt: an XML parser context | 7752 * @ctxt: an XML parser context |
7349 * @str: a pointer to an index in the string | 7753 * @str: a pointer to an index in the string |
7350 * | 7754 * |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7399 if (*ptr != ';') { | 7803 if (*ptr != ';') { |
7400 xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL); | 7804 xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL); |
7401 xmlFree(name); | 7805 xmlFree(name); |
7402 *str = ptr; | 7806 *str = ptr; |
7403 return(NULL); | 7807 return(NULL); |
7404 } | 7808 } |
7405 ptr++; | 7809 ptr++; |
7406 | 7810 |
7407 | 7811 |
7408 /* | 7812 /* |
7409 * Predefined entites override any extra definition | 7813 * Predefined entities override any extra definition |
7410 */ | 7814 */ |
7411 if ((ctxt->options & XML_PARSE_OLDSAX) == 0) { | 7815 if ((ctxt->options & XML_PARSE_OLDSAX) == 0) { |
7412 ent = xmlGetPredefinedEntity(name); | 7816 ent = xmlGetPredefinedEntity(name); |
7413 if (ent != NULL) { | 7817 if (ent != NULL) { |
7414 xmlFree(name); | 7818 xmlFree(name); |
7415 *str = ptr; | 7819 *str = ptr; |
7416 return(ent); | 7820 return(ent); |
7417 } | 7821 } |
7418 } | 7822 } |
7419 | 7823 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7452 * The declaration of a parameter entity must precede any | 7856 * The declaration of a parameter entity must precede any |
7453 * reference to it. | 7857 * reference to it. |
7454 * Similarly, the declaration of a general entity must | 7858 * Similarly, the declaration of a general entity must |
7455 * precede any reference to it which appears in a default | 7859 * precede any reference to it which appears in a default |
7456 * value in an attribute-list declaration. Note that if | 7860 * value in an attribute-list declaration. Note that if |
7457 * entities are declared in the external subset or in | 7861 * entities are declared in the external subset or in |
7458 * external parameter entities, a non-validating processor | 7862 * external parameter entities, a non-validating processor |
7459 * is not obligated to read and process their declarations; | 7863 * is not obligated to read and process their declarations; |
7460 * for such documents, the rule that an entity must be | 7864 * for such documents, the rule that an entity must be |
7461 * declared is a well-formedness constraint only if | 7865 * declared is a well-formedness constraint only if |
7462 * standalone='yes'. | 7866 * standalone='yes'. |
7463 */ | 7867 */ |
7464 if (ent == NULL) { | 7868 if (ent == NULL) { |
7465 if ((ctxt->standalone == 1) || | 7869 if ((ctxt->standalone == 1) || |
7466 ((ctxt->hasExternalSubset == 0) && | 7870 ((ctxt->hasExternalSubset == 0) && |
7467 (ctxt->hasPErefs == 0))) { | 7871 (ctxt->hasPErefs == 0))) { |
7468 xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, | 7872 xmlFatalErrMsgStr(ctxt, XML_ERR_UNDECLARED_ENTITY, |
7469 "Entity '%s' not defined\n", name); | 7873 "Entity '%s' not defined\n", name); |
7470 } else { | 7874 } else { |
7471 xmlErrMsgStr(ctxt, XML_WAR_UNDECLARED_ENTITY, | 7875 xmlErrMsgStr(ctxt, XML_WAR_UNDECLARED_ENTITY, |
7472 "Entity '%s' not defined\n", | 7876 "Entity '%s' not defined\n", |
7473 name); | 7877 name); |
7474 } | 7878 } |
| 7879 xmlParserEntityCheck(ctxt, 0, ent, 0); |
7475 /* TODO ? check regressions ctxt->valid = 0; */ | 7880 /* TODO ? check regressions ctxt->valid = 0; */ |
7476 } | 7881 } |
7477 | 7882 |
7478 /* | 7883 /* |
7479 * [ WFC: Parsed Entity ] | 7884 * [ WFC: Parsed Entity ] |
7480 * An entity reference must not contain the name of an | 7885 * An entity reference must not contain the name of an |
7481 * unparsed entity | 7886 * unparsed entity |
7482 */ | 7887 */ |
7483 else if (ent->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { | 7888 else if (ent->etype == XML_EXTERNAL_GENERAL_UNPARSED_ENTITY) { |
7484 xmlFatalErrMsgStr(ctxt, XML_ERR_UNPARSED_ENTITY, | 7889 xmlFatalErrMsgStr(ctxt, XML_ERR_UNPARSED_ENTITY, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7543 * @ctxt: an XML parser context | 7948 * @ctxt: an XML parser context |
7544 * | 7949 * |
7545 * parse PEReference declarations | 7950 * parse PEReference declarations |
7546 * The entity content is handled directly by pushing it's content as | 7951 * The entity content is handled directly by pushing it's content as |
7547 * a new input stream. | 7952 * a new input stream. |
7548 * | 7953 * |
7549 * [69] PEReference ::= '%' Name ';' | 7954 * [69] PEReference ::= '%' Name ';' |
7550 * | 7955 * |
7551 * [ WFC: No Recursion ] | 7956 * [ WFC: No Recursion ] |
7552 * A parsed entity must not contain a recursive | 7957 * A parsed entity must not contain a recursive |
7553 * reference to itself, either directly or indirectly. | 7958 * reference to itself, either directly or indirectly. |
7554 * | 7959 * |
7555 * [ WFC: Entity Declared ] | 7960 * [ WFC: Entity Declared ] |
7556 * In a document without any DTD, a document with only an internal DTD | 7961 * In a document without any DTD, a document with only an internal DTD |
7557 * subset which contains no parameter entity references, or a document | 7962 * subset which contains no parameter entity references, or a document |
7558 * with "standalone='yes'", ... ... The declaration of a parameter | 7963 * with "standalone='yes'", ... ... The declaration of a parameter |
7559 * entity must precede any reference to it... | 7964 * entity must precede any reference to it... |
7560 * | 7965 * |
7561 * [ VC: Entity Declared ] | 7966 * [ VC: Entity Declared ] |
7562 * In a document with an external subset or external parameter entities | 7967 * In a document with an external subset or external parameter entities |
7563 * with "standalone='no'", ... ... The declaration of a parameter entity | 7968 * with "standalone='no'", ... ... The declaration of a parameter entity |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7624 * In a document with an external subset or external | 8029 * In a document with an external subset or external |
7625 * parameter entities with "standalone='no'", ... | 8030 * parameter entities with "standalone='no'", ... |
7626 * ... The declaration of a parameter entity must | 8031 * ... The declaration of a parameter entity must |
7627 * precede any reference to it... | 8032 * precede any reference to it... |
7628 */ | 8033 */ |
7629 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, | 8034 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, |
7630 "PEReference: %%%s; not found\n", | 8035 "PEReference: %%%s; not found\n", |
7631 name, NULL); | 8036 name, NULL); |
7632 ctxt->valid = 0; | 8037 ctxt->valid = 0; |
7633 } | 8038 } |
| 8039 xmlParserEntityCheck(ctxt, 0, NULL, 0); |
7634 } else { | 8040 } else { |
7635 /* | 8041 /* |
7636 * Internal checking in case the entity quest barfed | 8042 * Internal checking in case the entity quest barfed |
7637 */ | 8043 */ |
7638 if ((entity->etype != XML_INTERNAL_PARAMETER_ENTITY) && | 8044 if ((entity->etype != XML_INTERNAL_PARAMETER_ENTITY) && |
7639 (entity->etype != XML_EXTERNAL_PARAMETER_ENTITY)) { | 8045 (entity->etype != XML_EXTERNAL_PARAMETER_ENTITY)) { |
7640 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, | 8046 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, |
7641 "Internal: %%%s; is not a parameter entity\n", | 8047 "Internal: %%%s; is not a parameter entity\n", |
7642 name, NULL); | 8048 name, NULL); |
7643 } else if (ctxt->input->free != deallocblankswrapper) { | 8049 } else if (ctxt->input->free != deallocblankswrapper) { |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7725 if (xmlPushInput(ctxt, input) < 0) { | 8131 if (xmlPushInput(ctxt, input) < 0) { |
7726 xmlBufferFree(buf); | 8132 xmlBufferFree(buf); |
7727 return(-1); | 8133 return(-1); |
7728 } | 8134 } |
7729 | 8135 |
7730 GROW; | 8136 GROW; |
7731 c = CUR_CHAR(l); | 8137 c = CUR_CHAR(l); |
7732 while ((ctxt->input == input) && (ctxt->input->cur < ctxt->input->end) && | 8138 while ((ctxt->input == input) && (ctxt->input->cur < ctxt->input->end) && |
7733 (IS_CHAR(c))) { | 8139 (IS_CHAR(c))) { |
7734 xmlBufferAdd(buf, ctxt->input->cur, l); | 8140 xmlBufferAdd(buf, ctxt->input->cur, l); |
7735 » if (count++ > 100) { | 8141 » if (count++ > XML_PARSER_CHUNK_SIZE) { |
7736 count = 0; | 8142 count = 0; |
7737 GROW; | 8143 GROW; |
7738 if (ctxt->instate == XML_PARSER_EOF) { | 8144 if (ctxt->instate == XML_PARSER_EOF) { |
7739 xmlBufferFree(buf); | 8145 xmlBufferFree(buf); |
7740 return(-1); | 8146 return(-1); |
7741 } | 8147 } |
7742 } | 8148 } |
7743 NEXTL(l); | 8149 NEXTL(l); |
7744 c = CUR_CHAR(l); | 8150 c = CUR_CHAR(l); |
| 8151 if (c == 0) { |
| 8152 count = 0; |
| 8153 GROW; |
| 8154 if (ctxt->instate == XML_PARSER_EOF) { |
| 8155 xmlBufferFree(buf); |
| 8156 return(-1); |
| 8157 } |
| 8158 c = CUR_CHAR(l); |
| 8159 } |
7745 } | 8160 } |
7746 | 8161 |
7747 if ((ctxt->input == input) && (ctxt->input->cur >= ctxt->input->end)) { | 8162 if ((ctxt->input == input) && (ctxt->input->cur >= ctxt->input->end)) { |
7748 xmlPopInput(ctxt); | 8163 xmlPopInput(ctxt); |
7749 } else if (!IS_CHAR(c)) { | 8164 } else if (!IS_CHAR(c)) { |
7750 xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, | 8165 xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR, |
7751 "xmlLoadEntityContent: invalid char value %d\n", | 8166 "xmlLoadEntityContent: invalid char value %d\n", |
7752 c); | 8167 c); |
7753 xmlBufferFree(buf); | 8168 xmlBufferFree(buf); |
7754 return(-1); | 8169 return(-1); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7854 * In a document with an external subset or external | 8269 * In a document with an external subset or external |
7855 * parameter entities with "standalone='no'", ... | 8270 * parameter entities with "standalone='no'", ... |
7856 * ... The declaration of a parameter entity must | 8271 * ... The declaration of a parameter entity must |
7857 * precede any reference to it... | 8272 * precede any reference to it... |
7858 */ | 8273 */ |
7859 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, | 8274 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, |
7860 "PEReference: %%%s; not found\n", | 8275 "PEReference: %%%s; not found\n", |
7861 name, NULL); | 8276 name, NULL); |
7862 ctxt->valid = 0; | 8277 ctxt->valid = 0; |
7863 } | 8278 } |
| 8279 xmlParserEntityCheck(ctxt, 0, NULL, 0); |
7864 } else { | 8280 } else { |
7865 /* | 8281 /* |
7866 * Internal checking in case the entity quest barfed | 8282 * Internal checking in case the entity quest barfed |
7867 */ | 8283 */ |
7868 if ((entity->etype != XML_INTERNAL_PARAMETER_ENTITY) && | 8284 if ((entity->etype != XML_INTERNAL_PARAMETER_ENTITY) && |
7869 (entity->etype != XML_EXTERNAL_PARAMETER_ENTITY)) { | 8285 (entity->etype != XML_EXTERNAL_PARAMETER_ENTITY)) { |
7870 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, | 8286 xmlWarningMsg(ctxt, XML_WAR_UNDECLARED_ENTITY, |
7871 "%%%s; is not a parameter entity\n", | 8287 "%%%s; is not a parameter entity\n", |
7872 name, NULL); | 8288 name, NULL); |
7873 } | 8289 } |
7874 } | 8290 } |
7875 ctxt->hasPErefs = 1; | 8291 ctxt->hasPErefs = 1; |
7876 xmlFree(name); | 8292 xmlFree(name); |
7877 *str = ptr; | 8293 *str = ptr; |
7878 return(entity); | 8294 return(entity); |
7879 } | 8295 } |
7880 | 8296 |
7881 /** | 8297 /** |
7882 * xmlParseDocTypeDecl: | 8298 * xmlParseDocTypeDecl: |
7883 * @ctxt: an XML parser context | 8299 * @ctxt: an XML parser context |
7884 * | 8300 * |
7885 * parse a DOCTYPE declaration | 8301 * parse a DOCTYPE declaration |
7886 * | 8302 * |
7887 * [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? | 8303 * [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? |
7888 * ('[' (markupdecl | PEReference | S)* ']' S?)? '>' | 8304 * ('[' (markupdecl | PEReference | S)* ']' S?)? '>' |
7889 * | 8305 * |
7890 * [ VC: Root Element Type ] | 8306 * [ VC: Root Element Type ] |
7891 * The Name in the document type declaration must match the element | 8307 * The Name in the document type declaration must match the element |
7892 * type of the root element. | 8308 * type of the root element. |
7893 */ | 8309 */ |
7894 | 8310 |
7895 void | 8311 void |
7896 xmlParseDocTypeDecl(xmlParserCtxtPtr ctxt) { | 8312 xmlParseDocTypeDecl(xmlParserCtxtPtr ctxt) { |
7897 const xmlChar *name = NULL; | 8313 const xmlChar *name = NULL; |
7898 xmlChar *ExternalID = NULL; | 8314 xmlChar *ExternalID = NULL; |
7899 xmlChar *URI = NULL; | 8315 xmlChar *URI = NULL; |
7900 | 8316 |
7901 /* | 8317 /* |
7902 * We know that '<!DOCTYPE' has been detected. | 8318 * We know that '<!DOCTYPE' has been detected. |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7966 | 8382 |
7967 static void | 8383 static void |
7968 xmlParseInternalSubset(xmlParserCtxtPtr ctxt) { | 8384 xmlParseInternalSubset(xmlParserCtxtPtr ctxt) { |
7969 /* | 8385 /* |
7970 * Is there any DTD definition ? | 8386 * Is there any DTD definition ? |
7971 */ | 8387 */ |
7972 if (RAW == '[') { | 8388 if (RAW == '[') { |
7973 ctxt->instate = XML_PARSER_DTD; | 8389 ctxt->instate = XML_PARSER_DTD; |
7974 NEXT; | 8390 NEXT; |
7975 /* | 8391 /* |
7976 » * Parse the succession of Markup declarations and | 8392 » * Parse the succession of Markup declarations and |
7977 * PEReferences. | 8393 * PEReferences. |
7978 * Subsequence (markupdecl | PEReference | S)* | 8394 * Subsequence (markupdecl | PEReference | S)* |
7979 */ | 8395 */ |
7980 while ((RAW != ']') && (ctxt->instate != XML_PARSER_EOF)) { | 8396 while ((RAW != ']') && (ctxt->instate != XML_PARSER_EOF)) { |
7981 const xmlChar *check = CUR_PTR; | 8397 const xmlChar *check = CUR_PTR; |
7982 unsigned int cons = ctxt->input->consumed; | 8398 unsigned int cons = ctxt->input->consumed; |
7983 | 8399 |
7984 SKIP_BLANKS; | 8400 SKIP_BLANKS; |
7985 xmlParseMarkupDecl(ctxt); | 8401 xmlParseMarkupDecl(ctxt); |
7986 xmlParsePEReference(ctxt); | 8402 xmlParsePEReference(ctxt); |
7987 | 8403 |
7988 /* | 8404 /* |
7989 * Pop-up of finished entities. | 8405 * Pop-up of finished entities. |
7990 */ | 8406 */ |
7991 while ((RAW == 0) && (ctxt->inputNr > 1)) | 8407 while ((RAW == 0) && (ctxt->inputNr > 1)) |
7992 xmlPopInput(ctxt); | 8408 xmlPopInput(ctxt); |
7993 | 8409 |
7994 if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { | 8410 if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { |
7995 xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, | 8411 xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, |
7996 "xmlParseInternalSubset: error detected in Markup declaration\n"); | 8412 "xmlParseInternalSubset: error detected in Markup declaration\n"); |
7997 break; | 8413 break; |
7998 } | 8414 } |
7999 } | 8415 } |
8000 » if (RAW == ']') { | 8416 » if (RAW == ']') { |
8001 NEXT; | 8417 NEXT; |
8002 SKIP_BLANKS; | 8418 SKIP_BLANKS; |
8003 } | 8419 } |
8004 } | 8420 } |
8005 | 8421 |
8006 /* | 8422 /* |
8007 * We should be at the end of the DOCTYPE declaration. | 8423 * We should be at the end of the DOCTYPE declaration. |
8008 */ | 8424 */ |
8009 if (RAW != '>') { | 8425 if (RAW != '>') { |
8010 xmlFatalErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, NULL); | 8426 xmlFatalErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, NULL); |
(...skipping 10 matching lines...) Expand all Loading... |
8021 * parse an attribute | 8437 * parse an attribute |
8022 * | 8438 * |
8023 * [41] Attribute ::= Name Eq AttValue | 8439 * [41] Attribute ::= Name Eq AttValue |
8024 * | 8440 * |
8025 * [ WFC: No External Entity References ] | 8441 * [ WFC: No External Entity References ] |
8026 * Attribute values cannot contain direct or indirect entity references | 8442 * Attribute values cannot contain direct or indirect entity references |
8027 * to external entities. | 8443 * to external entities. |
8028 * | 8444 * |
8029 * [ WFC: No < in Attribute Values ] | 8445 * [ WFC: No < in Attribute Values ] |
8030 * The replacement text of any entity referred to directly or indirectly in | 8446 * The replacement text of any entity referred to directly or indirectly in |
8031 * an attribute value (other than "<") must not contain a <. | 8447 * an attribute value (other than "<") must not contain a <. |
8032 * | 8448 * |
8033 * [ VC: Attribute Value Type ] | 8449 * [ VC: Attribute Value Type ] |
8034 * The attribute must have been declared; the value must be of the type | 8450 * The attribute must have been declared; the value must be of the type |
8035 * declared for it. | 8451 * declared for it. |
8036 * | 8452 * |
8037 * [25] Eq ::= S? '=' S? | 8453 * [25] Eq ::= S? '=' S? |
8038 * | 8454 * |
8039 * With namespace: | 8455 * With namespace: |
8040 * | 8456 * |
8041 * [NS 11] Attribute ::= QName Eq AttValue | 8457 * [NS 11] Attribute ::= QName Eq AttValue |
8042 * | 8458 * |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8103 } | 8519 } |
8104 } | 8520 } |
8105 | 8521 |
8106 *value = val; | 8522 *value = val; |
8107 return(name); | 8523 return(name); |
8108 } | 8524 } |
8109 | 8525 |
8110 /** | 8526 /** |
8111 * xmlParseStartTag: | 8527 * xmlParseStartTag: |
8112 * @ctxt: an XML parser context | 8528 * @ctxt: an XML parser context |
8113 * | 8529 * |
8114 * parse a start of tag either for rule element or | 8530 * parse a start of tag either for rule element or |
8115 * EmptyElement. In both case we don't parse the tag closing chars. | 8531 * EmptyElement. In both case we don't parse the tag closing chars. |
8116 * | 8532 * |
8117 * [40] STag ::= '<' Name (S Attribute)* S? '>' | 8533 * [40] STag ::= '<' Name (S Attribute)* S? '>' |
8118 * | 8534 * |
8119 * [ WFC: Unique Att Spec ] | 8535 * [ WFC: Unique Att Spec ] |
8120 * No attribute name may appear more than once in the same start-tag or | 8536 * No attribute name may appear more than once in the same start-tag or |
8121 * empty-element tag. | 8537 * empty-element tag. |
8122 * | 8538 * |
8123 * [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' | 8539 * [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' |
8124 * | 8540 * |
8125 * [ WFC: Unique Att Spec ] | 8541 * [ WFC: Unique Att Spec ] |
8126 * No attribute name may appear more than once in the same start-tag or | 8542 * No attribute name may appear more than once in the same start-tag or |
8127 * empty-element tag. | 8543 * empty-element tag. |
8128 * | 8544 * |
8129 * With namespace: | 8545 * With namespace: |
8130 * | 8546 * |
8131 * [NS 8] STag ::= '<' QName (S Attribute)* S? '>' | 8547 * [NS 8] STag ::= '<' QName (S Attribute)* S? '>' |
8132 * | 8548 * |
8133 * [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>' | 8549 * [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>' |
8134 * | 8550 * |
8135 * Returns the element name parsed | 8551 * Returns the element name parsed |
8136 */ | 8552 */ |
8137 | 8553 |
(...skipping 18 matching lines...) Expand all Loading... |
8156 } | 8572 } |
8157 | 8573 |
8158 /* | 8574 /* |
8159 * Now parse the attributes, it ends up with the ending | 8575 * Now parse the attributes, it ends up with the ending |
8160 * | 8576 * |
8161 * (S Attribute)* S? | 8577 * (S Attribute)* S? |
8162 */ | 8578 */ |
8163 SKIP_BLANKS; | 8579 SKIP_BLANKS; |
8164 GROW; | 8580 GROW; |
8165 | 8581 |
8166 while (((RAW != '>') && | 8582 while (((RAW != '>') && |
8167 ((RAW != '/') || (NXT(1) != '>')) && | 8583 ((RAW != '/') || (NXT(1) != '>')) && |
8168 (IS_BYTE_CHAR(RAW))) && (ctxt->instate != XML_PARSER_EOF)) { | 8584 (IS_BYTE_CHAR(RAW))) && (ctxt->instate != XML_PARSER_EOF)) { |
8169 const xmlChar *q = CUR_PTR; | 8585 const xmlChar *q = CUR_PTR; |
8170 unsigned int cons = ctxt->input->consumed; | 8586 unsigned int cons = ctxt->input->consumed; |
8171 | 8587 |
8172 attname = xmlParseAttribute(ctxt, &attvalue); | 8588 attname = xmlParseAttribute(ctxt, &attvalue); |
8173 if ((attname != NULL) && (attvalue != NULL)) { | 8589 if ((attname != NULL) && (attvalue != NULL)) { |
8174 /* | 8590 /* |
8175 * [ WFC: Unique Att Spec ] | 8591 * [ WFC: Unique Att Spec ] |
8176 * No attribute name may appear more than once in the same | 8592 * No attribute name may appear more than once in the same |
8177 » * start-tag or empty-element tag. | 8593 » * start-tag or empty-element tag. |
8178 */ | 8594 */ |
8179 for (i = 0; i < nbatts;i += 2) { | 8595 for (i = 0; i < nbatts;i += 2) { |
8180 if (xmlStrEqual(atts[i], attname)) { | 8596 if (xmlStrEqual(atts[i], attname)) { |
8181 xmlErrAttributeDup(ctxt, NULL, attname); | 8597 xmlErrAttributeDup(ctxt, NULL, attname); |
8182 xmlFree(attvalue); | 8598 xmlFree(attvalue); |
8183 goto failed; | 8599 goto failed; |
8184 } | 8600 } |
8185 } | 8601 } |
8186 /* | 8602 /* |
8187 * Add the pair to atts | 8603 * Add the pair to atts |
(...skipping 28 matching lines...) Expand all Loading... |
8216 } | 8632 } |
8217 atts[nbatts++] = attname; | 8633 atts[nbatts++] = attname; |
8218 atts[nbatts++] = attvalue; | 8634 atts[nbatts++] = attvalue; |
8219 atts[nbatts] = NULL; | 8635 atts[nbatts] = NULL; |
8220 atts[nbatts + 1] = NULL; | 8636 atts[nbatts + 1] = NULL; |
8221 } else { | 8637 } else { |
8222 if (attvalue != NULL) | 8638 if (attvalue != NULL) |
8223 xmlFree(attvalue); | 8639 xmlFree(attvalue); |
8224 } | 8640 } |
8225 | 8641 |
8226 failed: | 8642 failed: |
8227 | 8643 |
8228 GROW | 8644 GROW |
8229 if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) | 8645 if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) |
8230 break; | 8646 break; |
8231 if (!IS_BLANK_CH(RAW)) { | 8647 if (!IS_BLANK_CH(RAW)) { |
8232 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 8648 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
8233 "attributes construct error\n"); | 8649 "attributes construct error\n"); |
8234 } | 8650 } |
8235 SKIP_BLANKS; | 8651 SKIP_BLANKS; |
8236 if ((cons == ctxt->input->consumed) && (q == CUR_PTR) && | 8652 if ((cons == ctxt->input->consumed) && (q == CUR_PTR) && |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8298 GROW; | 8714 GROW; |
8299 SKIP_BLANKS; | 8715 SKIP_BLANKS; |
8300 if ((!IS_BYTE_CHAR(RAW)) || (RAW != '>')) { | 8716 if ((!IS_BYTE_CHAR(RAW)) || (RAW != '>')) { |
8301 xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); | 8717 xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); |
8302 } else | 8718 } else |
8303 NEXT1; | 8719 NEXT1; |
8304 | 8720 |
8305 /* | 8721 /* |
8306 * [ WFC: Element Type Match ] | 8722 * [ WFC: Element Type Match ] |
8307 * The Name in an element's end-tag must match the element type in the | 8723 * The Name in an element's end-tag must match the element type in the |
8308 * start-tag. | 8724 * start-tag. |
8309 * | 8725 * |
8310 */ | 8726 */ |
8311 if (name != (xmlChar*)1) { | 8727 if (name != (xmlChar*)1) { |
8312 if (name == NULL) name = BAD_CAST "unparseable"; | 8728 if (name == NULL) name = BAD_CAST "unparseable"; |
8313 xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_TAG_NAME_MISMATCH, | 8729 xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_TAG_NAME_MISMATCH, |
8314 "Opening and ending tag mismatch: %s line %d and %s\n", | 8730 "Opening and ending tag mismatch: %s line %d and %s\n", |
8315 ctxt->name, line, name); | 8731 ctxt->name, line, name); |
8316 } | 8732 } |
8317 | 8733 |
8318 /* | 8734 /* |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8394 xmlParseQName(xmlParserCtxtPtr ctxt, const xmlChar **prefix) { | 8810 xmlParseQName(xmlParserCtxtPtr ctxt, const xmlChar **prefix) { |
8395 const xmlChar *l, *p; | 8811 const xmlChar *l, *p; |
8396 | 8812 |
8397 GROW; | 8813 GROW; |
8398 | 8814 |
8399 l = xmlParseNCName(ctxt); | 8815 l = xmlParseNCName(ctxt); |
8400 if (l == NULL) { | 8816 if (l == NULL) { |
8401 if (CUR == ':') { | 8817 if (CUR == ':') { |
8402 l = xmlParseName(ctxt); | 8818 l = xmlParseName(ctxt); |
8403 if (l != NULL) { | 8819 if (l != NULL) { |
8404 » xmlNsErr(ctxt, XML_NS_ERR_QNAME, | 8820 » xmlNsErr(ctxt, XML_NS_ERR_QNAME, |
8405 "Failed to parse QName '%s'\n", l, NULL, NULL); | 8821 "Failed to parse QName '%s'\n", l, NULL, NULL); |
8406 *prefix = NULL; | 8822 *prefix = NULL; |
8407 return(l); | 8823 return(l); |
8408 } | 8824 } |
8409 } | 8825 } |
8410 return(NULL); | 8826 return(NULL); |
8411 } | 8827 } |
8412 if (CUR == ':') { | 8828 if (CUR == ':') { |
8413 NEXT; | 8829 NEXT; |
8414 p = l; | 8830 p = l; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8477 const xmlChar *ret; | 8893 const xmlChar *ret; |
8478 const xmlChar *prefix2; | 8894 const xmlChar *prefix2; |
8479 | 8895 |
8480 if (prefix == NULL) return(xmlParseNameAndCompare(ctxt, name)); | 8896 if (prefix == NULL) return(xmlParseNameAndCompare(ctxt, name)); |
8481 | 8897 |
8482 GROW; | 8898 GROW; |
8483 in = ctxt->input->cur; | 8899 in = ctxt->input->cur; |
8484 | 8900 |
8485 cmp = prefix; | 8901 cmp = prefix; |
8486 while (*in != 0 && *in == *cmp) { | 8902 while (*in != 0 && *in == *cmp) { |
8487 » ++in; | 8903 » ++in; |
8488 ++cmp; | 8904 ++cmp; |
8489 } | 8905 } |
8490 if ((*cmp == 0) && (*in == ':')) { | 8906 if ((*cmp == 0) && (*in == ':')) { |
8491 in++; | 8907 in++; |
8492 cmp = name; | 8908 cmp = name; |
8493 while (*in != 0 && *in == *cmp) { | 8909 while (*in != 0 && *in == *cmp) { |
8494 ++in; | 8910 ++in; |
8495 ++cmp; | 8911 ++cmp; |
8496 } | 8912 } |
8497 if (*cmp == 0 && (*in == '>' || IS_BLANK_CH (*in))) { | 8913 if (*cmp == 0 && (*in == '>' || IS_BLANK_CH (*in))) { |
(...skipping 17 matching lines...) Expand all Loading... |
8515 * @len: attribute len result | 8931 * @len: attribute len result |
8516 * @alloc: whether the attribute was reallocated as a new string | 8932 * @alloc: whether the attribute was reallocated as a new string |
8517 * @normalize: if 1 then further non-CDATA normalization must be done | 8933 * @normalize: if 1 then further non-CDATA normalization must be done |
8518 * | 8934 * |
8519 * parse a value for an attribute. | 8935 * parse a value for an attribute. |
8520 * NOTE: if no normalization is needed, the routine will return pointers | 8936 * NOTE: if no normalization is needed, the routine will return pointers |
8521 * directly from the data buffer. | 8937 * directly from the data buffer. |
8522 * | 8938 * |
8523 * 3.3.3 Attribute-Value Normalization: | 8939 * 3.3.3 Attribute-Value Normalization: |
8524 * Before the value of an attribute is passed to the application or | 8940 * Before the value of an attribute is passed to the application or |
8525 * checked for validity, the XML processor must normalize it as follows: | 8941 * checked for validity, the XML processor must normalize it as follows: |
8526 * - a character reference is processed by appending the referenced | 8942 * - a character reference is processed by appending the referenced |
8527 * character to the attribute value | 8943 * character to the attribute value |
8528 * - an entity reference is processed by recursively processing the | 8944 * - an entity reference is processed by recursively processing the |
8529 * replacement text of the entity | 8945 * replacement text of the entity |
8530 * - a whitespace character (#x20, #xD, #xA, #x9) is processed by | 8946 * - a whitespace character (#x20, #xD, #xA, #x9) is processed by |
8531 * appending #x20 to the normalized value, except that only a single | 8947 * appending #x20 to the normalized value, except that only a single |
8532 * #x20 is appended for a "#xD#xA" sequence that is part of an external | 8948 * #x20 is appended for a "#xD#xA" sequence that is part of an external |
8533 * parsed entity or the literal entity value of an internal parsed entity | 8949 * parsed entity or the literal entity value of an internal parsed entity |
8534 * - other characters are processed by appending them to the normalized value | 8950 * - other characters are processed by appending them to the normalized value |
8535 * If the declared value is not CDATA, then the XML processor must further | 8951 * If the declared value is not CDATA, then the XML processor must further |
8536 * process the normalized attribute value by discarding any leading and | 8952 * process the normalized attribute value by discarding any leading and |
8537 * trailing space (#x20) characters, and by replacing sequences of space | 8953 * trailing space (#x20) characters, and by replacing sequences of space |
8538 * (#x20) characters by a single space (#x20) character. | 8954 * (#x20) characters by a single space (#x20) character. |
8539 * All attributes for which no declaration has been read should be treated | 8955 * All attributes for which no declaration has been read should be treated |
8540 * by a non-validating parser as if declared CDATA. | 8956 * by a non-validating parser as if declared CDATA. |
8541 * | 8957 * |
8542 * Returns the AttValue parsed or NULL. The value has to be freed by the | 8958 * Returns the AttValue parsed or NULL. The value has to be freed by the |
8543 * caller if it was copied, this can be detected by val[*len] == 0. | 8959 * caller if it was copied, this can be detected by val[*len] == 0. |
8544 */ | 8960 */ |
8545 | 8961 |
8546 static xmlChar * | 8962 static xmlChar * |
8547 xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc, | 8963 xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc, |
8548 int normalize) | 8964 int normalize) |
8549 { | 8965 { |
8550 xmlChar limit = 0; | 8966 xmlChar limit = 0; |
8551 const xmlChar *in = NULL, *start, *end, *last; | 8967 const xmlChar *in = NULL, *start, *end, *last; |
8552 xmlChar *ret = NULL; | 8968 xmlChar *ret = NULL; |
| 8969 int line, col; |
8553 | 8970 |
8554 GROW; | 8971 GROW; |
8555 in = (xmlChar *) CUR_PTR; | 8972 in = (xmlChar *) CUR_PTR; |
| 8973 line = ctxt->input->line; |
| 8974 col = ctxt->input->col; |
8556 if (*in != '"' && *in != '\'') { | 8975 if (*in != '"' && *in != '\'') { |
8557 xmlFatalErr(ctxt, XML_ERR_ATTRIBUTE_NOT_STARTED, NULL); | 8976 xmlFatalErr(ctxt, XML_ERR_ATTRIBUTE_NOT_STARTED, NULL); |
8558 return (NULL); | 8977 return (NULL); |
8559 } | 8978 } |
8560 ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; | 8979 ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE; |
8561 | 8980 |
8562 /* | 8981 /* |
8563 * try to handle in this routine the most common case where no | 8982 * try to handle in this routine the most common case where no |
8564 * allocation of a new string is required and where content is | 8983 * allocation of a new string is required and where content is |
8565 * pure ASCII. | 8984 * pure ASCII. |
8566 */ | 8985 */ |
8567 limit = *in++; | 8986 limit = *in++; |
| 8987 col++; |
8568 end = ctxt->input->end; | 8988 end = ctxt->input->end; |
8569 start = in; | 8989 start = in; |
8570 if (in >= end) { | 8990 if (in >= end) { |
8571 const xmlChar *oldbase = ctxt->input->base; | 8991 const xmlChar *oldbase = ctxt->input->base; |
8572 GROW; | 8992 GROW; |
8573 if (oldbase != ctxt->input->base) { | 8993 if (oldbase != ctxt->input->base) { |
8574 long delta = ctxt->input->base - oldbase; | 8994 long delta = ctxt->input->base - oldbase; |
8575 start = start + delta; | 8995 start = start + delta; |
8576 in = in + delta; | 8996 in = in + delta; |
8577 } | 8997 } |
8578 end = ctxt->input->end; | 8998 end = ctxt->input->end; |
8579 } | 8999 } |
8580 if (normalize) { | 9000 if (normalize) { |
8581 /* | 9001 /* |
8582 * Skip any leading spaces | 9002 * Skip any leading spaces |
8583 */ | 9003 */ |
8584 » while ((in < end) && (*in != limit) && | 9004 » while ((in < end) && (*in != limit) && |
8585 ((*in == 0x20) || (*in == 0x9) || | 9005 ((*in == 0x20) || (*in == 0x9) || |
8586 (*in == 0xA) || (*in == 0xD))) { | 9006 (*in == 0xA) || (*in == 0xD))) { |
| 9007 if (*in == 0xA) { |
| 9008 line++; col = 1; |
| 9009 } else { |
| 9010 col++; |
| 9011 } |
8587 in++; | 9012 in++; |
8588 start = in; | 9013 start = in; |
8589 if (in >= end) { | 9014 if (in >= end) { |
8590 const xmlChar *oldbase = ctxt->input->base; | 9015 const xmlChar *oldbase = ctxt->input->base; |
8591 GROW; | 9016 GROW; |
8592 if (ctxt->instate == XML_PARSER_EOF) | 9017 if (ctxt->instate == XML_PARSER_EOF) |
8593 return(NULL); | 9018 return(NULL); |
8594 if (oldbase != ctxt->input->base) { | 9019 if (oldbase != ctxt->input->base) { |
8595 long delta = ctxt->input->base - oldbase; | 9020 long delta = ctxt->input->base - oldbase; |
8596 start = start + delta; | 9021 start = start + delta; |
8597 in = in + delta; | 9022 in = in + delta; |
8598 } | 9023 } |
8599 end = ctxt->input->end; | 9024 end = ctxt->input->end; |
| 9025 if (((in - start) > XML_MAX_TEXT_LENGTH) && |
| 9026 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 9027 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, |
| 9028 "AttValue length too long\n"); |
| 9029 return(NULL); |
| 9030 } |
8600 } | 9031 } |
8601 } | 9032 } |
8602 while ((in < end) && (*in != limit) && (*in >= 0x20) && | 9033 while ((in < end) && (*in != limit) && (*in >= 0x20) && |
8603 (*in <= 0x7f) && (*in != '&') && (*in != '<')) { | 9034 (*in <= 0x7f) && (*in != '&') && (*in != '<')) { |
| 9035 col++; |
8604 if ((*in++ == 0x20) && (*in == 0x20)) break; | 9036 if ((*in++ == 0x20) && (*in == 0x20)) break; |
8605 if (in >= end) { | 9037 if (in >= end) { |
8606 const xmlChar *oldbase = ctxt->input->base; | 9038 const xmlChar *oldbase = ctxt->input->base; |
8607 GROW; | 9039 GROW; |
8608 if (ctxt->instate == XML_PARSER_EOF) | 9040 if (ctxt->instate == XML_PARSER_EOF) |
8609 return(NULL); | 9041 return(NULL); |
8610 if (oldbase != ctxt->input->base) { | 9042 if (oldbase != ctxt->input->base) { |
8611 long delta = ctxt->input->base - oldbase; | 9043 long delta = ctxt->input->base - oldbase; |
8612 start = start + delta; | 9044 start = start + delta; |
8613 in = in + delta; | 9045 in = in + delta; |
8614 } | 9046 } |
8615 end = ctxt->input->end; | 9047 end = ctxt->input->end; |
| 9048 if (((in - start) > XML_MAX_TEXT_LENGTH) && |
| 9049 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 9050 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, |
| 9051 "AttValue length too long\n"); |
| 9052 return(NULL); |
| 9053 } |
8616 } | 9054 } |
8617 } | 9055 } |
8618 last = in; | 9056 last = in; |
8619 /* | 9057 /* |
8620 * skip the trailing blanks | 9058 * skip the trailing blanks |
8621 */ | 9059 */ |
8622 while ((last[-1] == 0x20) && (last > start)) last--; | 9060 while ((last[-1] == 0x20) && (last > start)) last--; |
8623 » while ((in < end) && (*in != limit) && | 9061 » while ((in < end) && (*in != limit) && |
8624 ((*in == 0x20) || (*in == 0x9) || | 9062 ((*in == 0x20) || (*in == 0x9) || |
8625 (*in == 0xA) || (*in == 0xD))) { | 9063 (*in == 0xA) || (*in == 0xD))) { |
| 9064 if (*in == 0xA) { |
| 9065 line++, col = 1; |
| 9066 } else { |
| 9067 col++; |
| 9068 } |
8626 in++; | 9069 in++; |
8627 if (in >= end) { | 9070 if (in >= end) { |
8628 const xmlChar *oldbase = ctxt->input->base; | 9071 const xmlChar *oldbase = ctxt->input->base; |
8629 GROW; | 9072 GROW; |
8630 if (ctxt->instate == XML_PARSER_EOF) | 9073 if (ctxt->instate == XML_PARSER_EOF) |
8631 return(NULL); | 9074 return(NULL); |
8632 if (oldbase != ctxt->input->base) { | 9075 if (oldbase != ctxt->input->base) { |
8633 long delta = ctxt->input->base - oldbase; | 9076 long delta = ctxt->input->base - oldbase; |
8634 start = start + delta; | 9077 start = start + delta; |
8635 in = in + delta; | 9078 in = in + delta; |
8636 last = last + delta; | 9079 last = last + delta; |
8637 } | 9080 } |
8638 end = ctxt->input->end; | 9081 end = ctxt->input->end; |
| 9082 if (((in - start) > XML_MAX_TEXT_LENGTH) && |
| 9083 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 9084 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, |
| 9085 "AttValue length too long\n"); |
| 9086 return(NULL); |
| 9087 } |
8639 } | 9088 } |
8640 } | 9089 } |
| 9090 if (((in - start) > XML_MAX_TEXT_LENGTH) && |
| 9091 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 9092 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, |
| 9093 "AttValue length too long\n"); |
| 9094 return(NULL); |
| 9095 } |
8641 if (*in != limit) goto need_complex; | 9096 if (*in != limit) goto need_complex; |
8642 } else { | 9097 } else { |
8643 while ((in < end) && (*in != limit) && (*in >= 0x20) && | 9098 while ((in < end) && (*in != limit) && (*in >= 0x20) && |
8644 (*in <= 0x7f) && (*in != '&') && (*in != '<')) { | 9099 (*in <= 0x7f) && (*in != '&') && (*in != '<')) { |
8645 in++; | 9100 in++; |
| 9101 col++; |
8646 if (in >= end) { | 9102 if (in >= end) { |
8647 const xmlChar *oldbase = ctxt->input->base; | 9103 const xmlChar *oldbase = ctxt->input->base; |
8648 GROW; | 9104 GROW; |
8649 if (ctxt->instate == XML_PARSER_EOF) | 9105 if (ctxt->instate == XML_PARSER_EOF) |
8650 return(NULL); | 9106 return(NULL); |
8651 if (oldbase != ctxt->input->base) { | 9107 if (oldbase != ctxt->input->base) { |
8652 long delta = ctxt->input->base - oldbase; | 9108 long delta = ctxt->input->base - oldbase; |
8653 start = start + delta; | 9109 start = start + delta; |
8654 in = in + delta; | 9110 in = in + delta; |
8655 } | 9111 } |
8656 end = ctxt->input->end; | 9112 end = ctxt->input->end; |
| 9113 if (((in - start) > XML_MAX_TEXT_LENGTH) && |
| 9114 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 9115 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, |
| 9116 "AttValue length too long\n"); |
| 9117 return(NULL); |
| 9118 } |
8657 } | 9119 } |
8658 } | 9120 } |
8659 last = in; | 9121 last = in; |
| 9122 if (((in - start) > XML_MAX_TEXT_LENGTH) && |
| 9123 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 9124 xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED, |
| 9125 "AttValue length too long\n"); |
| 9126 return(NULL); |
| 9127 } |
8660 if (*in != limit) goto need_complex; | 9128 if (*in != limit) goto need_complex; |
8661 } | 9129 } |
8662 in++; | 9130 in++; |
| 9131 col++; |
8663 if (len != NULL) { | 9132 if (len != NULL) { |
8664 *len = last - start; | 9133 *len = last - start; |
8665 ret = (xmlChar *) start; | 9134 ret = (xmlChar *) start; |
8666 } else { | 9135 } else { |
8667 if (alloc) *alloc = 1; | 9136 if (alloc) *alloc = 1; |
8668 ret = xmlStrndup(start, last - start); | 9137 ret = xmlStrndup(start, last - start); |
8669 } | 9138 } |
8670 CUR_PTR = in; | 9139 CUR_PTR = in; |
| 9140 ctxt->input->line = line; |
| 9141 ctxt->input->col = col; |
8671 if (alloc) *alloc = 0; | 9142 if (alloc) *alloc = 0; |
8672 return ret; | 9143 return ret; |
8673 need_complex: | 9144 need_complex: |
8674 if (alloc) *alloc = 1; | 9145 if (alloc) *alloc = 1; |
8675 return xmlParseAttValueComplex(ctxt, len, normalize); | 9146 return xmlParseAttValueComplex(ctxt, len, normalize); |
8676 } | 9147 } |
8677 | 9148 |
8678 /** | 9149 /** |
8679 * xmlParseAttribute2: | 9150 * xmlParseAttribute2: |
8680 * @ctxt: an XML parser context | 9151 * @ctxt: an XML parser context |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8788 xmlFree(internal_val); | 9259 xmlFree(internal_val); |
8789 } | 9260 } |
8790 } | 9261 } |
8791 | 9262 |
8792 *value = val; | 9263 *value = val; |
8793 return (name); | 9264 return (name); |
8794 } | 9265 } |
8795 /** | 9266 /** |
8796 * xmlParseStartTag2: | 9267 * xmlParseStartTag2: |
8797 * @ctxt: an XML parser context | 9268 * @ctxt: an XML parser context |
8798 * | 9269 * |
8799 * parse a start of tag either for rule element or | 9270 * parse a start of tag either for rule element or |
8800 * EmptyElement. In both case we don't parse the tag closing chars. | 9271 * EmptyElement. In both case we don't parse the tag closing chars. |
8801 * This routine is called when running SAX2 parsing | 9272 * This routine is called when running SAX2 parsing |
8802 * | 9273 * |
8803 * [40] STag ::= '<' Name (S Attribute)* S? '>' | 9274 * [40] STag ::= '<' Name (S Attribute)* S? '>' |
8804 * | 9275 * |
8805 * [ WFC: Unique Att Spec ] | 9276 * [ WFC: Unique Att Spec ] |
8806 * No attribute name may appear more than once in the same start-tag or | 9277 * No attribute name may appear more than once in the same start-tag or |
8807 * empty-element tag. | 9278 * empty-element tag. |
8808 * | 9279 * |
8809 * [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' | 9280 * [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' |
8810 * | 9281 * |
8811 * [ WFC: Unique Att Spec ] | 9282 * [ WFC: Unique Att Spec ] |
8812 * No attribute name may appear more than once in the same start-tag or | 9283 * No attribute name may appear more than once in the same start-tag or |
8813 * empty-element tag. | 9284 * empty-element tag. |
8814 * | 9285 * |
8815 * With namespace: | 9286 * With namespace: |
8816 * | 9287 * |
8817 * [NS 8] STag ::= '<' QName (S Attribute)* S? '>' | 9288 * [NS 8] STag ::= '<' QName (S Attribute)* S? '>' |
8818 * | 9289 * |
8819 * [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>' | 9290 * [NS 10] EmptyElement ::= '<' QName (S Attribute)* S? '/>' |
8820 * | 9291 * |
8821 * Returns the element name parsed | 9292 * Returns the element name parsed |
8822 */ | 9293 */ |
8823 | 9294 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8872 | 9343 |
8873 /* | 9344 /* |
8874 * Now parse the attributes, it ends up with the ending | 9345 * Now parse the attributes, it ends up with the ending |
8875 * | 9346 * |
8876 * (S Attribute)* S? | 9347 * (S Attribute)* S? |
8877 */ | 9348 */ |
8878 SKIP_BLANKS; | 9349 SKIP_BLANKS; |
8879 GROW; | 9350 GROW; |
8880 if (ctxt->input->base != base) goto base_changed; | 9351 if (ctxt->input->base != base) goto base_changed; |
8881 | 9352 |
8882 while (((RAW != '>') && | 9353 while (((RAW != '>') && |
8883 ((RAW != '/') || (NXT(1) != '>')) && | 9354 ((RAW != '/') || (NXT(1) != '>')) && |
8884 (IS_BYTE_CHAR(RAW))) && (ctxt->instate != XML_PARSER_EOF)) { | 9355 (IS_BYTE_CHAR(RAW))) && (ctxt->instate != XML_PARSER_EOF)) { |
8885 const xmlChar *q = CUR_PTR; | 9356 const xmlChar *q = CUR_PTR; |
8886 unsigned int cons = ctxt->input->consumed; | 9357 unsigned int cons = ctxt->input->consumed; |
8887 int len = -1, alloc = 0; | 9358 int len = -1, alloc = 0; |
8888 | 9359 |
8889 attname = xmlParseAttribute2(ctxt, prefix, localname, | 9360 attname = xmlParseAttribute2(ctxt, prefix, localname, |
8890 &aprefix, &attvalue, &len, &alloc); | 9361 &aprefix, &attvalue, &len, &alloc); |
8891 if (ctxt->input->base != base) { | 9362 if (ctxt->input->base != base) { |
8892 if ((attvalue != NULL) && (alloc != 0)) | 9363 if ((attvalue != NULL) && (alloc != 0)) |
8893 xmlFree(attvalue); | 9364 xmlFree(attvalue); |
8894 attvalue = NULL; | 9365 attvalue = NULL; |
8895 goto base_changed; | 9366 goto base_changed; |
8896 } | 9367 } |
8897 if ((attname != NULL) && (attvalue != NULL)) { | 9368 if ((attname != NULL) && (attvalue != NULL)) { |
8898 if (len < 0) len = xmlStrlen(attvalue); | 9369 if (len < 0) len = xmlStrlen(attvalue); |
8899 if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) { | 9370 if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) { |
8900 const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); | 9371 const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); |
8901 xmlURIPtr uri; | 9372 xmlURIPtr uri; |
8902 | 9373 |
| 9374 if (URL == NULL) { |
| 9375 xmlErrMemory(ctxt, "dictionary allocation failure"); |
| 9376 if ((attvalue != NULL) && (alloc != 0)) |
| 9377 xmlFree(attvalue); |
| 9378 return(NULL); |
| 9379 } |
8903 if (*URL != 0) { | 9380 if (*URL != 0) { |
8904 uri = xmlParseURI((const char *) URL); | 9381 uri = xmlParseURI((const char *) URL); |
8905 if (uri == NULL) { | 9382 if (uri == NULL) { |
8906 xmlNsErr(ctxt, XML_WAR_NS_URI, | 9383 xmlNsErr(ctxt, XML_WAR_NS_URI, |
8907 "xmlns: '%s' is not a valid URI\n", | 9384 "xmlns: '%s' is not a valid URI\n", |
8908 URL, NULL, NULL); | 9385 URL, NULL, NULL); |
8909 } else { | 9386 } else { |
8910 if (uri->scheme == NULL) { | 9387 if (uri->scheme == NULL) { |
8911 xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, | 9388 xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, |
8912 "xmlns: URI %s is not absolute\n", | 9389 "xmlns: URI %s is not absolute\n", |
(...skipping 23 matching lines...) Expand all Loading... |
8936 */ | 9413 */ |
8937 for (j = 1;j <= nbNs;j++) | 9414 for (j = 1;j <= nbNs;j++) |
8938 if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) | 9415 if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) |
8939 break; | 9416 break; |
8940 if (j <= nbNs) | 9417 if (j <= nbNs) |
8941 xmlErrAttributeDup(ctxt, NULL, attname); | 9418 xmlErrAttributeDup(ctxt, NULL, attname); |
8942 else | 9419 else |
8943 if (nsPush(ctxt, NULL, URL) > 0) nbNs++; | 9420 if (nsPush(ctxt, NULL, URL) > 0) nbNs++; |
8944 skip_default_ns: | 9421 skip_default_ns: |
8945 if (alloc != 0) xmlFree(attvalue); | 9422 if (alloc != 0) xmlFree(attvalue); |
| 9423 if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) |
| 9424 break; |
| 9425 if (!IS_BLANK_CH(RAW)) { |
| 9426 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
| 9427 "attributes construct error\n"); |
| 9428 break; |
| 9429 } |
8946 SKIP_BLANKS; | 9430 SKIP_BLANKS; |
8947 continue; | 9431 continue; |
8948 } | 9432 } |
8949 if (aprefix == ctxt->str_xmlns) { | 9433 if (aprefix == ctxt->str_xmlns) { |
8950 const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); | 9434 const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); |
8951 xmlURIPtr uri; | 9435 xmlURIPtr uri; |
8952 | 9436 |
8953 if (attname == ctxt->str_xml) { | 9437 if (attname == ctxt->str_xml) { |
8954 if (URL != ctxt->str_xml_ns) { | 9438 if (URL != ctxt->str_xml_ns) { |
8955 xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | 9439 xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9009 */ | 9493 */ |
9010 for (j = 1;j <= nbNs;j++) | 9494 for (j = 1;j <= nbNs;j++) |
9011 if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) | 9495 if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) |
9012 break; | 9496 break; |
9013 if (j <= nbNs) | 9497 if (j <= nbNs) |
9014 xmlErrAttributeDup(ctxt, aprefix, attname); | 9498 xmlErrAttributeDup(ctxt, aprefix, attname); |
9015 else | 9499 else |
9016 if (nsPush(ctxt, attname, URL) > 0) nbNs++; | 9500 if (nsPush(ctxt, attname, URL) > 0) nbNs++; |
9017 skip_ns: | 9501 skip_ns: |
9018 if (alloc != 0) xmlFree(attvalue); | 9502 if (alloc != 0) xmlFree(attvalue); |
| 9503 if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) |
| 9504 break; |
| 9505 if (!IS_BLANK_CH(RAW)) { |
| 9506 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
| 9507 "attributes construct error\n"); |
| 9508 break; |
| 9509 } |
9019 SKIP_BLANKS; | 9510 SKIP_BLANKS; |
9020 if (ctxt->input->base != base) goto base_changed; | 9511 if (ctxt->input->base != base) goto base_changed; |
9021 continue; | 9512 continue; |
9022 } | 9513 } |
9023 | 9514 |
9024 /* | 9515 /* |
9025 * Add the pair to atts | 9516 * Add the pair to atts |
9026 */ | 9517 */ |
9027 if ((atts == NULL) || (nbatts + 5 > maxatts)) { | 9518 if ((atts == NULL) || (nbatts + 5 > maxatts)) { |
9028 if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) { | 9519 if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9138 atts[nbatts++] = attname; | 9629 atts[nbatts++] = attname; |
9139 atts[nbatts++] = aprefix; | 9630 atts[nbatts++] = aprefix; |
9140 if (aprefix == NULL) | 9631 if (aprefix == NULL) |
9141 atts[nbatts++] = NULL; | 9632 atts[nbatts++] = NULL; |
9142 else | 9633 else |
9143 atts[nbatts++] = xmlGetNamespace(ctxt, aprefix); | 9634 atts[nbatts++] = xmlGetNamespace(ctxt, aprefix); |
9144 atts[nbatts++] = defaults->values[5 * i + 2]; | 9635 atts[nbatts++] = defaults->values[5 * i + 2]; |
9145 atts[nbatts++] = defaults->values[5 * i + 3]; | 9636 atts[nbatts++] = defaults->values[5 * i + 3]; |
9146 if ((ctxt->standalone == 1) && | 9637 if ((ctxt->standalone == 1) && |
9147 (defaults->values[5 * i + 4] != NULL)) { | 9638 (defaults->values[5 * i + 4] != NULL)) { |
9148 » » » xmlValidityError(ctxt, XML_DTD_STANDALONE_DEFAULTED, | 9639 » » » xmlValidityError(ctxt, XML_DTD_STANDALONE_DEFAULTED, |
9149 "standalone: attribute %s on %s defaulted from external subset\n", | 9640 "standalone: attribute %s on %s defaulted from external subset\n", |
9150 attname, localname); | 9641 attname, localname); |
9151 } | 9642 } |
9152 nbdef++; | 9643 nbdef++; |
9153 } | 9644 } |
9154 } | 9645 } |
9155 } | 9646 } |
9156 } | 9647 } |
9157 | 9648 |
9158 /* | 9649 /* |
9159 * The attributes checkings | 9650 * The attributes checkings |
9160 */ | 9651 */ |
9161 for (i = 0; i < nbatts;i += 5) { | 9652 for (i = 0; i < nbatts;i += 5) { |
9162 /* | 9653 /* |
9163 * The default namespace does not apply to attribute names. | 9654 * The default namespace does not apply to attribute names. |
9164 */ | 9655 */ |
9165 if (atts[i + 1] != NULL) { | 9656 if (atts[i + 1] != NULL) { |
9166 nsname = xmlGetNamespace(ctxt, atts[i + 1]); | 9657 nsname = xmlGetNamespace(ctxt, atts[i + 1]); |
9167 if (nsname == NULL) { | 9658 if (nsname == NULL) { |
9168 xmlNsErr(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, | 9659 xmlNsErr(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE, |
9169 "Namespace prefix %s for %s on %s is not defined\n", | 9660 "Namespace prefix %s for %s on %s is not defined\n", |
9170 atts[i + 1], atts[i], localname); | 9661 atts[i + 1], atts[i], localname); |
9171 } | 9662 } |
9172 atts[i + 2] = nsname; | 9663 atts[i + 2] = nsname; |
9173 } else | 9664 } else |
9174 nsname = NULL; | 9665 nsname = NULL; |
9175 /* | 9666 /* |
9176 * [ WFC: Unique Att Spec ] | 9667 * [ WFC: Unique Att Spec ] |
9177 * No attribute name may appear more than once in the same | 9668 * No attribute name may appear more than once in the same |
9178 » * start-tag or empty-element tag. | 9669 » * start-tag or empty-element tag. |
9179 * As extended by the Namespace in XML REC. | 9670 * As extended by the Namespace in XML REC. |
9180 */ | 9671 */ |
9181 for (j = 0; j < i;j += 5) { | 9672 for (j = 0; j < i;j += 5) { |
9182 if (atts[i] == atts[j]) { | 9673 if (atts[i] == atts[j]) { |
9183 if (atts[i+1] == atts[j+1]) { | 9674 if (atts[i+1] == atts[j+1]) { |
9184 xmlErrAttributeDup(ctxt, atts[i+1], atts[i]); | 9675 xmlErrAttributeDup(ctxt, atts[i+1], atts[i]); |
9185 break; | 9676 break; |
9186 } | 9677 } |
9187 if ((nsname != NULL) && (atts[j + 2] == nsname)) { | 9678 if ((nsname != NULL) && (atts[j + 2] == nsname)) { |
9188 xmlNsErr(ctxt, XML_NS_ERR_ATTRIBUTE_REDEFINED, | 9679 xmlNsErr(ctxt, XML_NS_ERR_ATTRIBUTE_REDEFINED, |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9269 GROW; | 9760 GROW; |
9270 if ((RAW != '<') || (NXT(1) != '/')) { | 9761 if ((RAW != '<') || (NXT(1) != '/')) { |
9271 xmlFatalErr(ctxt, XML_ERR_LTSLASH_REQUIRED, NULL); | 9762 xmlFatalErr(ctxt, XML_ERR_LTSLASH_REQUIRED, NULL); |
9272 return; | 9763 return; |
9273 } | 9764 } |
9274 SKIP(2); | 9765 SKIP(2); |
9275 | 9766 |
9276 if ((tlen > 0) && (xmlStrncmp(ctxt->input->cur, ctxt->name, tlen) == 0)) { | 9767 if ((tlen > 0) && (xmlStrncmp(ctxt->input->cur, ctxt->name, tlen) == 0)) { |
9277 if (ctxt->input->cur[tlen] == '>') { | 9768 if (ctxt->input->cur[tlen] == '>') { |
9278 ctxt->input->cur += tlen + 1; | 9769 ctxt->input->cur += tlen + 1; |
| 9770 ctxt->input->col += tlen + 1; |
9279 goto done; | 9771 goto done; |
9280 } | 9772 } |
9281 ctxt->input->cur += tlen; | 9773 ctxt->input->cur += tlen; |
| 9774 ctxt->input->col += tlen; |
9282 name = (xmlChar*)1; | 9775 name = (xmlChar*)1; |
9283 } else { | 9776 } else { |
9284 if (prefix == NULL) | 9777 if (prefix == NULL) |
9285 name = xmlParseNameAndCompare(ctxt, ctxt->name); | 9778 name = xmlParseNameAndCompare(ctxt, ctxt->name); |
9286 else | 9779 else |
9287 name = xmlParseQNameAndCompare(ctxt, ctxt->name, prefix); | 9780 name = xmlParseQNameAndCompare(ctxt, ctxt->name, prefix); |
9288 } | 9781 } |
9289 | 9782 |
9290 /* | 9783 /* |
9291 * We should definitely be at the ending "S? '>'" part | 9784 * We should definitely be at the ending "S? '>'" part |
9292 */ | 9785 */ |
9293 GROW; | 9786 GROW; |
9294 if (ctxt->instate == XML_PARSER_EOF) | 9787 if (ctxt->instate == XML_PARSER_EOF) |
9295 return; | 9788 return; |
9296 SKIP_BLANKS; | 9789 SKIP_BLANKS; |
9297 if ((!IS_BYTE_CHAR(RAW)) || (RAW != '>')) { | 9790 if ((!IS_BYTE_CHAR(RAW)) || (RAW != '>')) { |
9298 xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); | 9791 xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL); |
9299 } else | 9792 } else |
9300 NEXT1; | 9793 NEXT1; |
9301 | 9794 |
9302 /* | 9795 /* |
9303 * [ WFC: Element Type Match ] | 9796 * [ WFC: Element Type Match ] |
9304 * The Name in an element's end-tag must match the element type in the | 9797 * The Name in an element's end-tag must match the element type in the |
9305 * start-tag. | 9798 * start-tag. |
9306 * | 9799 * |
9307 */ | 9800 */ |
9308 if (name != (xmlChar*)1) { | 9801 if (name != (xmlChar*)1) { |
9309 if (name == NULL) name = BAD_CAST "unparseable"; | 9802 if (name == NULL) name = BAD_CAST "unparseable"; |
9310 if ((line == 0) && (ctxt->node != NULL)) | 9803 if ((line == 0) && (ctxt->node != NULL)) |
9311 line = ctxt->node->line; | 9804 line = ctxt->node->line; |
9312 xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_TAG_NAME_MISMATCH, | 9805 xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_TAG_NAME_MISMATCH, |
9313 "Opening and ending tag mismatch: %s line %d and %s\n", | 9806 "Opening and ending tag mismatch: %s line %d and %s\n", |
9314 ctxt->name, line, name); | 9807 ctxt->name, line, name); |
9315 } | 9808 } |
9316 | 9809 |
9317 /* | 9810 /* |
9318 * SAX: End of Tag | 9811 * SAX: End of Tag |
9319 */ | 9812 */ |
9320 done: | 9813 done: |
9321 if ((ctxt->sax != NULL) && (ctxt->sax->endElementNs != NULL) && | 9814 if ((ctxt->sax != NULL) && (ctxt->sax->endElementNs != NULL) && |
9322 (!ctxt->disableSAX)) | 9815 (!ctxt->disableSAX)) |
9323 ctxt->sax->endElementNs(ctxt->userData, ctxt->name, prefix, URI); | 9816 ctxt->sax->endElementNs(ctxt->userData, ctxt->name, prefix, URI); |
9324 | 9817 |
9325 spacePop(ctxt); | 9818 spacePop(ctxt); |
9326 if (nsNr != 0) | 9819 if (nsNr != 0) |
9327 nsPop(ctxt, nsNr); | 9820 nsPop(ctxt, nsNr); |
9328 return; | 9821 return; |
9329 } | 9822 } |
9330 | 9823 |
9331 /** | 9824 /** |
9332 * xmlParseCDSect: | 9825 * xmlParseCDSect: |
9333 * @ctxt: an XML parser context | 9826 * @ctxt: an XML parser context |
9334 * | 9827 * |
9335 * Parse escaped pure raw content. | 9828 * Parse escaped pure raw content. |
9336 * | 9829 * |
9337 * [18] CDSect ::= CDStart CData CDEnd | 9830 * [18] CDSect ::= CDStart CData CDEnd |
9338 * | 9831 * |
9339 * [19] CDStart ::= '<![CDATA[' | 9832 * [19] CDStart ::= '<![CDATA[' |
9340 * | 9833 * |
9341 * [20] Data ::= (Char* - (Char* ']]>' Char*)) | 9834 * [20] Data ::= (Char* - (Char* ']]>' Char*)) |
9342 * | 9835 * |
9343 * [21] CDEnd ::= ']]>' | 9836 * [21] CDEnd ::= ']]>' |
9344 */ | 9837 */ |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9377 buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); | 9870 buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar)); |
9378 if (buf == NULL) { | 9871 if (buf == NULL) { |
9379 xmlErrMemory(ctxt, NULL); | 9872 xmlErrMemory(ctxt, NULL); |
9380 return; | 9873 return; |
9381 } | 9874 } |
9382 while (IS_CHAR(cur) && | 9875 while (IS_CHAR(cur) && |
9383 ((r != ']') || (s != ']') || (cur != '>'))) { | 9876 ((r != ']') || (s != ']') || (cur != '>'))) { |
9384 if (len + 5 >= size) { | 9877 if (len + 5 >= size) { |
9385 xmlChar *tmp; | 9878 xmlChar *tmp; |
9386 | 9879 |
9387 » size *= 2; | 9880 if ((size > XML_MAX_TEXT_LENGTH) && |
9388 » tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar)); | 9881 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 9882 xmlFatalErrMsgStr(ctxt, XML_ERR_CDATA_NOT_FINISHED, |
| 9883 "CData section too big found", NULL); |
| 9884 xmlFree (buf); |
| 9885 return; |
| 9886 } |
| 9887 » tmp = (xmlChar *) xmlRealloc(buf, size * 2 * sizeof(xmlChar)); |
9389 if (tmp == NULL) { | 9888 if (tmp == NULL) { |
9390 xmlFree(buf); | 9889 xmlFree(buf); |
9391 xmlErrMemory(ctxt, NULL); | 9890 xmlErrMemory(ctxt, NULL); |
9392 return; | 9891 return; |
9393 } | 9892 } |
9394 buf = tmp; | 9893 buf = tmp; |
| 9894 size *= 2; |
9395 } | 9895 } |
9396 COPY_BUF(rl,buf,len,r); | 9896 COPY_BUF(rl,buf,len,r); |
9397 r = s; | 9897 r = s; |
9398 rl = sl; | 9898 rl = sl; |
9399 s = cur; | 9899 s = cur; |
9400 sl = l; | 9900 sl = l; |
9401 count++; | 9901 count++; |
9402 if (count > 50) { | 9902 if (count > 50) { |
9403 GROW; | 9903 GROW; |
9404 if (ctxt->instate == XML_PARSER_EOF) { | 9904 if (ctxt->instate == XML_PARSER_EOF) { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9477 | 9977 |
9478 /* | 9978 /* |
9479 * Fourth case : a sub-element. | 9979 * Fourth case : a sub-element. |
9480 */ | 9980 */ |
9481 else if (*cur == '<') { | 9981 else if (*cur == '<') { |
9482 xmlParseElement(ctxt); | 9982 xmlParseElement(ctxt); |
9483 } | 9983 } |
9484 | 9984 |
9485 /* | 9985 /* |
9486 * Fifth case : a reference. If if has not been resolved, | 9986 * Fifth case : a reference. If if has not been resolved, |
9487 » * parsing returns it's Name, create the node | 9987 » * parsing returns it's Name, create the node |
9488 */ | 9988 */ |
9489 | 9989 |
9490 else if (*cur == '&') { | 9990 else if (*cur == '&') { |
9491 xmlParseReference(ctxt); | 9991 xmlParseReference(ctxt); |
9492 } | 9992 } |
9493 | 9993 |
9494 /* | 9994 /* |
9495 * Last case, text. Note that References are handled directly. | 9995 * Last case, text. Note that References are handled directly. |
9496 */ | 9996 */ |
9497 else { | 9997 else { |
(...skipping 20 matching lines...) Expand all Loading... |
9518 /** | 10018 /** |
9519 * xmlParseElement: | 10019 * xmlParseElement: |
9520 * @ctxt: an XML parser context | 10020 * @ctxt: an XML parser context |
9521 * | 10021 * |
9522 * parse an XML element, this is highly recursive | 10022 * parse an XML element, this is highly recursive |
9523 * | 10023 * |
9524 * [39] element ::= EmptyElemTag | STag content ETag | 10024 * [39] element ::= EmptyElemTag | STag content ETag |
9525 * | 10025 * |
9526 * [ WFC: Element Type Match ] | 10026 * [ WFC: Element Type Match ] |
9527 * The Name in an element's end-tag must match the element type in the | 10027 * The Name in an element's end-tag must match the element type in the |
9528 * start-tag. | 10028 * start-tag. |
9529 * | 10029 * |
9530 */ | 10030 */ |
9531 | 10031 |
9532 void | 10032 void |
9533 xmlParseElement(xmlParserCtxtPtr ctxt) { | 10033 xmlParseElement(xmlParserCtxtPtr ctxt) { |
9534 const xmlChar *name; | 10034 const xmlChar *name; |
9535 const xmlChar *prefix = NULL; | 10035 const xmlChar *prefix = NULL; |
9536 const xmlChar *URI = NULL; | 10036 const xmlChar *URI = NULL; |
9537 xmlParserNodeInfo node_info; | 10037 xmlParserNodeInfo node_info; |
9538 int line, tlen; | 10038 int line, tlen = 0; |
9539 xmlNodePtr ret; | 10039 xmlNodePtr ret; |
9540 int nsNr = ctxt->nsNr; | 10040 int nsNr = ctxt->nsNr; |
9541 | 10041 |
9542 if (((unsigned int) ctxt->nameNr > xmlParserMaxDepth) && | 10042 if (((unsigned int) ctxt->nameNr > xmlParserMaxDepth) && |
9543 ((ctxt->options & XML_PARSE_HUGE) == 0)) { | 10043 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
9544 xmlFatalErrMsgInt(ctxt, XML_ERR_INTERNAL_ERROR, | 10044 xmlFatalErrMsgInt(ctxt, XML_ERR_INTERNAL_ERROR, |
9545 "Excessive depth in document: %d use XML_PARSE_HUGE option\n", | 10045 "Excessive depth in document: %d use XML_PARSE_HUGE option\n", |
9546 xmlParserMaxDepth); | 10046 xmlParserMaxDepth); |
9547 ctxt->instate = XML_PARSER_EOF; | 10047 ctxt->instate = XML_PARSER_EOF; |
9548 return; | 10048 return; |
(...skipping 28 matching lines...) Expand all Loading... |
9577 spacePop(ctxt); | 10077 spacePop(ctxt); |
9578 return; | 10078 return; |
9579 } | 10079 } |
9580 namePush(ctxt, name); | 10080 namePush(ctxt, name); |
9581 ret = ctxt->node; | 10081 ret = ctxt->node; |
9582 | 10082 |
9583 #ifdef LIBXML_VALID_ENABLED | 10083 #ifdef LIBXML_VALID_ENABLED |
9584 /* | 10084 /* |
9585 * [ VC: Root Element Type ] | 10085 * [ VC: Root Element Type ] |
9586 * The Name in the document type declaration must match the element | 10086 * The Name in the document type declaration must match the element |
9587 * type of the root element. | 10087 * type of the root element. |
9588 */ | 10088 */ |
9589 if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && | 10089 if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && |
9590 ctxt->node && (ctxt->node == ctxt->myDoc->children)) | 10090 ctxt->node && (ctxt->node == ctxt->myDoc->children)) |
9591 ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); | 10091 ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); |
9592 #endif /* LIBXML_VALID_ENABLED */ | 10092 #endif /* LIBXML_VALID_ENABLED */ |
9593 | 10093 |
9594 /* | 10094 /* |
9595 * Check for an Empty Element. | 10095 * Check for an Empty Element. |
9596 */ | 10096 */ |
9597 if ((RAW == '/') && (NXT(1) == '>')) { | 10097 if ((RAW == '/') && (NXT(1) == '>')) { |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9860 buf[len] = 0; | 10360 buf[len] = 0; |
9861 } else { | 10361 } else { |
9862 xmlFatalErr(ctxt, XML_ERR_ENCODING_NAME, NULL); | 10362 xmlFatalErr(ctxt, XML_ERR_ENCODING_NAME, NULL); |
9863 } | 10363 } |
9864 return(buf); | 10364 return(buf); |
9865 } | 10365 } |
9866 | 10366 |
9867 /** | 10367 /** |
9868 * xmlParseEncodingDecl: | 10368 * xmlParseEncodingDecl: |
9869 * @ctxt: an XML parser context | 10369 * @ctxt: an XML parser context |
9870 * | 10370 * |
9871 * parse the XML encoding declaration | 10371 * parse the XML encoding declaration |
9872 * | 10372 * |
9873 * [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") | 10373 * [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") |
9874 * | 10374 * |
9875 * this setups the conversion filters. | 10375 * this setups the conversion filters. |
9876 * | 10376 * |
9877 * Returns the encoding value or NULL | 10377 * Returns the encoding value or NULL |
9878 */ | 10378 */ |
9879 | 10379 |
9880 const xmlChar * | 10380 const xmlChar * |
(...skipping 20 matching lines...) Expand all Loading... |
9901 } else if (RAW == '\''){ | 10401 } else if (RAW == '\''){ |
9902 NEXT; | 10402 NEXT; |
9903 encoding = xmlParseEncName(ctxt); | 10403 encoding = xmlParseEncName(ctxt); |
9904 if (RAW != '\'') { | 10404 if (RAW != '\'') { |
9905 xmlFatalErr(ctxt, XML_ERR_STRING_NOT_CLOSED, NULL); | 10405 xmlFatalErr(ctxt, XML_ERR_STRING_NOT_CLOSED, NULL); |
9906 } else | 10406 } else |
9907 NEXT; | 10407 NEXT; |
9908 } else { | 10408 } else { |
9909 xmlFatalErr(ctxt, XML_ERR_STRING_NOT_STARTED, NULL); | 10409 xmlFatalErr(ctxt, XML_ERR_STRING_NOT_STARTED, NULL); |
9910 } | 10410 } |
| 10411 |
| 10412 /* |
| 10413 * Non standard parsing, allowing the user to ignore encoding |
| 10414 */ |
| 10415 if (ctxt->options & XML_PARSE_IGNORE_ENC) { |
| 10416 xmlFree((xmlChar *) encoding); |
| 10417 return(NULL); |
| 10418 } |
| 10419 |
9911 /* | 10420 /* |
9912 * UTF-16 encoding stwich has already taken place at this stage, | 10421 * UTF-16 encoding stwich has already taken place at this stage, |
9913 * more over the little-endian/big-endian selection is already done | 10422 * more over the little-endian/big-endian selection is already done |
9914 */ | 10423 */ |
9915 if ((encoding != NULL) && | 10424 if ((encoding != NULL) && |
9916 ((!xmlStrcasecmp(encoding, BAD_CAST "UTF-16")) || | 10425 ((!xmlStrcasecmp(encoding, BAD_CAST "UTF-16")) || |
9917 (!xmlStrcasecmp(encoding, BAD_CAST "UTF16")))) { | 10426 (!xmlStrcasecmp(encoding, BAD_CAST "UTF16")))) { |
9918 /* | 10427 /* |
9919 * If no encoding was passed to the parser, that we are | 10428 * If no encoding was passed to the parser, that we are |
9920 » * using UTF-16 and no decoder is present i.e. the | 10429 » * using UTF-16 and no decoder is present i.e. the |
9921 * document is apparently UTF-8 compatible, then raise an | 10430 * document is apparently UTF-8 compatible, then raise an |
9922 * encoding mismatch fatal error | 10431 * encoding mismatch fatal error |
9923 */ | 10432 */ |
9924 if ((ctxt->encoding == NULL) && | 10433 if ((ctxt->encoding == NULL) && |
9925 (ctxt->input->buf != NULL) && | 10434 (ctxt->input->buf != NULL) && |
9926 (ctxt->input->buf->encoder == NULL)) { | 10435 (ctxt->input->buf->encoder == NULL)) { |
9927 xmlFatalErrMsg(ctxt, XML_ERR_INVALID_ENCODING, | 10436 xmlFatalErrMsg(ctxt, XML_ERR_INVALID_ENCODING, |
9928 "Document labelled UTF-16 but has UTF-8 content\n"); | 10437 "Document labelled UTF-16 but has UTF-8 content\n"); |
9929 } | 10438 } |
9930 if (ctxt->encoding != NULL) | 10439 if (ctxt->encoding != NULL) |
(...skipping 30 matching lines...) Expand all Loading... |
9961 return(encoding); | 10470 return(encoding); |
9962 } | 10471 } |
9963 | 10472 |
9964 /** | 10473 /** |
9965 * xmlParseSDDecl: | 10474 * xmlParseSDDecl: |
9966 * @ctxt: an XML parser context | 10475 * @ctxt: an XML parser context |
9967 * | 10476 * |
9968 * parse the XML standalone declaration | 10477 * parse the XML standalone declaration |
9969 * | 10478 * |
9970 * [32] SDDecl ::= S 'standalone' Eq | 10479 * [32] SDDecl ::= S 'standalone' Eq |
9971 * (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no')'"')) | 10480 * (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no')'"')) |
9972 * | 10481 * |
9973 * [ VC: Standalone Document Declaration ] | 10482 * [ VC: Standalone Document Declaration ] |
9974 * TODO The standalone document declaration must have the value "no" | 10483 * TODO The standalone document declaration must have the value "no" |
9975 * if any external markup declarations contain declarations of: | 10484 * if any external markup declarations contain declarations of: |
9976 * - attributes with default values, if elements to which these | 10485 * - attributes with default values, if elements to which these |
9977 * attributes apply appear in the document without specifications | 10486 * attributes apply appear in the document without specifications |
9978 * of values for these attributes, or | 10487 * of values for these attributes, or |
9979 * - entities (other than amp, lt, gt, apos, quot), if references | 10488 * - entities (other than amp, lt, gt, apos, quot), if references |
9980 * to those entities appear in the document, or | 10489 * to those entities appear in the document, or |
9981 * - attributes with values subject to normalization, where the | 10490 * - attributes with values subject to normalization, where the |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10041 } else { | 10550 } else { |
10042 xmlFatalErr(ctxt, XML_ERR_STRING_NOT_STARTED, NULL); | 10551 xmlFatalErr(ctxt, XML_ERR_STRING_NOT_STARTED, NULL); |
10043 } | 10552 } |
10044 } | 10553 } |
10045 return(standalone); | 10554 return(standalone); |
10046 } | 10555 } |
10047 | 10556 |
10048 /** | 10557 /** |
10049 * xmlParseXMLDecl: | 10558 * xmlParseXMLDecl: |
10050 * @ctxt: an XML parser context | 10559 * @ctxt: an XML parser context |
10051 * | 10560 * |
10052 * parse an XML declaration header | 10561 * parse an XML declaration header |
10053 * | 10562 * |
10054 * [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' | 10563 * [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' |
10055 */ | 10564 */ |
10056 | 10565 |
10057 void | 10566 void |
10058 xmlParseXMLDecl(xmlParserCtxtPtr ctxt) { | 10567 xmlParseXMLDecl(xmlParserCtxtPtr ctxt) { |
10059 xmlChar *version; | 10568 xmlChar *version; |
10060 | 10569 |
10061 /* | 10570 /* |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10155 } else { | 10664 } else { |
10156 xmlFatalErr(ctxt, XML_ERR_XMLDECL_NOT_FINISHED, NULL); | 10665 xmlFatalErr(ctxt, XML_ERR_XMLDECL_NOT_FINISHED, NULL); |
10157 MOVETO_ENDTAG(CUR_PTR); | 10666 MOVETO_ENDTAG(CUR_PTR); |
10158 NEXT; | 10667 NEXT; |
10159 } | 10668 } |
10160 } | 10669 } |
10161 | 10670 |
10162 /** | 10671 /** |
10163 * xmlParseMisc: | 10672 * xmlParseMisc: |
10164 * @ctxt: an XML parser context | 10673 * @ctxt: an XML parser context |
10165 * | 10674 * |
10166 * parse an XML Misc* optional field. | 10675 * parse an XML Misc* optional field. |
10167 * | 10676 * |
10168 * [27] Misc ::= Comment | PI | S | 10677 * [27] Misc ::= Comment | PI | S |
10169 */ | 10678 */ |
10170 | 10679 |
10171 void | 10680 void |
10172 xmlParseMisc(xmlParserCtxtPtr ctxt) { | 10681 xmlParseMisc(xmlParserCtxtPtr ctxt) { |
10173 while ((ctxt->instate != XML_PARSER_EOF) && | 10682 while ((ctxt->instate != XML_PARSER_EOF) && |
10174 (((RAW == '<') && (NXT(1) == '?')) || | 10683 (((RAW == '<') && (NXT(1) == '?')) || |
10175 (CMP4(CUR_PTR, '<', '!', '-', '-')) || | 10684 (CMP4(CUR_PTR, '<', '!', '-', '-')) || |
10176 IS_BLANK_CH(CUR))) { | 10685 IS_BLANK_CH(CUR))) { |
10177 if ((RAW == '<') && (NXT(1) == '?')) { | 10686 if ((RAW == '<') && (NXT(1) == '?')) { |
10178 xmlParsePI(ctxt); | 10687 xmlParsePI(ctxt); |
10179 } else if (IS_BLANK_CH(CUR)) { | 10688 } else if (IS_BLANK_CH(CUR)) { |
10180 NEXT; | 10689 NEXT; |
10181 } else | 10690 } else |
10182 xmlParseComment(ctxt); | 10691 xmlParseComment(ctxt); |
10183 } | 10692 } |
10184 } | 10693 } |
10185 | 10694 |
10186 /** | 10695 /** |
10187 * xmlParseDocument: | 10696 * xmlParseDocument: |
10188 * @ctxt: an XML parser context | 10697 * @ctxt: an XML parser context |
10189 * | 10698 * |
10190 * parse an XML document (and build a tree if using the standard SAX | 10699 * parse an XML document (and build a tree if using the standard SAX |
10191 * interface). | 10700 * interface). |
10192 * | 10701 * |
10193 * [1] document ::= prolog element Misc* | 10702 * [1] document ::= prolog element Misc* |
10194 * | 10703 * |
10195 * [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? | 10704 * [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? |
10196 * | 10705 * |
10197 * Returns 0, -1 in case of error. the parser context is augmented | 10706 * Returns 0, -1 in case of error. the parser context is augmented |
10198 * as a result of the parsing. | 10707 * as a result of the parsing. |
10199 */ | 10708 */ |
(...skipping 16 matching lines...) Expand all Loading... |
10216 xmlDetectSAX2(ctxt); | 10725 xmlDetectSAX2(ctxt); |
10217 | 10726 |
10218 /* | 10727 /* |
10219 * SAX: beginning of the document processing. | 10728 * SAX: beginning of the document processing. |
10220 */ | 10729 */ |
10221 if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) | 10730 if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) |
10222 ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); | 10731 ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); |
10223 if (ctxt->instate == XML_PARSER_EOF) | 10732 if (ctxt->instate == XML_PARSER_EOF) |
10224 return(-1); | 10733 return(-1); |
10225 | 10734 |
10226 if ((ctxt->encoding == (const xmlChar *)XML_CHAR_ENCODING_NONE) && | 10735 if ((ctxt->encoding == NULL) && |
10227 ((ctxt->input->end - ctxt->input->cur) >= 4)) { | 10736 ((ctxt->input->end - ctxt->input->cur) >= 4)) { |
10228 » /* | 10737 » /* |
10229 * Get the 4 first bytes and decode the charset | 10738 * Get the 4 first bytes and decode the charset |
10230 * if enc != XML_CHAR_ENCODING_NONE | 10739 * if enc != XML_CHAR_ENCODING_NONE |
10231 * plug some encoding conversion routines. | 10740 * plug some encoding conversion routines. |
10232 */ | 10741 */ |
10233 start[0] = RAW; | 10742 start[0] = RAW; |
10234 start[1] = NXT(1); | 10743 start[1] = NXT(1); |
10235 start[2] = NXT(2); | 10744 start[2] = NXT(2); |
10236 start[3] = NXT(3); | 10745 start[3] = NXT(3); |
10237 enc = xmlDetectCharEncoding(&start[0], 4); | 10746 enc = xmlDetectCharEncoding(&start[0], 4); |
10238 if (enc != XML_CHAR_ENCODING_NONE) { | 10747 if (enc != XML_CHAR_ENCODING_NONE) { |
(...skipping 29 matching lines...) Expand all Loading... |
10268 } | 10777 } |
10269 ctxt->standalone = ctxt->input->standalone; | 10778 ctxt->standalone = ctxt->input->standalone; |
10270 SKIP_BLANKS; | 10779 SKIP_BLANKS; |
10271 } else { | 10780 } else { |
10272 ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION); | 10781 ctxt->version = xmlCharStrdup(XML_DEFAULT_VERSION); |
10273 } | 10782 } |
10274 if ((ctxt->sax) && (ctxt->sax->startDocument) && (!ctxt->disableSAX)) | 10783 if ((ctxt->sax) && (ctxt->sax->startDocument) && (!ctxt->disableSAX)) |
10275 ctxt->sax->startDocument(ctxt->userData); | 10784 ctxt->sax->startDocument(ctxt->userData); |
10276 if (ctxt->instate == XML_PARSER_EOF) | 10785 if (ctxt->instate == XML_PARSER_EOF) |
10277 return(-1); | 10786 return(-1); |
| 10787 if ((ctxt->myDoc != NULL) && (ctxt->input != NULL) && |
| 10788 (ctxt->input->buf != NULL) && (ctxt->input->buf->compressed >= 0)) { |
| 10789 ctxt->myDoc->compression = ctxt->input->buf->compressed; |
| 10790 } |
10278 | 10791 |
10279 /* | 10792 /* |
10280 * The Misc part of the Prolog | 10793 * The Misc part of the Prolog |
10281 */ | 10794 */ |
10282 GROW; | 10795 GROW; |
10283 xmlParseMisc(ctxt); | 10796 xmlParseMisc(ctxt); |
10284 | 10797 |
10285 /* | 10798 /* |
10286 * Then possibly doc type declaration(s) and more Misc | 10799 * Then possibly doc type declaration(s) and more Misc |
10287 * (doctypedecl Misc*)? | 10800 * (doctypedecl Misc*)? |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10367 if (! ctxt->wellFormed) { | 10880 if (! ctxt->wellFormed) { |
10368 ctxt->valid = 0; | 10881 ctxt->valid = 0; |
10369 return(-1); | 10882 return(-1); |
10370 } | 10883 } |
10371 return(0); | 10884 return(0); |
10372 } | 10885 } |
10373 | 10886 |
10374 /** | 10887 /** |
10375 * xmlParseExtParsedEnt: | 10888 * xmlParseExtParsedEnt: |
10376 * @ctxt: an XML parser context | 10889 * @ctxt: an XML parser context |
10377 * | 10890 * |
10378 * parse a general parsed entity | 10891 * parse a general parsed entity |
10379 * An external general parsed entity is well-formed if it matches the | 10892 * An external general parsed entity is well-formed if it matches the |
10380 * production labeled extParsedEnt. | 10893 * production labeled extParsedEnt. |
10381 * | 10894 * |
10382 * [78] extParsedEnt ::= TextDecl? content | 10895 * [78] extParsedEnt ::= TextDecl? content |
10383 * | 10896 * |
10384 * Returns 0, -1 in case of error. the parser context is augmented | 10897 * Returns 0, -1 in case of error. the parser context is augmented |
10385 * as a result of the parsing. | 10898 * as a result of the parsing. |
10386 */ | 10899 */ |
10387 | 10900 |
(...skipping 10 matching lines...) Expand all Loading... |
10398 xmlDetectSAX2(ctxt); | 10911 xmlDetectSAX2(ctxt); |
10399 | 10912 |
10400 GROW; | 10913 GROW; |
10401 | 10914 |
10402 /* | 10915 /* |
10403 * SAX: beginning of the document processing. | 10916 * SAX: beginning of the document processing. |
10404 */ | 10917 */ |
10405 if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) | 10918 if ((ctxt->sax) && (ctxt->sax->setDocumentLocator)) |
10406 ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); | 10919 ctxt->sax->setDocumentLocator(ctxt->userData, &xmlDefaultSAXLocator); |
10407 | 10920 |
10408 /* | 10921 /* |
10409 * Get the 4 first bytes and decode the charset | 10922 * Get the 4 first bytes and decode the charset |
10410 * if enc != XML_CHAR_ENCODING_NONE | 10923 * if enc != XML_CHAR_ENCODING_NONE |
10411 * plug some encoding conversion routines. | 10924 * plug some encoding conversion routines. |
10412 */ | 10925 */ |
10413 if ((ctxt->input->end - ctxt->input->cur) >= 4) { | 10926 if ((ctxt->input->end - ctxt->input->cur) >= 4) { |
10414 start[0] = RAW; | 10927 start[0] = RAW; |
10415 start[1] = NXT(1); | 10928 start[1] = NXT(1); |
10416 start[2] = NXT(2); | 10929 start[2] = NXT(2); |
10417 start[3] = NXT(3); | 10930 start[3] = NXT(3); |
10418 enc = xmlDetectCharEncoding(start, 4); | 10931 enc = xmlDetectCharEncoding(start, 4); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10455 * Doing validity checking on chunk doesn't make sense | 10968 * Doing validity checking on chunk doesn't make sense |
10456 */ | 10969 */ |
10457 ctxt->instate = XML_PARSER_CONTENT; | 10970 ctxt->instate = XML_PARSER_CONTENT; |
10458 ctxt->validate = 0; | 10971 ctxt->validate = 0; |
10459 ctxt->loadsubset = 0; | 10972 ctxt->loadsubset = 0; |
10460 ctxt->depth = 0; | 10973 ctxt->depth = 0; |
10461 | 10974 |
10462 xmlParseContent(ctxt); | 10975 xmlParseContent(ctxt); |
10463 if (ctxt->instate == XML_PARSER_EOF) | 10976 if (ctxt->instate == XML_PARSER_EOF) |
10464 return(-1); | 10977 return(-1); |
10465 | 10978 |
10466 if ((RAW == '<') && (NXT(1) == '/')) { | 10979 if ((RAW == '<') && (NXT(1) == '/')) { |
10467 xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); | 10980 xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL); |
10468 } else if (RAW != 0) { | 10981 } else if (RAW != 0) { |
10469 xmlFatalErr(ctxt, XML_ERR_EXTRA_CONTENT, NULL); | 10982 xmlFatalErr(ctxt, XML_ERR_EXTRA_CONTENT, NULL); |
10470 } | 10983 } |
10471 | 10984 |
10472 /* | 10985 /* |
10473 * SAX: end of the document processing. | 10986 * SAX: end of the document processing. |
10474 */ | 10987 */ |
10475 if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) | 10988 if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) |
10476 ctxt->sax->endDocument(ctxt->userData); | 10989 ctxt->sax->endDocument(ctxt->userData); |
10477 | 10990 |
10478 if (! ctxt->wellFormed) return(-1); | 10991 if (! ctxt->wellFormed) return(-1); |
10479 return(0); | 10992 return(0); |
10480 } | 10993 } |
10481 | 10994 |
10482 #ifdef LIBXML_PUSH_ENABLED | 10995 #ifdef LIBXML_PUSH_ENABLED |
10483 /************************************************************************ | 10996 /************************************************************************ |
10484 * * | 10997 * * |
10485 * » » Progressive parsing interfaces» » » » * | 10998 *» » Progressive parsing interfaces» » » » * |
10486 * * | 10999 * * |
10487 ************************************************************************/ | 11000 ************************************************************************/ |
10488 | 11001 |
10489 /** | 11002 /** |
10490 * xmlParseLookupSequence: | 11003 * xmlParseLookupSequence: |
10491 * @ctxt: an XML parser context | 11004 * @ctxt: an XML parser context |
10492 * @first: the first char to lookup | 11005 * @first: the first char to lookup |
10493 * @next: the next char to lookup or zero | 11006 * @next: the next char to lookup or zero |
10494 * @third: the next char to lookup or zero | 11007 * @third: the next char to lookup or zero |
10495 * | 11008 * |
(...skipping 16 matching lines...) Expand all Loading... |
10512 in = ctxt->input; | 11025 in = ctxt->input; |
10513 if (in == NULL) return(-1); | 11026 if (in == NULL) return(-1); |
10514 base = in->cur - in->base; | 11027 base = in->cur - in->base; |
10515 if (base < 0) return(-1); | 11028 if (base < 0) return(-1); |
10516 if (ctxt->checkIndex > base) | 11029 if (ctxt->checkIndex > base) |
10517 base = ctxt->checkIndex; | 11030 base = ctxt->checkIndex; |
10518 if (in->buf == NULL) { | 11031 if (in->buf == NULL) { |
10519 buf = in->base; | 11032 buf = in->base; |
10520 len = in->length; | 11033 len = in->length; |
10521 } else { | 11034 } else { |
10522 » buf = in->buf->buffer->content; | 11035 » buf = xmlBufContent(in->buf->buffer); |
10523 » len = in->buf->buffer->use; | 11036 » len = xmlBufUse(in->buf->buffer); |
10524 } | 11037 } |
10525 /* take into account the sequence length */ | 11038 /* take into account the sequence length */ |
10526 if (third) len -= 2; | 11039 if (third) len -= 2; |
10527 else if (next) len --; | 11040 else if (next) len --; |
10528 for (;base < len;base++) { | 11041 for (;base < len;base++) { |
10529 if (buf[base] == first) { | 11042 if (buf[base] == first) { |
10530 if (third != 0) { | 11043 if (third != 0) { |
10531 if ((buf[base + 1] != next) || | 11044 if ((buf[base + 1] != next) || |
10532 (buf[base + 2] != third)) continue; | 11045 (buf[base + 2] != third)) continue; |
10533 } else if (next != 0) { | 11046 } else if (next != 0) { |
10534 if (buf[base + 1] != next) continue; | 11047 if (buf[base + 1] != next) continue; |
10535 } | 11048 } |
10536 ctxt->checkIndex = 0; | 11049 ctxt->checkIndex = 0; |
10537 #ifdef DEBUG_PUSH | 11050 #ifdef DEBUG_PUSH |
10538 if (next == 0) | 11051 if (next == 0) |
10539 xmlGenericError(xmlGenericErrorContext, | 11052 xmlGenericError(xmlGenericErrorContext, |
10540 "PP: lookup '%c' found at %d\n", | 11053 "PP: lookup '%c' found at %d\n", |
10541 first, base); | 11054 first, base); |
10542 else if (third == 0) | 11055 else if (third == 0) |
10543 xmlGenericError(xmlGenericErrorContext, | 11056 xmlGenericError(xmlGenericErrorContext, |
10544 "PP: lookup '%c%c' found at %d\n", | 11057 "PP: lookup '%c%c' found at %d\n", |
10545 first, next, base); | 11058 first, next, base); |
10546 » else | 11059 » else |
10547 xmlGenericError(xmlGenericErrorContext, | 11060 xmlGenericError(xmlGenericErrorContext, |
10548 "PP: lookup '%c%c%c' found at %d\n", | 11061 "PP: lookup '%c%c%c' found at %d\n", |
10549 first, next, third, base); | 11062 first, next, third, base); |
10550 #endif | 11063 #endif |
10551 return(base - (in->cur - in->base)); | 11064 return(base - (in->cur - in->base)); |
10552 } | 11065 } |
10553 } | 11066 } |
10554 ctxt->checkIndex = base; | 11067 ctxt->checkIndex = base; |
10555 #ifdef DEBUG_PUSH | 11068 #ifdef DEBUG_PUSH |
10556 if (next == 0) | 11069 if (next == 0) |
10557 xmlGenericError(xmlGenericErrorContext, | 11070 xmlGenericError(xmlGenericErrorContext, |
10558 "PP: lookup '%c' failed\n", first); | 11071 "PP: lookup '%c' failed\n", first); |
10559 else if (third == 0) | 11072 else if (third == 0) |
10560 xmlGenericError(xmlGenericErrorContext, | 11073 xmlGenericError(xmlGenericErrorContext, |
10561 "PP: lookup '%c%c' failed\n", first, next); | 11074 "PP: lookup '%c%c' failed\n", first, next); |
10562 else» | 11075 else |
10563 xmlGenericError(xmlGenericErrorContext, | 11076 xmlGenericError(xmlGenericErrorContext, |
10564 "PP: lookup '%c%c%c' failed\n", first, next, third); | 11077 "PP: lookup '%c%c%c' failed\n", first, next, third); |
10565 #endif | 11078 #endif |
10566 return(-1); | 11079 return(-1); |
10567 } | 11080 } |
10568 | 11081 |
10569 /** | 11082 /** |
10570 * xmlParseGetLasts: | 11083 * xmlParseGetLasts: |
10571 * @ctxt: an XML parser context | 11084 * @ctxt: an XML parser context |
10572 * @lastlt: pointer to store the last '<' from the input | 11085 * @lastlt: pointer to store the last '<' from the input |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10634 * UTF-8 error occured otherwise | 11147 * UTF-8 error occured otherwise |
10635 */ | 11148 */ |
10636 static int | 11149 static int |
10637 xmlCheckCdataPush(const xmlChar *utf, int len) { | 11150 xmlCheckCdataPush(const xmlChar *utf, int len) { |
10638 int ix; | 11151 int ix; |
10639 unsigned char c; | 11152 unsigned char c; |
10640 int codepoint; | 11153 int codepoint; |
10641 | 11154 |
10642 if ((utf == NULL) || (len <= 0)) | 11155 if ((utf == NULL) || (len <= 0)) |
10643 return(0); | 11156 return(0); |
10644 | 11157 |
10645 for (ix = 0; ix < len;) { /* string is 0-terminated */ | 11158 for (ix = 0; ix < len;) { /* string is 0-terminated */ |
10646 c = utf[ix]; | 11159 c = utf[ix]; |
10647 if ((c & 0x80) == 0x00) { /* 1-byte code, starts with 10 */ | 11160 if ((c & 0x80) == 0x00) { /* 1-byte code, starts with 10 */ |
10648 if (c >= 0x20) | 11161 if (c >= 0x20) |
10649 ix++; | 11162 ix++; |
10650 else if ((c == 0xA) || (c == 0xD) || (c == 0x9)) | 11163 else if ((c == 0xA) || (c == 0xD) || (c == 0x9)) |
10651 ix++; | 11164 ix++; |
10652 else | 11165 else |
10653 return(-ix); | 11166 return(-ix); |
10654 } else if ((c & 0xe0) == 0xc0) {/* 2-byte code, starts with 110 */ | 11167 } else if ((c & 0xe0) == 0xc0) {/* 2-byte code, starts with 110 */ |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10766 (ctxt->input->cur - ctxt->input->base > 4096)) { | 11279 (ctxt->input->cur - ctxt->input->base > 4096)) { |
10767 xmlSHRINK(ctxt); | 11280 xmlSHRINK(ctxt); |
10768 ctxt->checkIndex = 0; | 11281 ctxt->checkIndex = 0; |
10769 } | 11282 } |
10770 xmlParseGetLasts(ctxt, &lastlt, &lastgt); | 11283 xmlParseGetLasts(ctxt, &lastlt, &lastgt); |
10771 | 11284 |
10772 while (ctxt->instate != XML_PARSER_EOF) { | 11285 while (ctxt->instate != XML_PARSER_EOF) { |
10773 if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) | 11286 if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) |
10774 return(0); | 11287 return(0); |
10775 | 11288 |
10776 | 11289 |
10777 /* | 11290 /* |
10778 * Pop-up of finished entities. | 11291 * Pop-up of finished entities. |
10779 */ | 11292 */ |
10780 while ((RAW == 0) && (ctxt->inputNr > 1)) | 11293 while ((RAW == 0) && (ctxt->inputNr > 1)) |
10781 xmlPopInput(ctxt); | 11294 xmlPopInput(ctxt); |
10782 | 11295 |
10783 if (ctxt->input == NULL) break; | 11296 if (ctxt->input == NULL) break; |
10784 if (ctxt->input->buf == NULL) | 11297 if (ctxt->input->buf == NULL) |
10785 avail = ctxt->input->length - | 11298 avail = ctxt->input->length - |
10786 (ctxt->input->cur - ctxt->input->base); | 11299 (ctxt->input->cur - ctxt->input->base); |
10787 else { | 11300 else { |
10788 /* | 11301 /* |
10789 * If we are operating on converted input, try to flush | 11302 * If we are operating on converted input, try to flush |
10790 * remainng chars to avoid them stalling in the non-converted | 11303 * remainng chars to avoid them stalling in the non-converted |
10791 » * buffer. | 11304 » * buffer. But do not do this in document start where |
| 11305 » * encoding="..." may not have been read and we work on a |
| 11306 » * guessed encoding. |
10792 */ | 11307 */ |
10793 » if ((ctxt->input->buf->raw != NULL) && | 11308 » if ((ctxt->instate != XML_PARSER_START) && |
10794 » » (ctxt->input->buf->raw->use > 0)) { | 11309 » (ctxt->input->buf->raw != NULL) && |
10795 » » int base = ctxt->input->base - | 11310 » » (xmlBufIsEmpty(ctxt->input->buf->raw) == 0)) { |
10796 » » ctxt->input->buf->buffer->content; | 11311 size_t base = xmlBufGetInputBase(ctxt->input->buf->buffer, |
10797 » » int current = ctxt->input->cur - ctxt->input->base; | 11312 ctxt->input); |
| 11313 » » size_t current = ctxt->input->cur - ctxt->input->base; |
10798 | 11314 |
10799 xmlParserInputBufferPush(ctxt->input->buf, 0, ""); | 11315 xmlParserInputBufferPush(ctxt->input->buf, 0, ""); |
10800 » » ctxt->input->base = ctxt->input->buf->buffer->content + base; | 11316 xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, |
10801 » » ctxt->input->cur = ctxt->input->base + current; | 11317 base, current); |
10802 » » ctxt->input->end = | |
10803 » » &ctxt->input->buf->buffer->content[ | |
10804 » » ctxt->input->buf->buffer->use]; | |
10805 } | 11318 } |
10806 » avail = ctxt->input->buf->buffer->use - | 11319 » avail = xmlBufUse(ctxt->input->buf->buffer) - |
10807 (ctxt->input->cur - ctxt->input->base); | 11320 (ctxt->input->cur - ctxt->input->base); |
10808 } | 11321 } |
10809 if (avail < 1) | 11322 if (avail < 1) |
10810 goto done; | 11323 goto done; |
10811 switch (ctxt->instate) { | 11324 switch (ctxt->instate) { |
10812 case XML_PARSER_EOF: | 11325 case XML_PARSER_EOF: |
10813 /* | 11326 /* |
10814 * Document parsing is done ! | 11327 * Document parsing is done ! |
10815 */ | 11328 */ |
10816 goto done; | 11329 goto done; |
10817 case XML_PARSER_START: | 11330 case XML_PARSER_START: |
10818 if (ctxt->charset == XML_CHAR_ENCODING_NONE) { | 11331 if (ctxt->charset == XML_CHAR_ENCODING_NONE) { |
10819 xmlChar start[4]; | 11332 xmlChar start[4]; |
10820 xmlCharEncoding enc; | 11333 xmlCharEncoding enc; |
10821 | 11334 |
10822 /* | 11335 /* |
10823 * Very first chars read from the document flow. | 11336 * Very first chars read from the document flow. |
10824 */ | 11337 */ |
10825 if (avail < 4) | 11338 if (avail < 4) |
10826 goto done; | 11339 goto done; |
10827 | 11340 |
10828 » » /* | 11341 » » /* |
10829 * Get the 4 first bytes and decode the charset | 11342 * Get the 4 first bytes and decode the charset |
10830 * if enc != XML_CHAR_ENCODING_NONE | 11343 * if enc != XML_CHAR_ENCODING_NONE |
10831 * plug some encoding conversion routines, | 11344 * plug some encoding conversion routines, |
10832 * else xmlSwitchEncoding will set to (default) | 11345 * else xmlSwitchEncoding will set to (default) |
10833 * UTF8. | 11346 * UTF8. |
10834 */ | 11347 */ |
10835 start[0] = RAW; | 11348 start[0] = RAW; |
10836 start[1] = NXT(1); | 11349 start[1] = NXT(1); |
10837 start[2] = NXT(2); | 11350 start[2] = NXT(2); |
10838 start[3] = NXT(3); | 11351 start[3] = NXT(3); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10973 spacePop(ctxt); | 11486 spacePop(ctxt); |
10974 ctxt->instate = XML_PARSER_EOF; | 11487 ctxt->instate = XML_PARSER_EOF; |
10975 if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) | 11488 if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) |
10976 ctxt->sax->endDocument(ctxt->userData); | 11489 ctxt->sax->endDocument(ctxt->userData); |
10977 goto done; | 11490 goto done; |
10978 } | 11491 } |
10979 #ifdef LIBXML_VALID_ENABLED | 11492 #ifdef LIBXML_VALID_ENABLED |
10980 /* | 11493 /* |
10981 * [ VC: Root Element Type ] | 11494 * [ VC: Root Element Type ] |
10982 * The Name in the document type declaration must match | 11495 * The Name in the document type declaration must match |
10983 » » * the element type of the root element. | 11496 » » * the element type of the root element. |
10984 */ | 11497 */ |
10985 if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && | 11498 if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc && |
10986 ctxt->node && (ctxt->node == ctxt->myDoc->children)) | 11499 ctxt->node && (ctxt->node == ctxt->myDoc->children)) |
10987 ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); | 11500 ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc); |
10988 #endif /* LIBXML_VALID_ENABLED */ | 11501 #endif /* LIBXML_VALID_ENABLED */ |
10989 | 11502 |
10990 /* | 11503 /* |
10991 * Check for an Empty Element. | 11504 * Check for an Empty Element. |
10992 */ | 11505 */ |
10993 if ((RAW == '/') && (NXT(1) == '>')) { | 11506 if ((RAW == '/') && (NXT(1) == '>')) { |
(...skipping 16 matching lines...) Expand all Loading... |
11010 #endif /* LIBXML_SAX1_ENABLED */ | 11523 #endif /* LIBXML_SAX1_ENABLED */ |
11011 } | 11524 } |
11012 if (ctxt->instate == XML_PARSER_EOF) | 11525 if (ctxt->instate == XML_PARSER_EOF) |
11013 goto done; | 11526 goto done; |
11014 spacePop(ctxt); | 11527 spacePop(ctxt); |
11015 if (ctxt->nameNr == 0) { | 11528 if (ctxt->nameNr == 0) { |
11016 ctxt->instate = XML_PARSER_EPILOG; | 11529 ctxt->instate = XML_PARSER_EPILOG; |
11017 } else { | 11530 } else { |
11018 ctxt->instate = XML_PARSER_CONTENT; | 11531 ctxt->instate = XML_PARSER_CONTENT; |
11019 } | 11532 } |
| 11533 ctxt->progressive = 1; |
11020 break; | 11534 break; |
11021 } | 11535 } |
11022 if (RAW == '>') { | 11536 if (RAW == '>') { |
11023 NEXT; | 11537 NEXT; |
11024 } else { | 11538 } else { |
11025 xmlFatalErrMsgStr(ctxt, XML_ERR_GT_REQUIRED, | 11539 xmlFatalErrMsgStr(ctxt, XML_ERR_GT_REQUIRED, |
11026 "Couldn't find end of Start Tag %s\n", | 11540 "Couldn't find end of Start Tag %s\n", |
11027 name); | 11541 name); |
11028 nodePop(ctxt); | 11542 nodePop(ctxt); |
11029 spacePop(ctxt); | 11543 spacePop(ctxt); |
11030 } | 11544 } |
11031 if (ctxt->sax2) | 11545 if (ctxt->sax2) |
11032 nameNsPush(ctxt, name, prefix, URI, ctxt->nsNr - nsNr); | 11546 nameNsPush(ctxt, name, prefix, URI, ctxt->nsNr - nsNr); |
11033 #ifdef LIBXML_SAX1_ENABLED | 11547 #ifdef LIBXML_SAX1_ENABLED |
11034 else | 11548 else |
11035 namePush(ctxt, name); | 11549 namePush(ctxt, name); |
11036 #endif /* LIBXML_SAX1_ENABLED */ | 11550 #endif /* LIBXML_SAX1_ENABLED */ |
11037 | 11551 |
11038 ctxt->instate = XML_PARSER_CONTENT; | 11552 ctxt->instate = XML_PARSER_CONTENT; |
| 11553 ctxt->progressive = 1; |
11039 break; | 11554 break; |
11040 } | 11555 } |
11041 case XML_PARSER_CONTENT: { | 11556 case XML_PARSER_CONTENT: { |
11042 const xmlChar *test; | 11557 const xmlChar *test; |
11043 unsigned int cons; | 11558 unsigned int cons; |
11044 if ((avail < 2) && (ctxt->inputNr == 1)) | 11559 if ((avail < 2) && (ctxt->inputNr == 1)) |
11045 goto done; | 11560 goto done; |
11046 cur = ctxt->input->cur[0]; | 11561 cur = ctxt->input->cur[0]; |
11047 next = ctxt->input->cur[1]; | 11562 next = ctxt->input->cur[1]; |
11048 | 11563 |
11049 test = CUR_PTR; | 11564 test = CUR_PTR; |
11050 cons = ctxt->input->consumed; | 11565 cons = ctxt->input->consumed; |
11051 if ((cur == '<') && (next == '/')) { | 11566 if ((cur == '<') && (next == '/')) { |
11052 ctxt->instate = XML_PARSER_END_TAG; | 11567 ctxt->instate = XML_PARSER_END_TAG; |
11053 break; | 11568 break; |
11054 } else if ((cur == '<') && (next == '?')) { | 11569 } else if ((cur == '<') && (next == '?')) { |
11055 if ((!terminate) && | 11570 if ((!terminate) && |
11056 » » (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) | 11571 » » (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) { |
| 11572 ctxt->progressive = XML_PARSER_PI; |
11057 goto done; | 11573 goto done; |
| 11574 } |
11058 xmlParsePI(ctxt); | 11575 xmlParsePI(ctxt); |
| 11576 ctxt->instate = XML_PARSER_CONTENT; |
| 11577 ctxt->progressive = 1; |
11059 } else if ((cur == '<') && (next != '!')) { | 11578 } else if ((cur == '<') && (next != '!')) { |
11060 ctxt->instate = XML_PARSER_START_TAG; | 11579 ctxt->instate = XML_PARSER_START_TAG; |
11061 break; | 11580 break; |
11062 } else if ((cur == '<') && (next == '!') && | 11581 } else if ((cur == '<') && (next == '!') && |
11063 (ctxt->input->cur[2] == '-') && | 11582 (ctxt->input->cur[2] == '-') && |
11064 (ctxt->input->cur[3] == '-')) { | 11583 (ctxt->input->cur[3] == '-')) { |
11065 int term; | 11584 int term; |
11066 | 11585 |
11067 if (avail < 4) | 11586 if (avail < 4) |
11068 goto done; | 11587 goto done; |
11069 ctxt->input->cur += 4; | 11588 ctxt->input->cur += 4; |
11070 term = xmlParseLookupSequence(ctxt, '-', '-', '>'); | 11589 term = xmlParseLookupSequence(ctxt, '-', '-', '>'); |
11071 ctxt->input->cur -= 4; | 11590 ctxt->input->cur -= 4; |
11072 » » if ((!terminate) && (term < 0)) | 11591 » » if ((!terminate) && (term < 0)) { |
| 11592 ctxt->progressive = XML_PARSER_COMMENT; |
11073 goto done; | 11593 goto done; |
| 11594 } |
11074 xmlParseComment(ctxt); | 11595 xmlParseComment(ctxt); |
11075 ctxt->instate = XML_PARSER_CONTENT; | 11596 ctxt->instate = XML_PARSER_CONTENT; |
| 11597 ctxt->progressive = 1; |
11076 } else if ((cur == '<') && (ctxt->input->cur[1] == '!') && | 11598 } else if ((cur == '<') && (ctxt->input->cur[1] == '!') && |
11077 (ctxt->input->cur[2] == '[') && | 11599 (ctxt->input->cur[2] == '[') && |
11078 (ctxt->input->cur[3] == 'C') && | 11600 (ctxt->input->cur[3] == 'C') && |
11079 (ctxt->input->cur[4] == 'D') && | 11601 (ctxt->input->cur[4] == 'D') && |
11080 (ctxt->input->cur[5] == 'A') && | 11602 (ctxt->input->cur[5] == 'A') && |
11081 (ctxt->input->cur[6] == 'T') && | 11603 (ctxt->input->cur[6] == 'T') && |
11082 (ctxt->input->cur[7] == 'A') && | 11604 (ctxt->input->cur[7] == 'A') && |
11083 (ctxt->input->cur[8] == '[')) { | 11605 (ctxt->input->cur[8] == '[')) { |
11084 SKIP(9); | 11606 SKIP(9); |
11085 ctxt->instate = XML_PARSER_CDATA_SECTION; | 11607 ctxt->instate = XML_PARSER_CDATA_SECTION; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11160 if (ctxt->instate == XML_PARSER_EOF) { | 11682 if (ctxt->instate == XML_PARSER_EOF) { |
11161 /* Nothing */ | 11683 /* Nothing */ |
11162 } else if (ctxt->nameNr == 0) { | 11684 } else if (ctxt->nameNr == 0) { |
11163 ctxt->instate = XML_PARSER_EPILOG; | 11685 ctxt->instate = XML_PARSER_EPILOG; |
11164 } else { | 11686 } else { |
11165 ctxt->instate = XML_PARSER_CONTENT; | 11687 ctxt->instate = XML_PARSER_CONTENT; |
11166 } | 11688 } |
11167 break; | 11689 break; |
11168 case XML_PARSER_CDATA_SECTION: { | 11690 case XML_PARSER_CDATA_SECTION: { |
11169 /* | 11691 /* |
11170 » » * The Push mode need to have the SAX callback for | 11692 » » * The Push mode need to have the SAX callback for |
11171 * cdataBlock merge back contiguous callbacks. | 11693 * cdataBlock merge back contiguous callbacks. |
11172 */ | 11694 */ |
11173 int base; | 11695 int base; |
11174 | 11696 |
11175 base = xmlParseLookupSequence(ctxt, ']', ']', '>'); | 11697 base = xmlParseLookupSequence(ctxt, ']', ']', '>'); |
11176 if (base < 0) { | 11698 if (base < 0) { |
11177 if (avail >= XML_PARSER_BIG_BUFFER_SIZE + 2) { | 11699 if (avail >= XML_PARSER_BIG_BUFFER_SIZE + 2) { |
11178 int tmp; | 11700 int tmp; |
11179 | 11701 |
11180 » » » tmp = xmlCheckCdataPush(ctxt->input->cur, | 11702 » » » tmp = xmlCheckCdataPush(ctxt->input->cur, |
11181 XML_PARSER_BIG_BUFFER_SIZE); | 11703 XML_PARSER_BIG_BUFFER_SIZE); |
11182 if (tmp < 0) { | 11704 if (tmp < 0) { |
11183 tmp = -tmp; | 11705 tmp = -tmp; |
11184 ctxt->input->cur += tmp; | 11706 ctxt->input->cur += tmp; |
11185 goto encoding_error; | 11707 goto encoding_error; |
11186 } | 11708 } |
11187 if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { | 11709 if ((ctxt->sax != NULL) && (!ctxt->disableSAX)) { |
11188 if (ctxt->sax->cdataBlock != NULL) | 11710 if (ctxt->sax->cdataBlock != NULL) |
11189 ctxt->sax->cdataBlock(ctxt->userData, | 11711 ctxt->sax->cdataBlock(ctxt->userData, |
11190 ctxt->input->cur, tmp); | 11712 ctxt->input->cur, tmp); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11240 #endif | 11762 #endif |
11241 } | 11763 } |
11242 break; | 11764 break; |
11243 } | 11765 } |
11244 case XML_PARSER_MISC: | 11766 case XML_PARSER_MISC: |
11245 SKIP_BLANKS; | 11767 SKIP_BLANKS; |
11246 if (ctxt->input->buf == NULL) | 11768 if (ctxt->input->buf == NULL) |
11247 avail = ctxt->input->length - | 11769 avail = ctxt->input->length - |
11248 (ctxt->input->cur - ctxt->input->base); | 11770 (ctxt->input->cur - ctxt->input->base); |
11249 else | 11771 else |
11250 » » avail = ctxt->input->buf->buffer->use - | 11772 » » avail = xmlBufUse(ctxt->input->buf->buffer) - |
11251 (ctxt->input->cur - ctxt->input->base); | 11773 (ctxt->input->cur - ctxt->input->base); |
11252 if (avail < 2) | 11774 if (avail < 2) |
11253 goto done; | 11775 goto done; |
11254 cur = ctxt->input->cur[0]; | 11776 cur = ctxt->input->cur[0]; |
11255 next = ctxt->input->cur[1]; | 11777 next = ctxt->input->cur[1]; |
11256 if ((cur == '<') && (next == '?')) { | 11778 if ((cur == '<') && (next == '?')) { |
11257 if ((!terminate) && | 11779 if ((!terminate) && |
11258 » » (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) | 11780 » » (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) { |
| 11781 ctxt->progressive = XML_PARSER_PI; |
11259 goto done; | 11782 goto done; |
| 11783 } |
11260 #ifdef DEBUG_PUSH | 11784 #ifdef DEBUG_PUSH |
11261 xmlGenericError(xmlGenericErrorContext, | 11785 xmlGenericError(xmlGenericErrorContext, |
11262 "PP: Parsing PI\n"); | 11786 "PP: Parsing PI\n"); |
11263 #endif | 11787 #endif |
11264 xmlParsePI(ctxt); | 11788 xmlParsePI(ctxt); |
11265 if (ctxt->instate == XML_PARSER_EOF) | 11789 if (ctxt->instate == XML_PARSER_EOF) |
11266 goto done; | 11790 goto done; |
| 11791 ctxt->instate = XML_PARSER_MISC; |
| 11792 ctxt->progressive = 1; |
11267 ctxt->checkIndex = 0; | 11793 ctxt->checkIndex = 0; |
11268 } else if ((cur == '<') && (next == '!') && | 11794 } else if ((cur == '<') && (next == '!') && |
11269 (ctxt->input->cur[2] == '-') && | 11795 (ctxt->input->cur[2] == '-') && |
11270 (ctxt->input->cur[3] == '-')) { | 11796 (ctxt->input->cur[3] == '-')) { |
11271 if ((!terminate) && | 11797 if ((!terminate) && |
11272 » » (xmlParseLookupSequence(ctxt, '-', '-', '>') < 0)) | 11798 » » (xmlParseLookupSequence(ctxt, '-', '-', '>') < 0)) { |
| 11799 ctxt->progressive = XML_PARSER_COMMENT; |
11273 goto done; | 11800 goto done; |
| 11801 } |
11274 #ifdef DEBUG_PUSH | 11802 #ifdef DEBUG_PUSH |
11275 xmlGenericError(xmlGenericErrorContext, | 11803 xmlGenericError(xmlGenericErrorContext, |
11276 "PP: Parsing Comment\n"); | 11804 "PP: Parsing Comment\n"); |
11277 #endif | 11805 #endif |
11278 xmlParseComment(ctxt); | 11806 xmlParseComment(ctxt); |
11279 if (ctxt->instate == XML_PARSER_EOF) | 11807 if (ctxt->instate == XML_PARSER_EOF) |
11280 goto done; | 11808 goto done; |
11281 ctxt->instate = XML_PARSER_MISC; | 11809 ctxt->instate = XML_PARSER_MISC; |
| 11810 ctxt->progressive = 1; |
11282 ctxt->checkIndex = 0; | 11811 ctxt->checkIndex = 0; |
11283 } else if ((cur == '<') && (next == '!') && | 11812 } else if ((cur == '<') && (next == '!') && |
11284 (ctxt->input->cur[2] == 'D') && | 11813 (ctxt->input->cur[2] == 'D') && |
11285 (ctxt->input->cur[3] == 'O') && | 11814 (ctxt->input->cur[3] == 'O') && |
11286 (ctxt->input->cur[4] == 'C') && | 11815 (ctxt->input->cur[4] == 'C') && |
11287 (ctxt->input->cur[5] == 'T') && | 11816 (ctxt->input->cur[5] == 'T') && |
11288 (ctxt->input->cur[6] == 'Y') && | 11817 (ctxt->input->cur[6] == 'Y') && |
11289 (ctxt->input->cur[7] == 'P') && | 11818 (ctxt->input->cur[7] == 'P') && |
11290 (ctxt->input->cur[8] == 'E')) { | 11819 (ctxt->input->cur[8] == 'E')) { |
11291 if ((!terminate) && | 11820 if ((!terminate) && |
11292 » » (xmlParseLookupSequence(ctxt, '>', 0, 0) < 0)) | 11821 » » (xmlParseLookupSequence(ctxt, '>', 0, 0) < 0)) { |
| 11822 ctxt->progressive = XML_PARSER_DTD; |
11293 goto done; | 11823 goto done; |
| 11824 } |
11294 #ifdef DEBUG_PUSH | 11825 #ifdef DEBUG_PUSH |
11295 xmlGenericError(xmlGenericErrorContext, | 11826 xmlGenericError(xmlGenericErrorContext, |
11296 "PP: Parsing internal subset\n"); | 11827 "PP: Parsing internal subset\n"); |
11297 #endif | 11828 #endif |
11298 ctxt->inSubset = 1; | 11829 ctxt->inSubset = 1; |
| 11830 ctxt->progressive = 0; |
| 11831 ctxt->checkIndex = 0; |
11299 xmlParseDocTypeDecl(ctxt); | 11832 xmlParseDocTypeDecl(ctxt); |
11300 if (ctxt->instate == XML_PARSER_EOF) | 11833 if (ctxt->instate == XML_PARSER_EOF) |
11301 goto done; | 11834 goto done; |
11302 if (RAW == '[') { | 11835 if (RAW == '[') { |
11303 ctxt->instate = XML_PARSER_DTD; | 11836 ctxt->instate = XML_PARSER_DTD; |
11304 #ifdef DEBUG_PUSH | 11837 #ifdef DEBUG_PUSH |
11305 xmlGenericError(xmlGenericErrorContext, | 11838 xmlGenericError(xmlGenericErrorContext, |
11306 "PP: entering DTD\n"); | 11839 "PP: entering DTD\n"); |
11307 #endif | 11840 #endif |
11308 } else { | 11841 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
11321 #ifdef DEBUG_PUSH | 11854 #ifdef DEBUG_PUSH |
11322 xmlGenericError(xmlGenericErrorContext, | 11855 xmlGenericError(xmlGenericErrorContext, |
11323 "PP: entering PROLOG\n"); | 11856 "PP: entering PROLOG\n"); |
11324 #endif | 11857 #endif |
11325 } | 11858 } |
11326 } else if ((cur == '<') && (next == '!') && | 11859 } else if ((cur == '<') && (next == '!') && |
11327 (avail < 9)) { | 11860 (avail < 9)) { |
11328 goto done; | 11861 goto done; |
11329 } else { | 11862 } else { |
11330 ctxt->instate = XML_PARSER_START_TAG; | 11863 ctxt->instate = XML_PARSER_START_TAG; |
11331 » » ctxt->progressive = 1; | 11864 » » ctxt->progressive = XML_PARSER_START_TAG; |
11332 xmlParseGetLasts(ctxt, &lastlt, &lastgt); | 11865 xmlParseGetLasts(ctxt, &lastlt, &lastgt); |
11333 #ifdef DEBUG_PUSH | 11866 #ifdef DEBUG_PUSH |
11334 xmlGenericError(xmlGenericErrorContext, | 11867 xmlGenericError(xmlGenericErrorContext, |
11335 "PP: entering START_TAG\n"); | 11868 "PP: entering START_TAG\n"); |
11336 #endif | 11869 #endif |
11337 } | 11870 } |
11338 break; | 11871 break; |
11339 case XML_PARSER_PROLOG: | 11872 case XML_PARSER_PROLOG: |
11340 SKIP_BLANKS; | 11873 SKIP_BLANKS; |
11341 if (ctxt->input->buf == NULL) | 11874 if (ctxt->input->buf == NULL) |
11342 avail = ctxt->input->length - (ctxt->input->cur - ctxt->inpu
t->base); | 11875 avail = ctxt->input->length - (ctxt->input->cur - ctxt->inpu
t->base); |
11343 else | 11876 else |
11344 » » avail = ctxt->input->buf->buffer->use - (ctxt->input->cur -
ctxt->input->base); | 11877 » » avail = xmlBufUse(ctxt->input->buf->buffer) - |
11345 » » if (avail < 2) | 11878 (ctxt->input->cur - ctxt->input->base); |
| 11879 » » if (avail < 2) |
11346 goto done; | 11880 goto done; |
11347 cur = ctxt->input->cur[0]; | 11881 cur = ctxt->input->cur[0]; |
11348 next = ctxt->input->cur[1]; | 11882 next = ctxt->input->cur[1]; |
11349 if ((cur == '<') && (next == '?')) { | 11883 if ((cur == '<') && (next == '?')) { |
11350 if ((!terminate) && | 11884 if ((!terminate) && |
11351 » » (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) | 11885 » » (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) { |
| 11886 ctxt->progressive = XML_PARSER_PI; |
11352 goto done; | 11887 goto done; |
| 11888 } |
11353 #ifdef DEBUG_PUSH | 11889 #ifdef DEBUG_PUSH |
11354 xmlGenericError(xmlGenericErrorContext, | 11890 xmlGenericError(xmlGenericErrorContext, |
11355 "PP: Parsing PI\n"); | 11891 "PP: Parsing PI\n"); |
11356 #endif | 11892 #endif |
11357 xmlParsePI(ctxt); | 11893 xmlParsePI(ctxt); |
11358 if (ctxt->instate == XML_PARSER_EOF) | 11894 if (ctxt->instate == XML_PARSER_EOF) |
11359 goto done; | 11895 goto done; |
| 11896 ctxt->instate = XML_PARSER_PROLOG; |
| 11897 ctxt->progressive = 1; |
11360 } else if ((cur == '<') && (next == '!') && | 11898 } else if ((cur == '<') && (next == '!') && |
11361 (ctxt->input->cur[2] == '-') && (ctxt->input->cur[3] == '-')
) { | 11899 (ctxt->input->cur[2] == '-') && (ctxt->input->cur[3] == '-')
) { |
11362 if ((!terminate) && | 11900 if ((!terminate) && |
11363 » » (xmlParseLookupSequence(ctxt, '-', '-', '>') < 0)) | 11901 » » (xmlParseLookupSequence(ctxt, '-', '-', '>') < 0)) { |
| 11902 ctxt->progressive = XML_PARSER_COMMENT; |
11364 goto done; | 11903 goto done; |
| 11904 } |
11365 #ifdef DEBUG_PUSH | 11905 #ifdef DEBUG_PUSH |
11366 xmlGenericError(xmlGenericErrorContext, | 11906 xmlGenericError(xmlGenericErrorContext, |
11367 "PP: Parsing Comment\n"); | 11907 "PP: Parsing Comment\n"); |
11368 #endif | 11908 #endif |
11369 xmlParseComment(ctxt); | 11909 xmlParseComment(ctxt); |
11370 if (ctxt->instate == XML_PARSER_EOF) | 11910 if (ctxt->instate == XML_PARSER_EOF) |
11371 goto done; | 11911 goto done; |
11372 ctxt->instate = XML_PARSER_PROLOG; | 11912 ctxt->instate = XML_PARSER_PROLOG; |
| 11913 ctxt->progressive = 1; |
11373 } else if ((cur == '<') && (next == '!') && | 11914 } else if ((cur == '<') && (next == '!') && |
11374 (avail < 4)) { | 11915 (avail < 4)) { |
11375 goto done; | 11916 goto done; |
11376 } else { | 11917 } else { |
11377 ctxt->instate = XML_PARSER_START_TAG; | 11918 ctxt->instate = XML_PARSER_START_TAG; |
11378 if (ctxt->progressive == 0) | 11919 if (ctxt->progressive == 0) |
11379 » » » ctxt->progressive = 1; | 11920 » » » ctxt->progressive = XML_PARSER_START_TAG; |
11380 xmlParseGetLasts(ctxt, &lastlt, &lastgt); | 11921 xmlParseGetLasts(ctxt, &lastlt, &lastgt); |
11381 #ifdef DEBUG_PUSH | 11922 #ifdef DEBUG_PUSH |
11382 xmlGenericError(xmlGenericErrorContext, | 11923 xmlGenericError(xmlGenericErrorContext, |
11383 "PP: entering START_TAG\n"); | 11924 "PP: entering START_TAG\n"); |
11384 #endif | 11925 #endif |
11385 } | 11926 } |
11386 break; | 11927 break; |
11387 case XML_PARSER_EPILOG: | 11928 case XML_PARSER_EPILOG: |
11388 SKIP_BLANKS; | 11929 SKIP_BLANKS; |
11389 if (ctxt->input->buf == NULL) | 11930 if (ctxt->input->buf == NULL) |
11390 avail = ctxt->input->length - (ctxt->input->cur - ctxt->inpu
t->base); | 11931 avail = ctxt->input->length - (ctxt->input->cur - ctxt->inpu
t->base); |
11391 else | 11932 else |
11392 » » avail = ctxt->input->buf->buffer->use - (ctxt->input->cur -
ctxt->input->base); | 11933 » » avail = xmlBufUse(ctxt->input->buf->buffer) - |
| 11934 (ctxt->input->cur - ctxt->input->base); |
11393 if (avail < 2) | 11935 if (avail < 2) |
11394 goto done; | 11936 goto done; |
11395 cur = ctxt->input->cur[0]; | 11937 cur = ctxt->input->cur[0]; |
11396 next = ctxt->input->cur[1]; | 11938 next = ctxt->input->cur[1]; |
11397 if ((cur == '<') && (next == '?')) { | 11939 if ((cur == '<') && (next == '?')) { |
11398 if ((!terminate) && | 11940 if ((!terminate) && |
11399 » » (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) | 11941 » » (xmlParseLookupSequence(ctxt, '?', '>', 0) < 0)) { |
| 11942 ctxt->progressive = XML_PARSER_PI; |
11400 goto done; | 11943 goto done; |
| 11944 } |
11401 #ifdef DEBUG_PUSH | 11945 #ifdef DEBUG_PUSH |
11402 xmlGenericError(xmlGenericErrorContext, | 11946 xmlGenericError(xmlGenericErrorContext, |
11403 "PP: Parsing PI\n"); | 11947 "PP: Parsing PI\n"); |
11404 #endif | 11948 #endif |
11405 xmlParsePI(ctxt); | 11949 xmlParsePI(ctxt); |
11406 if (ctxt->instate == XML_PARSER_EOF) | 11950 if (ctxt->instate == XML_PARSER_EOF) |
11407 goto done; | 11951 goto done; |
11408 ctxt->instate = XML_PARSER_EPILOG; | 11952 ctxt->instate = XML_PARSER_EPILOG; |
| 11953 ctxt->progressive = 1; |
11409 } else if ((cur == '<') && (next == '!') && | 11954 } else if ((cur == '<') && (next == '!') && |
11410 (ctxt->input->cur[2] == '-') && (ctxt->input->cur[3] == '-')
) { | 11955 (ctxt->input->cur[2] == '-') && (ctxt->input->cur[3] == '-')
) { |
11411 if ((!terminate) && | 11956 if ((!terminate) && |
11412 » » (xmlParseLookupSequence(ctxt, '-', '-', '>') < 0)) | 11957 » » (xmlParseLookupSequence(ctxt, '-', '-', '>') < 0)) { |
| 11958 ctxt->progressive = XML_PARSER_COMMENT; |
11413 goto done; | 11959 goto done; |
| 11960 } |
11414 #ifdef DEBUG_PUSH | 11961 #ifdef DEBUG_PUSH |
11415 xmlGenericError(xmlGenericErrorContext, | 11962 xmlGenericError(xmlGenericErrorContext, |
11416 "PP: Parsing Comment\n"); | 11963 "PP: Parsing Comment\n"); |
11417 #endif | 11964 #endif |
11418 xmlParseComment(ctxt); | 11965 xmlParseComment(ctxt); |
11419 if (ctxt->instate == XML_PARSER_EOF) | 11966 if (ctxt->instate == XML_PARSER_EOF) |
11420 goto done; | 11967 goto done; |
11421 ctxt->instate = XML_PARSER_EPILOG; | 11968 ctxt->instate = XML_PARSER_EPILOG; |
| 11969 ctxt->progressive = 1; |
11422 } else if ((cur == '<') && (next == '!') && | 11970 } else if ((cur == '<') && (next == '!') && |
11423 (avail < 4)) { | 11971 (avail < 4)) { |
11424 goto done; | 11972 goto done; |
11425 } else { | 11973 } else { |
11426 xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); | 11974 xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); |
11427 ctxt->instate = XML_PARSER_EOF; | 11975 ctxt->instate = XML_PARSER_EOF; |
11428 #ifdef DEBUG_PUSH | 11976 #ifdef DEBUG_PUSH |
11429 xmlGenericError(xmlGenericErrorContext, | 11977 xmlGenericError(xmlGenericErrorContext, |
11430 "PP: entering EOF\n"); | 11978 "PP: entering EOF\n"); |
11431 #endif | 11979 #endif |
11432 if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) | 11980 if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) |
11433 ctxt->sax->endDocument(ctxt->userData); | 11981 ctxt->sax->endDocument(ctxt->userData); |
11434 goto done; | 11982 goto done; |
11435 } | 11983 } |
11436 break; | 11984 break; |
11437 case XML_PARSER_DTD: { | 11985 case XML_PARSER_DTD: { |
11438 /* | 11986 /* |
11439 * Sorry but progressive parsing of the internal subset | 11987 * Sorry but progressive parsing of the internal subset |
11440 * is not expected to be supported. We first check that | 11988 * is not expected to be supported. We first check that |
11441 * the full content of the internal subset is available and | 11989 * the full content of the internal subset is available and |
11442 * the parsing is launched only at that point. | 11990 * the parsing is launched only at that point. |
11443 * Internal subset ends up with "']' S? '>'" in an unescaped | 11991 * Internal subset ends up with "']' S? '>'" in an unescaped |
11444 * section and not in a ']]>' sequence which are conditional | 11992 * section and not in a ']]>' sequence which are conditional |
11445 * sections (whoever argued to keep that crap in XML deserve | 11993 * sections (whoever argued to keep that crap in XML deserve |
11446 * a place in hell !). | 11994 * a place in hell !). |
11447 */ | 11995 */ |
11448 int base, i; | 11996 int base, i; |
11449 xmlChar *buf; | 11997 xmlChar *buf; |
11450 xmlChar quote = 0; | 11998 xmlChar quote = 0; |
| 11999 size_t use; |
11451 | 12000 |
11452 base = ctxt->input->cur - ctxt->input->base; | 12001 base = ctxt->input->cur - ctxt->input->base; |
11453 if (base < 0) return(0); | 12002 if (base < 0) return(0); |
11454 if (ctxt->checkIndex > base) | 12003 if (ctxt->checkIndex > base) |
11455 base = ctxt->checkIndex; | 12004 base = ctxt->checkIndex; |
11456 » » buf = ctxt->input->buf->buffer->content; | 12005 » » buf = xmlBufContent(ctxt->input->buf->buffer); |
11457 » » for (;(unsigned int) base < ctxt->input->buf->buffer->use; | 12006 use = xmlBufUse(ctxt->input->buf->buffer); |
11458 » » base++) { | 12007 » » for (;(unsigned int) base < use; base++) { |
11459 if (quote != 0) { | 12008 if (quote != 0) { |
11460 if (buf[base] == quote) | 12009 if (buf[base] == quote) |
11461 quote = 0; | 12010 quote = 0; |
11462 » » » continue; | 12011 » » » continue; |
11463 } | 12012 } |
11464 if ((quote == 0) && (buf[base] == '<')) { | 12013 if ((quote == 0) && (buf[base] == '<')) { |
11465 int found = 0; | 12014 int found = 0; |
11466 /* special handling of comments */ | 12015 /* special handling of comments */ |
11467 » » if (((unsigned int) base + 4 < | 12016 » » if (((unsigned int) base + 4 < use) && |
11468 » » » ctxt->input->buf->buffer->use) && | |
11469 (buf[base + 1] == '!') && | 12017 (buf[base + 1] == '!') && |
11470 (buf[base + 2] == '-') && | 12018 (buf[base + 2] == '-') && |
11471 (buf[base + 3] == '-')) { | 12019 (buf[base + 3] == '-')) { |
11472 » » » for (;(unsigned int) base + 3 < | 12020 » » » for (;(unsigned int) base + 3 < use; base++) { |
11473 » » » ctxt->input->buf->buffer->use; base++) { | |
11474 if ((buf[base] == '-') && | 12021 if ((buf[base] == '-') && |
11475 (buf[base + 1] == '-') && | 12022 (buf[base + 1] == '-') && |
11476 (buf[base + 2] == '>')) { | 12023 (buf[base + 2] == '>')) { |
11477 found = 1; | 12024 found = 1; |
11478 base += 2; | 12025 base += 2; |
11479 break; | 12026 break; |
11480 } | 12027 } |
11481 } | 12028 } |
11482 if (!found) { | 12029 if (!found) { |
11483 #if 0 | 12030 #if 0 |
(...skipping 10 matching lines...) Expand all Loading... |
11494 } | 12041 } |
11495 if (buf[base] == '\'') { | 12042 if (buf[base] == '\'') { |
11496 quote = '\''; | 12043 quote = '\''; |
11497 continue; | 12044 continue; |
11498 } | 12045 } |
11499 if (buf[base] == ']') { | 12046 if (buf[base] == ']') { |
11500 #if 0 | 12047 #if 0 |
11501 fprintf(stderr, "%c%c%c%c: ", buf[base], | 12048 fprintf(stderr, "%c%c%c%c: ", buf[base], |
11502 buf[base + 1], buf[base + 2], buf[base + 3]); | 12049 buf[base + 1], buf[base + 2], buf[base + 3]); |
11503 #endif | 12050 #endif |
11504 » » if ((unsigned int) base +1 >= | 12051 » » if ((unsigned int) base +1 >= use) |
11505 » » ctxt->input->buf->buffer->use) | |
11506 break; | 12052 break; |
11507 if (buf[base + 1] == ']') { | 12053 if (buf[base + 1] == ']') { |
11508 /* conditional crap, skip both ']' ! */ | 12054 /* conditional crap, skip both ']' ! */ |
11509 base++; | 12055 base++; |
11510 continue; | 12056 continue; |
11511 } | 12057 } |
11512 » » for (i = 1; | 12058 » » for (i = 1; (unsigned int) base + i < use; i++) { |
11513 » » (unsigned int) base + i < ctxt->input->buf->buffer->use; | |
11514 » » i++) { | |
11515 if (buf[base + i] == '>') { | 12059 if (buf[base + i] == '>') { |
11516 #if 0 | 12060 #if 0 |
11517 fprintf(stderr, "found\n"); | 12061 fprintf(stderr, "found\n"); |
11518 #endif | 12062 #endif |
11519 goto found_end_int_subset; | 12063 goto found_end_int_subset; |
11520 } | 12064 } |
11521 if (!IS_BLANK_CH(buf[base + i])) { | 12065 if (!IS_BLANK_CH(buf[base + i])) { |
11522 #if 0 | 12066 #if 0 |
11523 fprintf(stderr, "not found\n"); | 12067 fprintf(stderr, "not found\n"); |
11524 #endif | 12068 #endif |
11525 goto not_end_of_int_subset; | 12069 goto not_end_of_int_subset; |
11526 } | 12070 } |
11527 } | 12071 } |
11528 #if 0 | 12072 #if 0 |
11529 fprintf(stderr, "end of stream\n"); | 12073 fprintf(stderr, "end of stream\n"); |
11530 #endif | 12074 #endif |
11531 break; | 12075 break; |
11532 | 12076 |
11533 } | 12077 } |
11534 not_end_of_int_subset: | 12078 not_end_of_int_subset: |
11535 continue; /* for */ | 12079 continue; /* for */ |
11536 } | 12080 } |
11537 /* | 12081 /* |
11538 * We didn't found the end of the Internal subset | 12082 * We didn't found the end of the Internal subset |
11539 */ | 12083 */ |
| 12084 if (quote == 0) |
| 12085 ctxt->checkIndex = base; |
| 12086 else |
| 12087 ctxt->checkIndex = 0; |
11540 #ifdef DEBUG_PUSH | 12088 #ifdef DEBUG_PUSH |
11541 if (next == 0) | 12089 if (next == 0) |
11542 xmlGenericError(xmlGenericErrorContext, | 12090 xmlGenericError(xmlGenericErrorContext, |
11543 "PP: lookup of int subset end filed\n"); | 12091 "PP: lookup of int subset end filed\n"); |
11544 #endif | 12092 #endif |
11545 goto done; | 12093 goto done; |
11546 | 12094 |
11547 found_end_int_subset: | 12095 found_end_int_subset: |
| 12096 ctxt->checkIndex = 0; |
11548 xmlParseInternalSubset(ctxt); | 12097 xmlParseInternalSubset(ctxt); |
11549 if (ctxt->instate == XML_PARSER_EOF) | 12098 if (ctxt->instate == XML_PARSER_EOF) |
11550 goto done; | 12099 goto done; |
11551 ctxt->inSubset = 2; | 12100 ctxt->inSubset = 2; |
11552 if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && | 12101 if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && |
11553 (ctxt->sax->externalSubset != NULL)) | 12102 (ctxt->sax->externalSubset != NULL)) |
11554 ctxt->sax->externalSubset(ctxt->userData, ctxt->intSubName, | 12103 ctxt->sax->externalSubset(ctxt->userData, ctxt->intSubName, |
11555 ctxt->extSubSystem, ctxt->extSubURI); | 12104 ctxt->extSubSystem, ctxt->extSubURI); |
11556 ctxt->inSubset = 0; | 12105 ctxt->inSubset = 0; |
11557 xmlCleanSpecialAttr(ctxt); | 12106 xmlCleanSpecialAttr(ctxt); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11632 xmlGenericError(xmlGenericErrorContext, | 12181 xmlGenericError(xmlGenericErrorContext, |
11633 "PP: internal error, state == PUBLIC_LITERAL\n"); | 12182 "PP: internal error, state == PUBLIC_LITERAL\n"); |
11634 ctxt->instate = XML_PARSER_START_TAG; | 12183 ctxt->instate = XML_PARSER_START_TAG; |
11635 #ifdef DEBUG_PUSH | 12184 #ifdef DEBUG_PUSH |
11636 xmlGenericError(xmlGenericErrorContext, | 12185 xmlGenericError(xmlGenericErrorContext, |
11637 "PP: entering START_TAG\n"); | 12186 "PP: entering START_TAG\n"); |
11638 #endif | 12187 #endif |
11639 break; | 12188 break; |
11640 } | 12189 } |
11641 } | 12190 } |
11642 done: | 12191 done: |
11643 #ifdef DEBUG_PUSH | 12192 #ifdef DEBUG_PUSH |
11644 xmlGenericError(xmlGenericErrorContext, "PP: done %d\n", ret); | 12193 xmlGenericError(xmlGenericErrorContext, "PP: done %d\n", ret); |
11645 #endif | 12194 #endif |
11646 return(ret); | 12195 return(ret); |
11647 encoding_error: | 12196 encoding_error: |
11648 { | 12197 { |
11649 char buffer[150]; | 12198 char buffer[150]; |
11650 | 12199 |
11651 snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", | 12200 snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", |
11652 ctxt->input->cur[0], ctxt->input->cur[1], | 12201 ctxt->input->cur[0], ctxt->input->cur[1], |
11653 ctxt->input->cur[2], ctxt->input->cur[3]); | 12202 ctxt->input->cur[2], ctxt->input->cur[3]); |
11654 __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, | 12203 __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, |
11655 "Input is not proper UTF-8, indicate encoding !\n%s", | 12204 "Input is not proper UTF-8, indicate encoding !\n%s", |
11656 BAD_CAST buffer, NULL); | 12205 BAD_CAST buffer, NULL); |
11657 } | 12206 } |
11658 return(0); | 12207 return(0); |
11659 } | 12208 } |
11660 | 12209 |
11661 /** | 12210 /** |
| 12211 * xmlParseCheckTransition: |
| 12212 * @ctxt: an XML parser context |
| 12213 * @chunk: a char array |
| 12214 * @size: the size in byte of the chunk |
| 12215 * |
| 12216 * Check depending on the current parser state if the chunk given must be |
| 12217 * processed immediately or one need more data to advance on parsing. |
| 12218 * |
| 12219 * Returns -1 in case of error, 0 if the push is not needed and 1 if needed |
| 12220 */ |
| 12221 static int |
| 12222 xmlParseCheckTransition(xmlParserCtxtPtr ctxt, const char *chunk, int size) { |
| 12223 if ((ctxt == NULL) || (chunk == NULL) || (size < 0)) |
| 12224 return(-1); |
| 12225 if (ctxt->instate == XML_PARSER_START_TAG) { |
| 12226 if (memchr(chunk, '>', size) != NULL) |
| 12227 return(1); |
| 12228 return(0); |
| 12229 } |
| 12230 if (ctxt->progressive == XML_PARSER_COMMENT) { |
| 12231 if (memchr(chunk, '>', size) != NULL) |
| 12232 return(1); |
| 12233 return(0); |
| 12234 } |
| 12235 if (ctxt->instate == XML_PARSER_CDATA_SECTION) { |
| 12236 if (memchr(chunk, '>', size) != NULL) |
| 12237 return(1); |
| 12238 return(0); |
| 12239 } |
| 12240 if (ctxt->progressive == XML_PARSER_PI) { |
| 12241 if (memchr(chunk, '>', size) != NULL) |
| 12242 return(1); |
| 12243 return(0); |
| 12244 } |
| 12245 if (ctxt->instate == XML_PARSER_END_TAG) { |
| 12246 if (memchr(chunk, '>', size) != NULL) |
| 12247 return(1); |
| 12248 return(0); |
| 12249 } |
| 12250 if ((ctxt->progressive == XML_PARSER_DTD) || |
| 12251 (ctxt->instate == XML_PARSER_DTD)) { |
| 12252 if (memchr(chunk, '>', size) != NULL) |
| 12253 return(1); |
| 12254 return(0); |
| 12255 } |
| 12256 return(1); |
| 12257 } |
| 12258 |
| 12259 /** |
11662 * xmlParseChunk: | 12260 * xmlParseChunk: |
11663 * @ctxt: an XML parser context | 12261 * @ctxt: an XML parser context |
11664 * @chunk: an char array | 12262 * @chunk: an char array |
11665 * @size: the size in byte of the chunk | 12263 * @size: the size in byte of the chunk |
11666 * @terminate: last chunk indicator | 12264 * @terminate: last chunk indicator |
11667 * | 12265 * |
11668 * Parse a Chunk of memory | 12266 * Parse a Chunk of memory |
11669 * | 12267 * |
11670 * Returns zero if no error, the xmlParserErrors otherwise. | 12268 * Returns zero if no error, the xmlParserErrors otherwise. |
11671 */ | 12269 */ |
11672 int | 12270 int |
11673 xmlParseChunk(xmlParserCtxtPtr ctxt, const char *chunk, int size, | 12271 xmlParseChunk(xmlParserCtxtPtr ctxt, const char *chunk, int size, |
11674 int terminate) { | 12272 int terminate) { |
11675 int end_in_lf = 0; | 12273 int end_in_lf = 0; |
11676 int remain = 0; | 12274 int remain = 0; |
| 12275 size_t old_avail = 0; |
| 12276 size_t avail = 0; |
11677 | 12277 |
11678 if (ctxt == NULL) | 12278 if (ctxt == NULL) |
11679 return(XML_ERR_INTERNAL_ERROR); | 12279 return(XML_ERR_INTERNAL_ERROR); |
11680 if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) | 12280 if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) |
11681 return(ctxt->errNo); | 12281 return(ctxt->errNo); |
11682 if (ctxt->instate == XML_PARSER_EOF) | 12282 if (ctxt->instate == XML_PARSER_EOF) |
11683 return(-1); | 12283 return(-1); |
11684 if (ctxt->instate == XML_PARSER_START) | 12284 if (ctxt->instate == XML_PARSER_START) |
11685 xmlDetectSAX2(ctxt); | 12285 xmlDetectSAX2(ctxt); |
11686 if ((size > 0) && (chunk != NULL) && (!terminate) && | 12286 if ((size > 0) && (chunk != NULL) && (!terminate) && |
11687 (chunk[size - 1] == '\r')) { | 12287 (chunk[size - 1] == '\r')) { |
11688 end_in_lf = 1; | 12288 end_in_lf = 1; |
11689 size--; | 12289 size--; |
11690 } | 12290 } |
11691 | 12291 |
11692 xmldecl_done: | 12292 xmldecl_done: |
11693 | 12293 |
11694 if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && | 12294 if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && |
11695 (ctxt->input->buf != NULL) && (ctxt->instate != XML_PARSER_EOF)) { | 12295 (ctxt->input->buf != NULL) && (ctxt->instate != XML_PARSER_EOF)) { |
11696 » int base = ctxt->input->base - ctxt->input->buf->buffer->content; | 12296 » size_t base = xmlBufGetInputBase(ctxt->input->buf->buffer, ctxt->input); |
11697 » int cur = ctxt->input->cur - ctxt->input->base; | 12297 » size_t cur = ctxt->input->cur - ctxt->input->base; |
11698 int res; | 12298 int res; |
11699 | 12299 |
| 12300 old_avail = xmlBufUse(ctxt->input->buf->buffer); |
11700 /* | 12301 /* |
11701 * Specific handling if we autodetected an encoding, we should not | 12302 * Specific handling if we autodetected an encoding, we should not |
11702 * push more than the first line ... which depend on the encoding | 12303 * push more than the first line ... which depend on the encoding |
11703 * And only push the rest once the final encoding was detected | 12304 * And only push the rest once the final encoding was detected |
11704 */ | 12305 */ |
11705 if ((ctxt->instate == XML_PARSER_START) && (ctxt->input != NULL) && | 12306 if ((ctxt->instate == XML_PARSER_START) && (ctxt->input != NULL) && |
11706 (ctxt->input->buf != NULL) && (ctxt->input->buf->encoder != NULL)) { | 12307 (ctxt->input->buf != NULL) && (ctxt->input->buf->encoder != NULL)) { |
11707 unsigned int len = 45; | 12308 unsigned int len = 45; |
11708 | 12309 |
11709 if ((xmlStrcasestr(BAD_CAST ctxt->input->buf->encoder->name, | 12310 if ((xmlStrcasestr(BAD_CAST ctxt->input->buf->encoder->name, |
11710 BAD_CAST "UTF-16")) || | 12311 BAD_CAST "UTF-16")) || |
11711 (xmlStrcasestr(BAD_CAST ctxt->input->buf->encoder->name, | 12312 (xmlStrcasestr(BAD_CAST ctxt->input->buf->encoder->name, |
11712 BAD_CAST "UTF16"))) | 12313 BAD_CAST "UTF16"))) |
11713 len = 90; | 12314 len = 90; |
11714 else if ((xmlStrcasestr(BAD_CAST ctxt->input->buf->encoder->name, | 12315 else if ((xmlStrcasestr(BAD_CAST ctxt->input->buf->encoder->name, |
11715 BAD_CAST "UCS-4")) || | 12316 BAD_CAST "UCS-4")) || |
11716 (xmlStrcasestr(BAD_CAST ctxt->input->buf->encoder->name, | 12317 (xmlStrcasestr(BAD_CAST ctxt->input->buf->encoder->name, |
11717 BAD_CAST "UCS4"))) | 12318 BAD_CAST "UCS4"))) |
11718 len = 180; | 12319 len = 180; |
11719 | 12320 |
11720 if (ctxt->input->buf->rawconsumed < len) | 12321 if (ctxt->input->buf->rawconsumed < len) |
11721 len -= ctxt->input->buf->rawconsumed; | 12322 len -= ctxt->input->buf->rawconsumed; |
11722 | 12323 |
11723 /* | 12324 /* |
11724 * Change size for reading the initial declaration only | 12325 * Change size for reading the initial declaration only |
11725 * if size is greater than len. Otherwise, memmove in xmlBufferAdd | 12326 * if size is greater than len. Otherwise, memmove in xmlBufferAdd |
11726 * will blindly copy extra bytes from memory. | 12327 * will blindly copy extra bytes from memory. |
11727 */ | 12328 */ |
11728 if (size > len) { | 12329 if ((unsigned int) size > len) { |
11729 remain = size - len; | 12330 remain = size - len; |
11730 size = len; | 12331 size = len; |
11731 } else { | 12332 } else { |
11732 remain = 0; | 12333 remain = 0; |
11733 } | 12334 } |
11734 } | 12335 } |
11735 » res =xmlParserInputBufferPush(ctxt->input->buf, size, chunk); | 12336 » res = xmlParserInputBufferPush(ctxt->input->buf, size, chunk); |
11736 if (res < 0) { | 12337 if (res < 0) { |
11737 ctxt->errNo = XML_PARSER_EOF; | 12338 ctxt->errNo = XML_PARSER_EOF; |
11738 ctxt->disableSAX = 1; | 12339 ctxt->disableSAX = 1; |
11739 return (XML_PARSER_EOF); | 12340 return (XML_PARSER_EOF); |
11740 } | 12341 } |
11741 » ctxt->input->base = ctxt->input->buf->buffer->content + base; | 12342 xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, base, cur); |
11742 » ctxt->input->cur = ctxt->input->base + cur; | |
11743 » ctxt->input->end = | |
11744 » &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer->use]; | |
11745 #ifdef DEBUG_PUSH | 12343 #ifdef DEBUG_PUSH |
11746 xmlGenericError(xmlGenericErrorContext, "PP: pushed %d\n", size); | 12344 xmlGenericError(xmlGenericErrorContext, "PP: pushed %d\n", size); |
11747 #endif | 12345 #endif |
11748 | 12346 |
11749 } else if (ctxt->instate != XML_PARSER_EOF) { | 12347 } else if (ctxt->instate != XML_PARSER_EOF) { |
11750 if ((ctxt->input != NULL) && ctxt->input->buf != NULL) { | 12348 if ((ctxt->input != NULL) && ctxt->input->buf != NULL) { |
11751 xmlParserInputBufferPtr in = ctxt->input->buf; | 12349 xmlParserInputBufferPtr in = ctxt->input->buf; |
11752 if ((in->encoder != NULL) && (in->buffer != NULL) && | 12350 if ((in->encoder != NULL) && (in->buffer != NULL) && |
11753 (in->raw != NULL)) { | 12351 (in->raw != NULL)) { |
11754 int nbchars; | 12352 int nbchars; |
| 12353 size_t base = xmlBufGetInputBase(in->buffer, ctxt->input); |
| 12354 size_t current = ctxt->input->cur - ctxt->input->base; |
11755 | 12355 |
11756 » » nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); | 12356 » » nbchars = xmlCharEncInput(in, terminate); |
11757 if (nbchars < 0) { | 12357 if (nbchars < 0) { |
11758 /* TODO 2.6.0 */ | 12358 /* TODO 2.6.0 */ |
11759 xmlGenericError(xmlGenericErrorContext, | 12359 xmlGenericError(xmlGenericErrorContext, |
11760 "xmlParseChunk: encoder error\n"); | 12360 "xmlParseChunk: encoder error\n"); |
11761 return(XML_ERR_INVALID_ENCODING); | 12361 return(XML_ERR_INVALID_ENCODING); |
11762 } | 12362 } |
| 12363 xmlBufSetInputBaseCur(in->buffer, ctxt->input, base, current); |
11763 } | 12364 } |
11764 } | 12365 } |
11765 } | 12366 } |
11766 if (remain != 0) | 12367 if (remain != 0) { |
11767 xmlParseTryOrFinish(ctxt, 0); | 12368 xmlParseTryOrFinish(ctxt, 0); |
11768 else | 12369 } else { |
11769 xmlParseTryOrFinish(ctxt, terminate); | 12370 if ((ctxt->input != NULL) && (ctxt->input->buf != NULL)) |
| 12371 avail = xmlBufUse(ctxt->input->buf->buffer); |
| 12372 /* |
| 12373 * Depending on the current state it may not be such |
| 12374 * a good idea to try parsing if there is nothing in the chunk |
| 12375 * which would be worth doing a parser state transition and we |
| 12376 * need to wait for more data |
| 12377 */ |
| 12378 if ((terminate) || (avail > XML_MAX_TEXT_LENGTH) || |
| 12379 (old_avail == 0) || (avail == 0) || |
| 12380 (xmlParseCheckTransition(ctxt, |
| 12381 (const char *)&ctxt->input->base[old_avail], |
| 12382 avail - old_avail))) |
| 12383 xmlParseTryOrFinish(ctxt, terminate); |
| 12384 } |
11770 if (ctxt->instate == XML_PARSER_EOF) | 12385 if (ctxt->instate == XML_PARSER_EOF) |
11771 return(ctxt->errNo); | 12386 return(ctxt->errNo); |
| 12387 |
| 12388 if ((ctxt->input != NULL) && |
| 12389 (((ctxt->input->end - ctxt->input->cur) > XML_MAX_LOOKUP_LIMIT) || |
| 12390 ((ctxt->input->cur - ctxt->input->base) > XML_MAX_LOOKUP_LIMIT)) && |
| 12391 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 12392 xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup"); |
| 12393 ctxt->instate = XML_PARSER_EOF; |
| 12394 } |
11772 if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) | 12395 if ((ctxt->errNo != XML_ERR_OK) && (ctxt->disableSAX == 1)) |
11773 return(ctxt->errNo); | 12396 return(ctxt->errNo); |
11774 | 12397 |
11775 if (remain != 0) { | 12398 if (remain != 0) { |
11776 chunk += size; | 12399 chunk += size; |
11777 size = remain; | 12400 size = remain; |
11778 remain = 0; | 12401 remain = 0; |
11779 goto xmldecl_done; | 12402 goto xmldecl_done; |
11780 } | 12403 } |
11781 if ((end_in_lf == 1) && (ctxt->input != NULL) && | 12404 if ((end_in_lf == 1) && (ctxt->input != NULL) && |
11782 (ctxt->input->buf != NULL)) { | 12405 (ctxt->input->buf != NULL)) { |
| 12406 size_t base = xmlBufGetInputBase(ctxt->input->buf->buffer, |
| 12407 ctxt->input); |
| 12408 size_t current = ctxt->input->cur - ctxt->input->base; |
| 12409 |
11783 xmlParserInputBufferPush(ctxt->input->buf, 1, "\r"); | 12410 xmlParserInputBufferPush(ctxt->input->buf, 1, "\r"); |
| 12411 |
| 12412 xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, |
| 12413 base, current); |
11784 } | 12414 } |
11785 if (terminate) { | 12415 if (terminate) { |
11786 /* | 12416 /* |
11787 * Check for termination | 12417 * Check for termination |
11788 */ | 12418 */ |
11789 » int avail = 0; | 12419 » int cur_avail = 0; |
11790 | 12420 |
11791 if (ctxt->input != NULL) { | 12421 if (ctxt->input != NULL) { |
11792 if (ctxt->input->buf == NULL) | 12422 if (ctxt->input->buf == NULL) |
11793 » » avail = ctxt->input->length - | 12423 » » cur_avail = ctxt->input->length - |
11794 » » » (ctxt->input->cur - ctxt->input->base); | 12424 » » » (ctxt->input->cur - ctxt->input->base); |
11795 else | 12425 else |
11796 » » avail = ctxt->input->buf->buffer->use - | 12426 » » cur_avail = xmlBufUse(ctxt->input->buf->buffer) - |
11797 » » » (ctxt->input->cur - ctxt->input->base); | 12427 » » » (ctxt->input->cur - ctxt->input->base); |
11798 } | 12428 } |
11799 » » » | 12429 |
11800 if ((ctxt->instate != XML_PARSER_EOF) && | 12430 if ((ctxt->instate != XML_PARSER_EOF) && |
11801 (ctxt->instate != XML_PARSER_EPILOG)) { | 12431 (ctxt->instate != XML_PARSER_EPILOG)) { |
11802 xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); | 12432 xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); |
11803 » } | 12433 » } |
11804 » if ((ctxt->instate == XML_PARSER_EPILOG) && (avail > 0)) { | 12434 » if ((ctxt->instate == XML_PARSER_EPILOG) && (cur_avail > 0)) { |
11805 xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); | 12435 xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL); |
11806 } | 12436 } |
11807 if (ctxt->instate != XML_PARSER_EOF) { | 12437 if (ctxt->instate != XML_PARSER_EOF) { |
11808 if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) | 12438 if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) |
11809 ctxt->sax->endDocument(ctxt->userData); | 12439 ctxt->sax->endDocument(ctxt->userData); |
11810 } | 12440 } |
11811 ctxt->instate = XML_PARSER_EOF; | 12441 ctxt->instate = XML_PARSER_EOF; |
11812 } | 12442 } |
11813 return((xmlParserErrors) ctxt->errNo);» | 12443 if (ctxt->wellFormed == 0) |
| 12444 » return((xmlParserErrors) ctxt->errNo); |
| 12445 else |
| 12446 return(0); |
11814 } | 12447 } |
11815 | 12448 |
11816 /************************************************************************ | 12449 /************************************************************************ |
11817 * * | 12450 * * |
11818 * » » I/O front end functions to the parser» » » * | 12451 *» » I/O front end functions to the parser» » » * |
11819 * * | 12452 * * |
11820 ************************************************************************/ | 12453 ************************************************************************/ |
11821 | 12454 |
11822 /** | 12455 /** |
11823 * xmlCreatePushParserCtxt: | 12456 * xmlCreatePushParserCtxt: |
11824 * @sax: a SAX handler | 12457 * @sax: a SAX handler |
11825 * @user_data: The user data returned on SAX callbacks | 12458 * @user_data: The user data returned on SAX callbacks |
11826 * @chunk: a pointer to an array of chars | 12459 * @chunk: a pointer to an array of chars |
11827 * @size: number of chars in the array | 12460 * @size: number of chars in the array |
11828 * @filename: an optional file name or URI | 12461 * @filename: an optional file name or URI |
11829 * | 12462 * |
11830 * Create a parser context for using the XML parser in push mode. | 12463 * Create a parser context for using the XML parser in push mode. |
11831 * If @buffer and @size are non-NULL, the data is used to detect | 12464 * If @buffer and @size are non-NULL, the data is used to detect |
11832 * the encoding. The remaining characters will be parsed so they | 12465 * the encoding. The remaining characters will be parsed so they |
11833 * don't need to be fed in again through xmlParseChunk. | 12466 * don't need to be fed in again through xmlParseChunk. |
11834 * To allow content encoding detection, @size should be >= 4 | 12467 * To allow content encoding detection, @size should be >= 4 |
11835 * The value of @filename is used for fetching external entities | 12468 * The value of @filename is used for fetching external entities |
11836 * and error/warning reports. | 12469 * and error/warning reports. |
11837 * | 12470 * |
11838 * Returns the new parser context or NULL | 12471 * Returns the new parser context or NULL |
11839 */ | 12472 */ |
11840 | 12473 |
11841 xmlParserCtxtPtr | 12474 xmlParserCtxtPtr |
11842 xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data, | 12475 xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data, |
11843 const char *chunk, int size, const char *filename) { | 12476 const char *chunk, int size, const char *filename) { |
11844 xmlParserCtxtPtr ctxt; | 12477 xmlParserCtxtPtr ctxt; |
11845 xmlParserInputPtr inputStream; | 12478 xmlParserInputPtr inputStream; |
11846 xmlParserInputBufferPtr buf; | 12479 xmlParserInputBufferPtr buf; |
11847 xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; | 12480 xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; |
11848 | 12481 |
11849 /* | 12482 /* |
11850 * plug some encoding conversion routines | 12483 * plug some encoding conversion routines |
11851 */ | 12484 */ |
11852 if ((chunk != NULL) && (size >= 4)) | 12485 if ((chunk != NULL) && (size >= 4)) |
(...skipping 28 matching lines...) Expand all Loading... |
11881 xmlFreeParserCtxt(ctxt); | 12514 xmlFreeParserCtxt(ctxt); |
11882 return(NULL); | 12515 return(NULL); |
11883 } | 12516 } |
11884 memset(ctxt->sax, 0, sizeof(xmlSAXHandler)); | 12517 memset(ctxt->sax, 0, sizeof(xmlSAXHandler)); |
11885 if (sax->initialized == XML_SAX2_MAGIC) | 12518 if (sax->initialized == XML_SAX2_MAGIC) |
11886 memcpy(ctxt->sax, sax, sizeof(xmlSAXHandler)); | 12519 memcpy(ctxt->sax, sax, sizeof(xmlSAXHandler)); |
11887 else | 12520 else |
11888 memcpy(ctxt->sax, sax, sizeof(xmlSAXHandlerV1)); | 12521 memcpy(ctxt->sax, sax, sizeof(xmlSAXHandlerV1)); |
11889 if (user_data != NULL) | 12522 if (user_data != NULL) |
11890 ctxt->userData = user_data; | 12523 ctxt->userData = user_data; |
11891 }» | 12524 } |
11892 if (filename == NULL) { | 12525 if (filename == NULL) { |
11893 ctxt->directory = NULL; | 12526 ctxt->directory = NULL; |
11894 } else { | 12527 } else { |
11895 ctxt->directory = xmlParserGetDirectory(filename); | 12528 ctxt->directory = xmlParserGetDirectory(filename); |
11896 } | 12529 } |
11897 | 12530 |
11898 inputStream = xmlNewInputStream(ctxt); | 12531 inputStream = xmlNewInputStream(ctxt); |
11899 if (inputStream == NULL) { | 12532 if (inputStream == NULL) { |
11900 xmlFreeParserCtxt(ctxt); | 12533 xmlFreeParserCtxt(ctxt); |
11901 xmlFreeParserInputBuffer(buf); | 12534 xmlFreeParserInputBuffer(buf); |
11902 return(NULL); | 12535 return(NULL); |
11903 } | 12536 } |
11904 | 12537 |
11905 if (filename == NULL) | 12538 if (filename == NULL) |
11906 inputStream->filename = NULL; | 12539 inputStream->filename = NULL; |
11907 else { | 12540 else { |
11908 inputStream->filename = (char *) | 12541 inputStream->filename = (char *) |
11909 xmlCanonicPath((const xmlChar *) filename); | 12542 xmlCanonicPath((const xmlChar *) filename); |
11910 if (inputStream->filename == NULL) { | 12543 if (inputStream->filename == NULL) { |
11911 xmlFreeParserCtxt(ctxt); | 12544 xmlFreeParserCtxt(ctxt); |
11912 xmlFreeParserInputBuffer(buf); | 12545 xmlFreeParserInputBuffer(buf); |
11913 return(NULL); | 12546 return(NULL); |
11914 } | 12547 } |
11915 } | 12548 } |
11916 inputStream->buf = buf; | 12549 inputStream->buf = buf; |
11917 inputStream->base = inputStream->buf->buffer->content; | 12550 xmlBufResetInput(inputStream->buf->buffer, inputStream); |
11918 inputStream->cur = inputStream->buf->buffer->content; | |
11919 inputStream->end = | |
11920 » &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; | |
11921 | |
11922 inputPush(ctxt, inputStream); | 12551 inputPush(ctxt, inputStream); |
11923 | 12552 |
11924 /* | 12553 /* |
11925 * If the caller didn't provide an initial 'chunk' for determining | 12554 * If the caller didn't provide an initial 'chunk' for determining |
11926 * the encoding, we set the context to XML_CHAR_ENCODING_NONE so | 12555 * the encoding, we set the context to XML_CHAR_ENCODING_NONE so |
11927 * that it can be automatically determined later | 12556 * that it can be automatically determined later |
11928 */ | 12557 */ |
11929 if ((size == 0) || (chunk == NULL)) { | 12558 if ((size == 0) || (chunk == NULL)) { |
11930 ctxt->charset = XML_CHAR_ENCODING_NONE; | 12559 ctxt->charset = XML_CHAR_ENCODING_NONE; |
11931 } else if ((ctxt->input != NULL) && (ctxt->input->buf != NULL)) { | 12560 } else if ((ctxt->input != NULL) && (ctxt->input->buf != NULL)) { |
11932 » int base = ctxt->input->base - ctxt->input->buf->buffer->content; | 12561 » size_t base = xmlBufGetInputBase(ctxt->input->buf->buffer, ctxt->input); |
11933 » int cur = ctxt->input->cur - ctxt->input->base; | 12562 » size_t cur = ctxt->input->cur - ctxt->input->base; |
11934 | 12563 |
11935 » xmlParserInputBufferPush(ctxt->input->buf, size, chunk);» | 12564 » xmlParserInputBufferPush(ctxt->input->buf, size, chunk); |
11936 | 12565 |
11937 » ctxt->input->base = ctxt->input->buf->buffer->content + base; | 12566 xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, base, cur); |
11938 » ctxt->input->cur = ctxt->input->base + cur; | |
11939 » ctxt->input->end = | |
11940 » &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer->use]; | |
11941 #ifdef DEBUG_PUSH | 12567 #ifdef DEBUG_PUSH |
11942 xmlGenericError(xmlGenericErrorContext, "PP: pushed %d\n", size); | 12568 xmlGenericError(xmlGenericErrorContext, "PP: pushed %d\n", size); |
11943 #endif | 12569 #endif |
11944 } | 12570 } |
11945 | 12571 |
11946 if (enc != XML_CHAR_ENCODING_NONE) { | 12572 if (enc != XML_CHAR_ENCODING_NONE) { |
11947 xmlSwitchEncoding(ctxt, enc); | 12573 xmlSwitchEncoding(ctxt, enc); |
11948 } | 12574 } |
11949 | 12575 |
11950 return(ctxt); | 12576 return(ctxt); |
11951 } | 12577 } |
11952 #endif /* LIBXML_PUSH_ENABLED */ | 12578 #endif /* LIBXML_PUSH_ENABLED */ |
11953 | 12579 |
11954 /** | 12580 /** |
11955 * xmlStopParser: | 12581 * xmlStopParser: |
11956 * @ctxt: an XML parser context | 12582 * @ctxt: an XML parser context |
11957 * | 12583 * |
11958 * Blocks further parser processing | 12584 * Blocks further parser processing |
11959 */ | 12585 */ |
11960 void | 12586 void |
11961 xmlStopParser(xmlParserCtxtPtr ctxt) { | 12587 xmlStopParser(xmlParserCtxtPtr ctxt) { |
11962 if (ctxt == NULL) | 12588 if (ctxt == NULL) |
11963 return; | 12589 return; |
11964 ctxt->instate = XML_PARSER_EOF; | 12590 ctxt->instate = XML_PARSER_EOF; |
11965 ctxt->errNo = XML_ERR_USER_STOP; | 12591 ctxt->errNo = XML_ERR_USER_STOP; |
11966 ctxt->disableSAX = 1; | 12592 ctxt->disableSAX = 1; |
11967 if (ctxt->input != NULL) { | 12593 if (ctxt->input != NULL) { |
11968 ctxt->input->cur = BAD_CAST""; | 12594 ctxt->input->cur = BAD_CAST""; |
11969 ctxt->input->base = ctxt->input->cur; | 12595 ctxt->input->base = ctxt->input->cur; |
11970 } | 12596 } |
(...skipping 13 matching lines...) Expand all Loading... |
11984 * | 12610 * |
11985 * Returns the new parser context or NULL | 12611 * Returns the new parser context or NULL |
11986 */ | 12612 */ |
11987 xmlParserCtxtPtr | 12613 xmlParserCtxtPtr |
11988 xmlCreateIOParserCtxt(xmlSAXHandlerPtr sax, void *user_data, | 12614 xmlCreateIOParserCtxt(xmlSAXHandlerPtr sax, void *user_data, |
11989 xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, | 12615 xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, |
11990 void *ioctx, xmlCharEncoding enc) { | 12616 void *ioctx, xmlCharEncoding enc) { |
11991 xmlParserCtxtPtr ctxt; | 12617 xmlParserCtxtPtr ctxt; |
11992 xmlParserInputPtr inputStream; | 12618 xmlParserInputPtr inputStream; |
11993 xmlParserInputBufferPtr buf; | 12619 xmlParserInputBufferPtr buf; |
11994 | 12620 |
11995 if (ioread == NULL) return(NULL); | 12621 if (ioread == NULL) return(NULL); |
11996 | 12622 |
11997 buf = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, enc); | 12623 buf = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, enc); |
11998 if (buf == NULL) return(NULL); | 12624 if (buf == NULL) { |
| 12625 if (ioclose != NULL) |
| 12626 ioclose(ioctx); |
| 12627 return (NULL); |
| 12628 } |
11999 | 12629 |
12000 ctxt = xmlNewParserCtxt(); | 12630 ctxt = xmlNewParserCtxt(); |
12001 if (ctxt == NULL) { | 12631 if (ctxt == NULL) { |
12002 xmlFreeParserInputBuffer(buf); | 12632 xmlFreeParserInputBuffer(buf); |
12003 return(NULL); | 12633 return(NULL); |
12004 } | 12634 } |
12005 if (sax != NULL) { | 12635 if (sax != NULL) { |
12006 #ifdef LIBXML_SAX1_ENABLED | 12636 #ifdef LIBXML_SAX1_ENABLED |
12007 if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) | 12637 if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) |
12008 #endif /* LIBXML_SAX1_ENABLED */ | 12638 #endif /* LIBXML_SAX1_ENABLED */ |
12009 xmlFree(ctxt->sax); | 12639 xmlFree(ctxt->sax); |
12010 ctxt->sax = (xmlSAXHandlerPtr) xmlMalloc(sizeof(xmlSAXHandler)); | 12640 ctxt->sax = (xmlSAXHandlerPtr) xmlMalloc(sizeof(xmlSAXHandler)); |
12011 if (ctxt->sax == NULL) { | 12641 if (ctxt->sax == NULL) { |
12012 xmlErrMemory(ctxt, NULL); | 12642 xmlErrMemory(ctxt, NULL); |
12013 xmlFreeParserCtxt(ctxt); | 12643 xmlFreeParserCtxt(ctxt); |
12014 return(NULL); | 12644 return(NULL); |
12015 } | 12645 } |
12016 memset(ctxt->sax, 0, sizeof(xmlSAXHandler)); | 12646 memset(ctxt->sax, 0, sizeof(xmlSAXHandler)); |
12017 if (sax->initialized == XML_SAX2_MAGIC) | 12647 if (sax->initialized == XML_SAX2_MAGIC) |
12018 memcpy(ctxt->sax, sax, sizeof(xmlSAXHandler)); | 12648 memcpy(ctxt->sax, sax, sizeof(xmlSAXHandler)); |
12019 else | 12649 else |
12020 memcpy(ctxt->sax, sax, sizeof(xmlSAXHandlerV1)); | 12650 memcpy(ctxt->sax, sax, sizeof(xmlSAXHandlerV1)); |
12021 if (user_data != NULL) | 12651 if (user_data != NULL) |
12022 ctxt->userData = user_data; | 12652 ctxt->userData = user_data; |
12023 }» | 12653 } |
12024 | 12654 |
12025 inputStream = xmlNewIOInputStream(ctxt, buf, enc); | 12655 inputStream = xmlNewIOInputStream(ctxt, buf, enc); |
12026 if (inputStream == NULL) { | 12656 if (inputStream == NULL) { |
12027 xmlFreeParserCtxt(ctxt); | 12657 xmlFreeParserCtxt(ctxt); |
12028 return(NULL); | 12658 return(NULL); |
12029 } | 12659 } |
12030 inputPush(ctxt, inputStream); | 12660 inputPush(ctxt, inputStream); |
12031 | 12661 |
12032 return(ctxt); | 12662 return(ctxt); |
12033 } | 12663 } |
12034 | 12664 |
12035 #ifdef LIBXML_VALID_ENABLED | 12665 #ifdef LIBXML_VALID_ENABLED |
12036 /************************************************************************ | 12666 /************************************************************************ |
12037 * * | 12667 * * |
12038 * » » Front ends when parsing a DTD» » » » * | 12668 *» » Front ends when parsing a DTD» » » » * |
12039 * * | 12669 * * |
12040 ************************************************************************/ | 12670 ************************************************************************/ |
12041 | 12671 |
12042 /** | 12672 /** |
12043 * xmlIOParseDTD: | 12673 * xmlIOParseDTD: |
12044 * @sax: the SAX handler block or NULL | 12674 * @sax: the SAX handler block or NULL |
12045 * @input: an Input Buffer | 12675 * @input: an Input Buffer |
12046 * @enc: the charset encoding if known | 12676 * @enc: the charset encoding if known |
12047 * | 12677 * |
12048 * Load and parse a DTD | 12678 * Load and parse a DTD |
12049 * | 12679 * |
12050 * Returns the resulting xmlDtdPtr or NULL in case of error. | 12680 * Returns the resulting xmlDtdPtr or NULL in case of error. |
12051 * @input will be freed by the function in any case. | 12681 * @input will be freed by the function in any case. |
12052 */ | 12682 */ |
12053 | 12683 |
12054 xmlDtdPtr | 12684 xmlDtdPtr |
12055 xmlIOParseDTD(xmlSAXHandlerPtr sax, xmlParserInputBufferPtr input, | 12685 xmlIOParseDTD(xmlSAXHandlerPtr sax, xmlParserInputBufferPtr input, |
12056 xmlCharEncoding enc) { | 12686 xmlCharEncoding enc) { |
12057 xmlDtdPtr ret = NULL; | 12687 xmlDtdPtr ret = NULL; |
12058 xmlParserCtxtPtr ctxt; | 12688 xmlParserCtxtPtr ctxt; |
12059 xmlParserInputPtr pinput = NULL; | 12689 xmlParserInputPtr pinput = NULL; |
12060 xmlChar start[4]; | 12690 xmlChar start[4]; |
12061 | 12691 |
12062 if (input == NULL) | 12692 if (input == NULL) |
12063 return(NULL); | 12693 return(NULL); |
12064 | 12694 |
12065 ctxt = xmlNewParserCtxt(); | 12695 ctxt = xmlNewParserCtxt(); |
12066 if (ctxt == NULL) { | 12696 if (ctxt == NULL) { |
12067 xmlFreeParserInputBuffer(input); | 12697 xmlFreeParserInputBuffer(input); |
12068 return(NULL); | 12698 return(NULL); |
12069 } | 12699 } |
12070 | 12700 |
| 12701 /* We are loading a DTD */ |
| 12702 ctxt->options |= XML_PARSE_DTDLOAD; |
| 12703 |
12071 /* | 12704 /* |
12072 * Set-up the SAX context | 12705 * Set-up the SAX context |
12073 */ | 12706 */ |
12074 if (sax != NULL) { | 12707 if (sax != NULL) { |
12075 if (ctxt->sax != NULL) | 12708 if (ctxt->sax != NULL) |
12076 xmlFree(ctxt->sax); | 12709 xmlFree(ctxt->sax); |
12077 ctxt->sax = sax; | 12710 ctxt->sax = sax; |
12078 ctxt->userData = ctxt; | 12711 ctxt->userData = ctxt; |
12079 } | 12712 } |
12080 xmlDetectSAX2(ctxt); | 12713 xmlDetectSAX2(ctxt); |
12081 | 12714 |
12082 /* | 12715 /* |
12083 * generate a parser input from the I/O handler | 12716 * generate a parser input from the I/O handler |
12084 */ | 12717 */ |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12118 if (ctxt->myDoc == NULL) { | 12751 if (ctxt->myDoc == NULL) { |
12119 xmlErrMemory(ctxt, "New Doc failed"); | 12752 xmlErrMemory(ctxt, "New Doc failed"); |
12120 return(NULL); | 12753 return(NULL); |
12121 } | 12754 } |
12122 ctxt->myDoc->properties = XML_DOC_INTERNAL; | 12755 ctxt->myDoc->properties = XML_DOC_INTERNAL; |
12123 ctxt->myDoc->extSubset = xmlNewDtd(ctxt->myDoc, BAD_CAST "none", | 12756 ctxt->myDoc->extSubset = xmlNewDtd(ctxt->myDoc, BAD_CAST "none", |
12124 BAD_CAST "none", BAD_CAST "none"); | 12757 BAD_CAST "none", BAD_CAST "none"); |
12125 | 12758 |
12126 if ((enc == XML_CHAR_ENCODING_NONE) && | 12759 if ((enc == XML_CHAR_ENCODING_NONE) && |
12127 ((ctxt->input->end - ctxt->input->cur) >= 4)) { | 12760 ((ctxt->input->end - ctxt->input->cur) >= 4)) { |
12128 » /* | 12761 » /* |
12129 * Get the 4 first bytes and decode the charset | 12762 * Get the 4 first bytes and decode the charset |
12130 * if enc != XML_CHAR_ENCODING_NONE | 12763 * if enc != XML_CHAR_ENCODING_NONE |
12131 * plug some encoding conversion routines. | 12764 * plug some encoding conversion routines. |
12132 */ | 12765 */ |
12133 start[0] = RAW; | 12766 start[0] = RAW; |
12134 start[1] = NXT(1); | 12767 start[1] = NXT(1); |
12135 start[2] = NXT(2); | 12768 start[2] = NXT(2); |
12136 start[3] = NXT(3); | 12769 start[3] = NXT(3); |
12137 enc = xmlDetectCharEncoding(start, 4); | 12770 enc = xmlDetectCharEncoding(start, 4); |
12138 if (enc != XML_CHAR_ENCODING_NONE) { | 12771 if (enc != XML_CHAR_ENCODING_NONE) { |
(...skipping 18 matching lines...) Expand all Loading... |
12157 } | 12790 } |
12158 } | 12791 } |
12159 } else { | 12792 } else { |
12160 ret = NULL; | 12793 ret = NULL; |
12161 } | 12794 } |
12162 xmlFreeDoc(ctxt->myDoc); | 12795 xmlFreeDoc(ctxt->myDoc); |
12163 ctxt->myDoc = NULL; | 12796 ctxt->myDoc = NULL; |
12164 } | 12797 } |
12165 if (sax != NULL) ctxt->sax = NULL; | 12798 if (sax != NULL) ctxt->sax = NULL; |
12166 xmlFreeParserCtxt(ctxt); | 12799 xmlFreeParserCtxt(ctxt); |
12167 | 12800 |
12168 return(ret); | 12801 return(ret); |
12169 } | 12802 } |
12170 | 12803 |
12171 /** | 12804 /** |
12172 * xmlSAXParseDTD: | 12805 * xmlSAXParseDTD: |
12173 * @sax: the SAX handler block | 12806 * @sax: the SAX handler block |
12174 * @ExternalID: a NAME* containing the External ID of the DTD | 12807 * @ExternalID: a NAME* containing the External ID of the DTD |
12175 * @SystemID: a NAME* containing the URL to the DTD | 12808 * @SystemID: a NAME* containing the URL to the DTD |
12176 * | 12809 * |
12177 * Load and parse an external subset. | 12810 * Load and parse an external subset. |
12178 * | 12811 * |
12179 * Returns the resulting xmlDtdPtr or NULL in case of error. | 12812 * Returns the resulting xmlDtdPtr or NULL in case of error. |
12180 */ | 12813 */ |
12181 | 12814 |
12182 xmlDtdPtr | 12815 xmlDtdPtr |
12183 xmlSAXParseDTD(xmlSAXHandlerPtr sax, const xmlChar *ExternalID, | 12816 xmlSAXParseDTD(xmlSAXHandlerPtr sax, const xmlChar *ExternalID, |
12184 const xmlChar *SystemID) { | 12817 const xmlChar *SystemID) { |
12185 xmlDtdPtr ret = NULL; | 12818 xmlDtdPtr ret = NULL; |
12186 xmlParserCtxtPtr ctxt; | 12819 xmlParserCtxtPtr ctxt; |
12187 xmlParserInputPtr input = NULL; | 12820 xmlParserInputPtr input = NULL; |
12188 xmlCharEncoding enc; | 12821 xmlCharEncoding enc; |
12189 xmlChar* systemIdCanonic; | 12822 xmlChar* systemIdCanonic; |
12190 | 12823 |
12191 if ((ExternalID == NULL) && (SystemID == NULL)) return(NULL); | 12824 if ((ExternalID == NULL) && (SystemID == NULL)) return(NULL); |
12192 | 12825 |
12193 ctxt = xmlNewParserCtxt(); | 12826 ctxt = xmlNewParserCtxt(); |
12194 if (ctxt == NULL) { | 12827 if (ctxt == NULL) { |
12195 return(NULL); | 12828 return(NULL); |
12196 } | 12829 } |
12197 | 12830 |
| 12831 /* We are loading a DTD */ |
| 12832 ctxt->options |= XML_PARSE_DTDLOAD; |
| 12833 |
12198 /* | 12834 /* |
12199 * Set-up the SAX context | 12835 * Set-up the SAX context |
12200 */ | 12836 */ |
12201 if (sax != NULL) { | 12837 if (sax != NULL) { |
12202 if (ctxt->sax != NULL) | 12838 if (ctxt->sax != NULL) |
12203 xmlFree(ctxt->sax); | 12839 xmlFree(ctxt->sax); |
12204 ctxt->sax = sax; | 12840 ctxt->sax = sax; |
12205 ctxt->userData = ctxt; | 12841 ctxt->userData = ctxt; |
12206 } | 12842 } |
12207 | 12843 |
12208 /* | 12844 /* |
12209 * Canonicalise the system ID | 12845 * Canonicalise the system ID |
12210 */ | 12846 */ |
12211 systemIdCanonic = xmlCanonicPath(SystemID); | 12847 systemIdCanonic = xmlCanonicPath(SystemID); |
12212 if ((SystemID != NULL) && (systemIdCanonic == NULL)) { | 12848 if ((SystemID != NULL) && (systemIdCanonic == NULL)) { |
12213 xmlFreeParserCtxt(ctxt); | 12849 xmlFreeParserCtxt(ctxt); |
12214 return(NULL); | 12850 return(NULL); |
12215 } | 12851 } |
12216 | 12852 |
12217 /* | 12853 /* |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12308 */ | 12944 */ |
12309 | 12945 |
12310 xmlDtdPtr | 12946 xmlDtdPtr |
12311 xmlParseDTD(const xmlChar *ExternalID, const xmlChar *SystemID) { | 12947 xmlParseDTD(const xmlChar *ExternalID, const xmlChar *SystemID) { |
12312 return(xmlSAXParseDTD(NULL, ExternalID, SystemID)); | 12948 return(xmlSAXParseDTD(NULL, ExternalID, SystemID)); |
12313 } | 12949 } |
12314 #endif /* LIBXML_VALID_ENABLED */ | 12950 #endif /* LIBXML_VALID_ENABLED */ |
12315 | 12951 |
12316 /************************************************************************ | 12952 /************************************************************************ |
12317 * * | 12953 * * |
12318 * » » Front ends when parsing an Entity» » » * | 12954 *» » Front ends when parsing an Entity» » » * |
12319 * * | 12955 * * |
12320 ************************************************************************/ | 12956 ************************************************************************/ |
12321 | 12957 |
12322 /** | 12958 /** |
12323 * xmlParseCtxtExternalEntity: | 12959 * xmlParseCtxtExternalEntity: |
12324 * @ctx: the existing parsing context | 12960 * @ctx: the existing parsing context |
12325 * @URL: the URL for the entity to load | 12961 * @URL: the URL for the entity to load |
12326 * @ID: the System ID for the entity to load | 12962 * @ID: the System ID for the entity to load |
12327 * @lst: the return value for the set of parsed nodes | 12963 * @lst: the return value for the set of parsed nodes |
12328 * | 12964 * |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12424 /* | 13060 /* |
12425 * Parse a possible text declaration first | 13061 * Parse a possible text declaration first |
12426 */ | 13062 */ |
12427 if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) { | 13063 if ((CMP5(CUR_PTR, '<', '?', 'x', 'm', 'l')) && (IS_BLANK_CH(NXT(5)))) { |
12428 xmlParseTextDecl(ctxt); | 13064 xmlParseTextDecl(ctxt); |
12429 /* | 13065 /* |
12430 * An XML-1.0 document can't reference an entity not XML-1.0 | 13066 * An XML-1.0 document can't reference an entity not XML-1.0 |
12431 */ | 13067 */ |
12432 if ((xmlStrEqual(ctx->version, BAD_CAST "1.0")) && | 13068 if ((xmlStrEqual(ctx->version, BAD_CAST "1.0")) && |
12433 (!xmlStrEqual(ctxt->input->version, BAD_CAST "1.0"))) { | 13069 (!xmlStrEqual(ctxt->input->version, BAD_CAST "1.0"))) { |
12434 » xmlFatalErrMsg(ctxt, XML_ERR_VERSION_MISMATCH, | 13070 » xmlFatalErrMsg(ctxt, XML_ERR_VERSION_MISMATCH, |
12435 "Version mismatch between document and entity\n"); | 13071 "Version mismatch between document and entity\n"); |
12436 } | 13072 } |
12437 } | 13073 } |
12438 | 13074 |
12439 /* | 13075 /* |
| 13076 * If the user provided its own SAX callbacks then reuse the |
| 13077 * useData callback field, otherwise the expected setup in a |
| 13078 * DOM builder is to have userData == ctxt |
| 13079 */ |
| 13080 if (ctx->userData == ctx) |
| 13081 ctxt->userData = ctxt; |
| 13082 else |
| 13083 ctxt->userData = ctx->userData; |
| 13084 |
| 13085 /* |
12440 * Doing validity checking on chunk doesn't make sense | 13086 * Doing validity checking on chunk doesn't make sense |
12441 */ | 13087 */ |
12442 ctxt->instate = XML_PARSER_CONTENT; | 13088 ctxt->instate = XML_PARSER_CONTENT; |
12443 ctxt->validate = ctx->validate; | 13089 ctxt->validate = ctx->validate; |
12444 ctxt->valid = ctx->valid; | 13090 ctxt->valid = ctx->valid; |
12445 ctxt->loadsubset = ctx->loadsubset; | 13091 ctxt->loadsubset = ctx->loadsubset; |
12446 ctxt->depth = ctx->depth + 1; | 13092 ctxt->depth = ctx->depth + 1; |
12447 ctxt->replaceEntities = ctx->replaceEntities; | 13093 ctxt->replaceEntities = ctx->replaceEntities; |
12448 if (ctxt->validate) { | 13094 if (ctxt->validate) { |
12449 ctxt->vctxt.error = ctx->vctxt.error; | 13095 ctxt->vctxt.error = ctx->vctxt.error; |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12697 if (ctxt->input != NULL) { | 13343 if (ctxt->input != NULL) { |
12698 oldctxt->sizeentities += ctxt->input->consumed; | 13344 oldctxt->sizeentities += ctxt->input->consumed; |
12699 oldctxt->sizeentities += (ctxt->input->cur - ctxt->input->base); | 13345 oldctxt->sizeentities += (ctxt->input->cur - ctxt->input->base); |
12700 } | 13346 } |
12701 /* | 13347 /* |
12702 * And record the last error if any | 13348 * And record the last error if any |
12703 */ | 13349 */ |
12704 if (ctxt->lastError.code != XML_ERR_OK) | 13350 if (ctxt->lastError.code != XML_ERR_OK) |
12705 xmlCopyError(&ctxt->lastError, &oldctxt->lastError); | 13351 xmlCopyError(&ctxt->lastError, &oldctxt->lastError); |
12706 | 13352 |
12707 if (sax != NULL) | 13353 if (sax != NULL) |
12708 ctxt->sax = oldsax; | 13354 ctxt->sax = oldsax; |
12709 oldctxt->node_seq.maximum = ctxt->node_seq.maximum; | 13355 oldctxt->node_seq.maximum = ctxt->node_seq.maximum; |
12710 oldctxt->node_seq.length = ctxt->node_seq.length; | 13356 oldctxt->node_seq.length = ctxt->node_seq.length; |
12711 oldctxt->node_seq.buffer = ctxt->node_seq.buffer; | 13357 oldctxt->node_seq.buffer = ctxt->node_seq.buffer; |
12712 ctxt->node_seq.maximum = 0; | 13358 ctxt->node_seq.maximum = 0; |
12713 ctxt->node_seq.length = 0; | 13359 ctxt->node_seq.length = 0; |
12714 ctxt->node_seq.buffer = NULL; | 13360 ctxt->node_seq.buffer = NULL; |
12715 xmlFreeParserCtxt(ctxt); | 13361 xmlFreeParserCtxt(ctxt); |
12716 newDoc->intSubset = NULL; | 13362 newDoc->intSubset = NULL; |
12717 newDoc->extSubset = NULL; | 13363 newDoc->extSubset = NULL; |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13067 } else | 13713 } else |
13068 options |= XML_PARSE_NODICT; | 13714 options |= XML_PARSE_NODICT; |
13069 | 13715 |
13070 if (doc->encoding != NULL) { | 13716 if (doc->encoding != NULL) { |
13071 xmlCharEncodingHandlerPtr hdlr; | 13717 xmlCharEncodingHandlerPtr hdlr; |
13072 | 13718 |
13073 if (ctxt->encoding != NULL) | 13719 if (ctxt->encoding != NULL) |
13074 xmlFree((xmlChar *) ctxt->encoding); | 13720 xmlFree((xmlChar *) ctxt->encoding); |
13075 ctxt->encoding = xmlStrdup((const xmlChar *) doc->encoding); | 13721 ctxt->encoding = xmlStrdup((const xmlChar *) doc->encoding); |
13076 | 13722 |
13077 hdlr = xmlFindCharEncodingHandler(doc->encoding); | 13723 hdlr = xmlFindCharEncodingHandler((const char *) doc->encoding); |
13078 if (hdlr != NULL) { | 13724 if (hdlr != NULL) { |
13079 xmlSwitchToEncoding(ctxt, hdlr); | 13725 xmlSwitchToEncoding(ctxt, hdlr); |
13080 } else { | 13726 } else { |
13081 return(XML_ERR_UNSUPPORTED_ENCODING); | 13727 return(XML_ERR_UNSUPPORTED_ENCODING); |
13082 } | 13728 } |
13083 } | 13729 } |
13084 | 13730 |
13085 xmlCtxtUseOptionsInternal(ctxt, options, NULL); | 13731 xmlCtxtUseOptionsInternal(ctxt, options, NULL); |
13086 xmlDetectSAX2(ctxt); | 13732 xmlDetectSAX2(ctxt); |
13087 ctxt->myDoc = doc; | 13733 ctxt->myDoc = doc; |
| 13734 /* parsing in context, i.e. as within existing content */ |
| 13735 ctxt->instate = XML_PARSER_CONTENT; |
13088 | 13736 |
13089 fake = xmlNewComment(NULL); | 13737 fake = xmlNewComment(NULL); |
13090 if (fake == NULL) { | 13738 if (fake == NULL) { |
13091 xmlFreeParserCtxt(ctxt); | 13739 xmlFreeParserCtxt(ctxt); |
13092 return(XML_ERR_NO_MEMORY); | 13740 return(XML_ERR_NO_MEMORY); |
13093 } | 13741 } |
13094 xmlAddChild(node, fake); | 13742 xmlAddChild(node, fake); |
13095 | 13743 |
13096 if (node->type == XML_ELEMENT_NODE) { | 13744 if (node->type == XML_ELEMENT_NODE) { |
13097 nodePush(ctxt, node); | 13745 nodePush(ctxt, node); |
(...skipping 15 matching lines...) Expand all Loading... |
13113 } | 13761 } |
13114 | 13762 |
13115 if (xmlGetNamespace(ctxt, iprefix) == NULL) { | 13763 if (xmlGetNamespace(ctxt, iprefix) == NULL) { |
13116 nsPush(ctxt, iprefix, ihref); | 13764 nsPush(ctxt, iprefix, ihref); |
13117 nsnr++; | 13765 nsnr++; |
13118 } | 13766 } |
13119 ns = ns->next; | 13767 ns = ns->next; |
13120 } | 13768 } |
13121 cur = cur->parent; | 13769 cur = cur->parent; |
13122 } | 13770 } |
13123 ctxt->instate = XML_PARSER_CONTENT; | |
13124 } | 13771 } |
13125 | 13772 |
13126 if ((ctxt->validate) || (ctxt->replaceEntities != 0)) { | 13773 if ((ctxt->validate) || (ctxt->replaceEntities != 0)) { |
13127 /* | 13774 /* |
13128 * ID/IDREF registration will be done in xmlValidateElement below | 13775 * ID/IDREF registration will be done in xmlValidateElement below |
13129 */ | 13776 */ |
13130 ctxt->loadsubset |= XML_SKIP_IDS; | 13777 ctxt->loadsubset |= XML_SKIP_IDS; |
13131 } | 13778 } |
13132 | 13779 |
13133 #ifdef LIBXML_HTML_ENABLED | 13780 #ifdef LIBXML_HTML_ENABLED |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13516 * * | 14163 * * |
13517 * Front ends when parsing from a file * | 14164 * Front ends when parsing from a file * |
13518 * * | 14165 * * |
13519 ************************************************************************/ | 14166 ************************************************************************/ |
13520 | 14167 |
13521 /** | 14168 /** |
13522 * xmlCreateURLParserCtxt: | 14169 * xmlCreateURLParserCtxt: |
13523 * @filename: the filename or URL | 14170 * @filename: the filename or URL |
13524 * @options: a combination of xmlParserOption | 14171 * @options: a combination of xmlParserOption |
13525 * | 14172 * |
13526 * Create a parser context for a file or URL content. | 14173 * Create a parser context for a file or URL content. |
13527 * Automatic support for ZLIB/Compress compressed document is provided | 14174 * Automatic support for ZLIB/Compress compressed document is provided |
13528 * by default if found at compile-time and for file accesses | 14175 * by default if found at compile-time and for file accesses |
13529 * | 14176 * |
13530 * Returns the new parser context or NULL | 14177 * Returns the new parser context or NULL |
13531 */ | 14178 */ |
13532 xmlParserCtxtPtr | 14179 xmlParserCtxtPtr |
13533 xmlCreateURLParserCtxt(const char *filename, int options) | 14180 xmlCreateURLParserCtxt(const char *filename, int options) |
13534 { | 14181 { |
13535 xmlParserCtxtPtr ctxt; | 14182 xmlParserCtxtPtr ctxt; |
13536 xmlParserInputPtr inputStream; | 14183 xmlParserInputPtr inputStream; |
(...skipping 21 matching lines...) Expand all Loading... |
13558 if ((ctxt->directory == NULL) && (directory != NULL)) | 14205 if ((ctxt->directory == NULL) && (directory != NULL)) |
13559 ctxt->directory = directory; | 14206 ctxt->directory = directory; |
13560 | 14207 |
13561 return(ctxt); | 14208 return(ctxt); |
13562 } | 14209 } |
13563 | 14210 |
13564 /** | 14211 /** |
13565 * xmlCreateFileParserCtxt: | 14212 * xmlCreateFileParserCtxt: |
13566 * @filename: the filename | 14213 * @filename: the filename |
13567 * | 14214 * |
13568 * Create a parser context for a file content. | 14215 * Create a parser context for a file content. |
13569 * Automatic support for ZLIB/Compress compressed document is provided | 14216 * Automatic support for ZLIB/Compress compressed document is provided |
13570 * by default if found at compile-time. | 14217 * by default if found at compile-time. |
13571 * | 14218 * |
13572 * Returns the new parser context or NULL | 14219 * Returns the new parser context or NULL |
13573 */ | 14220 */ |
13574 xmlParserCtxtPtr | 14221 xmlParserCtxtPtr |
13575 xmlCreateFileParserCtxt(const char *filename) | 14222 xmlCreateFileParserCtxt(const char *filename) |
13576 { | 14223 { |
13577 return(xmlCreateURLParserCtxt(filename, 0)); | 14224 return(xmlCreateURLParserCtxt(filename, 0)); |
13578 } | 14225 } |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13636 } | 14283 } |
13637 } | 14284 } |
13638 else { | 14285 else { |
13639 ret = NULL; | 14286 ret = NULL; |
13640 xmlFreeDoc(ctxt->myDoc); | 14287 xmlFreeDoc(ctxt->myDoc); |
13641 ctxt->myDoc = NULL; | 14288 ctxt->myDoc = NULL; |
13642 } | 14289 } |
13643 if (sax != NULL) | 14290 if (sax != NULL) |
13644 ctxt->sax = NULL; | 14291 ctxt->sax = NULL; |
13645 xmlFreeParserCtxt(ctxt); | 14292 xmlFreeParserCtxt(ctxt); |
13646 | 14293 |
13647 return(ret); | 14294 return(ret); |
13648 } | 14295 } |
13649 | 14296 |
13650 /** | 14297 /** |
13651 * xmlSAXParseFile: | 14298 * xmlSAXParseFile: |
13652 * @sax: the SAX handler block | 14299 * @sax: the SAX handler block |
13653 * @filename: the filename | 14300 * @filename: the filename |
13654 * @recovery: work in recovery mode, i.e. tries to read no Well Formed | 14301 * @recovery: work in recovery mode, i.e. tries to read no Well Formed |
13655 * documents | 14302 * documents |
13656 * | 14303 * |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13736 | 14383 |
13737 if ((ctxt == NULL) || (buffer == NULL)) | 14384 if ((ctxt == NULL) || (buffer == NULL)) |
13738 return; | 14385 return; |
13739 | 14386 |
13740 input = xmlNewInputStream(ctxt); | 14387 input = xmlNewInputStream(ctxt); |
13741 if (input == NULL) { | 14388 if (input == NULL) { |
13742 xmlErrMemory(NULL, "parsing new buffer: out of memory\n"); | 14389 xmlErrMemory(NULL, "parsing new buffer: out of memory\n"); |
13743 xmlClearParserCtxt(ctxt); | 14390 xmlClearParserCtxt(ctxt); |
13744 return; | 14391 return; |
13745 } | 14392 } |
13746 | 14393 |
13747 xmlClearParserCtxt(ctxt); | 14394 xmlClearParserCtxt(ctxt); |
13748 if (filename != NULL) | 14395 if (filename != NULL) |
13749 input->filename = (char *) xmlCanonicPath((const xmlChar *)filename); | 14396 input->filename = (char *) xmlCanonicPath((const xmlChar *)filename); |
13750 input->base = buffer; | 14397 input->base = buffer; |
13751 input->cur = buffer; | 14398 input->cur = buffer; |
13752 input->end = &buffer[xmlStrlen(buffer)]; | 14399 input->end = &buffer[xmlStrlen(buffer)]; |
13753 inputPush(ctxt, input); | 14400 inputPush(ctxt, input); |
13754 } | 14401 } |
13755 | 14402 |
13756 /** | 14403 /** |
13757 * xmlSAXUserParseFile: | 14404 * xmlSAXUserParseFile: |
13758 * @sax: a SAX handler | 14405 * @sax: a SAX handler |
13759 * @user_data: The user data returned on SAX callbacks | 14406 * @user_data: The user data returned on SAX callbacks |
13760 * @filename: a file name | 14407 * @filename: a file name |
13761 * | 14408 * |
13762 * parse an XML file and call the given SAX handler routines. | 14409 * parse an XML file and call the given SAX handler routines. |
13763 * Automatic support for ZLIB/Compress compressed document is provided | 14410 * Automatic support for ZLIB/Compress compressed document is provided |
13764 * | 14411 * |
13765 * Returns 0 in case of success or a error number otherwise | 14412 * Returns 0 in case of success or a error number otherwise |
13766 */ | 14413 */ |
13767 int | 14414 int |
13768 xmlSAXUserParseFile(xmlSAXHandlerPtr sax, void *user_data, | 14415 xmlSAXUserParseFile(xmlSAXHandlerPtr sax, void *user_data, |
13769 const char *filename) { | 14416 const char *filename) { |
13770 int ret = 0; | 14417 int ret = 0; |
13771 xmlParserCtxtPtr ctxt; | 14418 xmlParserCtxtPtr ctxt; |
13772 | 14419 |
13773 ctxt = xmlCreateFileParserCtxt(filename); | 14420 ctxt = xmlCreateFileParserCtxt(filename); |
13774 if (ctxt == NULL) return -1; | 14421 if (ctxt == NULL) return -1; |
13775 if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) | 14422 if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) |
13776 xmlFree(ctxt->sax); | 14423 xmlFree(ctxt->sax); |
13777 ctxt->sax = sax; | 14424 ctxt->sax = sax; |
13778 xmlDetectSAX2(ctxt); | 14425 xmlDetectSAX2(ctxt); |
13779 | 14426 |
13780 if (user_data != NULL) | 14427 if (user_data != NULL) |
13781 ctxt->userData = user_data; | 14428 ctxt->userData = user_data; |
13782 | 14429 |
13783 xmlParseDocument(ctxt); | 14430 xmlParseDocument(ctxt); |
13784 | 14431 |
13785 if (ctxt->wellFormed) | 14432 if (ctxt->wellFormed) |
13786 ret = 0; | 14433 ret = 0; |
13787 else { | 14434 else { |
13788 if (ctxt->errNo != 0) | 14435 if (ctxt->errNo != 0) |
13789 ret = ctxt->errNo; | 14436 ret = ctxt->errNo; |
13790 else | 14437 else |
13791 ret = -1; | 14438 ret = -1; |
13792 } | 14439 } |
13793 if (sax != NULL) | 14440 if (sax != NULL) |
13794 ctxt->sax = NULL; | 14441 ctxt->sax = NULL; |
13795 if (ctxt->myDoc != NULL) { | 14442 if (ctxt->myDoc != NULL) { |
13796 xmlFreeDoc(ctxt->myDoc); | 14443 xmlFreeDoc(ctxt->myDoc); |
13797 ctxt->myDoc = NULL; | 14444 ctxt->myDoc = NULL; |
13798 } | 14445 } |
13799 xmlFreeParserCtxt(ctxt); | 14446 xmlFreeParserCtxt(ctxt); |
13800 | 14447 |
13801 return ret; | 14448 return ret; |
13802 } | 14449 } |
13803 #endif /* LIBXML_SAX1_ENABLED */ | 14450 #endif /* LIBXML_SAX1_ENABLED */ |
13804 | 14451 |
13805 /************************************************************************ | 14452 /************************************************************************ |
13806 * * | 14453 * * |
13807 * » » Front ends when parsing from memory» » » * | 14454 *» » Front ends when parsing from memory» » » * |
13808 * * | 14455 * * |
13809 ************************************************************************/ | 14456 ************************************************************************/ |
13810 | 14457 |
13811 /** | 14458 /** |
13812 * xmlCreateMemoryParserCtxt: | 14459 * xmlCreateMemoryParserCtxt: |
13813 * @buffer: a pointer to a char array | 14460 * @buffer: a pointer to a char array |
13814 * @size: the size of the array | 14461 * @size: the size of the array |
13815 * | 14462 * |
13816 * Create a parser context for an XML in-memory document. | 14463 * Create a parser context for an XML in-memory document. |
13817 * | 14464 * |
(...skipping 23 matching lines...) Expand all Loading... |
13841 | 14488 |
13842 input = xmlNewInputStream(ctxt); | 14489 input = xmlNewInputStream(ctxt); |
13843 if (input == NULL) { | 14490 if (input == NULL) { |
13844 xmlFreeParserInputBuffer(buf); | 14491 xmlFreeParserInputBuffer(buf); |
13845 xmlFreeParserCtxt(ctxt); | 14492 xmlFreeParserCtxt(ctxt); |
13846 return(NULL); | 14493 return(NULL); |
13847 } | 14494 } |
13848 | 14495 |
13849 input->filename = NULL; | 14496 input->filename = NULL; |
13850 input->buf = buf; | 14497 input->buf = buf; |
13851 input->base = input->buf->buffer->content; | 14498 xmlBufResetInput(input->buf->buffer, input); |
13852 input->cur = input->buf->buffer->content; | |
13853 input->end = &input->buf->buffer->content[input->buf->buffer->use]; | |
13854 | 14499 |
13855 inputPush(ctxt, input); | 14500 inputPush(ctxt, input); |
13856 return(ctxt); | 14501 return(ctxt); |
13857 } | 14502 } |
13858 | 14503 |
13859 #ifdef LIBXML_SAX1_ENABLED | 14504 #ifdef LIBXML_SAX1_ENABLED |
13860 /** | 14505 /** |
13861 * xmlSAXParseMemoryWithData: | 14506 * xmlSAXParseMemoryWithData: |
13862 * @sax: the SAX handler block | 14507 * @sax: the SAX handler block |
13863 * @buffer: an pointer to a char array | 14508 * @buffer: an pointer to a char array |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13899 ctxt->recovery = recovery; | 14544 ctxt->recovery = recovery; |
13900 | 14545 |
13901 xmlParseDocument(ctxt); | 14546 xmlParseDocument(ctxt); |
13902 | 14547 |
13903 if ((ctxt->wellFormed) || recovery) ret = ctxt->myDoc; | 14548 if ((ctxt->wellFormed) || recovery) ret = ctxt->myDoc; |
13904 else { | 14549 else { |
13905 ret = NULL; | 14550 ret = NULL; |
13906 xmlFreeDoc(ctxt->myDoc); | 14551 xmlFreeDoc(ctxt->myDoc); |
13907 ctxt->myDoc = NULL; | 14552 ctxt->myDoc = NULL; |
13908 } | 14553 } |
13909 if (sax != NULL) | 14554 if (sax != NULL) |
13910 ctxt->sax = NULL; | 14555 ctxt->sax = NULL; |
13911 xmlFreeParserCtxt(ctxt); | 14556 xmlFreeParserCtxt(ctxt); |
13912 | 14557 |
13913 return(ret); | 14558 return(ret); |
13914 } | 14559 } |
13915 | 14560 |
13916 /** | 14561 /** |
13917 * xmlSAXParseMemory: | 14562 * xmlSAXParseMemory: |
13918 * @sax: the SAX handler block | 14563 * @sax: the SAX handler block |
13919 * @buffer: an pointer to a char array | 14564 * @buffer: an pointer to a char array |
13920 * @size: the size of the array | 14565 * @size: the size of the array |
13921 * @recovery: work in recovery mode, i.e. tries to read not Well Formed | 14566 * @recovery: work in recovery mode, i.e. tries to read not Well Formed |
13922 * documents | 14567 * documents |
13923 * | 14568 * |
13924 * parse an XML in-memory block and use the given SAX function block | 14569 * parse an XML in-memory block and use the given SAX function block |
13925 * to handle the parsing callback. If sax is NULL, fallback to the default | 14570 * to handle the parsing callback. If sax is NULL, fallback to the default |
13926 * DOM tree building routines. | 14571 * DOM tree building routines. |
13927 * | 14572 * |
13928 * Returns the resulting document tree | 14573 * Returns the resulting document tree |
13929 */ | 14574 */ |
13930 xmlDocPtr | 14575 xmlDocPtr |
13931 xmlSAXParseMemory(xmlSAXHandlerPtr sax, const char *buffer, | 14576 xmlSAXParseMemory(xmlSAXHandlerPtr sax, const char *buffer, |
13932 int size, int recovery) { | 14577 int size, int recovery) { |
13933 return xmlSAXParseMemoryWithData(sax, buffer, size, recovery, NULL); | 14578 return xmlSAXParseMemoryWithData(sax, buffer, size, recovery, NULL); |
13934 } | 14579 } |
13935 | 14580 |
13936 /** | 14581 /** |
13937 * xmlParseMemory: | 14582 * xmlParseMemory: |
13938 * @buffer: an pointer to a char array | 14583 * @buffer: an pointer to a char array |
13939 * @size: the size of the array | 14584 * @size: the size of the array |
13940 * | 14585 * |
13941 * parse an XML in-memory block and build a tree. | 14586 * parse an XML in-memory block and build a tree. |
13942 * | 14587 * |
13943 * Returns the resulting document tree | 14588 * Returns the resulting document tree |
13944 */ | 14589 */ |
13945 | 14590 |
13946 xmlDocPtr xmlParseMemory(const char *buffer, int size) { | 14591 xmlDocPtr xmlParseMemory(const char *buffer, int size) { |
13947 return(xmlSAXParseMemory(NULL, buffer, size, 0)); | 14592 return(xmlSAXParseMemory(NULL, buffer, size, 0)); |
13948 } | 14593 } |
13949 | 14594 |
13950 /** | 14595 /** |
13951 * xmlRecoverMemory: | 14596 * xmlRecoverMemory: |
13952 * @buffer: an pointer to a char array | 14597 * @buffer: an pointer to a char array |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13986 if (ctxt == NULL) return -1; | 14631 if (ctxt == NULL) return -1; |
13987 if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) | 14632 if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler) |
13988 xmlFree(ctxt->sax); | 14633 xmlFree(ctxt->sax); |
13989 ctxt->sax = sax; | 14634 ctxt->sax = sax; |
13990 xmlDetectSAX2(ctxt); | 14635 xmlDetectSAX2(ctxt); |
13991 | 14636 |
13992 if (user_data != NULL) | 14637 if (user_data != NULL) |
13993 ctxt->userData = user_data; | 14638 ctxt->userData = user_data; |
13994 | 14639 |
13995 xmlParseDocument(ctxt); | 14640 xmlParseDocument(ctxt); |
13996 | 14641 |
13997 if (ctxt->wellFormed) | 14642 if (ctxt->wellFormed) |
13998 ret = 0; | 14643 ret = 0; |
13999 else { | 14644 else { |
14000 if (ctxt->errNo != 0) | 14645 if (ctxt->errNo != 0) |
14001 ret = ctxt->errNo; | 14646 ret = ctxt->errNo; |
14002 else | 14647 else |
14003 ret = -1; | 14648 ret = -1; |
14004 } | 14649 } |
14005 if (sax != NULL) | 14650 if (sax != NULL) |
14006 ctxt->sax = NULL; | 14651 ctxt->sax = NULL; |
14007 if (ctxt->myDoc != NULL) { | 14652 if (ctxt->myDoc != NULL) { |
14008 xmlFreeDoc(ctxt->myDoc); | 14653 xmlFreeDoc(ctxt->myDoc); |
14009 ctxt->myDoc = NULL; | 14654 ctxt->myDoc = NULL; |
14010 } | 14655 } |
14011 xmlFreeParserCtxt(ctxt); | 14656 xmlFreeParserCtxt(ctxt); |
14012 | 14657 |
14013 return ret; | 14658 return ret; |
14014 } | 14659 } |
14015 #endif /* LIBXML_SAX1_ENABLED */ | 14660 #endif /* LIBXML_SAX1_ENABLED */ |
14016 | 14661 |
14017 /** | 14662 /** |
14018 * xmlCreateDocParserCtxt: | 14663 * xmlCreateDocParserCtxt: |
14019 * @cur: a pointer to an array of xmlChar | 14664 * @cur: a pointer to an array of xmlChar |
14020 * | 14665 * |
14021 * Creates a parser context for an XML in-memory document. | 14666 * Creates a parser context for an XML in-memory document. |
14022 * | 14667 * |
(...skipping 13 matching lines...) Expand all Loading... |
14036 /** | 14681 /** |
14037 * xmlSAXParseDoc: | 14682 * xmlSAXParseDoc: |
14038 * @sax: the SAX handler block | 14683 * @sax: the SAX handler block |
14039 * @cur: a pointer to an array of xmlChar | 14684 * @cur: a pointer to an array of xmlChar |
14040 * @recovery: work in recovery mode, i.e. tries to read no Well Formed | 14685 * @recovery: work in recovery mode, i.e. tries to read no Well Formed |
14041 * documents | 14686 * documents |
14042 * | 14687 * |
14043 * parse an XML in-memory document and build a tree. | 14688 * parse an XML in-memory document and build a tree. |
14044 * It use the given SAX function block to handle the parsing callback. | 14689 * It use the given SAX function block to handle the parsing callback. |
14045 * If sax is NULL, fallback to the default DOM tree building routines. | 14690 * If sax is NULL, fallback to the default DOM tree building routines. |
14046 * | 14691 * |
14047 * Returns the resulting document tree | 14692 * Returns the resulting document tree |
14048 */ | 14693 */ |
14049 | 14694 |
14050 xmlDocPtr | 14695 xmlDocPtr |
14051 xmlSAXParseDoc(xmlSAXHandlerPtr sax, const xmlChar *cur, int recovery) { | 14696 xmlSAXParseDoc(xmlSAXHandlerPtr sax, const xmlChar *cur, int recovery) { |
14052 xmlDocPtr ret; | 14697 xmlDocPtr ret; |
14053 xmlParserCtxtPtr ctxt; | 14698 xmlParserCtxtPtr ctxt; |
14054 xmlSAXHandlerPtr oldsax = NULL; | 14699 xmlSAXHandlerPtr oldsax = NULL; |
14055 | 14700 |
14056 if (cur == NULL) return(NULL); | 14701 if (cur == NULL) return(NULL); |
14057 | 14702 |
14058 | 14703 |
14059 ctxt = xmlCreateDocParserCtxt(cur); | 14704 ctxt = xmlCreateDocParserCtxt(cur); |
14060 if (ctxt == NULL) return(NULL); | 14705 if (ctxt == NULL) return(NULL); |
14061 if (sax != NULL) { | 14706 if (sax != NULL) { |
14062 oldsax = ctxt->sax; | 14707 oldsax = ctxt->sax; |
14063 ctxt->sax = sax; | 14708 ctxt->sax = sax; |
14064 ctxt->userData = NULL; | 14709 ctxt->userData = NULL; |
14065 } | 14710 } |
14066 xmlDetectSAX2(ctxt); | 14711 xmlDetectSAX2(ctxt); |
14067 | 14712 |
14068 xmlParseDocument(ctxt); | 14713 xmlParseDocument(ctxt); |
14069 if ((ctxt->wellFormed) || recovery) ret = ctxt->myDoc; | 14714 if ((ctxt->wellFormed) || recovery) ret = ctxt->myDoc; |
14070 else { | 14715 else { |
14071 ret = NULL; | 14716 ret = NULL; |
14072 xmlFreeDoc(ctxt->myDoc); | 14717 xmlFreeDoc(ctxt->myDoc); |
14073 ctxt->myDoc = NULL; | 14718 ctxt->myDoc = NULL; |
14074 } | 14719 } |
14075 if (sax != NULL) | 14720 if (sax != NULL) |
14076 ctxt->sax = oldsax; | 14721 ctxt->sax = oldsax; |
14077 xmlFreeParserCtxt(ctxt); | 14722 xmlFreeParserCtxt(ctxt); |
14078 | 14723 |
14079 return(ret); | 14724 return(ret); |
14080 } | 14725 } |
14081 | 14726 |
14082 /** | 14727 /** |
14083 * xmlParseDoc: | 14728 * xmlParseDoc: |
14084 * @cur: a pointer to an array of xmlChar | 14729 * @cur: a pointer to an array of xmlChar |
14085 * | 14730 * |
14086 * parse an XML in-memory document and build a tree. | 14731 * parse an XML in-memory document and build a tree. |
14087 * | 14732 * |
14088 * Returns the resulting document tree | 14733 * Returns the resulting document tree |
14089 */ | 14734 */ |
14090 | 14735 |
14091 xmlDocPtr | 14736 xmlDocPtr |
14092 xmlParseDoc(const xmlChar *cur) { | 14737 xmlParseDoc(const xmlChar *cur) { |
14093 return(xmlSAXParseDoc(NULL, cur, 0)); | 14738 return(xmlSAXParseDoc(NULL, cur, 0)); |
14094 } | 14739 } |
14095 #endif /* LIBXML_SAX1_ENABLED */ | 14740 #endif /* LIBXML_SAX1_ENABLED */ |
14096 | 14741 |
14097 #ifdef LIBXML_LEGACY_ENABLED | 14742 #ifdef LIBXML_LEGACY_ENABLED |
14098 /************************************************************************ | 14743 /************************************************************************ |
14099 * * | 14744 * * |
14100 * » Specific function to keep track of entities references» » * | 14745 *» Specific function to keep track of entities references» » * |
14101 * » and used by the XSLT debugger» » » » » * | 14746 *» and used by the XSLT debugger» » » » » * |
14102 * * | 14747 * * |
14103 ************************************************************************/ | 14748 ************************************************************************/ |
14104 | 14749 |
14105 static xmlEntityReferenceFunc xmlEntityRefFunc = NULL; | 14750 static xmlEntityReferenceFunc xmlEntityRefFunc = NULL; |
14106 | 14751 |
14107 /** | 14752 /** |
14108 * xmlAddEntityReference: | 14753 * xmlAddEntityReference: |
14109 * @ent : A valid entity | 14754 * @ent : A valid entity |
14110 * @firstNode : A valid first node for children of entity | 14755 * @firstNode : A valid first node for children of entity |
14111 * @lastNode : A valid last node of children entity | 14756 * @lastNode : A valid last node of children entity |
14112 * | 14757 * |
14113 * Notify of a reference to an entity of type XML_EXTERNAL_GENERAL_PARSED_ENTITY | 14758 * Notify of a reference to an entity of type XML_EXTERNAL_GENERAL_PARSED_ENTITY |
14114 */ | 14759 */ |
14115 static void | 14760 static void |
14116 xmlAddEntityReference(xmlEntityPtr ent, xmlNodePtr firstNode, | 14761 xmlAddEntityReference(xmlEntityPtr ent, xmlNodePtr firstNode, |
14117 xmlNodePtr lastNode) | 14762 xmlNodePtr lastNode) |
14118 { | 14763 { |
14119 if (xmlEntityRefFunc != NULL) { | 14764 if (xmlEntityRefFunc != NULL) { |
14120 (*xmlEntityRefFunc) (ent, firstNode, lastNode); | 14765 (*xmlEntityRefFunc) (ent, firstNode, lastNode); |
14121 } | 14766 } |
14122 } | 14767 } |
14123 | 14768 |
14124 | 14769 |
14125 /** | 14770 /** |
14126 * xmlSetEntityReferenceFunc: | 14771 * xmlSetEntityReferenceFunc: |
14127 * @func: A valid function | 14772 * @func: A valid function |
14128 * | 14773 * |
14129 * Set the function to call call back when a xml reference has been made | 14774 * Set the function to call call back when a xml reference has been made |
14130 */ | 14775 */ |
14131 void | 14776 void |
14132 xmlSetEntityReferenceFunc(xmlEntityReferenceFunc func) | 14777 xmlSetEntityReferenceFunc(xmlEntityReferenceFunc func) |
14133 { | 14778 { |
14134 xmlEntityRefFunc = func; | 14779 xmlEntityRefFunc = func; |
14135 } | 14780 } |
14136 #endif /* LIBXML_LEGACY_ENABLED */ | 14781 #endif /* LIBXML_LEGACY_ENABLED */ |
14137 | 14782 |
14138 /************************************************************************ | 14783 /************************************************************************ |
14139 * * | 14784 * * |
14140 * » » » » Miscellaneous» » » » * | 14785 *» » » » Miscellaneous» » » » * |
14141 * * | 14786 * * |
14142 ************************************************************************/ | 14787 ************************************************************************/ |
14143 | 14788 |
14144 #ifdef LIBXML_XPATH_ENABLED | 14789 #ifdef LIBXML_XPATH_ENABLED |
14145 #include <libxml/xpath.h> | 14790 #include <libxml/xpath.h> |
14146 #endif | 14791 #endif |
14147 | 14792 |
14148 extern void XMLCDECL xmlGenericErrorDefaultFunc(void *ctx, const char *msg, ...)
; | 14793 extern void XMLCDECL xmlGenericErrorDefaultFunc(void *ctx, const char *msg, ...)
; |
14149 static int xmlParserInitialized = 0; | 14794 static int xmlParserInitialized = 0; |
14150 | 14795 |
14151 /** | 14796 /** |
14152 * xmlInitParser: | 14797 * xmlInitParser: |
14153 * | 14798 * |
14154 * Initialization function for the XML parser. | 14799 * Initialization function for the XML parser. |
14155 * This is not reentrant. Call once before processing in case of | 14800 * This is not reentrant. Call once before processing in case of |
14156 * use in multithreaded programs. | 14801 * use in multithreaded programs. |
14157 */ | 14802 */ |
14158 | 14803 |
14159 void | 14804 void |
14160 xmlInitParser(void) { | 14805 xmlInitParser(void) { |
14161 if (xmlParserInitialized != 0) | 14806 if (xmlParserInitialized != 0) |
14162 return; | 14807 return; |
14163 | 14808 |
14164 #ifdef LIBXML_THREAD_ENABLED | 14809 #ifdef LIBXML_THREAD_ENABLED |
14165 __xmlGlobalInitMutexLock(); | 14810 __xmlGlobalInitMutexLock(); |
14166 if (xmlParserInitialized == 0) { | 14811 if (xmlParserInitialized == 0) { |
14167 #endif | 14812 #endif |
| 14813 xmlInitThreads(); |
14168 xmlInitGlobals(); | 14814 xmlInitGlobals(); |
14169 xmlInitThreads(); | |
14170 if ((xmlGenericError == xmlGenericErrorDefaultFunc) || | 14815 if ((xmlGenericError == xmlGenericErrorDefaultFunc) || |
14171 (xmlGenericError == NULL)) | 14816 (xmlGenericError == NULL)) |
14172 initGenericErrorDefaultFunc(NULL); | 14817 initGenericErrorDefaultFunc(NULL); |
14173 xmlInitMemory(); | 14818 xmlInitMemory(); |
| 14819 xmlInitializeDict(); |
14174 xmlInitCharEncodingHandlers(); | 14820 xmlInitCharEncodingHandlers(); |
14175 xmlDefaultSAXHandlerInit(); | 14821 xmlDefaultSAXHandlerInit(); |
14176 xmlRegisterDefaultInputCallbacks(); | 14822 xmlRegisterDefaultInputCallbacks(); |
14177 #ifdef LIBXML_OUTPUT_ENABLED | 14823 #ifdef LIBXML_OUTPUT_ENABLED |
14178 xmlRegisterDefaultOutputCallbacks(); | 14824 xmlRegisterDefaultOutputCallbacks(); |
14179 #endif /* LIBXML_OUTPUT_ENABLED */ | 14825 #endif /* LIBXML_OUTPUT_ENABLED */ |
14180 #ifdef LIBXML_HTML_ENABLED | 14826 #ifdef LIBXML_HTML_ENABLED |
14181 htmlInitAutoClose(); | 14827 htmlInitAutoClose(); |
14182 htmlDefaultSAXHandlerInit(); | 14828 htmlDefaultSAXHandlerInit(); |
14183 #endif | 14829 #endif |
14184 #ifdef LIBXML_XPATH_ENABLED | 14830 #ifdef LIBXML_XPATH_ENABLED |
14185 xmlXPathInit(); | 14831 xmlXPathInit(); |
14186 #endif | 14832 #endif |
| 14833 #ifdef LIBXML_CATALOG_ENABLED |
| 14834 xmlInitializeCatalog(); |
| 14835 #endif |
14187 xmlParserInitialized = 1; | 14836 xmlParserInitialized = 1; |
14188 #ifdef LIBXML_THREAD_ENABLED | 14837 #ifdef LIBXML_THREAD_ENABLED |
14189 } | 14838 } |
14190 __xmlGlobalInitMutexUnlock(); | 14839 __xmlGlobalInitMutexUnlock(); |
14191 #endif | 14840 #endif |
14192 } | 14841 } |
14193 | 14842 |
14194 /** | 14843 /** |
14195 * xmlCleanupParser: | 14844 * xmlCleanupParser: |
14196 * | 14845 * |
(...skipping 27 matching lines...) Expand all Loading... |
14224 #endif | 14873 #endif |
14225 xmlDictCleanup(); | 14874 xmlDictCleanup(); |
14226 xmlCleanupInputCallbacks(); | 14875 xmlCleanupInputCallbacks(); |
14227 #ifdef LIBXML_OUTPUT_ENABLED | 14876 #ifdef LIBXML_OUTPUT_ENABLED |
14228 xmlCleanupOutputCallbacks(); | 14877 xmlCleanupOutputCallbacks(); |
14229 #endif | 14878 #endif |
14230 #ifdef LIBXML_SCHEMAS_ENABLED | 14879 #ifdef LIBXML_SCHEMAS_ENABLED |
14231 xmlSchemaCleanupTypes(); | 14880 xmlSchemaCleanupTypes(); |
14232 xmlRelaxNGCleanupTypes(); | 14881 xmlRelaxNGCleanupTypes(); |
14233 #endif | 14882 #endif |
| 14883 xmlResetLastError(); |
14234 xmlCleanupGlobals(); | 14884 xmlCleanupGlobals(); |
14235 xmlResetLastError(); | |
14236 xmlCleanupThreads(); /* must be last if called not from the main thread */ | 14885 xmlCleanupThreads(); /* must be last if called not from the main thread */ |
14237 xmlCleanupMemory(); | 14886 xmlCleanupMemory(); |
14238 xmlParserInitialized = 0; | 14887 xmlParserInitialized = 0; |
14239 } | 14888 } |
14240 | 14889 |
14241 /************************************************************************ | 14890 /************************************************************************ |
14242 * * | 14891 * * |
14243 * New set (2.6.0) of simpler and more flexible APIs * | 14892 * New set (2.6.0) of simpler and more flexible APIs * |
14244 * * | 14893 * * |
14245 ************************************************************************/ | 14894 ************************************************************************/ |
14246 | 14895 |
14247 /** | 14896 /** |
14248 * DICT_FREE: | 14897 * DICT_FREE: |
14249 * @str: a string | 14898 * @str: a string |
14250 * | 14899 * |
14251 * Free a string if it is not owned by the "dict" dictionnary in the | 14900 * Free a string if it is not owned by the "dict" dictionnary in the |
14252 * current scope | 14901 * current scope |
14253 */ | 14902 */ |
14254 #define DICT_FREE(str) \ | 14903 #define DICT_FREE(str) \ |
14255 » if ((str) && ((!dict) || » » » » \ | 14904 » if ((str) && ((!dict) ||» » » » \ |
14256 (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ | 14905 (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ |
14257 xmlFree((char *)(str)); | 14906 xmlFree((char *)(str)); |
14258 | 14907 |
14259 /** | 14908 /** |
14260 * xmlCtxtReset: | 14909 * xmlCtxtReset: |
14261 * @ctxt: an XML parser context | 14910 * @ctxt: an XML parser context |
14262 * | 14911 * |
14263 * Reset a parser context | 14912 * Reset a parser context |
14264 */ | 14913 */ |
14265 void | 14914 void |
14266 xmlCtxtReset(xmlParserCtxtPtr ctxt) | 14915 xmlCtxtReset(xmlParserCtxtPtr ctxt) |
14267 { | 14916 { |
14268 xmlParserInputPtr input; | 14917 xmlParserInputPtr input; |
14269 xmlDictPtr dict; | 14918 xmlDictPtr dict; |
14270 | 14919 |
14271 if (ctxt == NULL) | 14920 if (ctxt == NULL) |
14272 return; | 14921 return; |
14273 | 14922 |
14274 dict = ctxt->dict; | 14923 dict = ctxt->dict; |
14275 | 14924 |
14276 while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ | 14925 while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */ |
14277 xmlFreeInputStream(input); | 14926 xmlFreeInputStream(input); |
14278 } | 14927 } |
14279 ctxt->inputNr = 0; | 14928 ctxt->inputNr = 0; |
14280 ctxt->input = NULL; | 14929 ctxt->input = NULL; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14328 ctxt->record_info = 0; | 14977 ctxt->record_info = 0; |
14329 ctxt->nbChars = 0; | 14978 ctxt->nbChars = 0; |
14330 ctxt->checkIndex = 0; | 14979 ctxt->checkIndex = 0; |
14331 ctxt->inSubset = 0; | 14980 ctxt->inSubset = 0; |
14332 ctxt->errNo = XML_ERR_OK; | 14981 ctxt->errNo = XML_ERR_OK; |
14333 ctxt->depth = 0; | 14982 ctxt->depth = 0; |
14334 ctxt->charset = XML_CHAR_ENCODING_UTF8; | 14983 ctxt->charset = XML_CHAR_ENCODING_UTF8; |
14335 ctxt->catalogs = NULL; | 14984 ctxt->catalogs = NULL; |
14336 ctxt->nbentities = 0; | 14985 ctxt->nbentities = 0; |
14337 ctxt->sizeentities = 0; | 14986 ctxt->sizeentities = 0; |
| 14987 ctxt->sizeentcopy = 0; |
14338 xmlInitNodeInfoSeq(&ctxt->node_seq); | 14988 xmlInitNodeInfoSeq(&ctxt->node_seq); |
14339 | 14989 |
14340 if (ctxt->attsDefault != NULL) { | 14990 if (ctxt->attsDefault != NULL) { |
14341 xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); | 14991 xmlHashFree(ctxt->attsDefault, (xmlHashDeallocator) xmlFree); |
14342 ctxt->attsDefault = NULL; | 14992 ctxt->attsDefault = NULL; |
14343 } | 14993 } |
14344 if (ctxt->attsSpecial != NULL) { | 14994 if (ctxt->attsSpecial != NULL) { |
14345 xmlHashFree(ctxt->attsSpecial, NULL); | 14995 xmlHashFree(ctxt->attsSpecial, NULL); |
14346 ctxt->attsSpecial = NULL; | 14996 ctxt->attsSpecial = NULL; |
14347 } | 14997 } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14412 xmlFreeParserInputBuffer(buf); | 15062 xmlFreeParserInputBuffer(buf); |
14413 return(1); | 15063 return(1); |
14414 } | 15064 } |
14415 | 15065 |
14416 if (filename == NULL) | 15066 if (filename == NULL) |
14417 inputStream->filename = NULL; | 15067 inputStream->filename = NULL; |
14418 else | 15068 else |
14419 inputStream->filename = (char *) | 15069 inputStream->filename = (char *) |
14420 xmlCanonicPath((const xmlChar *) filename); | 15070 xmlCanonicPath((const xmlChar *) filename); |
14421 inputStream->buf = buf; | 15071 inputStream->buf = buf; |
14422 inputStream->base = inputStream->buf->buffer->content; | 15072 xmlBufResetInput(buf->buffer, inputStream); |
14423 inputStream->cur = inputStream->buf->buffer->content; | |
14424 inputStream->end = | |
14425 &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; | |
14426 | 15073 |
14427 inputPush(ctxt, inputStream); | 15074 inputPush(ctxt, inputStream); |
14428 | 15075 |
14429 if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && | 15076 if ((size > 0) && (chunk != NULL) && (ctxt->input != NULL) && |
14430 (ctxt->input->buf != NULL)) { | 15077 (ctxt->input->buf != NULL)) { |
14431 int base = ctxt->input->base - ctxt->input->buf->buffer->content; | 15078 » size_t base = xmlBufGetInputBase(ctxt->input->buf->buffer, ctxt->input); |
14432 int cur = ctxt->input->cur - ctxt->input->base; | 15079 size_t cur = ctxt->input->cur - ctxt->input->base; |
14433 | 15080 |
14434 xmlParserInputBufferPush(ctxt->input->buf, size, chunk); | 15081 xmlParserInputBufferPush(ctxt->input->buf, size, chunk); |
14435 | 15082 |
14436 ctxt->input->base = ctxt->input->buf->buffer->content + base; | 15083 xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input, base, cur); |
14437 ctxt->input->cur = ctxt->input->base + cur; | |
14438 ctxt->input->end = | |
14439 &ctxt->input->buf->buffer->content[ctxt->input->buf->buffer-> | |
14440 use]; | |
14441 #ifdef DEBUG_PUSH | 15084 #ifdef DEBUG_PUSH |
14442 xmlGenericError(xmlGenericErrorContext, "PP: pushed %d\n", size); | 15085 xmlGenericError(xmlGenericErrorContext, "PP: pushed %d\n", size); |
14443 #endif | 15086 #endif |
14444 } | 15087 } |
14445 | 15088 |
14446 if (encoding != NULL) { | 15089 if (encoding != NULL) { |
14447 xmlCharEncodingHandlerPtr hdlr; | 15090 xmlCharEncodingHandlerPtr hdlr; |
14448 | 15091 |
14449 if (ctxt->encoding != NULL) | 15092 if (ctxt->encoding != NULL) |
14450 xmlFree((xmlChar *) ctxt->encoding); | 15093 xmlFree((xmlChar *) ctxt->encoding); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14581 ctxt->options |= XML_PARSE_OLD10; | 15224 ctxt->options |= XML_PARSE_OLD10; |
14582 options -= XML_PARSE_OLD10; | 15225 options -= XML_PARSE_OLD10; |
14583 } | 15226 } |
14584 if (options & XML_PARSE_NOBASEFIX) { | 15227 if (options & XML_PARSE_NOBASEFIX) { |
14585 ctxt->options |= XML_PARSE_NOBASEFIX; | 15228 ctxt->options |= XML_PARSE_NOBASEFIX; |
14586 options -= XML_PARSE_NOBASEFIX; | 15229 options -= XML_PARSE_NOBASEFIX; |
14587 } | 15230 } |
14588 if (options & XML_PARSE_HUGE) { | 15231 if (options & XML_PARSE_HUGE) { |
14589 ctxt->options |= XML_PARSE_HUGE; | 15232 ctxt->options |= XML_PARSE_HUGE; |
14590 options -= XML_PARSE_HUGE; | 15233 options -= XML_PARSE_HUGE; |
| 15234 if (ctxt->dict != NULL) |
| 15235 xmlDictSetLimit(ctxt->dict, 0); |
14591 } | 15236 } |
14592 if (options & XML_PARSE_OLDSAX) { | 15237 if (options & XML_PARSE_OLDSAX) { |
14593 ctxt->options |= XML_PARSE_OLDSAX; | 15238 ctxt->options |= XML_PARSE_OLDSAX; |
14594 options -= XML_PARSE_OLDSAX; | 15239 options -= XML_PARSE_OLDSAX; |
14595 } | 15240 } |
| 15241 if (options & XML_PARSE_IGNORE_ENC) { |
| 15242 ctxt->options |= XML_PARSE_IGNORE_ENC; |
| 15243 options -= XML_PARSE_IGNORE_ENC; |
| 15244 } |
| 15245 if (options & XML_PARSE_BIG_LINES) { |
| 15246 ctxt->options |= XML_PARSE_BIG_LINES; |
| 15247 options -= XML_PARSE_BIG_LINES; |
| 15248 } |
14596 ctxt->linenumbers = 1; | 15249 ctxt->linenumbers = 1; |
14597 return (options); | 15250 return (options); |
14598 } | 15251 } |
14599 | 15252 |
14600 /** | 15253 /** |
14601 * xmlCtxtUseOptions: | 15254 * xmlCtxtUseOptions: |
14602 * @ctxt: an XML parser context | 15255 * @ctxt: an XML parser context |
14603 * @options: a combination of xmlParserOption | 15256 * @options: a combination of xmlParserOption |
14604 * | 15257 * |
14605 * Applies the options to the parser context | 15258 * Applies the options to the parser context |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14660 } | 15313 } |
14661 | 15314 |
14662 /** | 15315 /** |
14663 * xmlReadDoc: | 15316 * xmlReadDoc: |
14664 * @cur: a pointer to a zero terminated string | 15317 * @cur: a pointer to a zero terminated string |
14665 * @URL: the base URL to use for the document | 15318 * @URL: the base URL to use for the document |
14666 * @encoding: the document encoding, or NULL | 15319 * @encoding: the document encoding, or NULL |
14667 * @options: a combination of xmlParserOption | 15320 * @options: a combination of xmlParserOption |
14668 * | 15321 * |
14669 * parse an XML in-memory document and build a tree. | 15322 * parse an XML in-memory document and build a tree. |
14670 * | 15323 * |
14671 * Returns the resulting document tree | 15324 * Returns the resulting document tree |
14672 */ | 15325 */ |
14673 xmlDocPtr | 15326 xmlDocPtr |
14674 xmlReadDoc(const xmlChar * cur, const char *URL, const char *encoding, int optio
ns) | 15327 xmlReadDoc(const xmlChar * cur, const char *URL, const char *encoding, int optio
ns) |
14675 { | 15328 { |
14676 xmlParserCtxtPtr ctxt; | 15329 xmlParserCtxtPtr ctxt; |
14677 | 15330 |
14678 if (cur == NULL) | 15331 if (cur == NULL) |
14679 return (NULL); | 15332 return (NULL); |
| 15333 xmlInitParser(); |
14680 | 15334 |
14681 ctxt = xmlCreateDocParserCtxt(cur); | 15335 ctxt = xmlCreateDocParserCtxt(cur); |
14682 if (ctxt == NULL) | 15336 if (ctxt == NULL) |
14683 return (NULL); | 15337 return (NULL); |
14684 return (xmlDoRead(ctxt, URL, encoding, options, 0)); | 15338 return (xmlDoRead(ctxt, URL, encoding, options, 0)); |
14685 } | 15339 } |
14686 | 15340 |
14687 /** | 15341 /** |
14688 * xmlReadFile: | 15342 * xmlReadFile: |
14689 * @filename: a file or URL | 15343 * @filename: a file or URL |
14690 * @encoding: the document encoding, or NULL | 15344 * @encoding: the document encoding, or NULL |
14691 * @options: a combination of xmlParserOption | 15345 * @options: a combination of xmlParserOption |
14692 * | 15346 * |
14693 * parse an XML file from the filesystem or the network. | 15347 * parse an XML file from the filesystem or the network. |
14694 * | 15348 * |
14695 * Returns the resulting document tree | 15349 * Returns the resulting document tree |
14696 */ | 15350 */ |
14697 xmlDocPtr | 15351 xmlDocPtr |
14698 xmlReadFile(const char *filename, const char *encoding, int options) | 15352 xmlReadFile(const char *filename, const char *encoding, int options) |
14699 { | 15353 { |
14700 xmlParserCtxtPtr ctxt; | 15354 xmlParserCtxtPtr ctxt; |
14701 | 15355 |
| 15356 xmlInitParser(); |
14702 ctxt = xmlCreateURLParserCtxt(filename, options); | 15357 ctxt = xmlCreateURLParserCtxt(filename, options); |
14703 if (ctxt == NULL) | 15358 if (ctxt == NULL) |
14704 return (NULL); | 15359 return (NULL); |
14705 return (xmlDoRead(ctxt, NULL, encoding, options, 0)); | 15360 return (xmlDoRead(ctxt, NULL, encoding, options, 0)); |
14706 } | 15361 } |
14707 | 15362 |
14708 /** | 15363 /** |
14709 * xmlReadMemory: | 15364 * xmlReadMemory: |
14710 * @buffer: a pointer to a char array | 15365 * @buffer: a pointer to a char array |
14711 * @size: the size of the array | 15366 * @size: the size of the array |
14712 * @URL: the base URL to use for the document | 15367 * @URL: the base URL to use for the document |
14713 * @encoding: the document encoding, or NULL | 15368 * @encoding: the document encoding, or NULL |
14714 * @options: a combination of xmlParserOption | 15369 * @options: a combination of xmlParserOption |
14715 * | 15370 * |
14716 * parse an XML in-memory document and build a tree. | 15371 * parse an XML in-memory document and build a tree. |
14717 * | 15372 * |
14718 * Returns the resulting document tree | 15373 * Returns the resulting document tree |
14719 */ | 15374 */ |
14720 xmlDocPtr | 15375 xmlDocPtr |
14721 xmlReadMemory(const char *buffer, int size, const char *URL, const char *encodin
g, int options) | 15376 xmlReadMemory(const char *buffer, int size, const char *URL, const char *encodin
g, int options) |
14722 { | 15377 { |
14723 xmlParserCtxtPtr ctxt; | 15378 xmlParserCtxtPtr ctxt; |
14724 | 15379 |
| 15380 xmlInitParser(); |
14725 ctxt = xmlCreateMemoryParserCtxt(buffer, size); | 15381 ctxt = xmlCreateMemoryParserCtxt(buffer, size); |
14726 if (ctxt == NULL) | 15382 if (ctxt == NULL) |
14727 return (NULL); | 15383 return (NULL); |
14728 return (xmlDoRead(ctxt, URL, encoding, options, 0)); | 15384 return (xmlDoRead(ctxt, URL, encoding, options, 0)); |
14729 } | 15385 } |
14730 | 15386 |
14731 /** | 15387 /** |
14732 * xmlReadFd: | 15388 * xmlReadFd: |
14733 * @fd: an open file descriptor | 15389 * @fd: an open file descriptor |
14734 * @URL: the base URL to use for the document | 15390 * @URL: the base URL to use for the document |
14735 * @encoding: the document encoding, or NULL | 15391 * @encoding: the document encoding, or NULL |
14736 * @options: a combination of xmlParserOption | 15392 * @options: a combination of xmlParserOption |
14737 * | 15393 * |
14738 * parse an XML from a file descriptor and build a tree. | 15394 * parse an XML from a file descriptor and build a tree. |
14739 * NOTE that the file descriptor will not be closed when the | 15395 * NOTE that the file descriptor will not be closed when the |
14740 * reader is closed or reset. | 15396 * reader is closed or reset. |
14741 * | 15397 * |
14742 * Returns the resulting document tree | 15398 * Returns the resulting document tree |
14743 */ | 15399 */ |
14744 xmlDocPtr | 15400 xmlDocPtr |
14745 xmlReadFd(int fd, const char *URL, const char *encoding, int options) | 15401 xmlReadFd(int fd, const char *URL, const char *encoding, int options) |
14746 { | 15402 { |
14747 xmlParserCtxtPtr ctxt; | 15403 xmlParserCtxtPtr ctxt; |
14748 xmlParserInputBufferPtr input; | 15404 xmlParserInputBufferPtr input; |
14749 xmlParserInputPtr stream; | 15405 xmlParserInputPtr stream; |
14750 | 15406 |
14751 if (fd < 0) | 15407 if (fd < 0) |
14752 return (NULL); | 15408 return (NULL); |
| 15409 xmlInitParser(); |
14753 | 15410 |
14754 input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); | 15411 input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); |
14755 if (input == NULL) | 15412 if (input == NULL) |
14756 return (NULL); | 15413 return (NULL); |
14757 input->closecallback = NULL; | 15414 input->closecallback = NULL; |
14758 ctxt = xmlNewParserCtxt(); | 15415 ctxt = xmlNewParserCtxt(); |
14759 if (ctxt == NULL) { | 15416 if (ctxt == NULL) { |
14760 xmlFreeParserInputBuffer(input); | 15417 xmlFreeParserInputBuffer(input); |
14761 return (NULL); | 15418 return (NULL); |
14762 } | 15419 } |
(...skipping 10 matching lines...) Expand all Loading... |
14773 /** | 15430 /** |
14774 * xmlReadIO: | 15431 * xmlReadIO: |
14775 * @ioread: an I/O read function | 15432 * @ioread: an I/O read function |
14776 * @ioclose: an I/O close function | 15433 * @ioclose: an I/O close function |
14777 * @ioctx: an I/O handler | 15434 * @ioctx: an I/O handler |
14778 * @URL: the base URL to use for the document | 15435 * @URL: the base URL to use for the document |
14779 * @encoding: the document encoding, or NULL | 15436 * @encoding: the document encoding, or NULL |
14780 * @options: a combination of xmlParserOption | 15437 * @options: a combination of xmlParserOption |
14781 * | 15438 * |
14782 * parse an XML document from I/O functions and source and build a tree. | 15439 * parse an XML document from I/O functions and source and build a tree. |
14783 * | 15440 * |
14784 * Returns the resulting document tree | 15441 * Returns the resulting document tree |
14785 */ | 15442 */ |
14786 xmlDocPtr | 15443 xmlDocPtr |
14787 xmlReadIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, | 15444 xmlReadIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, |
14788 void *ioctx, const char *URL, const char *encoding, int options) | 15445 void *ioctx, const char *URL, const char *encoding, int options) |
14789 { | 15446 { |
14790 xmlParserCtxtPtr ctxt; | 15447 xmlParserCtxtPtr ctxt; |
14791 xmlParserInputBufferPtr input; | 15448 xmlParserInputBufferPtr input; |
14792 xmlParserInputPtr stream; | 15449 xmlParserInputPtr stream; |
14793 | 15450 |
14794 if (ioread == NULL) | 15451 if (ioread == NULL) |
14795 return (NULL); | 15452 return (NULL); |
| 15453 xmlInitParser(); |
14796 | 15454 |
14797 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, | 15455 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, |
14798 XML_CHAR_ENCODING_NONE); | 15456 XML_CHAR_ENCODING_NONE); |
14799 if (input == NULL) | 15457 if (input == NULL) { |
| 15458 if (ioclose != NULL) |
| 15459 ioclose(ioctx); |
14800 return (NULL); | 15460 return (NULL); |
| 15461 } |
14801 ctxt = xmlNewParserCtxt(); | 15462 ctxt = xmlNewParserCtxt(); |
14802 if (ctxt == NULL) { | 15463 if (ctxt == NULL) { |
14803 xmlFreeParserInputBuffer(input); | 15464 xmlFreeParserInputBuffer(input); |
14804 return (NULL); | 15465 return (NULL); |
14805 } | 15466 } |
14806 stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); | 15467 stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); |
14807 if (stream == NULL) { | 15468 if (stream == NULL) { |
14808 xmlFreeParserInputBuffer(input); | 15469 xmlFreeParserInputBuffer(input); |
14809 xmlFreeParserCtxt(ctxt); | 15470 xmlFreeParserCtxt(ctxt); |
14810 return (NULL); | 15471 return (NULL); |
14811 } | 15472 } |
14812 inputPush(ctxt, stream); | 15473 inputPush(ctxt, stream); |
14813 return (xmlDoRead(ctxt, URL, encoding, options, 0)); | 15474 return (xmlDoRead(ctxt, URL, encoding, options, 0)); |
14814 } | 15475 } |
14815 | 15476 |
14816 /** | 15477 /** |
14817 * xmlCtxtReadDoc: | 15478 * xmlCtxtReadDoc: |
14818 * @ctxt: an XML parser context | 15479 * @ctxt: an XML parser context |
14819 * @cur: a pointer to a zero terminated string | 15480 * @cur: a pointer to a zero terminated string |
14820 * @URL: the base URL to use for the document | 15481 * @URL: the base URL to use for the document |
14821 * @encoding: the document encoding, or NULL | 15482 * @encoding: the document encoding, or NULL |
14822 * @options: a combination of xmlParserOption | 15483 * @options: a combination of xmlParserOption |
14823 * | 15484 * |
14824 * parse an XML in-memory document and build a tree. | 15485 * parse an XML in-memory document and build a tree. |
14825 * This reuses the existing @ctxt parser context | 15486 * This reuses the existing @ctxt parser context |
14826 * | 15487 * |
14827 * Returns the resulting document tree | 15488 * Returns the resulting document tree |
14828 */ | 15489 */ |
14829 xmlDocPtr | 15490 xmlDocPtr |
14830 xmlCtxtReadDoc(xmlParserCtxtPtr ctxt, const xmlChar * cur, | 15491 xmlCtxtReadDoc(xmlParserCtxtPtr ctxt, const xmlChar * cur, |
14831 const char *URL, const char *encoding, int options) | 15492 const char *URL, const char *encoding, int options) |
14832 { | 15493 { |
14833 xmlParserInputPtr stream; | 15494 xmlParserInputPtr stream; |
14834 | 15495 |
14835 if (cur == NULL) | 15496 if (cur == NULL) |
14836 return (NULL); | 15497 return (NULL); |
14837 if (ctxt == NULL) | 15498 if (ctxt == NULL) |
14838 return (NULL); | 15499 return (NULL); |
| 15500 xmlInitParser(); |
14839 | 15501 |
14840 xmlCtxtReset(ctxt); | 15502 xmlCtxtReset(ctxt); |
14841 | 15503 |
14842 stream = xmlNewStringInputStream(ctxt, cur); | 15504 stream = xmlNewStringInputStream(ctxt, cur); |
14843 if (stream == NULL) { | 15505 if (stream == NULL) { |
14844 return (NULL); | 15506 return (NULL); |
14845 } | 15507 } |
14846 inputPush(ctxt, stream); | 15508 inputPush(ctxt, stream); |
14847 return (xmlDoRead(ctxt, URL, encoding, options, 1)); | 15509 return (xmlDoRead(ctxt, URL, encoding, options, 1)); |
14848 } | 15510 } |
14849 | 15511 |
14850 /** | 15512 /** |
14851 * xmlCtxtReadFile: | 15513 * xmlCtxtReadFile: |
14852 * @ctxt: an XML parser context | 15514 * @ctxt: an XML parser context |
14853 * @filename: a file or URL | 15515 * @filename: a file or URL |
14854 * @encoding: the document encoding, or NULL | 15516 * @encoding: the document encoding, or NULL |
14855 * @options: a combination of xmlParserOption | 15517 * @options: a combination of xmlParserOption |
14856 * | 15518 * |
14857 * parse an XML file from the filesystem or the network. | 15519 * parse an XML file from the filesystem or the network. |
14858 * This reuses the existing @ctxt parser context | 15520 * This reuses the existing @ctxt parser context |
14859 * | 15521 * |
14860 * Returns the resulting document tree | 15522 * Returns the resulting document tree |
14861 */ | 15523 */ |
14862 xmlDocPtr | 15524 xmlDocPtr |
14863 xmlCtxtReadFile(xmlParserCtxtPtr ctxt, const char *filename, | 15525 xmlCtxtReadFile(xmlParserCtxtPtr ctxt, const char *filename, |
14864 const char *encoding, int options) | 15526 const char *encoding, int options) |
14865 { | 15527 { |
14866 xmlParserInputPtr stream; | 15528 xmlParserInputPtr stream; |
14867 | 15529 |
14868 if (filename == NULL) | 15530 if (filename == NULL) |
14869 return (NULL); | 15531 return (NULL); |
14870 if (ctxt == NULL) | 15532 if (ctxt == NULL) |
14871 return (NULL); | 15533 return (NULL); |
| 15534 xmlInitParser(); |
14872 | 15535 |
14873 xmlCtxtReset(ctxt); | 15536 xmlCtxtReset(ctxt); |
14874 | 15537 |
14875 stream = xmlLoadExternalEntity(filename, NULL, ctxt); | 15538 stream = xmlLoadExternalEntity(filename, NULL, ctxt); |
14876 if (stream == NULL) { | 15539 if (stream == NULL) { |
14877 return (NULL); | 15540 return (NULL); |
14878 } | 15541 } |
14879 inputPush(ctxt, stream); | 15542 inputPush(ctxt, stream); |
14880 return (xmlDoRead(ctxt, NULL, encoding, options, 1)); | 15543 return (xmlDoRead(ctxt, NULL, encoding, options, 1)); |
14881 } | 15544 } |
14882 | 15545 |
14883 /** | 15546 /** |
14884 * xmlCtxtReadMemory: | 15547 * xmlCtxtReadMemory: |
14885 * @ctxt: an XML parser context | 15548 * @ctxt: an XML parser context |
14886 * @buffer: a pointer to a char array | 15549 * @buffer: a pointer to a char array |
14887 * @size: the size of the array | 15550 * @size: the size of the array |
14888 * @URL: the base URL to use for the document | 15551 * @URL: the base URL to use for the document |
14889 * @encoding: the document encoding, or NULL | 15552 * @encoding: the document encoding, or NULL |
14890 * @options: a combination of xmlParserOption | 15553 * @options: a combination of xmlParserOption |
14891 * | 15554 * |
14892 * parse an XML in-memory document and build a tree. | 15555 * parse an XML in-memory document and build a tree. |
14893 * This reuses the existing @ctxt parser context | 15556 * This reuses the existing @ctxt parser context |
14894 * | 15557 * |
14895 * Returns the resulting document tree | 15558 * Returns the resulting document tree |
14896 */ | 15559 */ |
14897 xmlDocPtr | 15560 xmlDocPtr |
14898 xmlCtxtReadMemory(xmlParserCtxtPtr ctxt, const char *buffer, int size, | 15561 xmlCtxtReadMemory(xmlParserCtxtPtr ctxt, const char *buffer, int size, |
14899 const char *URL, const char *encoding, int options) | 15562 const char *URL, const char *encoding, int options) |
14900 { | 15563 { |
14901 xmlParserInputBufferPtr input; | 15564 xmlParserInputBufferPtr input; |
14902 xmlParserInputPtr stream; | 15565 xmlParserInputPtr stream; |
14903 | 15566 |
14904 if (ctxt == NULL) | 15567 if (ctxt == NULL) |
14905 return (NULL); | 15568 return (NULL); |
14906 if (buffer == NULL) | 15569 if (buffer == NULL) |
14907 return (NULL); | 15570 return (NULL); |
| 15571 xmlInitParser(); |
14908 | 15572 |
14909 xmlCtxtReset(ctxt); | 15573 xmlCtxtReset(ctxt); |
14910 | 15574 |
14911 input = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); | 15575 input = xmlParserInputBufferCreateMem(buffer, size, XML_CHAR_ENCODING_NONE); |
14912 if (input == NULL) { | 15576 if (input == NULL) { |
14913 return(NULL); | 15577 return(NULL); |
14914 } | 15578 } |
14915 | 15579 |
14916 stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); | 15580 stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); |
14917 if (stream == NULL) { | 15581 if (stream == NULL) { |
(...skipping 10 matching lines...) Expand all Loading... |
14928 * @ctxt: an XML parser context | 15592 * @ctxt: an XML parser context |
14929 * @fd: an open file descriptor | 15593 * @fd: an open file descriptor |
14930 * @URL: the base URL to use for the document | 15594 * @URL: the base URL to use for the document |
14931 * @encoding: the document encoding, or NULL | 15595 * @encoding: the document encoding, or NULL |
14932 * @options: a combination of xmlParserOption | 15596 * @options: a combination of xmlParserOption |
14933 * | 15597 * |
14934 * parse an XML from a file descriptor and build a tree. | 15598 * parse an XML from a file descriptor and build a tree. |
14935 * This reuses the existing @ctxt parser context | 15599 * This reuses the existing @ctxt parser context |
14936 * NOTE that the file descriptor will not be closed when the | 15600 * NOTE that the file descriptor will not be closed when the |
14937 * reader is closed or reset. | 15601 * reader is closed or reset. |
14938 * | 15602 * |
14939 * Returns the resulting document tree | 15603 * Returns the resulting document tree |
14940 */ | 15604 */ |
14941 xmlDocPtr | 15605 xmlDocPtr |
14942 xmlCtxtReadFd(xmlParserCtxtPtr ctxt, int fd, | 15606 xmlCtxtReadFd(xmlParserCtxtPtr ctxt, int fd, |
14943 const char *URL, const char *encoding, int options) | 15607 const char *URL, const char *encoding, int options) |
14944 { | 15608 { |
14945 xmlParserInputBufferPtr input; | 15609 xmlParserInputBufferPtr input; |
14946 xmlParserInputPtr stream; | 15610 xmlParserInputPtr stream; |
14947 | 15611 |
14948 if (fd < 0) | 15612 if (fd < 0) |
14949 return (NULL); | 15613 return (NULL); |
14950 if (ctxt == NULL) | 15614 if (ctxt == NULL) |
14951 return (NULL); | 15615 return (NULL); |
| 15616 xmlInitParser(); |
14952 | 15617 |
14953 xmlCtxtReset(ctxt); | 15618 xmlCtxtReset(ctxt); |
14954 | 15619 |
14955 | 15620 |
14956 input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); | 15621 input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); |
14957 if (input == NULL) | 15622 if (input == NULL) |
14958 return (NULL); | 15623 return (NULL); |
14959 input->closecallback = NULL; | 15624 input->closecallback = NULL; |
14960 stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); | 15625 stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); |
14961 if (stream == NULL) { | 15626 if (stream == NULL) { |
14962 xmlFreeParserInputBuffer(input); | 15627 xmlFreeParserInputBuffer(input); |
14963 return (NULL); | 15628 return (NULL); |
14964 } | 15629 } |
14965 inputPush(ctxt, stream); | 15630 inputPush(ctxt, stream); |
14966 return (xmlDoRead(ctxt, URL, encoding, options, 1)); | 15631 return (xmlDoRead(ctxt, URL, encoding, options, 1)); |
14967 } | 15632 } |
14968 | 15633 |
14969 /** | 15634 /** |
14970 * xmlCtxtReadIO: | 15635 * xmlCtxtReadIO: |
14971 * @ctxt: an XML parser context | 15636 * @ctxt: an XML parser context |
14972 * @ioread: an I/O read function | 15637 * @ioread: an I/O read function |
14973 * @ioclose: an I/O close function | 15638 * @ioclose: an I/O close function |
14974 * @ioctx: an I/O handler | 15639 * @ioctx: an I/O handler |
14975 * @URL: the base URL to use for the document | 15640 * @URL: the base URL to use for the document |
14976 * @encoding: the document encoding, or NULL | 15641 * @encoding: the document encoding, or NULL |
14977 * @options: a combination of xmlParserOption | 15642 * @options: a combination of xmlParserOption |
14978 * | 15643 * |
14979 * parse an XML document from I/O functions and source and build a tree. | 15644 * parse an XML document from I/O functions and source and build a tree. |
14980 * This reuses the existing @ctxt parser context | 15645 * This reuses the existing @ctxt parser context |
14981 * | 15646 * |
14982 * Returns the resulting document tree | 15647 * Returns the resulting document tree |
14983 */ | 15648 */ |
14984 xmlDocPtr | 15649 xmlDocPtr |
14985 xmlCtxtReadIO(xmlParserCtxtPtr ctxt, xmlInputReadCallback ioread, | 15650 xmlCtxtReadIO(xmlParserCtxtPtr ctxt, xmlInputReadCallback ioread, |
14986 xmlInputCloseCallback ioclose, void *ioctx, | 15651 xmlInputCloseCallback ioclose, void *ioctx, |
14987 const char *URL, | 15652 const char *URL, |
14988 const char *encoding, int options) | 15653 const char *encoding, int options) |
14989 { | 15654 { |
14990 xmlParserInputBufferPtr input; | 15655 xmlParserInputBufferPtr input; |
14991 xmlParserInputPtr stream; | 15656 xmlParserInputPtr stream; |
14992 | 15657 |
14993 if (ioread == NULL) | 15658 if (ioread == NULL) |
14994 return (NULL); | 15659 return (NULL); |
14995 if (ctxt == NULL) | 15660 if (ctxt == NULL) |
14996 return (NULL); | 15661 return (NULL); |
| 15662 xmlInitParser(); |
14997 | 15663 |
14998 xmlCtxtReset(ctxt); | 15664 xmlCtxtReset(ctxt); |
14999 | 15665 |
15000 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, | 15666 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, |
15001 XML_CHAR_ENCODING_NONE); | 15667 XML_CHAR_ENCODING_NONE); |
15002 if (input == NULL) | 15668 if (input == NULL) { |
| 15669 if (ioclose != NULL) |
| 15670 ioclose(ioctx); |
15003 return (NULL); | 15671 return (NULL); |
| 15672 } |
15004 stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); | 15673 stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); |
15005 if (stream == NULL) { | 15674 if (stream == NULL) { |
15006 xmlFreeParserInputBuffer(input); | 15675 xmlFreeParserInputBuffer(input); |
15007 return (NULL); | 15676 return (NULL); |
15008 } | 15677 } |
15009 inputPush(ctxt, stream); | 15678 inputPush(ctxt, stream); |
15010 return (xmlDoRead(ctxt, URL, encoding, options, 1)); | 15679 return (xmlDoRead(ctxt, URL, encoding, options, 1)); |
15011 } | 15680 } |
15012 | 15681 |
15013 #define bottom_parser | 15682 #define bottom_parser |
15014 #include "elfgcchack.h" | 15683 #include "elfgcchack.h" |
OLD | NEW |