15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xinclude.c : Code to implement XInclude processing 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * World Wide Web Consortium W3C Last Call Working Draft 10 November 2003 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.w3.org/TR/2003/WD-xinclude-20031110 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xpointer.h> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/encoding.h> 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XINCLUDE_ENABLED 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xinclude.h> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XINCLUDE_MAX_DEPTH 40 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_XINCLUDE */ 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/debugXML.h> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XInclude context handling * 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * An XInclude context 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlChar *xmlURL; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlXIncludeRef xmlXIncludeRef; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlXIncludeRef *xmlXIncludeRefPtr; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlXIncludeRef { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URI; /* the fully resolved resource URL */ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *fragment; /* the fragment in the URI */ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; /* the parsed document */ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ref; /* the node making the reference in the source */ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inc; /* the included copy */ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int xml; /* xml or txt */ 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count; /* how many refs use that specific doc */ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathObjectPtr xptr; /* the xpointer if needed */ 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int emptyFb; /* flag to show fallback empty */ 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlXIncludeCtxt { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; /* the source document */ 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int incBase; /* the first include for this document */ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int incNr; /* number of includes */ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int incMax; /* size of includes tab */ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeRefPtr *incTab; /* array of included references */ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int txtNr; /* number of unparsed documents */ 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int txtMax; /* size of unparsed documents tab */ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr *txtTab; /* array of unparsed text nodes */ 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlURL *txturlTab; /* array of unparsed text URLs */ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar * url; /* the current URL processed */ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int urlNr; /* number of URLs stacked */ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int urlMax; /* size of URL stack */ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar * *urlTab; /* URL stack */ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbErrors; /* the number of errors detected */ 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int legacy; /* using XINCLUDE_OLD_NS */ 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int parseFlags; /* the flags used for parsing XML documents */ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar * base; /* the current xml:base */ 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *_private; /* application data */ 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XInclude error handler * 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeErrMemory: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra: extra information 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeErrMemory(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *extra) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nbErrors++; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra, NULL, NULL, 0, 0, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Memory allocation failed : %s\n", extra); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeErr: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the context node 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: the error message 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra: extra information 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an XInclude error 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeErr(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, int error, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *msg, const xmlChar *extra) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt != NULL) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nbErrors++; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error, XML_ERR_ERROR, NULL, 0, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) extra, NULL, NULL, 0, 0, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg, (const char *) extra); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeWarn: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the context node 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: the error message 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra: extra information 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Emit an XInclude warning. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeWarn(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node, int error, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *msg, const xmlChar *extra) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlRaiseError(NULL, NULL, NULL, ctxt, node, XML_FROM_XINCLUDE, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error, XML_ERR_WARNING, NULL, 0, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const char *) extra, NULL, NULL, 0, 0, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg, (const char *) extra); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeGetProp: 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the node 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the attribute name 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get an XInclude attribute 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the value (to be freed) or NULL if not found 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar * 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeGetProp(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *name) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *ret; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlGetNsProp(cur, XINCLUDE_NS, name); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->legacy != 0) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlGetNsProp(cur, XINCLUDE_OLD_NS, name); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlGetProp(cur, name); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeFreeRef: 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ref: the XInclude reference 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free an XInclude reference 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeFreeRef(xmlXIncludeRefPtr ref) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ref == NULL) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Freeing ref\n"); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ref->doc != NULL) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Freeing doc %s\n", ref->URI); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(ref->doc); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ref->URI != NULL) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ref->URI); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ref->fragment != NULL) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ref->fragment); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ref->xptr != NULL) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(ref->xptr); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ref); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeNewRef: 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URI: the resource URI 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates a new reference within an XInclude context 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new set 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlXIncludeRefPtr 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeNewRef(xmlXIncludeCtxtPtr ctxt, const xmlChar *URI, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ref) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeRefPtr ret; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "New ref %s\n", URI); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlXIncludeRefPtr) xmlMalloc(sizeof(xmlXIncludeRef)); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlXIncludeRef)); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI == NULL) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->URI = NULL; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->URI = xmlStrdup(URI); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->fragment = NULL; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ref = ref; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = NULL; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->count = 0; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->xml = 0; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->inc = NULL; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incMax == 0) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incMax = 4; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(ctxt->incMax * 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->incTab[0])); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incTab == NULL) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeFreeRef(ret); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incNr >= ctxt->incMax) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incMax *= 2; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab = (xmlXIncludeRefPtr *) xmlRealloc(ctxt->incTab, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incMax * sizeof(ctxt->incTab[0])); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incTab == NULL) { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, ref, "growing XInclude context"); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeFreeRef(ret); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[ctxt->incNr++] = ret; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeNewContext: 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: an XML Document 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates a new XInclude context 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new set 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeCtxtPtr 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeNewContext(xmlDocPtr doc) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCtxtPtr ret; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "New context\n"); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlXIncludeCtxtPtr) xmlMalloc(sizeof(xmlXIncludeCtxt)); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(NULL, (xmlNodePtr) doc, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "creating XInclude context"); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlXIncludeCtxt)); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = doc; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->incNr = 0; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->incBase = 0; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->incMax = 0; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->incTab = NULL; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->nbErrors = 0; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeURLPush: 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the url 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pushes a new url on top of the url stack 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error, the index in the stack otherwise 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeURLPush(xmlXIncludeCtxtPtr ctxt, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *value) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->urlNr > XINCLUDE_MAX_DEPTH) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, NULL, XML_XINCLUDE_RECURSION, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "detected a recursion in %s\n", value); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->urlTab == NULL) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlMax = 4; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlNr = 0; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlTab = (xmlChar * *) xmlMalloc( 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlMax * sizeof(ctxt->urlTab[0])); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->urlTab == NULL) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, NULL, "adding URL"); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->urlNr >= ctxt->urlMax) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlMax *= 2; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlTab = 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlChar * *) xmlRealloc(ctxt->urlTab, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlMax * 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->urlTab[0])); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->urlTab == NULL) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, NULL, "adding URL"); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->url = ctxt->urlTab[ctxt->urlNr] = xmlStrdup(value); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ctxt->urlNr++); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeURLPop: 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the parser context 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pops the top URL from the URL stack 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeURLPop(xmlXIncludeCtxtPtr ctxt) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar * ret; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->urlNr <= 0) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlNr--; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->urlNr > 0) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->url = ctxt->urlTab[ctxt->urlNr - 1]; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->url = NULL; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->urlTab[ctxt->urlNr]; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlTab[ctxt->urlNr] = NULL; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ret); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeFreeContext: 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free an XInclude context 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeFreeContext(xmlXIncludeCtxtPtr ctxt) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Freeing context\n"); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ctxt->urlNr > 0) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeURLPop(ctxt); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->urlTab != NULL) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->urlTab); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < ctxt->incNr;i++) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incTab[i] != NULL) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeFreeRef(ctxt->incTab[i]); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txturlTab != NULL) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < ctxt->txtNr;i++) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txturlTab[i] != NULL) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->txturlTab[i]); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incTab != NULL) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->incTab); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txtTab != NULL) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->txtTab); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txturlTab != NULL) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->txturlTab); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->base != NULL) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->base); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeParseFile: 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the URL or file path 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse a document for XInclude 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlDocPtr 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeParseFile(xmlXIncludeCtxtPtr ctxt, const char *URL) { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr ret; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserCtxtPtr pctxt; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputPtr inputStream; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlInitParser(); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pctxt = xmlNewParserCtxt(); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pctxt == NULL) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, NULL, "cannot allocate parser context"); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pass in the application data to the parser context. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pctxt->_private = ctxt->_private; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * try to ensure that new documents included are actually 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * built with the same dictionary as the including document. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->doc != NULL) && (ctxt->doc->dict != NULL)) { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pctxt->dict != NULL) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictFree(pctxt->dict); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pctxt->dict = ctxt->doc->dict; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictReference(pctxt->dict); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCtxtUseOptions(pctxt, ctxt->parseFlags | XML_PARSE_DTDLOAD); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputStream = xmlLoadExternalEntity(URL, NULL, pctxt); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inputStream == NULL) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserCtxt(pctxt); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inputPush(pctxt, inputStream); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pctxt->directory == NULL) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pctxt->directory = xmlParserGetDirectory(URL); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pctxt->loadsubset |= XML_DETECT_IDS; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParseDocument(pctxt); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pctxt->wellFormed) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = pctxt->myDoc; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = NULL; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pctxt->myDoc != NULL) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(pctxt->myDoc); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pctxt->myDoc = NULL; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserCtxt(pctxt); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeAddNode: 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the new node 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a new node to process to an XInclude context 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeAddNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr cur) { 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeRefPtr ref; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlURIPtr uri; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URL; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *fragment = NULL; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *href; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *parse; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *base; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URI; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int xml = 1, i; /* default Issue 64 */ 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int local = 0; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Add node\n"); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * read the attributes 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href == NULL) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href == NULL) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((href[0] == '#') || (href[0] == 0)) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local = 1; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parse != NULL) { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xml = 1; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xml = 0; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_PARSE_VALUE, 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value %s for 'parse'\n", parse); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parse != NULL) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(parse); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compute the URI 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = xmlNodeGetBase(ctxt->doc, cur); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base == NULL) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xmlBuildURI(href, ctxt->doc->URL); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xmlBuildURI(href, base); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI == NULL) { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *escbase; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *eschref; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some escaping may be needed 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) escbase = xmlURIEscape(base); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eschref = xmlURIEscape(href); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xmlBuildURI(eschref, escbase); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (escbase != NULL) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(escbase); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eschref != NULL) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(eschref); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parse != NULL) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(parse); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI == NULL) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "failed build URL\n", NULL); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE_XPOINTER); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check the URL and remove any fragment identifier 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri = xmlParseURI((const char *)URI); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri == NULL) { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value URI %s\n", URI); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment != NULL) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URI); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri->fragment != NULL) { 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->legacy != 0) { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment == NULL) { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment = (xmlChar *) uri->fragment; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(uri->fragment); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_FRAGMENT_ID, 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Invalid fragment identifier in URI %s use the xpointer attribute\n", 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment != NULL) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URI); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri->fragment = NULL; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xmlSaveUri(uri); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URI); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_HREF_URI, 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value URI %s\n", URI); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment != NULL) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If local and xml then we need a fragment 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((local == 1) && (xml == 1) && 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((fragment == NULL) || (fragment[0] == 0))) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_RECURSION, 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "detected a local recursion with no xpointer in %s\n", 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment != NULL) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check the URL against the stack for recursions 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((!local) && (xml == 1)) { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < ctxt->urlNr;i++) { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(URL, ctxt->urlTab[i])) { 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, cur, XML_XINCLUDE_RECURSION, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "detected a recursion in %s\n", URL); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref = xmlXIncludeNewRef(ctxt, URL, cur); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ref == NULL) { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref->fragment = fragment; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref->doc = NULL; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref->xml = xml; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref->count = 1; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeRecurseDoc: 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the new document 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @url: the associated URL 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The XInclude recursive nature is handled at this point. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeRecurseDoc(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlURL url ATTRIBUTE_UNUSED) { 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCtxtPtr newctxt; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Avoid recursion in already substitued resources 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < ctxt->urlNr;i++) { 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(doc->URL, ctxt->urlTab[i])) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Recursing in doc %s\n", doc->URL); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle recursion here. 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt = xmlXIncludeNewContext(doc); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (newctxt != NULL) { 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy the private user data 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->_private = ctxt->_private; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy the existing document set 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->incMax = ctxt->incMax; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->incNr = ctxt->incNr; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->incTab = (xmlXIncludeRefPtr *) xmlMalloc(newctxt->incMax * 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(newctxt->incTab[0])); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (newctxt->incTab == NULL) { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, (xmlNodePtr) doc, "processing doc"); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(newctxt); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy the urlTab 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->urlMax = ctxt->urlMax; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->urlNr = ctxt->urlNr; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->urlTab = ctxt->urlTab; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Inherit the existing base 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->base = xmlStrdup(ctxt->base); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Inherit the documents already in use by other includes 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->incBase = ctxt->incNr; 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < ctxt->incNr;i++) { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->incTab[i] = ctxt->incTab[i]; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->incTab[i]->count++; /* prevent the recursion from 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) freeing it */ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The new context should also inherit the Parse Flags 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (bug 132597) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->parseFlags = ctxt->parseFlags; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeDoProcess(newctxt, doc, xmlDocGetRootElement(doc)); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < ctxt->incNr;i++) { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->incTab[i]->count--; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->incTab[i] = NULL; 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* urlTab may have been reallocated */ 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlTab = newctxt->urlTab; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->urlMax = newctxt->urlMax; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->urlMax = 0; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->urlNr = 0; 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->urlTab = NULL; 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeFreeContext(newctxt); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Done recursing in doc %s\n", url); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeAddTxt: 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @txt: the new text node 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @url: the associated URL 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a new txtument to the list 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeAddTxt(xmlXIncludeCtxtPtr ctxt, xmlNodePtr txt, const xmlURL url) { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Adding text %s\n", url); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txtMax == 0) { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txtMax = 4; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txtTab = (xmlNodePtr *) xmlMalloc(ctxt->txtMax * 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->txtTab[0])); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txtTab == NULL) { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, NULL, "processing text"); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txturlTab = (xmlURL *) xmlMalloc(ctxt->txtMax * 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->txturlTab[0])); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txturlTab == NULL) { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, NULL, "processing text"); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txtNr >= ctxt->txtMax) { 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txtMax *= 2; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txtTab = (xmlNodePtr *) xmlRealloc(ctxt->txtTab, 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txtMax * sizeof(ctxt->txtTab[0])); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txtTab == NULL) { 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, NULL, "processing text"); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txturlTab = (xmlURL *) xmlRealloc(ctxt->txturlTab, 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txtMax * sizeof(ctxt->txturlTab[0])); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->txturlTab == NULL) { 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErrMemory(ctxt, NULL, "processing text"); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txtTab[ctxt->txtNr] = txt; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txturlTab[ctxt->txtNr] = xmlStrdup(url); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->txtNr++; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Node copy with specific semantic * 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr source, xmlNodePtr elem); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeCopyNode: 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the document target 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @source: the document source 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem: the element 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make a copy of the node while preserving the XInclude semantic 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Infoset copy 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr source, xmlNodePtr elem) { 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr result = NULL; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (target == NULL) || (source == NULL) || 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (elem == NULL)) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elem->type == XML_DTD_NODE) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elem->type == XML_DOCUMENT_NODE) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = xmlXIncludeCopyNodeList(ctxt, target, source, elem->children); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = xmlDocCopyNode(elem, target, 1); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(result); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeCopyNodeList: 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the document target 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @source: the document source 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem: the element list 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make a copy of the node list while preserving the XInclude semantic 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Infoset copy 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeCopyNodeList(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr source, xmlNodePtr elem) { 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur, res, result = NULL, last = NULL; 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (target == NULL) || (source == NULL) || 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (elem == NULL)) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = elem; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlXIncludeCopyNode(ctxt, target, source, cur); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == NULL) { 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = last = res; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last->next = res; 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->prev = last; 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = res; 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(result); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeGetNthChild: 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the node 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @no: the child number 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the @n'th element child of @cur or NULL 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeGetNthChild(xmlNodePtr cur, int no) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->children; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i <= no;cur = cur->next) { 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_ELEMENT_NODE) || 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_DOCUMENT_NODE) || 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_HTML_DOCUMENT_NODE)) { 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++; 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == no) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr xmlXPtrAdvanceNode(xmlNodePtr cur, int *level); /* in xpointer.c */ 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeCopyRange: 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the document target 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @source: the document source 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @obj: the XPointer result from the evaluation. 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Build a node list tree copy of the XPointer result. 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an xmlNodePtr list or NULL. 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The caller has to free the node tree. 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeCopyRange(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr source, xmlXPathObjectPtr range) { 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* pointers to generated nodes */ 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr list = NULL, last = NULL, listParent = NULL; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp, tmp2; 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* pointers to traversal nodes */ 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr start, cur, end; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index1, index2; 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int level = 0, lastLevel = 0, endLevel = 0, endFlag = 0; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (target == NULL) || (source == NULL) || 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (range == NULL)) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (range->type != XPATH_RANGE) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = (xmlNodePtr) range->user; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (start == NULL) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = range->user2; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (end == NULL) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlDocCopyNode(start, target, 1)); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = start; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index1 = range->index; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index2 = range->index2; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * level is depth of the current node under consideration 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * list is the pointer to the root of the output tree 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * listParent is a pointer to the parent of output tree (within 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the included file) in case we need to add another level 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * last is a pointer to the last node added to the output tree 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * lastLevel is the depth of last (relative to the root) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if our output tree needs a parent 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (level < 0) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (level < 0) { 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* copy must include namespaces and properties */ 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp2 = xmlDocCopyNode(listParent, target, 2); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddChild(tmp2, list); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = tmp2; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listParent = listParent->parent; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) level++; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = list; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastLevel = 0; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check whether we need to change our insertion point 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (level < lastLevel) { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = last->parent; 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastLevel --; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == end) { /* Are we at the end of the range? */ 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_TEXT_NODE) { 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *content = cur->content; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content == NULL) { 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlNewTextLen(NULL, 0); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = index2; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur == start) && (index1 > 1)) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content += (index1 - 1); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len -= (index1 - 1); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = index2; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlNewTextLen(content, len); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* single sub text node selection */ 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(tmp); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* prune and return full set */ 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (level == lastLevel) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddNextSibling(last, tmp); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddChild(last, tmp); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(list); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { /* ending node not a text node */ 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) endLevel = level; /* remember the level of the end node */ 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) endFlag = 1; 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* last node - need to take care of properties + namespaces */ 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlDocCopyNode(cur, target, 2); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) { 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = tmp; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listParent = cur->parent; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (level == lastLevel) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddNextSibling(last, tmp); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddChild(last, tmp); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastLevel = level; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = tmp; 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index2 > 1) { 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = xmlXIncludeGetNthChild(cur, index2 - 1); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index2 = 0; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur == start) && (index1 > 1)) { 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlXIncludeGetNthChild(cur, index1 - 1); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index1 = 0; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->children; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) level++; /* increment level to show change */ 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Now gather the remaining nodes from cur to end 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; /* while */ 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur == start) { /* Not at the end, are we at start? */ 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_TEXT_NODE) || 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_CDATA_SECTION_NODE)) { 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *content = cur->content; 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content == NULL) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlNewTextLen(NULL, 0); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index1 > 1) { 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content += (index1 - 1); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index1 = 0; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlNewText(content); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = list = tmp; 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listParent = cur->parent; 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { /* Not text node */ 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * start of the range - need to take care of 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * properties and namespaces 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlDocCopyNode(cur, target, 2); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = last = tmp; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listParent = cur->parent; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index1 > 1) { /* Do we need to position? */ 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlXIncludeGetNthChild(cur, index1 - 1); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) level = lastLevel = 1; 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index1 = 0; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Now gather the remaining nodes from cur to end 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; /* while */ 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = NULL; 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (cur->type) { 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DTD_NODE: 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_DECL: 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_DECL: 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_NODE: 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Do not copy DTD informations */ 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_DECL: 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* handle crossing entities -> stack needed */ 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_START: 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_END: 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* don't consider it part of the tree content */ 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Humm, should not happen ! */ 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Middle of the range - need to take care of 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * properties and namespaces 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlDocCopyNode(cur, target, 2); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp != NULL) { 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (level == lastLevel) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddNextSibling(last, tmp); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddChild(last, tmp); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastLevel = level; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = tmp; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Skip to next node in document order 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlXPtrAdvanceNode(cur, &level); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (endFlag && (level >= endLevel)) 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(list); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeBuildNodeList: 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the document target 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @source: the document source 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @obj: the XPointer result from the evaluation. 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Build a node list tree copy of the XPointer result. 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This will drop Attributes and Namespace declarations. 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an xmlNodePtr list or NULL. 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the caller has to free the node tree. 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeCopyXPointer(xmlXIncludeCtxtPtr ctxt, xmlDocPtr target, 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr source, xmlXPathObjectPtr obj) { 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr list = NULL, last = NULL; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (source == NULL) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source = ctxt->doc; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (target == NULL) || (source == NULL) || 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (obj == NULL)) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (obj->type) { 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_NODESET: { 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetPtr set = obj->nodesetval; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (set == NULL) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < set->nodeNr;i++) { 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (set->nodeTab[i] == NULL) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (set->nodeTab[i]->type) { 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_REF_NODE: 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_NODE: 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCB_DOCUMENT_NODE: 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_END: 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_START: { 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp, cur = set->nodeTab[i]; 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(cur->type) { 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_REF_NODE: 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_NODE: 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xmlXIncludeCopyNode(ctxt, target, 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source, cur); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last == NULL) { 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = last = tmp; 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddNextSibling(last, tmp); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = tmp; 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_TYPE_NODE: 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_FRAG_NODE: 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NOTATION_NODE: 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DTD_NODE: 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_DECL: 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_DECL: 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_DECL: 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; /* for */ 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last == NULL) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = last = xmlXIncludeCopyNode(ctxt, target, source, 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set->nodeTab[i]); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddNextSibling(last, 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCopyNode(ctxt, target, source, 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set->nodeTab[i])); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last->next != NULL) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = last->next; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_LOCATIONSET: { 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlLocationSetPtr set = (xmlLocationSetPtr) obj->user; 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (set == NULL) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < set->locNr;i++) { 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last == NULL) 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = last = xmlXIncludeCopyXPointer(ctxt, target, source, 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set->locTab[i]); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddNextSibling(last, 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCopyXPointer(ctxt, target, source, 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set->locTab[i])); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last != NULL) { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (last->next != NULL) 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = last->next; 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPTR_ENABLED 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_RANGE: 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlXIncludeCopyRange(ctxt, target, source, obj)); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_POINT: 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* points are ignored in XInclude */ 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(list); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XInclude I/O handling * 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _xmlXIncludeMergeData xmlXIncludeMergeData; 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef xmlXIncludeMergeData *xmlXIncludeMergeDataPtr; 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xmlXIncludeMergeData { 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCtxtPtr ctxt; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeMergeOneEntity: 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ent: the entity 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the including doc 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nr: the entity name 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Inplements the merge of one entity 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeMergeEntity(xmlEntityPtr ent, xmlXIncludeMergeDataPtr data, 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *name ATTRIBUTE_UNUSED) { 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntityPtr ret, prev; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCtxtPtr ctxt; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ent == NULL) || (data == NULL)) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = data->ctxt; 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = data->doc; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (doc == NULL)) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ent->etype) { 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_PARAMETER_ENTITY: 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_PARAMETER_ENTITY: 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_PREDEFINED_ENTITY: 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_GENERAL_ENTITY: 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlAddDocEntity(doc, ent->name, ent->etype, ent->ExternalID, 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ent->SystemID, ent->content); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) { 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->URI != NULL) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->URI = xmlStrdup(ent->URI); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = xmlGetDocEntity(doc, ent->name); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prev != NULL) { 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->etype != prev->etype) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ent->SystemID != NULL) && (prev->SystemID != NULL)) { 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(ent->SystemID, prev->SystemID)) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((ent->ExternalID != NULL) && 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (prev->ExternalID != NULL)) { 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(ent->ExternalID, prev->ExternalID)) 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((ent->content != NULL) && (prev->content != NULL)) { 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(ent->content, prev->content)) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ent->etype) { 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_PARAMETER_ENTITY: 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_PARAMETER_ENTITY: 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_PREDEFINED_ENTITY: 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_GENERAL_ENTITY: 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, (xmlNodePtr) ent, XML_XINCLUDE_ENTITY_DEF_MISMATCH, 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mismatch in redefinition of entity %s\n", 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ent->name); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeMergeEntities: 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XInclude context 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the including doc 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @from: the included doc 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Inplements the entity merge 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if merge succeeded, -1 if some processing failed 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeMergeEntities(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr from) { 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDtdPtr target, source; 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((from == NULL) || (from->intSubset == NULL)) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target = doc->intSubset; 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target == NULL) { 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlDocGetRootElement(doc); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target = xmlCreateIntSubset(doc, cur->name, NULL, NULL); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target == NULL) 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source = from->intSubset; 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((source != NULL) && (source->entities != NULL)) { 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeMergeData data; 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.ctxt = ctxt; 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.doc = doc; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashScan((xmlHashTablePtr) source->entities, 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlHashScanner) xmlXIncludeMergeEntity, &data); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source = from->extSubset; 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((source != NULL) && (source->entities != NULL)) { 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeMergeData data; 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.ctxt = ctxt; 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.doc = doc; 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * don't duplicate existing stuff when external subsets are the same 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((!xmlStrEqual(target->ExternalID, source->ExternalID)) && 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(target->SystemID, source->SystemID))) { 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashScan((xmlHashTablePtr) source->entities, 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlHashScanner) xmlXIncludeMergeEntity, &data); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeLoadDoc: 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @url: the associated URL 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nr: the xinclude node number 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load the document, and store the result in the XInclude context 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of failure 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeLoadDoc(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr doc; 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlURIPtr uri; 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URL; 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *fragment = NULL; 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPTR_ENABLED 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int saveFlags; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "Loading doc %s:%d\n", url, nr); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check the URL and remove any fragment identifier 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri = xmlParseURI((const char *)url); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri == NULL) { 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_HREF_URI, 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value URI %s\n", url); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri->fragment != NULL) { 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment = (xmlChar *) uri->fragment; 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri->fragment = NULL; 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->incTab != NULL) && (ctxt->incTab[nr] != NULL) && 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->incTab[nr]->fragment != NULL)) { 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment != NULL) xmlFree(fragment); 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment = xmlStrdup(ctxt->incTab[nr]->fragment); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xmlSaveUri(uri); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) { 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->incTab != NULL) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_HREF_URI, 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value URI %s\n", url); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, NULL, 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_HREF_URI, 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value URI %s\n", url); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment != NULL) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handling of references to the local document are done 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * directly through ctxt->doc. 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((URL[0] == 0) || (URL[0] == '#') || 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ctxt->doc != NULL) && (xmlStrEqual(URL, ctxt->doc->URL)))) { 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = NULL; 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto loaded; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Prevent reloading twice the document. 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->incNr; i++) { 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xmlStrEqual(URL, ctxt->incTab[i]->URI)) && 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->incTab[i]->doc != NULL)) { 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt->incTab[i]->doc; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Already loaded %s\n", URL); 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto loaded; 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load it. 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("loading %s\n", URL); 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPTR_ENABLED 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If this is an XPointer evaluation, we want to assure that 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all entities have been resolved prior to processing the 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * referenced document 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) saveFlags = ctxt->parseFlags; 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment != NULL) { /* if this is an XPointer eval */ 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->parseFlags |= XML_PARSE_NOENT; 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = xmlXIncludeParseFile(ctxt, (const char *)URL); 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPTR_ENABLED 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->parseFlags = saveFlags; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment != NULL) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->doc = doc; 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It's possible that the requested URL has been mapped to a 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * completely different location (e.g. through a catalog entry). 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * To check for this, we compare the URL with that of the doc 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and change it if they disagree (bug 146988). 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrEqual(URL, doc->URL)) { 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xmlStrdup(doc->URL); 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = nr + 1; i < ctxt->incNr; i++) { 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(URL, ctxt->incTab[i]->URI)) { 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->count++; 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Increasing %s count since reused\n", URL); 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make sure we have all entities fixed up 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeMergeEntities(ctxt, ctxt->doc, doc); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We don't need the DTD anymore, free up space 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->intSubset != NULL) { 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode((xmlNodePtr) doc->intSubset); 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode((xmlNodePtr) doc->intSubset); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc->intSubset = NULL; 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->extSubset != NULL) { 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode((xmlNodePtr) doc->extSubset); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode((xmlNodePtr) doc->extSubset); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc->extSubset = NULL; 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeRecurseDoc(ctxt, doc, URL); 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)loaded: 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fragment == NULL) { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add the top children list as the replacement copy. 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Hopefully a DTD declaration won't be copied from 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the same document */ 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->inc = xmlCopyNodeList(ctxt->doc->children); 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->inc = xmlXIncludeCopyNodeList(ctxt, ctxt->doc, 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc, doc->children); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_XPTR_ENABLED 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Computes the XPointer expression and make a copy used 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * as the replacement copy. 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathObjectPtr xptr; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathContextPtr xptrctxt; 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetPtr set; 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xptrctxt = xmlXPtrNewContext(ctxt->doc, ctxt->incTab[nr]->ref, 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xptrctxt = xmlXPtrNewContext(doc, NULL, NULL); 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xptrctxt == NULL) { 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_XPTR_FAILED, 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "could not create XPointer context\n", NULL); 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xptr = xmlXPtrEval(fragment, xptrctxt); 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xptr == NULL) { 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_XPTR_FAILED, 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "XPointer evaluation failed: #%s\n", 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeContext(xptrctxt); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (xptr->type) { 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_UNDEFINED: 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_BOOLEAN: 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_NUMBER: 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_STRING: 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_POINT: 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_USERS: 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_XSLT_TREE: 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_XPTR_RESULT, 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "XPointer is not a range: #%s\n", 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment); 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeContext(xptrctxt); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_NODESET: 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xptr->nodesetval == NULL) || 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xptr->nodesetval->nodeNr <= 0)) { 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeContext(xptrctxt); 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_RANGE: 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XPATH_LOCATIONSET: 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set = xptr->nodesetval; 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (set != NULL) { 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < set->nodeNr;i++) { 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (set->nodeTab[i] == NULL) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (set->nodeTab[i]->type) { 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_REF_NODE: 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_NODE: 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCB_DOCUMENT_NODE: 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_XPTR_RESULT, 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "XPointer selects an attribute: #%s\n", 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set->nodeTab[i] = NULL; 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_XPTR_RESULT, 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "XPointer selects a namespace: #%s\n", 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set->nodeTab[i] = NULL; 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_TYPE_NODE: 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_FRAG_NODE: 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NOTATION_NODE: 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DTD_NODE: 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_DECL: 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_DECL: 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_DECL: 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_START: 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_END: 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_XPTR_RESULT, 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "XPointer selects unexpected nodes: #%s\n", 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set->nodeTab[i] = NULL; 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set->nodeTab[i] = NULL; 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; /* for */ 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->xptr = xptr; 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->inc = NULL; 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->inc = 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCopyXPointer(ctxt, ctxt->doc, doc, xptr); 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(xptr); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeContext(xptrctxt); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(fragment); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do the xml:base fixup if needed 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((doc != NULL) && (URL != NULL) && (xmlStrchr(URL, (xmlChar) '/')) && 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!(ctxt->parseFlags & XML_PARSE_NOBASEFIX)) && 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!(doc->parseFlags & XML_PARSE_NOBASEFIX))) { 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *base; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *curBase; 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The base is only adjusted if "necessary", i.e. if the xinclude node 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * has a base specified, or the URL is relative 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = xmlGetNsProp(ctxt->incTab[nr]->ref, BAD_CAST "base", 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XML_NAMESPACE); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base == NULL) { 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * No xml:base on the xinclude node, so we check whether the 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * URI base is different than (relative to) the context base 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curBase = xmlBuildRelativeURI(URL, ctxt->base); 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (curBase == NULL) { /* Error return */ 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_HREF_URI, 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "trying to build relative URI from %s\n", URL); 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the URI doesn't contain a slash, it's not relative */ 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrchr(curBase, (xmlChar) '/')) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(curBase); 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = curBase; 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) { /* Adjustment may be needed */ 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = ctxt->incTab[nr]->inc; 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (node != NULL) { 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Only work on element nodes */ 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_ELEMENT_NODE) { 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curBase = xmlNodeGetBase(node->doc, node); 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If no current base, set it */ 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (curBase == NULL) { 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetBase(node, base); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the current base is the same as the 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * URL of the document, then reset it to be 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the specified xml:base or the relative URI 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(curBase, node->doc->URL)) { 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetBase(node, base); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the element already has an xml:base 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * set, then relativise it if necessary 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *xmlBase; 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBase = xmlGetNsProp(node, 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "base", 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XML_NAMESPACE); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlBase != NULL) { 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *relBase; 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relBase = xmlBuildURI(xmlBase, base); 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (relBase == NULL) { /* error */ 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->ref, 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_HREF_URI, 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "trying to rebuild base from %s\n", 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBase); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetBase(node, relBase); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(relBase); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(xmlBase); 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(curBase); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = node->next; 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nr < ctxt->incNr) && (ctxt->incTab[nr]->doc != NULL) && 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->incTab[nr]->count <= 1)) { 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("freeing %s\n", ctxt->incTab[nr]->doc->URL); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(ctxt->incTab[nr]->doc); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->doc = NULL; 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeLoadTxt: 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @url: the associated URL 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nr: the xinclude node number 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load the content, and store the result in the XInclude context 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of failure 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeLoadTxt(xmlXIncludeCtxtPtr ctxt, const xmlChar *url, int nr) { 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlParserInputBufferPtr buf; 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node; 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlURIPtr uri; 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URL; 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *encoding = NULL; 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCharEncoding enc = (xmlCharEncoding) 0; 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check the URL and remove any fragment identifier 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri = xmlParseURI((const char *)url); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri == NULL) { 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value URI %s\n", url); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri->fragment != NULL) { 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_TEXT_FRAGMENT, 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "fragment identifier forbidden for text: %s\n", 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) uri->fragment); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xmlSaveUri(uri); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) { 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, XML_XINCLUDE_HREF_URI, 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value URI %s\n", url); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handling of references to the local document are done 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * directly through ctxt->doc. 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL[0] == 0) { 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_TEXT_DOCUMENT, 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text serialization of document not available\n", NULL); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Prevent reloading twice the document. 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->txtNr; i++) { 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(URL, ctxt->txturlTab[i])) { 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlCopyNode(ctxt->txtTab[i], 1); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto loaded; 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to get the encoding if available 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->incTab[nr] != NULL) && (ctxt->incTab[nr]->ref != NULL)) { 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoding = xmlGetProp(ctxt->incTab[nr]->ref, XINCLUDE_PARSE_ENCODING); 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encoding != NULL) { 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: we should not have to remap to the xmlCharEncoding 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * predefined set, a better interface than 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlParserInputBufferCreateFilename should allow any 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * encoding supported by iconv 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enc = xmlParseCharEncoding((const char *) encoding); 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enc == XML_CHAR_ENCODING_ERROR) { 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_UNKNOWN_ENCODING, 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "encoding %s not supported\n", encoding); 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(encoding); 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(encoding); 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load it. 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf = xmlParserInputBufferCreateFilename((const char *)URL, enc); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf == NULL) { 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = xmlNewText(NULL); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Scan all chars from the resource and add the to the node 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (xmlParserInputBufferRead(buf, 128) > 0) { 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *content; 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = xmlBufferContent(buf->buffer); 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = xmlBufferLength(buf->buffer); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < len;) { 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cur; 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int l; 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlStringCurrentChar(NULL, &content[i], &l); 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IS_CHAR(cur)) { 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_INVALID_CHAR, 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%s contains invalid char\n", URL); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(buf); 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeAddContentLen(node, &content[i], l); 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += l; 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferShrink(buf->buffer, len); 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeParserInputBuffer(buf); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeAddTxt(ctxt, node, URL); 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)loaded: 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add the element as the replacement copy. 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->inc = node; 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeLoadFallback: 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude context 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fallback: the fallback node 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nr: the xinclude node number 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load the content of the fallback node, and store the result 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the XInclude context 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success, -1 in case of failure 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeLoadFallback(xmlXIncludeCtxtPtr ctxt, xmlNodePtr fallback, int nr) { 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCtxtPtr newctxt; 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fallback == NULL) || (ctxt == NULL)) 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fallback->children != NULL) { 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It's possible that the fallback also has 'includes' 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Bug 129969), so we re-process the fallback just in case 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt = xmlXIncludeNewContext(ctxt->doc); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (newctxt == NULL) 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->_private = ctxt->_private; 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newctxt->base = xmlStrdup(ctxt->base); /* Inherit the base from the existing context */ 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeSetFlags(newctxt, ctxt->parseFlags); 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlXIncludeDoProcess(newctxt, ctxt->doc, fallback->children); 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->nbErrors > 0) 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ret > 0) 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; /* xmlXIncludeDoProcess can return +ve number */ 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeFreeContext(newctxt); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->inc = xmlDocCopyNodeList(ctxt->doc, 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fallback->children); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->inc = NULL; 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->emptyFb = 1; /* flag empty callback */ 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XInclude Processing * 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludePreProcessNode: 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XInclude context 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: an XInclude node 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the XInclude preprocessing, currently just adding the element 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for further processing. 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the result list or NULL in case of error 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludePreProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeAddNode(ctxt, node); 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeLoadNode: 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XInclude context 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nr: the node number 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find and load the infoset replacement for the given node. 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if substitution succeeded, -1 if some processing failed 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeLoadNode(xmlXIncludeCtxtPtr ctxt, int nr) { 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *href; 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *parse; 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *base; 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *oldBase; 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URI; 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int xml = 1; /* default Issue 64 */ 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nr < 0) || (nr >= ctxt->incNr)) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = ctxt->incTab[nr]->ref; 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * read the attributes 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_HREF); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href == NULL) { 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) href = xmlStrdup(BAD_CAST ""); /* @@@@ href is now optional */ 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href == NULL) 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parse = xmlXIncludeGetProp(ctxt, cur, XINCLUDE_PARSE); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parse != NULL) { 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(parse, XINCLUDE_PARSE_XML)) 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xml = 1; 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (xmlStrEqual(parse, XINCLUDE_PARSE_TEXT)) 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xml = 0; 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_PARSE_VALUE, 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value %s for 'parse'\n", parse); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parse != NULL) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(parse); 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compute the URI 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = xmlNodeGetBase(ctxt->doc, cur); 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base == NULL) { 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xmlBuildURI(href, ctxt->doc->URL); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xmlBuildURI(href, base); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI == NULL) { 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *escbase; 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *eschref; 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some escaping may be needed 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) escbase = xmlURIEscape(base); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eschref = xmlURIEscape(href); 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xmlBuildURI(eschref, escbase); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (escbase != NULL) 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(escbase); 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eschref != NULL) 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(eschref); 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI == NULL) { 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_HREF_URI, "failed build URL\n", NULL); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parse != NULL) 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(parse); 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "parse: %s\n", 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xml ? "xml": "text"); 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "URI: %s\n", URI); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Save the base for this include (saving the current one) 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldBase = ctxt->base; 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->base = base; 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xml) { 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlXIncludeLoadDoc(ctxt, URI, nr); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* xmlXIncludeGetFragment(ctxt, cur, URI); */ 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlXIncludeLoadTxt(ctxt, URI, nr); 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Restore the original base before checking for fallback 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->base = oldBase; 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr children; 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Time to try a fallback if availble 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_XINCLUDE 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "error looking for fallback\n"); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children = cur->children; 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (children != NULL) { 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((children->type == XML_ELEMENT_NODE) && 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (children->ns != NULL) && 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(children->name, XINCLUDE_FALLBACK)) && 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((xmlStrEqual(children->ns->href, XINCLUDE_NS)) || 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(children->ns->href, XINCLUDE_OLD_NS)))) { 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlXIncludeLoadFallback(ctxt, children, nr); 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children = children->next; 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_NO_FALLBACK, 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "could not load %s, and no fallback was found\n", 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI); 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI != NULL) 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URI); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parse != NULL) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(parse); 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (href != NULL) 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(href); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeIncludeNode: 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XInclude context 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nr: the node number 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Inplement the infoset replacement for the given node 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if substitution succeeded, -1 if some processing failed 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeIncludeNode(xmlXIncludeCtxtPtr ctxt, int nr) { 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur, end, list, tmp; 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nr < 0) || (nr >= ctxt->incNr)) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = ctxt->incTab[nr]->ref; 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If we stored an XPointer a late computation may be needed 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->incTab[nr]->inc == NULL) && 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->incTab[nr]->xptr != NULL)) { 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->inc = 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCopyXPointer(ctxt, ctxt->doc, ctxt->doc, 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->xptr); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(ctxt->incTab[nr]->xptr); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->xptr = NULL; 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = ctxt->incTab[nr]->inc; 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->incTab[nr]->inc = NULL; 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check against the risk of generating a multi-rooted document 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->parent != NULL) && 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->parent->type != XML_ELEMENT_NODE)) { 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nb_elem = 0; 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = list; 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (tmp != NULL) { 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp->type == XML_ELEMENT_NODE) 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nb_elem++; 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->next; 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nb_elem > 1) { 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_MULTIPLE_ROOT, 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "XInclude error: would result in multiple root nodes\n", 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->parseFlags & XML_PARSE_NOXINCNODE) { 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add the list of nodes 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = list; 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddPrevSibling(cur, end); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(cur); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(cur); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Change the current node as an XInclude start one, and add an 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XInclude end one 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_XINCLUDE_START; 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = xmlNewDocNode(cur->doc, cur->ns, cur->name, NULL); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (end == NULL) { 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, ctxt->incTab[nr]->ref, 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_BUILD_FAILED, 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "failed to build node\n", NULL); 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->type = XML_XINCLUDE_END; 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddNextSibling(cur, end); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add the list of nodes 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = list; 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAddPrevSibling(end, cur); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeTestNode: 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude processing context 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: an XInclude node 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * test if the node is an XInclude node 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 true, 0 otherwise 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeTestNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == NULL) 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type != XML_ELEMENT_NODE) 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->ns == NULL) 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xmlStrEqual(node->ns->href, XINCLUDE_NS)) || 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(node->ns->href, XINCLUDE_OLD_NS))) { 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(node->ns->href, XINCLUDE_OLD_NS)) { 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->legacy == 0) { 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 /* wait for the XML Core Working Group to get something stable ! */ 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeWarn(ctxt, node, XML_XINCLUDE_DEPRECATED_NS, 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Deprecated XInclude namespace found, use %s", 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XINCLUDE_NS); 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->legacy = 1; 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(node->name, XINCLUDE_NODE)) { 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child = node->children; 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nb_fallback = 0; 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((child->type == XML_ELEMENT_NODE) && 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (child->ns != NULL) && 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((xmlStrEqual(child->ns->href, XINCLUDE_NS)) || 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(child->ns->href, XINCLUDE_OLD_NS)))) { 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(child->name, XINCLUDE_NODE)) { 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, node, 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_INCLUDE_IN_INCLUDE, 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%s has an 'include' child\n", 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XINCLUDE_NODE); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(child->name, XINCLUDE_FALLBACK)) { 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nb_fallback++; 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nb_fallback > 1) { 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, node, XML_XINCLUDE_FALLBACKS_IN_INCLUDE, 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%s has multiple fallback children\n", 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XINCLUDE_NODE); 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(node->name, XINCLUDE_FALLBACK)) { 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->parent == NULL) || 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->parent->type != XML_ELEMENT_NODE) || 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->parent->ns == NULL) || 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((!xmlStrEqual(node->parent->ns->href, XINCLUDE_NS)) && 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->parent->ns->href, XINCLUDE_OLD_NS))) || 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(node->parent->name, XINCLUDE_NODE))) { 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeErr(ctxt, node, 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE, 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%s is not the child of an 'include'\n", 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XINCLUDE_FALLBACK); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeDoProcess: 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XInclude processing context 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: an XML document 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tree: the top of the tree to process 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the XInclude substitution on the XML document @doc 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if no substitution were done, -1 if some processing failed 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the number of substitutions done. 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeDoProcess(xmlXIncludeCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr tree) { 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, start; 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((doc == NULL) || (tree == NULL)) 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->URL != NULL) { 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlXIncludeURLPush(ctxt, doc->URL); 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = ctxt->incNr; 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * First phase: lookup the elements in the document 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = tree; 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlXIncludeTestNode(ctxt, cur) == 1) 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludePreProcessNode(ctxt, cur); 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((cur != NULL) && (cur != tree->parent)) { 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: need to work on entities -> stack */ 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->children != NULL) && 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->children->type != XML_ENTITY_DECL) && 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->children->type != XML_XINCLUDE_START) && 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->children->type != XML_XINCLUDE_END)) { 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->children; 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlXIncludeTestNode(ctxt, cur)) 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludePreProcessNode(ctxt, cur); 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->next != NULL) { 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlXIncludeTestNode(ctxt, cur)) 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludePreProcessNode(ctxt, cur); 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == tree) 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->parent; 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur == NULL) || (cur == tree->parent)) 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; /* do */ 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlXIncludeTestNode(ctxt, cur)) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludePreProcessNode(ctxt, cur); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; /* do */ 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (cur != NULL); 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Second Phase : collect the infosets fragments 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = start;i < ctxt->incNr; i++) { 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeLoadNode(ctxt, i); 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret++; 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Third phase: extend the original document infoset. 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Originally we bypassed the inclusion if there were any errors 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * encountered on any of the XIncludes. A bug was raised (bug 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 132588) requesting that we output the XIncludes without error, 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * so the check for inc!=NULL || xptr!=NULL was put in. This may 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * give some other problems in the future, but for now it seems to 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * work ok. 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = ctxt->incBase;i < ctxt->incNr; i++) { 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->incTab[i]->inc != NULL) || 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->incTab[i]->xptr != NULL) || 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->incTab[i]->emptyFb != 0)) /* (empty fallback) */ 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeIncludeNode(ctxt, i); 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->URL != NULL) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeURLPop(ctxt); 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeSetFlags: 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XInclude processing context 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flags: a set of xmlParserOption used for parsing XML includes 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the flags used for further processing of XML resources. 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error. 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeSetFlags(xmlXIncludeCtxtPtr ctxt, int flags) { 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->parseFlags = flags; 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeProcessTreeFlagsData: 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tree: an XML node 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flags: a set of xmlParserOption used for parsing XML includes 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: application data that will be passed to the parser context 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the _private field of the parser context(s) 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the XInclude substitution on the XML node @tree 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if no substitution were done, -1 if some processing failed 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the number of substitutions done. 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeProcessTreeFlagsData(xmlNodePtr tree, int flags, void *data) { 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCtxtPtr ctxt; 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tree == NULL) || (tree->doc == NULL)) 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = xmlXIncludeNewContext(tree->doc); 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->_private = data; 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->base = xmlStrdup((xmlChar *)tree->doc->URL); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeSetFlags(ctxt, flags); 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret >= 0) && (ctxt->nbErrors > 0)) 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeFreeContext(ctxt); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeProcessFlagsData: 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: an XML document 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flags: a set of xmlParserOption used for parsing XML includes 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @data: application data that will be passed to the parser context 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the _private field of the parser context(s) 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the XInclude substitution on the XML document @doc 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if no substitution were done, -1 if some processing failed 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the number of substitutions done. 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeProcessFlagsData(xmlDocPtr doc, int flags, void *data) { 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tree; 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree = xmlDocGetRootElement(doc); 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tree == NULL) 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlXIncludeProcessTreeFlagsData(tree, flags, data)); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeProcessFlags: 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: an XML document 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flags: a set of xmlParserOption used for parsing XML includes 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the XInclude substitution on the XML document @doc 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if no substitution were done, -1 if some processing failed 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the number of substitutions done. 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeProcessFlags(xmlDocPtr doc, int flags) { 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return xmlXIncludeProcessFlagsData(doc, flags, NULL); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeProcess: 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: an XML document 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the XInclude substitution on the XML document @doc 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if no substitution were done, -1 if some processing failed 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the number of substitutions done. 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeProcess(xmlDocPtr doc) { 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlXIncludeProcessFlags(doc, 0)); 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeProcessTreeFlags: 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tree: a node in an XML document 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @flags: a set of xmlParserOption used for parsing XML includes 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the XInclude substitution for the given subtree 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if no substitution were done, -1 if some processing failed 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the number of substitutions done. 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeProcessTreeFlags(xmlNodePtr tree, int flags) { 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeCtxtPtr ctxt; 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tree == NULL) || (tree->doc == NULL)) 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = xmlXIncludeNewContext(tree->doc); 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->base = xmlNodeGetBase(tree->doc, tree); 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeSetFlags(ctxt, flags); 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlXIncludeDoProcess(ctxt, tree->doc, tree); 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret >= 0) && (ctxt->nbErrors > 0)) 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXIncludeFreeContext(ctxt); 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeProcessTree: 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tree: a node in an XML document 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the XInclude substitution for the given subtree 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if no substitution were done, -1 if some processing failed 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the number of substitutions done. 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeProcessTree(xmlNodePtr tree) { 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlXIncludeProcessTreeFlags(tree, 0)); 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlXIncludeProcessNode: 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an existing XInclude context 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: a node in an XML document 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Implement the XInclude substitution for the given subtree reusing 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the informations and data coming from the given context. 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if no substitution were done, -1 if some processing failed 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the number of substitutions done. 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlXIncludeProcessNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr node) { 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node == NULL) || (node->doc == NULL) || (ctxt == NULL)) 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlXIncludeDoProcess(ctxt, node->doc, node); 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret >= 0) && (ctxt->nbErrors > 0)) 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* !LIBXML_XINCLUDE_ENABLED */ 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_xinclude 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h" 2592