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