26#ifdef LIBXML_XINCLUDE_ENABLED
34#define XINCLUDE_MAX_DEPTH 40
47typedef struct _xmlXIncludeRef xmlXIncludeRef;
48typedef xmlXIncludeRef *xmlXIncludeRefPtr;
49struct _xmlXIncludeRef {
61typedef struct _xmlXIncludeDoc xmlXIncludeDoc;
62typedef xmlXIncludeDoc *xmlXIncludeDocPtr;
63struct _xmlXIncludeDoc {
69typedef struct _xmlXIncludeTxt xmlXIncludeTxt;
70typedef xmlXIncludeTxt *xmlXIncludeTxtPtr;
71struct _xmlXIncludeTxt {
76struct _xmlXIncludeCtxt {
80 xmlXIncludeRefPtr *incTab;
84 xmlXIncludeTxt *txtTab;
88 xmlXIncludeDoc *urlTab;
98#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
99 unsigned long incTotal;
105static xmlXIncludeRefPtr
106xmlXIncludeExpandNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
node);
109xmlXIncludeLoadNode(xmlXIncludeCtxtPtr ctxt, xmlXIncludeRefPtr
ref);
112xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
tree);
128xmlXIncludeErrMemory(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
node,
136 "Memory allocation failed : %s\n",
extra);
149xmlXIncludeErr(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
node,
int error,
171xmlXIncludeWarn(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
node,
int error,
192xmlXIncludeGetProp(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
cur,
199 if (ctxt->legacy != 0) {
200 ret = xmlGetNsProp(
cur, XINCLUDE_OLD_NS,
name);
214xmlXIncludeFreeRef(xmlXIncludeRefPtr
ref) {
234static xmlXIncludeRefPtr
235xmlXIncludeNewRef(xmlXIncludeCtxtPtr ctxt,
const xmlChar *URI,
237 xmlXIncludeRefPtr
ret;
239 ret = (xmlXIncludeRefPtr)
xmlMalloc(
sizeof(xmlXIncludeRef));
241 xmlXIncludeErrMemory(ctxt,
elem,
"growing XInclude context");
253 if (ctxt->incNr >= ctxt->incMax) {
254 xmlXIncludeRefPtr *tmp;
255#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
256 size_t newSize = ctxt->incMax ? ctxt->incMax * 2 : 1;
258 size_t newSize = ctxt->incMax ? ctxt->incMax * 2 : 4;
261 tmp = (xmlXIncludeRefPtr *)
xmlRealloc(ctxt->incTab,
262 newSize *
sizeof(ctxt->incTab[0]));
264 xmlXIncludeErrMemory(ctxt,
elem,
"growing XInclude context");
265 xmlXIncludeFreeRef(
ret);
269 ctxt->incMax = newSize;
271 ctxt->incTab[ctxt->incNr++] =
ret;
284xmlXIncludeNewContext(xmlDocPtr doc) {
285 xmlXIncludeCtxtPtr
ret;
289 ret = (xmlXIncludeCtxtPtr)
xmlMalloc(
sizeof(xmlXIncludeCtxt));
291 xmlXIncludeErrMemory(
NULL, (xmlNodePtr) doc,
292 "creating XInclude context");
311xmlXIncludeFreeContext(xmlXIncludeCtxtPtr ctxt) {
316 if (ctxt->urlTab !=
NULL) {
317 for (
i = 0;
i < ctxt->urlNr;
i++) {
318 xmlFreeDoc(ctxt->urlTab[
i].doc);
323 for (
i = 0;
i < ctxt->incNr;
i++) {
324 if (ctxt->incTab[
i] !=
NULL)
325 xmlXIncludeFreeRef(ctxt->incTab[
i]);
327 if (ctxt->incTab !=
NULL)
329 if (ctxt->txtTab !=
NULL) {
330 for (
i = 0;
i < ctxt->txtNr;
i++) {
336 if (ctxt->base !=
NULL) {
350xmlXIncludeParseFile(xmlXIncludeCtxtPtr ctxt,
const char *URL) {
352 xmlParserCtxtPtr pctxt;
353 xmlParserInputPtr inputStream;
359 xmlXIncludeErrMemory(ctxt,
NULL,
"cannot allocate parser context");
366 pctxt->_private = ctxt->_private;
372 if ((ctxt->doc !=
NULL) && (ctxt->doc->dict !=
NULL)) {
373 if (pctxt->dict !=
NULL)
375 pctxt->dict = ctxt->doc->dict;
386 if (inputStream ==
NULL) {
393 if (pctxt->directory ==
NULL)
400 if (pctxt->wellFormed) {
405 if (pctxt->myDoc !=
NULL)
406 xmlFreeDoc(pctxt->myDoc);
421static xmlXIncludeRefPtr
422xmlXIncludeAddNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
cur) {
423 xmlXIncludeRefPtr
ref;
443 href = xmlXIncludeGetProp(ctxt,
cur, XINCLUDE_HREF);
449 parse = xmlXIncludeGetProp(ctxt,
cur, XINCLUDE_PARSE);
457 "invalid value %s for 'parse'\n", parse);
469 base = xmlNodeGetBase(ctxt->doc,
cur);
497 "failed build URL\n",
NULL);
500 fragment = xmlXIncludeGetProp(ctxt,
cur, XINCLUDE_PARSE_XPOINTER);
508 "invalid value URI %s\n", URI);
509 if (fragment !=
NULL)
516 if (ctxt->legacy != 0) {
517 if (fragment ==
NULL) {
524 "Invalid fragment identifier in URI %s use the xpointer attribute\n",
526 if (fragment !=
NULL)
538 "invalid value URI %s\n", URI);
539 if (fragment !=
NULL)
552 if ((
local == 1) && (xml == 1) &&
553 ((fragment ==
NULL) || (fragment[0] == 0))) {
555 "detected a local recursion with no xpointer in %s\n",
562 ref = xmlXIncludeNewRef(ctxt, URL,
cur);
568 ref->fragment = fragment;
582xmlXIncludeRecurseDoc(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc,
585 xmlXIncludeRefPtr *oldIncTab;
586 int oldIncMax, oldIncNr, oldIsStream;
590 oldIncMax = ctxt->incMax;
591 oldIncNr = ctxt->incNr;
592 oldIncTab = ctxt->incTab;
593 oldIsStream = ctxt->isStream;
600 xmlXIncludeDoProcess(ctxt, xmlDocGetRootElement(doc));
602 if (ctxt->incTab !=
NULL) {
603 for (
i = 0;
i < ctxt->incNr;
i++)
604 xmlXIncludeFreeRef(ctxt->incTab[
i]);
609 ctxt->incMax = oldIncMax;
610 ctxt->incNr = oldIncNr;
611 ctxt->incTab = oldIncTab;
612 ctxt->isStream = oldIsStream;
632xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
elem,
635 xmlNodePtr insertParent =
NULL;
636 xmlNodePtr insertLast =
NULL;
651 if ((
cur->type == XML_DOCUMENT_NODE) ||
652 (
cur->type == XML_DTD_NODE)) {
654 }
else if ((
cur->type == XML_ELEMENT_NODE) &&
659 xmlXIncludeRefPtr
ref = xmlXIncludeExpandNode(ctxt,
cur);
677 recurse = (
cur->type != XML_ENTITY_REF_NODE) &&
684 if (insertLast !=
NULL) {
685 insertLast->next =
copy;
686 copy->prev = insertLast;
687 }
else if (insertParent !=
NULL) {
688 insertParent->children =
copy;
691 while (insertLast->next !=
NULL) {
692 insertLast = insertLast->next;
698 insertParent = insertLast;
707 if (insertParent !=
NULL)
708 insertParent->last = insertLast;
712 insertLast = insertParent;
713 insertParent = insertParent->parent;
724#ifdef LIBXML_XPTR_LOCS_ENABLED
733xmlXIncludeGetNthChild(xmlNodePtr
cur,
int no) {
735 if ((
cur ==
NULL) || (
cur->type == XML_NAMESPACE_DECL))
741 if ((
cur->type == XML_ELEMENT_NODE) ||
742 (
cur->type == XML_DOCUMENT_NODE) ||
743 (
cur->type == XML_HTML_DOCUMENT_NODE)) {
752xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr
cur,
int *
level);
764xmlXIncludeCopyRange(xmlXIncludeCtxtPtr ctxt, xmlXPathObjectPtr
range) {
767 xmlNodePtr tmp, tmp2;
771 int level = 0, lastLevel = 0, endLevel = 0, endFlag = 0;
775 if (
range->type != XPATH_RANGE)
783 return(xmlDocCopyNode(
start, ctxt->doc, 1));
784 if (
end->type == XML_NAMESPACE_DECL)
788 index1 =
range->index;
789 index2 =
range->index2;
805 tmp2 = xmlDocCopyNode(listParent, ctxt->doc, 2);
806 xmlAddChild(tmp2,
list);
808 listParent = listParent->parent;
817 while (
level < lastLevel) {
822 if (
cur->type == XML_TEXT_NODE) {
827 tmp = xmlNewDocTextLen(ctxt->doc,
NULL, 0);
830 if ((
cur ==
start) && (index1 > 1)) {
836 tmp = xmlNewDocTextLen(ctxt->doc,
content,
len);
842 if (
level == lastLevel)
843 xmlAddNextSibling(
last, tmp);
845 xmlAddChild(
last, tmp);
851 tmp = xmlDocCopyNode(
cur, ctxt->doc, 2);
854 listParent =
cur->parent;
857 if (
level == lastLevel)
858 last = xmlAddNextSibling(
last, tmp);
866 end = xmlXIncludeGetNthChild(
cur, index2 - 1);
869 if ((
cur ==
start) && (index1 > 1)) {
870 cur = xmlXIncludeGetNthChild(
cur, index1 - 1);
882 if ((
cur->type == XML_TEXT_NODE) ||
883 (
cur->type == XML_CDATA_SECTION_NODE)) {
887 tmp = xmlNewDocTextLen(ctxt->doc,
NULL, 0);
893 tmp = xmlNewDocText(ctxt->doc,
content);
896 listParent =
cur->parent;
902 tmp = xmlDocCopyNode(
cur, ctxt->doc, 2);
904 listParent =
cur->parent;
906 cur = xmlXIncludeGetNthChild(
cur, index1 - 1);
907 level = lastLevel = 1;
919 case XML_ELEMENT_DECL:
920 case XML_ATTRIBUTE_DECL:
921 case XML_ENTITY_NODE:
924 case XML_ENTITY_DECL:
927 case XML_XINCLUDE_START:
928 case XML_XINCLUDE_END:
931 case XML_ATTRIBUTE_NODE:
939 tmp = xmlDocCopyNode(
cur, ctxt->doc, 2);
943 if (
level == lastLevel)
944 last = xmlAddNextSibling(
last, tmp);
955 if (endFlag && (
level >= endLevel))
974xmlXIncludeCopyXPointer(xmlXIncludeCtxtPtr ctxt, xmlXPathObjectPtr
obj) {
981 case XPATH_NODESET: {
982 xmlNodeSetPtr
set =
obj->nodesetval;
985 for (
i = 0;
i <
set->nodeNr;
i++) {
990 switch (
set->nodeTab[
i]->type) {
991 case XML_DOCUMENT_NODE:
992 case XML_HTML_DOCUMENT_NODE:
993 node = xmlDocGetRootElement(
994 (xmlDocPtr)
set->nodeTab[
i]);
996 xmlXIncludeErr(ctxt,
set->nodeTab[
i],
998 "document without root\n",
NULL);
1003 case XML_CDATA_SECTION_NODE:
1004 case XML_ELEMENT_NODE:
1006 case XML_COMMENT_NODE:
1010 xmlXIncludeErr(ctxt,
set->nodeTab[
i],
1012 "invalid node type in XPtr result\n",
1022 copy = xmlXIncludeCopyNode(ctxt,
node, 0);
1024 xmlFreeNodeList(
list);
1039#ifdef LIBXML_XPTR_LOCS_ENABLED
1040 case XPATH_LOCATIONSET: {
1041 xmlLocationSetPtr
set = (xmlLocationSetPtr)
obj->user;
1044 for (
i = 0;
i <
set->locNr;
i++) {
1046 list =
last = xmlXIncludeCopyXPointer(ctxt,
1049 xmlAddNextSibling(
last,
1050 xmlXIncludeCopyXPointer(ctxt,
set->locTab[
i]));
1059 return(xmlXIncludeCopyRange(ctxt,
obj));
1075typedef struct _xmlXIncludeMergeData xmlXIncludeMergeData;
1076typedef xmlXIncludeMergeData *xmlXIncludeMergeDataPtr;
1077struct _xmlXIncludeMergeData {
1079 xmlXIncludeCtxtPtr ctxt;
1091xmlXIncludeMergeEntity(
void *payload,
void *vdata,
1093 xmlEntityPtr ent = (xmlEntityPtr) payload;
1094 xmlXIncludeMergeDataPtr
data = (xmlXIncludeMergeDataPtr) vdata;
1095 xmlEntityPtr
ret, prev;
1097 xmlXIncludeCtxtPtr ctxt;
1103 if ((ctxt ==
NULL) || (doc ==
NULL))
1105 switch (ent->etype) {
1116 ent->SystemID, ent->content);
1118 if (ent->URI !=
NULL)
1123 if (ent->etype != prev->etype)
1126 if ((ent->SystemID !=
NULL) && (prev->SystemID !=
NULL)) {
1129 }
else if ((ent->ExternalID !=
NULL) &&
1130 (prev->ExternalID !=
NULL)) {
1131 if (!
xmlStrEqual(ent->ExternalID, prev->ExternalID))
1133 }
else if ((ent->content !=
NULL) && (prev->content !=
NULL)) {
1144 switch (ent->etype) {
1155 "mismatch in redefinition of entity %s\n",
1170xmlXIncludeMergeEntities(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc,
1183 cur = xmlDocGetRootElement(doc);
1193 xmlXIncludeMergeData
data;
1199 xmlXIncludeMergeEntity, &
data);
1203 xmlXIncludeMergeData
data;
1214 xmlXIncludeMergeEntity, &
data);
1231xmlXIncludeLoadDoc(xmlXIncludeCtxtPtr ctxt,
const xmlChar *
url,
1232 xmlXIncludeRefPtr
ref) {
1233 xmlXIncludeDocPtr
cache;
1241#ifdef LIBXML_XPTR_ENABLED
1251 "invalid value URI %s\n",
url);
1266 "invalid value URI %s\n",
url);
1274 if ((URL[0] == 0) || (URL[0] ==
'#') ||
1283 for (
i = 0;
i < ctxt->urlNr;
i++) {
1285 if (ctxt->urlTab[
i].expanding) {
1287 "inclusion loop detected\n",
NULL);
1290 doc = ctxt->urlTab[
i].doc;
1300#ifdef LIBXML_XPTR_ENABLED
1306 saveFlags = ctxt->parseFlags;
1307 if (fragment !=
NULL) {
1312 doc = xmlXIncludeParseFile(ctxt, (
const char *)URL);
1313#ifdef LIBXML_XPTR_ENABLED
1314 ctxt->parseFlags = saveFlags;
1318 if (ctxt->urlNr >= ctxt->urlMax) {
1319 xmlXIncludeDoc *tmp;
1320#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
1321 size_t newSize = ctxt->urlMax ? ctxt->urlMax * 2 : 1;
1323 size_t newSize = ctxt->urlMax ? ctxt->urlMax * 2 : 8;
1326 tmp =
xmlRealloc(ctxt->urlTab,
sizeof(xmlXIncludeDoc) * newSize);
1328 xmlXIncludeErrMemory(ctxt,
ref->elem,
1329 "growing XInclude URL table");
1333 ctxt->urlMax = newSize;
1336 cacheNr = ctxt->urlNr++;
1337 cache = &ctxt->urlTab[cacheNr];
1340 cache->expanding = 0;
1358 xmlXIncludeMergeEntities(ctxt, ctxt->doc, doc);
1373 cache->expanding = 1;
1374 xmlXIncludeRecurseDoc(ctxt, doc, URL);
1376 cache = &ctxt->urlTab[cacheNr];
1377 cache->expanding = 0;
1380 if (fragment ==
NULL) {
1384 ref->inc = xmlDocCopyNode(xmlDocGetRootElement(doc), ctxt->doc, 1);
1386#ifdef LIBXML_XPTR_ENABLED
1392 xmlXPathObjectPtr xptr;
1393 xmlXPathContextPtr xptrctxt;
1396 if (ctxt->isStream && doc == ctxt->doc) {
1398 "XPointer expressions not allowed in streaming"
1403 xptrctxt = xmlXPtrNewContext(doc,
NULL,
NULL);
1404 if (xptrctxt ==
NULL) {
1406 "could not create XPointer context\n",
NULL);
1409 xptr = xmlXPtrEval(fragment, xptrctxt);
1412 "XPointer evaluation failed: #%s\n",
1414 xmlXPathFreeContext(xptrctxt);
1417 switch (xptr->type) {
1418 case XPATH_UNDEFINED:
1422#ifdef LIBXML_XPTR_LOCS_ENABLED
1426 case XPATH_XSLT_TREE:
1428 "XPointer is not a range: #%s\n",
1430 xmlXPathFreeObject(xptr);
1431 xmlXPathFreeContext(xptrctxt);
1434 if ((xptr->nodesetval ==
NULL) ||
1435 (xptr->nodesetval->nodeNr <= 0)) {
1436 xmlXPathFreeObject(xptr);
1437 xmlXPathFreeContext(xptrctxt);
1441#ifdef LIBXML_XPTR_LOCS_ENABLED
1443 case XPATH_LOCATIONSET:
1447 set = xptr->nodesetval;
1449 for (
i = 0;
i <
set->nodeNr;
i++) {
1452 switch (
set->nodeTab[
i]->type) {
1453 case XML_ELEMENT_NODE:
1455 case XML_CDATA_SECTION_NODE:
1456 case XML_ENTITY_REF_NODE:
1457 case XML_ENTITY_NODE:
1459 case XML_COMMENT_NODE:
1460 case XML_DOCUMENT_NODE:
1461 case XML_HTML_DOCUMENT_NODE:
1464 case XML_ATTRIBUTE_NODE:
1465 xmlXIncludeErr(ctxt,
ref->elem,
1467 "XPointer selects an attribute: #%s\n",
1471 case XML_NAMESPACE_DECL:
1472 xmlXIncludeErr(ctxt,
ref->elem,
1474 "XPointer selects a namespace: #%s\n",
1478 case XML_DOCUMENT_TYPE_NODE:
1479 case XML_DOCUMENT_FRAG_NODE:
1480 case XML_NOTATION_NODE:
1482 case XML_ELEMENT_DECL:
1483 case XML_ATTRIBUTE_DECL:
1484 case XML_ENTITY_DECL:
1485 case XML_XINCLUDE_START:
1486 case XML_XINCLUDE_END:
1487 xmlXIncludeErr(ctxt,
ref->elem,
1489 "XPointer selects unexpected nodes: #%s\n",
1497 ref->inc = xmlXIncludeCopyXPointer(ctxt, xptr);
1498 xmlXPathFreeObject(xptr);
1499 xmlXPathFreeContext(xptrctxt);
1506 if ((doc !=
NULL) && (URL !=
NULL) &&
1524 if (curBase ==
NULL) {
1526 "trying to build relative URI from %s\n", URL);
1539 if (
node->type == XML_ELEMENT_NODE) {
1540 curBase = xmlNodeGetBase(
node->doc,
node);
1542 if (curBase ==
NULL) {
1558 xmlBase = xmlGetNsProp(
node,
1561 if (xmlBase !=
NULL) {
1564 if (relBase ==
NULL) {
1565 xmlXIncludeErr(ctxt,
1568 "trying to rebuild base from %s\n",
1571 xmlNodeSetBase(
node, relBase);
1604xmlXIncludeLoadTxt(xmlXIncludeCtxtPtr ctxt,
const xmlChar *
url,
1605 xmlXIncludeRefPtr
ref) {
1606 xmlParserInputBufferPtr
buf;
1614 xmlParserCtxtPtr pctxt =
NULL;
1615 xmlParserInputPtr inputStream =
NULL;
1630 "invalid value URI %s\n",
url);
1635 "fragment identifier forbidden for text: %s\n",
1642 "invalid value URI %s\n",
url);
1652 "text serialization of document not available\n",
NULL);
1659 for (
i = 0;
i < ctxt->txtNr;
i++) {
1661 node = xmlNewDocText(ctxt->doc, ctxt->txtTab[
i].text);
1670 encoding = xmlGetProp(
ref->elem, XINCLUDE_PARSE_ENCODING);
1672 if (encoding !=
NULL) {
1682 "encoding %s not supported\n", encoding);
1692 if(inputStream ==
NULL)
1694 buf = inputStream->buf;
1700 node = xmlNewDocText(ctxt->doc,
NULL);
1702 xmlXIncludeErrMemory(ctxt,
ref->elem,
NULL);
1714 for (
i = 0;
i <
len;) {
1722 "%s contains invalid char\n", URL);
1731 if (ctxt->txtNr >= ctxt->txtMax) {
1732 xmlXIncludeTxt *tmp;
1733#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
1734 size_t newSize = ctxt->txtMax ? ctxt->txtMax * 2 : 1;
1736 size_t newSize = ctxt->txtMax ? ctxt->txtMax * 2 : 8;
1739 tmp =
xmlRealloc(ctxt->txtTab,
sizeof(xmlXIncludeTxt) * newSize);
1741 xmlXIncludeErrMemory(ctxt,
ref->elem,
1742 "growing XInclude text table");
1745 ctxt->txtMax = newSize;
1749 ctxt->txtTab[ctxt->txtNr].url =
xmlStrdup(URL);
1782xmlXIncludeLoadFallback(xmlXIncludeCtxtPtr ctxt, xmlNodePtr fallback,
1783 xmlXIncludeRefPtr
ref) {
1787 if ((fallback ==
NULL) || (fallback->type == XML_NAMESPACE_DECL) ||
1790 if (fallback->children !=
NULL) {
1795 oldNbErrors = ctxt->nbErrors;
1796 ref->inc = xmlXIncludeCopyNode(ctxt, fallback, 1);
1797 if (ctxt->nbErrors > oldNbErrors)
1825static xmlXIncludeRefPtr
1826xmlXIncludeExpandNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
node) {
1827 xmlXIncludeRefPtr
ref;
1832 if (ctxt->depth >= XINCLUDE_MAX_DEPTH) {
1834 "maximum recursion depth exceeded\n",
NULL);
1839#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
1859 if (ctxt->incTotal >= 20)
1864 for (
i = 0;
i < ctxt->incNr;
i++) {
1865 if (ctxt->incTab[
i]->elem ==
node) {
1866 if (ctxt->incTab[
i]->expanding) {
1868 "inclusion loop detected\n",
NULL);
1871 return(ctxt->incTab[
i]);
1875 ref = xmlXIncludeAddNode(ctxt,
node);
1880 xmlXIncludeLoadNode(ctxt,
ref);
1897xmlXIncludeLoadNode(xmlXIncludeCtxtPtr ctxt, xmlXIncludeRefPtr
ref) {
1916 href = xmlXIncludeGetProp(ctxt,
cur, XINCLUDE_HREF);
1922 parse = xmlXIncludeGetProp(ctxt,
cur, XINCLUDE_PARSE);
1923 if (parse !=
NULL) {
1930 "invalid value %s for 'parse'\n", parse);
1942 base = xmlNodeGetBase(ctxt->doc,
cur);
1957 if (escbase !=
NULL)
1959 if (eschref !=
NULL)
1964 "failed build URL\n",
NULL);
1977 oldBase = ctxt->base;
1981 ret = xmlXIncludeLoadDoc(ctxt, URI,
ref);
1984 ret = xmlXIncludeLoadTxt(ctxt, URI,
ref);
1990 ctxt->base = oldBase;
1993 xmlNodePtr children;
1998 children =
cur->children;
1999 while (children !=
NULL) {
2000 if ((children->type == XML_ELEMENT_NODE) &&
2001 (children->ns !=
NULL) &&
2002 (
xmlStrEqual(children->name, XINCLUDE_FALLBACK)) &&
2003 ((
xmlStrEqual(children->ns->href, XINCLUDE_NS)) ||
2004 (
xmlStrEqual(children->ns->href, XINCLUDE_OLD_NS)))) {
2005 ret = xmlXIncludeLoadFallback(ctxt, children,
ref);
2008 children = children->next;
2013 "could not load %s, and no fallback was found\n",
2041xmlXIncludeIncludeNode(xmlXIncludeCtxtPtr ctxt, xmlXIncludeRefPtr
ref) {
2047 if ((
cur ==
NULL) || (
cur->type == XML_NAMESPACE_DECL))
2058 (
cur->parent->type != XML_ELEMENT_NODE)) {
2062 while (tmp !=
NULL) {
2063 if (tmp->type == XML_ELEMENT_NODE)
2069 "XInclude error: would result in multiple root nodes\n",
2071 xmlFreeNodeList(
list);
2084 xmlAddPrevSibling(
cur,
end);
2100 cur->type = XML_XINCLUDE_START;
2104 xmlUnlinkNode(
child);
2110 "failed to build node\n",
NULL);
2111 xmlFreeNodeList(
list);
2114 end->type = XML_XINCLUDE_END;
2115 xmlAddNextSibling(
cur,
end);
2124 xmlAddPrevSibling(
end,
cur);
2142xmlXIncludeTestNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
node) {
2145 if (
node->type != XML_ELEMENT_NODE)
2152 if (ctxt->legacy == 0) {
2155 "Deprecated XInclude namespace found, use %s",
2163 int nb_fallback = 0;
2166 if ((
child->type == XML_ELEMENT_NODE) &&
2171 xmlXIncludeErr(ctxt,
node,
2173 "%s has an 'include' child\n",
2183 if (nb_fallback > 1) {
2185 "%s has multiple fallback children\n",
2193 (
node->parent->type != XML_ELEMENT_NODE) ||
2198 xmlXIncludeErr(ctxt,
node,
2200 "%s is not the child of an 'include'\n",
2219xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
tree) {
2220 xmlXIncludeRefPtr
ref;
2225 if ((
tree ==
NULL) || (
tree->type == XML_NAMESPACE_DECL))
2233 start = ctxt->incNr;
2237 if (xmlXIncludeTestNode(ctxt,
cur) == 1) {
2238 ref = xmlXIncludeExpandNode(ctxt,
cur);
2244 }
else if ((
cur->children !=
NULL) &&
2245 ((
cur->type == XML_DOCUMENT_NODE) ||
2246 (
cur->type == XML_ELEMENT_NODE))) {
2264 for (
i =
start;
i < ctxt->incNr;
i++) {
2265 if (ctxt->incTab[
i]->replace != 0) {
2266 if ((ctxt->incTab[
i]->inc !=
NULL) ||
2267 (ctxt->incTab[
i]->emptyFb != 0)) {
2268 xmlXIncludeIncludeNode(ctxt, ctxt->incTab[
i]);
2270 ctxt->incTab[
i]->replace = 0;
2276 if (ctxt->incTab[
i]->inc !=
NULL) {
2277 xmlFreeNodeList(ctxt->incTab[
i]->inc);
2278 ctxt->incTab[
i]->inc =
NULL;
2284 if (ctxt->isStream) {
2290 for (
i = 0;
i < ctxt->incNr;
i++) {
2291 xmlXIncludeFreeRef(ctxt->incTab[
i]);
2309xmlXIncludeSetFlags(xmlXIncludeCtxtPtr ctxt,
int flags) {
2312 ctxt->parseFlags =
flags;
2329 ctxt->isStream = !!
mode;
2347xmlXIncludeProcessTreeFlagsData(xmlNodePtr
tree,
int flags,
void *
data) {
2348 xmlXIncludeCtxtPtr ctxt;
2351 if ((
tree ==
NULL) || (
tree->type == XML_NAMESPACE_DECL) ||
2355 ctxt = xmlXIncludeNewContext(
tree->doc);
2358 ctxt->_private =
data;
2360 xmlXIncludeSetFlags(ctxt,
flags);
2361 ret = xmlXIncludeDoProcess(ctxt,
tree);
2362 if ((
ret >= 0) && (ctxt->nbErrors > 0))
2365 xmlXIncludeFreeContext(ctxt);
2382xmlXIncludeProcessFlagsData(xmlDocPtr doc,
int flags,
void *
data) {
2387 tree = xmlDocGetRootElement(doc);
2404xmlXIncludeProcessFlags(xmlDocPtr doc,
int flags) {
2405 return xmlXIncludeProcessFlagsData(doc,
flags,
NULL);
2418xmlXIncludeProcess(xmlDocPtr doc) {
2419 return(xmlXIncludeProcessFlags(doc, 0));
2433xmlXIncludeProcessTreeFlags(xmlNodePtr
tree,
int flags) {
2434 xmlXIncludeCtxtPtr ctxt;
2437 if ((
tree ==
NULL) || (
tree->type == XML_NAMESPACE_DECL) ||
2440 ctxt = xmlXIncludeNewContext(
tree->doc);
2443 ctxt->base = xmlNodeGetBase(
tree->doc,
tree);
2444 xmlXIncludeSetFlags(ctxt,
flags);
2445 ret = xmlXIncludeDoProcess(ctxt,
tree);
2446 if ((
ret >= 0) && (ctxt->nbErrors > 0))
2449 xmlXIncludeFreeContext(ctxt);
2463xmlXIncludeProcessTree(xmlNodePtr
tree) {
2464 return(xmlXIncludeProcessTreeFlags(
tree, 0));
2479xmlXIncludeProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr
node) {
2482 if ((
node ==
NULL) || (
node->type == XML_NAMESPACE_DECL) ||
2485 ret = xmlXIncludeDoProcess(ctxt,
node);
2486 if ((
ret >= 0) && (ctxt->nbErrors > 0))
INT copy(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], INT append, DWORD lpdwFlags, BOOL bTouch)
size_t xmlBufLength(const xmlBufPtr buf)
xmlChar * xmlBufContent(const xmlBuf *buf)
static WCHAR no[MAX_STRING_RESOURCE_LEN]
_ACRTIMP int __cdecl strcmp(const char *, const char *)
xmlCharEncodingHandlerPtr xmlGetCharEncodingHandler(xmlCharEncoding enc)
xmlCharEncoding xmlParseCharEncoding(const char *name)
@ XML_CHAR_ENCODING_ERROR
XMLPUBFUN int xmlCharEncCloseFunc(xmlCharEncodingHandler *handler)
GLint GLint GLsizei GLsizei GLsizei depth
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
XMLPUBFUN xmlEntityPtr xmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type, const xmlChar *ExternalID, const xmlChar *SystemID, const xmlChar *content)
XMLPUBFUN xmlEntityPtr xmlGetDocEntity(const xmlDoc *doc, const xmlChar *name)
@ XML_EXTERNAL_GENERAL_PARSED_ENTITY
@ XML_INTERNAL_PREDEFINED_ENTITY
@ XML_EXTERNAL_GENERAL_UNPARSED_ENTITY
@ XML_INTERNAL_GENERAL_ENTITY
@ XML_INTERNAL_PARAMETER_ENTITY
@ XML_EXTERNAL_PARAMETER_ENTITY
BOOLEAN isStream(PUNICODE_STRING name)
XMLPUBFUN void xmlFreeInputStream(xmlParserInputPtr input)
XMLPUBFUN int inputPush(xmlParserCtxtPtr ctxt, xmlParserInputPtr value)
XML_HIDDEN int xmlXIncludeSetStreamingMode(xmlXIncludeCtxtPtr ctxt, int mode)
static unsigned __int64 next
INT replace(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], DWORD dwFlags, BOOL *doMore)
void xmlDictFree(xmlDictPtr dict)
int xmlDictReference(xmlDictPtr dict)
xmlReallocFunc xmlRealloc
void xmlHashScan(xmlHashTablePtr hash, xmlHashScanner scan, void *data)
XMLPUBFUN int xmlParseDocument(xmlParserCtxtPtr ctxt)
XMLPUBFUN int xmlCtxtUseOptions(xmlParserCtxtPtr ctxt, int options)
XMLPUBFUN xmlParserInputPtr xmlLoadExternalEntity(const char *URL, const char *ID, xmlParserCtxtPtr ctxt)
XML_GLOBALS_PARSER XMLPUBFUN void xmlInitParser(void)
XMLPUBFUN void xmlFreeParserCtxt(xmlParserCtxtPtr ctxt)
XMLPUBFUN xmlParserCtxtPtr xmlNewParserCtxt(void)
XML_HIDDEN void __xmlRaiseError(xmlStructuredErrorFunc schannel, xmlGenericErrorFunc channel, void *data, void *ctx, void *nod, int domain, int code, xmlErrorLevel level, const char *file, int line, const char *str1, const char *str2, const char *str3, int int1, int col, const char *msg,...) LIBXML_ATTR_FORMAT(16
XML_HIDDEN xmlNodePtr xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent)
XML_HIDDEN xmlNodePtr xmlStaticCopyNode(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent, int extended)
XMLPUBFUN xmlChar * xmlBuildURI(const xmlChar *URI, const xmlChar *base)
XMLPUBFUN xmlChar * xmlURIEscape(const xmlChar *str)
XMLPUBFUN void xmlFreeURI(xmlURIPtr uri)
XMLPUBFUN xmlChar * xmlBuildRelativeURI(const xmlChar *URI, const xmlChar *base)
XMLPUBFUN xmlURIPtr xmlParseURI(const char *str)
XMLPUBFUN xmlChar * xmlSaveUri(xmlURIPtr uri)
XMLPUBFUN char * xmlParserGetDirectory(const char *filename)
XMLPUBFUN int xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len)
@ XML_XINCLUDE_ENTITY_DEF_MISMATCH
@ XML_XINCLUDE_INCLUDE_IN_INCLUDE
@ XML_XINCLUDE_TEXT_FRAGMENT
@ XML_XINCLUDE_UNKNOWN_ENCODING
@ XML_XINCLUDE_XPTR_FAILED
@ XML_XINCLUDE_INVALID_CHAR
@ XML_XINCLUDE_XPTR_RESULT
@ XML_XINCLUDE_DEPRECATED_NS
@ XML_XINCLUDE_PARSE_VALUE
@ XML_XINCLUDE_TEXT_DOCUMENT
@ XML_XINCLUDE_FALLBACKS_IN_INCLUDE
@ XML_XINCLUDE_MULTIPLE_ROOT
@ XML_XINCLUDE_NO_FALLBACK
@ XML_XINCLUDE_FRAGMENT_ID
@ XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE
@ XML_XINCLUDE_BUILD_FAILED
XMLPUBFUN int XMLPUBFUN int XMLPUBFUN int xmlGetUTF8Char(const unsigned char *utf, int *len)
XMLPUBFUN int xmlStrcmp(const xmlChar *str1, const xmlChar *str2)
XMLPUBFUN int xmlStrEqual(const xmlChar *str1, const xmlChar *str2)
XMLPUBFUN const xmlChar * xmlStrchr(const xmlChar *str, xmlChar val)
XMLPUBFUN xmlChar * xmlStrdup(const xmlChar *cur)
#define LIBXML_ATTR_FORMAT(fmt, args)