| 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 |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 if ((ctxt == NULL) || (ctxt->options & XML_PARSE_HUGE)) | 131 if ((ctxt == NULL) || (ctxt->options & XML_PARSE_HUGE)) |
| 132 return (0); | 132 return (0); |
| 133 if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) | 133 if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) |
| 134 return (1); | 134 return (1); |
| 135 | 135 |
| 136 /* | 136 /* |
| 137 * This may look absurd but is needed to detect | 137 * This may look absurd but is needed to detect |
| 138 * entities problems | 138 * entities problems |
| 139 */ | 139 */ |
| 140 if ((ent != NULL) && (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && | 140 if ((ent != NULL) && (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && |
| 141 » (ent->content != NULL) && (ent->checked == 0)) { | 141 » (ent->content != NULL) && (ent->checked == 0) && |
| 142 » (ctxt->errNo != XML_ERR_ENTITY_LOOP)) { |
| 142 unsigned long oldnbent = ctxt->nbentities; | 143 unsigned long oldnbent = ctxt->nbentities; |
| 143 xmlChar *rep; | 144 xmlChar *rep; |
| 144 | 145 |
| 145 ent->checked = 1; | 146 ent->checked = 1; |
| 146 | 147 |
| 148 ++ctxt->depth; |
| 147 rep = xmlStringDecodeEntities(ctxt, ent->content, | 149 rep = xmlStringDecodeEntities(ctxt, ent->content, |
| 148 XML_SUBSTITUTE_REF, 0, 0, 0); | 150 XML_SUBSTITUTE_REF, 0, 0, 0); |
| 151 --ctxt->depth; |
| 152 if (ctxt->errNo == XML_ERR_ENTITY_LOOP) { |
| 153 ent->content[0] = 0; |
| 154 } |
| 149 | 155 |
| 150 ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; | 156 ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
| 151 if (rep != NULL) { | 157 if (rep != NULL) { |
| 152 if (xmlStrchr(rep, '<')) | 158 if (xmlStrchr(rep, '<')) |
| 153 ent->checked |= 1; | 159 ent->checked |= 1; |
| 154 xmlFree(rep); | 160 xmlFree(rep); |
| 155 rep = NULL; | 161 rep = NULL; |
| 156 } | 162 } |
| 157 } | 163 } |
| 158 if (replacement != 0) { | 164 if (replacement != 0) { |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 * @ctxt: an XML parser context | 343 * @ctxt: an XML parser context |
| 338 * @error: the error number | 344 * @error: the error number |
| 339 * @extra: extra information string | 345 * @extra: extra information string |
| 340 * | 346 * |
| 341 * Handle a fatal parser error, i.e. violating Well-Formedness constraints | 347 * Handle a fatal parser error, i.e. violating Well-Formedness constraints |
| 342 */ | 348 */ |
| 343 static void | 349 static void |
| 344 xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info) | 350 xmlFatalErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *info) |
| 345 { | 351 { |
| 346 const char *errmsg; | 352 const char *errmsg; |
| 347 char errstr[129] = ""; | |
| 348 | 353 |
| 349 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 354 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 350 (ctxt->instate == XML_PARSER_EOF)) | 355 (ctxt->instate == XML_PARSER_EOF)) |
| 351 return; | 356 return; |
| 352 switch (error) { | 357 switch (error) { |
| 353 case XML_ERR_INVALID_HEX_CHARREF: | 358 case XML_ERR_INVALID_HEX_CHARREF: |
| 354 errmsg = "CharRef: invalid hexadecimal value"; | 359 errmsg = "CharRef: invalid hexadecimal value"; |
| 355 break; | 360 break; |
| 356 case XML_ERR_INVALID_DEC_CHARREF: | 361 case XML_ERR_INVALID_DEC_CHARREF: |
| 357 errmsg = "CharRef: invalid decimal value"; | 362 errmsg = "CharRef: invalid decimal value"; |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 errmsg = "Name too long use XML_PARSE_HUGE option"; | 529 errmsg = "Name too long use XML_PARSE_HUGE option"; |
| 525 break; | 530 break; |
| 526 #if 0 | 531 #if 0 |
| 527 case: | 532 case: |
| 528 errmsg = ""; | 533 errmsg = ""; |
| 529 break; | 534 break; |
| 530 #endif | 535 #endif |
| 531 default: | 536 default: |
| 532 errmsg = "Unregistered error message"; | 537 errmsg = "Unregistered error message"; |
| 533 } | 538 } |
| 534 if (info == NULL) | |
| 535 snprintf(errstr, 128, "%s\n", errmsg); | |
| 536 else | |
| 537 snprintf(errstr, 128, "%s: %%s\n", errmsg); | |
| 538 if (ctxt != NULL) | 539 if (ctxt != NULL) |
| 539 ctxt->errNo = error; | 540 ctxt->errNo = error; |
| 540 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, | 541 if (info == NULL) { |
| 541 XML_ERR_FATAL, NULL, 0, info, NULL, NULL, 0, 0, &errstr[0], | 542 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, |
| 542 info); | 543 XML_ERR_FATAL, NULL, 0, info, NULL, NULL, 0, 0, "%s\n", |
| 544 errmsg); |
| 545 } else { |
| 546 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, |
| 547 XML_ERR_FATAL, NULL, 0, info, NULL, NULL, 0, 0, "%s: %s\
n", |
| 548 errmsg, info); |
| 549 } |
| 543 if (ctxt != NULL) { | 550 if (ctxt != NULL) { |
| 544 ctxt->wellFormed = 0; | 551 ctxt->wellFormed = 0; |
| 545 if (ctxt->recovery == 0) | 552 if (ctxt->recovery == 0) |
| 546 ctxt->disableSAX = 1; | 553 ctxt->disableSAX = 1; |
| 547 } | 554 } |
| 548 } | 555 } |
| 549 | 556 |
| 550 /** | 557 /** |
| 551 * xmlFatalErrMsg: | 558 * xmlFatalErrMsg: |
| 552 * @ctxt: an XML parser context | 559 * @ctxt: an XML parser context |
| 553 * @error: the error number | 560 * @error: the error number |
| 554 * @msg: the error message | 561 * @msg: the error message |
| 555 * | 562 * |
| 556 * Handle a fatal parser error, i.e. violating Well-Formedness constraints | 563 * Handle a fatal parser error, i.e. violating Well-Formedness constraints |
| 557 */ | 564 */ |
| 558 static void | 565 static void LIBXML_ATTR_FORMAT(3,0) |
| 559 xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 566 xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 560 const char *msg) | 567 const char *msg) |
| 561 { | 568 { |
| 562 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 569 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 563 (ctxt->instate == XML_PARSER_EOF)) | 570 (ctxt->instate == XML_PARSER_EOF)) |
| 564 return; | 571 return; |
| 565 if (ctxt != NULL) | 572 if (ctxt != NULL) |
| 566 ctxt->errNo = error; | 573 ctxt->errNo = error; |
| 567 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, | 574 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER, error, |
| 568 XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg); | 575 XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg); |
| 569 if (ctxt != NULL) { | 576 if (ctxt != NULL) { |
| 570 ctxt->wellFormed = 0; | 577 ctxt->wellFormed = 0; |
| 571 if (ctxt->recovery == 0) | 578 if (ctxt->recovery == 0) |
| 572 ctxt->disableSAX = 1; | 579 ctxt->disableSAX = 1; |
| 573 } | 580 } |
| 574 } | 581 } |
| 575 | 582 |
| 576 /** | 583 /** |
| 577 * xmlWarningMsg: | 584 * xmlWarningMsg: |
| 578 * @ctxt: an XML parser context | 585 * @ctxt: an XML parser context |
| 579 * @error: the error number | 586 * @error: the error number |
| 580 * @msg: the error message | 587 * @msg: the error message |
| 581 * @str1: extra data | 588 * @str1: extra data |
| 582 * @str2: extra data | 589 * @str2: extra data |
| 583 * | 590 * |
| 584 * Handle a warning. | 591 * Handle a warning. |
| 585 */ | 592 */ |
| 586 static void | 593 static void LIBXML_ATTR_FORMAT(3,0) |
| 587 xmlWarningMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 594 xmlWarningMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 588 const char *msg, const xmlChar *str1, const xmlChar *str2) | 595 const char *msg, const xmlChar *str1, const xmlChar *str2) |
| 589 { | 596 { |
| 590 xmlStructuredErrorFunc schannel = NULL; | 597 xmlStructuredErrorFunc schannel = NULL; |
| 591 | 598 |
| 592 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 599 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 593 (ctxt->instate == XML_PARSER_EOF)) | 600 (ctxt->instate == XML_PARSER_EOF)) |
| 594 return; | 601 return; |
| 595 if ((ctxt != NULL) && (ctxt->sax != NULL) && | 602 if ((ctxt != NULL) && (ctxt->sax != NULL) && |
| 596 (ctxt->sax->initialized == XML_SAX2_MAGIC)) | 603 (ctxt->sax->initialized == XML_SAX2_MAGIC)) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 614 | 621 |
| 615 /** | 622 /** |
| 616 * xmlValidityError: | 623 * xmlValidityError: |
| 617 * @ctxt: an XML parser context | 624 * @ctxt: an XML parser context |
| 618 * @error: the error number | 625 * @error: the error number |
| 619 * @msg: the error message | 626 * @msg: the error message |
| 620 * @str1: extra data | 627 * @str1: extra data |
| 621 * | 628 * |
| 622 * Handle a validity error. | 629 * Handle a validity error. |
| 623 */ | 630 */ |
| 624 static void | 631 static void LIBXML_ATTR_FORMAT(3,0) |
| 625 xmlValidityError(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 632 xmlValidityError(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 626 const char *msg, const xmlChar *str1, const xmlChar *str2) | 633 const char *msg, const xmlChar *str1, const xmlChar *str2) |
| 627 { | 634 { |
| 628 xmlStructuredErrorFunc schannel = NULL; | 635 xmlStructuredErrorFunc schannel = NULL; |
| 629 | 636 |
| 630 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 637 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 631 (ctxt->instate == XML_PARSER_EOF)) | 638 (ctxt->instate == XML_PARSER_EOF)) |
| 632 return; | 639 return; |
| 633 if (ctxt != NULL) { | 640 if (ctxt != NULL) { |
| 634 ctxt->errNo = error; | 641 ctxt->errNo = error; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 654 | 661 |
| 655 /** | 662 /** |
| 656 * xmlFatalErrMsgInt: | 663 * xmlFatalErrMsgInt: |
| 657 * @ctxt: an XML parser context | 664 * @ctxt: an XML parser context |
| 658 * @error: the error number | 665 * @error: the error number |
| 659 * @msg: the error message | 666 * @msg: the error message |
| 660 * @val: an integer value | 667 * @val: an integer value |
| 661 * | 668 * |
| 662 * Handle a fatal parser error, i.e. violating Well-Formedness constraints | 669 * Handle a fatal parser error, i.e. violating Well-Formedness constraints |
| 663 */ | 670 */ |
| 664 static void | 671 static void LIBXML_ATTR_FORMAT(3,0) |
| 665 xmlFatalErrMsgInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 672 xmlFatalErrMsgInt(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 666 const char *msg, int val) | 673 const char *msg, int val) |
| 667 { | 674 { |
| 668 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 675 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 669 (ctxt->instate == XML_PARSER_EOF)) | 676 (ctxt->instate == XML_PARSER_EOF)) |
| 670 return; | 677 return; |
| 671 if (ctxt != NULL) | 678 if (ctxt != NULL) |
| 672 ctxt->errNo = error; | 679 ctxt->errNo = error; |
| 673 __xmlRaiseError(NULL, NULL, NULL, | 680 __xmlRaiseError(NULL, NULL, NULL, |
| 674 ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, | 681 ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, |
| 675 NULL, 0, NULL, NULL, NULL, val, 0, msg, val); | 682 NULL, 0, NULL, NULL, NULL, val, 0, msg, val); |
| 676 if (ctxt != NULL) { | 683 if (ctxt != NULL) { |
| 677 ctxt->wellFormed = 0; | 684 ctxt->wellFormed = 0; |
| 678 if (ctxt->recovery == 0) | 685 if (ctxt->recovery == 0) |
| 679 ctxt->disableSAX = 1; | 686 ctxt->disableSAX = 1; |
| 680 } | 687 } |
| 681 } | 688 } |
| 682 | 689 |
| 683 /** | 690 /** |
| 684 * xmlFatalErrMsgStrIntStr: | 691 * xmlFatalErrMsgStrIntStr: |
| 685 * @ctxt: an XML parser context | 692 * @ctxt: an XML parser context |
| 686 * @error: the error number | 693 * @error: the error number |
| 687 * @msg: the error message | 694 * @msg: the error message |
| 688 * @str1: an string info | 695 * @str1: an string info |
| 689 * @val: an integer value | 696 * @val: an integer value |
| 690 * @str2: an string info | 697 * @str2: an string info |
| 691 * | 698 * |
| 692 * Handle a fatal parser error, i.e. violating Well-Formedness constraints | 699 * Handle a fatal parser error, i.e. violating Well-Formedness constraints |
| 693 */ | 700 */ |
| 694 static void | 701 static void LIBXML_ATTR_FORMAT(3,0) |
| 695 xmlFatalErrMsgStrIntStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 702 xmlFatalErrMsgStrIntStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 696 const char *msg, const xmlChar *str1, int val, | 703 const char *msg, const xmlChar *str1, int val, |
| 697 const xmlChar *str2) | 704 const xmlChar *str2) |
| 698 { | 705 { |
| 699 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 706 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 700 (ctxt->instate == XML_PARSER_EOF)) | 707 (ctxt->instate == XML_PARSER_EOF)) |
| 701 return; | 708 return; |
| 702 if (ctxt != NULL) | 709 if (ctxt != NULL) |
| 703 ctxt->errNo = error; | 710 ctxt->errNo = error; |
| 704 __xmlRaiseError(NULL, NULL, NULL, | 711 __xmlRaiseError(NULL, NULL, NULL, |
| 705 ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, | 712 ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL, |
| 706 NULL, 0, (const char *) str1, (const char *) str2, | 713 NULL, 0, (const char *) str1, (const char *) str2, |
| 707 NULL, val, 0, msg, str1, val, str2); | 714 NULL, val, 0, msg, str1, val, str2); |
| 708 if (ctxt != NULL) { | 715 if (ctxt != NULL) { |
| 709 ctxt->wellFormed = 0; | 716 ctxt->wellFormed = 0; |
| 710 if (ctxt->recovery == 0) | 717 if (ctxt->recovery == 0) |
| 711 ctxt->disableSAX = 1; | 718 ctxt->disableSAX = 1; |
| 712 } | 719 } |
| 713 } | 720 } |
| 714 | 721 |
| 715 /** | 722 /** |
| 716 * xmlFatalErrMsgStr: | 723 * xmlFatalErrMsgStr: |
| 717 * @ctxt: an XML parser context | 724 * @ctxt: an XML parser context |
| 718 * @error: the error number | 725 * @error: the error number |
| 719 * @msg: the error message | 726 * @msg: the error message |
| 720 * @val: a string value | 727 * @val: a string value |
| 721 * | 728 * |
| 722 * Handle a fatal parser error, i.e. violating Well-Formedness constraints | 729 * Handle a fatal parser error, i.e. violating Well-Formedness constraints |
| 723 */ | 730 */ |
| 724 static void | 731 static void LIBXML_ATTR_FORMAT(3,0) |
| 725 xmlFatalErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 732 xmlFatalErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 726 const char *msg, const xmlChar * val) | 733 const char *msg, const xmlChar * val) |
| 727 { | 734 { |
| 728 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 735 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 729 (ctxt->instate == XML_PARSER_EOF)) | 736 (ctxt->instate == XML_PARSER_EOF)) |
| 730 return; | 737 return; |
| 731 if (ctxt != NULL) | 738 if (ctxt != NULL) |
| 732 ctxt->errNo = error; | 739 ctxt->errNo = error; |
| 733 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, | 740 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, |
| 734 XML_FROM_PARSER, error, XML_ERR_FATAL, | 741 XML_FROM_PARSER, error, XML_ERR_FATAL, |
| 735 NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, | 742 NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, |
| 736 val); | 743 val); |
| 737 if (ctxt != NULL) { | 744 if (ctxt != NULL) { |
| 738 ctxt->wellFormed = 0; | 745 ctxt->wellFormed = 0; |
| 739 if (ctxt->recovery == 0) | 746 if (ctxt->recovery == 0) |
| 740 ctxt->disableSAX = 1; | 747 ctxt->disableSAX = 1; |
| 741 } | 748 } |
| 742 } | 749 } |
| 743 | 750 |
| 744 /** | 751 /** |
| 745 * xmlErrMsgStr: | 752 * xmlErrMsgStr: |
| 746 * @ctxt: an XML parser context | 753 * @ctxt: an XML parser context |
| 747 * @error: the error number | 754 * @error: the error number |
| 748 * @msg: the error message | 755 * @msg: the error message |
| 749 * @val: a string value | 756 * @val: a string value |
| 750 * | 757 * |
| 751 * Handle a non fatal parser error | 758 * Handle a non fatal parser error |
| 752 */ | 759 */ |
| 753 static void | 760 static void LIBXML_ATTR_FORMAT(3,0) |
| 754 xmlErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 761 xmlErrMsgStr(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 755 const char *msg, const xmlChar * val) | 762 const char *msg, const xmlChar * val) |
| 756 { | 763 { |
| 757 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 764 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 758 (ctxt->instate == XML_PARSER_EOF)) | 765 (ctxt->instate == XML_PARSER_EOF)) |
| 759 return; | 766 return; |
| 760 if (ctxt != NULL) | 767 if (ctxt != NULL) |
| 761 ctxt->errNo = error; | 768 ctxt->errNo = error; |
| 762 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, | 769 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, |
| 763 XML_FROM_PARSER, error, XML_ERR_ERROR, | 770 XML_FROM_PARSER, error, XML_ERR_ERROR, |
| 764 NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, | 771 NULL, 0, (const char *) val, NULL, NULL, 0, 0, msg, |
| 765 val); | 772 val); |
| 766 } | 773 } |
| 767 | 774 |
| 768 /** | 775 /** |
| 769 * xmlNsErr: | 776 * xmlNsErr: |
| 770 * @ctxt: an XML parser context | 777 * @ctxt: an XML parser context |
| 771 * @error: the error number | 778 * @error: the error number |
| 772 * @msg: the message | 779 * @msg: the message |
| 773 * @info1: extra information string | 780 * @info1: extra information string |
| 774 * @info2: extra information string | 781 * @info2: extra information string |
| 775 * | 782 * |
| 776 * Handle a fatal parser error, i.e. violating Well-Formedness constraints | 783 * Handle a fatal parser error, i.e. violating Well-Formedness constraints |
| 777 */ | 784 */ |
| 778 static void | 785 static void LIBXML_ATTR_FORMAT(3,0) |
| 779 xmlNsErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 786 xmlNsErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 780 const char *msg, | 787 const char *msg, |
| 781 const xmlChar * info1, const xmlChar * info2, | 788 const xmlChar * info1, const xmlChar * info2, |
| 782 const xmlChar * info3) | 789 const xmlChar * info3) |
| 783 { | 790 { |
| 784 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 791 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 785 (ctxt->instate == XML_PARSER_EOF)) | 792 (ctxt->instate == XML_PARSER_EOF)) |
| 786 return; | 793 return; |
| 787 if (ctxt != NULL) | 794 if (ctxt != NULL) |
| 788 ctxt->errNo = error; | 795 ctxt->errNo = error; |
| 789 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, | 796 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, |
| 790 XML_ERR_ERROR, NULL, 0, (const char *) info1, | 797 XML_ERR_ERROR, NULL, 0, (const char *) info1, |
| 791 (const char *) info2, (const char *) info3, 0, 0, msg, | 798 (const char *) info2, (const char *) info3, 0, 0, msg, |
| 792 info1, info2, info3); | 799 info1, info2, info3); |
| 793 if (ctxt != NULL) | 800 if (ctxt != NULL) |
| 794 ctxt->nsWellFormed = 0; | 801 ctxt->nsWellFormed = 0; |
| 795 } | 802 } |
| 796 | 803 |
| 797 /** | 804 /** |
| 798 * xmlNsWarn | 805 * xmlNsWarn |
| 799 * @ctxt: an XML parser context | 806 * @ctxt: an XML parser context |
| 800 * @error: the error number | 807 * @error: the error number |
| 801 * @msg: the message | 808 * @msg: the message |
| 802 * @info1: extra information string | 809 * @info1: extra information string |
| 803 * @info2: extra information string | 810 * @info2: extra information string |
| 804 * | 811 * |
| 805 * Handle a namespace warning error | 812 * Handle a namespace warning error |
| 806 */ | 813 */ |
| 807 static void | 814 static void LIBXML_ATTR_FORMAT(3,0) |
| 808 xmlNsWarn(xmlParserCtxtPtr ctxt, xmlParserErrors error, | 815 xmlNsWarn(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
| 809 const char *msg, | 816 const char *msg, |
| 810 const xmlChar * info1, const xmlChar * info2, | 817 const xmlChar * info1, const xmlChar * info2, |
| 811 const xmlChar * info3) | 818 const xmlChar * info3) |
| 812 { | 819 { |
| 813 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && | 820 if ((ctxt != NULL) && (ctxt->disableSAX != 0) && |
| 814 (ctxt->instate == XML_PARSER_EOF)) | 821 (ctxt->instate == XML_PARSER_EOF)) |
| 815 return; | 822 return; |
| 816 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, | 823 __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_NAMESPACE, error, |
| 817 XML_ERR_WARNING, NULL, 0, (const char *) info1, | 824 XML_ERR_WARNING, NULL, 0, (const char *) info1, |
| (...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2001 * CUR_SCHAR same but operate on a string instead of the context | 2008 * CUR_SCHAR same but operate on a string instead of the context |
| 2002 * COPY_BUF copy the current unicode char to the target buffer, increment | 2009 * COPY_BUF copy the current unicode char to the target buffer, increment |
| 2003 * the index | 2010 * the index |
| 2004 * GROW, SHRINK handling of input buffers | 2011 * GROW, SHRINK handling of input buffers |
| 2005 */ | 2012 */ |
| 2006 | 2013 |
| 2007 #define RAW (*ctxt->input->cur) | 2014 #define RAW (*ctxt->input->cur) |
| 2008 #define CUR (*ctxt->input->cur) | 2015 #define CUR (*ctxt->input->cur) |
| 2009 #define NXT(val) ctxt->input->cur[(val)] | 2016 #define NXT(val) ctxt->input->cur[(val)] |
| 2010 #define CUR_PTR ctxt->input->cur | 2017 #define CUR_PTR ctxt->input->cur |
| 2018 #define BASE_PTR ctxt->input->base |
| 2011 | 2019 |
| 2012 #define CMP4( s, c1, c2, c3, c4 ) \ | 2020 #define CMP4( s, c1, c2, c3, c4 ) \ |
| 2013 ( ((unsigned char *) s)[ 0 ] == c1 && ((unsigned char *) s)[ 1 ] == c2 && \ | 2021 ( ((unsigned char *) s)[ 0 ] == c1 && ((unsigned char *) s)[ 1 ] == c2 && \ |
| 2014 ((unsigned char *) s)[ 2 ] == c3 && ((unsigned char *) s)[ 3 ] == c4 ) | 2022 ((unsigned char *) s)[ 2 ] == c3 && ((unsigned char *) s)[ 3 ] == c4 ) |
| 2015 #define CMP5( s, c1, c2, c3, c4, c5 ) \ | 2023 #define CMP5( s, c1, c2, c3, c4, c5 ) \ |
| 2016 ( CMP4( s, c1, c2, c3, c4 ) && ((unsigned char *) s)[ 4 ] == c5 ) | 2024 ( CMP4( s, c1, c2, c3, c4 ) && ((unsigned char *) s)[ 4 ] == c5 ) |
| 2017 #define CMP6( s, c1, c2, c3, c4, c5, c6 ) \ | 2025 #define CMP6( s, c1, c2, c3, c4, c5, c6 ) \ |
| 2018 ( CMP5( s, c1, c2, c3, c4, c5 ) && ((unsigned char *) s)[ 5 ] == c6 ) | 2026 ( CMP5( s, c1, c2, c3, c4, c5 ) && ((unsigned char *) s)[ 5 ] == c6 ) |
| 2019 #define CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) \ | 2027 #define CMP7( s, c1, c2, c3, c4, c5, c6, c7 ) \ |
| 2020 ( CMP6( s, c1, c2, c3, c4, c5, c6 ) && ((unsigned char *) s)[ 6 ] == c7 ) | 2028 ( CMP6( s, c1, c2, c3, c4, c5, c6 ) && ((unsigned char *) s)[ 6 ] == c7 ) |
| (...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2851 xmlGenericError(xmlGenericErrorContext, | 2859 xmlGenericError(xmlGenericErrorContext, |
| 2852 "String decoding PE Reference: %.30s\n", str); | 2860 "String decoding PE Reference: %.30s\n", str); |
| 2853 ent = xmlParseStringPEReference(ctxt, &str); | 2861 ent = xmlParseStringPEReference(ctxt, &str); |
| 2854 if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) | 2862 if (ctxt->lastError.code == XML_ERR_ENTITY_LOOP) |
| 2855 goto int_error; | 2863 goto int_error; |
| 2856 xmlParserEntityCheck(ctxt, 0, ent, 0); | 2864 xmlParserEntityCheck(ctxt, 0, ent, 0); |
| 2857 if (ent != NULL) | 2865 if (ent != NULL) |
| 2858 ctxt->nbentities += ent->checked / 2; | 2866 ctxt->nbentities += ent->checked / 2; |
| 2859 if (ent != NULL) { | 2867 if (ent != NULL) { |
| 2860 if (ent->content == NULL) { | 2868 if (ent->content == NULL) { |
| 2861 » » xmlLoadEntityContent(ctxt, ent); | 2869 » » /* |
| 2870 » » * Note: external parsed entities will not be loaded, |
| 2871 » » * it is not required for a non-validating parser to |
| 2872 » » * complete external PEreferences coming from the |
| 2873 » » * internal subset |
| 2874 » » */ |
| 2875 » » if (((ctxt->options & XML_PARSE_NOENT) != 0) || |
| 2876 » » » ((ctxt->options & XML_PARSE_DTDVALID) != 0) || |
| 2877 » » » (ctxt->validate != 0)) { |
| 2878 » » » xmlLoadEntityContent(ctxt, ent); |
| 2879 » » } else { |
| 2880 » » » xmlWarningMsg(ctxt, XML_ERR_ENTITY_PROCESSING, |
| 2881 » » "not validating will not read content for PE entity %s\n", |
| 2882 » » ent->name, NULL); |
| 2883 » » } |
| 2862 } | 2884 } |
| 2863 ctxt->depth++; | 2885 ctxt->depth++; |
| 2864 rep = xmlStringDecodeEntities(ctxt, ent->content, what, | 2886 rep = xmlStringDecodeEntities(ctxt, ent->content, what, |
| 2865 0, 0, 0); | 2887 0, 0, 0); |
| 2866 ctxt->depth--; | 2888 ctxt->depth--; |
| 2867 if (rep != NULL) { | 2889 if (rep != NULL) { |
| 2868 current = rep; | 2890 current = rep; |
| 2869 while (*current != 0) { /* non input consuming loop */ | 2891 while (*current != 0) { /* non input consuming loop */ |
| 2870 buffer[nbchars++] = *current++; | 2892 buffer[nbchars++] = *current++; |
| 2871 if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { | 2893 if (nbchars + XML_PARSER_BUFFER_SIZE > buffer_size) { |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3463 } | 3485 } |
| 3464 /* accelerator for special cases */ | 3486 /* accelerator for special cases */ |
| 3465 return(xmlParseNameComplex(ctxt)); | 3487 return(xmlParseNameComplex(ctxt)); |
| 3466 } | 3488 } |
| 3467 | 3489 |
| 3468 static const xmlChar * | 3490 static const xmlChar * |
| 3469 xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) { | 3491 xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) { |
| 3470 int len = 0, l; | 3492 int len = 0, l; |
| 3471 int c; | 3493 int c; |
| 3472 int count = 0; | 3494 int count = 0; |
| 3473 const xmlChar *end; /* needed because CUR_CHAR() can move cur on \r\n */ | 3495 size_t startPosition = 0; |
| 3474 | 3496 |
| 3475 #ifdef DEBUG | 3497 #ifdef DEBUG |
| 3476 nbParseNCNameComplex++; | 3498 nbParseNCNameComplex++; |
| 3477 #endif | 3499 #endif |
| 3478 | 3500 |
| 3479 /* | 3501 /* |
| 3480 * Handler for more complex cases | 3502 * Handler for more complex cases |
| 3481 */ | 3503 */ |
| 3482 GROW; | 3504 GROW; |
| 3483 end = ctxt->input->cur; | 3505 startPosition = CUR_PTR - BASE_PTR; |
| 3484 c = CUR_CHAR(l); | 3506 c = CUR_CHAR(l); |
| 3485 if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ | 3507 if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */ |
| 3486 (!xmlIsNameStartChar(ctxt, c) || (c == ':'))) { | 3508 (!xmlIsNameStartChar(ctxt, c) || (c == ':'))) { |
| 3487 return(NULL); | 3509 return(NULL); |
| 3488 } | 3510 } |
| 3489 | 3511 |
| 3490 while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ | 3512 while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */ |
| 3491 (xmlIsNameChar(ctxt, c) && (c != ':'))) { | 3513 (xmlIsNameChar(ctxt, c) && (c != ':'))) { |
| 3492 if (count++ > XML_PARSER_CHUNK_SIZE) { | 3514 if (count++ > XML_PARSER_CHUNK_SIZE) { |
| 3493 if ((len > XML_MAX_NAME_LENGTH) && | 3515 if ((len > XML_MAX_NAME_LENGTH) && |
| 3494 ((ctxt->options & XML_PARSE_HUGE) == 0)) { | 3516 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3495 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); | 3517 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); |
| 3496 return(NULL); | 3518 return(NULL); |
| 3497 } | 3519 } |
| 3498 count = 0; | 3520 count = 0; |
| 3499 GROW; | 3521 GROW; |
| 3500 if (ctxt->instate == XML_PARSER_EOF) | 3522 if (ctxt->instate == XML_PARSER_EOF) |
| 3501 return(NULL); | 3523 return(NULL); |
| 3502 } | 3524 } |
| 3503 len += l; | 3525 len += l; |
| 3504 NEXTL(l); | 3526 NEXTL(l); |
| 3505 end = ctxt->input->cur; | |
| 3506 c = CUR_CHAR(l); | 3527 c = CUR_CHAR(l); |
| 3507 if (c == 0) { | 3528 if (c == 0) { |
| 3508 count = 0; | 3529 count = 0; |
| 3509 /* | 3530 /* |
| 3510 * when shrinking to extend the buffer we really need to preserve | 3531 * when shrinking to extend the buffer we really need to preserve |
| 3511 * the part of the name we already parsed. Hence rolling back | 3532 * the part of the name we already parsed. Hence rolling back |
| 3512 * by current lenght. | 3533 * by current lenght. |
| 3513 */ | 3534 */ |
| 3514 ctxt->input->cur -= l; | 3535 ctxt->input->cur -= l; |
| 3515 GROW; | 3536 GROW; |
| 3516 ctxt->input->cur += l; | 3537 ctxt->input->cur += l; |
| 3517 if (ctxt->instate == XML_PARSER_EOF) | 3538 if (ctxt->instate == XML_PARSER_EOF) |
| 3518 return(NULL); | 3539 return(NULL); |
| 3519 end = ctxt->input->cur; | |
| 3520 c = CUR_CHAR(l); | 3540 c = CUR_CHAR(l); |
| 3521 } | 3541 } |
| 3522 } | 3542 } |
| 3523 if ((len > XML_MAX_NAME_LENGTH) && | 3543 if ((len > XML_MAX_NAME_LENGTH) && |
| 3524 ((ctxt->options & XML_PARSE_HUGE) == 0)) { | 3544 ((ctxt->options & XML_PARSE_HUGE) == 0)) { |
| 3525 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); | 3545 xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName"); |
| 3526 return(NULL); | 3546 return(NULL); |
| 3527 } | 3547 } |
| 3528 return(xmlDictLookup(ctxt->dict, end - len, len)); | 3548 return(xmlDictLookup(ctxt->dict, (BASE_PTR + startPosition), len)); |
| 3529 } | 3549 } |
| 3530 | 3550 |
| 3531 /** | 3551 /** |
| 3532 * xmlParseNCName: | 3552 * xmlParseNCName: |
| 3533 * @ctxt: an XML parser context | 3553 * @ctxt: an XML parser context |
| 3534 * @len: length of the string parsed | 3554 * @len: length of the string parsed |
| 3535 * | 3555 * |
| 3536 * parse an XML name. | 3556 * parse an XML name. |
| 3537 * | 3557 * |
| 3538 * [4NS] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | | 3558 * [4NS] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3959 xmlFatalErr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, NULL); | 3979 xmlFatalErr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, NULL); |
| 3960 xmlFree(buf); | 3980 xmlFree(buf); |
| 3961 } else { | 3981 } else { |
| 3962 NEXT; | 3982 NEXT; |
| 3963 /* | 3983 /* |
| 3964 * NOTE: 4.4.7 Bypassed | 3984 * NOTE: 4.4.7 Bypassed |
| 3965 * When a general entity reference appears in the EntityValue in | 3985 * When a general entity reference appears in the EntityValue in |
| 3966 * an entity declaration, it is bypassed and left as is. | 3986 * an entity declaration, it is bypassed and left as is. |
| 3967 * so XML_SUBSTITUTE_REF is not set here. | 3987 * so XML_SUBSTITUTE_REF is not set here. |
| 3968 */ | 3988 */ |
| 3989 ++ctxt->depth; |
| 3969 ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF, | 3990 ret = xmlStringDecodeEntities(ctxt, buf, XML_SUBSTITUTE_PEREF, |
| 3970 0, 0, 0); | 3991 0, 0, 0); |
| 3992 --ctxt->depth; |
| 3971 if (orig != NULL) | 3993 if (orig != NULL) |
| 3972 *orig = buf; | 3994 *orig = buf; |
| 3973 else | 3995 else |
| 3974 xmlFree(buf); | 3996 xmlFree(buf); |
| 3975 } | 3997 } |
| 3976 | 3998 |
| 3977 return(ret); | 3999 return(ret); |
| 3978 } | 4000 } |
| 3979 | 4001 |
| 3980 /** | 4002 /** |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4085 buf[len++] = '#'; | 4107 buf[len++] = '#'; |
| 4086 buf[len++] = '3'; | 4108 buf[len++] = '3'; |
| 4087 buf[len++] = '8'; | 4109 buf[len++] = '8'; |
| 4088 buf[len++] = ';'; | 4110 buf[len++] = ';'; |
| 4089 } else { | 4111 } else { |
| 4090 buf[len++] = ent->content[0]; | 4112 buf[len++] = ent->content[0]; |
| 4091 } | 4113 } |
| 4092 } else if ((ent != NULL) && | 4114 } else if ((ent != NULL) && |
| 4093 (ctxt->replaceEntities != 0)) { | 4115 (ctxt->replaceEntities != 0)) { |
| 4094 if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { | 4116 if (ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) { |
| 4117 ++ctxt->depth; |
| 4095 rep = xmlStringDecodeEntities(ctxt, ent->content, | 4118 rep = xmlStringDecodeEntities(ctxt, ent->content, |
| 4096 XML_SUBSTITUTE_REF, | 4119 XML_SUBSTITUTE_REF, |
| 4097 0, 0, 0); | 4120 0, 0, 0); |
| 4121 --ctxt->depth; |
| 4098 if (rep != NULL) { | 4122 if (rep != NULL) { |
| 4099 current = rep; | 4123 current = rep; |
| 4100 while (*current != 0) { /* non input consuming */ | 4124 while (*current != 0) { /* non input consuming */ |
| 4101 if ((*current == 0xD) || (*current == 0xA) || | 4125 if ((*current == 0xD) || (*current == 0xA) || |
| 4102 (*current == 0x9)) { | 4126 (*current == 0x9)) { |
| 4103 buf[len++] = 0x20; | 4127 buf[len++] = 0x20; |
| 4104 current++; | 4128 current++; |
| 4105 } else | 4129 } else |
| 4106 buf[len++] = *current++; | 4130 buf[len++] = *current++; |
| 4107 if (len + 10 > buf_size) { | 4131 if (len + 10 > buf_size) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 4123 const xmlChar *cur = ent->name; | 4147 const xmlChar *cur = ent->name; |
| 4124 | 4148 |
| 4125 /* | 4149 /* |
| 4126 * This may look absurd but is needed to detect | 4150 * This may look absurd but is needed to detect |
| 4127 * entities problems | 4151 * entities problems |
| 4128 */ | 4152 */ |
| 4129 if ((ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && | 4153 if ((ent->etype != XML_INTERNAL_PREDEFINED_ENTITY) && |
| 4130 (ent->content != NULL) && (ent->checked == 0)) { | 4154 (ent->content != NULL) && (ent->checked == 0)) { |
| 4131 unsigned long oldnbent = ctxt->nbentities; | 4155 unsigned long oldnbent = ctxt->nbentities; |
| 4132 | 4156 |
| 4157 ++ctxt->depth; |
| 4133 rep = xmlStringDecodeEntities(ctxt, ent->content, | 4158 rep = xmlStringDecodeEntities(ctxt, ent->content, |
| 4134 XML_SUBSTITUTE_REF, 0, 0, 0); | 4159 XML_SUBSTITUTE_REF, 0, 0, 0); |
| 4160 --ctxt->depth; |
| 4135 | 4161 |
| 4136 ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; | 4162 ent->checked = (ctxt->nbentities - oldnbent + 1) * 2; |
| 4137 if (rep != NULL) { | 4163 if (rep != NULL) { |
| 4138 if (xmlStrchr(rep, '<')) | 4164 if (xmlStrchr(rep, '<')) |
| 4139 ent->checked |= 1; | 4165 ent->checked |= 1; |
| 4140 xmlFree(rep); | 4166 xmlFree(rep); |
| 4141 rep = NULL; | 4167 rep = NULL; |
| 4142 } | 4168 } |
| 4143 } | 4169 } |
| 4144 | 4170 |
| (...skipping 1349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5494 if (skipped == 0) { | 5520 if (skipped == 0) { |
| 5495 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 5521 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
| 5496 "Space required after '<!ENTITY'\n"); | 5522 "Space required after '<!ENTITY'\n"); |
| 5497 } | 5523 } |
| 5498 | 5524 |
| 5499 if (RAW == '%') { | 5525 if (RAW == '%') { |
| 5500 NEXT; | 5526 NEXT; |
| 5501 skipped = SKIP_BLANKS; | 5527 skipped = SKIP_BLANKS; |
| 5502 if (skipped == 0) { | 5528 if (skipped == 0) { |
| 5503 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 5529 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
| 5504 » » » "Space required after '%'\n"); | 5530 » » » "Space required after '%%'\n"); |
| 5505 } | 5531 } |
| 5506 isParameter = 1; | 5532 isParameter = 1; |
| 5507 } | 5533 } |
| 5508 | 5534 |
| 5509 name = xmlParseName(ctxt); | 5535 name = xmlParseName(ctxt); |
| 5510 if (name == NULL) { | 5536 if (name == NULL) { |
| 5511 xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, | 5537 xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, |
| 5512 "xmlParseEntityDecl: no name\n"); | 5538 "xmlParseEntityDecl: no name\n"); |
| 5513 return; | 5539 return; |
| 5514 } | 5540 } |
| (...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6679 xmlElementContentPtr content = NULL; | 6705 xmlElementContentPtr content = NULL; |
| 6680 | 6706 |
| 6681 /* GROW; done in the caller */ | 6707 /* GROW; done in the caller */ |
| 6682 if (CMP9(CUR_PTR, '<', '!', 'E', 'L', 'E', 'M', 'E', 'N', 'T')) { | 6708 if (CMP9(CUR_PTR, '<', '!', 'E', 'L', 'E', 'M', 'E', 'N', 'T')) { |
| 6683 xmlParserInputPtr input = ctxt->input; | 6709 xmlParserInputPtr input = ctxt->input; |
| 6684 | 6710 |
| 6685 SKIP(9); | 6711 SKIP(9); |
| 6686 if (!IS_BLANK_CH(CUR)) { | 6712 if (!IS_BLANK_CH(CUR)) { |
| 6687 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 6713 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
| 6688 "Space required after 'ELEMENT'\n"); | 6714 "Space required after 'ELEMENT'\n"); |
| 6715 return(-1); |
| 6689 } | 6716 } |
| 6690 SKIP_BLANKS; | 6717 SKIP_BLANKS; |
| 6691 name = xmlParseName(ctxt); | 6718 name = xmlParseName(ctxt); |
| 6692 if (name == NULL) { | 6719 if (name == NULL) { |
| 6693 xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, | 6720 xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, |
| 6694 "xmlParseElementDecl: no name for Element\n"); | 6721 "xmlParseElementDecl: no name for Element\n"); |
| 6695 return(-1); | 6722 return(-1); |
| 6696 } | 6723 } |
| 6697 while ((RAW == 0) && (ctxt->inputNr > 1)) | 6724 while ((RAW == 0) && (ctxt->inputNr > 1)) |
| 6698 xmlPopInput(ctxt); | 6725 xmlPopInput(ctxt); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6830 xmlParseMarkupDecl(ctxt); | 6857 xmlParseMarkupDecl(ctxt); |
| 6831 | 6858 |
| 6832 /* | 6859 /* |
| 6833 * Pop-up of finished entities. | 6860 * Pop-up of finished entities. |
| 6834 */ | 6861 */ |
| 6835 while ((RAW == 0) && (ctxt->inputNr > 1)) | 6862 while ((RAW == 0) && (ctxt->inputNr > 1)) |
| 6836 xmlPopInput(ctxt); | 6863 xmlPopInput(ctxt); |
| 6837 | 6864 |
| 6838 if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { | 6865 if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) { |
| 6839 xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL); | 6866 xmlFatalErr(ctxt, XML_ERR_EXT_SUBSET_NOT_FINISHED, NULL); |
| 6867 xmlHaltParser(ctxt); |
| 6840 break; | 6868 break; |
| 6841 } | 6869 } |
| 6842 } | 6870 } |
| 6843 if (xmlParserDebugEntities) { | 6871 if (xmlParserDebugEntities) { |
| 6844 if ((ctxt->input != NULL) && (ctxt->input->filename)) | 6872 if ((ctxt->input != NULL) && (ctxt->input->filename)) |
| 6845 xmlGenericError(xmlGenericErrorContext, | 6873 xmlGenericError(xmlGenericErrorContext, |
| 6846 "%s(%d): ", ctxt->input->filename, | 6874 "%s(%d): ", ctxt->input->filename, |
| 6847 ctxt->input->line); | 6875 ctxt->input->line); |
| 6848 xmlGenericError(xmlGenericErrorContext, | 6876 xmlGenericError(xmlGenericErrorContext, |
| 6849 "Leaving INCLUDE Conditional Section\n"); | 6877 "Leaving INCLUDE Conditional Section\n"); |
| (...skipping 2609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9459 * check that it's not a defined namespace | 9487 * check that it's not a defined namespace |
| 9460 */ | 9488 */ |
| 9461 for (j = 1;j <= nbNs;j++) | 9489 for (j = 1;j <= nbNs;j++) |
| 9462 if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) | 9490 if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) |
| 9463 break; | 9491 break; |
| 9464 if (j <= nbNs) | 9492 if (j <= nbNs) |
| 9465 xmlErrAttributeDup(ctxt, NULL, attname); | 9493 xmlErrAttributeDup(ctxt, NULL, attname); |
| 9466 else | 9494 else |
| 9467 if (nsPush(ctxt, NULL, URL) > 0) nbNs++; | 9495 if (nsPush(ctxt, NULL, URL) > 0) nbNs++; |
| 9468 skip_default_ns: | 9496 skip_default_ns: |
| 9469 » » if (alloc != 0) xmlFree(attvalue); | 9497 » » if ((attvalue != NULL) && (alloc != 0)) { |
| 9498 » » xmlFree(attvalue); |
| 9499 » » attvalue = NULL; |
| 9500 » » } |
| 9470 if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) | 9501 if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) |
| 9471 break; | 9502 break; |
| 9472 if (!IS_BLANK_CH(RAW)) { | 9503 if (!IS_BLANK_CH(RAW)) { |
| 9473 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 9504 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
| 9474 "attributes construct error\n"); | 9505 "attributes construct error\n"); |
| 9475 break; | 9506 break; |
| 9476 } | 9507 } |
| 9477 SKIP_BLANKS; | 9508 SKIP_BLANKS; |
| 9509 if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) |
| 9510 goto base_changed; |
| 9478 continue; | 9511 continue; |
| 9479 } | 9512 } |
| 9480 if (aprefix == ctxt->str_xmlns) { | 9513 if (aprefix == ctxt->str_xmlns) { |
| 9481 const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); | 9514 const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); |
| 9482 xmlURIPtr uri; | 9515 xmlURIPtr uri; |
| 9483 | 9516 |
| 9484 if (attname == ctxt->str_xml) { | 9517 if (attname == ctxt->str_xml) { |
| 9485 if (URL != ctxt->str_xml_ns) { | 9518 if (URL != ctxt->str_xml_ns) { |
| 9486 xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, | 9519 xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, |
| 9487 "xml namespace prefix mapped to wrong URI\n", | 9520 "xml namespace prefix mapped to wrong URI\n", |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9539 * check that it's not a defined namespace | 9572 * check that it's not a defined namespace |
| 9540 */ | 9573 */ |
| 9541 for (j = 1;j <= nbNs;j++) | 9574 for (j = 1;j <= nbNs;j++) |
| 9542 if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) | 9575 if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) |
| 9543 break; | 9576 break; |
| 9544 if (j <= nbNs) | 9577 if (j <= nbNs) |
| 9545 xmlErrAttributeDup(ctxt, aprefix, attname); | 9578 xmlErrAttributeDup(ctxt, aprefix, attname); |
| 9546 else | 9579 else |
| 9547 if (nsPush(ctxt, attname, URL) > 0) nbNs++; | 9580 if (nsPush(ctxt, attname, URL) > 0) nbNs++; |
| 9548 skip_ns: | 9581 skip_ns: |
| 9549 » » if (alloc != 0) xmlFree(attvalue); | 9582 » » if ((attvalue != NULL) && (alloc != 0)) { |
| 9583 » » xmlFree(attvalue); |
| 9584 » » attvalue = NULL; |
| 9585 » » } |
| 9550 if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) | 9586 if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) |
| 9551 break; | 9587 break; |
| 9552 if (!IS_BLANK_CH(RAW)) { | 9588 if (!IS_BLANK_CH(RAW)) { |
| 9553 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, | 9589 xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, |
| 9554 "attributes construct error\n"); | 9590 "attributes construct error\n"); |
| 9555 break; | 9591 break; |
| 9556 } | 9592 } |
| 9557 SKIP_BLANKS; | 9593 SKIP_BLANKS; |
| 9558 if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) | 9594 if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) |
| 9559 goto base_changed; | 9595 goto base_changed; |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9810 * | 9846 * |
| 9811 * With namespace | 9847 * With namespace |
| 9812 * | 9848 * |
| 9813 * [NS 9] ETag ::= '</' QName S? '>' | 9849 * [NS 9] ETag ::= '</' QName S? '>' |
| 9814 */ | 9850 */ |
| 9815 | 9851 |
| 9816 static void | 9852 static void |
| 9817 xmlParseEndTag2(xmlParserCtxtPtr ctxt, const xmlChar *prefix, | 9853 xmlParseEndTag2(xmlParserCtxtPtr ctxt, const xmlChar *prefix, |
| 9818 const xmlChar *URI, int line, int nsNr, int tlen) { | 9854 const xmlChar *URI, int line, int nsNr, int tlen) { |
| 9819 const xmlChar *name; | 9855 const xmlChar *name; |
| 9856 size_t curLength; |
| 9820 | 9857 |
| 9821 GROW; | 9858 GROW; |
| 9822 if ((RAW != '<') || (NXT(1) != '/')) { | 9859 if ((RAW != '<') || (NXT(1) != '/')) { |
| 9823 xmlFatalErr(ctxt, XML_ERR_LTSLASH_REQUIRED, NULL); | 9860 xmlFatalErr(ctxt, XML_ERR_LTSLASH_REQUIRED, NULL); |
| 9824 return; | 9861 return; |
| 9825 } | 9862 } |
| 9826 SKIP(2); | 9863 SKIP(2); |
| 9827 | 9864 |
| 9828 size_t curLength = ctxt->input->end - ctxt->input->cur; | 9865 curLength = ctxt->input->end - ctxt->input->cur; |
| 9829 if ((tlen > 0) && (curLength >= (size_t)tlen) && (xmlStrncmp(ctxt->input->cu
r, ctxt->name, tlen) == 0)) { | 9866 if ((tlen > 0) && (curLength >= (size_t)tlen) && |
| 9830 if ((curLength >= (size_t)(tlen + 1)) && (ctxt->input->cur[tlen] == '>'))
{ | 9867 (xmlStrncmp(ctxt->input->cur, ctxt->name, tlen) == 0)) { |
| 9868 if ((curLength >= (size_t)(tlen + 1)) && |
| 9869 » (ctxt->input->cur[tlen] == '>')) { |
| 9831 ctxt->input->cur += tlen + 1; | 9870 ctxt->input->cur += tlen + 1; |
| 9832 ctxt->input->col += tlen + 1; | 9871 ctxt->input->col += tlen + 1; |
| 9833 goto done; | 9872 goto done; |
| 9834 } | 9873 } |
| 9835 ctxt->input->cur += tlen; | 9874 ctxt->input->cur += tlen; |
| 9836 ctxt->input->col += tlen; | 9875 ctxt->input->col += tlen; |
| 9837 name = (xmlChar*)1; | 9876 name = (xmlChar*)1; |
| 9838 } else { | 9877 } else { |
| 9839 if (prefix == NULL) | 9878 if (prefix == NULL) |
| 9840 name = xmlParseNameAndCompare(ctxt, ctxt->name); | 9879 name = xmlParseNameAndCompare(ctxt, ctxt->name); |
| (...skipping 5928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15769 if (stream == NULL) { | 15808 if (stream == NULL) { |
| 15770 xmlFreeParserInputBuffer(input); | 15809 xmlFreeParserInputBuffer(input); |
| 15771 return (NULL); | 15810 return (NULL); |
| 15772 } | 15811 } |
| 15773 inputPush(ctxt, stream); | 15812 inputPush(ctxt, stream); |
| 15774 return (xmlDoRead(ctxt, URL, encoding, options, 1)); | 15813 return (xmlDoRead(ctxt, URL, encoding, options, 1)); |
| 15775 } | 15814 } |
| 15776 | 15815 |
| 15777 #define bottom_parser | 15816 #define bottom_parser |
| 15778 #include "elfgcchack.h" | 15817 #include "elfgcchack.h" |
| OLD | NEW |