OLD | NEW |
1 /* | 1 /* |
2 * xinclude.c : Code to implement XInclude processing | 2 * xinclude.c : Code to implement XInclude processing |
3 * | 3 * |
4 * World Wide Web Consortium W3C Last Call Working Draft 10 November 2003 | 4 * World Wide Web Consortium W3C Last Call Working Draft 10 November 2003 |
5 * http://www.w3.org/TR/2003/WD-xinclude-20031110 | 5 * http://www.w3.org/TR/2003/WD-xinclude-20031110 |
6 * | 6 * |
7 * See Copyright for the status of this software. | 7 * See Copyright for the status of this software. |
8 * | 8 * |
9 * daniel@veillard.com | 9 * daniel@veillard.com |
10 */ | 10 */ |
11 | 11 |
12 #define IN_LIBXML | 12 #define IN_LIBXML |
13 #include "libxml.h" | 13 #include "libxml.h" |
14 | 14 |
15 #include <string.h> | 15 #include <string.h> |
16 #include <libxml/xmlmemory.h> | 16 #include <libxml/xmlmemory.h> |
17 #include <libxml/tree.h> | 17 #include <libxml/tree.h> |
18 #include <libxml/parser.h> | 18 #include <libxml/parser.h> |
19 #include <libxml/uri.h> | 19 #include <libxml/uri.h> |
| 20 #include <libxml/xpath.h> |
20 #include <libxml/xpointer.h> | 21 #include <libxml/xpointer.h> |
21 #include <libxml/parserInternals.h> | 22 #include <libxml/parserInternals.h> |
22 #include <libxml/xmlerror.h> | 23 #include <libxml/xmlerror.h> |
23 #include <libxml/encoding.h> | 24 #include <libxml/encoding.h> |
24 #include <libxml/globals.h> | 25 #include <libxml/globals.h> |
25 | 26 |
26 #ifdef LIBXML_XINCLUDE_ENABLED | 27 #ifdef LIBXML_XINCLUDE_ENABLED |
27 #include <libxml/xinclude.h> | 28 #include <libxml/xinclude.h> |
28 | 29 |
| 30 #include "buf.h" |
29 | 31 |
30 #define XINCLUDE_MAX_DEPTH 40 | 32 #define XINCLUDE_MAX_DEPTH 40 |
31 | 33 |
32 /* #define DEBUG_XINCLUDE */ | 34 /* #define DEBUG_XINCLUDE */ |
33 #ifdef DEBUG_XINCLUDE | 35 #ifdef DEBUG_XINCLUDE |
34 #ifdef LIBXML_DEBUG_ENABLED | 36 #ifdef LIBXML_DEBUG_ENABLED |
35 #include <libxml/debugXML.h> | 37 #include <libxml/debugXML.h> |
36 #endif | 38 #endif |
37 #endif | 39 #endif |
38 | 40 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 | 87 |
86 void *_private; /* application data */ | 88 void *_private; /* application data */ |
87 }; | 89 }; |
88 | 90 |
89 static int | 91 static int |
90 xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree); | 92 xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree); |
91 | 93 |
92 | 94 |
93 /************************************************************************ | 95 /************************************************************************ |
94 * * | 96 * * |
95 * » » » XInclude error handler» » » » * | 97 *» » » XInclude error handler» » » » * |
96 * * | 98 * * |
97 ************************************************************************/ | 99 ************************************************************************/ |
98 | 100 |
99 /** | 101 /** |
100 * xmlXIncludeErrMemory: | 102 * xmlXIncludeErrMemory: |
101 * @extra: extra information | 103 * @extra: extra information |
102 * | 104 * |
103 * Handle an out of memory condition | 105 * Handle an out of memory condition |
104 */ | 106 */ |
105 static void | 107 static void |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 if (ctxt->base != NULL) { | 407 if (ctxt->base != NULL) { |
406 xmlFree(ctxt->base); | 408 xmlFree(ctxt->base); |
407 } | 409 } |
408 xmlFree(ctxt); | 410 xmlFree(ctxt); |
409 } | 411 } |
410 | 412 |
411 /** | 413 /** |
412 * xmlXIncludeParseFile: | 414 * xmlXIncludeParseFile: |
413 * @ctxt: the XInclude context | 415 * @ctxt: the XInclude context |
414 * @URL: the URL or file path | 416 * @URL: the URL or file path |
415 * | 417 * |
416 * parse a document for XInclude | 418 * parse a document for XInclude |
417 */ | 419 */ |
418 static xmlDocPtr | 420 static xmlDocPtr |
419 xmlXIncludeParseFile(xmlXIncludeCtxtPtr ctxt, const char *URL) { | 421 xmlXIncludeParseFile(xmlXIncludeCtxtPtr ctxt, const char *URL) { |
420 xmlDocPtr ret; | 422 xmlDocPtr ret; |
421 xmlParserCtxtPtr pctxt; | 423 xmlParserCtxtPtr pctxt; |
422 xmlParserInputPtr inputStream; | 424 xmlParserInputPtr inputStream; |
423 | 425 |
424 xmlInitParser(); | 426 xmlInitParser(); |
425 | 427 |
426 pctxt = xmlNewParserCtxt(); | 428 pctxt = xmlNewParserCtxt(); |
427 if (pctxt == NULL) { | 429 if (pctxt == NULL) { |
428 xmlXIncludeErrMemory(ctxt, NULL, "cannot allocate parser context"); | 430 xmlXIncludeErrMemory(ctxt, NULL, "cannot allocate parser context"); |
429 return(NULL); | 431 return(NULL); |
430 } | 432 } |
431 | 433 |
432 /* | 434 /* |
433 * pass in the application data to the parser context. | 435 * pass in the application data to the parser context. |
434 */ | 436 */ |
435 pctxt->_private = ctxt->_private; | 437 pctxt->_private = ctxt->_private; |
436 | 438 |
437 /* | 439 /* |
438 * try to ensure that new documents included are actually | 440 * try to ensure that new documents included are actually |
439 * built with the same dictionary as the including document. | 441 * built with the same dictionary as the including document. |
440 */ | 442 */ |
441 if ((ctxt->doc != NULL) && (ctxt->doc->dict != NULL)) { | 443 if ((ctxt->doc != NULL) && (ctxt->doc->dict != NULL)) { |
442 if (pctxt->dict != NULL) | 444 if (pctxt->dict != NULL) |
443 xmlDictFree(pctxt->dict); | 445 xmlDictFree(pctxt->dict); |
444 pctxt->dict = ctxt->doc->dict; | 446 pctxt->dict = ctxt->doc->dict; |
445 xmlDictReference(pctxt->dict); | 447 xmlDictReference(pctxt->dict); |
446 } | 448 } |
447 | 449 |
448 xmlCtxtUseOptions(pctxt, ctxt->parseFlags | XML_PARSE_DTDLOAD); | 450 xmlCtxtUseOptions(pctxt, ctxt->parseFlags | XML_PARSE_DTDLOAD); |
449 | 451 |
450 inputStream = xmlLoadExternalEntity(URL, NULL, pctxt); | 452 inputStream = xmlLoadExternalEntity(URL, NULL, pctxt); |
451 if (inputStream == NULL) { | 453 if (inputStream == NULL) { |
452 xmlFreeParserCtxt(pctxt); | 454 xmlFreeParserCtxt(pctxt); |
453 return(NULL); | 455 return(NULL); |
454 } | 456 } |
455 | 457 |
456 inputPush(pctxt, inputStream); | 458 inputPush(pctxt, inputStream); |
457 | 459 |
458 if (pctxt->directory == NULL) | 460 if (pctxt->directory == NULL) |
459 pctxt->directory = xmlParserGetDirectory(URL); | 461 pctxt->directory = xmlParserGetDirectory(URL); |
460 | 462 |
461 pctxt->loadsubset |= XML_DETECT_IDS; | 463 pctxt->loadsubset |= XML_DETECT_IDS; |
462 | 464 |
463 xmlParseDocument(pctxt); | 465 xmlParseDocument(pctxt); |
464 | 466 |
465 if (pctxt->wellFormed) { | 467 if (pctxt->wellFormed) { |
466 ret = pctxt->myDoc; | 468 ret = pctxt->myDoc; |
467 } | 469 } |
468 else { | 470 else { |
469 ret = NULL; | 471 ret = NULL; |
470 if (pctxt->myDoc != NULL) | 472 if (pctxt->myDoc != NULL) |
471 xmlFreeDoc(pctxt->myDoc); | 473 xmlFreeDoc(pctxt->myDoc); |
472 pctxt->myDoc = NULL; | 474 pctxt->myDoc = NULL; |
473 } | 475 } |
474 xmlFreeParserCtxt(pctxt); | 476 xmlFreeParserCtxt(pctxt); |
475 | 477 |
476 return(ret); | 478 return(ret); |
477 } | 479 } |
478 | 480 |
479 /** | 481 /** |
480 * xmlXIncludeAddNode: | 482 * xmlXIncludeAddNode: |
481 * @ctxt: the XInclude context | 483 * @ctxt: the XInclude context |
482 * @cur: the new node | 484 * @cur: the new node |
483 * | 485 * |
484 * Add a new node to process to an XInclude context | 486 * Add a new node to process to an XInclude context |
485 */ | 487 */ |
486 static int | 488 static int |
487 xmlXIncludeAddNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur) { | 489 xmlXIncludeAddNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur) { |
488 xmlXIncludeRefPtr ref; | 490 xmlXIncludeRefPtr ref; |
489 xmlURIPtr uri; | 491 xmlURIPtr uri; |
490 xmlChar *URL; | 492 xmlChar *URL; |
491 xmlChar *fragment = NULL; | 493 xmlChar *fragment = NULL; |
492 xmlChar *href; | 494 xmlChar *href; |
493 xmlChar *parse; | 495 xmlChar *parse; |
(...skipping 10 matching lines...) Expand all Loading... |
504 | 506 |
505 #ifdef DEBUG_XINCLUDE | 507 #ifdef DEBUG_XINCLUDE |
506 xmlGenericError(xmlGenericErrorContext, "Add node\n"); | 508 xmlGenericError(xmlGenericErrorContext, "Add node\n"); |
507 #endif | 509 #endif |
508 /* | 510 /* |
509 * read the attributes | 511 * read the attributes |
510 */ | 512 */ |
511 href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); | 513 href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); |
512 if (href == NULL) { | 514 if (href == NULL) { |
513 href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ | 515 href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ |
514 » if (href == NULL) | 516 » if (href == NULL) |
515 return(-1); | 517 return(-1); |
516 } | 518 } |
517 if ((href[0] == '#') || (href[0] == 0)) | 519 if ((href[0] == '#') || (href[0] == 0)) |
518 local = 1; | 520 local = 1; |
519 parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); | 521 parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); |
520 if (parse != NULL) { | 522 if (parse != NULL) { |
521 if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) | 523 if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) |
522 xml = 1; | 524 xml = 1; |
523 else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) | 525 else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) |
524 xml = 0; | 526 xml = 0; |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 ref->count = 1; | 650 ref->count = 1; |
649 xmlFree(URL); | 651 xmlFree(URL); |
650 return(0); | 652 return(0); |
651 } | 653 } |
652 | 654 |
653 /** | 655 /** |
654 * xmlXIncludeRecurseDoc: | 656 * xmlXIncludeRecurseDoc: |
655 * @ctxt: the XInclude context | 657 * @ctxt: the XInclude context |
656 * @doc: the new document | 658 * @doc: the new document |
657 * @url: the associated URL | 659 * @url: the associated URL |
658 * | 660 * |
659 * The XInclude recursive nature is handled at this point. | 661 * The XInclude recursive nature is handled at this point. |
660 */ | 662 */ |
661 static void | 663 static void |
662 xmlXIncludeRecurseDoc(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, | 664 xmlXIncludeRecurseDoc(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, |
663 const xmlURL url ATTRIBUTE_UNUSED) { | 665 const xmlURL url ATTRIBUTE_UNUSED) { |
664 xmlXIncludeCtxtPtr newctxt; | 666 xmlXIncludeCtxtPtr newctxt; |
665 int i; | 667 int i; |
666 | 668 |
667 /* | 669 /* |
668 * Avoid recursion in already substitued resources | 670 * Avoid recursion in already substitued resources |
669 for (i = 0;i < ctxt->urlNr;i++) { | 671 for (i = 0;i < ctxt->urlNr;i++) { |
670 if (xmlStrEqual(doc->URL, ctxt->urlTab[i])) | 672 if (xmlStrEqual(doc->URL, ctxt->urlTab[i])) |
671 return; | 673 return; |
672 } | 674 } |
673 */ | 675 */ |
674 | 676 |
675 #ifdef DEBUG_XINCLUDE | 677 #ifdef DEBUG_XINCLUDE |
676 xmlGenericError(xmlGenericErrorContext, "Recursing in doc %s\n", doc->URL); | 678 xmlGenericError(xmlGenericErrorContext, "Recursing in doc %s\n", doc->URL); |
677 #endif | 679 #endif |
678 /* | 680 /* |
679 * Handle recursion here. | 681 * Handle recursion here. |
680 */ | 682 */ |
681 | 683 |
682 newctxt = xmlXIncludeNewContext(doc); | 684 newctxt = xmlXIncludeNewContext(doc); |
683 if (newctxt != NULL) { | 685 if (newctxt != NULL) { |
684 /* | 686 /* |
685 * Copy the private user data | 687 * Copy the private user data |
686 */ | 688 */ |
687 » newctxt->_private = ctxt->_private;» | 689 » newctxt->_private = ctxt->_private; |
688 /* | 690 /* |
689 * Copy the existing document set | 691 * Copy the existing document set |
690 */ | 692 */ |
691 newctxt->incMax = ctxt->incMax; | 693 newctxt->incMax = ctxt->incMax; |
692 newctxt->incNr = ctxt->incNr; | 694 newctxt->incNr = ctxt->incNr; |
693 newctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(newctxt->incMax * | 695 newctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(newctxt->incMax * |
694 sizeof(newctxt->incTab[0])); | 696 sizeof(newctxt->incTab[0])); |
695 if (newctxt->incTab == NULL) { | 697 if (newctxt->incTab == NULL) { |
696 xmlXIncludeErrMemory(ctxt, (xmlNodePtr) doc, "processing doc"); | 698 xmlXIncludeErrMemory(ctxt, (xmlNodePtr) doc, "processing doc"); |
697 xmlFree(newctxt); | 699 xmlFree(newctxt); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 #ifdef DEBUG_XINCLUDE | 744 #ifdef DEBUG_XINCLUDE |
743 xmlGenericError(xmlGenericErrorContext, "Done recursing in doc %s\n", url); | 745 xmlGenericError(xmlGenericErrorContext, "Done recursing in doc %s\n", url); |
744 #endif | 746 #endif |
745 } | 747 } |
746 | 748 |
747 /** | 749 /** |
748 * xmlXIncludeAddTxt: | 750 * xmlXIncludeAddTxt: |
749 * @ctxt: the XInclude context | 751 * @ctxt: the XInclude context |
750 * @txt: the new text node | 752 * @txt: the new text node |
751 * @url: the associated URL | 753 * @url: the associated URL |
752 * | 754 * |
753 * Add a new txtument to the list | 755 * Add a new txtument to the list |
754 */ | 756 */ |
755 static void | 757 static void |
756 xmlXIncludeAddTxt(xmlXIncludeCtxtPtr ctxt, xmlNodePtr txt, const xmlURL url) { | 758 xmlXIncludeAddTxt(xmlXIncludeCtxtPtr ctxt, xmlNodePtr txt, const xmlURL url) { |
757 #ifdef DEBUG_XINCLUDE | 759 #ifdef DEBUG_XINCLUDE |
758 xmlGenericError(xmlGenericErrorContext, "Adding text %s\n", url); | 760 xmlGenericError(xmlGenericErrorContext, "Adding text %s\n", url); |
759 #endif | 761 #endif |
760 if (ctxt->txtMax == 0) { | 762 if (ctxt->txtMax == 0) { |
761 ctxt->txtMax = 4; | 763 ctxt->txtMax = 4; |
762 ctxt->txtTab = (xmlNodePtr *) xmlMalloc(ctxt->txtMax * | 764 ctxt->txtTab = (xmlNodePtr *) xmlMalloc(ctxt->txtMax * |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 static xmlNodePtr | 803 static xmlNodePtr |
802 xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, | 804 xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, |
803 xmlDocPtr source, xmlNodePtr elem); | 805 xmlDocPtr source, xmlNodePtr elem); |
804 | 806 |
805 /** | 807 /** |
806 * xmlXIncludeCopyNode: | 808 * xmlXIncludeCopyNode: |
807 * @ctxt: the XInclude context | 809 * @ctxt: the XInclude context |
808 * @target: the document target | 810 * @target: the document target |
809 * @source: the document source | 811 * @source: the document source |
810 * @elem: the element | 812 * @elem: the element |
811 * | 813 * |
812 * Make a copy of the node while preserving the XInclude semantic | 814 * Make a copy of the node while preserving the XInclude semantic |
813 * of the Infoset copy | 815 * of the Infoset copy |
814 */ | 816 */ |
815 static xmlNodePtr | 817 static xmlNodePtr |
816 xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, | 818 xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, |
817 xmlDocPtr source, xmlNodePtr elem) { | 819 xmlDocPtr source, xmlNodePtr elem) { |
818 xmlNodePtr result = NULL; | 820 xmlNodePtr result = NULL; |
819 | 821 |
820 if ((ctxt == NULL) || (target == NULL) || (source == NULL) || | 822 if ((ctxt == NULL) || (target == NULL) || (source == NULL) || |
821 (elem == NULL)) | 823 (elem == NULL)) |
822 return(NULL); | 824 return(NULL); |
823 if (elem->type == XML_DTD_NODE) | 825 if (elem->type == XML_DTD_NODE) |
824 return(NULL); | 826 return(NULL); |
825 if (elem->type == XML_DOCUMENT_NODE) | 827 if (elem->type == XML_DOCUMENT_NODE) |
826 result = xmlXIncludeCopyNodeList(ctxt, target, source, elem->children); | 828 result = xmlXIncludeCopyNodeList(ctxt, target, source, elem->children); |
827 else | 829 else |
828 result = xmlDocCopyNode(elem, target, 1); | 830 result = xmlDocCopyNode(elem, target, 1); |
829 return(result); | 831 return(result); |
830 } | 832 } |
831 | 833 |
832 /** | 834 /** |
833 * xmlXIncludeCopyNodeList: | 835 * xmlXIncludeCopyNodeList: |
834 * @ctxt: the XInclude context | 836 * @ctxt: the XInclude context |
835 * @target: the document target | 837 * @target: the document target |
836 * @source: the document source | 838 * @source: the document source |
837 * @elem: the element list | 839 * @elem: the element list |
838 * | 840 * |
839 * Make a copy of the node list while preserving the XInclude semantic | 841 * Make a copy of the node list while preserving the XInclude semantic |
840 * of the Infoset copy | 842 * of the Infoset copy |
841 */ | 843 */ |
842 static xmlNodePtr | 844 static xmlNodePtr |
843 xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, | 845 xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, |
844 xmlDocPtr source, xmlNodePtr elem) { | 846 xmlDocPtr source, xmlNodePtr elem) { |
845 xmlNodePtr cur, res, result = NULL, last = NULL; | 847 xmlNodePtr cur, res, result = NULL, last = NULL; |
846 | 848 |
847 if ((ctxt == NULL) || (target == NULL) || (source == NULL) || | 849 if ((ctxt == NULL) || (target == NULL) || (source == NULL) || |
848 (elem == NULL)) | 850 (elem == NULL)) |
(...skipping 18 matching lines...) Expand all Loading... |
867 /** | 869 /** |
868 * xmlXIncludeGetNthChild: | 870 * xmlXIncludeGetNthChild: |
869 * @cur: the node | 871 * @cur: the node |
870 * @no: the child number | 872 * @no: the child number |
871 * | 873 * |
872 * Returns the @n'th element child of @cur or NULL | 874 * Returns the @n'th element child of @cur or NULL |
873 */ | 875 */ |
874 static xmlNodePtr | 876 static xmlNodePtr |
875 xmlXIncludeGetNthChild(xmlNodePtr cur, int no) { | 877 xmlXIncludeGetNthChild(xmlNodePtr cur, int no) { |
876 int i; | 878 int i; |
877 if (cur == NULL) | 879 if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) |
878 » return(cur); | 880 return(NULL); |
879 cur = cur->children; | 881 cur = cur->children; |
880 for (i = 0;i <= no;cur = cur->next) { | 882 for (i = 0;i <= no;cur = cur->next) { |
881 » if (cur == NULL) | 883 » if (cur == NULL) |
882 return(cur); | 884 return(cur); |
883 if ((cur->type == XML_ELEMENT_NODE) || | 885 if ((cur->type == XML_ELEMENT_NODE) || |
884 (cur->type == XML_DOCUMENT_NODE) || | 886 (cur->type == XML_DOCUMENT_NODE) || |
885 (cur->type == XML_HTML_DOCUMENT_NODE)) { | 887 (cur->type == XML_HTML_DOCUMENT_NODE)) { |
886 i++; | 888 i++; |
887 if (i == no) | 889 if (i == no) |
888 break; | 890 break; |
889 } | 891 } |
890 } | 892 } |
891 return(cur); | 893 return(cur); |
(...skipping 23 matching lines...) Expand all Loading... |
915 int index1, index2; | 917 int index1, index2; |
916 int level = 0, lastLevel = 0, endLevel = 0, endFlag = 0; | 918 int level = 0, lastLevel = 0, endLevel = 0, endFlag = 0; |
917 | 919 |
918 if ((ctxt == NULL) || (target == NULL) || (source == NULL) || | 920 if ((ctxt == NULL) || (target == NULL) || (source == NULL) || |
919 (range == NULL)) | 921 (range == NULL)) |
920 return(NULL); | 922 return(NULL); |
921 if (range->type != XPATH_RANGE) | 923 if (range->type != XPATH_RANGE) |
922 return(NULL); | 924 return(NULL); |
923 start = (xmlNodePtr) range->user; | 925 start = (xmlNodePtr) range->user; |
924 | 926 |
925 if (start == NULL) | 927 if ((start == NULL) || (start->type == XML_NAMESPACE_DECL)) |
926 return(NULL); | 928 return(NULL); |
927 end = range->user2; | 929 end = range->user2; |
928 if (end == NULL) | 930 if (end == NULL) |
929 return(xmlDocCopyNode(start, target, 1)); | 931 return(xmlDocCopyNode(start, target, 1)); |
| 932 if (end->type == XML_NAMESPACE_DECL) |
| 933 return(NULL); |
930 | 934 |
931 cur = start; | 935 cur = start; |
932 index1 = range->index; | 936 index1 = range->index; |
933 index2 = range->index2; | 937 index2 = range->index2; |
934 /* | 938 /* |
935 * level is depth of the current node under consideration | 939 * level is depth of the current node under consideration |
936 * list is the pointer to the root of the output tree | 940 * list is the pointer to the root of the output tree |
937 * listParent is a pointer to the parent of output tree (within | 941 * listParent is a pointer to the parent of output tree (within |
938 the included file) in case we need to add another level | 942 the included file) in case we need to add another level |
939 * last is a pointer to the last node added to the output tree | 943 * last is a pointer to the last node added to the output tree |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
978 len = index2; | 982 len = index2; |
979 } | 983 } |
980 tmp = xmlNewTextLen(content, len); | 984 tmp = xmlNewTextLen(content, len); |
981 } | 985 } |
982 /* single sub text node selection */ | 986 /* single sub text node selection */ |
983 if (list == NULL) | 987 if (list == NULL) |
984 return(tmp); | 988 return(tmp); |
985 /* prune and return full set */ | 989 /* prune and return full set */ |
986 if (level == lastLevel) | 990 if (level == lastLevel) |
987 xmlAddNextSibling(last, tmp); | 991 xmlAddNextSibling(last, tmp); |
988 » » else | 992 » » else |
989 xmlAddChild(last, tmp); | 993 xmlAddChild(last, tmp); |
990 return(list); | 994 return(list); |
991 } else { /* ending node not a text node */ | 995 } else { /* ending node not a text node */ |
992 endLevel = level; /* remember the level of the end node */ | 996 endLevel = level; /* remember the level of the end node */ |
993 endFlag = 1; | 997 endFlag = 1; |
994 /* last node - need to take care of properties + namespaces */ | 998 /* last node - need to take care of properties + namespaces */ |
995 tmp = xmlDocCopyNode(cur, target, 2); | 999 tmp = xmlDocCopyNode(cur, target, 2); |
996 if (list == NULL) { | 1000 if (list == NULL) { |
997 list = tmp; | 1001 list = tmp; |
998 listParent = cur->parent; | 1002 listParent = cur->parent; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1197 else { | 1201 else { |
1198 xmlAddNextSibling(last, | 1202 xmlAddNextSibling(last, |
1199 xmlXIncludeCopyNode(ctxt, target, source, | 1203 xmlXIncludeCopyNode(ctxt, target, source, |
1200 set->nodeTab[i])); | 1204 set->nodeTab[i])); |
1201 if (last->next != NULL) | 1205 if (last->next != NULL) |
1202 last = last->next; | 1206 last = last->next; |
1203 } | 1207 } |
1204 } | 1208 } |
1205 break; | 1209 break; |
1206 } | 1210 } |
| 1211 #ifdef LIBXML_XPTR_ENABLED |
1207 case XPATH_LOCATIONSET: { | 1212 case XPATH_LOCATIONSET: { |
1208 xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user; | 1213 xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user; |
1209 if (set == NULL) | 1214 if (set == NULL) |
1210 return(NULL); | 1215 return(NULL); |
1211 for (i = 0;i < set->locNr;i++) { | 1216 for (i = 0;i < set->locNr;i++) { |
1212 if (last == NULL) | 1217 if (last == NULL) |
1213 list = last = xmlXIncludeCopyXPointer(ctxt, target, source, | 1218 list = last = xmlXIncludeCopyXPointer(ctxt, target, source, |
1214 set->locTab[i]); | 1219 set->locTab[i]); |
1215 else | 1220 else |
1216 xmlAddNextSibling(last, | 1221 xmlAddNextSibling(last, |
1217 xmlXIncludeCopyXPointer(ctxt, target, source, | 1222 xmlXIncludeCopyXPointer(ctxt, target, source, |
1218 set->locTab[i])); | 1223 set->locTab[i])); |
1219 if (last != NULL) { | 1224 if (last != NULL) { |
1220 while (last->next != NULL) | 1225 while (last->next != NULL) |
1221 last = last->next; | 1226 last = last->next; |
1222 } | 1227 } |
1223 } | 1228 } |
1224 break; | 1229 break; |
1225 } | 1230 } |
1226 #ifdef LIBXML_XPTR_ENABLED | |
1227 case XPATH_RANGE: | 1231 case XPATH_RANGE: |
1228 return(xmlXIncludeCopyRange(ctxt, target, source, obj)); | 1232 return(xmlXIncludeCopyRange(ctxt, target, source, obj)); |
1229 #endif | 1233 #endif |
1230 case XPATH_POINT: | 1234 case XPATH_POINT: |
1231 /* points are ignored in XInclude */ | 1235 /* points are ignored in XInclude */ |
1232 break; | 1236 break; |
1233 default: | 1237 default: |
1234 break; | 1238 break; |
1235 } | 1239 } |
1236 return(list); | 1240 return(list); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1282 ret = xmlAddDocEntity(doc, ent->name, ent->etype, ent->ExternalID, | 1286 ret = xmlAddDocEntity(doc, ent->name, ent->etype, ent->ExternalID, |
1283 ent->SystemID, ent->content); | 1287 ent->SystemID, ent->content); |
1284 if (ret != NULL) { | 1288 if (ret != NULL) { |
1285 if (ent->URI != NULL) | 1289 if (ent->URI != NULL) |
1286 ret->URI = xmlStrdup(ent->URI); | 1290 ret->URI = xmlStrdup(ent->URI); |
1287 } else { | 1291 } else { |
1288 prev = xmlGetDocEntity(doc, ent->name); | 1292 prev = xmlGetDocEntity(doc, ent->name); |
1289 if (prev != NULL) { | 1293 if (prev != NULL) { |
1290 if (ent->etype != prev->etype) | 1294 if (ent->etype != prev->etype) |
1291 goto error; | 1295 goto error; |
1292 » | 1296 |
1293 if ((ent->SystemID != NULL) && (prev->SystemID != NULL)) { | 1297 if ((ent->SystemID != NULL) && (prev->SystemID != NULL)) { |
1294 if (!xmlStrEqual(ent->SystemID, prev->SystemID)) | 1298 if (!xmlStrEqual(ent->SystemID, prev->SystemID)) |
1295 goto error; | 1299 goto error; |
1296 } else if ((ent->ExternalID != NULL) && | 1300 } else if ((ent->ExternalID != NULL) && |
1297 (prev->ExternalID != NULL)) { | 1301 (prev->ExternalID != NULL)) { |
1298 if (!xmlStrEqual(ent->ExternalID, prev->ExternalID)) | 1302 if (!xmlStrEqual(ent->ExternalID, prev->ExternalID)) |
1299 goto error; | 1303 goto error; |
1300 } else if ((ent->content != NULL) && (prev->content != NULL)) { | 1304 } else if ((ent->content != NULL) && (prev->content != NULL)) { |
1301 if (!xmlStrEqual(ent->content, prev->content)) | 1305 if (!xmlStrEqual(ent->content, prev->content)) |
1302 goto error; | 1306 goto error; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1382 } | 1386 } |
1383 } | 1387 } |
1384 return(0); | 1388 return(0); |
1385 } | 1389 } |
1386 | 1390 |
1387 /** | 1391 /** |
1388 * xmlXIncludeLoadDoc: | 1392 * xmlXIncludeLoadDoc: |
1389 * @ctxt: the XInclude context | 1393 * @ctxt: the XInclude context |
1390 * @url: the associated URL | 1394 * @url: the associated URL |
1391 * @nr: the xinclude node number | 1395 * @nr: the xinclude node number |
1392 * | 1396 * |
1393 * Load the document, and store the result in the XInclude context | 1397 * Load the document, and store the result in the XInclude context |
1394 * | 1398 * |
1395 * Returns 0 in case of success, -1 in case of failure | 1399 * Returns 0 in case of success, -1 in case of failure |
1396 */ | 1400 */ |
1397 static int | 1401 static int |
1398 xmlXIncludeLoadDoc(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { | 1402 xmlXIncludeLoadDoc(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { |
1399 xmlDocPtr doc; | 1403 xmlDocPtr doc; |
1400 xmlURIPtr uri; | 1404 xmlURIPtr uri; |
1401 xmlChar *URL; | 1405 xmlChar *URL; |
1402 xmlChar *fragment = NULL; | 1406 xmlChar *fragment = NULL; |
1403 int i = 0; | 1407 int i = 0; |
1404 #ifdef LIBXML_XPTR_ENABLED | 1408 #ifdef LIBXML_XPTR_ENABLED |
1405 int saveFlags; | 1409 int saveFlags; |
1406 #endif | 1410 #endif |
1407 | 1411 |
1408 #ifdef DEBUG_XINCLUDE | 1412 #ifdef DEBUG_XINCLUDE |
1409 xmlGenericError(xmlGenericErrorContext, "Loading doc %s:%d\n", url, nr); | 1413 xmlGenericError(xmlGenericErrorContext, "Loading doc %s:%d\n", url, nr); |
1410 #endif | 1414 #endif |
1411 /* | 1415 /* |
1412 * Check the URL and remove any fragment identifier | 1416 * Check the URL and remove any fragment identifier |
1413 */ | 1417 */ |
1414 uri = xmlParseURI((const char *)url); | 1418 uri = xmlParseURI((const char *)url); |
1415 if (uri == NULL) { | 1419 if (uri == NULL) { |
1416 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1420 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1417 XML_XINCLUDE_HREF_URI, | 1421 XML_XINCLUDE_HREF_URI, |
1418 "invalid value URI %s\n", url); | 1422 "invalid value URI %s\n", url); |
1419 return(-1); | 1423 return(-1); |
1420 } | 1424 } |
1421 if (uri->fragment != NULL) { | 1425 if (uri->fragment != NULL) { |
1422 fragment = (xmlChar *) uri->fragment; | 1426 fragment = (xmlChar *) uri->fragment; |
1423 uri->fragment = NULL; | 1427 uri->fragment = NULL; |
1424 } | 1428 } |
1425 if ((ctxt->incTab != NULL) && (ctxt->incTab[nr] != NULL) && | 1429 if ((ctxt->incTab != NULL) && (ctxt->incTab[nr] != NULL) && |
1426 (ctxt->incTab[nr]->fragment != NULL)) { | 1430 (ctxt->incTab[nr]->fragment != NULL)) { |
1427 if (fragment != NULL) xmlFree(fragment); | 1431 if (fragment != NULL) xmlFree(fragment); |
1428 fragment = xmlStrdup(ctxt->incTab[nr]->fragment); | 1432 fragment = xmlStrdup(ctxt->incTab[nr]->fragment); |
1429 } | 1433 } |
1430 URL = xmlSaveUri(uri); | 1434 URL = xmlSaveUri(uri); |
1431 xmlFreeURI(uri); | 1435 xmlFreeURI(uri); |
1432 if (URL == NULL) { | 1436 if (URL == NULL) { |
1433 if (ctxt->incTab != NULL) | 1437 if (ctxt->incTab != NULL) |
1434 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1438 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1435 XML_XINCLUDE_HREF_URI, | 1439 XML_XINCLUDE_HREF_URI, |
1436 "invalid value URI %s\n", url); | 1440 "invalid value URI %s\n", url); |
1437 else | 1441 else |
1438 xmlXIncludeErr(ctxt, NULL, | 1442 xmlXIncludeErr(ctxt, NULL, |
1439 XML_XINCLUDE_HREF_URI, | 1443 XML_XINCLUDE_HREF_URI, |
1440 "invalid value URI %s\n", url); | 1444 "invalid value URI %s\n", url); |
1441 if (fragment != NULL) | 1445 if (fragment != NULL) |
1442 xmlFree(fragment); | 1446 xmlFree(fragment); |
1443 return(-1); | 1447 return(-1); |
1444 } | 1448 } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1543 */ | 1547 */ |
1544 if (doc == NULL) | 1548 if (doc == NULL) |
1545 { | 1549 { |
1546 /* Hopefully a DTD declaration won't be copied from | 1550 /* Hopefully a DTD declaration won't be copied from |
1547 * the same document */ | 1551 * the same document */ |
1548 ctxt->incTab[nr]->inc = xmlCopyNodeList(ctxt->doc->children); | 1552 ctxt->incTab[nr]->inc = xmlCopyNodeList(ctxt->doc->children); |
1549 } else { | 1553 } else { |
1550 ctxt->incTab[nr]->inc = xmlXIncludeCopyNodeList(ctxt, ctxt->doc, | 1554 ctxt->incTab[nr]->inc = xmlXIncludeCopyNodeList(ctxt, ctxt->doc, |
1551 doc, doc->children); | 1555 doc, doc->children); |
1552 } | 1556 } |
1553 } | 1557 } |
1554 #ifdef LIBXML_XPTR_ENABLED | 1558 #ifdef LIBXML_XPTR_ENABLED |
1555 else { | 1559 else { |
1556 /* | 1560 /* |
1557 * Computes the XPointer expression and make a copy used | 1561 * Computes the XPointer expression and make a copy used |
1558 * as the replacement copy. | 1562 * as the replacement copy. |
1559 */ | 1563 */ |
1560 xmlXPathObjectPtr xptr; | 1564 xmlXPathObjectPtr xptr; |
1561 xmlXPathContextPtr xptrctxt; | 1565 xmlXPathContextPtr xptrctxt; |
1562 xmlNodeSetPtr set; | 1566 xmlNodeSetPtr set; |
1563 | 1567 |
1564 if (doc == NULL) { | 1568 if (doc == NULL) { |
1565 xptrctxt = xmlXPtrNewContext(ctxt->doc, ctxt->incTab[nr]->ref, | 1569 xptrctxt = xmlXPtrNewContext(ctxt->doc, ctxt->incTab[nr]->ref, |
1566 NULL); | 1570 NULL); |
1567 } else { | 1571 } else { |
1568 xptrctxt = xmlXPtrNewContext(doc, NULL, NULL); | 1572 xptrctxt = xmlXPtrNewContext(doc, NULL, NULL); |
1569 } | 1573 } |
1570 if (xptrctxt == NULL) { | 1574 if (xptrctxt == NULL) { |
1571 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1575 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1572 XML_XINCLUDE_XPTR_FAILED, | 1576 XML_XINCLUDE_XPTR_FAILED, |
1573 "could not create XPointer context\n", NULL); | 1577 "could not create XPointer context\n", NULL); |
1574 xmlFree(URL); | 1578 xmlFree(URL); |
1575 xmlFree(fragment); | 1579 xmlFree(fragment); |
1576 return(-1); | 1580 return(-1); |
1577 } | 1581 } |
1578 xptr = xmlXPtrEval(fragment, xptrctxt); | 1582 xptr = xmlXPtrEval(fragment, xptrctxt); |
1579 if (xptr == NULL) { | 1583 if (xptr == NULL) { |
1580 xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1584 xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1581 XML_XINCLUDE_XPTR_FAILED, | 1585 XML_XINCLUDE_XPTR_FAILED, |
1582 "XPointer evaluation failed: #%s\n", | 1586 "XPointer evaluation failed: #%s\n", |
1583 fragment); | 1587 fragment); |
1584 xmlXPathFreeContext(xptrctxt); | 1588 xmlXPathFreeContext(xptrctxt); |
1585 xmlFree(URL); | 1589 xmlFree(URL); |
1586 xmlFree(fragment); | 1590 xmlFree(fragment); |
1587 return(-1); | 1591 return(-1); |
1588 } | 1592 } |
1589 switch (xptr->type) { | 1593 switch (xptr->type) { |
1590 case XPATH_UNDEFINED: | 1594 case XPATH_UNDEFINED: |
1591 case XPATH_BOOLEAN: | 1595 case XPATH_BOOLEAN: |
1592 case XPATH_NUMBER: | 1596 case XPATH_NUMBER: |
1593 case XPATH_STRING: | 1597 case XPATH_STRING: |
1594 case XPATH_POINT: | 1598 case XPATH_POINT: |
1595 case XPATH_USERS: | 1599 case XPATH_USERS: |
1596 case XPATH_XSLT_TREE: | 1600 case XPATH_XSLT_TREE: |
1597 » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1601 » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1598 XML_XINCLUDE_XPTR_RESULT, | 1602 XML_XINCLUDE_XPTR_RESULT, |
1599 "XPointer is not a range: #%s\n", | 1603 "XPointer is not a range: #%s\n", |
1600 fragment); | 1604 fragment); |
1601 xmlXPathFreeContext(xptrctxt); | 1605 xmlXPathFreeContext(xptrctxt); |
1602 xmlFree(URL); | 1606 xmlFree(URL); |
1603 xmlFree(fragment); | 1607 xmlFree(fragment); |
1604 return(-1); | 1608 return(-1); |
1605 case XPATH_NODESET: | 1609 case XPATH_NODESET: |
1606 if ((xptr->nodesetval == NULL) || | 1610 if ((xptr->nodesetval == NULL) || |
1607 (xptr->nodesetval->nodeNr <= 0)) { | 1611 (xptr->nodesetval->nodeNr <= 0)) { |
(...skipping 21 matching lines...) Expand all Loading... |
1629 case XML_PI_NODE: | 1633 case XML_PI_NODE: |
1630 case XML_COMMENT_NODE: | 1634 case XML_COMMENT_NODE: |
1631 case XML_DOCUMENT_NODE: | 1635 case XML_DOCUMENT_NODE: |
1632 case XML_HTML_DOCUMENT_NODE: | 1636 case XML_HTML_DOCUMENT_NODE: |
1633 #ifdef LIBXML_DOCB_ENABLED | 1637 #ifdef LIBXML_DOCB_ENABLED |
1634 case XML_DOCB_DOCUMENT_NODE: | 1638 case XML_DOCB_DOCUMENT_NODE: |
1635 #endif | 1639 #endif |
1636 continue; | 1640 continue; |
1637 | 1641 |
1638 case XML_ATTRIBUTE_NODE: | 1642 case XML_ATTRIBUTE_NODE: |
1639 » » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1643 » » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1640 XML_XINCLUDE_XPTR_RESULT, | 1644 XML_XINCLUDE_XPTR_RESULT, |
1641 "XPointer selects an attribute: #%s\n", | 1645 "XPointer selects an attribute: #%s\n", |
1642 fragment); | 1646 fragment); |
1643 set->nodeTab[i] = NULL; | 1647 set->nodeTab[i] = NULL; |
1644 continue; | 1648 continue; |
1645 case XML_NAMESPACE_DECL: | 1649 case XML_NAMESPACE_DECL: |
1646 » » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1650 » » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1647 XML_XINCLUDE_XPTR_RESULT, | 1651 XML_XINCLUDE_XPTR_RESULT, |
1648 "XPointer selects a namespace: #%s\n", | 1652 "XPointer selects a namespace: #%s\n", |
1649 fragment); | 1653 fragment); |
1650 set->nodeTab[i] = NULL; | 1654 set->nodeTab[i] = NULL; |
1651 continue; | 1655 continue; |
1652 case XML_DOCUMENT_TYPE_NODE: | 1656 case XML_DOCUMENT_TYPE_NODE: |
1653 case XML_DOCUMENT_FRAG_NODE: | 1657 case XML_DOCUMENT_FRAG_NODE: |
1654 case XML_NOTATION_NODE: | 1658 case XML_NOTATION_NODE: |
1655 case XML_DTD_NODE: | 1659 case XML_DTD_NODE: |
1656 case XML_ELEMENT_DECL: | 1660 case XML_ELEMENT_DECL: |
1657 case XML_ATTRIBUTE_DECL: | 1661 case XML_ATTRIBUTE_DECL: |
1658 case XML_ENTITY_DECL: | 1662 case XML_ENTITY_DECL: |
1659 case XML_XINCLUDE_START: | 1663 case XML_XINCLUDE_START: |
1660 case XML_XINCLUDE_END: | 1664 case XML_XINCLUDE_END: |
1661 » » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1665 » » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1662 XML_XINCLUDE_XPTR_RESULT, | 1666 XML_XINCLUDE_XPTR_RESULT, |
1663 "XPointer selects unexpected nodes: #%s\n", | 1667 "XPointer selects unexpected nodes: #%s\n", |
1664 fragment); | 1668 fragment); |
1665 set->nodeTab[i] = NULL; | 1669 set->nodeTab[i] = NULL; |
1666 set->nodeTab[i] = NULL; | 1670 set->nodeTab[i] = NULL; |
1667 continue; /* for */ | 1671 continue; /* for */ |
1668 } | 1672 } |
1669 } | 1673 } |
1670 } | 1674 } |
1671 if (doc == NULL) { | 1675 if (doc == NULL) { |
1672 ctxt->incTab[nr]->xptr = xptr; | 1676 ctxt->incTab[nr]->xptr = xptr; |
1673 ctxt->incTab[nr]->inc = NULL; | 1677 ctxt->incTab[nr]->inc = NULL; |
1674 } else { | 1678 } else { |
1675 ctxt->incTab[nr]->inc = | 1679 ctxt->incTab[nr]->inc = |
1676 xmlXIncludeCopyXPointer(ctxt, ctxt->doc, doc, xptr); | 1680 xmlXIncludeCopyXPointer(ctxt, ctxt->doc, doc, xptr); |
1677 xmlXPathFreeObject(xptr); | 1681 xmlXPathFreeObject(xptr); |
1678 } | 1682 } |
1679 xmlXPathFreeContext(xptrctxt); | 1683 xmlXPathFreeContext(xptrctxt); |
1680 xmlFree(fragment); | 1684 xmlFree(fragment); |
1681 } | 1685 } |
1682 #endif | 1686 #endif |
1683 | 1687 |
1684 /* | 1688 /* |
1685 * Do the xml:base fixup if needed | 1689 * Do the xml:base fixup if needed |
1686 */ | 1690 */ |
1687 if ((doc != NULL) && (URL != NULL) && (xmlStrchr(URL, (xmlChar) '/')) && | 1691 if ((doc != NULL) && (URL != NULL) && |
1688 (!(ctxt->parseFlags & XML_PARSE_NOBASEFIX)) && | 1692 (!(ctxt->parseFlags & XML_PARSE_NOBASEFIX)) && |
1689 (!(doc->parseFlags & XML_PARSE_NOBASEFIX))) { | 1693 (!(doc->parseFlags & XML_PARSE_NOBASEFIX))) { |
1690 xmlNodePtr node; | 1694 xmlNodePtr node; |
1691 xmlChar *base; | 1695 xmlChar *base; |
1692 xmlChar *curBase; | 1696 xmlChar *curBase; |
1693 | 1697 |
1694 /* | 1698 /* |
1695 * The base is only adjusted if "necessary", i.e. if the xinclude node | 1699 * The base is only adjusted if "necessary", i.e. if the xinclude node |
1696 * has a base specified, or the URL is relative | 1700 * has a base specified, or the URL is relative |
1697 */ | 1701 */ |
1698 base = xmlGetNsProp(ctxt->incTab[nr]->ref, BAD_CAST "base", | 1702 base = xmlGetNsProp(ctxt->incTab[nr]->ref, BAD_CAST "base", |
1699 XML_XML_NAMESPACE); | 1703 XML_XML_NAMESPACE); |
1700 if (base == NULL) { | 1704 if (base == NULL) { |
1701 /* | 1705 /* |
1702 * No xml:base on the xinclude node, so we check whether the | 1706 * No xml:base on the xinclude node, so we check whether the |
1703 * URI base is different than (relative to) the context base | 1707 * URI base is different than (relative to) the context base |
1704 */ | 1708 */ |
1705 curBase = xmlBuildRelativeURI(URL, ctxt->base); | 1709 curBase = xmlBuildRelativeURI(URL, ctxt->base); |
1706 if (curBase == NULL) { /* Error return */ | 1710 if (curBase == NULL) { /* Error return */ |
1707 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1711 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1708 XML_XINCLUDE_HREF_URI, | 1712 XML_XINCLUDE_HREF_URI, |
1709 "trying to build relative URI from %s\n", URL); | 1713 "trying to build relative URI from %s\n", URL); |
1710 } else { | 1714 } else { |
1711 /* If the URI doesn't contain a slash, it's not relative */ | 1715 /* If the URI doesn't contain a slash, it's not relative */ |
1712 if (!xmlStrchr(curBase, (xmlChar) '/')) | 1716 if (!xmlStrchr(curBase, (xmlChar) '/')) |
1713 xmlFree(curBase); | 1717 xmlFree(curBase); |
1714 else | 1718 else |
1715 base = curBase; | 1719 base = curBase; |
1716 } | 1720 } |
1717 } | 1721 } |
(...skipping 20 matching lines...) Expand all Loading... |
1738 * set, then relativise it if necessary | 1742 * set, then relativise it if necessary |
1739 */ | 1743 */ |
1740 xmlChar *xmlBase; | 1744 xmlChar *xmlBase; |
1741 xmlBase = xmlGetNsProp(node, | 1745 xmlBase = xmlGetNsProp(node, |
1742 BAD_CAST "base", | 1746 BAD_CAST "base", |
1743 XML_XML_NAMESPACE); | 1747 XML_XML_NAMESPACE); |
1744 if (xmlBase != NULL) { | 1748 if (xmlBase != NULL) { |
1745 xmlChar *relBase; | 1749 xmlChar *relBase; |
1746 relBase = xmlBuildURI(xmlBase, base); | 1750 relBase = xmlBuildURI(xmlBase, base); |
1747 if (relBase == NULL) { /* error */ | 1751 if (relBase == NULL) { /* error */ |
1748 » » » » xmlXIncludeErr(ctxt, | 1752 » » » » xmlXIncludeErr(ctxt, |
1749 ctxt->incTab[nr]->ref, | 1753 ctxt->incTab[nr]->ref, |
1750 XML_XINCLUDE_HREF_URI, | 1754 XML_XINCLUDE_HREF_URI, |
1751 "trying to rebuild base from %s\n", | 1755 "trying to rebuild base from %s\n", |
1752 xmlBase); | 1756 xmlBase); |
1753 } else { | 1757 } else { |
1754 xmlNodeSetBase(node, relBase); | 1758 xmlNodeSetBase(node, relBase); |
1755 xmlFree(relBase); | 1759 xmlFree(relBase); |
1756 } | 1760 } |
1757 xmlFree(xmlBase); | 1761 xmlFree(xmlBase); |
1758 } | 1762 } |
(...skipping 16 matching lines...) Expand all Loading... |
1775 } | 1779 } |
1776 xmlFree(URL); | 1780 xmlFree(URL); |
1777 return(0); | 1781 return(0); |
1778 } | 1782 } |
1779 | 1783 |
1780 /** | 1784 /** |
1781 * xmlXIncludeLoadTxt: | 1785 * xmlXIncludeLoadTxt: |
1782 * @ctxt: the XInclude context | 1786 * @ctxt: the XInclude context |
1783 * @url: the associated URL | 1787 * @url: the associated URL |
1784 * @nr: the xinclude node number | 1788 * @nr: the xinclude node number |
1785 * | 1789 * |
1786 * Load the content, and store the result in the XInclude context | 1790 * Load the content, and store the result in the XInclude context |
1787 * | 1791 * |
1788 * Returns 0 in case of success, -1 in case of failure | 1792 * Returns 0 in case of success, -1 in case of failure |
1789 */ | 1793 */ |
1790 static int | 1794 static int |
1791 xmlXIncludeLoadTxt(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { | 1795 xmlXIncludeLoadTxt(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { |
1792 xmlParserInputBufferPtr buf; | 1796 xmlParserInputBufferPtr buf; |
1793 xmlNodePtr node; | 1797 xmlNodePtr node; |
1794 xmlURIPtr uri; | 1798 xmlURIPtr uri; |
1795 xmlChar *URL; | 1799 xmlChar *URL; |
1796 int i; | 1800 int i; |
1797 xmlChar *encoding = NULL; | 1801 xmlChar *encoding = NULL; |
1798 xmlCharEncoding enc = (xmlCharEncoding) 0; | 1802 xmlCharEncoding enc = (xmlCharEncoding) 0; |
| 1803 xmlParserCtxtPtr pctxt; |
| 1804 xmlParserInputPtr inputStream; |
| 1805 int xinclude_multibyte_fallback_used = 0; |
1799 | 1806 |
1800 /* | 1807 /* |
1801 * Check the URL and remove any fragment identifier | 1808 * Check the URL and remove any fragment identifier |
1802 */ | 1809 */ |
1803 uri = xmlParseURI((const char *)url); | 1810 uri = xmlParseURI((const char *)url); |
1804 if (uri == NULL) { | 1811 if (uri == NULL) { |
1805 xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, | 1812 xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, |
1806 "invalid value URI %s\n", url); | 1813 "invalid value URI %s\n", url); |
1807 return(-1); | 1814 return(-1); |
1808 } | 1815 } |
(...skipping 10 matching lines...) Expand all Loading... |
1819 xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, | 1826 xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, |
1820 "invalid value URI %s\n", url); | 1827 "invalid value URI %s\n", url); |
1821 return(-1); | 1828 return(-1); |
1822 } | 1829 } |
1823 | 1830 |
1824 /* | 1831 /* |
1825 * Handling of references to the local document are done | 1832 * Handling of references to the local document are done |
1826 * directly through ctxt->doc. | 1833 * directly through ctxt->doc. |
1827 */ | 1834 */ |
1828 if (URL[0] == 0) { | 1835 if (URL[0] == 0) { |
1829 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1836 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
1830 XML_XINCLUDE_TEXT_DOCUMENT, | 1837 XML_XINCLUDE_TEXT_DOCUMENT, |
1831 "text serialization of document not available\n", NULL); | 1838 "text serialization of document not available\n", NULL); |
1832 xmlFree(URL); | 1839 xmlFree(URL); |
1833 return(-1); | 1840 return(-1); |
1834 } | 1841 } |
1835 | 1842 |
1836 /* | 1843 /* |
1837 * Prevent reloading twice the document. | 1844 * Prevent reloading twice the document. |
1838 */ | 1845 */ |
1839 for (i = 0; i < ctxt->txtNr; i++) { | 1846 for (i = 0; i < ctxt->txtNr; i++) { |
(...skipping 23 matching lines...) Expand all Loading... |
1863 xmlFree(encoding); | 1870 xmlFree(encoding); |
1864 xmlFree(URL); | 1871 xmlFree(URL); |
1865 return(-1); | 1872 return(-1); |
1866 } | 1873 } |
1867 xmlFree(encoding); | 1874 xmlFree(encoding); |
1868 } | 1875 } |
1869 | 1876 |
1870 /* | 1877 /* |
1871 * Load it. | 1878 * Load it. |
1872 */ | 1879 */ |
1873 buf = xmlParserInputBufferCreateFilename((const char *)URL, enc); | 1880 pctxt = xmlNewParserCtxt(); |
1874 if (buf == NULL) { | 1881 inputStream = xmlLoadExternalEntity((const char*)URL, NULL, pctxt); |
| 1882 if(inputStream == NULL) { |
| 1883 » xmlFreeParserCtxt(pctxt); |
1875 xmlFree(URL); | 1884 xmlFree(URL); |
1876 return(-1); | 1885 return(-1); |
1877 } | 1886 } |
| 1887 buf = inputStream->buf; |
| 1888 if (buf == NULL) { |
| 1889 xmlFreeInputStream (inputStream); |
| 1890 xmlFreeParserCtxt(pctxt); |
| 1891 xmlFree(URL); |
| 1892 return(-1); |
| 1893 } |
| 1894 if (buf->encoder) |
| 1895 xmlCharEncCloseFunc(buf->encoder); |
| 1896 buf->encoder = xmlGetCharEncodingHandler(enc); |
1878 node = xmlNewText(NULL); | 1897 node = xmlNewText(NULL); |
1879 | 1898 |
1880 /* | 1899 /* |
1881 * Scan all chars from the resource and add the to the node | 1900 * Scan all chars from the resource and add the to the node |
1882 */ | 1901 */ |
| 1902 xinclude_multibyte_fallback: |
1883 while (xmlParserInputBufferRead(buf, 128) > 0) { | 1903 while (xmlParserInputBufferRead(buf, 128) > 0) { |
1884 int len; | 1904 int len; |
1885 const xmlChar *content; | 1905 const xmlChar *content; |
1886 | 1906 |
1887 » content = xmlBufferContent(buf->buffer); | 1907 » content = xmlBufContent(buf->buffer); |
1888 » len = xmlBufferLength(buf->buffer); | 1908 » len = xmlBufLength(buf->buffer); |
1889 for (i = 0;i < len;) { | 1909 for (i = 0;i < len;) { |
1890 int cur; | 1910 int cur; |
1891 int l; | 1911 int l; |
1892 | 1912 |
1893 cur = xmlStringCurrentChar(NULL, &content[i], &l); | 1913 cur = xmlStringCurrentChar(NULL, &content[i], &l); |
1894 if (!IS_CHAR(cur)) { | 1914 if (!IS_CHAR(cur)) { |
1895 » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 1915 » » /* Handle splitted multibyte char at buffer boundary */ |
1896 » » XML_XINCLUDE_INVALID_CHAR, | 1916 » » if (((len - i) < 4) && (!xinclude_multibyte_fallback_used)) { |
1897 » » » "%s contains invalid char\n", URL); | 1917 » » xinclude_multibyte_fallback_used = 1; |
1898 » » xmlFreeParserInputBuffer(buf); | 1918 » » xmlBufShrink(buf->buffer, i); |
1899 » » xmlFree(URL); | 1919 » » goto xinclude_multibyte_fallback; |
1900 » » return(-1); | 1920 » » } else { |
| 1921 » » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
| 1922 » » » » XML_XINCLUDE_INVALID_CHAR, |
| 1923 » » » » "%s contains invalid char\n", URL); |
| 1924 » » xmlFreeParserInputBuffer(buf); |
| 1925 » » xmlFree(URL); |
| 1926 » » return(-1); |
| 1927 » » } |
1901 } else { | 1928 } else { |
| 1929 xinclude_multibyte_fallback_used = 0; |
1902 xmlNodeAddContentLen(node, &content[i], l); | 1930 xmlNodeAddContentLen(node, &content[i], l); |
1903 } | 1931 } |
1904 i += l; | 1932 i += l; |
1905 } | 1933 } |
1906 » xmlBufferShrink(buf->buffer, len); | 1934 » xmlBufShrink(buf->buffer, len); |
1907 } | 1935 } |
1908 xmlFreeParserInputBuffer(buf); | 1936 xmlFreeParserCtxt(pctxt); |
1909 xmlXIncludeAddTxt(ctxt, node, URL); | 1937 xmlXIncludeAddTxt(ctxt, node, URL); |
| 1938 xmlFreeInputStream(inputStream); |
1910 | 1939 |
1911 loaded: | 1940 loaded: |
1912 /* | 1941 /* |
1913 * Add the element as the replacement copy. | 1942 * Add the element as the replacement copy. |
1914 */ | 1943 */ |
1915 ctxt->incTab[nr]->inc = node; | 1944 ctxt->incTab[nr]->inc = node; |
1916 xmlFree(URL); | 1945 xmlFree(URL); |
1917 return(0); | 1946 return(0); |
1918 } | 1947 } |
1919 | 1948 |
1920 /** | 1949 /** |
1921 * xmlXIncludeLoadFallback: | 1950 * xmlXIncludeLoadFallback: |
1922 * @ctxt: the XInclude context | 1951 * @ctxt: the XInclude context |
1923 * @fallback: the fallback node | 1952 * @fallback: the fallback node |
1924 * @nr: the xinclude node number | 1953 * @nr: the xinclude node number |
1925 * | 1954 * |
1926 * Load the content of the fallback node, and store the result | 1955 * Load the content of the fallback node, and store the result |
1927 * in the XInclude context | 1956 * in the XInclude context |
1928 * | 1957 * |
1929 * Returns 0 in case of success, -1 in case of failure | 1958 * Returns 0 in case of success, -1 in case of failure |
1930 */ | 1959 */ |
1931 static int | 1960 static int |
1932 xmlXIncludeLoadFallback(xmlXIncludeCtxtPtr ctxt, xmlNodePtr fallback, int nr) { | 1961 xmlXIncludeLoadFallback(xmlXIncludeCtxtPtr ctxt, xmlNodePtr fallback, int nr) { |
1933 xmlXIncludeCtxtPtr newctxt; | 1962 xmlXIncludeCtxtPtr newctxt; |
1934 int ret = 0; | 1963 int ret = 0; |
1935 | 1964 |
1936 if ((fallback == NULL) || (ctxt == NULL)) | 1965 if ((fallback == NULL) || (fallback->type == XML_NAMESPACE_DECL) || |
| 1966 (ctxt == NULL)) |
1937 return(-1); | 1967 return(-1); |
1938 if (fallback->children != NULL) { | 1968 if (fallback->children != NULL) { |
1939 /* | 1969 /* |
1940 * It's possible that the fallback also has 'includes' | 1970 * It's possible that the fallback also has 'includes' |
1941 * (Bug 129969), so we re-process the fallback just in case | 1971 * (Bug 129969), so we re-process the fallback just in case |
1942 */ | 1972 */ |
1943 newctxt = xmlXIncludeNewContext(ctxt->doc); | 1973 newctxt = xmlXIncludeNewContext(ctxt->doc); |
1944 if (newctxt == NULL) | 1974 if (newctxt == NULL) |
1945 return (-1); | 1975 return (-1); |
1946 newctxt->_private = ctxt->_private; | 1976 newctxt->_private = ctxt->_private; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2011 cur = ctxt->incTab[nr]->ref; | 2041 cur = ctxt->incTab[nr]->ref; |
2012 if (cur == NULL) | 2042 if (cur == NULL) |
2013 return(-1); | 2043 return(-1); |
2014 | 2044 |
2015 /* | 2045 /* |
2016 * read the attributes | 2046 * read the attributes |
2017 */ | 2047 */ |
2018 href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); | 2048 href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); |
2019 if (href == NULL) { | 2049 if (href == NULL) { |
2020 href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ | 2050 href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ |
2021 » if (href == NULL) | 2051 » if (href == NULL) |
2022 return(-1); | 2052 return(-1); |
2023 } | 2053 } |
2024 parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); | 2054 parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); |
2025 if (parse != NULL) { | 2055 if (parse != NULL) { |
2026 if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) | 2056 if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) |
2027 xml = 1; | 2057 xml = 1; |
2028 else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) | 2058 else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) |
2029 xml = 0; | 2059 xml = 0; |
2030 else { | 2060 else { |
2031 xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 2061 xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
(...skipping 24 matching lines...) Expand all Loading... |
2056 */ | 2086 */ |
2057 escbase = xmlURIEscape(base); | 2087 escbase = xmlURIEscape(base); |
2058 eschref = xmlURIEscape(href); | 2088 eschref = xmlURIEscape(href); |
2059 URI = xmlBuildURI(eschref, escbase); | 2089 URI = xmlBuildURI(eschref, escbase); |
2060 if (escbase != NULL) | 2090 if (escbase != NULL) |
2061 xmlFree(escbase); | 2091 xmlFree(escbase); |
2062 if (eschref != NULL) | 2092 if (eschref != NULL) |
2063 xmlFree(eschref); | 2093 xmlFree(eschref); |
2064 } | 2094 } |
2065 if (URI == NULL) { | 2095 if (URI == NULL) { |
2066 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 2096 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
2067 XML_XINCLUDE_HREF_URI, "failed build URL\n", NULL); | 2097 XML_XINCLUDE_HREF_URI, "failed build URL\n", NULL); |
2068 if (parse != NULL) | 2098 if (parse != NULL) |
2069 xmlFree(parse); | 2099 xmlFree(parse); |
2070 if (href != NULL) | 2100 if (href != NULL) |
2071 xmlFree(href); | 2101 xmlFree(href); |
2072 if (base != NULL) | 2102 if (base != NULL) |
2073 xmlFree(base); | 2103 xmlFree(base); |
2074 return(-1); | 2104 return(-1); |
2075 } | 2105 } |
2076 #ifdef DEBUG_XINCLUDE | 2106 #ifdef DEBUG_XINCLUDE |
(...skipping 12 matching lines...) Expand all Loading... |
2089 ret = xmlXIncludeLoadDoc(ctxt, URI, nr); | 2119 ret = xmlXIncludeLoadDoc(ctxt, URI, nr); |
2090 /* xmlXIncludeGetFragment(ctxt, cur, URI); */ | 2120 /* xmlXIncludeGetFragment(ctxt, cur, URI); */ |
2091 } else { | 2121 } else { |
2092 ret = xmlXIncludeLoadTxt(ctxt, URI, nr); | 2122 ret = xmlXIncludeLoadTxt(ctxt, URI, nr); |
2093 } | 2123 } |
2094 | 2124 |
2095 /* | 2125 /* |
2096 * Restore the original base before checking for fallback | 2126 * Restore the original base before checking for fallback |
2097 */ | 2127 */ |
2098 ctxt->base = oldBase; | 2128 ctxt->base = oldBase; |
2099 | 2129 |
2100 if (ret < 0) { | 2130 if (ret < 0) { |
2101 xmlNodePtr children; | 2131 xmlNodePtr children; |
2102 | 2132 |
2103 /* | 2133 /* |
2104 * Time to try a fallback if availble | 2134 * Time to try a fallback if availble |
2105 */ | 2135 */ |
2106 #ifdef DEBUG_XINCLUDE | 2136 #ifdef DEBUG_XINCLUDE |
2107 xmlGenericError(xmlGenericErrorContext, "error looking for fallback\n"); | 2137 xmlGenericError(xmlGenericErrorContext, "error looking for fallback\n"); |
2108 #endif | 2138 #endif |
2109 children = cur->children; | 2139 children = cur->children; |
2110 while (children != NULL) { | 2140 while (children != NULL) { |
2111 if ((children->type == XML_ELEMENT_NODE) && | 2141 if ((children->type == XML_ELEMENT_NODE) && |
2112 (children->ns != NULL) && | 2142 (children->ns != NULL) && |
2113 (xmlStrEqual(children->name, XINCLUDE_FALLBACK)) && | 2143 (xmlStrEqual(children->name, XINCLUDE_FALLBACK)) && |
2114 ((xmlStrEqual(children->ns->href, XINCLUDE_NS)) || | 2144 ((xmlStrEqual(children->ns->href, XINCLUDE_NS)) || |
2115 (xmlStrEqual(children->ns->href, XINCLUDE_OLD_NS)))) { | 2145 (xmlStrEqual(children->ns->href, XINCLUDE_OLD_NS)))) { |
2116 ret = xmlXIncludeLoadFallback(ctxt, children, nr); | 2146 ret = xmlXIncludeLoadFallback(ctxt, children, nr); |
2117 » » if (ret == 0) | 2147 » » if (ret == 0) |
2118 break; | 2148 break; |
2119 } | 2149 } |
2120 children = children->next; | 2150 children = children->next; |
2121 } | 2151 } |
2122 } | 2152 } |
2123 if (ret < 0) { | 2153 if (ret < 0) { |
2124 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 2154 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
2125 XML_XINCLUDE_NO_FALLBACK, | 2155 XML_XINCLUDE_NO_FALLBACK, |
2126 "could not load %s, and no fallback was found\n", | 2156 "could not load %s, and no fallback was found\n", |
2127 URI); | 2157 URI); |
2128 } | 2158 } |
2129 | 2159 |
2130 /* | 2160 /* |
2131 * Cleanup | 2161 * Cleanup |
2132 */ | 2162 */ |
2133 if (URI != NULL) | 2163 if (URI != NULL) |
2134 xmlFree(URI); | 2164 xmlFree(URI); |
(...skipping 17 matching lines...) Expand all Loading... |
2152 */ | 2182 */ |
2153 static int | 2183 static int |
2154 xmlXIncludeIncludeNode(xmlXIncludeCtxtPtr ctxt, int nr) { | 2184 xmlXIncludeIncludeNode(xmlXIncludeCtxtPtr ctxt, int nr) { |
2155 xmlNodePtr cur, end, list, tmp; | 2185 xmlNodePtr cur, end, list, tmp; |
2156 | 2186 |
2157 if (ctxt == NULL) | 2187 if (ctxt == NULL) |
2158 return(-1); | 2188 return(-1); |
2159 if ((nr < 0) || (nr >= ctxt->incNr)) | 2189 if ((nr < 0) || (nr >= ctxt->incNr)) |
2160 return(-1); | 2190 return(-1); |
2161 cur = ctxt->incTab[nr]->ref; | 2191 cur = ctxt->incTab[nr]->ref; |
2162 if (cur == NULL) | 2192 if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) |
2163 return(-1); | 2193 return(-1); |
2164 | 2194 |
2165 /* | 2195 /* |
2166 * If we stored an XPointer a late computation may be needed | 2196 * If we stored an XPointer a late computation may be needed |
2167 */ | 2197 */ |
2168 if ((ctxt->incTab[nr]->inc == NULL) && | 2198 if ((ctxt->incTab[nr]->inc == NULL) && |
2169 (ctxt->incTab[nr]->xptr != NULL)) { | 2199 (ctxt->incTab[nr]->xptr != NULL)) { |
2170 ctxt->incTab[nr]->inc = | 2200 ctxt->incTab[nr]->inc = |
2171 xmlXIncludeCopyXPointer(ctxt, ctxt->doc, ctxt->doc, | 2201 xmlXIncludeCopyXPointer(ctxt, ctxt->doc, ctxt->doc, |
2172 ctxt->incTab[nr]->xptr); | 2202 ctxt->incTab[nr]->xptr); |
(...skipping 10 matching lines...) Expand all Loading... |
2183 (cur->parent->type != XML_ELEMENT_NODE)) { | 2213 (cur->parent->type != XML_ELEMENT_NODE)) { |
2184 int nb_elem = 0; | 2214 int nb_elem = 0; |
2185 | 2215 |
2186 tmp = list; | 2216 tmp = list; |
2187 while (tmp != NULL) { | 2217 while (tmp != NULL) { |
2188 if (tmp->type == XML_ELEMENT_NODE) | 2218 if (tmp->type == XML_ELEMENT_NODE) |
2189 nb_elem++; | 2219 nb_elem++; |
2190 tmp = tmp->next; | 2220 tmp = tmp->next; |
2191 } | 2221 } |
2192 if (nb_elem > 1) { | 2222 if (nb_elem > 1) { |
2193 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, | 2223 » xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, |
2194 XML_XINCLUDE_MULTIPLE_ROOT, | 2224 XML_XINCLUDE_MULTIPLE_ROOT, |
2195 "XInclude error: would result in multiple root nodes\n", | 2225 "XInclude error: would result in multiple root nodes\n", |
2196 NULL); | 2226 NULL); |
2197 return(-1); | 2227 return(-1); |
2198 } | 2228 } |
2199 } | 2229 } |
2200 | 2230 |
2201 if (ctxt->parseFlags & XML_PARSE_NOXINCNODE) { | 2231 if (ctxt->parseFlags & XML_PARSE_NOXINCNODE) { |
2202 /* | 2232 /* |
2203 * Add the list of nodes | 2233 * Add the list of nodes |
(...skipping 26 matching lines...) Expand all Loading... |
2230 * Add the list of nodes | 2260 * Add the list of nodes |
2231 */ | 2261 */ |
2232 while (list != NULL) { | 2262 while (list != NULL) { |
2233 cur = list; | 2263 cur = list; |
2234 list = list->next; | 2264 list = list->next; |
2235 | 2265 |
2236 xmlAddPrevSibling(end, cur); | 2266 xmlAddPrevSibling(end, cur); |
2237 } | 2267 } |
2238 } | 2268 } |
2239 | 2269 |
2240 | 2270 |
2241 return(0); | 2271 return(0); |
2242 } | 2272 } |
2243 | 2273 |
2244 /** | 2274 /** |
2245 * xmlXIncludeTestNode: | 2275 * xmlXIncludeTestNode: |
2246 * @ctxt: the XInclude processing context | 2276 * @ctxt: the XInclude processing context |
2247 * @node: an XInclude node | 2277 * @node: an XInclude node |
2248 * | 2278 * |
2249 * test if the node is an XInclude node | 2279 * test if the node is an XInclude node |
2250 * | 2280 * |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2327 * | 2357 * |
2328 * Returns 0 if no substitution were done, -1 if some processing failed | 2358 * Returns 0 if no substitution were done, -1 if some processing failed |
2329 * or the number of substitutions done. | 2359 * or the number of substitutions done. |
2330 */ | 2360 */ |
2331 static int | 2361 static int |
2332 xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree) { | 2362 xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree) { |
2333 xmlNodePtr cur; | 2363 xmlNodePtr cur; |
2334 int ret = 0; | 2364 int ret = 0; |
2335 int i, start; | 2365 int i, start; |
2336 | 2366 |
2337 if ((doc == NULL) || (tree == NULL)) | 2367 if ((doc == NULL) || (tree == NULL) || (tree->type == XML_NAMESPACE_DECL)) |
2338 return(-1); | 2368 return(-1); |
2339 if (ctxt == NULL) | 2369 if (ctxt == NULL) |
2340 return(-1); | 2370 return(-1); |
2341 | 2371 |
2342 if (doc->URL != NULL) { | 2372 if (doc->URL != NULL) { |
2343 ret = xmlXIncludeURLPush(ctxt, doc->URL); | 2373 ret = xmlXIncludeURLPush(ctxt, doc->URL); |
2344 if (ret < 0) | 2374 if (ret < 0) |
2345 return(-1); | 2375 return(-1); |
2346 } | 2376 } |
2347 start = ctxt->incNr; | 2377 start = ctxt->incNr; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2441 * | 2471 * |
2442 * Returns 0 if no substitution were done, -1 if some processing failed | 2472 * Returns 0 if no substitution were done, -1 if some processing failed |
2443 * or the number of substitutions done. | 2473 * or the number of substitutions done. |
2444 */ | 2474 */ |
2445 | 2475 |
2446 int | 2476 int |
2447 xmlXIncludeProcessTreeFlagsData(xmlNodePtr tree, int flags, void *data) { | 2477 xmlXIncludeProcessTreeFlagsData(xmlNodePtr tree, int flags, void *data) { |
2448 xmlXIncludeCtxtPtr ctxt; | 2478 xmlXIncludeCtxtPtr ctxt; |
2449 int ret = 0; | 2479 int ret = 0; |
2450 | 2480 |
2451 if ((tree == NULL) || (tree->doc == NULL)) | 2481 if ((tree == NULL) || (tree->type == XML_NAMESPACE_DECL) || |
| 2482 (tree->doc == NULL)) |
2452 return(-1); | 2483 return(-1); |
2453 | 2484 |
2454 ctxt = xmlXIncludeNewContext(tree->doc); | 2485 ctxt = xmlXIncludeNewContext(tree->doc); |
2455 if (ctxt == NULL) | 2486 if (ctxt == NULL) |
2456 return(-1); | 2487 return(-1); |
2457 ctxt->_private = data; | 2488 ctxt->_private = data; |
2458 ctxt->base = xmlStrdup((xmlChar *)tree->doc->URL); | 2489 ctxt->base = xmlStrdup((xmlChar *)tree->doc->URL); |
2459 xmlXIncludeSetFlags(ctxt, flags); | 2490 xmlXIncludeSetFlags(ctxt, flags); |
2460 ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); | 2491 ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); |
2461 if ((ret >= 0) && (ctxt->nbErrors > 0)) | 2492 if ((ret >= 0) && (ctxt->nbErrors > 0)) |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2526 * Implement the XInclude substitution for the given subtree | 2557 * Implement the XInclude substitution for the given subtree |
2527 * | 2558 * |
2528 * Returns 0 if no substitution were done, -1 if some processing failed | 2559 * Returns 0 if no substitution were done, -1 if some processing failed |
2529 * or the number of substitutions done. | 2560 * or the number of substitutions done. |
2530 */ | 2561 */ |
2531 int | 2562 int |
2532 xmlXIncludeProcessTreeFlags(xmlNodePtr tree, int flags) { | 2563 xmlXIncludeProcessTreeFlags(xmlNodePtr tree, int flags) { |
2533 xmlXIncludeCtxtPtr ctxt; | 2564 xmlXIncludeCtxtPtr ctxt; |
2534 int ret = 0; | 2565 int ret = 0; |
2535 | 2566 |
2536 if ((tree == NULL) || (tree->doc == NULL)) | 2567 if ((tree == NULL) || (tree->type == XML_NAMESPACE_DECL) || |
| 2568 (tree->doc == NULL)) |
2537 return(-1); | 2569 return(-1); |
2538 ctxt = xmlXIncludeNewContext(tree->doc); | 2570 ctxt = xmlXIncludeNewContext(tree->doc); |
2539 if (ctxt == NULL) | 2571 if (ctxt == NULL) |
2540 return(-1); | 2572 return(-1); |
2541 ctxt->base = xmlNodeGetBase(tree->doc, tree); | 2573 ctxt->base = xmlNodeGetBase(tree->doc, tree); |
2542 xmlXIncludeSetFlags(ctxt, flags); | 2574 xmlXIncludeSetFlags(ctxt, flags); |
2543 ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); | 2575 ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); |
2544 if ((ret >= 0) && (ctxt->nbErrors > 0)) | 2576 if ((ret >= 0) && (ctxt->nbErrors > 0)) |
2545 ret = -1; | 2577 ret = -1; |
2546 | 2578 |
(...skipping 23 matching lines...) Expand all Loading... |
2570 * Implement the XInclude substitution for the given subtree reusing | 2602 * Implement the XInclude substitution for the given subtree reusing |
2571 * the informations and data coming from the given context. | 2603 * the informations and data coming from the given context. |
2572 * | 2604 * |
2573 * Returns 0 if no substitution were done, -1 if some processing failed | 2605 * Returns 0 if no substitution were done, -1 if some processing failed |
2574 * or the number of substitutions done. | 2606 * or the number of substitutions done. |
2575 */ | 2607 */ |
2576 int | 2608 int |
2577 xmlXIncludeProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { | 2609 xmlXIncludeProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { |
2578 int ret = 0; | 2610 int ret = 0; |
2579 | 2611 |
2580 if ((node == NULL) || (node->doc == NULL) || (ctxt == NULL)) | 2612 if ((node == NULL) || (node->type == XML_NAMESPACE_DECL) || |
| 2613 (node->doc == NULL) || (ctxt == NULL)) |
2581 return(-1); | 2614 return(-1); |
2582 ret = xmlXIncludeDoProcess(ctxt, node->doc, node); | 2615 ret = xmlXIncludeDoProcess(ctxt, node->doc, node); |
2583 if ((ret >= 0) && (ctxt->nbErrors > 0)) | 2616 if ((ret >= 0) && (ctxt->nbErrors > 0)) |
2584 ret = -1; | 2617 ret = -1; |
2585 return(ret); | 2618 return(ret); |
2586 } | 2619 } |
2587 | 2620 |
2588 #else /* !LIBXML_XINCLUDE_ENABLED */ | 2621 #else /* !LIBXML_XINCLUDE_ENABLED */ |
2589 #endif | 2622 #endif |
2590 #define bottom_xinclude | 2623 #define bottom_xinclude |
2591 #include "elfgcchack.h" | 2624 #include "elfgcchack.h" |
OLD | NEW |