| OLD | NEW |
| 1 /* | 1 /* |
| 2 * SAX2.c : Default SAX2 handler to build a tree. | 2 * SAX2.c : Default SAX2 handler to build a tree. |
| 3 * | 3 * |
| 4 * See Copyright for the status of this software. | 4 * See Copyright for the status of this software. |
| 5 * | 5 * |
| 6 * Daniel Veillard <daniel@veillard.com> | 6 * Daniel Veillard <daniel@veillard.com> |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #define IN_LIBXML | 10 #define IN_LIBXML |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 /** | 38 /** |
| 39 * TODO: | 39 * TODO: |
| 40 * | 40 * |
| 41 * macro to flag unimplemented blocks | 41 * macro to flag unimplemented blocks |
| 42 * XML_CATALOG_PREFER user env to select between system/public prefered | 42 * XML_CATALOG_PREFER user env to select between system/public prefered |
| 43 * option. C.f. Richard Tobin <richard@cogsci.ed.ac.uk> | 43 * option. C.f. Richard Tobin <richard@cogsci.ed.ac.uk> |
| 44 *> Just FYI, I am using an environment variable XML_CATALOG_PREFER with | 44 *> Just FYI, I am using an environment variable XML_CATALOG_PREFER with |
| 45 *> values "system" and "public". I have made the default be "system" to | 45 *> values "system" and "public". I have made the default be "system" to |
| 46 *> match yours. | 46 *> match yours. |
| 47 */ | 47 */ |
| 48 #define TODO » » » » » » » » \ | 48 #define TODO» » » » » » » » \ |
| 49 xmlGenericError(xmlGenericErrorContext, \ | 49 xmlGenericError(xmlGenericErrorContext, \ |
| 50 "Unimplemented block at %s:%d\n", \ | 50 "Unimplemented block at %s:%d\n", \ |
| 51 __FILE__, __LINE__); | 51 __FILE__, __LINE__); |
| 52 | 52 |
| 53 /* | 53 /* |
| 54 * xmlSAX2ErrMemory: | 54 * xmlSAX2ErrMemory: |
| 55 * @ctxt: an XML validation parser context | 55 * @ctxt: an XML validation parser context |
| 56 * @msg: a string to accompany the error message | 56 * @msg: a string to accompany the error message |
| 57 */ | 57 */ |
| 58 static void | 58 static void |
| 59 xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt, const char *msg) { | 59 xmlSAX2ErrMemory(xmlParserCtxtPtr ctxt, const char *msg) { |
| 60 xmlStructuredErrorFunc schannel = NULL; |
| 61 const char *str1 = "out of memory\n"; |
| 62 |
| 60 if (ctxt != NULL) { | 63 if (ctxt != NULL) { |
| 61 » if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) | 64 » ctxt->errNo = XML_ERR_NO_MEMORY; |
| 62 » ctxt->sax->error(ctxt->userData, "%s: out of memory\n", msg); | 65 » if ((ctxt->sax != NULL) && (ctxt->sax->initialized == XML_SAX2_MAGIC)) |
| 66 » schannel = ctxt->sax->serror; |
| 67 » __xmlRaiseError(schannel, |
| 68 » » » ctxt->vctxt.error, ctxt->vctxt.userData, |
| 69 » » » ctxt, NULL, XML_FROM_PARSER, XML_ERR_NO_MEMORY, |
| 70 » » » XML_ERR_ERROR, NULL, 0, (const char *) str1, |
| 71 » » » NULL, NULL, 0, 0, |
| 72 » » » msg, (const char *) str1, NULL); |
| 63 ctxt->errNo = XML_ERR_NO_MEMORY; | 73 ctxt->errNo = XML_ERR_NO_MEMORY; |
| 64 ctxt->instate = XML_PARSER_EOF; | 74 ctxt->instate = XML_PARSER_EOF; |
| 65 ctxt->disableSAX = 1; | 75 ctxt->disableSAX = 1; |
| 76 } else { |
| 77 __xmlRaiseError(schannel, |
| 78 NULL, NULL, |
| 79 ctxt, NULL, XML_FROM_PARSER, XML_ERR_NO_MEMORY, |
| 80 XML_ERR_ERROR, NULL, 0, (const char *) str1, |
| 81 NULL, NULL, 0, 0, |
| 82 msg, (const char *) str1, NULL); |
| 66 } | 83 } |
| 67 } | 84 } |
| 68 | 85 |
| 69 /** | 86 /** |
| 70 * xmlValidError: | 87 * xmlValidError: |
| 71 * @ctxt: an XML validation parser context | 88 * @ctxt: an XML validation parser context |
| 72 * @error: the error number | 89 * @error: the error number |
| 73 * @msg: the error message | 90 * @msg: the error message |
| 74 * @str1: extra data | 91 * @str1: extra data |
| 75 * @str2: extra data | 92 * @str2: extra data |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 static void | 136 static void |
| 120 xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 137 xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 121 const char *msg, const xmlChar *str1, const xmlChar *str2) | 138 const char *msg, const xmlChar *str1, const xmlChar *str2) |
| 122 { | 139 { |
| 123 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 140 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 124 (ctxt->instate == XML_PARSER_EOF)) | 141 (ctxt->instate == XML_PARSER_EOF)) |
| 125 return; | 142 return; |
| 126 if (ctxt != NULL) | 143 if (ctxt != NULL) |
| 127 ctxt->errNo = error; | 144 ctxt->errNo = error; |
| 128 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, | 145 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, |
| 129 XML_ERR_FATAL, NULL, 0, | 146 XML_ERR_FATAL, NULL, 0, |
| 130 (const char *) str1, (const char *) str2, | 147 (const char *) str1, (const char *) str2, |
| 131 NULL, 0, 0, msg, str1, str2); | 148 NULL, 0, 0, msg, str1, str2); |
| 132 if (ctxt != NULL) { | 149 if (ctxt != NULL) { |
| 133 ctxt->wellFormed = 0; | 150 ctxt->wellFormed = 0; |
| 134 ctxt->valid = 0; | 151 ctxt->valid = 0; |
| 135 if (ctxt->recovery == 0) | 152 if (ctxt->recovery == 0) |
| 136 ctxt->disableSAX = 1; | 153 ctxt->disableSAX = 1; |
| 137 } | 154 } |
| 138 } | 155 } |
| 139 | 156 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 150 static void | 167 static void |
| 151 xmlWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 168 xmlWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 152 const char *msg, const xmlChar *str1) | 169 const char *msg, const xmlChar *str1) |
| 153 { | 170 { |
| 154 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 171 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 155 (ctxt->instate == XML_PARSER_EOF)) | 172 (ctxt->instate == XML_PARSER_EOF)) |
| 156 return; | 173 return; |
| 157 if (ctxt != NULL) | 174 if (ctxt != NULL) |
| 158 ctxt->errNo = error; | 175 ctxt->errNo = error; |
| 159 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, | 176 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, |
| 160 XML_ERR_WARNING, NULL, 0, | 177 XML_ERR_WARNING, NULL, 0, |
| 161 (const char *) str1, NULL, | 178 (const char *) str1, NULL, |
| 162 NULL, 0, 0, msg, str1); | 179 NULL, 0, 0, msg, str1); |
| 163 } | 180 } |
| 164 | 181 |
| 165 /** | 182 /** |
| 166 * xmlNsErrMsg: | 183 * xmlNsErrMsg: |
| 167 * @ctxt: an XML parser context | 184 * @ctxt: an XML parser context |
| 168 * @error: the error number | 185 * @error: the error number |
| 169 * @msg: the error message | 186 * @msg: the error message |
| 170 * @str1: an error string | 187 * @str1: an error string |
| 171 * @str2: an error string | 188 * @str2: an error string |
| 172 * | 189 * |
| 173 * Handle a namespace error | 190 * Handle a namespace error |
| 174 */ | 191 */ |
| 175 static void | 192 static void |
| 176 xmlNsErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 193 xmlNsErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 177 const char *msg, const xmlChar *str1, const xmlChar *str2) | 194 const char *msg, const xmlChar *str1, const xmlChar *str2) |
| 178 { | 195 { |
| 179 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 196 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 180 (ctxt->instate == XML_PARSER_EOF)) | 197 (ctxt->instate == XML_PARSER_EOF)) |
| 181 return; | 198 return; |
| 182 if (ctxt != NULL) | 199 if (ctxt != NULL) |
| 183 ctxt->errNo = error; | 200 ctxt->errNo = error; |
| 184 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, | 201 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, |
| 185 XML_ERR_ERROR, NULL, 0, | 202 XML_ERR_ERROR, NULL, 0, |
| 186 (const char *) str1, (const char *) str2, | 203 (const char *) str1, (const char *) str2, |
| 187 NULL, 0, 0, msg, str1, str2); | 204 NULL, 0, 0, msg, str1, str2); |
| 188 } | 205 } |
| 189 | 206 |
| 190 /** | 207 /** |
| 191 * xmlNsWarnMsg: | 208 * xmlNsWarnMsg: |
| 192 * @ctxt: an XML parser context | 209 * @ctxt: an XML parser context |
| 193 * @error: the error number | 210 * @error: the error number |
| 194 * @msg: the error message | 211 * @msg: the error message |
| 195 * @str1: an error string | 212 * @str1: an error string |
| 196 * | 213 * |
| 197 * Handle a namespace warning | 214 * Handle a namespace warning |
| 198 */ | 215 */ |
| 199 static void | 216 static void |
| 200 xmlNsWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 217 xmlNsWarnMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 201 const char *msg, const xmlChar *str1, const xmlChar *str2) | 218 const char *msg, const xmlChar *str1, const xmlChar *str2) |
| 202 { | 219 { |
| 203 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 220 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 204 (ctxt->instate == XML_PARSER_EOF)) | 221 (ctxt->instate == XML_PARSER_EOF)) |
| 205 return; | 222 return; |
| 206 if (ctxt != NULL) | 223 if (ctxt != NULL) |
| 207 ctxt->errNo = error; | 224 ctxt->errNo = error; |
| 208 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, | 225 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, |
| 209 XML_ERR_WARNING, NULL, 0, | 226 XML_ERR_WARNING, NULL, 0, |
| 210 (const char *) str1, (const char *) str2, | 227 (const char *) str1, (const char *) str2, |
| 211 NULL, 0, 0, msg, str1, str2); | 228 NULL, 0, 0, msg, str1, str2); |
| 212 } | 229 } |
| 213 | 230 |
| 214 /** | 231 /** |
| 215 * xmlSAX2GetPublicId: | 232 * xmlSAX2GetPublicId: |
| 216 * @ctx: the user data (XML parser context) | 233 * @ctx: the user data (XML parser context) |
| 217 * | 234 * |
| 218 * Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" | 235 * Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN" |
| 219 * | 236 * |
| (...skipping 13 matching lines...) Expand all Loading... |
| 233 * Provides the system ID, basically URL or filename e.g. | 250 * Provides the system ID, basically URL or filename e.g. |
| 234 * http://www.sgmlsource.com/dtds/memo.dtd | 251 * http://www.sgmlsource.com/dtds/memo.dtd |
| 235 * | 252 * |
| 236 * Returns a xmlChar * | 253 * Returns a xmlChar * |
| 237 */ | 254 */ |
| 238 const xmlChar * | 255 const xmlChar * |
| 239 xmlSAX2GetSystemId(void *ctx) | 256 xmlSAX2GetSystemId(void *ctx) |
| 240 { | 257 { |
| 241 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; | 258 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; |
| 242 if ((ctx == NULL) || (ctxt->input == NULL)) return(NULL); | 259 if ((ctx == NULL) || (ctxt->input == NULL)) return(NULL); |
| 243 return((const xmlChar *) ctxt->input->filename); | 260 return((const xmlChar *) ctxt->input->filename); |
| 244 } | 261 } |
| 245 | 262 |
| 246 /** | 263 /** |
| 247 * xmlSAX2GetLineNumber: | 264 * xmlSAX2GetLineNumber: |
| 248 * @ctx: the user data (XML parser context) | 265 * @ctx: the user data (XML parser context) |
| 249 * | 266 * |
| 250 * Provide the line number of the current parsing point. | 267 * Provide the line number of the current parsing point. |
| 251 * | 268 * |
| 252 * Returns an int | 269 * Returns an int |
| 253 */ | 270 */ |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 if (ctxt->myDoc == NULL) | 365 if (ctxt->myDoc == NULL) |
| 349 return; | 366 return; |
| 350 dtd = xmlGetIntSubset(ctxt->myDoc); | 367 dtd = xmlGetIntSubset(ctxt->myDoc); |
| 351 if (dtd != NULL) { | 368 if (dtd != NULL) { |
| 352 if (ctxt->html) | 369 if (ctxt->html) |
| 353 return; | 370 return; |
| 354 xmlUnlinkNode((xmlNodePtr) dtd); | 371 xmlUnlinkNode((xmlNodePtr) dtd); |
| 355 xmlFreeDtd(dtd); | 372 xmlFreeDtd(dtd); |
| 356 ctxt->myDoc->intSubset = NULL; | 373 ctxt->myDoc->intSubset = NULL; |
| 357 } | 374 } |
| 358 ctxt->myDoc->intSubset = | 375 ctxt->myDoc->intSubset = |
| 359 xmlCreateIntSubset(ctxt->myDoc, name, ExternalID, SystemID); | 376 xmlCreateIntSubset(ctxt->myDoc, name, ExternalID, SystemID); |
| 360 if (ctxt->myDoc->intSubset == NULL) | 377 if (ctxt->myDoc->intSubset == NULL) |
| 361 xmlSAX2ErrMemory(ctxt, "xmlSAX2InternalSubset"); | 378 xmlSAX2ErrMemory(ctxt, "xmlSAX2InternalSubset"); |
| 362 } | 379 } |
| 363 | 380 |
| 364 /** | 381 /** |
| 365 * xmlSAX2ExternalSubset: | 382 * xmlSAX2ExternalSubset: |
| 366 * @ctx: the user data (XML parser context) | 383 * @ctx: the user data (XML parser context) |
| 367 * @name: the root element name | 384 * @name: the root element name |
| 368 * @ExternalID: the external ID | 385 * @ExternalID: the external ID |
| (...skipping 18 matching lines...) Expand all Loading... |
| 387 /* | 404 /* |
| 388 * Try to fetch and parse the external subset. | 405 * Try to fetch and parse the external subset. |
| 389 */ | 406 */ |
| 390 xmlParserInputPtr oldinput; | 407 xmlParserInputPtr oldinput; |
| 391 int oldinputNr; | 408 int oldinputNr; |
| 392 int oldinputMax; | 409 int oldinputMax; |
| 393 xmlParserInputPtr *oldinputTab; | 410 xmlParserInputPtr *oldinputTab; |
| 394 xmlParserInputPtr input = NULL; | 411 xmlParserInputPtr input = NULL; |
| 395 xmlCharEncoding enc; | 412 xmlCharEncoding enc; |
| 396 int oldcharset; | 413 int oldcharset; |
| 414 const xmlChar *oldencoding; |
| 397 | 415 |
| 398 /* | 416 /* |
| 399 * Ask the Entity resolver to load the damn thing | 417 * Ask the Entity resolver to load the damn thing |
| 400 */ | 418 */ |
| 401 if ((ctxt->sax != NULL) && (ctxt->sax->resolveEntity != NULL)) | 419 if ((ctxt->sax != NULL) && (ctxt->sax->resolveEntity != NULL)) |
| 402 input = ctxt->sax->resolveEntity(ctxt->userData, ExternalID, | 420 input = ctxt->sax->resolveEntity(ctxt->userData, ExternalID, |
| 403 SystemID); | 421 SystemID); |
| 404 if (input == NULL) { | 422 if (input == NULL) { |
| 405 return; | 423 return; |
| 406 } | 424 } |
| 407 | 425 |
| 408 xmlNewDtd(ctxt->myDoc, name, ExternalID, SystemID); | 426 xmlNewDtd(ctxt->myDoc, name, ExternalID, SystemID); |
| 409 | 427 |
| 410 /* | 428 /* |
| 411 * make sure we won't destroy the main document context | 429 * make sure we won't destroy the main document context |
| 412 */ | 430 */ |
| 413 oldinput = ctxt->input; | 431 oldinput = ctxt->input; |
| 414 oldinputNr = ctxt->inputNr; | 432 oldinputNr = ctxt->inputNr; |
| 415 oldinputMax = ctxt->inputMax; | 433 oldinputMax = ctxt->inputMax; |
| 416 oldinputTab = ctxt->inputTab; | 434 oldinputTab = ctxt->inputTab; |
| 417 oldcharset = ctxt->charset; | 435 oldcharset = ctxt->charset; |
| 436 oldencoding = ctxt->encoding; |
| 437 ctxt->encoding = NULL; |
| 418 | 438 |
| 419 ctxt->inputTab = (xmlParserInputPtr *) | 439 ctxt->inputTab = (xmlParserInputPtr *) |
| 420 xmlMalloc(5 * sizeof(xmlParserInputPtr)); | 440 xmlMalloc(5 * sizeof(xmlParserInputPtr)); |
| 421 if (ctxt->inputTab == NULL) { | 441 if (ctxt->inputTab == NULL) { |
| 422 xmlSAX2ErrMemory(ctxt, "xmlSAX2ExternalSubset"); | 442 xmlSAX2ErrMemory(ctxt, "xmlSAX2ExternalSubset"); |
| 423 ctxt->input = oldinput; | 443 ctxt->input = oldinput; |
| 424 ctxt->inputNr = oldinputNr; | 444 ctxt->inputNr = oldinputNr; |
| 425 ctxt->inputMax = oldinputMax; | 445 ctxt->inputMax = oldinputMax; |
| 426 ctxt->inputTab = oldinputTab; | 446 ctxt->inputTab = oldinputTab; |
| 427 ctxt->charset = oldcharset; | 447 ctxt->charset = oldcharset; |
| 448 ctxt->encoding = oldencoding; |
| 428 return; | 449 return; |
| 429 } | 450 } |
| 430 ctxt->inputNr = 0; | 451 ctxt->inputNr = 0; |
| 431 ctxt->inputMax = 5; | 452 ctxt->inputMax = 5; |
| 432 ctxt->input = NULL; | 453 ctxt->input = NULL; |
| 433 xmlPushInput(ctxt, input); | 454 xmlPushInput(ctxt, input); |
| 434 | 455 |
| 435 /* | 456 /* |
| 436 * On the fly encoding conversion if needed | 457 * On the fly encoding conversion if needed |
| 437 */ | 458 */ |
| (...skipping 25 matching lines...) Expand all Loading... |
| 463 xmlFree(ctxt->inputTab); | 484 xmlFree(ctxt->inputTab); |
| 464 | 485 |
| 465 /* | 486 /* |
| 466 * Restore the parsing context of the main entity | 487 * Restore the parsing context of the main entity |
| 467 */ | 488 */ |
| 468 ctxt->input = oldinput; | 489 ctxt->input = oldinput; |
| 469 ctxt->inputNr = oldinputNr; | 490 ctxt->inputNr = oldinputNr; |
| 470 ctxt->inputMax = oldinputMax; | 491 ctxt->inputMax = oldinputMax; |
| 471 ctxt->inputTab = oldinputTab; | 492 ctxt->inputTab = oldinputTab; |
| 472 ctxt->charset = oldcharset; | 493 ctxt->charset = oldcharset; |
| 494 if ((ctxt->encoding != NULL) && |
| 495 ((ctxt->dict == NULL) || |
| 496 (!xmlDictOwns(ctxt->dict, ctxt->encoding)))) |
| 497 xmlFree((xmlChar *) ctxt->encoding); |
| 498 ctxt->encoding = oldencoding; |
| 473 /* ctxt->wellFormed = oldwellFormed; */ | 499 /* ctxt->wellFormed = oldwellFormed; */ |
| 474 } | 500 } |
| 475 } | 501 } |
| 476 | 502 |
| 477 /** | 503 /** |
| 478 * xmlSAX2ResolveEntity: | 504 * xmlSAX2ResolveEntity: |
| 479 * @ctx: the user data (XML parser context) | 505 * @ctx: the user data (XML parser context) |
| 480 * @publicId: The public ID of the entity | 506 * @publicId: The public ID of the entity |
| 481 * @systemId: The system ID of the entity | 507 * @systemId: The system ID of the entity |
| 482 * | 508 * |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 567 ((ctxt->validate) || (ctxt->replaceEntities)) && | 593 ((ctxt->validate) || (ctxt->replaceEntities)) && |
| 568 (ret->children == NULL) && | 594 (ret->children == NULL) && |
| 569 (ret->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) { | 595 (ret->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) { |
| 570 int val; | 596 int val; |
| 571 | 597 |
| 572 /* | 598 /* |
| 573 * for validation purposes we really need to fetch and | 599 * for validation purposes we really need to fetch and |
| 574 * parse the external entity | 600 * parse the external entity |
| 575 */ | 601 */ |
| 576 xmlNodePtr children; | 602 xmlNodePtr children; |
| 603 unsigned long oldnbent = ctxt->nbentities; |
| 577 | 604 |
| 578 val = xmlParseCtxtExternalEntity(ctxt, ret->URI, | 605 val = xmlParseCtxtExternalEntity(ctxt, ret->URI, |
| 579 ret->ExternalID, &children); | 606 ret->ExternalID, &children); |
| 580 if (val == 0) { | 607 if (val == 0) { |
| 581 xmlAddChildList((xmlNodePtr) ret, children); | 608 xmlAddChildList((xmlNodePtr) ret, children); |
| 582 } else { | 609 } else { |
| 583 xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_PROCESSING, | 610 xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_PROCESSING, |
| 584 "Failure to process entity %s\n", name, NULL); | 611 "Failure to process entity %s\n", name, NULL); |
| 585 ctxt->validate = 0; | 612 ctxt->validate = 0; |
| 586 return(NULL); | 613 return(NULL); |
| 587 } | 614 } |
| 588 ret->owner = 1; | 615 ret->owner = 1; |
| 589 » if (ret->checked == 0) | 616 » if (ret->checked == 0) { |
| 590 » ret->checked = 1; | 617 » ret->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
| 618 » if ((ret->content != NULL) && (xmlStrchr(ret->content, '<'))) |
| 619 » ret->checked |= 1; |
| 620 » } |
| 591 } | 621 } |
| 592 return(ret); | 622 return(ret); |
| 593 } | 623 } |
| 594 | 624 |
| 595 /** | 625 /** |
| 596 * xmlSAX2GetParameterEntity: | 626 * xmlSAX2GetParameterEntity: |
| 597 * @ctx: the user data (XML parser context) | 627 * @ctx: the user data (XML parser context) |
| 598 * @name: The entity name | 628 * @name: The entity name |
| 599 * | 629 * |
| 600 * Get a parameter entity by name | 630 * Get a parameter entity by name |
| (...skipping 13 matching lines...) Expand all Loading... |
| 614 #endif | 644 #endif |
| 615 | 645 |
| 616 ret = xmlGetParameterEntity(ctxt->myDoc, name); | 646 ret = xmlGetParameterEntity(ctxt->myDoc, name); |
| 617 return(ret); | 647 return(ret); |
| 618 } | 648 } |
| 619 | 649 |
| 620 | 650 |
| 621 /** | 651 /** |
| 622 * xmlSAX2EntityDecl: | 652 * xmlSAX2EntityDecl: |
| 623 * @ctx: the user data (XML parser context) | 653 * @ctx: the user data (XML parser context) |
| 624 * @name: the entity name | 654 * @name: the entity name |
| 625 * @type: the entity type | 655 * @type: the entity type |
| 626 * @publicId: The public ID of the entity | 656 * @publicId: The public ID of the entity |
| 627 * @systemId: The system ID of the entity | 657 * @systemId: The system ID of the entity |
| 628 * @content: the entity value (without processing). | 658 * @content: the entity value (without processing). |
| 629 * | 659 * |
| 630 * An entity definition has been parsed | 660 * An entity definition has been parsed |
| 631 */ | 661 */ |
| 632 void | 662 void |
| 633 xmlSAX2EntityDecl(void *ctx, const xmlChar *name, int type, | 663 xmlSAX2EntityDecl(void *ctx, const xmlChar *name, int type, |
| 634 const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) | 664 const xmlChar *publicId, const xmlChar *systemId, xmlChar *content) |
| 635 { | 665 { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 650 "Entity(%s) already defined in the internal subset\n", | 680 "Entity(%s) already defined in the internal subset\n", |
| 651 name); | 681 name); |
| 652 if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { | 682 if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { |
| 653 xmlChar *URI; | 683 xmlChar *URI; |
| 654 const char *base = NULL; | 684 const char *base = NULL; |
| 655 | 685 |
| 656 if (ctxt->input != NULL) | 686 if (ctxt->input != NULL) |
| 657 base = ctxt->input->filename; | 687 base = ctxt->input->filename; |
| 658 if (base == NULL) | 688 if (base == NULL) |
| 659 base = ctxt->directory; | 689 base = ctxt->directory; |
| 660 » | 690 |
| 661 URI = xmlBuildURI(systemId, (const xmlChar *) base); | 691 URI = xmlBuildURI(systemId, (const xmlChar *) base); |
| 662 ent->URI = URI; | 692 ent->URI = URI; |
| 663 } | 693 } |
| 664 } else if (ctxt->inSubset == 2) { | 694 } else if (ctxt->inSubset == 2) { |
| 665 ent = xmlAddDtdEntity(ctxt->myDoc, name, type, publicId, | 695 ent = xmlAddDtdEntity(ctxt->myDoc, name, type, publicId, |
| 666 systemId, content); | 696 systemId, content); |
| 667 if ((ent == NULL) && (ctxt->pedantic) && | 697 if ((ent == NULL) && (ctxt->pedantic) && |
| 668 (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) | 698 (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) |
| 669 » ctxt->sax->warning(ctxt->userData, | 699 » ctxt->sax->warning(ctxt->userData, |
| 670 "Entity(%s) already defined in the external subset\n", name); | 700 "Entity(%s) already defined in the external subset\n", name); |
| 671 if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { | 701 if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { |
| 672 xmlChar *URI; | 702 xmlChar *URI; |
| 673 const char *base = NULL; | 703 const char *base = NULL; |
| 674 | 704 |
| 675 if (ctxt->input != NULL) | 705 if (ctxt->input != NULL) |
| 676 base = ctxt->input->filename; | 706 base = ctxt->input->filename; |
| 677 if (base == NULL) | 707 if (base == NULL) |
| 678 base = ctxt->directory; | 708 base = ctxt->directory; |
| 679 » | 709 |
| 680 URI = xmlBuildURI(systemId, (const xmlChar *) base); | 710 URI = xmlBuildURI(systemId, (const xmlChar *) base); |
| 681 ent->URI = URI; | 711 ent->URI = URI; |
| 682 } | 712 } |
| 683 } else { | 713 } else { |
| 684 xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_PROCESSING, | 714 xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_PROCESSING, |
| 685 "SAX.xmlSAX2EntityDecl(%s) called while not in subset\n", | 715 "SAX.xmlSAX2EntityDecl(%s) called while not in subset\n", |
| 686 name, NULL); | 716 name, NULL); |
| 687 } | 717 } |
| 688 } | 718 } |
| 689 | 719 |
| 690 /** | 720 /** |
| 691 * xmlSAX2AttributeDecl: | 721 * xmlSAX2AttributeDecl: |
| 692 * @ctx: the user data (XML parser context) | 722 * @ctx: the user data (XML parser context) |
| 693 * @elem: the name of the element | 723 * @elem: the name of the element |
| 694 * @fullname: the attribute name | 724 * @fullname: the attribute name |
| 695 * @type: the attribute type | 725 * @type: the attribute type |
| 696 * @def: the type of default value | 726 * @def: the type of default value |
| 697 * @defaultValue: the attribute default value | 727 * @defaultValue: the attribute default value |
| 698 * @tree: the tree of enumerated value set | 728 * @tree: the tree of enumerated value set |
| 699 * | 729 * |
| 700 * An attribute definition has been parsed | 730 * An attribute definition has been parsed |
| 701 */ | 731 */ |
| 702 void | 732 void |
| 703 xmlSAX2AttributeDecl(void *ctx, const xmlChar *elem, const xmlChar *fullname, | 733 xmlSAX2AttributeDecl(void *ctx, const xmlChar *elem, const xmlChar *fullname, |
| 704 int type, int def, const xmlChar *defaultValue, | 734 int type, int def, const xmlChar *defaultValue, |
| 705 xmlEnumerationPtr tree) | 735 xmlEnumerationPtr tree) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 728 } | 758 } |
| 729 /* TODO: optimize name/prefix allocation */ | 759 /* TODO: optimize name/prefix allocation */ |
| 730 name = xmlSplitQName(ctxt, fullname, &prefix); | 760 name = xmlSplitQName(ctxt, fullname, &prefix); |
| 731 ctxt->vctxt.valid = 1; | 761 ctxt->vctxt.valid = 1; |
| 732 if (ctxt->inSubset == 1) | 762 if (ctxt->inSubset == 1) |
| 733 attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, elem, | 763 attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->intSubset, elem, |
| 734 name, prefix, (xmlAttributeType) type, | 764 name, prefix, (xmlAttributeType) type, |
| 735 (xmlAttributeDefault) def, defaultValue, tree); | 765 (xmlAttributeDefault) def, defaultValue, tree); |
| 736 else if (ctxt->inSubset == 2) | 766 else if (ctxt->inSubset == 2) |
| 737 attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, elem, | 767 attr = xmlAddAttributeDecl(&ctxt->vctxt, ctxt->myDoc->extSubset, elem, |
| 738 » name, prefix, (xmlAttributeType) type, | 768 » name, prefix, (xmlAttributeType) type, |
| 739 (xmlAttributeDefault) def, defaultValue, tree); | 769 (xmlAttributeDefault) def, defaultValue, tree); |
| 740 else { | 770 else { |
| 741 xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, | 771 xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, |
| 742 "SAX.xmlSAX2AttributeDecl(%s) called while not in subset\n", | 772 "SAX.xmlSAX2AttributeDecl(%s) called while not in subset\n", |
| 743 name, NULL); | 773 name, NULL); |
| 744 xmlFreeEnumeration(tree); | 774 xmlFreeEnumeration(tree); |
| 745 return; | 775 return; |
| 746 } | 776 } |
| 747 #ifdef LIBXML_VALID_ENABLED | 777 #ifdef LIBXML_VALID_ENABLED |
| 748 if (ctxt->vctxt.valid == 0) | 778 if (ctxt->vctxt.valid == 0) |
| 749 ctxt->valid = 0; | 779 ctxt->valid = 0; |
| 750 if ((attr != NULL) && (ctxt->validate) && (ctxt->wellFormed) && | 780 if ((attr != NULL) && (ctxt->validate) && (ctxt->wellFormed) && |
| 751 (ctxt->myDoc->intSubset != NULL)) | 781 (ctxt->myDoc->intSubset != NULL)) |
| 752 ctxt->valid &= xmlValidateAttributeDecl(&ctxt->vctxt, ctxt->myDoc, | 782 ctxt->valid &= xmlValidateAttributeDecl(&ctxt->vctxt, ctxt->myDoc, |
| 753 attr); | 783 attr); |
| 754 #endif /* LIBXML_VALID_ENABLED */ | 784 #endif /* LIBXML_VALID_ENABLED */ |
| 755 if (prefix != NULL) | 785 if (prefix != NULL) |
| 756 xmlFree(prefix); | 786 xmlFree(prefix); |
| 757 if (name != NULL) | 787 if (name != NULL) |
| 758 xmlFree(name); | 788 xmlFree(name); |
| 759 } | 789 } |
| 760 | 790 |
| 761 /** | 791 /** |
| 762 * xmlSAX2ElementDecl: | 792 * xmlSAX2ElementDecl: |
| 763 * @ctx: the user data (XML parser context) | 793 * @ctx: the user data (XML parser context) |
| 764 * @name: the element name | 794 * @name: the element name |
| 765 * @type: the element type | 795 * @type: the element type |
| 766 * @content: the element value tree | 796 * @content: the element value tree |
| 767 * | 797 * |
| 768 * An element definition has been parsed | 798 * An element definition has been parsed |
| 769 */ | 799 */ |
| 770 void | 800 void |
| 771 xmlSAX2ElementDecl(void *ctx, const xmlChar * name, int type, | 801 xmlSAX2ElementDecl(void *ctx, const xmlChar * name, int type, |
| 772 xmlElementContentPtr content) | 802 xmlElementContentPtr content) |
| 773 { | 803 { |
| 774 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; | 804 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; |
| 775 xmlElementPtr elem = NULL; | 805 xmlElementPtr elem = NULL; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 876 xmlGenericError(xmlGenericErrorContext, | 906 xmlGenericError(xmlGenericErrorContext, |
| 877 "SAX.xmlSAX2UnparsedEntityDecl(%s, %s, %s, %s)\n", | 907 "SAX.xmlSAX2UnparsedEntityDecl(%s, %s, %s, %s)\n", |
| 878 name, publicId, systemId, notationName); | 908 name, publicId, systemId, notationName); |
| 879 #endif | 909 #endif |
| 880 if (ctxt->inSubset == 1) { | 910 if (ctxt->inSubset == 1) { |
| 881 ent = xmlAddDocEntity(ctxt->myDoc, name, | 911 ent = xmlAddDocEntity(ctxt->myDoc, name, |
| 882 XML_EXTERNAL_GENERAL_UNPARSED_ENTITY, | 912 XML_EXTERNAL_GENERAL_UNPARSED_ENTITY, |
| 883 publicId, systemId, notationName); | 913 publicId, systemId, notationName); |
| 884 if ((ent == NULL) && (ctxt->pedantic) && | 914 if ((ent == NULL) && (ctxt->pedantic) && |
| 885 (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) | 915 (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) |
| 886 » ctxt->sax->warning(ctxt->userData, | 916 » ctxt->sax->warning(ctxt->userData, |
| 887 "Entity(%s) already defined in the internal subset\n", name); | 917 "Entity(%s) already defined in the internal subset\n", name); |
| 888 if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { | 918 if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { |
| 889 xmlChar *URI; | 919 xmlChar *URI; |
| 890 const char *base = NULL; | 920 const char *base = NULL; |
| 891 | 921 |
| 892 if (ctxt->input != NULL) | 922 if (ctxt->input != NULL) |
| 893 base = ctxt->input->filename; | 923 base = ctxt->input->filename; |
| 894 if (base == NULL) | 924 if (base == NULL) |
| 895 base = ctxt->directory; | 925 base = ctxt->directory; |
| 896 » | 926 |
| 897 URI = xmlBuildURI(systemId, (const xmlChar *) base); | 927 URI = xmlBuildURI(systemId, (const xmlChar *) base); |
| 898 ent->URI = URI; | 928 ent->URI = URI; |
| 899 } | 929 } |
| 900 } else if (ctxt->inSubset == 2) { | 930 } else if (ctxt->inSubset == 2) { |
| 901 ent = xmlAddDtdEntity(ctxt->myDoc, name, | 931 ent = xmlAddDtdEntity(ctxt->myDoc, name, |
| 902 XML_EXTERNAL_GENERAL_UNPARSED_ENTITY, | 932 XML_EXTERNAL_GENERAL_UNPARSED_ENTITY, |
| 903 publicId, systemId, notationName); | 933 publicId, systemId, notationName); |
| 904 if ((ent == NULL) && (ctxt->pedantic) && | 934 if ((ent == NULL) && (ctxt->pedantic) && |
| 905 (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) | 935 (ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) |
| 906 » ctxt->sax->warning(ctxt->userData, | 936 » ctxt->sax->warning(ctxt->userData, |
| 907 "Entity(%s) already defined in the external subset\n", name); | 937 "Entity(%s) already defined in the external subset\n", name); |
| 908 if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { | 938 if ((ent != NULL) && (ent->URI == NULL) && (systemId != NULL)) { |
| 909 xmlChar *URI; | 939 xmlChar *URI; |
| 910 const char *base = NULL; | 940 const char *base = NULL; |
| 911 | 941 |
| 912 if (ctxt->input != NULL) | 942 if (ctxt->input != NULL) |
| 913 base = ctxt->input->filename; | 943 base = ctxt->input->filename; |
| 914 if (base == NULL) | 944 if (base == NULL) |
| 915 base = ctxt->directory; | 945 base = ctxt->directory; |
| 916 » | 946 |
| 917 URI = xmlBuildURI(systemId, (const xmlChar *) base); | 947 URI = xmlBuildURI(systemId, (const xmlChar *) base); |
| 918 ent->URI = URI; | 948 ent->URI = URI; |
| 919 } | 949 } |
| 920 } else { | 950 } else { |
| 921 xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, | 951 xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR, |
| 922 "SAX.xmlSAX2UnparsedEntityDecl(%s) called while not in subset\n", | 952 "SAX.xmlSAX2UnparsedEntityDecl(%s) called while not in subset\n", |
| 923 name, NULL); | 953 name, NULL); |
| 924 } | 954 } |
| 925 } | 955 } |
| 926 | 956 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 957 if (ctx == NULL) return; | 987 if (ctx == NULL) return; |
| 958 | 988 |
| 959 #ifdef DEBUG_SAX | 989 #ifdef DEBUG_SAX |
| 960 xmlGenericError(xmlGenericErrorContext, | 990 xmlGenericError(xmlGenericErrorContext, |
| 961 "SAX.xmlSAX2StartDocument()\n"); | 991 "SAX.xmlSAX2StartDocument()\n"); |
| 962 #endif | 992 #endif |
| 963 if (ctxt->html) { | 993 if (ctxt->html) { |
| 964 #ifdef LIBXML_HTML_ENABLED | 994 #ifdef LIBXML_HTML_ENABLED |
| 965 if (ctxt->myDoc == NULL) | 995 if (ctxt->myDoc == NULL) |
| 966 ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL); | 996 ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL); |
| 967 ctxt->myDoc->properties = XML_DOC_HTML; | |
| 968 ctxt->myDoc->parseFlags = ctxt->options; | |
| 969 if (ctxt->myDoc == NULL) { | 997 if (ctxt->myDoc == NULL) { |
| 970 xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); | 998 xmlSAX2ErrMemory(ctxt, "xmlSAX2StartDocument"); |
| 971 return; | 999 return; |
| 972 } | 1000 } |
| 1001 ctxt->myDoc->properties = XML_DOC_HTML; |
| 1002 ctxt->myDoc->parseFlags = ctxt->options; |
| 973 #else | 1003 #else |
| 974 xmlGenericError(xmlGenericErrorContext, | 1004 xmlGenericError(xmlGenericErrorContext, |
| 975 "libxml2 built without HTML support\n"); | 1005 "libxml2 built without HTML support\n"); |
| 976 ctxt->errNo = XML_ERR_INTERNAL_ERROR; | 1006 ctxt->errNo = XML_ERR_INTERNAL_ERROR; |
| 977 ctxt->instate = XML_PARSER_EOF; | 1007 ctxt->instate = XML_PARSER_EOF; |
| 978 ctxt->disableSAX = 1; | 1008 ctxt->disableSAX = 1; |
| 979 return; | 1009 return; |
| 980 #endif | 1010 #endif |
| 981 } else { | 1011 } else { |
| 982 doc = ctxt->myDoc = xmlNewDoc(ctxt->version); | 1012 doc = ctxt->myDoc = xmlNewDoc(ctxt->version); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1041 (ctxt->inputTab[0]->encoding != NULL) && (ctxt->myDoc != NULL) && | 1071 (ctxt->inputTab[0]->encoding != NULL) && (ctxt->myDoc != NULL) && |
| 1042 (ctxt->myDoc->encoding == NULL)) { | 1072 (ctxt->myDoc->encoding == NULL)) { |
| 1043 ctxt->myDoc->encoding = xmlStrdup(ctxt->inputTab[0]->encoding); | 1073 ctxt->myDoc->encoding = xmlStrdup(ctxt->inputTab[0]->encoding); |
| 1044 } | 1074 } |
| 1045 if ((ctxt->charset != XML_CHAR_ENCODING_NONE) && (ctxt->myDoc != NULL) && | 1075 if ((ctxt->charset != XML_CHAR_ENCODING_NONE) && (ctxt->myDoc != NULL) && |
| 1046 (ctxt->myDoc->charset == XML_CHAR_ENCODING_NONE)) { | 1076 (ctxt->myDoc->charset == XML_CHAR_ENCODING_NONE)) { |
| 1047 ctxt->myDoc->charset = ctxt->charset; | 1077 ctxt->myDoc->charset = ctxt->charset; |
| 1048 } | 1078 } |
| 1049 } | 1079 } |
| 1050 | 1080 |
| 1051 #if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBX
ML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) | 1081 #if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBX
ML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) || defined(LIBXML_LEGACY_ENAB
LED) |
| 1052 /** | 1082 /** |
| 1053 * xmlSAX2AttributeInternal: | 1083 * xmlSAX2AttributeInternal: |
| 1054 * @ctx: the user data (XML parser context) | 1084 * @ctx: the user data (XML parser context) |
| 1055 * @fullname: The attribute name, including namespace prefix | 1085 * @fullname: The attribute name, including namespace prefix |
| 1056 * @value: The attribute value | 1086 * @value: The attribute value |
| 1057 * @prefix: the prefix on the element node | 1087 * @prefix: the prefix on the element node |
| 1058 * | 1088 * |
| 1059 * Handle an attribute that has been read by the parser. | 1089 * Handle an attribute that has been read by the parser. |
| 1060 * The default handling is to convert the attribute into an | 1090 * The default handling is to convert the attribute into an |
| 1061 * DOM subtree and past it in a new xmlAttr element added to | 1091 * DOM subtree and past it in a new xmlAttr element added to |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1140 (name[0] == 'x') && (name[1] == 'm') && (name[2] == 'l') && | 1170 (name[0] == 'x') && (name[1] == 'm') && (name[2] == 'l') && |
| 1141 (name[3] == 'n') && (name[4] == 's') && (name[5] == 0)) { | 1171 (name[3] == 'n') && (name[4] == 's') && (name[5] == 0)) { |
| 1142 xmlNsPtr nsret; | 1172 xmlNsPtr nsret; |
| 1143 xmlChar *val; | 1173 xmlChar *val; |
| 1144 | 1174 |
| 1145 if (!ctxt->replaceEntities) { | 1175 if (!ctxt->replaceEntities) { |
| 1146 ctxt->depth++; | 1176 ctxt->depth++; |
| 1147 val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, | 1177 val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, |
| 1148 0,0,0); | 1178 0,0,0); |
| 1149 ctxt->depth--; | 1179 ctxt->depth--; |
| 1180 if (val == NULL) { |
| 1181 xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); |
| 1182 if (name != NULL) |
| 1183 xmlFree(name); |
| 1184 return; |
| 1185 } |
| 1150 } else { | 1186 } else { |
| 1151 val = (xmlChar *) value; | 1187 val = (xmlChar *) value; |
| 1152 } | 1188 } |
| 1153 | 1189 |
| 1154 if (val[0] != 0) { | 1190 if (val[0] != 0) { |
| 1155 xmlURIPtr uri; | 1191 xmlURIPtr uri; |
| 1156 | 1192 |
| 1157 uri = xmlParseURI((const char *)val); | 1193 uri = xmlParseURI((const char *)val); |
| 1158 if (uri == NULL) { | 1194 if (uri == NULL) { |
| 1159 if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) | 1195 if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) |
| 1160 » » ctxt->sax->warning(ctxt->userData, | 1196 » » ctxt->sax->warning(ctxt->userData, |
| 1161 "xmlns: %s not a valid URI\n", val); | 1197 "xmlns: %s not a valid URI\n", val); |
| 1162 } else { | 1198 } else { |
| 1163 if (uri->scheme == NULL) { | 1199 if (uri->scheme == NULL) { |
| 1164 if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) | 1200 if ((ctxt->sax != NULL) && (ctxt->sax->warning != NULL)) |
| 1165 » » » ctxt->sax->warning(ctxt->userData, | 1201 » » » ctxt->sax->warning(ctxt->userData, |
| 1166 "xmlns: URI %s is not absolute\n", val); | 1202 "xmlns: URI %s is not absolute\n", val); |
| 1167 } | 1203 } |
| 1168 xmlFreeURI(uri); | 1204 xmlFreeURI(uri); |
| 1169 } | 1205 } |
| 1170 } | 1206 } |
| 1171 | 1207 |
| 1172 /* a default namespace definition */ | 1208 /* a default namespace definition */ |
| 1173 nsret = xmlNewNs(ctxt->node, val, NULL); | 1209 nsret = xmlNewNs(ctxt->node, val, NULL); |
| 1174 | 1210 |
| 1175 #ifdef LIBXML_VALID_ENABLED | 1211 #ifdef LIBXML_VALID_ENABLED |
| 1176 /* | 1212 /* |
| 1177 * Validate also for namespace decls, they are attributes from | 1213 * Validate also for namespace decls, they are attributes from |
| 1178 * an XML-1.0 perspective | 1214 * an XML-1.0 perspective |
| 1179 */ | 1215 */ |
| 1180 if (nsret != NULL && ctxt->validate && ctxt->wellFormed && | 1216 if (nsret != NULL && ctxt->validate && ctxt->wellFormed && |
| 1181 ctxt->myDoc && ctxt->myDoc->intSubset) | 1217 ctxt->myDoc && ctxt->myDoc->intSubset) |
| 1182 ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, | 1218 ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, |
| 1183 ctxt->node, prefix, nsret, val); | 1219 ctxt->node, prefix, nsret, val); |
| 1184 #endif /* LIBXML_VALID_ENABLED */ | 1220 #endif /* LIBXML_VALID_ENABLED */ |
| 1185 » if (name != NULL) | 1221 » if (name != NULL) |
| 1186 xmlFree(name); | 1222 xmlFree(name); |
| 1187 if (nval != NULL) | 1223 if (nval != NULL) |
| 1188 xmlFree(nval); | 1224 xmlFree(nval); |
| 1189 if (val != value) | 1225 if (val != value) |
| 1190 xmlFree(val); | 1226 xmlFree(val); |
| 1191 return; | 1227 return; |
| 1192 } | 1228 } |
| 1193 if ((!ctxt->html) && | 1229 if ((!ctxt->html) && |
| 1194 (ns != NULL) && (ns[0] == 'x') && (ns[1] == 'm') && (ns[2] == 'l') && | 1230 (ns != NULL) && (ns[0] == 'x') && (ns[1] == 'm') && (ns[2] == 'l') && |
| 1195 (ns[3] == 'n') && (ns[4] == 's') && (ns[5] == 0)) { | 1231 (ns[3] == 'n') && (ns[4] == 's') && (ns[5] == 0)) { |
| 1196 xmlNsPtr nsret; | 1232 xmlNsPtr nsret; |
| 1197 xmlChar *val; | 1233 xmlChar *val; |
| 1198 | 1234 |
| 1199 if (!ctxt->replaceEntities) { | 1235 if (!ctxt->replaceEntities) { |
| 1200 ctxt->depth++; | 1236 ctxt->depth++; |
| 1201 val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, | 1237 val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, |
| 1202 0,0,0); | 1238 0,0,0); |
| 1203 ctxt->depth--; | 1239 ctxt->depth--; |
| 1204 if (val == NULL) { | 1240 if (val == NULL) { |
| 1205 xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); | 1241 xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElement"); |
| 1206 xmlFree(ns); | 1242 xmlFree(ns); |
| 1207 » » if (name != NULL) | 1243 » » if (name != NULL) |
| 1208 xmlFree(name); | 1244 xmlFree(name); |
| 1209 return; | 1245 return; |
| 1210 } | 1246 } |
| 1211 } else { | 1247 } else { |
| 1212 val = (xmlChar *) value; | 1248 val = (xmlChar *) value; |
| 1213 } | 1249 } |
| 1214 | 1250 |
| 1215 if (val[0] == 0) { | 1251 if (val[0] == 0) { |
| 1216 xmlNsErrMsg(ctxt, XML_NS_ERR_EMPTY, | 1252 xmlNsErrMsg(ctxt, XML_NS_ERR_EMPTY, |
| 1217 "Empty namespace name for prefix %s\n", name, NULL); | 1253 "Empty namespace name for prefix %s\n", name, NULL); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1238 #ifdef LIBXML_VALID_ENABLED | 1274 #ifdef LIBXML_VALID_ENABLED |
| 1239 /* | 1275 /* |
| 1240 * Validate also for namespace decls, they are attributes from | 1276 * Validate also for namespace decls, they are attributes from |
| 1241 * an XML-1.0 perspective | 1277 * an XML-1.0 perspective |
| 1242 */ | 1278 */ |
| 1243 if (nsret != NULL && ctxt->validate && ctxt->wellFormed && | 1279 if (nsret != NULL && ctxt->validate && ctxt->wellFormed && |
| 1244 ctxt->myDoc && ctxt->myDoc->intSubset) | 1280 ctxt->myDoc && ctxt->myDoc->intSubset) |
| 1245 ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, | 1281 ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, |
| 1246 ctxt->node, prefix, nsret, value); | 1282 ctxt->node, prefix, nsret, value); |
| 1247 #endif /* LIBXML_VALID_ENABLED */ | 1283 #endif /* LIBXML_VALID_ENABLED */ |
| 1248 » if (name != NULL) | 1284 » if (name != NULL) |
| 1249 xmlFree(name); | 1285 xmlFree(name); |
| 1250 if (nval != NULL) | 1286 if (nval != NULL) |
| 1251 xmlFree(nval); | 1287 xmlFree(nval); |
| 1252 if (val != value) | 1288 if (val != value) |
| 1253 xmlFree(val); | 1289 xmlFree(val); |
| 1254 return; | 1290 return; |
| 1255 } | 1291 } |
| 1256 | 1292 |
| 1257 if (ns != NULL) { | 1293 if (ns != NULL) { |
| 1258 namespace = xmlSearchNs(ctxt->myDoc, ctxt->node, ns); | 1294 namespace = xmlSearchNs(ctxt->myDoc, ctxt->node, ns); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1304 ret->children = xmlNewDocText(ctxt->myDoc, value); | 1340 ret->children = xmlNewDocText(ctxt->myDoc, value); |
| 1305 ret->last = ret->children; | 1341 ret->last = ret->children; |
| 1306 if (ret->children != NULL) | 1342 if (ret->children != NULL) |
| 1307 ret->children->parent = (xmlNodePtr) ret; | 1343 ret->children->parent = (xmlNodePtr) ret; |
| 1308 } | 1344 } |
| 1309 } | 1345 } |
| 1310 | 1346 |
| 1311 #ifdef LIBXML_VALID_ENABLED | 1347 #ifdef LIBXML_VALID_ENABLED |
| 1312 if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && | 1348 if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && |
| 1313 ctxt->myDoc && ctxt->myDoc->intSubset) { | 1349 ctxt->myDoc && ctxt->myDoc->intSubset) { |
| 1314 » | 1350 |
| 1315 /* | 1351 /* |
| 1316 * If we don't substitute entities, the validation should be | 1352 * If we don't substitute entities, the validation should be |
| 1317 * done on a value with replaced entities anyway. | 1353 * done on a value with replaced entities anyway. |
| 1318 */ | 1354 */ |
| 1319 if (!ctxt->replaceEntities) { | 1355 if (!ctxt->replaceEntities) { |
| 1320 xmlChar *val; | 1356 xmlChar *val; |
| 1321 | 1357 |
| 1322 ctxt->depth++; | 1358 ctxt->depth++; |
| 1323 val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, | 1359 val = xmlStringDecodeEntities(ctxt, value, XML_SUBSTITUTE_REF, |
| 1324 0,0,0); | 1360 0,0,0); |
| 1325 ctxt->depth--; | 1361 ctxt->depth--; |
| 1326 » | 1362 |
| 1327 if (val == NULL) | 1363 if (val == NULL) |
| 1328 ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, | 1364 ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, |
| 1329 ctxt->myDoc, ctxt->node, ret, value); | 1365 ctxt->myDoc, ctxt->node, ret, value); |
| 1330 else { | 1366 else { |
| 1331 xmlChar *nvalnorm; | 1367 xmlChar *nvalnorm; |
| 1332 | 1368 |
| 1333 /* | 1369 /* |
| 1334 * Do the last stage of the attribute normalization | 1370 * Do the last stage of the attribute normalization |
| 1335 * It need to be done twice ... it's an extra burden related | 1371 * It need to be done twice ... it's an extra burden related |
| 1336 * to the ability to keep xmlSAX2References in attributes | 1372 * to the ability to keep xmlSAX2References in attributes |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1373 xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); | 1409 xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); |
| 1374 } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) | 1410 } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) |
| 1375 xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); | 1411 xmlAddID(&ctxt->vctxt, ctxt->myDoc, value, ret); |
| 1376 else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) | 1412 else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) |
| 1377 xmlAddRef(&ctxt->vctxt, ctxt->myDoc, value, ret); | 1413 xmlAddRef(&ctxt->vctxt, ctxt->myDoc, value, ret); |
| 1378 } | 1414 } |
| 1379 | 1415 |
| 1380 error: | 1416 error: |
| 1381 if (nval != NULL) | 1417 if (nval != NULL) |
| 1382 xmlFree(nval); | 1418 xmlFree(nval); |
| 1383 if (ns != NULL) | 1419 if (ns != NULL) |
| 1384 xmlFree(ns); | 1420 xmlFree(ns); |
| 1385 } | 1421 } |
| 1386 | 1422 |
| 1387 /* | 1423 /* |
| 1388 * xmlCheckDefaultedAttributes: | 1424 * xmlCheckDefaultedAttributes: |
| 1389 * | 1425 * |
| 1390 * Check defaulted attributes from the DTD | 1426 * Check defaulted attributes from the DTD |
| 1391 */ | 1427 */ |
| 1392 static void | 1428 static void |
| 1393 xmlCheckDefaultedAttributes(xmlParserCtxtPtr ctxt, const xmlChar *name, | 1429 xmlCheckDefaultedAttributes(xmlParserCtxtPtr ctxt, const xmlChar *name, |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1472 * Make sure that attributes redefinition occuring in the | 1508 * Make sure that attributes redefinition occuring in the |
| 1473 * internal subset are not overriden by definitions in the | 1509 * internal subset are not overriden by definitions in the |
| 1474 * external subset. | 1510 * external subset. |
| 1475 */ | 1511 */ |
| 1476 if (attr->defaultValue != NULL) { | 1512 if (attr->defaultValue != NULL) { |
| 1477 /* | 1513 /* |
| 1478 * the element should be instantiated in the tree if: | 1514 * the element should be instantiated in the tree if: |
| 1479 * - this is a namespace prefix | 1515 * - this is a namespace prefix |
| 1480 * - the user required for completion in the tree | 1516 * - the user required for completion in the tree |
| 1481 * like XSLT | 1517 * like XSLT |
| 1482 » » * - there isn't already an attribute definition | 1518 » » * - there isn't already an attribute definition |
| 1483 * in the internal subset overriding it. | 1519 * in the internal subset overriding it. |
| 1484 */ | 1520 */ |
| 1485 if (((attr->prefix != NULL) && | 1521 if (((attr->prefix != NULL) && |
| 1486 (xmlStrEqual(attr->prefix, BAD_CAST "xmlns"))) || | 1522 (xmlStrEqual(attr->prefix, BAD_CAST "xmlns"))) || |
| 1487 ((attr->prefix == NULL) && | 1523 ((attr->prefix == NULL) && |
| 1488 (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) || | 1524 (xmlStrEqual(attr->name, BAD_CAST "xmlns"))) || |
| 1489 (ctxt->loadsubset & XML_COMPLETE_ATTRS)) { | 1525 (ctxt->loadsubset & XML_COMPLETE_ATTRS)) { |
| 1490 xmlAttributePtr tst; | 1526 xmlAttributePtr tst; |
| 1491 | 1527 |
| 1492 tst = xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset, | 1528 tst = xmlGetDtdQAttrDesc(ctxt->myDoc->intSubset, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1561 if ((ctx == NULL) || (fullname == NULL) || (ctxt->myDoc == NULL)) return; | 1597 if ((ctx == NULL) || (fullname == NULL) || (ctxt->myDoc == NULL)) return; |
| 1562 parent = ctxt->node; | 1598 parent = ctxt->node; |
| 1563 #ifdef DEBUG_SAX | 1599 #ifdef DEBUG_SAX |
| 1564 xmlGenericError(xmlGenericErrorContext, | 1600 xmlGenericError(xmlGenericErrorContext, |
| 1565 "SAX.xmlSAX2StartElement(%s)\n", fullname); | 1601 "SAX.xmlSAX2StartElement(%s)\n", fullname); |
| 1566 #endif | 1602 #endif |
| 1567 | 1603 |
| 1568 /* | 1604 /* |
| 1569 * First check on validity: | 1605 * First check on validity: |
| 1570 */ | 1606 */ |
| 1571 if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && | 1607 if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && |
| 1572 ((ctxt->myDoc->intSubset == NULL) || | 1608 ((ctxt->myDoc->intSubset == NULL) || |
| 1573 » ((ctxt->myDoc->intSubset->notations == NULL) && | 1609 » ((ctxt->myDoc->intSubset->notations == NULL) && |
| 1574 (ctxt->myDoc->intSubset->elements == NULL) && | 1610 (ctxt->myDoc->intSubset->elements == NULL) && |
| 1575 » (ctxt->myDoc->intSubset->attributes == NULL) && | 1611 » (ctxt->myDoc->intSubset->attributes == NULL) && |
| 1576 (ctxt->myDoc->intSubset->entities == NULL)))) { | 1612 (ctxt->myDoc->intSubset->entities == NULL)))) { |
| 1577 xmlErrValid(ctxt, XML_ERR_NO_DTD, | 1613 xmlErrValid(ctxt, XML_ERR_NO_DTD, |
| 1578 "Validation failed: no DTD found !", NULL, NULL); | 1614 "Validation failed: no DTD found !", NULL, NULL); |
| 1579 ctxt->validate = 0; | 1615 ctxt->validate = 0; |
| 1580 } | 1616 } |
| 1581 | 1617 |
| 1582 | 1618 |
| 1583 /* | 1619 /* |
| 1584 * Split the full name into a namespace prefix and the tag name | 1620 * Split the full name into a namespace prefix and the tag name |
| 1585 */ | 1621 */ |
| 1586 name = xmlSplitQName(ctxt, fullname, &prefix); | 1622 name = xmlSplitQName(ctxt, fullname, &prefix); |
| 1587 | 1623 |
| 1588 | 1624 |
| 1589 /* | 1625 /* |
| 1590 * Note : the namespace resolution is deferred until the end of the | 1626 * Note : the namespace resolution is deferred until the end of the |
| 1591 * attributes parsing, since local namespace can be defined as | 1627 * attributes parsing, since local namespace can be defined as |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1749 * xmlSAX2EndElement: | 1785 * xmlSAX2EndElement: |
| 1750 * @ctx: the user data (XML parser context) | 1786 * @ctx: the user data (XML parser context) |
| 1751 * @name: The element name | 1787 * @name: The element name |
| 1752 * | 1788 * |
| 1753 * called when the end of an element has been detected. | 1789 * called when the end of an element has been detected. |
| 1754 */ | 1790 */ |
| 1755 void | 1791 void |
| 1756 xmlSAX2EndElement(void *ctx, const xmlChar *name ATTRIBUTE_UNUSED) | 1792 xmlSAX2EndElement(void *ctx, const xmlChar *name ATTRIBUTE_UNUSED) |
| 1757 { | 1793 { |
| 1758 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; | 1794 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; |
| 1759 xmlParserNodeInfo node_info; | |
| 1760 xmlNodePtr cur; | 1795 xmlNodePtr cur; |
| 1761 | 1796 |
| 1762 if (ctx == NULL) return; | 1797 if (ctx == NULL) return; |
| 1763 cur = ctxt->node; | 1798 cur = ctxt->node; |
| 1764 #ifdef DEBUG_SAX | 1799 #ifdef DEBUG_SAX |
| 1765 if (name == NULL) | 1800 if (name == NULL) |
| 1766 xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(NULL)\n")
; | 1801 xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(NULL)\n")
; |
| 1767 else | 1802 else |
| 1768 xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(%s)\n", n
ame); | 1803 xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(%s)\n", n
ame); |
| 1769 #endif | 1804 #endif |
| 1770 | 1805 |
| 1771 /* Capture end position and add node */ | 1806 /* Capture end position and add node */ |
| 1772 if (cur != NULL && ctxt->record_info) { | 1807 if (cur != NULL && ctxt->record_info) { |
| 1773 node_info.end_pos = ctxt->input->cur - ctxt->input->base; | 1808 ctxt->nodeInfo->end_pos = ctxt->input->cur - ctxt->input->base; |
| 1774 node_info.end_line = ctxt->input->line; | 1809 ctxt->nodeInfo->end_line = ctxt->input->line; |
| 1775 node_info.node = cur; | 1810 ctxt->nodeInfo->node = cur; |
| 1776 xmlParserAddNodeInfo(ctxt, &node_info); | 1811 xmlParserAddNodeInfo(ctxt, ctxt->nodeInfo); |
| 1777 } | 1812 } |
| 1778 ctxt->nodemem = -1; | 1813 ctxt->nodemem = -1; |
| 1779 | 1814 |
| 1780 #ifdef LIBXML_VALID_ENABLED | 1815 #ifdef LIBXML_VALID_ENABLED |
| 1781 if (ctxt->validate && ctxt->wellFormed && | 1816 if (ctxt->validate && ctxt->wellFormed && |
| 1782 ctxt->myDoc && ctxt->myDoc->intSubset) | 1817 ctxt->myDoc && ctxt->myDoc->intSubset) |
| 1783 ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, | 1818 ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, |
| 1784 cur); | 1819 cur); |
| 1785 #endif /* LIBXML_VALID_ENABLED */ | 1820 #endif /* LIBXML_VALID_ENABLED */ |
| 1786 | 1821 |
| 1787 | 1822 |
| 1788 /* | 1823 /* |
| 1789 * end of parsing of this node. | 1824 * end of parsing of this node. |
| 1790 */ | 1825 */ |
| 1791 #ifdef DEBUG_SAX_TREE | 1826 #ifdef DEBUG_SAX_TREE |
| 1792 xmlGenericError(xmlGenericErrorContext, "popping(%s)\n", cur->name); | 1827 xmlGenericError(xmlGenericErrorContext, "popping(%s)\n", cur->name); |
| 1793 #endif | 1828 #endif |
| 1794 nodePop(ctxt); | 1829 nodePop(ctxt); |
| 1795 } | 1830 } |
| 1796 #endif /* LIBXML_SAX1_ENABLED || LIBXML_HTML_ENABLE */ | 1831 #endif /* LIBXML_SAX1_ENABLED || LIBXML_HTML_ENABLED || LIBXML_LEGACY_ENABLED */ |
| 1797 | 1832 |
| 1798 /* | 1833 /* |
| 1799 * xmlSAX2TextNode: | 1834 * xmlSAX2TextNode: |
| 1800 * @ctxt: the parser context | 1835 * @ctxt: the parser context |
| 1801 * @str: the input string | 1836 * @str: the input string |
| 1802 * @len: the string length | 1837 * @len: the string length |
| 1803 * | 1838 * |
| 1804 * Remove the entities from an attribute value | 1839 * Callback for a text node |
| 1805 * | 1840 * |
| 1806 * Returns the newly allocated string or NULL if not needed or error | 1841 * Returns the newly allocated string or NULL if not needed or error |
| 1807 */ | 1842 */ |
| 1808 static xmlNodePtr | 1843 static xmlNodePtr |
| 1809 xmlSAX2TextNode(xmlParserCtxtPtr ctxt, const xmlChar *str, int len) { | 1844 xmlSAX2TextNode(xmlParserCtxtPtr ctxt, const xmlChar *str, int len) { |
| 1810 xmlNodePtr ret; | 1845 xmlNodePtr ret; |
| 1811 const xmlChar *intern = NULL; | 1846 const xmlChar *intern = NULL; |
| 1812 | 1847 |
| 1813 /* | 1848 /* |
| 1814 * Allocate | 1849 * Allocate |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1827 memset(ret, 0, sizeof(xmlNode)); | 1862 memset(ret, 0, sizeof(xmlNode)); |
| 1828 /* | 1863 /* |
| 1829 * intern the formatting blanks found between tags, or the | 1864 * intern the formatting blanks found between tags, or the |
| 1830 * very short strings | 1865 * very short strings |
| 1831 */ | 1866 */ |
| 1832 if (ctxt->dictNames) { | 1867 if (ctxt->dictNames) { |
| 1833 xmlChar cur = str[len]; | 1868 xmlChar cur = str[len]; |
| 1834 | 1869 |
| 1835 if ((len < (int) (2 * sizeof(void *))) && | 1870 if ((len < (int) (2 * sizeof(void *))) && |
| 1836 (ctxt->options & XML_PARSE_COMPACT)) { | 1871 (ctxt->options & XML_PARSE_COMPACT)) { |
| 1837 » /* store the string in the node overrithing properties and nsDef */ | 1872 » /* store the string in the node overriding properties and nsDef */ |
| 1838 xmlChar *tmp = (xmlChar *) &(ret->properties); | 1873 xmlChar *tmp = (xmlChar *) &(ret->properties); |
| 1839 memcpy(tmp, str, len); | 1874 memcpy(tmp, str, len); |
| 1840 tmp[len] = 0; | 1875 tmp[len] = 0; |
| 1841 intern = tmp; | 1876 intern = tmp; |
| 1842 } else if ((len <= 3) && ((cur == '"') || (cur == '\'') || | 1877 } else if ((len <= 3) && ((cur == '"') || (cur == '\'') || |
| 1843 ((cur == '<') && (str[len + 1] != '!')))) { | 1878 ((cur == '<') && (str[len + 1] != '!')))) { |
| 1844 intern = xmlDictLookup(ctxt->dict, str, len); | 1879 intern = xmlDictLookup(ctxt->dict, str, len); |
| 1845 } else if (IS_BLANK_CH(*str) && (len < 60) && (cur == '<') && | 1880 } else if (IS_BLANK_CH(*str) && (len < 60) && (cur == '<') && |
| 1846 (str[len + 1] != '!')) { | 1881 (str[len + 1] != '!')) { |
| 1847 int i; | 1882 int i; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1859 if (intern == NULL) { | 1894 if (intern == NULL) { |
| 1860 ret->content = xmlStrndup(str, len); | 1895 ret->content = xmlStrndup(str, len); |
| 1861 if (ret->content == NULL) { | 1896 if (ret->content == NULL) { |
| 1862 xmlSAX2ErrMemory(ctxt, "xmlSAX2TextNode"); | 1897 xmlSAX2ErrMemory(ctxt, "xmlSAX2TextNode"); |
| 1863 xmlFree(ret); | 1898 xmlFree(ret); |
| 1864 return(NULL); | 1899 return(NULL); |
| 1865 } | 1900 } |
| 1866 } else | 1901 } else |
| 1867 ret->content = (xmlChar *) intern; | 1902 ret->content = (xmlChar *) intern; |
| 1868 | 1903 |
| 1869 if (ctxt->input != NULL) | 1904 if (ctxt->linenumbers) { |
| 1870 ret->line = ctxt->input->line; | 1905 » if (ctxt->input != NULL) { |
| 1906 » if (ctxt->input->line < 65535) |
| 1907 » » ret->line = (short) ctxt->input->line; |
| 1908 » else { |
| 1909 » ret->line = 65535; |
| 1910 » » if (ctxt->options & XML_PARSE_BIG_LINES) |
| 1911 » » ret->psvi = (void *) (long) ctxt->input->line; |
| 1912 » } |
| 1913 » } |
| 1914 } |
| 1871 | 1915 |
| 1872 if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) | 1916 if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) |
| 1873 xmlRegisterNodeDefaultValue(ret); | 1917 xmlRegisterNodeDefaultValue(ret); |
| 1874 return(ret); | 1918 return(ret); |
| 1875 } | 1919 } |
| 1876 | 1920 |
| 1877 #ifdef LIBXML_VALID_ENABLED | 1921 #ifdef LIBXML_VALID_ENABLED |
| 1878 /* | 1922 /* |
| 1879 * xmlSAX2DecodeAttrEntities: | 1923 * xmlSAX2DecodeAttrEntities: |
| 1880 * @ctxt: the parser context | 1924 * @ctxt: the parser context |
| 1881 * @str: the input string | 1925 * @str: the input string |
| 1882 * @len: the string length | 1926 * @len: the string length |
| 1883 * | 1927 * |
| 1884 * Remove the entities from an attribute value | 1928 * Remove the entities from an attribute value |
| 1885 * | 1929 * |
| 1886 * Returns the newly allocated string or NULL if not needed or error | 1930 * Returns the newly allocated string or NULL if not needed or error |
| 1887 */ | 1931 */ |
| 1888 static xmlChar * | 1932 static xmlChar * |
| 1889 xmlSAX2DecodeAttrEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, | 1933 xmlSAX2DecodeAttrEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, |
| 1890 const xmlChar *end) { | 1934 const xmlChar *end) { |
| 1891 const xmlChar *in; | 1935 const xmlChar *in; |
| 1892 xmlChar *ret; | 1936 xmlChar *ret; |
| 1893 | 1937 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1939 /* | 1983 /* |
| 1940 * allocate the node | 1984 * allocate the node |
| 1941 */ | 1985 */ |
| 1942 if (ctxt->freeAttrs != NULL) { | 1986 if (ctxt->freeAttrs != NULL) { |
| 1943 ret = ctxt->freeAttrs; | 1987 ret = ctxt->freeAttrs; |
| 1944 ctxt->freeAttrs = ret->next; | 1988 ctxt->freeAttrs = ret->next; |
| 1945 ctxt->freeAttrsNr--; | 1989 ctxt->freeAttrsNr--; |
| 1946 memset(ret, 0, sizeof(xmlAttr)); | 1990 memset(ret, 0, sizeof(xmlAttr)); |
| 1947 ret->type = XML_ATTRIBUTE_NODE; | 1991 ret->type = XML_ATTRIBUTE_NODE; |
| 1948 | 1992 |
| 1949 » ret->parent = ctxt->node; | 1993 » ret->parent = ctxt->node; |
| 1950 ret->doc = ctxt->myDoc; | 1994 ret->doc = ctxt->myDoc; |
| 1951 ret->ns = namespace; | 1995 ret->ns = namespace; |
| 1952 | 1996 |
| 1953 if (ctxt->dictNames) | 1997 if (ctxt->dictNames) |
| 1954 ret->name = localname; | 1998 ret->name = localname; |
| 1955 else | 1999 else |
| 1956 ret->name = xmlStrdup(localname); | 2000 ret->name = xmlStrdup(localname); |
| 1957 | 2001 |
| 1958 /* link at the end to preserv order, TODO speed up with a last */ | 2002 /* link at the end to preserv order, TODO speed up with a last */ |
| 1959 if (ctxt->node->properties == NULL) { | 2003 if (ctxt->node->properties == NULL) { |
| 1960 ctxt->node->properties = ret; | 2004 ctxt->node->properties = ret; |
| 1961 } else { | 2005 } else { |
| 1962 xmlAttrPtr prev = ctxt->node->properties; | 2006 xmlAttrPtr prev = ctxt->node->properties; |
| 1963 | 2007 |
| 1964 while (prev->next != NULL) prev = prev->next; | 2008 while (prev->next != NULL) prev = prev->next; |
| 1965 prev->next = ret; | 2009 prev->next = ret; |
| 1966 ret->prev = prev; | 2010 ret->prev = prev; |
| 1967 } | 2011 } |
| 1968 | 2012 |
| 1969 if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) | 2013 if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) |
| 1970 xmlRegisterNodeDefaultValue((xmlNodePtr)ret); | 2014 xmlRegisterNodeDefaultValue((xmlNodePtr)ret); |
| 1971 } else { | 2015 } else { |
| 1972 if (ctxt->dictNames) | 2016 if (ctxt->dictNames) |
| 1973 » ret = xmlNewNsPropEatName(ctxt->node, namespace, | 2017 » ret = xmlNewNsPropEatName(ctxt->node, namespace, |
| 1974 (xmlChar *) localname, NULL); | 2018 (xmlChar *) localname, NULL); |
| 1975 else | 2019 else |
| 1976 ret = xmlNewNsProp(ctxt->node, namespace, localname, NULL); | 2020 ret = xmlNewNsProp(ctxt->node, namespace, localname, NULL); |
| 1977 if (ret == NULL) { | 2021 if (ret == NULL) { |
| 1978 xmlErrMemory(ctxt, "xmlSAX2AttributeNs"); | 2022 xmlErrMemory(ctxt, "xmlSAX2AttributeNs"); |
| 1979 return; | 2023 return; |
| 1980 } | 2024 } |
| 1981 } | 2025 } |
| 1982 | 2026 |
| 1983 if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { | 2027 if ((ctxt->replaceEntities == 0) && (!ctxt->html)) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2049 * dup now contains a string of the flattened attribute | 2093 * dup now contains a string of the flattened attribute |
| 2050 * content with entities substitued. Check if we need to | 2094 * content with entities substitued. Check if we need to |
| 2051 * apply an extra layer of normalization. | 2095 * apply an extra layer of normalization. |
| 2052 * It need to be done twice ... it's an extra burden related | 2096 * It need to be done twice ... it's an extra burden related |
| 2053 * to the ability to keep references in attributes | 2097 * to the ability to keep references in attributes |
| 2054 */ | 2098 */ |
| 2055 if (ctxt->attsSpecial != NULL) { | 2099 if (ctxt->attsSpecial != NULL) { |
| 2056 xmlChar *nvalnorm; | 2100 xmlChar *nvalnorm; |
| 2057 xmlChar fn[50]; | 2101 xmlChar fn[50]; |
| 2058 xmlChar *fullname; | 2102 xmlChar *fullname; |
| 2059 » » | 2103 |
| 2060 fullname = xmlBuildQName(localname, prefix, fn, 50); | 2104 fullname = xmlBuildQName(localname, prefix, fn, 50); |
| 2061 if (fullname != NULL) { | 2105 if (fullname != NULL) { |
| 2062 ctxt->vctxt.valid = 1; | 2106 ctxt->vctxt.valid = 1; |
| 2063 nvalnorm = xmlValidCtxtNormalizeAttributeValue( | 2107 nvalnorm = xmlValidCtxtNormalizeAttributeValue( |
| 2064 &ctxt->vctxt, ctxt->myDoc, | 2108 &ctxt->vctxt, ctxt->myDoc, |
| 2065 ctxt->node, fullname, dup); | 2109 ctxt->node, fullname, dup); |
| 2066 if (ctxt->vctxt.valid != 1) | 2110 if (ctxt->vctxt.valid != 1) |
| 2067 ctxt->valid = 0; | 2111 ctxt->valid = 0; |
| 2068 | 2112 |
| 2069 if ((fullname != fn) && (fullname != localname)) | 2113 if ((fullname != fn) && (fullname != localname)) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2100 if ((prefix == ctxt->str_xml) && | 2144 if ((prefix == ctxt->str_xml) && |
| 2101 (localname[0] == 'i') && (localname[1] == 'd') && | 2145 (localname[0] == 'i') && (localname[1] == 'd') && |
| 2102 (localname[2] == 0)) { | 2146 (localname[2] == 0)) { |
| 2103 /* | 2147 /* |
| 2104 * Add the xml:id value | 2148 * Add the xml:id value |
| 2105 * | 2149 * |
| 2106 * Open issue: normalization of the value. | 2150 * Open issue: normalization of the value. |
| 2107 */ | 2151 */ |
| 2108 if (dup == NULL) | 2152 if (dup == NULL) |
| 2109 dup = xmlStrndup(value, valueend - value); | 2153 dup = xmlStrndup(value, valueend - value); |
| 2154 #if defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBX
ML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED) || defined(LIBXML_LEGACY_ENAB
LED) |
| 2110 #ifdef LIBXML_VALID_ENABLED | 2155 #ifdef LIBXML_VALID_ENABLED |
| 2111 if (xmlValidateNCName(dup, 1) != 0) { | 2156 if (xmlValidateNCName(dup, 1) != 0) { |
| 2112 xmlErrValid(ctxt, XML_DTD_XMLID_VALUE, | 2157 xmlErrValid(ctxt, XML_DTD_XMLID_VALUE, |
| 2113 "xml:id : attribute value %s is not an NCName\n", | 2158 "xml:id : attribute value %s is not an NCName\n", |
| 2114 (const char *) dup, NULL); | 2159 (const char *) dup, NULL); |
| 2115 } | 2160 } |
| 2116 #endif | 2161 #endif |
| 2162 #endif |
| 2117 xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); | 2163 xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); |
| 2118 } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) { | 2164 } else if (xmlIsID(ctxt->myDoc, ctxt->node, ret)) { |
| 2119 /* might be worth duplicate entry points and not copy */ | 2165 /* might be worth duplicate entry points and not copy */ |
| 2120 if (dup == NULL) | 2166 if (dup == NULL) |
| 2121 dup = xmlStrndup(value, valueend - value); | 2167 dup = xmlStrndup(value, valueend - value); |
| 2122 xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); | 2168 xmlAddID(&ctxt->vctxt, ctxt->myDoc, dup, ret); |
| 2123 } else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) { | 2169 } else if (xmlIsRef(ctxt->myDoc, ctxt->node, ret)) { |
| 2124 if (dup == NULL) | 2170 if (dup == NULL) |
| 2125 dup = xmlStrndup(value, valueend - value); | 2171 dup = xmlStrndup(value, valueend - value); |
| 2126 xmlAddRef(&ctxt->vctxt, ctxt->myDoc, dup, ret); | 2172 xmlAddRef(&ctxt->vctxt, ctxt->myDoc, dup, ret); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2156 const xmlChar **namespaces, | 2202 const xmlChar **namespaces, |
| 2157 int nb_attributes, | 2203 int nb_attributes, |
| 2158 int nb_defaulted, | 2204 int nb_defaulted, |
| 2159 const xmlChar **attributes) | 2205 const xmlChar **attributes) |
| 2160 { | 2206 { |
| 2161 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; | 2207 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; |
| 2162 xmlNodePtr ret; | 2208 xmlNodePtr ret; |
| 2163 xmlNodePtr parent; | 2209 xmlNodePtr parent; |
| 2164 xmlNsPtr last = NULL, ns; | 2210 xmlNsPtr last = NULL, ns; |
| 2165 const xmlChar *uri, *pref; | 2211 const xmlChar *uri, *pref; |
| 2212 xmlChar *lname = NULL; |
| 2166 int i, j; | 2213 int i, j; |
| 2167 | 2214 |
| 2168 if (ctx == NULL) return; | 2215 if (ctx == NULL) return; |
| 2169 parent = ctxt->node; | 2216 parent = ctxt->node; |
| 2170 /* | 2217 /* |
| 2171 * First check on validity: | 2218 * First check on validity: |
| 2172 */ | 2219 */ |
| 2173 if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && | 2220 if (ctxt->validate && (ctxt->myDoc->extSubset == NULL) && |
| 2174 ((ctxt->myDoc->intSubset == NULL) || | 2221 ((ctxt->myDoc->intSubset == NULL) || |
| 2175 » ((ctxt->myDoc->intSubset->notations == NULL) && | 2222 » ((ctxt->myDoc->intSubset->notations == NULL) && |
| 2176 (ctxt->myDoc->intSubset->elements == NULL) && | 2223 (ctxt->myDoc->intSubset->elements == NULL) && |
| 2177 » (ctxt->myDoc->intSubset->attributes == NULL) && | 2224 » (ctxt->myDoc->intSubset->attributes == NULL) && |
| 2178 (ctxt->myDoc->intSubset->entities == NULL)))) { | 2225 (ctxt->myDoc->intSubset->entities == NULL)))) { |
| 2179 » xmlErrValid(ctxt, XML_ERR_NO_DTD, | 2226 » xmlErrValid(ctxt, XML_DTD_NO_DTD, |
| 2180 "Validation failed: no DTD found !", NULL, NULL); | 2227 "Validation failed: no DTD found !", NULL, NULL); |
| 2181 ctxt->validate = 0; | 2228 ctxt->validate = 0; |
| 2182 } | 2229 } |
| 2183 | 2230 |
| 2184 /* | 2231 /* |
| 2232 * Take care of the rare case of an undefined namespace prefix |
| 2233 */ |
| 2234 if ((prefix != NULL) && (URI == NULL)) { |
| 2235 if (ctxt->dictNames) { |
| 2236 const xmlChar *fullname; |
| 2237 |
| 2238 fullname = xmlDictQLookup(ctxt->dict, prefix, localname); |
| 2239 if (fullname != NULL) |
| 2240 localname = fullname; |
| 2241 } else { |
| 2242 lname = xmlBuildQName(localname, prefix, NULL, 0); |
| 2243 } |
| 2244 } |
| 2245 /* |
| 2185 * allocate the node | 2246 * allocate the node |
| 2186 */ | 2247 */ |
| 2187 if (ctxt->freeElems != NULL) { | 2248 if (ctxt->freeElems != NULL) { |
| 2188 ret = ctxt->freeElems; | 2249 ret = ctxt->freeElems; |
| 2189 ctxt->freeElems = ret->next; | 2250 ctxt->freeElems = ret->next; |
| 2190 ctxt->freeElemsNr--; | 2251 ctxt->freeElemsNr--; |
| 2191 memset(ret, 0, sizeof(xmlNode)); | 2252 memset(ret, 0, sizeof(xmlNode)); |
| 2192 ret->type = XML_ELEMENT_NODE; | 2253 ret->type = XML_ELEMENT_NODE; |
| 2193 | 2254 |
| 2194 if (ctxt->dictNames) | 2255 if (ctxt->dictNames) |
| 2195 ret->name = localname; | 2256 ret->name = localname; |
| 2196 else { | 2257 else { |
| 2197 » ret->name = xmlStrdup(localname); | 2258 » if (lname == NULL) |
| 2259 » » ret->name = xmlStrdup(localname); |
| 2260 » else |
| 2261 » ret->name = lname; |
| 2198 if (ret->name == NULL) { | 2262 if (ret->name == NULL) { |
| 2199 xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); | 2263 xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); |
| 2200 return; | 2264 return; |
| 2201 } | 2265 } |
| 2202 } | 2266 } |
| 2203 if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) | 2267 if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)) |
| 2204 xmlRegisterNodeDefaultValue(ret); | 2268 xmlRegisterNodeDefaultValue(ret); |
| 2205 } else { | 2269 } else { |
| 2206 if (ctxt->dictNames) | 2270 if (ctxt->dictNames) |
| 2207 » ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, | 2271 » ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, |
| 2208 (xmlChar *) localname, NULL); | 2272 (xmlChar *) localname, NULL); |
| 2273 else if (lname == NULL) |
| 2274 ret = xmlNewDocNode(ctxt->myDoc, NULL, localname, NULL); |
| 2209 else | 2275 else |
| 2210 » ret = xmlNewDocNode(ctxt->myDoc, NULL, localname, NULL); | 2276 » ret = xmlNewDocNodeEatName(ctxt->myDoc, NULL, |
| 2277 » (xmlChar *) lname, NULL); |
| 2211 if (ret == NULL) { | 2278 if (ret == NULL) { |
| 2212 xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); | 2279 xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); |
| 2213 return; | 2280 return; |
| 2214 } | 2281 } |
| 2215 } | 2282 } |
| 2216 if (ctxt->linenumbers) { | 2283 if (ctxt->linenumbers) { |
| 2217 if (ctxt->input != NULL) { | 2284 if (ctxt->input != NULL) { |
| 2218 if (ctxt->input->line < 65535) | 2285 if (ctxt->input->line < 65535) |
| 2219 ret->line = (short) ctxt->input->line; | 2286 ret->line = (short) ctxt->input->line; |
| 2220 else | 2287 else |
| 2221 ret->line = 65535; | 2288 ret->line = 65535; |
| 2222 } | 2289 } |
| 2223 } | 2290 } |
| 2224 | 2291 |
| 2225 if ((ctxt->myDoc->children == NULL) || (parent == NULL)) { | 2292 if (parent == NULL) { |
| 2226 xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); | 2293 xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); |
| 2227 } | 2294 } |
| 2228 /* | 2295 /* |
| 2229 * Build the namespace list | 2296 * Build the namespace list |
| 2230 */ | 2297 */ |
| 2231 for (i = 0,j = 0;j < nb_namespaces;j++) { | 2298 for (i = 0,j = 0;j < nb_namespaces;j++) { |
| 2232 pref = namespaces[i++]; | 2299 pref = namespaces[i++]; |
| 2233 uri = namespaces[i++]; | 2300 uri = namespaces[i++]; |
| 2234 ns = xmlNewNs(NULL, uri, pref); | 2301 ns = xmlNewNs(NULL, uri, pref); |
| 2235 if (ns != NULL) { | 2302 if (ns != NULL) { |
| 2236 if (last == NULL) { | 2303 if (last == NULL) { |
| 2237 ret->nsDef = last = ns; | 2304 ret->nsDef = last = ns; |
| 2238 } else { | 2305 } else { |
| 2239 last->next = ns; | 2306 last->next = ns; |
| 2240 last = ns; | 2307 last = ns; |
| 2241 } | 2308 } |
| 2242 if ((URI != NULL) && (prefix == pref)) | 2309 if ((URI != NULL) && (prefix == pref)) |
| 2243 ret->ns = ns; | 2310 ret->ns = ns; |
| 2244 } else { | 2311 } else { |
| 2245 » xmlSAX2ErrMemory(ctxt, "xmlSAX2StartElementNs"); | 2312 /* |
| 2246 » return; | 2313 * any out of memory error would already have been raised |
| 2314 * but we can't be garanteed it's the actual error due to the |
| 2315 * API, best is to skip in this case |
| 2316 */ |
| 2317 » continue; |
| 2247 } | 2318 } |
| 2248 #ifdef LIBXML_VALID_ENABLED | 2319 #ifdef LIBXML_VALID_ENABLED |
| 2249 if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && | 2320 if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed && |
| 2250 ctxt->myDoc && ctxt->myDoc->intSubset) { | 2321 ctxt->myDoc && ctxt->myDoc->intSubset) { |
| 2251 ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, | 2322 ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc, |
| 2252 ret, prefix, ns, uri); | 2323 ret, prefix, ns, uri); |
| 2253 } | 2324 } |
| 2254 #endif /* LIBXML_VALID_ENABLED */ | 2325 #endif /* LIBXML_VALID_ENABLED */ |
| 2255 } | 2326 } |
| 2256 ctxt->nodemem = -1; | 2327 ctxt->nodemem = -1; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2303 "Namespace default prefix was not found\n", | 2374 "Namespace default prefix was not found\n", |
| 2304 NULL, NULL); | 2375 NULL, NULL); |
| 2305 } | 2376 } |
| 2306 } | 2377 } |
| 2307 | 2378 |
| 2308 /* | 2379 /* |
| 2309 * process all the other attributes | 2380 * process all the other attributes |
| 2310 */ | 2381 */ |
| 2311 if (nb_attributes > 0) { | 2382 if (nb_attributes > 0) { |
| 2312 for (j = 0,i = 0;i < nb_attributes;i++,j+=5) { | 2383 for (j = 0,i = 0;i < nb_attributes;i++,j+=5) { |
| 2384 /* |
| 2385 * Handle the rare case of an undefined atribute prefix |
| 2386 */ |
| 2387 if ((attributes[j+1] != NULL) && (attributes[j+2] == NULL)) { |
| 2388 if (ctxt->dictNames) { |
| 2389 const xmlChar *fullname; |
| 2390 |
| 2391 fullname = xmlDictQLookup(ctxt->dict, attributes[j+1], |
| 2392 attributes[j]); |
| 2393 if (fullname != NULL) { |
| 2394 xmlSAX2AttributeNs(ctxt, fullname, NULL, |
| 2395 attributes[j+3], attributes[j+4]); |
| 2396 continue; |
| 2397 } |
| 2398 } else { |
| 2399 lname = xmlBuildQName(attributes[j], attributes[j+1], |
| 2400 NULL, 0); |
| 2401 if (lname != NULL) { |
| 2402 xmlSAX2AttributeNs(ctxt, lname, NULL, |
| 2403 attributes[j+3], attributes[j+4]); |
| 2404 xmlFree(lname); |
| 2405 continue; |
| 2406 } |
| 2407 } |
| 2408 } |
| 2313 xmlSAX2AttributeNs(ctxt, attributes[j], attributes[j+1], | 2409 xmlSAX2AttributeNs(ctxt, attributes[j], attributes[j+1], |
| 2314 » attributes[j+3], attributes[j+4]); | 2410 » » » attributes[j+3], attributes[j+4]); |
| 2315 } | 2411 } |
| 2316 } | 2412 } |
| 2317 | 2413 |
| 2318 #ifdef LIBXML_VALID_ENABLED | 2414 #ifdef LIBXML_VALID_ENABLED |
| 2319 /* | 2415 /* |
| 2320 * If it's the Document root, finish the DTD validation and | 2416 * If it's the Document root, finish the DTD validation and |
| 2321 * check the document root element for validity | 2417 * check the document root element for validity |
| 2322 */ | 2418 */ |
| 2323 if ((ctxt->validate) && (ctxt->vctxt.finishDtd == XML_CTXT_FINISH_DTD_0)) { | 2419 if ((ctxt->validate) && (ctxt->vctxt.finishDtd == XML_CTXT_FINISH_DTD_0)) { |
| 2324 int chk; | 2420 int chk; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2375 * end of parsing of this node. | 2471 * end of parsing of this node. |
| 2376 */ | 2472 */ |
| 2377 nodePop(ctxt); | 2473 nodePop(ctxt); |
| 2378 } | 2474 } |
| 2379 | 2475 |
| 2380 /** | 2476 /** |
| 2381 * xmlSAX2Reference: | 2477 * xmlSAX2Reference: |
| 2382 * @ctx: the user data (XML parser context) | 2478 * @ctx: the user data (XML parser context) |
| 2383 * @name: The entity name | 2479 * @name: The entity name |
| 2384 * | 2480 * |
| 2385 * called when an entity xmlSAX2Reference is detected. | 2481 * called when an entity xmlSAX2Reference is detected. |
| 2386 */ | 2482 */ |
| 2387 void | 2483 void |
| 2388 xmlSAX2Reference(void *ctx, const xmlChar *name) | 2484 xmlSAX2Reference(void *ctx, const xmlChar *name) |
| 2389 { | 2485 { |
| 2390 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; | 2486 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; |
| 2391 xmlNodePtr ret; | 2487 xmlNodePtr ret; |
| 2392 | 2488 |
| 2393 if (ctx == NULL) return; | 2489 if (ctx == NULL) return; |
| 2394 #ifdef DEBUG_SAX | 2490 #ifdef DEBUG_SAX |
| 2395 xmlGenericError(xmlGenericErrorContext, | 2491 xmlGenericError(xmlGenericErrorContext, |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2475 * We try to minimaze realloc() uses and avoid copying | 2571 * We try to minimaze realloc() uses and avoid copying |
| 2476 * and recomputing length over and over. | 2572 * and recomputing length over and over. |
| 2477 */ | 2573 */ |
| 2478 if (lastChild->content == (xmlChar *)&(lastChild->properties)) { | 2574 if (lastChild->content == (xmlChar *)&(lastChild->properties)) { |
| 2479 lastChild->content = xmlStrdup(lastChild->content); | 2575 lastChild->content = xmlStrdup(lastChild->content); |
| 2480 lastChild->properties = NULL; | 2576 lastChild->properties = NULL; |
| 2481 } else if ((ctxt->nodemem == ctxt->nodelen + 1) && | 2577 } else if ((ctxt->nodemem == ctxt->nodelen + 1) && |
| 2482 (xmlDictOwns(ctxt->dict, lastChild->content))) { | 2578 (xmlDictOwns(ctxt->dict, lastChild->content))) { |
| 2483 lastChild->content = xmlStrdup(lastChild->content); | 2579 lastChild->content = xmlStrdup(lastChild->content); |
| 2484 } | 2580 } |
| 2581 if (lastChild->content == NULL) { |
| 2582 xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters: xmlStrdup returned NU
LL"); |
| 2583 return; |
| 2584 } |
| 2485 if (((size_t)ctxt->nodelen + (size_t)len > XML_MAX_TEXT_LENGTH) && | 2585 if (((size_t)ctxt->nodelen + (size_t)len > XML_MAX_TEXT_LENGTH) && |
| 2486 ((ctxt->options & XML_PARSE_HUGE) == 0)) { | 2586 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 2487 xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters: huge text node"); | 2587 xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters: huge text node"); |
| 2488 return; | 2588 return; |
| 2489 } | 2589 } |
| 2490 » if ((size_t)ctxt->nodelen > SIZE_T_MAX - (size_t)len || | 2590 » if ((size_t)ctxt->nodelen > SIZE_T_MAX - (size_t)len || |
| 2491 (size_t)ctxt->nodemem + (size_t)len > SIZE_T_MAX / 2) { | 2591 (size_t)ctxt->nodemem + (size_t)len > SIZE_T_MAX / 2) { |
| 2492 xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters overflow prevented"); | 2592 xmlSAX2ErrMemory(ctxt, "xmlSAX2Characters overflow prevented"); |
| 2493 return; | 2593 return; |
| 2494 } | 2594 } |
| 2495 if (ctxt->nodelen + len >= ctxt->nodemem) { | 2595 if (ctxt->nodelen + len >= ctxt->nodemem) { |
| 2496 xmlChar *newbuf; | 2596 xmlChar *newbuf; |
| 2497 size_t size; | 2597 size_t size; |
| 2498 | 2598 |
| 2499 size = ctxt->nodemem + len; | 2599 size = ctxt->nodemem + len; |
| 2500 size *= 2; | 2600 size *= 2; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2584 ret->line = 65535; | 2684 ret->line = 65535; |
| 2585 } | 2685 } |
| 2586 } | 2686 } |
| 2587 if (ctxt->inSubset == 1) { | 2687 if (ctxt->inSubset == 1) { |
| 2588 xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); | 2688 xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); |
| 2589 return; | 2689 return; |
| 2590 } else if (ctxt->inSubset == 2) { | 2690 } else if (ctxt->inSubset == 2) { |
| 2591 xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); | 2691 xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); |
| 2592 return; | 2692 return; |
| 2593 } | 2693 } |
| 2594 if ((ctxt->myDoc->children == NULL) || (parent == NULL)) { | 2694 if (parent == NULL) { |
| 2595 #ifdef DEBUG_SAX_TREE | 2695 #ifdef DEBUG_SAX_TREE |
| 2596 xmlGenericError(xmlGenericErrorContext, | 2696 xmlGenericError(xmlGenericErrorContext, |
| 2597 "Setting PI %s as root\n", target); | 2697 "Setting PI %s as root\n", target); |
| 2598 #endif | 2698 #endif |
| 2599 xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); | 2699 xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); |
| 2600 return; | 2700 return; |
| 2601 } | 2701 } |
| 2602 if (parent->type == XML_ELEMENT_NODE) { | 2702 if (parent->type == XML_ELEMENT_NODE) { |
| 2603 #ifdef DEBUG_SAX_TREE | 2703 #ifdef DEBUG_SAX_TREE |
| 2604 xmlGenericError(xmlGenericErrorContext, | 2704 xmlGenericError(xmlGenericErrorContext, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2645 } | 2745 } |
| 2646 } | 2746 } |
| 2647 | 2747 |
| 2648 if (ctxt->inSubset == 1) { | 2748 if (ctxt->inSubset == 1) { |
| 2649 xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); | 2749 xmlAddChild((xmlNodePtr) ctxt->myDoc->intSubset, ret); |
| 2650 return; | 2750 return; |
| 2651 } else if (ctxt->inSubset == 2) { | 2751 } else if (ctxt->inSubset == 2) { |
| 2652 xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); | 2752 xmlAddChild((xmlNodePtr) ctxt->myDoc->extSubset, ret); |
| 2653 return; | 2753 return; |
| 2654 } | 2754 } |
| 2655 if ((ctxt->myDoc->children == NULL) || (parent == NULL)) { | 2755 if (parent == NULL) { |
| 2656 #ifdef DEBUG_SAX_TREE | 2756 #ifdef DEBUG_SAX_TREE |
| 2657 xmlGenericError(xmlGenericErrorContext, | 2757 xmlGenericError(xmlGenericErrorContext, |
| 2658 "Setting xmlSAX2Comment as root\n"); | 2758 "Setting xmlSAX2Comment as root\n"); |
| 2659 #endif | 2759 #endif |
| 2660 xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); | 2760 xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret); |
| 2661 return; | 2761 return; |
| 2662 } | 2762 } |
| 2663 if (parent->type == XML_ELEMENT_NODE) { | 2763 if (parent->type == XML_ELEMENT_NODE) { |
| 2664 #ifdef DEBUG_SAX_TREE | 2764 #ifdef DEBUG_SAX_TREE |
| 2665 xmlGenericError(xmlGenericErrorContext, | 2765 xmlGenericError(xmlGenericErrorContext, |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2936 */ | 3036 */ |
| 2937 void | 3037 void |
| 2938 docbDefaultSAXHandlerInit(void) | 3038 docbDefaultSAXHandlerInit(void) |
| 2939 { | 3039 { |
| 2940 xmlSAX2InitDocbDefaultSAXHandler((xmlSAXHandlerPtr) &docbDefaultSAXHandler); | 3040 xmlSAX2InitDocbDefaultSAXHandler((xmlSAXHandlerPtr) &docbDefaultSAXHandler); |
| 2941 } | 3041 } |
| 2942 | 3042 |
| 2943 #endif /* LIBXML_DOCB_ENABLED */ | 3043 #endif /* LIBXML_DOCB_ENABLED */ |
| 2944 #define bottom_SAX2 | 3044 #define bottom_SAX2 |
| 2945 #include "elfgcchack.h" | 3045 #include "elfgcchack.h" |
| OLD | NEW |