15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * tree.c : implementation of access function for an XML tree.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * References:
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   XHTML 1.0 W3C REC: http://www.w3.org/TR/2002/REC-xhtml1-20020801/
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)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> /* for memset() only ! */
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CTYPE_H
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ZLIB_H
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <zlib.h>
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h>
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/entities.h>
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/valid.h>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h>
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h>
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h>
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_HTML_ENABLED
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/HTMLtree.h>
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/debugXML.h>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __xmlRegisterCallbacks = 0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Forward declarations					*
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsPtr
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar* xmlGetPropNodeValueInternal(xmlAttrPtr prop);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Tree memory error handler				*
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTreeErrMemory:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTreeErrMemory(const char *extra)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTreeErr:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @code:  the error number
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra:  extra informations
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTreeErr(int code, xmlNodePtr node, const char *extra)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *msg = NULL;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch(code) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TREE_INVALID_HEX:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = "invalid hexadecimal character value\n";
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_TREE_INVALID_DEC:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = "invalid decimal character value\n";
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_TREE_UNTERMINATED_ENTITY:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = "unterminated entity reference %15s\n";
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_TREE_NOT_UTF8:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = "string is not in UTF-8\n";
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = "unexpected error number\n";
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __xmlSimpleError(XML_FROM_TREE, code, node, msg, extra);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		A few static variables and macros			*
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #undef xmlStringText */
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar xmlStringText[] = { 't', 'e', 'x', 't', 0 };
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #undef xmlStringTextNoenc */
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar xmlStringTextNoenc[] =
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              { 't', 'e', 'x', 't', 'n', 'o', 'e', 'n', 'c', 0 };
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #undef xmlStringComment */
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar xmlStringComment[] = { 'c', 'o', 'm', 'm', 'e', 'n', 't', 0 };
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlCompressMode = 0;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xmlCheckDTD = 1;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UPDATE_LAST_CHILD_AND_PARENT(n) if ((n) != NULL) {		\
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ulccur = (n)->children;					\
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ulccur == NULL) {						\
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (n)->last = NULL;						\
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {								\
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while (ulccur->next != NULL) {					\
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ulccur->parent = (n);					\
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ulccur = ulccur->next;					\
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}								\
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ulccur->parent = (n);						\
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(n)->last = ulccur;						\
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_STR_XML(str) ((str != NULL) && (str[0] == 'x') && \
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (str[1] == 'm') && (str[2] == 'l') && (str[3] == 0))
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_BUFFER */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* #define DEBUG_TREE */
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Functions to move to entities.c once the		*
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		API freeze is smoothen and they can be made public.	*
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/hash.h>
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetEntityFromDtd:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dtd:  A pointer to the DTD to search
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  The entity name
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do an entity lookup in the DTD entity hash table and
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * return the corresponding entity, if found.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns A pointer to the entity structure or NULL if not found.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetEntityFromDtd(xmlDtdPtr dtd, const xmlChar *name) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlEntitiesTablePtr table;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if((dtd != NULL) && (dtd->entities != NULL)) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	table = (xmlEntitiesTablePtr) dtd->entities;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return((xmlEntityPtr) xmlHashLookup(table, name));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* return(xmlGetEntityFromTable(table, name)); */
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetParameterEntityFromDtd:
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dtd:  A pointer to the DTD to search
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  The entity name
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do an entity lookup in the DTD pararmeter entity hash table and
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * return the corresponding entity, if found.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns A pointer to the entity structure or NULL if not found.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetParameterEntityFromDtd(xmlDtdPtr dtd, const xmlChar *name) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlEntitiesTablePtr table;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((dtd != NULL) && (dtd->pentities != NULL)) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	table = (xmlEntitiesTablePtr) dtd->pentities;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return((xmlEntityPtr) xmlHashLookup(table, name));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* return(xmlGetEntityFromTable(table, name)); */
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			QName handling helper				*
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBuildQName:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ncname:  the Name
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefix:  the prefix
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @memory:  preallocated memory
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  preallocated memory length
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Builds the QName @prefix:@ncname in @memory if there is enough space
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and prefix is not NULL nor empty, otherwise allocate a new string.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If prefix is NULL or empty it returns ncname.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new string which must be freed by the caller if different from
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         @memory and @ncname or NULL in case of error
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBuildQName(const xmlChar *ncname, const xmlChar *prefix,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      xmlChar *memory, int len) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int lenn, lenp;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ncname == NULL) return(NULL);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prefix == NULL) return((xmlChar *) ncname);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lenn = strlen((char *) ncname);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lenp = strlen((char *) prefix);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((memory == NULL) || (len < lenn + lenp + 2)) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == NULL) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("building QName");
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = memory;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&ret[0], prefix, lenp);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret[lenp] = ':';
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&ret[lenp + 1], ncname, lenn);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret[lenn + lenp + 1] = 0;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSplitQName2:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the full QName
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefix:  a xmlChar **
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse an XML qualified name string
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [NS 5] QName ::= (Prefix ':')? LocalPart
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [NS 6] Prefix ::= NCName
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [NS 7] LocalPart ::= NCName
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns NULL if not a QName, otherwise the local part, and prefix
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   is updated to get the Prefix if any.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSplitQName2(const xmlChar *name, xmlChar **prefix) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len = 0;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prefix == NULL) return(NULL);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *prefix = NULL;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) return(NULL);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef XML_XML_NAMESPACE
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* xml: prefix is not really a namespace */
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((name[0] == 'x') && (name[1] == 'm') &&
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (name[2] == 'l') && (name[3] == ':'))
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* nasty but valid */
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name[0] == ':')
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * we are not trying to validate but just to cut, and yes it will
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * work even if this is as set of UTF-8 encoded chars
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((name[len] != 0) && (name[len] != ':'))
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len++;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name[len] == 0)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *prefix = xmlStrndup(name, len);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*prefix == NULL) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("QName split");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlStrdup(&name[len + 1]);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("QName split");
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*prefix != NULL) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(*prefix);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *prefix = NULL;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSplitQName3:
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the full QName
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: an int *
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse an XML qualified name string,i
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns NULL if it is not a Qualified Name, otherwise, update len
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         with the lenght in byte of the prefix and return a pointer
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         to the start of the name without the prefix
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar *
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSplitQName3(const xmlChar *name, int *len) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int l = 0;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) return(NULL);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len == NULL) return(NULL);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* nasty but valid */
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name[0] == ':')
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * we are not trying to validate but just to cut, and yes it will
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * work even if this is as set of UTF-8 encoded chars
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((name[l] != 0) && (name[l] != ':'))
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	l++;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name[l] == 0)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *len = l;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(&name[l+1]);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Check Name, NCName and QName strings			*
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_DEBUG_ENABLED) || defined (LIBXML_HTML_ENABLED) || defined(LIBXML_SAX1_ENABLED) || defined(LIBXML_HTML_ENABLED) || defined(LIBXML_WRITER_ENABLED) || defined(LIBXML_DOCB_ENABLED)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlValidateNCName:
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @space: allow spaces in front and end of the string
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check that a value conforms to the lexical space of NCName
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if this validates, a positive error code number otherwise
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         and -1 in case of internal or API error.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlValidateNCName(const xmlChar *value, int space) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur = value;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int c,l;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * First quick algorithm for ASCII range
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK_CH(*cur)) cur++;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) ||
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*cur == '_'))
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto try_complex;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (((*cur >= 'a') && (*cur <= 'z')) ||
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   ((*cur >= 'A') && (*cur <= 'Z')) ||
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   ((*cur >= '0') && (*cur <= '9')) ||
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (*cur == '_') || (*cur == '-') || (*cur == '.'))
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK_CH(*cur)) cur++;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*cur == 0)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)try_complex:
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Second check for chars outside the ASCII range
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = value;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = CUR_SCHAR(cur, l);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK(c)) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur += l;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = CUR_SCHAR(cur, l);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((!IS_LETTER(c)) && (c != '_'))
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur += l;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = CUR_SCHAR(cur, l);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') ||
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (c == '-') || (c == '_') || IS_COMBINING(c) ||
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   IS_EXTENDER(c)) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur += l;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	c = CUR_SCHAR(cur, l);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK(c)) {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur += l;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = CUR_SCHAR(cur, l);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c != 0)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlValidateQName:
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @space: allow spaces in front and end of the string
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check that a value conforms to the lexical space of QName
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if this validates, a positive error code number otherwise
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         and -1 in case of internal or API error.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlValidateQName(const xmlChar *value, int space) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur = value;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int c,l;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * First quick algorithm for ASCII range
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK_CH(*cur)) cur++;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) ||
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*cur == '_'))
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto try_complex;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (((*cur >= 'a') && (*cur <= 'z')) ||
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   ((*cur >= 'A') && (*cur <= 'Z')) ||
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   ((*cur >= '0') && (*cur <= '9')) ||
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (*cur == '_') || (*cur == '-') || (*cur == '.'))
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*cur == ':') {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (((*cur >= 'a') && (*cur <= 'z')) ||
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((*cur >= 'A') && (*cur <= 'Z')) ||
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (*cur == '_'))
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur++;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto try_complex;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (((*cur >= 'a') && (*cur <= 'z')) ||
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       ((*cur >= 'A') && (*cur <= 'Z')) ||
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       ((*cur >= '0') && (*cur <= '9')) ||
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       (*cur == '_') || (*cur == '-') || (*cur == '.'))
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur++;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK_CH(*cur)) cur++;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*cur == 0)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)try_complex:
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Second check for chars outside the ASCII range
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = value;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = CUR_SCHAR(cur, l);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space) {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK(c)) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur += l;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = CUR_SCHAR(cur, l);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((!IS_LETTER(c)) && (c != '_'))
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur += l;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = CUR_SCHAR(cur, l);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') ||
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (c == '-') || (c == '_') || IS_COMBINING(c) ||
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   IS_EXTENDER(c)) {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur += l;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	c = CUR_SCHAR(cur, l);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c == ':') {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur += l;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	c = CUR_SCHAR(cur, l);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((!IS_LETTER(c)) && (c != '_'))
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(1);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur += l;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	c = CUR_SCHAR(cur, l);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') ||
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       (c == '-') || (c == '_') || IS_COMBINING(c) ||
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       IS_EXTENDER(c)) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur += l;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = CUR_SCHAR(cur, l);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space) {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK(c)) {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur += l;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = CUR_SCHAR(cur, l);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c != 0)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlValidateName:
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @space: allow spaces in front and end of the string
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check that a value conforms to the lexical space of Name
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if this validates, a positive error code number otherwise
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         and -1 in case of internal or API error.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlValidateName(const xmlChar *value, int space) {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur = value;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int c,l;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * First quick algorithm for ASCII range
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK_CH(*cur)) cur++;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) ||
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(*cur == '_') || (*cur == ':'))
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto try_complex;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (((*cur >= 'a') && (*cur <= 'z')) ||
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   ((*cur >= 'A') && (*cur <= 'Z')) ||
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   ((*cur >= '0') && (*cur <= '9')) ||
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':'))
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK_CH(*cur)) cur++;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*cur == 0)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)try_complex:
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Second check for chars outside the ASCII range
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = value;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = CUR_SCHAR(cur, l);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space) {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK(c)) {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur += l;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = CUR_SCHAR(cur, l);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((!IS_LETTER(c)) && (c != '_') && (c != ':'))
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur += l;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = CUR_SCHAR(cur, l);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') ||
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)) {
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur += l;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	c = CUR_SCHAR(cur, l);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK(c)) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur += l;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = CUR_SCHAR(cur, l);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c != 0)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlValidateNMToken:
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the value to check
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @space: allow spaces in front and end of the string
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check that a value conforms to the lexical space of NMToken
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if this validates, a positive error code number otherwise
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         and -1 in case of internal or API error.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlValidateNMToken(const xmlChar *value, int space) {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur = value;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int c,l;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * First quick algorithm for ASCII range
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK_CH(*cur)) cur++;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((*cur >= 'a') && (*cur <= 'z')) ||
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((*cur >= 'A') && (*cur <= 'Z')) ||
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((*cur >= '0') && (*cur <= '9')) ||
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':'))
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto try_complex;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (((*cur >= 'a') && (*cur <= 'z')) ||
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   ((*cur >= 'A') && (*cur <= 'Z')) ||
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   ((*cur >= '0') && (*cur <= '9')) ||
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':'))
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK_CH(*cur)) cur++;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*cur == 0)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)try_complex:
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Second check for chars outside the ASCII range
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = value;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = CUR_SCHAR(cur, l);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space) {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK(c)) {
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur += l;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = CUR_SCHAR(cur, l);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!(IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') ||
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)))
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur += l;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = CUR_SCHAR(cur, l);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') ||
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur += l;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	c = CUR_SCHAR(cur, l);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (IS_BLANK(c)) {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur += l;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = CUR_SCHAR(cur, l);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c != 0)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Allocation and deallocation of basic structures		*
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetBufferAllocationScheme:
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @scheme:  allocation method to use
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the buffer allocation method.  Types are
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                             improves performance
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme) {
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((scheme == XML_BUFFER_ALLOC_EXACT) ||
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (scheme == XML_BUFFER_ALLOC_DOUBLEIT))
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlBufferAllocScheme = scheme;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetBufferAllocationScheme:
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Types are
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed,
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                             improves performance
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the current allocation scheme
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferAllocationScheme
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetBufferAllocationScheme(void) {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlBufferAllocScheme);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewNs:
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the element carrying the namespace
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @href:  the URI associated
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefix:  the prefix for the namespace
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new Namespace. This function will refuse to create
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a namespace with a similar prefix than an existing one present on this
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * node.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We use href==NULL in the case of an element creation where the namespace
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * was not defined.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a new namespace pointer or NULL
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNsPtr
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewNs(xmlNodePtr node, const xmlChar *href, const xmlChar *prefix) {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr cur;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node != NULL) && (node->type != XML_ELEMENT_NODE))
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xml")))
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new Namespace and fill the fields.
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building namespace");
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNs));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_LOCAL_NAMESPACE;
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (href != NULL)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->href = xmlStrdup(href);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prefix != NULL)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->prefix = xmlStrdup(prefix);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Add it at the end to preserve parsing order ...
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * and checks for existing use of the prefix
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node != NULL) {
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->nsDef == NULL) {
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node->nsDef = cur;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNsPtr prev = node->nsDef;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (((prev->prefix == NULL) && (cur->prefix == NULL)) ||
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlStrEqual(prev->prefix, cur->prefix))) {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeNs(cur);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (prev->next != NULL) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        prev = prev->next;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (((prev->prefix == NULL) && (cur->prefix == NULL)) ||
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlStrEqual(prev->prefix, cur->prefix))) {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFreeNs(cur);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(NULL);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev->next = cur;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetNs:
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  a node in the document
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  a namespace pointer
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Associate a namespace to a node, a posteriori.
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetNs(xmlNodePtr node, xmlNsPtr ns) {
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) {
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlSetNs: node == NULL\n");
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node->ns = ns;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeNs:
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the namespace pointer
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free up the structures associated to a namespace
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeNs(xmlNsPtr cur) {
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlFreeNs : ns == NULL\n");
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->href != NULL) xmlFree((char *) cur->href);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->prefix != NULL) xmlFree((char *) cur->prefix);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(cur);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeNsList:
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the first namespace pointer
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free up all the structures associated to the chained namespaces.
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeNsList(xmlNsPtr cur) {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr next;
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlFreeNsList : ns == NULL\n");
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        next = cur->next;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeNs(cur);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = next;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDtd:
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document pointer
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the DTD name
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ExternalID:  the external ID
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SystemID:  the system ID
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new DTD for the external subset. To create an
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * internal subset, use xmlCreateIntSubset().
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new DTD structure
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDtdPtr
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDtd(xmlDocPtr doc, const xmlChar *name,
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const xmlChar *ExternalID, const xmlChar *SystemID) {
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDtdPtr cur;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc != NULL) && (doc->extSubset != NULL)) {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewDtd(%s): document %s already have a DTD %s\n",
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* !!! */ (char *) name, doc->name,
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* !!! */ (char *)doc->extSubset->name);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new DTD and fill the fields.
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd));
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building DTD");
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0 , sizeof(xmlDtd));
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_DTD_NODE;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name != NULL)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->name = xmlStrdup(name);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ExternalID != NULL)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->ExternalID = xmlStrdup(ExternalID);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (SystemID != NULL)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->SystemID = xmlStrdup(SystemID);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc->extSubset = cur;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = doc;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetIntSubset:
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document pointer
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the internal subset of a document
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the DTD structure or NULL if not found
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDtdPtr
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetIntSubset(xmlDocPtr doc) {
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = doc->children;
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_DTD_NODE)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return((xmlDtdPtr) cur);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return((xmlDtdPtr) doc->intSubset);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCreateIntSubset:
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document pointer
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the DTD name
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ExternalID:  the external (PUBLIC) ID
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SystemID:  the system ID
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create the internal subset of a document
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new DTD structure
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDtdPtr
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCreateIntSubset(xmlDocPtr doc, const xmlChar *name,
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const xmlChar *ExternalID, const xmlChar *SystemID) {
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDtdPtr cur;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc != NULL) && (xmlGetIntSubset(doc) != NULL)) {
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     "xmlCreateIntSubset(): document %s already have an internal subset\n",
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc->name);
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new DTD and fill the fields.
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd));
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building internal subset");
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlDtd));
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_DTD_NODE;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name != NULL) {
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->name = xmlStrdup(name);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->name == NULL) {
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("building internal subset");
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(cur);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ExternalID != NULL) {
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->ExternalID = xmlStrdup(ExternalID);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->ExternalID  == NULL) {
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("building internal subset");
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->name != NULL)
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlFree((char *)cur->name);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(cur);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (SystemID != NULL) {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->SystemID = xmlStrdup(SystemID);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->SystemID == NULL) {
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("building internal subset");
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->name != NULL)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlFree((char *)cur->name);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->ExternalID != NULL)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlFree((char *)cur->ExternalID);
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(cur);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL) {
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc->intSubset = cur;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->parent = doc;
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->doc = doc;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc->children == NULL) {
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc->children = (xmlNodePtr) cur;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc->last = (xmlNodePtr) cur;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc->type == XML_HTML_DOCUMENT_NODE) {
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlNodePtr prev;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev = doc->children;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev->prev = (xmlNodePtr) cur;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->next = prev;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc->children = (xmlNodePtr) cur;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlNodePtr next;
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		next = doc->children;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((next != NULL) && (next->type != XML_ELEMENT_NODE))
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    next = next->next;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (next == NULL) {
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->prev = doc->last;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->prev->next = (xmlNodePtr) cur;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->next = NULL;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    doc->last = (xmlNodePtr) cur;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->next = next;
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->prev = next->prev;
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur->prev == NULL)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			doc->children = (xmlNodePtr) cur;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->prev->next = (xmlNodePtr) cur;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    next->prev = (xmlNodePtr) cur;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DICT_FREE:
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  a string
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a string if it is not owned by the "dict" dictionnary in the
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * current scope
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DICT_FREE(str)						\
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((str) && ((!dict) ||				\
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlDictOwns(dict, (const xmlChar *)(str)) == 0)))	\
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree((char *)(str));
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DICT_COPY:
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  a string
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy a string using a "dict" dictionnary in the current scope,
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if availabe.
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DICT_COPY(str, cpy) \
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str) { \
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (dict) { \
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlDictOwns(dict, (const xmlChar *)(str))) \
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cpy = (xmlChar *) (str); \
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else \
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cpy = (xmlChar *) xmlDictLookup((dict), (const xmlChar *)(str), -1); \
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else \
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cpy = xmlStrdup((const xmlChar *)(str)); }
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DICT_CONST_COPY:
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  a string
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy a string using a "dict" dictionnary in the current scope,
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if availabe.
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DICT_CONST_COPY(str, cpy) \
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str) { \
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (dict) { \
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlDictOwns(dict, (const xmlChar *)(str))) \
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cpy = (const xmlChar *) (str); \
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else \
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cpy = xmlDictLookup((dict), (const xmlChar *)(str), -1); \
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else \
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cpy = (const xmlChar *) xmlStrdup((const xmlChar *)(str)); }
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeDtd:
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the DTD structure to free up
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a DTD structure.
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeDtd(xmlDtdPtr cur) {
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict = NULL;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->doc != NULL) dict = cur->doc->dict;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->children != NULL) {
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr next, c = cur->children;
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Cleanup all nodes which are not part of the specific lists
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * of notations, elements, attributes and entities.
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while (c != NULL) {
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    next = c->next;
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((c->type != XML_NOTATION_NODE) &&
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (c->type != XML_ELEMENT_DECL) &&
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(c->type != XML_ATTRIBUTE_DECL) &&
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(c->type != XML_ENTITY_DECL)) {
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlUnlinkNode(c);
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeNode(c);
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    c = next;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DICT_FREE(cur->name)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DICT_FREE(cur->SystemID)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DICT_FREE(cur->ExternalID)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO !!! */
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->notations != NULL)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeNotationTable((xmlNotationTablePtr) cur->notations);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->elements != NULL)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeElementTable((xmlElementTablePtr) cur->elements);
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->attributes != NULL)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeAttributeTable((xmlAttributeTablePtr) cur->attributes);
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->entities != NULL)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeEntitiesTable((xmlEntitiesTablePtr) cur->entities);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->pentities != NULL)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeEntitiesTable((xmlEntitiesTablePtr) cur->pentities);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(cur);
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDoc:
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @version:  xmlChar string giving the version of XML "1.0"
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates a new XML document
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a new document
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocPtr
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDoc(const xmlChar *version) {
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr cur;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (version == NULL)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	version = (const xmlChar *) "1.0";
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new document and fill the fields.
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building doc");
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlDoc));
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_DOCUMENT_NODE;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->version = xmlStrdup(version);
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->version == NULL) {
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building doc");
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(cur);
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->standalone = -1;
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->compression = -1; /* not initialized */
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = cur;
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->parseFlags = 0;
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->properties = XML_DOC_USERBUILT;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The in memory encoding is always UTF8
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * This field will never change and would
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * be obsolete if not for binary compatibility.
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->charset = XML_CHAR_ENCODING_UTF8;
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeDoc:
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  pointer to the document
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free up all the structures used by a document, tree included.
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeDoc(xmlDocPtr cur) {
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDtdPtr extSubset, intSubset;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict = NULL;
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlFreeDoc : document == NULL\n");
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_RUNTIME
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DEBUG_ENABLED
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDebugCheckDocument(stderr, cur);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur != NULL) dict = cur->dict;
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Do this before freeing the children list to avoid ID lookups
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->ids != NULL) xmlFreeIDTable((xmlIDTablePtr) cur->ids);
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->ids = NULL;
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->refs != NULL) xmlFreeRefTable((xmlRefTablePtr) cur->refs);
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->refs = NULL;
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extSubset = cur->extSubset;
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    intSubset = cur->intSubset;
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (intSubset == extSubset)
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	extSubset = NULL;
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (extSubset != NULL) {
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlUnlinkNode((xmlNodePtr) cur->extSubset);
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->extSubset = NULL;
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDtd(extSubset);
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (intSubset != NULL) {
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlUnlinkNode((xmlNodePtr) cur->intSubset);
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->intSubset = NULL;
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDtd(intSubset);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->children != NULL) xmlFreeNodeList(cur->children);
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs);
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DICT_FREE(cur->version)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DICT_FREE(cur->name)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DICT_FREE(cur->encoding)
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DICT_FREE(cur->URL)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(cur);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dict) xmlDictFree(dict);
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlStringLenGetNodeList:
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value of the text
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the length of the string value
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parse the value string and build the node list associated. Should
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * produce a flat tree with only TEXTs and ENTITY_REFs.
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the first child
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret = NULL, last = NULL;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *val;
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur = value, *end = cur + len;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *q;
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlEntityPtr ent;
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL) return(NULL);
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q = cur;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((cur < end) && (*cur != 0)) {
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur[0] == '&') {
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int charval = 0;
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar tmp;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Save the current text.
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur != q) {
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodeAddContentLen(last, q, cur - q);
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocTextLen(doc, q, cur - q);
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (node == NULL) return(ret);
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (last == NULL)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last = ret = node;
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last->next = node;
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			node->prev = last;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last = node;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    q = cur;
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur + 2 < end) && (cur[1] == '#') && (cur[2] == 'x')) {
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur += 3;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur < end)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = *cur;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = 0;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (tmp != ';') { /* Non input consuming loop */
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((tmp >= '0') && (tmp <= '9'))
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = charval * 16 + (tmp - '0');
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if ((tmp >= 'a') && (tmp <= 'f'))
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = charval * 16 + (tmp - 'a') + 10;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if ((tmp >= 'A') && (tmp <= 'F'))
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = charval * 16 + (tmp - 'A') + 10;
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlTreeErr(XML_TREE_INVALID_HEX, (xmlNodePtr) doc,
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			           NULL);
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = 0;
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur < end)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			tmp = *cur;
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			tmp = 0;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (tmp == ';')
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = cur;
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if ((cur + 1 < end) && (cur[1] == '#')) {
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur += 2;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur < end)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = *cur;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = 0;
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (tmp != ';') { /* Non input consuming loops */
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((tmp >= '0') && (tmp <= '9'))
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = charval * 10 + (tmp - '0');
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlTreeErr(XML_TREE_INVALID_DEC, (xmlNodePtr) doc,
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			           NULL);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = 0;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur < end)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			tmp = *cur;
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			tmp = 0;
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (tmp == ';')
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = cur;
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * Read the entity string
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 */
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = cur;
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((cur < end) && (*cur != 0) && (*cur != ';')) cur++;
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((cur >= end) || (*cur == 0)) {
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlTreeErr(XML_TREE_UNTERMINATED_ENTITY, (xmlNodePtr) doc,
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		               (const char *) q);
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(ret);
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur != q) {
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     * Predefined entities don't generate nodes
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     */
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    val = xmlStrndup(q, cur - q);
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ent = xmlGetDocEntity(doc, val);
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((ent != NULL) &&
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (last == NULL) {
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    node = xmlNewDocText(doc, ent->content);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    last = ret = node;
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else if (last->type != XML_TEXT_NODE) {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    node = xmlNewDocText(doc, ent->content);
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    last = xmlAddNextSibling(last, node);
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlNodeAddContent(last, ent->content);
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 * Create a new REFERENCE_REF node
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 */
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			node = xmlNewReference(doc, val);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (node == NULL) {
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (val != NULL) xmlFree(val);
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(ret);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			else if ((ent != NULL) && (ent->children == NULL)) {
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlNodePtr temp;
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ent->children = xmlStringGetNodeList(doc,
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    (const xmlChar*)node->content);
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ent->owner = 1;
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    temp = ent->children;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    while (temp) {
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				temp->parent = (xmlNodePtr)ent;
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				ent->last = temp;
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				temp = temp->next;
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (last == NULL) {
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    last = ret = node;
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else {
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    last = xmlAddNextSibling(last, node);
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(val);
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = cur;
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (charval != 0) {
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar buf[10];
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int l;
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		l = xmlCopyCharMultiByte(buf, charval);
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		buf[l] = 0;
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = xmlNewDocText(doc, buf);
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (node != NULL) {
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (last == NULL) {
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last = ret = node;
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last = xmlAddNextSibling(last, node);
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		charval = 0;
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur++;
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur != q) || (ret == NULL)) {
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Handle the last piece of text.
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeAddContentLen(last, q, cur - q);
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = xmlNewDocTextLen(doc, q, cur - q);
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node == NULL) return(ret);
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (last == NULL) {
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = node;
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAddNextSibling(last, node);
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlStringGetNodeList:
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value of the attribute
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parse the value string and build the node list associated. Should
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * produce a flat tree with only TEXTs and ENTITY_REFs.
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the first child
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret = NULL, last = NULL;
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node;
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *val;
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur = value;
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *q;
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlEntityPtr ent;
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value == NULL) return(NULL);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q = cur;
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (*cur != 0) {
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur[0] == '&') {
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int charval = 0;
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar tmp;
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Save the current text.
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur != q) {
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodeAddContentLen(last, q, cur - q);
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = xmlNewDocTextLen(doc, q, cur - q);
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (node == NULL) return(ret);
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (last == NULL)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last = ret = node;
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last->next = node;
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			node->prev = last;
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last = node;
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    q = cur;
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur[1] == '#') && (cur[2] == 'x')) {
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur += 3;
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = *cur;
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (tmp != ';') { /* Non input consuming loop */
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((tmp >= '0') && (tmp <= '9'))
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = charval * 16 + (tmp - '0');
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if ((tmp >= 'a') && (tmp <= 'f'))
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = charval * 16 + (tmp - 'a') + 10;
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if ((tmp >= 'A') && (tmp <= 'F'))
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = charval * 16 + (tmp - 'A') + 10;
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlTreeErr(XML_TREE_INVALID_HEX, (xmlNodePtr) doc,
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			           NULL);
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = 0;
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = *cur;
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (tmp == ';')
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = cur;
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else if  (cur[1] == '#') {
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur += 2;
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = *cur;
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (tmp != ';') { /* Non input consuming loops */
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((tmp >= '0') && (tmp <= '9'))
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = charval * 10 + (tmp - '0');
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else {
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlTreeErr(XML_TREE_INVALID_DEC, (xmlNodePtr) doc,
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			           NULL);
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			charval = 0;
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = *cur;
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (tmp == ';')
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur++;
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = cur;
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * Read the entity string
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 */
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = cur;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((*cur != 0) && (*cur != ';')) cur++;
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (*cur == 0) {
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlTreeErr(XML_TREE_UNTERMINATED_ENTITY,
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		               (xmlNodePtr) doc, (const char *) q);
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(ret);
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur != q) {
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     * Predefined entities don't generate nodes
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     */
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    val = xmlStrndup(q, cur - q);
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ent = xmlGetDocEntity(doc, val);
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((ent != NULL) &&
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (last == NULL) {
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    node = xmlNewDocText(doc, ent->content);
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    last = ret = node;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else if (last->type != XML_TEXT_NODE) {
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    node = xmlNewDocText(doc, ent->content);
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    last = xmlAddNextSibling(last, node);
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlNodeAddContent(last, ent->content);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 * Create a new REFERENCE_REF node
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 */
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			node = xmlNewReference(doc, val);
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (node == NULL) {
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (val != NULL) xmlFree(val);
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(ret);
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			else if ((ent != NULL) && (ent->children == NULL)) {
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlNodePtr temp;
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ent->children = xmlStringGetNodeList(doc,
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    (const xmlChar*)node->content);
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ent->owner = 1;
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    temp = ent->children;
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    while (temp) {
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				temp->parent = (xmlNodePtr)ent;
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				temp = temp->next;
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (last == NULL) {
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    last = ret = node;
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} else {
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    last = xmlAddNextSibling(last, node);
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(val);
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = cur;
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (charval != 0) {
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar buf[10];
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int len;
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		len = xmlCopyCharMultiByte(buf, charval);
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		buf[len] = 0;
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = xmlNewDocText(doc, buf);
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (node != NULL) {
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (last == NULL) {
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last = ret = node;
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			last = xmlAddNextSibling(last, node);
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur++;
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur != q) || (ret == NULL)) {
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Handle the last piece of text.
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeAddContentLen(last, q, cur - q);
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = xmlNewDocTextLen(doc, q, cur - q);
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node == NULL) return(ret);
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (last == NULL) {
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		last = ret = node;
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		last = xmlAddNextSibling(last, node);
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeListGetString:
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list:  a Node list
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inLine:  should we replace entity contents or show their external form
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Build the string equivalent to the text contained in the Node list
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * made of TEXTs and ENTITY_REFs
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the string copy, the caller must free it with xmlFree().
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeListGetString(xmlDocPtr doc, xmlNodePtr list, int inLine)
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node = list;
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlEntityPtr ent;
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list == NULL)
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((node->type == XML_TEXT_NODE) ||
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_CDATA_SECTION_NODE)) {
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (inLine) {
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = xmlStrcat(ret, node->content);
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlChar *buffer;
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buffer = xmlEncodeEntitiesReentrant(doc, node->content);
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (buffer != NULL) {
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ret = xmlStrcat(ret, buffer);
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlFree(buffer);
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (node->type == XML_ENTITY_REF_NODE) {
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (inLine) {
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ent = xmlGetDocEntity(doc, node->name);
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ent != NULL) {
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlChar *buffer;
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    /* an entity content can be any "well balanced chunk",
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * i.e. the result of the content [43] production:
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * http://www.w3.org/TR/REC-xml#NT-content.
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * So it can contain text, CDATA section or nested
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * entity reference nodes (among others).
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * -> we recursive  call xmlNodeListGetString()
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * which handles these types */
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    buffer = xmlNodeListGetString(doc, ent->children, 1);
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (buffer != NULL) {
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ret = xmlStrcat(ret, buffer);
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlFree(buffer);
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else {
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ret = xmlStrcat(ret, node->content);
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlChar buf[2];
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buf[0] = '&';
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buf[1] = 0;
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = xmlStrncat(ret, buf, 1);
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = xmlStrcat(ret, node->name);
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buf[0] = ';';
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buf[1] = 0;
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = xmlStrncat(ret, buf, 1);
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else {
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "xmlGetNodeListString : invalid node type %d\n",
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            node->type);
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node = node->next;
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeListGetRawString:
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list:  a Node list
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inLine:  should we replace entity contents or show their external form
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Builds the string equivalent to the text contained in the Node list
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * made of TEXTs and ENTITY_REFs, contrary to xmlNodeListGetString()
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this function doesn't do any character encoding handling.
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the string copy, the caller must free it with xmlFree().
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeListGetRawString(xmlDocPtr doc, xmlNodePtr list, int inLine)
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node = list;
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *ret = NULL;
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlEntityPtr ent;
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list == NULL)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((node->type == XML_TEXT_NODE) ||
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_CDATA_SECTION_NODE)) {
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (inLine) {
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = xmlStrcat(ret, node->content);
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlChar *buffer;
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buffer = xmlEncodeSpecialChars(doc, node->content);
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (buffer != NULL) {
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ret = xmlStrcat(ret, buffer);
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlFree(buffer);
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (node->type == XML_ENTITY_REF_NODE) {
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (inLine) {
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ent = xmlGetDocEntity(doc, node->name);
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ent != NULL) {
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlChar *buffer;
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    /* an entity content can be any "well balanced chunk",
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * i.e. the result of the content [43] production:
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * http://www.w3.org/TR/REC-xml#NT-content.
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * So it can contain text, CDATA section or nested
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * entity reference nodes (among others).
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * -> we recursive  call xmlNodeListGetRawString()
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * which handles these types */
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    buffer =
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlNodeListGetRawString(doc, ent->children, 1);
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (buffer != NULL) {
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ret = xmlStrcat(ret, buffer);
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlFree(buffer);
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } else {
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ret = xmlStrcat(ret, node->content);
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else {
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlChar buf[2];
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buf[0] = '&';
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buf[1] = 0;
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = xmlStrncat(ret, buf, 1);
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = xmlStrcat(ret, node->name);
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buf[0] = ';';
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buf[1] = 0;
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = xmlStrncat(ret, buf, 1);
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else {
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlGenericError(xmlGenericErrorContext,
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "xmlGetNodeListString : invalid node type %d\n",
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            node->type);
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node = node->next;
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlAttrPtr
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewPropInternal(xmlNodePtr node, xmlNsPtr ns,
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const xmlChar * name, const xmlChar * value,
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int eatname)
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr cur;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc = NULL;
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node != NULL) && (node->type != XML_ELEMENT_NODE)) {
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((eatname == 1) &&
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((node->doc == NULL) ||
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (!(xmlDictOwns(node->doc->dict, name)))))
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlFree((xmlChar *) name);
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new property and fill the fields.
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr));
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((eatname == 1) &&
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((node == NULL) || (node->doc == NULL) ||
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (!(xmlDictOwns(node->doc->dict, name)))))
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlFree((xmlChar *) name);
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlTreeErrMemory("building attribute");
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlAttr));
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_ATTRIBUTE_NODE;
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->parent = node;
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node != NULL) {
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        doc = node->doc;
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->doc = doc;
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->ns = ns;
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (eatname == 0) {
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((doc != NULL) && (doc->dict != NULL))
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur->name = (xmlChar *) xmlDictLookup(doc->dict, name, -1);
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur->name = xmlStrdup(name);
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->name = name;
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value != NULL) {
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlNodePtr tmp;
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if(!xmlCheckUTF8(value)) {
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlTreeErr(XML_TREE_NOT_UTF8, (xmlNodePtr) doc,
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NULL);
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (doc != NULL)
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->children = xmlNewDocText(doc, value);
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->last = NULL;
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tmp = cur->children;
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while (tmp != NULL) {
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tmp->parent = (xmlNodePtr) cur;
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (tmp->next == NULL)
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cur->last = tmp;
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tmp = tmp->next;
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Add it at the end to preserve parsing order ...
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node != NULL) {
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->properties == NULL) {
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node->properties = cur;
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlAttrPtr prev = node->properties;
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (prev->next != NULL)
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                prev = prev->next;
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prev->next = cur;
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur->prev = prev;
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((value != NULL) && (node != NULL) &&
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (xmlIsID(node->doc, node, cur) == 1))
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlAddID(NULL, node->doc, value, cur);
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlRegisterNodeDefaultValue((xmlNodePtr) cur);
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (cur);
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defined(LIBXML_SCHEMAS_ENABLED)
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewProp:
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the holding node
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value of the attribute
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new property carried by a node.
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the attribute
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value) {
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewProp : name == NULL\n");
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return xmlNewPropInternal(node, NULL, name, value, 0);
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewNsProp:
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the holding node
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the namespace
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value of the attribute
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new property tagged with a namespace and carried by a node.
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the attribute
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name,
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           const xmlChar *value) {
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewNsProp : name == NULL\n");
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return xmlNewPropInternal(node, ns, name, value, 0);
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewNsPropEatName:
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the holding node
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the namespace
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value of the attribute
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new property tagged with a namespace and carried by a node.
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the attribute
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewNsPropEatName(xmlNodePtr node, xmlNsPtr ns, xmlChar *name,
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           const xmlChar *value) {
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewNsPropEatName : name == NULL\n");
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return xmlNewPropInternal(node, ns, name, value, 1);
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDocProp:
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the attribute
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the value of the attribute
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new property carried by a document.
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the attribute
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDocProp(xmlDocPtr doc, const xmlChar *name, const xmlChar *value) {
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr cur;
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewDocProp : name == NULL\n");
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new property and fill the fields.
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr));
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building attribute");
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlAttr));
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_ATTRIBUTE_NODE;
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc != NULL) && (doc->dict != NULL))
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->name = xmlDictLookup(doc->dict, name, -1);
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->name = xmlStrdup(name);
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = doc;
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value != NULL) {
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr tmp;
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->children = xmlStringGetNodeList(doc, value);
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->last = NULL;
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = cur->children;
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (tmp != NULL) {
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp->parent = (xmlNodePtr) cur;
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmp->next == NULL)
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->last = tmp;
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = tmp->next;
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreePropList:
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the first property in the list
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a property and all its siblings, all the children are freed too.
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreePropList(xmlAttrPtr cur) {
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr next;
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return;
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        next = cur->next;
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFreeProp(cur);
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = next;
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeProp:
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  an attribute
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free one attribute, all the content is freed too
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeProp(xmlAttrPtr cur) {
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict = NULL;
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return;
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->doc != NULL) dict = cur->doc->dict;
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Check for ID removal -> leading to invalid references ! */
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->doc != NULL) && (cur->atype == XML_ATTRIBUTE_ID)) {
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRemoveID(cur->doc, cur);
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->children != NULL) xmlFreeNodeList(cur->children);
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DICT_FREE(cur->name)
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(cur);
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlRemoveProp:
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  an attribute
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unlink and free one attribute, all the content is freed too
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note this doesn't work for namespace definition attributes
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if success and -1 in case of error.
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlRemoveProp(xmlAttrPtr cur) {
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr tmp;
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlRemoveProp : cur == NULL\n");
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->parent == NULL) {
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlRemoveProp : cur->parent == NULL\n");
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp = cur->parent->properties;
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tmp == cur) {
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->parent->properties = cur->next;
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->next != NULL)
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->next->prev = NULL;
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeProp(cur);
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (tmp != NULL) {
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (tmp->next == cur) {
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp->next = cur->next;
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmp->next != NULL)
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp->next->prev = tmp;
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeProp(cur);
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(0);
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tmp = tmp->next;
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlGenericError(xmlGenericErrorContext,
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "xmlRemoveProp : attribute not owned by its node\n");
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDocPI:
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the target document
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the processing instruction name
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the PI content
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a processing instruction element.
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDocPI(xmlDocPtr doc, const xmlChar *name, const xmlChar *content) {
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewPI : name == NULL\n");
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building PI");
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_PI_NODE;
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc != NULL) && (doc->dict != NULL))
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->name = xmlDictLookup(doc->dict, name, -1);
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->name = xmlStrdup(name);
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content != NULL) {
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->content = xmlStrdup(content);
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = doc;
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewPI:
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the processing instruction name
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the PI content
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a processing instruction element.
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use xmlDocNewPI preferably to get string interning
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewPI(const xmlChar *name, const xmlChar *content) {
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlNewDocPI(NULL, name, content));
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewNode:
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  namespace if any
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the node name
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new node element. @ns is optional (NULL).
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object. Uses xmlStrdup() to make
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of @name.
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewNode(xmlNsPtr ns, const xmlChar *name) {
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewNode : name == NULL\n");
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building node");
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_ELEMENT_NODE;
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->name = xmlStrdup(name);
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->ns = ns;
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue(cur);
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewNodeEatName:
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  namespace if any
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the node name
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new node element. @ns is optional (NULL).
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object, with pointer @name as
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * new node's name. Use xmlNewNode() if a copy of @name string is
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is needed as new node's name.
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewNodeEatName(xmlNsPtr ns, xmlChar *name) {
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewNode : name == NULL\n");
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building node");
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* we can't check here that name comes from the doc dictionnary */
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_ELEMENT_NODE;
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->name = name;
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->ns = ns;
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDocNode:
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  namespace if any
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the node name
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the XML text content if any
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new node element within a document. @ns and @content
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are optional (NULL).
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       references, but XML special chars need to be escaped first by using
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       need entities support.
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDocNode(xmlDocPtr doc, xmlNsPtr ns,
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const xmlChar *name, const xmlChar *content) {
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc != NULL) && (doc->dict != NULL))
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = xmlNewNodeEatName(ns, (xmlChar *)
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                        xmlDictLookup(doc->dict, name, -1));
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = xmlNewNode(ns, name);
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur != NULL) {
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->doc = doc;
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (content != NULL) {
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->children = xmlStringGetNodeList(doc, content);
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    UPDATE_LAST_CHILD_AND_PARENT(cur)
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDocNodeEatName:
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  namespace if any
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the node name
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the XML text content if any
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new node element within a document. @ns and @content
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are optional (NULL).
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       references, but XML special chars need to be escaped first by using
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       need entities support.
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDocNodeEatName(xmlDocPtr doc, xmlNsPtr ns,
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              xmlChar *name, const xmlChar *content) {
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlNewNodeEatName(ns, name);
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur != NULL) {
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->doc = doc;
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (content != NULL) {
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->children = xmlStringGetNodeList(doc, content);
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    UPDATE_LAST_CHILD_AND_PARENT(cur)
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* if name don't come from the doc dictionnary free it here */
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((name != NULL) && (doc != NULL) &&
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (!(xmlDictOwns(doc->dict, name))))
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(name);
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDocRawNode:
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  namespace if any
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the node name
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the text content if any
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new node element within a document. @ns and @content
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are optional (NULL).
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDocRawNode(xmlDocPtr doc, xmlNsPtr ns,
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const xmlChar *name, const xmlChar *content) {
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlNewDocNode(doc, ns, name, NULL);
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur != NULL) {
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->doc = doc;
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (content != NULL) {
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->children = xmlNewDocText(doc, content);
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    UPDATE_LAST_CHILD_AND_PARENT(cur)
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDocFragment:
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document owning the fragment
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new Fragment node.
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDocFragment(xmlDocPtr doc) {
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new DocumentFragment node and fill the fields.
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building fragment");
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_DOCUMENT_FRAG_NODE;
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = doc;
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue(cur);
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewText:
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the text content
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new text node.
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewText(const xmlChar *content) {
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building text");
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_TEXT_NODE;
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->name = xmlStringText;
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content != NULL) {
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->content = xmlStrdup(content);
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue(cur);
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewTextChild:
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent:  the parent node
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  a namespace if any
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the child
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the text content of the child if any.
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new child element, added at the end of @parent children list.
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns and @content parameters are optional (NULL). If @ns is NULL, the newly
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * created element inherits the namespace of @parent. If @content is non NULL,
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a child TEXT node will be created containing the string @content.
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: Use xmlNewChild() if @content will contain entities that need to be
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * preserved. Use this function, xmlNewTextChild(), if you need to ensure that
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * reserved XML chars that might appear in @content, such as the ampersand,
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * greater-than or less-than signs, are automatically replaced by their XML
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * escaped entity representations.
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewTextChild(xmlNodePtr parent, xmlNsPtr ns,
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const xmlChar *name, const xmlChar *content) {
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur, prev;
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == NULL) {
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewTextChild : parent == NULL\n");
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewTextChild : name == NULL\n");
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent->type == XML_ELEMENT_NODE) {
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns == NULL)
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocRawNode(parent->doc, parent->ns, name, content);
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocRawNode(parent->doc, ns, name, content);
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((parent->type == XML_DOCUMENT_NODE) ||
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       (parent->type == XML_HTML_DOCUMENT_NODE)) {
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns == NULL)
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocRawNode((xmlDocPtr) parent, NULL, name, content);
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocRawNode((xmlDocPtr) parent, ns, name, content);
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (parent->type == XML_DOCUMENT_FRAG_NODE) {
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocRawNode( parent->doc, ns, name, content);
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return(NULL);
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * add the new element at the end of the children list.
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_ELEMENT_NODE;
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->parent = parent;
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = parent->doc;
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent->children == NULL) {
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        parent->children = cur;
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parent->last = cur;
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prev = parent->last;
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev->next = cur;
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->prev = prev;
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parent->last = cur;
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewCharRef:
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the char ref string, starting with # or "&# ... ;"
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new character reference node.
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewCharRef(xmlDocPtr doc, const xmlChar *name) {
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL)
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building character reference");
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_ENTITY_REF_NODE;
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = doc;
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name[0] == '&') {
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int len;
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name++;
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len = xmlStrlen(name);
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (name[len - 1] == ';')
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->name = xmlStrndup(name, len - 1);
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->name = xmlStrndup(name, len);
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->name = xmlStrdup(name);
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue(cur);
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewReference:
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the reference name, or the reference string with & and ;
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new reference node.
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewReference(xmlDocPtr doc, const xmlChar *name) {
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlEntityPtr ent;
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL)
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building reference");
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_ENTITY_REF_NODE;
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = doc;
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name[0] == '&') {
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int len;
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name++;
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	len = xmlStrlen(name);
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (name[len - 1] == ';')
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->name = xmlStrndup(name, len - 1);
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->name = xmlStrndup(name, len);
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->name = xmlStrdup(name);
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ent = xmlGetDocEntity(doc, cur->name);
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ent != NULL) {
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->content = ent->content;
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * The parent pointer in entity is a DTD pointer and thus is NOT
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * updated.  Not sure if this is 100% correct.
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 *  -George
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->children = (xmlNodePtr) ent;
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->last = (xmlNodePtr) ent;
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue(cur);
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDocText:
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the text content
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new text node within a document.
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDocText(xmlDocPtr doc, const xmlChar *content) {
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlNewText(content);
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur != NULL) cur->doc = doc;
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewTextLen:
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the text content
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the text len.
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new text node with an extra parameter for the content's length
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewTextLen(const xmlChar *content, int len) {
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building text");
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_TEXT_NODE;
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->name = xmlStringText;
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content != NULL) {
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->content = xmlStrndup(content, len);
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue(cur);
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDocTextLen:
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the text content
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the text len.
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new text node with an extra content length parameter. The
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * text node pertain to a given document.
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDocTextLen(xmlDocPtr doc, const xmlChar *content, int len) {
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlNewTextLen(content, len);
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur != NULL) cur->doc = doc;
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewComment:
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the comment content
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new node containing a comment.
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewComment(const xmlChar *content) {
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building comment");
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_COMMENT_NODE;
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->name = xmlStringComment;
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content != NULL) {
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->content = xmlStrdup(content);
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue(cur);
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewCDataBlock:
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the CDATA block content content
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the length of the block
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new node containing a CDATA block.
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewCDataBlock(xmlDocPtr doc, const xmlChar *content, int len) {
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("building CDATA");
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(cur, 0, sizeof(xmlNode));
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_CDATA_SECTION_NODE;
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = doc;
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content != NULL) {
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->content = xmlStrndup(content, len);
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue(cur);
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewDocComment:
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the comment content
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new node containing a comment within a document.
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewDocComment(xmlDocPtr doc, const xmlChar *content) {
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = xmlNewComment(content);
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur != NULL) cur->doc = doc;
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetTreeDoc:
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tree:  the top element
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * update all nodes under the tree to point to the right document
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetTreeDoc(xmlNodePtr tree, xmlDocPtr doc) {
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tree == NULL)
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tree->doc != doc) {
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if(tree->type == XML_ELEMENT_NODE) {
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prop = tree->properties;
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (prop != NULL) {
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prop->doc = doc;
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSetListDoc(prop->children, doc);
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prop = prop->next;
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (tree->children != NULL)
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSetListDoc(tree->children, doc);
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tree->doc = doc;
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetListDoc:
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list:  the first element
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * update all nodes in the list to point to the right document
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetListDoc(xmlNodePtr list, xmlDocPtr doc) {
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list == NULL)
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = list;
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->doc != doc)
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSetTreeDoc(cur, doc);
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewChild:
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent:  the parent node
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  a namespace if any
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the name of the child
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the XML content of the child if any.
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creation of a new child element, added at the end of @parent children list.
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns and @content parameters are optional (NULL). If @ns is NULL, the newly
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * created element inherits the namespace of @parent. If @content is non NULL,
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a child list containing the TEXTs and ENTITY_REFs node will be created.
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       references. XML special chars must be escaped first by using
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       xmlEncodeEntitiesReentrant(), or xmlNewTextChild() should be used.
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node object.
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewChild(xmlNodePtr parent, xmlNsPtr ns,
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const xmlChar *name, const xmlChar *content) {
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur, prev;
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == NULL) {
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewChild : parent == NULL\n");
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) {
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewChild : name == NULL\n");
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent->type == XML_ELEMENT_NODE) {
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns == NULL)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocNode(parent->doc, parent->ns, name, content);
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocNode(parent->doc, ns, name, content);
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((parent->type == XML_DOCUMENT_NODE) ||
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       (parent->type == XML_HTML_DOCUMENT_NODE)) {
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns == NULL)
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocNode((xmlDocPtr) parent, NULL, name, content);
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocNode((xmlDocPtr) parent, ns, name, content);
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (parent->type == XML_DOCUMENT_FRAG_NODE) {
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = xmlNewDocNode( parent->doc, ns, name, content);
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return(NULL);
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * add the new element at the end of the children list.
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->type = XML_ELEMENT_NODE;
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->parent = parent;
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->doc = parent->doc;
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent->children == NULL) {
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        parent->children = cur;
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parent->last = cur;
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prev = parent->last;
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev->next = cur;
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->prev = prev;
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parent->last = cur;
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddPropSibling:
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prev:  the attribute to which @prop is added after
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:   the base attribute passed to calling function
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prop:  the new attribute
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a new attribute after @prev using @cur as base attribute.
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When inserting before @cur, @prev is passed as @cur->prev.
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When inserting after @cur, @prev is passed as @cur.
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If an existing attribute is found it is detroyed prior to adding @prop.
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute being inserted or NULL in case of error.
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddPropSibling(xmlNodePtr prev, xmlNodePtr cur, xmlNodePtr prop) {
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAttrPtr attr;
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type != XML_ATTRIBUTE_NODE)
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* check if an attribute with the same name exists */
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prop->ns == NULL)
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr = xmlHasNsProp(cur->parent, prop->name, NULL);
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr = xmlHasNsProp(cur->parent, prop->name, prop->ns->href);
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prop->doc != cur->doc) {
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlSetTreeDoc(prop, cur->doc);
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop->parent = cur->parent;
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop->prev = prev;
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prev != NULL) {
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prop->next = prev->next;
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev->next = prop;
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (prop->next)
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			prop->next->prev = prop;
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prop->next = cur;
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->prev = prop;
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prop->prev == NULL && prop->parent != NULL)
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prop->parent->properties = (xmlAttrPtr) prop;
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((attr != NULL) && (attr->type != XML_ATTRIBUTE_DECL)) {
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* different instance, destroy it (attributes must be unique) */
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlRemoveProp((xmlAttrPtr) attr);
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return prop;
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddNextSibling:
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the child node
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem:  the new node
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a new node @elem as the next sibling of @cur
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the new node was already inserted in a document it is
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * first unlinked from its existing context.
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * As a result of text merging @elem may be freed.
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the new node is ATTRIBUTE, it is added into properties instead of children.
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If there is an attribute with equal name, it is first destroyed.
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new node or NULL in case of error.
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddNextSibling(xmlNodePtr cur, xmlNodePtr elem) {
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddNextSibling : cur == NULL\n");
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem == NULL) {
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddNextSibling : elem == NULL\n");
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == elem) {
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddNextSibling : cur == elem\n");
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUnlinkNode(elem);
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->type == XML_TEXT_NODE) {
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_TEXT_NODE) {
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeAddContent(cur, elem->content);
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNode(elem);
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(cur);
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cur->next != NULL) && (cur->next->type == XML_TEXT_NODE) &&
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (cur->name == cur->next->name)) {
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *tmp;
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = xmlStrdup(elem->content);
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = xmlStrcat(tmp, cur->next->content);
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeSetContent(cur->next, tmp);
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(tmp);
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNode(elem);
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(cur->next);
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (elem->type == XML_ATTRIBUTE_NODE) {
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return xmlAddPropSibling(cur, cur, elem);
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->doc != cur->doc) {
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSetTreeDoc(elem, cur->doc);
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem->parent = cur->parent;
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem->prev = cur;
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem->next = cur->next;
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->next = elem;
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->next != NULL)
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	elem->next->prev = elem;
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elem->parent != NULL) && (elem->parent->last == cur))
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	elem->parent->last = elem;
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(elem);
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defined(LIBXML_SCHEMAS_ENABLED)
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddPrevSibling:
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the child node
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem:  the new node
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a new node @elem as the previous sibling of @cur
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * merging adjacent TEXT nodes (@elem may be freed)
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the new node was already inserted in a document it is
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * first unlinked from its existing context.
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the new node is ATTRIBUTE, it is added into properties instead of children.
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If there is an attribute with equal name, it is first destroyed.
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new node or NULL in case of error.
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddPrevSibling(xmlNodePtr cur, xmlNodePtr elem) {
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddPrevSibling : cur == NULL\n");
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem == NULL) {
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddPrevSibling : elem == NULL\n");
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == elem) {
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddPrevSibling : cur == elem\n");
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUnlinkNode(elem);
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->type == XML_TEXT_NODE) {
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_TEXT_NODE) {
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *tmp;
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = xmlStrdup(elem->content);
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = xmlStrcat(tmp, cur->content);
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeSetContent(cur, tmp);
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(tmp);
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNode(elem);
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(cur);
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cur->prev != NULL) && (cur->prev->type == XML_TEXT_NODE) &&
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (cur->name == cur->prev->name)) {
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeAddContent(cur->prev, elem->content);
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNode(elem);
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(cur->prev);
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (elem->type == XML_ATTRIBUTE_NODE) {
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return xmlAddPropSibling(cur->prev, cur, elem);
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->doc != cur->doc) {
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSetTreeDoc(elem, cur->doc);
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem->parent = cur->parent;
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem->next = cur;
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem->prev = cur->prev;
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->prev = elem;
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->prev != NULL)
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	elem->prev->next = elem;
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elem->parent != NULL) && (elem->parent->children == cur)) {
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elem->parent->children = elem;
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(elem);
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddSibling:
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the child node
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @elem:  the new node
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a new element @elem to the list of siblings of @cur
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * merging adjacent TEXT nodes (@elem may be freed)
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the new element was already inserted in a document it is
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * first unlinked from its existing context.
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new element or NULL in case of error.
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddSibling(xmlNodePtr cur, xmlNodePtr elem) {
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr parent;
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddSibling : cur == NULL\n");
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem == NULL) {
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddSibling : elem == NULL\n");
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == elem) {
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddSibling : cur == elem\n");
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Constant time is we can rely on the ->parent->last to find
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * the last sibling.
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->type != XML_ATTRIBUTE_NODE) && (cur->parent != NULL) &&
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->parent->children != NULL) &&
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->parent->last != NULL) &&
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->parent->last->next == NULL)) {
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->parent->last;
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (cur->next != NULL) cur = cur->next;
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUnlinkNode(elem);
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->type == XML_TEXT_NODE) && (elem->type == XML_TEXT_NODE) &&
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (cur->name == elem->name)) {
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodeAddContent(cur, elem->content);
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeNode(elem);
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(cur);
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (elem->type == XML_ATTRIBUTE_NODE) {
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return xmlAddPropSibling(cur, cur, elem);
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem->doc != cur->doc) {
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSetTreeDoc(elem, cur->doc);
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent = cur->parent;
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem->prev = cur;
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem->next = NULL;
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elem->parent = parent;
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->next = elem;
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent != NULL)
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parent->last = elem;
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(elem);
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddChildList:
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent:  the parent node
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the first node in the list
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a list of node at the end of the child list of the parent
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * merging adjacent TEXT nodes (@cur may be freed)
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the last child or NULL in case of error.
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddChildList(xmlNodePtr parent, xmlNodePtr cur) {
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr prev;
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == NULL) {
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddChildList : parent == NULL\n");
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddChildList : child == NULL\n");
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->doc != NULL) && (parent->doc != NULL) &&
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (cur->doc != parent->doc)) {
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"Elements moved to a different document\n");
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * add the first element at the end of the children list.
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent->children == NULL) {
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        parent->children = cur;
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * If cur and parent->last both are TEXT nodes, then merge them.
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cur->type == XML_TEXT_NODE) &&
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (parent->last->type == XML_TEXT_NODE) &&
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (cur->name == parent->last->name)) {
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeAddContent(parent->last, cur->content);
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * if it's the only child, nothing more to be done.
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->next == NULL) {
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeNode(cur);
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(parent->last);
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev = cur;
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNode(prev);
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prev = parent->last;
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prev->next = cur;
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->prev = prev;
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur->next != NULL) {
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->parent = parent;
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->doc != parent->doc) {
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlSetTreeDoc(cur, parent->doc);
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = cur->next;
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->parent = parent;
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* the parent may not be linked to a doc ! */
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->doc != parent->doc) {
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlSetTreeDoc(cur, parent->doc);
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent->last = cur;
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddChild:
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent:  the parent node
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the child node
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a new node to @parent, at the end of the child (or property) list
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * merging adjacent TEXT nodes (in which case @cur is freed)
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the new node is ATTRIBUTE, it is added into properties instead of children.
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If there is an attribute with equal name, it is first destroyed.
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the child or NULL in case of error.
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddChild(xmlNodePtr parent, xmlNodePtr cur) {
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr prev;
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == NULL) {
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddChild : parent == NULL\n");
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddChild : child == NULL\n");
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == cur) {
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlAddChild : parent == cur\n");
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * If cur is a TEXT node, merge its content with adjacent TEXT nodes
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * cur is then freed.
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->type == XML_TEXT_NODE) {
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((parent->type == XML_TEXT_NODE) &&
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (parent->content != NULL) &&
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (parent->name == cur->name)) {
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeAddContent(parent, cur->content);
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNode(cur);
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(parent);
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((parent->last != NULL) && (parent->last->type == XML_TEXT_NODE) &&
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (parent->last->name == cur->name) &&
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (parent->last != cur)) {
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeAddContent(parent->last, cur->content);
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNode(cur);
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(parent->last);
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * add the new element at the end of the children list.
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev = cur->parent;
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->parent = parent;
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->doc != parent->doc) {
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSetTreeDoc(cur, parent->doc);
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* this check prevents a loop on tree-traversions if a developer
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * tries to add a node to its parent multiple times
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prev == parent)
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(cur);
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Coalescing
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((parent->type == XML_TEXT_NODE) &&
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(parent->content != NULL) &&
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(parent != cur)) {
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodeAddContent(parent, cur->content);
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeNode(cur);
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(parent);
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->type == XML_ATTRIBUTE_NODE) {
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (parent->type != XML_ELEMENT_NODE)
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(NULL);
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (parent->properties != NULL) {
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* check if an attribute with the same name exists */
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAttrPtr lastattr;
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->ns == NULL)
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastattr = xmlHasNsProp(parent, cur->name, NULL);
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastattr = xmlHasNsProp(parent, cur->name, cur->ns->href);
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((lastattr != NULL) && (lastattr != (xmlAttrPtr) cur) && (lastattr->type != XML_ATTRIBUTE_DECL)) {
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* different instance, destroy it (attributes must be unique) */
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlUnlinkNode((xmlNodePtr) lastattr);
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeProp(lastattr);
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (lastattr == (xmlAttrPtr) cur)
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(cur);
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (parent->properties == NULL) {
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parent->properties = (xmlAttrPtr) cur;
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* find the end */
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAttrPtr lastattr = parent->properties;
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (lastattr->next != NULL) {
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		lastattr = lastattr->next;
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    lastattr->next = (xmlAttrPtr) cur;
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((xmlAttrPtr) cur)->prev = lastattr;
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (parent->children == NULL) {
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parent->children = cur;
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parent->last = cur;
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev = parent->last;
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev->next = cur;
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->prev = prev;
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parent->last = cur;
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(cur);
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetLastChild:
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent:  the parent node
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search the last child of a node.
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the last child or NULL if none.
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetLastChild(xmlNodePtr parent) {
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == NULL) {
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlGetLastChild : parent == NULL\n");
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(parent->last);
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5 interfaces from DOM ElementTraversal
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlChildElementCount:
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent: the parent node
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Finds the current number of child nodes of that element which are
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element nodes.
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note the handling of entities references is different than in
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the W3C DOM element traversal spec since we don't have back reference
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from entities content to entities references.
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the count of element child or 0 if not available
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned long
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChildElementCount(xmlNodePtr parent) {
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned long ret = 0;
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur = NULL;
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == NULL)
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (parent->type) {
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur = parent->children;
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(0);
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->type == XML_ELEMENT_NODE)
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret++;
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = cur->next;
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFirstElementChild:
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent: the parent node
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Finds the first child node of that element which is a Element node
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note the handling of entities references is different than in
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the W3C DOM element traversal spec since we don't have back reference
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from entities content to entities references.
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the first element child or NULL if not available
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFirstElementChild(xmlNodePtr parent) {
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur = NULL;
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == NULL)
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (parent->type) {
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur = parent->children;
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(NULL);
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->type == XML_ELEMENT_NODE)
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(cur);
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = cur->next;
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlLastElementChild:
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent: the parent node
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Finds the last child node of that element which is a Element node
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note the handling of entities references is different than in
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the W3C DOM element traversal spec since we don't have back reference
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from entities content to entities references.
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the last element child or NULL if not available
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlLastElementChild(xmlNodePtr parent) {
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur = NULL;
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent == NULL)
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (parent->type) {
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur = parent->last;
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(NULL);
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (cur->type == XML_ELEMENT_NODE)
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(cur);
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = cur->prev;
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlPreviousElementSibling:
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the current node
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Finds the first closest previous sibling of the node which is an
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element node.
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note the handling of entities references is different than in
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the W3C DOM element traversal spec since we don't have back reference
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from entities content to entities references.
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the previous element sibling or NULL if not available
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlPreviousElementSibling(xmlNodePtr node) {
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL)
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_START:
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_END:
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node = node->prev;
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(NULL);
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_ELEMENT_NODE)
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(node);
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node = node->prev;
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNextElementSibling:
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the current node
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Finds the first closest next sibling of the node which is an
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element node.
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note the handling of entities references is different than in
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the W3C DOM element traversal spec since we don't have back reference
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from entities content to entities references.
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the next element sibling or NULL if not available
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNextElementSibling(xmlNodePtr node) {
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL)
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_START:
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_END:
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node = node->next;
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(NULL);
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_ELEMENT_NODE)
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(node);
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node = node->next;
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeNodeList:
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the first node in the list
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a node and all its siblings, this is a recursive behaviour, all
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the children are freed too.
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeNodeList(xmlNodePtr cur) {
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr next;
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict = NULL;
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return;
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->type == XML_NAMESPACE_DECL) {
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeNsList((xmlNsPtr) cur);
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->type == XML_DOCUMENT_NODE) ||
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->type == XML_DOCB_DOCUMENT_NODE) ||
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->type == XML_HTML_DOCUMENT_NODE)) {
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDoc((xmlDocPtr) cur);
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->doc != NULL) dict = cur->doc->dict;
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        next = cur->next;
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type != XML_DTD_NODE) {
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlDeregisterNodeDefaultValue(cur);
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur->children != NULL) &&
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->type != XML_ENTITY_REF_NODE))
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeNodeList(cur->children);
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (((cur->type == XML_ELEMENT_NODE) ||
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (cur->type == XML_XINCLUDE_START) ||
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (cur->type == XML_XINCLUDE_END)) &&
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->properties != NULL))
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreePropList(cur->properties);
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur->type != XML_ELEMENT_NODE) &&
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->type != XML_XINCLUDE_START) &&
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->type != XML_XINCLUDE_END) &&
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->type != XML_ENTITY_REF_NODE) &&
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->content != (xmlChar *) &(cur->properties))) {
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		DICT_FREE(cur->content)
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (((cur->type == XML_ELEMENT_NODE) ||
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	         (cur->type == XML_XINCLUDE_START) ||
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 (cur->type == XML_XINCLUDE_END)) &&
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->nsDef != NULL))
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFreeNsList(cur->nsDef);
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * When a node is a text node or a comment, it uses a global static
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * variable for the name of the node.
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Otherwise the node name might come from the document's
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * dictionnary
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur->name != NULL) &&
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->type != XML_TEXT_NODE) &&
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->type != XML_COMMENT_NODE))
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		DICT_FREE(cur->name)
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(cur);
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = next;
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeNode:
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free a node, this is a recursive behaviour, all the children are freed too.
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This doesn't unlink the child from the list, use xmlUnlinkNode() first.
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeNode(xmlNodePtr cur) {
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict = NULL;
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return;
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* use xmlFreeDtd for DTD nodes */
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->type == XML_DTD_NODE) {
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeDtd((xmlDtdPtr) cur);
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->type == XML_NAMESPACE_DECL) {
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeNs((xmlNsPtr) cur);
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->type == XML_ATTRIBUTE_NODE) {
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeProp((xmlAttrPtr) cur);
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDeregisterNodeDefaultValue(cur);
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->doc != NULL) dict = cur->doc->dict;
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->type == XML_ENTITY_DECL) {
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlEntityPtr ent = (xmlEntityPtr) cur;
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	DICT_FREE(ent->SystemID);
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	DICT_FREE(ent->ExternalID);
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->children != NULL) &&
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->type != XML_ENTITY_REF_NODE))
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeNodeList(cur->children);
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((cur->type == XML_ELEMENT_NODE) ||
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (cur->type == XML_XINCLUDE_START) ||
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (cur->type == XML_XINCLUDE_END)) &&
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->properties != NULL))
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreePropList(cur->properties);
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->type != XML_ELEMENT_NODE) &&
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->content != NULL) &&
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->type != XML_ENTITY_REF_NODE) &&
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->type != XML_XINCLUDE_END) &&
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->type != XML_XINCLUDE_START) &&
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->content != (xmlChar *) &(cur->properties))) {
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	DICT_FREE(cur->content)
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * When a node is a text node or a comment, it uses a global static
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * variable for the name of the node.
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Otherwise the node name might come from the document's dictionnary
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->name != NULL) &&
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (cur->type != XML_TEXT_NODE) &&
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (cur->type != XML_COMMENT_NODE))
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	DICT_FREE(cur->name)
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((cur->type == XML_ELEMENT_NODE) ||
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (cur->type == XML_XINCLUDE_START) ||
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (cur->type == XML_XINCLUDE_END)) &&
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->nsDef != NULL))
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFreeNsList(cur->nsDef);
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(cur);
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlUnlinkNode:
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unlink a node from it's current context, the node is not freed
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlUnlinkNode(xmlNodePtr cur) {
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlUnlinkNode : node == NULL\n");
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->type == XML_DTD_NODE) {
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDocPtr doc;
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc = cur->doc;
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc != NULL) {
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc->intSubset == (xmlDtdPtr) cur)
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc->intSubset = NULL;
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc->extSubset == (xmlDtdPtr) cur)
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc->extSubset = NULL;
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->type == XML_ENTITY_DECL) {
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlDocPtr doc;
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc = cur->doc;
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc != NULL) {
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc->intSubset != NULL) {
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (xmlHashLookup(doc->intSubset->entities, cur->name) == cur)
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlHashRemoveEntry(doc->intSubset->entities, cur->name,
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                       NULL);
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (xmlHashLookup(doc->intSubset->pentities, cur->name) == cur)
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlHashRemoveEntry(doc->intSubset->pentities, cur->name,
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                       NULL);
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc->extSubset != NULL) {
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (xmlHashLookup(doc->extSubset->entities, cur->name) == cur)
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlHashRemoveEntry(doc->extSubset->entities, cur->name,
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                       NULL);
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (xmlHashLookup(doc->extSubset->pentities, cur->name) == cur)
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlHashRemoveEntry(doc->extSubset->pentities, cur->name,
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                       NULL);
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->parent != NULL) {
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr parent;
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parent = cur->parent;
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_ATTRIBUTE_NODE) {
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (parent->properties == (xmlAttrPtr) cur)
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parent->properties = ((xmlAttrPtr) cur)->next;
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (parent->children == cur)
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parent->children = cur->next;
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (parent->last == cur)
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parent->last = cur->prev;
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->parent = NULL;
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->next != NULL)
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->next->prev = cur->prev;
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->prev != NULL)
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur->prev->next = cur->next;
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->next = cur->prev = NULL;
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED)
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReplaceNode:
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @old:  the old node
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unlink the old node from its current context, prune the new one
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * at the same place. If @cur was already inserted in a document it is
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * first unlinked from its existing context.
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the @old node
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReplaceNode(xmlNodePtr old, xmlNodePtr cur) {
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (old == cur) return(NULL);
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((old == NULL) || (old->parent == NULL)) {
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlReplaceNode : old == NULL or without parent\n");
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlUnlinkNode(old);
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(old);
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == old) {
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(old);
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((old->type==XML_ATTRIBUTE_NODE) && (cur->type!=XML_ATTRIBUTE_NODE)) {
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlReplaceNode : Trying to replace attribute node with other node type\n");
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(old);
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->type==XML_ATTRIBUTE_NODE) && (old->type!=XML_ATTRIBUTE_NODE)) {
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlReplaceNode : Trying to replace a non-attribute node with attribute node\n");
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(old);
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUnlinkNode(cur);
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSetTreeDoc(cur, old->doc);
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->parent = old->parent;
38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->next = old->next;
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->next != NULL)
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->next->prev = cur;
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur->prev = old->prev;
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->prev != NULL)
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->prev->next = cur;
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->parent != NULL) {
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_ATTRIBUTE_NODE) {
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->parent->properties == (xmlAttrPtr)old)
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->parent->properties = ((xmlAttrPtr) cur);
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->parent->children == old)
38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->parent->children = cur;
38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->parent->last == old)
38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->parent->last = cur;
38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old->next = old->prev = NULL;
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old->parent = NULL;
38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(old);
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Copy operations						*
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyNamespace:
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the namespace
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of the namespace.
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlNsPtr, or NULL in case of error.
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNsPtr
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyNamespace(xmlNsPtr cur) {
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ret;
38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return(NULL);
38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (cur->type) {
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_LOCAL_NAMESPACE:
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = xmlNewNs(NULL, cur->href, cur->prefix);
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    "xmlCopyNamespace: invalid type %d\n", cur->type);
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyNamespaceList:
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the first namespace
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of an namespace list.
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlNsPtr, or NULL in case of error.
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNsPtr
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyNamespaceList(xmlNsPtr cur) {
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ret = NULL;
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr p = NULL,q;
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        q = xmlCopyNamespace(cur);
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (p == NULL) {
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = p = q;
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    p->next = q;
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    p = q;
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent);
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlAttrPtr
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyPropInternal(xmlDocPtr doc, xmlNodePtr target, xmlAttrPtr cur) {
39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr ret;
39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return(NULL);
39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (target != NULL)
39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlNewDocProp(target->doc, cur->name, NULL);
39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (doc != NULL)
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlNewDocProp(doc, cur->name, NULL);
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (cur->parent != NULL)
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlNewDocProp(cur->parent->doc, cur->name, NULL);
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (cur->children != NULL)
39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlNewDocProp(cur->children->doc, cur->name, NULL);
39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlNewDocProp(NULL, cur->name, NULL);
39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) return(NULL);
39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->parent = target;
39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur->ns != NULL) && (target != NULL)) {
39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      xmlNsPtr ns;
39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ns = xmlSearchNs(target->doc, target, cur->ns->prefix);
39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ns == NULL) {
39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Humm, we are copying an element whose namespace is defined
39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * out of the new tree scope. Search it in the original tree
39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * and add it at the top of the new tree
39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ns = xmlSearchNs(cur->doc, cur->parent, cur->ns->prefix);
39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ns != NULL) {
39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          xmlNodePtr root = target;
39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          xmlNodePtr pred = NULL;
39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while (root->parent != NULL) {
39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pred = root;
39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            root = root->parent;
39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (root == (xmlNodePtr) target->doc) {
39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* correct possibly cycling above the document elt */
39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            root = pred;
39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ret->ns = xmlNewNs(root, ns->href, ns->prefix);
39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * we have to find something appropriate here since
39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * we cant be sure, that the namespce we found is identified
39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * by the prefix
39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlStrEqual(ns->href, cur->ns->href)) {
39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* this is the nice case */
39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ret->ns = ns;
39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /*
39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           * we are in trouble: we need a new reconcilied namespace.
39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           * This is expensive
39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           */
39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ret->ns = xmlNewReconciliedNs(target->doc, target, cur->ns);
39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->ns = NULL;
39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur->children != NULL) {
39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr tmp;
39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->children = xmlStaticCopyNodeList(cur->children, ret->doc, (xmlNodePtr) ret);
39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->last = NULL;
39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = ret->children;
39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (tmp != NULL) {
39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* tmp->parent = (xmlNodePtr)ret; */
39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmp->next == NULL)
39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ret->last = tmp;
39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = tmp->next;
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Try to handle IDs
39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((target!= NULL) && (cur!= NULL) &&
39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(target->doc != NULL) && (cur->doc != NULL) &&
40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(cur->doc->ids != NULL) && (cur->parent != NULL)) {
40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlIsID(cur->doc, cur->parent, cur)) {
40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *id;
40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    id = xmlNodeListGetString(cur->doc, cur->children, 1);
40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (id != NULL) {
40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAddID(NULL, target->doc, id, ret);
40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(id);
40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyProp:
40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target:  the element where the attribute will be grafted
40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the attribute
40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of the attribute.
40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlAttrPtr, or NULL in case of error.
40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyProp(xmlNodePtr target, xmlAttrPtr cur) {
40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return xmlCopyPropInternal(NULL, target, cur);
40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyPropList:
40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target:  the element where the attributes will be grafted
40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the first attribute
40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of an attribute list.
40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlAttrPtr, or NULL in case of error.
40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyPropList(xmlNodePtr target, xmlAttrPtr cur) {
40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr ret = NULL;
40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr p = NULL,q;
40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        q = xmlCopyProp(target, cur);
40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (q == NULL)
40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (p == NULL) {
40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = p = q;
40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    p->next = q;
40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    q->prev = p;
40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    p = q;
40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE about the CopyNode operations !
40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * They are split into external and internal parts for one
40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * tricky reason: namespaces. Doing a direct copy of a node
40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * say RPM:Copyright without changing the namespace pointer to
40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * something else can produce stale links. One way to do it is
40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to keep a reference counter but this doesn't work as soon
40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * as one move the element or the subtree out of the scope of
40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the existing namespace. The actual solution seems to add
40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a copy of the namespace at the top of the copied tree if
40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * not available in the subtree.
40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Hence two functions, the public front-end call the inner ones
40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The argument "recursive" normally indicates a recursive copy
40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the node with values 0 (no) and 1 (yes).  For XInclude,
40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * however, we allow a value of 2 to indicate copy properties and
40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * namespace info, but don't recurse on children.
40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr
40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlStaticCopyNode(const xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent,
40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int extended) {
40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret;
40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) return(NULL);
40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_START:
40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_END:
40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return((xmlNodePtr) xmlCopyPropInternal(doc, parent, (xmlAttrPtr) node));
40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NAMESPACE_DECL:
40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return((xmlNodePtr) xmlCopyNamespaceList((xmlNsPtr) node));
40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCB_DOCUMENT_NODE:
41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return((xmlNodePtr) xmlCopyDoc((xmlDocPtr) node, extended));
41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(NULL);
41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Allocate a new node and fill the fields.
41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("copying node");
41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlNode));
41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->type = node->type;
41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->doc = doc;
41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->parent = parent;
41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->name == xmlStringText)
41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->name = xmlStringText;
41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (node->name == xmlStringTextNoenc)
41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->name = xmlStringTextNoenc;
41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (node->name == xmlStringComment)
41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->name = xmlStringComment;
41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (node->name != NULL) {
41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((doc != NULL) && (doc->dict != NULL))
41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret->name = xmlDictLookup(doc->dict, node->name, -1);
41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret->name = xmlStrdup(node->name);
41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type != XML_ELEMENT_NODE) &&
41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->content != NULL) &&
41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_ENTITY_REF_NODE) &&
41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_XINCLUDE_END) &&
41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_XINCLUDE_START)) {
41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->content = xmlStrdup(node->content);
41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (node->type == XML_ELEMENT_NODE)
41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->line = node->line;
41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parent != NULL) {
41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr tmp;
41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * this is a tricky part for the node register thing:
41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * in case ret does get coalesced in xmlAddChild
41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * the deregister-node callback is called; so we register ret now already
41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRegisterNodeDefaultValue((xmlNodePtr)ret);
41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tmp = xmlAddChild(parent, ret);
41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* node could have coalesced */
41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (tmp != ret)
41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(tmp);
41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!extended)
41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	goto out;
41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((node->type == XML_ELEMENT_NODE) ||
41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (node->type == XML_XINCLUDE_START)) && (node->nsDef != NULL))
41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->nsDef = xmlCopyNamespaceList(node->nsDef);
41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->ns != NULL) {
41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlNsPtr ns;
41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns = xmlSearchNs(doc, ret, node->ns->prefix);
41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns == NULL) {
41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * Humm, we are copying an element whose namespace is defined
41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * out of the new tree scope. Search it in the original tree
41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * and add it at the top of the new tree
41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns = xmlSearchNs(node->doc, node, node->ns->prefix);
41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ns != NULL) {
41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlNodePtr root = ret;
41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (root->parent != NULL) root = root->parent;
41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret->ns = xmlNewNs(root, ns->href, ns->prefix);
41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ret->ns = xmlNewReconciliedNs(doc, ret, node->ns);
41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * reference the existing namespace definition in our own tree.
41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret->ns = ns;
41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (((node->type == XML_ELEMENT_NODE) ||
42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (node->type == XML_XINCLUDE_START)) && (node->properties != NULL))
42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->properties = xmlCopyPropList(ret, node->properties);
42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->type == XML_ENTITY_REF_NODE) {
42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((doc == NULL) || (node->doc != doc)) {
42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * The copied node will go into a separate document, so
42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * to avoid dangling references to the ENTITY_DECL node
42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * we cannot keep the reference. Try to find it in the
42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * target document.
42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret->children = (xmlNodePtr) xmlGetDocEntity(doc, ret->name);
42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret->children = node->children;
42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->last = ret->children;
42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((node->children != NULL) && (extended != 2)) {
42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->children = xmlStaticCopyNodeList(node->children, doc, ret);
42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	UPDATE_LAST_CHILD_AND_PARENT(ret)
42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)out:
42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* if parent != NULL we already registered the node above */
42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((parent == NULL) &&
42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)))
42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlRegisterNodeDefaultValue((xmlNodePtr)ret);
42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr
42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent) {
42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret = NULL;
42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr p = NULL,q;
42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->type == XML_DTD_NODE ) {
42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc == NULL) {
42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node = node->next;
42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc->intSubset == NULL) {
42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = (xmlNodePtr) xmlCopyDtd( (xmlDtdPtr) node );
42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q->doc = doc;
42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q->parent = parent;
42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc->intSubset = (xmlDtdPtr) q;
42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAddChild(parent, q);
42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		q = (xmlNodePtr) doc->intSubset;
42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlAddChild(parent, q);
42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    q = xmlStaticCopyNode(node, doc, parent, 1);
42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == NULL) {
42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    q->prev = NULL;
42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = p = q;
42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (p != q) {
42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* the test is required if xmlStaticCopyNode coalesced 2 text nodes */
42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    p->next = q;
42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    q->prev = p;
42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    p = q;
42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node = node->next;
42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyNode:
42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extended:   if 1 do a recursive copy (properties, namespaces and children
42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			when applicable)
42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		if 2 copy properties and namespaces (when applicable)
42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of the node.
42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlNodePtr, or NULL in case of error.
42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyNode(const xmlNodePtr node, int extended) {
42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret;
42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlStaticCopyNode(node, NULL, NULL, extended);
42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDocCopyNode:
42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extended:   if 1 do a recursive copy (properties, namespaces and children
42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			when applicable)
42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		if 2 copy properties and namespaces (when applicable)
42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of the node to a given document.
42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlNodePtr, or NULL in case of error.
42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocCopyNode(const xmlNodePtr node, xmlDocPtr doc, int extended) {
43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret;
43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlStaticCopyNode(node, doc, NULL, extended);
43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDocCopyNodeList:
43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the target document
43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the first node in the list.
43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a recursive copy of the node list.
43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlNodePtr, or NULL in case of error.
43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr xmlDocCopyNodeList(xmlDocPtr doc, const xmlNodePtr node) {
43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret = xmlStaticCopyNodeList(node, doc, NULL);
43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyNodeList:
43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the first node in the list.
43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a recursive copy of the node list.
43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use xmlDocCopyNodeList() if possible to ensure string interning.
43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlNodePtr, or NULL in case of error.
43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr xmlCopyNodeList(const xmlNodePtr node) {
43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret = xmlStaticCopyNodeList(node, NULL, NULL);
43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED)
43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyDtd:
43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @dtd:  the dtd
43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of the dtd.
43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlDtdPtr, or NULL in case of error.
43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDtdPtr
43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyDtd(xmlDtdPtr dtd) {
43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDtdPtr ret;
43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur, p = NULL, q;
43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd == NULL) return(NULL);
43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlNewDtd(NULL, dtd->name, dtd->ExternalID, dtd->SystemID);
43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) return(NULL);
43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd->entities != NULL)
43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->entities = (void *) xmlCopyEntitiesTable(
43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                    (xmlEntitiesTablePtr) dtd->entities);
43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd->notations != NULL)
43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->notations = (void *) xmlCopyNotationTable(
43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                    (xmlNotationTablePtr) dtd->notations);
43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd->elements != NULL)
43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->elements = (void *) xmlCopyElementTable(
43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                    (xmlElementTablePtr) dtd->elements);
43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd->attributes != NULL)
43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->attributes = (void *) xmlCopyAttributeTable(
43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                    (xmlAttributeTablePtr) dtd->attributes);
43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dtd->pentities != NULL)
43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->pentities = (void *) xmlCopyEntitiesTable(
43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (xmlEntitiesTablePtr) dtd->pentities);
43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = dtd->children;
43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	q = NULL;
43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_ENTITY_DECL) {
43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlEntityPtr tmp = (xmlEntityPtr) cur;
43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    switch (tmp->etype) {
43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_INTERNAL_GENERAL_ENTITY:
43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    q = (xmlNodePtr) xmlGetEntityFromDtd(ret, tmp->name);
43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_INTERNAL_PARAMETER_ENTITY:
43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_EXTERNAL_PARAMETER_ENTITY:
43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    q = (xmlNodePtr)
43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlGetParameterEntityFromDtd(ret, tmp->name);
43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case XML_INTERNAL_PREDEFINED_ENTITY:
43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (cur->type == XML_ELEMENT_DECL) {
43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlElementPtr tmp = (xmlElementPtr) cur;
43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    q = (xmlNodePtr)
43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetDtdQElementDesc(ret, tmp->name, tmp->prefix);
43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (cur->type == XML_ATTRIBUTE_DECL) {
43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAttributePtr tmp = (xmlAttributePtr) cur;
43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    q = (xmlNodePtr)
43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlGetDtdQAttrDesc(ret, tmp->elem, tmp->name, tmp->prefix);
43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (cur->type == XML_COMMENT_NODE) {
43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    q = xmlCopyNode(cur, 0);
43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (q == NULL) {
44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (p == NULL)
44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret->children = q;
44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    p->next = q;
44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	q->prev = p;
44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	q->parent = (xmlNodePtr) ret;
44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	q->next = NULL;
44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->last = q;
44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	p = q;
44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyDoc:
44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @recursive:  if not zero do a recursive copy.
44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of the document info. If recursive, the content tree will
44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be copied too as well as DTD, namespaces and entities.
44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new #xmlDocPtr, or NULL in case of error.
44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocPtr
44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyDoc(xmlDocPtr doc, int recursive) {
44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr ret;
44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) return(NULL);
44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlNewDoc(doc->version);
44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) return(NULL);
44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc->name != NULL)
44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->name = xmlMemStrdup(doc->name);
44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc->encoding != NULL)
44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->encoding = xmlStrdup(doc->encoding);
44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc->URL != NULL)
44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->URL = xmlStrdup(doc->URL);
44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->charset = doc->charset;
44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->compression = doc->compression;
44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->standalone = doc->standalone;
44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!recursive) return(ret);
44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->last = NULL;
44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->children = NULL;
44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc->intSubset != NULL) {
44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->intSubset = xmlCopyDtd(doc->intSubset);
44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSetTreeDoc((xmlNodePtr)ret->intSubset, ret);
44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->intSubset->parent = ret;
44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc->oldNs != NULL)
44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->oldNs = xmlCopyNamespaceList(doc->oldNs);
44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc->children != NULL) {
44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr tmp;
44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->children = xmlStaticCopyNodeList(doc->children, ret,
44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		                               (xmlNodePtr)ret);
44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->last = NULL;
44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = ret->children;
44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (tmp != NULL) {
44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmp->next == NULL)
44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        ret->last = tmp;
44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = tmp->next;
44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *		Content access functions				*
44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetLineNo:
44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: valid node
44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get line number of @node. This requires activation of this option
44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * before invoking the parser by calling xmlLineNumbersDefault(1)
44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the line number if successful, -1 otherwise
44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long
44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetLineNo(xmlNodePtr node)
44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long result = -1;
44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!node)
45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return result;
45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type == XML_ELEMENT_NODE) ||
45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (node->type == XML_TEXT_NODE) ||
45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type == XML_COMMENT_NODE) ||
45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type == XML_PI_NODE))
45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result = (long) node->line;
45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((node->prev != NULL) &&
45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ((node->prev->type == XML_ELEMENT_NODE) ||
45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      (node->prev->type == XML_TEXT_NODE) ||
45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      (node->prev->type == XML_COMMENT_NODE) ||
45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      (node->prev->type == XML_PI_NODE)))
45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result = xmlGetLineNo(node->prev);
45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if ((node->parent != NULL) &&
45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (node->parent->type == XML_ELEMENT_NODE))
45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result = xmlGetLineNo(node->parent);
45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetNodePath:
45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: a node
45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Build a structure based Path for the given node
45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new path or NULL in case of error. The caller must free
45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     the returned string
45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetNodePath(xmlNodePtr node)
45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur, tmp, next;
45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *buffer = NULL, *temp;
45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t buf_len;
45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *buf;
45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *sep;
45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *name;
45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char nametemp[100];
45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int occur = 0, generic;
45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL)
45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf_len = 500;
45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer = (xmlChar *) xmlMallocAtomic(buf_len * sizeof(xmlChar));
45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buffer == NULL) {
45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("getting node path");
45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf = (xmlChar *) xmlMallocAtomic(buf_len * sizeof(xmlChar));
45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("getting node path");
45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(buffer);
45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer[0] = 0;
45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = node;
45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name = "";
45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sep = "?";
45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        occur = 0;
45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((cur->type == XML_DOCUMENT_NODE) ||
45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (cur->type == XML_HTML_DOCUMENT_NODE)) {
45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (buffer[0] == '/')
45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sep = "/";
45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            next = NULL;
45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (cur->type == XML_ELEMENT_NODE) {
45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    generic = 0;
45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sep = "/";
45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name = (const char *) cur->name;
45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur->ns) {
45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->ns->prefix != NULL) {
45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    snprintf(nametemp, sizeof(nametemp) - 1, "%s:%s",
45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(char *)cur->ns->prefix, (char *)cur->name);
45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nametemp[sizeof(nametemp) - 1] = 0;
45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    name = nametemp;
45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * We cannot express named elements in the default
45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * namespace, so use "*".
45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    generic = 1;
45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    name = "*";
45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            next = cur->parent;
45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /*
45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * Thumbler index computation
45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * TODO: the ocurence test seems bogus for namespaced names
45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             */
45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tmp = cur->prev;
45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (tmp != NULL) {
45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if ((tmp->type == XML_ELEMENT_NODE) &&
45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (generic ||
45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     (xmlStrEqual(cur->name, tmp->name) &&
46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     ((tmp->ns == cur->ns) ||
46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      ((tmp->ns != NULL) && (cur->ns != NULL) &&
46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       (xmlStrEqual(cur->ns->prefix, tmp->ns->prefix)))))))
46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    occur++;
46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tmp = tmp->prev;
46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (occur == 0) {
46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tmp = cur->next;
46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while (tmp != NULL && occur == 0) {
46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if ((tmp->type == XML_ELEMENT_NODE) &&
46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(generic ||
46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 (xmlStrEqual(cur->name, tmp->name) &&
46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 ((tmp->ns == cur->ns) ||
46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  ((tmp->ns != NULL) && (cur->ns != NULL) &&
46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   (xmlStrEqual(cur->ns->prefix, tmp->ns->prefix)))))))
46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        occur++;
46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    tmp = tmp->next;
46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (occur != 0)
46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    occur = 1;
46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else
46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                occur++;
46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (cur->type == XML_COMMENT_NODE) {
46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sep = "/";
46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    name = "comment()";
46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            next = cur->parent;
46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /*
46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * Thumbler index computation
46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             */
46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tmp = cur->prev;
46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (tmp != NULL) {
46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (tmp->type == XML_COMMENT_NODE)
46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    occur++;
46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tmp = tmp->prev;
46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (occur == 0) {
46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tmp = cur->next;
46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while (tmp != NULL && occur == 0) {
46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (tmp->type == XML_COMMENT_NODE)
46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    occur++;
46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    tmp = tmp->next;
46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (occur != 0)
46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    occur = 1;
46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else
46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                occur++;
46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if ((cur->type == XML_TEXT_NODE) ||
46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (cur->type == XML_CDATA_SECTION_NODE)) {
46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sep = "/";
46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    name = "text()";
46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            next = cur->parent;
46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /*
46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * Thumbler index computation
46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             */
46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tmp = cur->prev;
46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (tmp != NULL) {
46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if ((tmp->type == XML_TEXT_NODE) ||
46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (tmp->type == XML_CDATA_SECTION_NODE))
46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    occur++;
46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tmp = tmp->prev;
46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Evaluate if this is the only text- or CDATA-section-node;
46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * if yes, then we'll get "text()", otherwise "text()[1]".
46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (occur == 0) {
46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tmp = cur->next;
46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while (tmp != NULL) {
46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((tmp->type == XML_TEXT_NODE) ||
46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(tmp->type == XML_CDATA_SECTION_NODE))
46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			occur = 1;
46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = tmp->next;
46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else
46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                occur++;
46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (cur->type == XML_PI_NODE) {
46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sep = "/";
46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf(nametemp, sizeof(nametemp) - 1,
46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     "processing-instruction('%s')", (char *)cur->name);
46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            nametemp[sizeof(nametemp) - 1] = 0;
46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name = nametemp;
46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    next = cur->parent;
46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /*
46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * Thumbler index computation
46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             */
46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tmp = cur->prev;
46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (tmp != NULL) {
46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if ((tmp->type == XML_PI_NODE) &&
46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlStrEqual(cur->name, tmp->name)))
46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    occur++;
46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tmp = tmp->prev;
46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (occur == 0) {
47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tmp = cur->next;
47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while (tmp != NULL && occur == 0) {
47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if ((tmp->type == XML_PI_NODE) &&
47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(xmlStrEqual(cur->name, tmp->name)))
47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        occur++;
47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    tmp = tmp->next;
47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (occur != 0)
47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    occur = 1;
47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } else
47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                occur++;
47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (cur->type == XML_ATTRIBUTE_NODE) {
47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sep = "/@";
47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            name = (const char *) (((xmlAttrPtr) cur)->name);
47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur->ns) {
47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (cur->ns->prefix != NULL)
47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    snprintf(nametemp, sizeof(nametemp) - 1, "%s:%s",
47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(char *)cur->ns->prefix, (char *)cur->name);
47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    snprintf(nametemp, sizeof(nametemp) - 1, "%s",
47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(char *)cur->name);
47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                nametemp[sizeof(nametemp) - 1] = 0;
47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                name = nametemp;
47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            next = ((xmlAttrPtr) cur)->parent;
47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            next = cur->parent;
47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Make sure there is enough room
47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlStrlen(buffer) + sizeof(nametemp) + 20 > buf_len) {
47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            buf_len =
47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                2 * buf_len + xmlStrlen(buffer) + sizeof(nametemp) + 20;
47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            temp = (xmlChar *) xmlRealloc(buffer, buf_len);
47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (temp == NULL) {
47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlTreeErrMemory("getting node path");
47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlFree(buf);
47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlFree(buffer);
47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (NULL);
47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            buffer = temp;
47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            temp = (xmlChar *) xmlRealloc(buf, buf_len);
47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (temp == NULL) {
47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlTreeErrMemory("getting node path");
47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlFree(buf);
47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlFree(buffer);
47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (NULL);
47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            buf = temp;
47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (occur == 0)
47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            snprintf((char *) buf, buf_len, "%s%s%s",
47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     sep, name, (char *) buffer);
47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            snprintf((char *) buf, buf_len, "%s%s[%d]%s",
47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     sep, name, occur, (char *) buffer);
47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        snprintf((char *) buffer, buf_len, "%s", (char *)buf);
47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = next;
47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (cur != NULL);
47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(buf);
47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (buffer);
47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDocGetRootElement:
47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the root element of the document (doc->children is a list
47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * containing possibly comments, PIs, etc ...).
47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the #xmlNodePtr for the root or NULL
47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocGetRootElement(xmlDocPtr doc) {
47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr ret;
47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) return(NULL);
47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = doc->children;
47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (ret != NULL) {
47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret->type == XML_ELEMENT_NODE)
47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(ret);
47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = ret->next;
47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED)
47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDocSetRootElement:
47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @root:  the new document root element, if root is NULL no action is taken,
47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         to remove a node from a document use xmlUnlinkNode(root) instead.
47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the root element of the document (doc->children is a list
47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * containing possibly comments, PIs, etc ...).
47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the old root element if any was found, NULL if root was NULL
48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root) {
48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr old = NULL;
48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) return(NULL);
48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (root == NULL)
48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUnlinkNode(root);
48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSetTreeDoc(root, doc);
48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->parent = (xmlNodePtr) doc;
48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old = doc->children;
48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (old != NULL) {
48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (old->type == XML_ELEMENT_NODE)
48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        old = old->next;
48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (old == NULL) {
48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc->children == NULL) {
48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc->children = root;
48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc->last = root;
48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAddSibling(doc->children, root);
48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlReplaceNode(old, root);
48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(old);
48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED)
48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeSetLang:
48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being changed
48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @lang:  the language description
48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the language of a node, i.e. the values of the xml:lang
48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attribute.
48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeSetLang(xmlNodePtr cur, const xmlChar *lang) {
48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return;
48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch(cur->type) {
48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL:
48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCB_DOCUMENT_NODE:
48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_START:
48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_END:
48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE);
48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns == NULL)
48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlSetNsProp(cur, ns, BAD_CAST "lang", lang);
48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeGetLang:
48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being checked
48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Searches the language of a node, i.e. the values of the xml:lang
48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attribute or the one carried by the nearest ancestor.
48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the lang value, or NULL if not found
48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     It's up to the caller to free the memory with xmlFree().
48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeGetLang(xmlNodePtr cur) {
48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *lang;
48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        lang = xmlGetNsProp(cur, BAD_CAST "lang", XML_XML_NAMESPACE);
48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (lang != NULL)
48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(lang);
48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->parent;
48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeSetSpacePreserve:
49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being changed
49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @val:  the xml:space value ("0": default, 1: "preserve")
49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set (or reset) the space preserving behaviour of a node, i.e. the
49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * value of the xml:space attribute.
49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeSetSpacePreserve(xmlNodePtr cur, int val) {
49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return;
49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch(cur->type) {
49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL:
49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_START:
49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_END:
49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCB_DOCUMENT_NODE:
49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE);
49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns == NULL)
49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (val) {
49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0:
49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSetNsProp(cur, ns, BAD_CAST "space", BAD_CAST "default");
49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1:
49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSetNsProp(cur, ns, BAD_CAST "space", BAD_CAST "preserve");
49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeGetSpacePreserve:
49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being checked
49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Searches the space preserving behaviour of a node, i.e. the values
49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the xml:space attribute or the one carried by the nearest
49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ancestor.
49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 if xml:space is not inherited, 0 if "default", 1 if "preserve"
49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeGetSpacePreserve(xmlNodePtr cur) {
49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *space;
49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	space = xmlGetNsProp(cur, BAD_CAST "space", XML_XML_NAMESPACE);
49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (space != NULL) {
49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(space, BAD_CAST "preserve")) {
49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(space);
49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(1);
49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlStrEqual(space, BAD_CAST "default")) {
49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(space);
49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(0);
49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(space);
49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->parent;
49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(-1);
49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeSetName:
49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being changed
49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the new tag name
49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set (or reset) the name of a node.
49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeSetName(xmlNodePtr cur, const xmlChar *name) {
50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict;
50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return;
50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name == NULL) return;
50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch(cur->type) {
50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL:
50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_START:
50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_END:
50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCB_DOCUMENT_NODE:
50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = cur->doc;
50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL)
50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	dict = doc->dict;
50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dict = NULL;
50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dict != NULL) {
50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((cur->name != NULL) && (!xmlDictOwns(dict, cur->name)))
50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree((xmlChar *) cur->name);
50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->name = xmlDictLookup(dict, name, -1);
50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->name != NULL) xmlFree((xmlChar *) cur->name);
50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->name = xmlStrdup(name);
50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED)
50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeSetBase:
50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being changed
50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @uri:  the new base URI
50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set (or reset) the base URI of a node, i.e. the value of the
50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xml:base attribute.
50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeSetBase(xmlNodePtr cur, const xmlChar* uri) {
50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar* fixed;
50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) return;
50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch(cur->type) {
50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL:
50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_START:
50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_END:
50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCB_DOCUMENT_NODE:
50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE: {
50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDocPtr doc = (xmlDocPtr) cur;
50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc->URL != NULL)
50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree((xmlChar *) doc->URL);
50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (uri == NULL)
50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc->URL = NULL;
50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    else
50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		doc->URL = xmlPathToURI(uri);
50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return;
50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE);
51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns == NULL)
51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fixed = xmlPathToURI(uri);
51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fixed != NULL) {
51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSetNsProp(cur, ns, BAD_CAST "base", fixed);
51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(fixed);
51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlSetNsProp(cur, ns, BAD_CAST "base", uri);
51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeGetBase:
51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document the node pertains to
51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being checked
51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Searches for the BASE URL. The code should work on both XML
51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and HTML document even if base mechanisms are completely different.
51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It returns the base as defined in RFC 2396 sections
51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5.1.1. Base URI within Document Content
51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and
51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5.1.2. Base URI from the Encapsulating Entity
51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * However it does not return the document base (5.1.3), use
51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * doc->URL in this case
51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the base URL, or NULL if not found
51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     It's up to the caller to free the memory with xmlFree().
51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeGetBase(xmlDocPtr doc, xmlNodePtr cur) {
51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *oldbase = NULL;
51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *base, *newbase;
51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) && (doc == NULL))
51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) doc = cur->doc;
51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) {
51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cur = doc->children;
51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while ((cur != NULL) && (cur->name != NULL)) {
51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->type != XML_ELEMENT_NODE) {
51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        cur = cur->next;
51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!xmlStrcasecmp(cur->name, BAD_CAST "html")) {
51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        cur = cur->children;
51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!xmlStrcasecmp(cur->name, BAD_CAST "head")) {
51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        cur = cur->children;
51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (!xmlStrcasecmp(cur->name, BAD_CAST "base")) {
51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return(xmlGetProp(cur, BAD_CAST "href"));
51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_ENTITY_DECL) {
51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlEntityPtr ent = (xmlEntityPtr) cur;
51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlStrdup(ent->URI));
51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_ELEMENT_NODE) {
51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    base = xmlGetNsProp(cur, BAD_CAST "base", XML_XML_NAMESPACE);
51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (base != NULL) {
51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (oldbase != NULL) {
51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    newbase = xmlBuildURI(oldbase, base);
51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (newbase != NULL) {
51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree(oldbase);
51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree(base);
51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			oldbase = newbase;
51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree(oldbase);
51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree(base);
51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return(NULL);
51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    oldbase = base;
51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((!xmlStrncmp(oldbase, BAD_CAST "http://", 7)) ||
51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrncmp(oldbase, BAD_CAST "ftp://", 6)) ||
51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (!xmlStrncmp(oldbase, BAD_CAST "urn:", 4)))
51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(oldbase);
51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->parent;
51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc != NULL) && (doc->URL != NULL)) {
51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (oldbase == NULL)
51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlStrdup(doc->URL));
51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	newbase = xmlBuildURI(oldbase, doc->URL);
51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(oldbase);
51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(newbase);
51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(oldbase);
52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeBufGetContent:
52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buffer:  a buffer
52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being read
52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read the value of a node @cur, this can be either the text carried
52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * directly by this node if it's a TEXT node or the aggregate string
52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the values carried by this node child's (TEXT and ENTITY_REF).
52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Entity references are substituted.
52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fills up the buffer @buffer with this value
52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success and -1 in case of error.
52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeBufGetContent(xmlBufferPtr buffer, xmlNodePtr cur)
52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((cur == NULL) || (buffer == NULL)) return(-1);
52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (cur->type) {
52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferCat(buffer, cur->content);
52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:{
52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlNodePtr tmp = cur;
52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while (tmp != NULL) {
52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    switch (tmp->type) {
52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XML_CDATA_SECTION_NODE:
52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XML_TEXT_NODE:
52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            if (tmp->content != NULL)
52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                xmlBufferCat(buffer, tmp->content);
52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        case XML_ENTITY_REF_NODE:
52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            xmlNodeBufGetContent(buffer, tmp);
52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        default:
52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    /*
52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     * Skip to next node
52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     */
52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (tmp->children != NULL) {
52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (tmp->children->type != XML_ENTITY_DECL) {
52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            tmp = tmp->children;
52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            continue;
52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (tmp == cur)
52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        break;
52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (tmp->next != NULL) {
52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        tmp = tmp->next;
52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        continue;
52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    do {
52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        tmp = tmp->parent;
52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (tmp == NULL)
52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (tmp == cur) {
52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            tmp = NULL;
52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (tmp->next != NULL) {
52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            tmp = tmp->next;
52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            break;
52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    } while (tmp != NULL);
52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:{
52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlAttrPtr attr = (xmlAttrPtr) cur;
52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlNodePtr tmp = attr->children;
52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (tmp != NULL) {
52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (tmp->type == XML_TEXT_NODE)
52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        xmlBufferCat(buffer, tmp->content);
52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        xmlNodeBufGetContent(buffer, tmp);
52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    tmp = tmp->next;
52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferCat(buffer, cur->content);
52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:{
52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlEntityPtr ent;
52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlNodePtr tmp;
52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* lookup entity declaration */
52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ent = xmlGetDocEntity(cur->doc, cur->name);
52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ent == NULL)
52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return(-1);
52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* an entity content can be any "well balanced chunk",
53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 * i.e. the result of the content [43] production:
53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 * http://www.w3.org/TR/REC-xml#NT-content
53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 * -> we iterate through child nodes and recursive call
53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 * xmlNodeGetContent() which handles all possible node types */
53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tmp = ent->children;
53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                while (tmp) {
53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodeBufGetContent(buffer, tmp);
53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    tmp = tmp->next;
53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_START:
53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_END:
53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCB_DOCUMENT_NODE:
53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->children;
53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (cur!= NULL) {
53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((cur->type == XML_ELEMENT_NODE) ||
53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (cur->type == XML_TEXT_NODE) ||
53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (cur->type == XML_CDATA_SECTION_NODE)) {
53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodeBufGetContent(buffer, cur);
53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->next;
53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NAMESPACE_DECL:
53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferCat(buffer, ((xmlNsPtr) cur)->href);
53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeGetContent:
53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being read
53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Read the value of a node, this can be either the text carried
53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * directly by this node if it's a TEXT node or the aggregate string
53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the values carried by this node child's (TEXT and ENTITY_REF).
53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Entity references are substituted.
53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a new #xmlChar * or NULL if no content is available.
53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     It's up to the caller to free the memory with xmlFree().
53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeGetContent(xmlNodePtr cur)
53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL)
53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (cur->type) {
53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:{
53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlBufferPtr buffer;
53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlChar *ret;
53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buffer = xmlBufferCreateSize(64);
53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (buffer == NULL)
53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return (NULL);
53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlNodeBufGetContent(buffer, cur);
53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = buffer->content;
53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buffer->content = NULL;
53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlBufferFree(buffer);
53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (ret);
53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlGetPropNodeValueInternal((xmlAttrPtr) cur));
53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur->content != NULL)
53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (xmlStrdup(cur->content));
53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:{
53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlEntityPtr ent;
53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlBufferPtr buffer;
53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlChar *ret;
53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                /* lookup entity declaration */
53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ent = xmlGetDocEntity(cur->doc, cur->name);
53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ent == NULL)
53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return (NULL);
53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buffer = xmlBufferCreate();
53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (buffer == NULL)
53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return (NULL);
53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlNodeBufGetContent(buffer, cur);
53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ret = buffer->content;
53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                buffer->content = NULL;
54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlBufferFree(buffer);
54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (ret);
54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_START:
54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_XINCLUDE_END:
54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCB_DOCUMENT_NODE:
54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE: {
54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferPtr buffer;
54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *ret;
54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buffer = xmlBufferCreate();
54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (buffer == NULL)
54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (NULL);
54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodeBufGetContent(buffer, (xmlNodePtr) cur);
54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ret = buffer->content;
54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buffer->content = NULL;
54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferFree(buffer);
54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (ret);
54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NAMESPACE_DECL: {
54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlChar *tmp;
54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = xmlStrdup(((xmlNsPtr) cur)->href);
54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (tmp);
54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* TODO !!! */
54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* TODO !!! */
54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* TODO !!! */
54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur->content != NULL)
54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (xmlStrdup(cur->content));
54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeSetContent:
54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being modified
54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the new value of the content
54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Replace the content of a node.
54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity
54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       references, but XML special chars need to be escaped first by using
54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().
54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeSetContent(xmlNodePtr cur, const xmlChar *content) {
54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNodeSetContent : node == NULL\n");
54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (cur->type) {
54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->children != NULL) xmlFreeNodeList(cur->children);
54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->children = xmlStringGetNodeList(cur->doc, content);
54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    UPDATE_LAST_CHILD_AND_PARENT(cur)
54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur->content != NULL) &&
54875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (cur->content != (xmlChar *) &(cur->properties))) {
54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (!((cur->doc != NULL) && (cur->doc->dict != NULL) &&
54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlDictOwns(cur->doc->dict, cur->content))))
54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(cur->content);
54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->children != NULL) xmlFreeNodeList(cur->children);
54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->last = cur->children = NULL;
54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (content != NULL) {
54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->content = xmlStrdup(content);
54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->content = NULL;
54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->properties = NULL;
54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->nsDef = NULL;
55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_START:
55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_END:
55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCB_DOCUMENT_NODE:
55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL:
55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO !!! */
55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO !!! */
55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO !!! */
55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeSetContentLen:
55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being modified
55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the new value of the content
55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the size of @content
55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Replace the content of a node.
55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity
55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       references, but XML special chars need to be escaped first by using
55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().
55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeSetContentLen(xmlNodePtr cur, const xmlChar *content, int len) {
55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNodeSetContentLen : node == NULL\n");
55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (cur->type) {
55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE:
55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->children != NULL) xmlFreeNodeList(cur->children);
55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->children = xmlStringLenGetNodeList(cur->doc, content, len);
55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    UPDATE_LAST_CHILD_AND_PARENT(cur)
55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((cur->content != NULL) &&
55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (cur->content != (xmlChar *) &(cur->properties))) {
55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (!((cur->doc != NULL) && (cur->doc->dict != NULL) &&
55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlDictOwns(cur->doc->dict, cur->content))))
55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(cur->content);
55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->children != NULL) xmlFreeNodeList(cur->children);
55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->children = cur->last = NULL;
55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (content != NULL) {
55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->content = xmlStrndup(content, len);
55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else
55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->content = NULL;
55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->properties = NULL;
55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->nsDef = NULL;
55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL:
55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_START:
55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_END:
55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCB_DOCUMENT_NODE:
55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO !!! */
55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO !!! */
55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO !!! */
55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeAddContentLen:
56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being modified
56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  extra content
56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the size of @content
56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Append the extra substring to the node content.
56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: In contrast to xmlNodeSetContentLen(), @content is supposed to be
56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       raw text, so unescaped XML special chars are allowed, entity
56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       references are not supported.
56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeAddContentLen(xmlNodePtr cur, const xmlChar *content, int len) {
56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNodeAddContentLen : node == NULL\n");
56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len <= 0) return;
56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (cur->type) {
56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_FRAG_NODE:
56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_NODE: {
56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodePtr last, newNode, tmp;
56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    last = cur->last;
56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    newNode = xmlNewTextLen(content, len);
56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (newNode != NULL) {
56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = xmlAddChild(cur, newNode);
56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (tmp != newNode)
56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return;
56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if ((last != NULL) && (last->next == newNode)) {
56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlTextMerge(last, newNode);
56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_NODE:
56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_TEXT_NODE:
56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_CDATA_SECTION_NODE:
56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_REF_NODE:
56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_NODE:
56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_PI_NODE:
56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_COMMENT_NODE:
56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_NOTATION_NODE:
56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (content != NULL) {
56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if ((cur->content == (xmlChar *) &(cur->properties)) ||
56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((cur->doc != NULL) && (cur->doc->dict != NULL) &&
56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlDictOwns(cur->doc->dict, cur->content))) {
56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->content = xmlStrncatNew(cur->content, content, len);
56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->properties = NULL;
56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->nsDef = NULL;
56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->content = xmlStrncat(cur->content, content, len);
56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_NODE:
56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DTD_NODE:
56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_HTML_DOCUMENT_NODE:
56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_DOCUMENT_TYPE_NODE:
56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_NAMESPACE_DECL:
56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_START:
56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_XINCLUDE_END:
56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED
56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCB_DOCUMENT_NODE:
56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ELEMENT_DECL:
56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ATTRIBUTE_DECL:
56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case XML_ENTITY_DECL:
56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeAddContent:
56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur:  the node being modified
56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  extra content
56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Append the extra substring to the node content.
56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: In contrast to xmlNodeSetContent(), @content is supposed to be
56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       raw text, so unescaped XML special chars are allowed, entity
56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       references are not supported.
56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeAddContent(xmlNodePtr cur, const xmlChar *content) {
56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cur == NULL) {
56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNodeAddContent : node == NULL\n");
56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content == NULL) return;
57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = xmlStrlen(content);
57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeAddContentLen(cur, content, len);
57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextMerge:
57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @first:  the first text node
57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @second:  the second text node being merged
57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Merge two text nodes into one
57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the first text node augmented
57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr
57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextMerge(xmlNodePtr first, xmlNodePtr second) {
57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (first == NULL) return(second);
57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (second == NULL) return(first);
57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (first->type != XML_TEXT_NODE) return(first);
57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (second->type != XML_TEXT_NODE) return(first);
57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (second->name != first->name)
57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(first);
57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodeAddContent(first, second->content);
57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUnlinkNode(second);
57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeNode(second);
57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(first);
57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetNsList:
57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the current node
57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search all the namespace applying to a given element.
57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an NULL terminated array of all the #xmlNsPtr found
57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         that need to be freed by the caller or NULL if no
57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         namespace if defined
57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNsPtr *
57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetNsList(xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr node)
57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr cur;
57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr *ret = NULL;
57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbns = 0;
57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int maxns = 10;
57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_ELEMENT_NODE) {
57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur = node->nsDef;
57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (cur != NULL) {
57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (ret == NULL) {
57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ret =
57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (xmlNsPtr *) xmlMalloc((maxns + 1) *
57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               sizeof(xmlNsPtr));
57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (ret == NULL) {
57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlTreeErrMemory("getting namespace list");
57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        return (NULL);
57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ret[nbns] = NULL;
57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                for (i = 0; i < nbns; i++) {
57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if ((cur->prefix == ret[i]->prefix) ||
57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (xmlStrEqual(cur->prefix, ret[i]->prefix)))
57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        break;
57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (i >= nbns) {
57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (nbns >= maxns) {
57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        maxns *= 2;
57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ret = (xmlNsPtr *) xmlRealloc(ret,
57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      (maxns +
57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       1) *
57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      sizeof(xmlNsPtr));
57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        if (ret == NULL) {
57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlTreeErrMemory("getting namespace list");
57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            return (NULL);
57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        }
57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ret[nbns++] = cur;
57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ret[nbns] = NULL;
57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cur = cur->next;
57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node = node->parent;
57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlTreeEnsureXMLDecl:
57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @doc: the doc
57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Ensures that there is an XML namespace declaration on the doc.
57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns the XML ns-struct or NULL on API and internal errors.
57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsPtr
58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTreeEnsureXMLDecl(xmlDocPtr doc)
58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL)
58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc->oldNs != NULL)
58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (doc->oldNs);
58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNsPtr ns;
58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
58095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns == NULL) {
58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory(
58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"allocating the XML namespace");
58125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memset(ns, 0, sizeof(xmlNs));
58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns->type = XML_LOCAL_NAMESPACE;
58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns->href = xmlStrdup(XML_XML_NAMESPACE);
58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns->prefix = xmlStrdup((const xmlChar *)"xml");
58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc->oldNs = ns;
58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ns);
58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSearchNs:
58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the current node
58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nameSpace:  the namespace prefix
58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search a Ns registered under a given name space for a document.
58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * recurse on the parents until it finds the defined namespace
58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or return NULL otherwise.
58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nameSpace can be NULL, this is a search for the default namespace.
58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We don't allow to cross entities boundaries. If you don't declare
58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the namespace within those you will be in troubles !!! A warning
58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is generated to cover this case.
58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the namespace pointer or NULL.
58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNsPtr
58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSearchNs(xmlDocPtr doc, xmlNodePtr node, const xmlChar *nameSpace) {
58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr cur;
58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr orig = node;
58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) return(NULL);
58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((nameSpace != NULL) &&
58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(xmlStrEqual(nameSpace, (const xmlChar *)"xml"))) {
58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((doc == NULL) && (node->type == XML_ELEMENT_NODE)) {
58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * The XML-1.0 namespace is normally held on the root
58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * element. In this case exceptionally create it on the
58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * node element.
58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur == NULL) {
58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlTreeErrMemory("searching namespace");
58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    memset(cur, 0, sizeof(xmlNs));
58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->type = XML_LOCAL_NAMESPACE;
58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->href = xmlStrdup(XML_XML_NAMESPACE);
58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->prefix = xmlStrdup((const xmlChar *)"xml");
58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->next = node->nsDef;
58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node->nsDef = cur;
58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(cur);
58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc == NULL) {
58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc = node->doc;
58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc == NULL)
58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Return the XML namespace declaration held by the doc.
58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
58755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc->oldNs == NULL)
58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlTreeEnsureXMLDecl(doc));
58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(doc->oldNs);
58795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((node->type == XML_ENTITY_REF_NODE) ||
58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->type == XML_ENTITY_NODE) ||
58835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->type == XML_ENTITY_DECL))
58845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(NULL);
58855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->type == XML_ELEMENT_NODE) {
58865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = node->nsDef;
58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (cur != NULL) {
58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((cur->prefix == NULL) && (nameSpace == NULL) &&
58895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (cur->href != NULL))
58905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(cur);
58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((cur->prefix != NULL) && (nameSpace != NULL) &&
58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (cur->href != NULL) &&
58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (xmlStrEqual(cur->prefix, nameSpace)))
58945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(cur);
58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->next;
58965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (orig != node) {
58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        cur = node->ns;
58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (cur != NULL) {
59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((cur->prefix == NULL) && (nameSpace == NULL) &&
59015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        (cur->href != NULL))
59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        return(cur);
59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((cur->prefix != NULL) && (nameSpace != NULL) &&
59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        (cur->href != NULL) &&
59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        (xmlStrEqual(cur->prefix, nameSpace)))
59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        return(cur);
59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        }
59085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node = node->parent;
59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNsInScope:
59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the current node
59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ancestor:  the ancestor carrying the namespace
59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @prefix:  the namespace prefix
59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Verify that the given namespace held on @ancestor is still in scope
59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * on node.
59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if true, 0 if false and -1 in case of error.
59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNsInScope(xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr node,
59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             xmlNodePtr ancestor, const xmlChar * prefix)
59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr tst;
59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((node != NULL) && (node != ancestor)) {
59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((node->type == XML_ENTITY_REF_NODE) ||
59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_ENTITY_NODE) ||
59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_ENTITY_DECL))
59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (-1);
59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_ELEMENT_NODE) {
59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            tst = node->nsDef;
59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (tst != NULL) {
59415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if ((tst->prefix == NULL)
59425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    && (prefix == NULL))
59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return (0);
59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if ((tst->prefix != NULL)
59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    && (prefix != NULL)
59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    && (xmlStrEqual(tst->prefix, prefix)))
59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return (0);
59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tst = tst->next;
59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
59505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node = node->parent;
59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node != ancestor)
59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (1);
59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSearchNsByHref:
59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the current node
59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @href:  the namespace value
59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search a Ns aliasing a given URI. Recurse on the parents until it finds
59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the defined namespace or return NULL otherwise.
59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the namespace pointer or NULL.
59675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNsPtr
59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSearchNsByHref(xmlDocPtr doc, xmlNodePtr node, const xmlChar * href)
59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
59715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr cur;
59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr orig = node;
59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int is_attr;
59745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (href == NULL))
59765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (NULL);
59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(href, XML_XML_NAMESPACE)) {
59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * Only the document can hold the XML spec namespace.
59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((doc == NULL) && (node->type == XML_ELEMENT_NODE)) {
59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /*
59835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * The XML-1.0 namespace is normally held on the root
59845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * element. In this case exceptionally create it on the
59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             * node element.
59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             */
59875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cur == NULL) {
59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlTreeErrMemory("searching namespace");
59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return (NULL);
59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            memset(cur, 0, sizeof(xmlNs));
59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur->type = XML_LOCAL_NAMESPACE;
59945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur->href = xmlStrdup(XML_XML_NAMESPACE);
59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur->prefix = xmlStrdup((const xmlChar *) "xml");
59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur->next = node->nsDef;
59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node->nsDef = cur;
59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (cur);
59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc == NULL) {
60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    doc = node->doc;
60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (doc == NULL)
60035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
60045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Return the XML namespace declaration held by the doc.
60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (doc->oldNs == NULL)
60095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlTreeEnsureXMLDecl(doc));
60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(doc->oldNs);
60125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_attr = (node->type == XML_ATTRIBUTE_NODE);
60145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((node->type == XML_ENTITY_REF_NODE) ||
60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_ENTITY_NODE) ||
60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (node->type == XML_ENTITY_DECL))
60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return (NULL);
60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (node->type == XML_ELEMENT_NODE) {
60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cur = node->nsDef;
60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while (cur != NULL) {
60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if ((cur->href != NULL) && (href != NULL) &&
60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (xmlStrEqual(cur->href, href))) {
60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (((!is_attr) || (cur->prefix != NULL)) &&
60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        (xmlNsInScope(doc, orig, node, cur->prefix) == 1))
60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (cur);
60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cur = cur->next;
60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (orig != node) {
60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                cur = node->ns;
60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (cur != NULL) {
60335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if ((cur->href != NULL) && (href != NULL) &&
60345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (xmlStrEqual(cur->href, href))) {
60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (((!is_attr) || (cur->prefix != NULL)) &&
60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		            (xmlNsInScope(doc, orig, node, cur->prefix) == 1))
60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return (cur);
60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node = node->parent;
60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewReconciliedNs:
60495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tree:  a node expected to hold the new namespace
60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the original namespace
60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function tries to locate a namespace definition in a tree
60545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ancestors, or create a new namespace definition node similar to
60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns trying to reuse the same prefix. However if the given prefix is
60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * null (default namespace) or reused within the subtree defined by
60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tree or on one of its ancestors then a new prefix is generated.
60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the (new) namespace definition or NULL in case of error
60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsPtr
60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewReconciliedNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns) {
60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr def;
60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar prefix[50];
60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int counter = 1;
60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tree == NULL) {
60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewReconciliedNs : tree == NULL\n");
60705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
60715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) {
60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlNewReconciliedNs : ns == NULL\n");
60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Search an existing namespace definition inherited.
60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def = xmlSearchNsByHref(doc, tree, ns->href);
60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (def != NULL)
60855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(def);
60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
60885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Find a close prefix which is not already in use.
60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Let's strip namespace prefixes longer than 20 chars !
60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns->prefix == NULL)
60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	snprintf((char *) prefix, sizeof(prefix), "default");
60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	snprintf((char *) prefix, sizeof(prefix), "%.20s", (char *)ns->prefix);
60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def = xmlSearchNs(doc, tree, prefix);
60975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (def != NULL) {
60985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (counter > 1000) return(NULL);
60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns->prefix == NULL)
61005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf((char *) prefix, sizeof(prefix), "default%d", counter++);
61015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
61025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf((char *) prefix, sizeof(prefix), "%.20s%d",
61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(char *)ns->prefix, counter++);
61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	def = xmlSearchNs(doc, tree, prefix);
61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
61065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * OK, now we are ready to create a new one.
61095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def = xmlNewNs(tree, ns->href, prefix);
61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(def);
61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
61155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
61165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlReconciliateNs:
61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
61185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @tree:  a node defining the subtree to reconciliate
61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
61205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function checks that all the namespaces declared within the given
61215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * tree are properly declared. This is needed for example after Copy or Cut
61225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and then paste operations. The subtree may still hold pointers to
61235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * namespace declarations outside the subtree or invalid/masked. As much
61245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * as possible the function try to reuse the existing namespaces found in
61255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the new environment. If not possible the new namespaces are redeclared
61265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * on @tree at the top of the given subtree.
61275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of namespace declarations created or -1 in case of error.
61285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
61295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
61305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlReconciliateNs(xmlDocPtr doc, xmlNodePtr tree) {
61315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr *oldNs = NULL;
61325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr *newNs = NULL;
61335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeCache = 0;
61345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nbCache = 0;
61355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr n;
61375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr node = tree;
61385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr attr;
61395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0, i;
61405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) return(-1);
61425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc == NULL) || (doc->type != XML_DOCUMENT_NODE)) return(-1);
61435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->doc != doc) return(-1);
61445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (node != NULL) {
61455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
61465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Reconciliate the node namespace
61475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
61485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->ns != NULL) {
61495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
61505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * initialize the cache if needed
61515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
61525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (sizeCache == 0) {
61535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sizeCache = 10;
61545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		oldNs = (xmlNsPtr *) xmlMalloc(sizeCache *
61555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					       sizeof(xmlNsPtr));
61565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (oldNs == NULL) {
61575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlTreeErrMemory("fixing namespaces");
61585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
61595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
61605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		newNs = (xmlNsPtr *) xmlMalloc(sizeCache *
61615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					       sizeof(xmlNsPtr));
61625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (newNs == NULL) {
61635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlTreeErrMemory("fixing namespaces");
61645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(oldNs);
61655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(-1);
61665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
61675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
61685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for (i = 0;i < nbCache;i++) {
61695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (oldNs[i] == node->ns) {
61705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node->ns = newNs[i];
61715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
61725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
61735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
61745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (i == nbCache) {
61755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        /*
61765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 * OK we need to recreate a new namespace definition
61775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		 */
61785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		n = xmlNewReconciliedNs(doc, tree, node->ns);
61795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (n != NULL) { /* :-( what if else ??? */
61805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
61815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     * check if we need to grow the cache buffers.
61825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     */
61835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (sizeCache <= nbCache) {
61845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        sizeCache *= 2;
61855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			oldNs = (xmlNsPtr *) xmlRealloc(oldNs, sizeCache *
61865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			                               sizeof(xmlNsPtr));
61875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        if (oldNs == NULL) {
61885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlTreeErrMemory("fixing namespaces");
61895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlFree(newNs);
61905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
61915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
61925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			newNs = (xmlNsPtr *) xmlRealloc(newNs, sizeCache *
61935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			                               sizeof(xmlNsPtr));
61945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		        if (newNs == NULL) {
61955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlTreeErrMemory("fixing namespaces");
61965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlFree(oldNs);
61975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
61985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
61995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
62005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    newNs[nbCache] = n;
62015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    oldNs[nbCache++] = node->ns;
62025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node->ns = n;
62035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
62045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
62055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
62065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
62075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * now check for namespace hold by attributes on the node.
62085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
62095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->type == XML_ELEMENT_NODE) {
62105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attr = node->properties;
62115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (attr != NULL) {
62125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (attr->ns != NULL) {
62135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
62145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     * initialize the cache if needed
62155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     */
62165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (sizeCache == 0) {
62175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sizeCache = 10;
62185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			oldNs = (xmlNsPtr *) xmlMalloc(sizeCache *
62195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						       sizeof(xmlNsPtr));
62205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (oldNs == NULL) {
62215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlTreeErrMemory("fixing namespaces");
62225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
62235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
62245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			newNs = (xmlNsPtr *) xmlMalloc(sizeCache *
62255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						       sizeof(xmlNsPtr));
62265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (newNs == NULL) {
62275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlTreeErrMemory("fixing namespaces");
62285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlFree(oldNs);
62295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
62305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
62315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
62325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (i = 0;i < nbCache;i++) {
62335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (oldNs[i] == attr->ns) {
62345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    attr->ns = newNs[i];
62355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
62365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
62375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
62385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (i == nbCache) {
62395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
62405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 * OK we need to recreate a new namespace definition
62415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 */
62425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			n = xmlNewReconciliedNs(doc, tree, attr->ns);
62435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (n != NULL) { /* :-( what if else ??? */
62445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
62455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     * check if we need to grow the cache buffers.
62465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     */
62475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (sizeCache <= nbCache) {
62485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				sizeCache *= 2;
62495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				oldNs = (xmlNsPtr *) xmlRealloc(oldNs,
62505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				           sizeCache * sizeof(xmlNsPtr));
62515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (oldNs == NULL) {
62525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlTreeErrMemory("fixing namespaces");
62535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlFree(newNs);
62545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    return(-1);
62555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
62565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				newNs = (xmlNsPtr *) xmlRealloc(newNs,
62575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				           sizeCache * sizeof(xmlNsPtr));
62585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (newNs == NULL) {
62595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlTreeErrMemory("fixing namespaces");
62605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlFree(oldNs);
62615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    return(-1);
62625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
62635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
62645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    newNs[nbCache] = n;
62655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    oldNs[nbCache++] = attr->ns;
62665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    attr->ns = n;
62675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
62685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
62695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attr = attr->next;
62715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
62725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * Browse the full subtree, deep first
62765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ((node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) {
62785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* deep first */
62795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = node->children;
62805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((node != tree) && (node->next != NULL)) {
62815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* then siblings */
62825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = node->next;
62835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (node != tree) {
62845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* go up to parents->next if needed */
62855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (node != tree) {
62865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (node->parent != NULL)
62875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = node->parent;
62885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((node != tree) && (node->next != NULL)) {
62895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = node->next;
62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (node->parent == NULL) {
62935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = NULL;
62945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
62955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
62965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
62975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* exit condition */
62985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (node == tree)
62995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        node = NULL;
63005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
63015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
63025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
63035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (oldNs != NULL)
63045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(oldNs);
63055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (newNs != NULL)
63065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(newNs);
63075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
63085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
63095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlAttrPtr
63125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetPropNodeInternal(xmlNodePtr node, const xmlChar *name,
63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       const xmlChar *nsName, int useDTD)
63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (node->type != XML_ELEMENT_NODE) || (name == NULL))
63185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
63195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->properties != NULL) {
63215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop = node->properties;
63225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsName == NULL) {
63235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
63245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We want the attr to be in no namespace.
63255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
63265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    do {
63275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((prop->ns == NULL) && xmlStrEqual(prop->name, name)) {
63285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(prop);
63295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
63305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prop = prop->next;
63315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } while (prop != NULL);
63325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
63345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We want the attr to be in the specified namespace.
63355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
63365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    do {
63375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((prop->ns != NULL) && xmlStrEqual(prop->name, name) &&
63385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((prop->ns->href == nsName) ||
63395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlStrEqual(prop->ns->href, nsName)))
63405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
63415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(prop);
63425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
63435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prop = prop->next;
63445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } while (prop != NULL);
63455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
63465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
63475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED
63495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (! useDTD)
63505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
63515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
63525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Check if there is a default/fixed attribute declaration in
63535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * the internal or external subset.
63545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
63555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->doc != NULL) && (node->doc->intSubset != NULL)) {
63565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDocPtr doc = node->doc;
63575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlAttributePtr attrDecl = NULL;
63585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *elemQName, *tmpstr = NULL;
63595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
63615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* We need the QName of the element for the DTD-lookup.
63625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
63635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((node->ns != NULL) && (node->ns->prefix != NULL)) {
63645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpstr = xmlStrdup(node->ns->prefix);
63655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpstr = xmlStrcat(tmpstr, BAD_CAST ":");
63665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmpstr = xmlStrcat(tmpstr, node->name);
63675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (tmpstr == NULL)
63685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
63695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elemQName = tmpstr;
63705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
63715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elemQName = (xmlChar *) node->name;
63725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (nsName == NULL) {
63735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
63745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * The common and nice case: Attr in no namespace.
63755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
63765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attrDecl = xmlGetDtdQAttrDesc(doc->intSubset,
63775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		elemQName, name, NULL);
63785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((attrDecl == NULL) && (doc->extSubset != NULL)) {
63795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attrDecl = xmlGetDtdQAttrDesc(doc->extSubset,
63805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    elemQName, name, NULL);
63815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
63825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
63835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNsPtr *nsList, *cur;
63845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
63865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * The ugly case: Search using the prefixes of in-scope
63875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * ns-decls corresponding to @nsName.
63885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
63895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    nsList = xmlGetNsList(node->doc, node);
63905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nsList == NULL) {
63915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (tmpstr != NULL)
63925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(tmpstr);
63935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(NULL);
63945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
63955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = nsList;
63965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (*cur != NULL) {
63975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlStrEqual((*cur)->href, nsName)) {
63985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elemQName,
63995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			name, (*cur)->prefix);
64005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (attrDecl)
64015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
64025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (doc->extSubset != NULL) {
64035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elemQName,
64045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    name, (*cur)->prefix);
64055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (attrDecl)
64065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    break;
64075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
64085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
64095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur++;
64105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
64115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(nsList);
64125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
64135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (tmpstr != NULL)
64145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(tmpstr);
64155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
64165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Only default/fixed attrs are relevant.
64175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
64185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL))
64195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return((xmlAttrPtr) attrDecl);
64205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
64225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
64235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
64245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlChar*
64265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetPropNodeValueInternal(xmlAttrPtr prop)
64275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
64285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prop == NULL)
64295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
64305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prop->type == XML_ATTRIBUTE_NODE) {
64315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
64325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Note that we return at least the empty string.
64335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*   TODO: Do we really always want that?
64345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
64355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prop->children != NULL) {
64365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((prop->children->next == NULL) &&
64375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((prop->children->type == XML_TEXT_NODE) ||
64385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(prop->children->type == XML_CDATA_SECTION_NODE)))
64395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
64405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
64415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Optimization for the common case: only 1 text node.
64425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
64435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return(xmlStrdup(prop->children->content));
64445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
64455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *ret;
64465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ret = xmlNodeListGetString(prop->doc, prop->children, 1);
64485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ret != NULL)
64495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return(ret);
64505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
64515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
64525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlStrdup((xmlChar *)""));
64535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (prop->type == XML_ATTRIBUTE_DECL) {
64545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(xmlStrdup(((xmlAttributePtr)prop)->defaultValue));
64555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
64575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
64585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
64605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlHasProp:
64615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
64625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
64635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
64645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search an attribute associated to a node
64655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function also looks in DTD attribute declaration for #FIXED or
64665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * default declaration values unless DTD use has been turned off.
64675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
64685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute or the attribute declaration or NULL if
64695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         neither was found.
64705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
64715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
64725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlHasProp(xmlNodePtr node, const xmlChar *name) {
64735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
64745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
64755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (node->type != XML_ELEMENT_NODE) || (name == NULL))
64775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
64785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
64795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Check on the properties attached to the node
64805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
64815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prop = node->properties;
64825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (prop != NULL) {
64835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlStrEqual(prop->name, name))  {
64845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(prop);
64855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
64865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop = prop->next;
64875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!xmlCheckDTD) return(NULL);
64895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
64915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Check if there is a default declaration in the internal
64925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * or external subsets
64935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
64945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc =  node->doc;
64955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc != NULL) {
64965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlAttributePtr attrDecl;
64975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (doc->intSubset != NULL) {
64985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    attrDecl = xmlGetDtdAttrDesc(doc->intSubset, node->name, name);
64995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((attrDecl == NULL) && (doc->extSubset != NULL))
65005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attrDecl = xmlGetDtdAttrDesc(doc->extSubset, node->name, name);
65015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL))
65025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              /* return attribute declaration only if a default value is given
65035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (that includes #FIXED declarations) */
65045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return((xmlAttrPtr) attrDecl);
65055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
65065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
65075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
65085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlHasNsProp:
65125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
65135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
65145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nameSpace:  the URI of the namespace
65155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search for an attribute associated to a node
65175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This attribute has to be anchored in the namespace specified.
65185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This does the entity substitution.
65195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function looks in DTD attribute declaration for #FIXED or
65205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * default declaration values unless DTD use has been turned off.
65215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that a namespace of NULL indicates to use the default namespace.
65225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute or the attribute declaration or NULL
65245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     if neither was found.
65255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
65275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlHasNsProp(xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace) {
65285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlGetPropNodeInternal(node, name, nameSpace, xmlCheckDTD));
65305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetProp:
65345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
65355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
65365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search and get the value of an attribute associated to a node
65385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This does the entity substitution.
65395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function looks in DTD attribute declaration for #FIXED or
65405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * default declaration values unless DTD use has been turned off.
65415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: this function acts independently of namespaces associated
65425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       to the attribute. Use xmlGetNsProp() or xmlGetNoNsProp()
65435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       for namespace aware processing.
65445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute value or NULL if not found.
65465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     It's up to the caller to free the memory with xmlFree().
65475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
65495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetProp(xmlNodePtr node, const xmlChar *name) {
65505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
65515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prop = xmlHasProp(node, name);
65535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prop == NULL)
65545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
65555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlGetPropNodeValueInternal(prop));
65565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetNoNsProp:
65605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
65615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
65625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search and get the value of an attribute associated to a node
65645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This does the entity substitution.
65655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function looks in DTD attribute declaration for #FIXED or
65665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * default declaration values unless DTD use has been turned off.
65675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function is similar to xmlGetProp except it will accept only
65685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * an attribute in no namespace.
65695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute value or NULL if not found.
65715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     It's up to the caller to free the memory with xmlFree().
65725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
65745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetNoNsProp(xmlNodePtr node, const xmlChar *name) {
65755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
65765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prop = xmlGetPropNodeInternal(node, name, NULL, xmlCheckDTD);
65785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prop == NULL)
65795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
65805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlGetPropNodeValueInternal(prop));
65815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetNsProp:
65855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
65865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
65875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nameSpace:  the URI of the namespace
65885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search and get the value of an attribute associated to a node
65905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This attribute has to be anchored in the namespace specified.
65915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This does the entity substitution.
65925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function looks in DTD attribute declaration for #FIXED or
65935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * default declaration values unless DTD use has been turned off.
65945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute value or NULL if not found.
65965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     It's up to the caller to free the memory with xmlFree().
65975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar *
65995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetNsProp(xmlNodePtr node, const xmlChar *name, const xmlChar *nameSpace) {
66005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
66015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prop = xmlGetPropNodeInternal(node, name, nameSpace, xmlCheckDTD);
66035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prop == NULL)
66045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
66055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlGetPropNodeValueInternal(prop));
66065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
66095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
66105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlUnsetProp:
66115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
66125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
66135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
66145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove an attribute carried by a node.
66155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This handles only attributes in no namespace.
66165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if successful, -1 if not found
66175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
66185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
66195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlUnsetProp(xmlNodePtr node, const xmlChar *name) {
66205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
66215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prop = xmlGetPropNodeInternal(node, name, NULL, 0);
66235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prop == NULL)
66245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
66255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUnlinkNode((xmlNodePtr) prop);
66265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeProp(prop);
66275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
66285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
66315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlUnsetNsProp:
66325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
66335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the namespace definition
66345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
66355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
66365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove an attribute carried by a node.
66375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if successful, -1 if not found
66385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
66395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
66405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlUnsetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name) {
66415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
66425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prop = xmlGetPropNodeInternal(node, name, (ns != NULL) ? ns->href : NULL, 0);
66445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prop == NULL)
66455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
66465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUnlinkNode((xmlNodePtr) prop);
66475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeProp(prop);
66485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
66495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
66515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED)
66535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
66545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetProp:
66555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
66565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name (a QName)
66575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the attribute value
66585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
66595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set (or reset) an attribute carried by a node.
66605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If @name has a prefix, then the corresponding
66615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * namespace-binding will be used, if in scope; it is an
66625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error it there's no such ns-binding for the prefix in
66635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * scope.
66645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute pointer.
66655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
66665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
66675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
66685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value) {
66695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
66705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *nqname;
66715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (name == NULL) || (node->type != XML_ELEMENT_NODE))
66735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
66745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
66765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * handle QNames
66775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
66785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nqname = xmlSplitQName3(name, &len);
66795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nqname != NULL) {
66805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlNsPtr ns;
66815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlChar *prefix = xmlStrndup(name, len);
66825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns = xmlSearchNs(node->doc, node, prefix);
66835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prefix != NULL)
66845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFree(prefix);
66855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns != NULL)
66865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(xmlSetNsProp(node, ns, nqname, value));
66875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
66885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlSetNsProp(node, NULL, name, value));
66895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
66925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetNsProp:
66935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
66945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns:  the namespace definition
66955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name:  the attribute name
66965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value:  the attribute value
66975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
66985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set (or reset) an attribute carried by a node.
66995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The ns structure must be in scope, this is not checked
67005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
67015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the attribute pointer.
67025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
67035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAttrPtr
67045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name,
67055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     const xmlChar *value)
67065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
67075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlAttrPtr prop;
67085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns && (ns->href == NULL))
67105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
67115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prop = xmlGetPropNodeInternal(node, name, (ns != NULL) ? ns->href : NULL, 0);
67125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (prop != NULL) {
67135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
67145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Modify the attribute's value.
67155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
67165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prop->atype == XML_ATTRIBUTE_ID) {
67175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlRemoveID(node->doc, prop);
67185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prop->atype = XML_ATTRIBUTE_ID;
67195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
67205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prop->children != NULL)
67215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNodeList(prop->children);
67225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop->children = NULL;
67235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop->last = NULL;
67245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	prop->ns = ns;
67255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (value != NULL) {
67265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNodePtr tmp;
67275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if(!xmlCheckUTF8(value)) {
67295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        xmlTreeErr(XML_TREE_NOT_UTF8, (xmlNodePtr) node->doc,
67305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	                   NULL);
67315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (node->doc != NULL)
67325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    node->doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
67335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
67345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prop->children = xmlNewDocText(node->doc, value);
67355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prop->last = NULL;
67365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    tmp = prop->children;
67375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (tmp != NULL) {
67385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp->parent = (xmlNodePtr) prop;
67395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (tmp->next == NULL)
67405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    prop->last = tmp;
67415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmp = tmp->next;
67425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
67435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
67445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prop->atype == XML_ATTRIBUTE_ID)
67455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlAddID(NULL, node->doc, value, prop);
67465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(prop);
67475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
67485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
67495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * No equal attr found; create a new one.
67505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
67515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(xmlNewPropInternal(node, ns, name, value, 0));
67525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */
67555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
67575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodeIsText:
67585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
67595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
67605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Is this node a Text node ?
67615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 yes, 0 no
67625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
67635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
67645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodeIsText(xmlNodePtr node) {
67655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) return(0);
67665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->type == XML_TEXT_NODE) return(1);
67685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
67695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
67725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlIsBlankNode:
67735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
67745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
67755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks whether this node is an empty or whitespace only
67765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (and possibly ignorable) text-node.
67775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
67785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 yes, 0 no
67795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
67805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
67815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlIsBlankNode(xmlNodePtr node) {
67825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur;
67835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) return(0);
67845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type != XML_TEXT_NODE) &&
67865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (node->type != XML_CDATA_SECTION_NODE))
67875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
67885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->content == NULL) return(1);
67895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = node->content;
67905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (*cur != 0) {
67915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (!IS_BLANK_CH(*cur)) return(0);
67925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur++;
67935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
67945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(1);
67965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
67995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlTextConcat:
68005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node:  the node
68015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content:  the content
68025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  @content length
68035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
68045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Concat the given string at the end of the existing node content
68055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
68065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error, 0 otherwise
68075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
68085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
68105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTextConcat(xmlNodePtr node, const xmlChar *content, int len) {
68115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node == NULL) return(-1);
68125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->type != XML_TEXT_NODE) &&
68145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (node->type != XML_CDATA_SECTION_NODE) &&
68155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_COMMENT_NODE) &&
68165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->type != XML_PI_NODE)) {
68175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_TREE
68185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlGenericError(xmlGenericErrorContext,
68195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlTextConcat: node is not text nor CDATA\n");
68205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
68215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
68225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
68235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* need to check if content is currently in the dictionary */
68245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->content == (xmlChar *) &(node->properties)) ||
68255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((node->doc != NULL) && (node->doc->dict != NULL) &&
68265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlDictOwns(node->doc->dict, node->content))) {
68275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	node->content = xmlStrncatNew(node->content, content, len);
68285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
68295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node->content = xmlStrncat(node->content, content, len);
68305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
68315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node->properties = NULL;
68325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->content == NULL)
68335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
68345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
68355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************
68385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
68395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *			Output : to a FILE or in memory			*
68405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *									*
68415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
68425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
68445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferCreate:
68455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
68465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routine to create an XML buffer.
68475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns the new structure.
68485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
68495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferPtr
68505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferCreate(void) {
68515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlBufferPtr ret;
68525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer));
68545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
68555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("creating buffer");
68565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
68575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
68585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->use = 0;
68595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->size = xmlDefaultBufferSize;
68605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->alloc = xmlBufferAllocScheme;
68615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->content = (xmlChar *) xmlMallocAtomic(ret->size * sizeof(xmlChar));
68625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->content == NULL) {
68635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("creating buffer");
68645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(ret);
68655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
68665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
68675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->content[0] = 0;
68685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->contentIO = NULL;
68695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
68705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
68735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferCreateSize:
68745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size: initial size of buffer
68755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
68765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routine to create an XML buffer.
68775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns the new structure.
68785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
68795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferPtr
68805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferCreateSize(size_t size) {
68815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlBufferPtr ret;
68825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer));
68845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
68855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("creating buffer");
68865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
68875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
68885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->use = 0;
68895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->alloc = xmlBufferAllocScheme;
68905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->size = (size ? size+2 : 0);         /* +1 for ending null */
68915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret->size){
68925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->content = (xmlChar *) xmlMallocAtomic(ret->size * sizeof(xmlChar));
68935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ret->content == NULL) {
68945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("creating buffer");
68955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlFree(ret);
68965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return(NULL);
68975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
68985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret->content[0] = 0;
68995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
69005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->content = NULL;
69015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->contentIO = NULL;
69025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
69035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
69045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
69065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferCreateStatic:
69075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @mem: the memory area
69085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size:  the size in byte
69095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
69105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routine to create an XML buffer from an immutable memory area.
69115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The area won't be modified nor copied, and is expected to be
69125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * present until the end of the buffer lifetime.
69135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
69145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns the new structure.
69155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
69165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferPtr
69175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferCreateStatic(void *mem, size_t size) {
69185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlBufferPtr ret;
69195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((mem == NULL) || (size == 0))
69215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
69225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer));
69245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
69255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("creating buffer");
69265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(NULL);
69275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->use = size;
69295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->size = size;
69305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->alloc = XML_BUFFER_ALLOC_IMMUTABLE;
69315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->content = (xmlChar *) mem;
69325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
69335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
69345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
69365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferSetAllocationScheme:
69375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer to tune
69385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @scheme:  allocation scheme to use
69395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
69405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Sets the allocation scheme for this buffer
69415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
69425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
69435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferSetAllocationScheme(xmlBufferPtr buf,
69445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             xmlBufferAllocationScheme scheme) {
69455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
69465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_BUFFER
69475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
69485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlBufferSetAllocationScheme: buf == NULL\n");
69495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
69505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
69515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) ||
69535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (buf->alloc == XML_BUFFER_ALLOC_IO)) return;
69545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((scheme == XML_BUFFER_ALLOC_DOUBLEIT) ||
69555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (scheme == XML_BUFFER_ALLOC_EXACT) ||
69565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (scheme == XML_BUFFER_ALLOC_IMMUTABLE))
69575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf->alloc = scheme;
69585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
69595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
69615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferFree:
69625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer to free
69635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
69645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Frees an XML buffer. It frees both the content and the structure which
69655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * encapsulate it.
69665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
69675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
69685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferFree(xmlBufferPtr buf) {
69695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
69705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_BUFFER
69715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
69725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlBufferFree: buf == NULL\n");
69735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
69745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
69755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((buf->alloc == XML_BUFFER_ALLOC_IO) &&
69785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (buf->contentIO != NULL)) {
69795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(buf->contentIO);
69805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((buf->content != NULL) &&
69815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (buf->alloc != XML_BUFFER_ALLOC_IMMUTABLE)) {
69825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlFree(buf->content);
69835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
69845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(buf);
69855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
69865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
69885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferEmpty:
69895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer
69905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
69915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * empty a buffer.
69925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
69935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
69945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferEmpty(xmlBufferPtr buf) {
69955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) return;
69965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->content == NULL) return;
69975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->use = 0;
69985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) {
69995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buf->content = BAD_CAST "";
70005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((buf->alloc == XML_BUFFER_ALLOC_IO) &&
70015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (buf->contentIO != NULL)) {
70025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size_t start_buf = buf->content - buf->contentIO;
70035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf->size += start_buf;
70055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buf->content = buf->contentIO;
70065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buf->content[0] = 0;
70075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
70085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buf->content[0] = 0;
70095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
70105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
70115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
70135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferShrink:
70145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer to dump
70155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the number of xmlChar to remove
70165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
70175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove the beginning of an XML buffer.
70185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
70195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of #xmlChar removed, or -1 in case of failure.
70205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
70215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
70225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferShrink(xmlBufferPtr buf, unsigned int len) {
70235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) return(-1);
70245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len == 0) return(0);
70255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len > buf->use) return(-1);
70265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->use -= len;
70285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) ||
70295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL))) {
70305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
70315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * we just move the content pointer, but also make sure
70325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * the perceived buffer size has shrinked accordingly
70335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
70345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buf->content += len;
70355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf->size -= len;
70365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
70385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * sometimes though it maybe be better to really shrink
70395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 * on IO buffers
70405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 */
70415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
70425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    size_t start_buf = buf->content - buf->contentIO;
70435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (start_buf >= buf->size) {
70445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		memmove(buf->contentIO, &buf->content[0], buf->use);
70455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		buf->content = buf->contentIO;
70465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		buf->content[buf->use] = 0;
70475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		buf->size += start_buf;
70485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
70495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
70505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
70515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memmove(buf->content, &buf->content[len], buf->use);
70525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf->content[buf->use] = 0;
70535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
70545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(len);
70555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
70565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
70585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferGrow:
70595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer
70605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the minimum free size to allocate
70615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
70625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Grow the available space of an XML buffer.
70635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
70645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new available space or -1 in case of error
70655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
70665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
70675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferGrow(xmlBufferPtr buf, unsigned int len) {
70685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int size;
70695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *newbuf;
70705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) return(-1);
70725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0);
70745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len + buf->use < buf->size) return(0);
70755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
70775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Windows has a BIG problem on realloc timing, so we try to double
70785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * the buffer size (if that's enough) (bug 146697)
70795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Apparently BSD too, and it's probably best for linux too
70805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * On an embedded system this may be something to change
70815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
70825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 1
70835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->size > len)
70845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size = buf->size * 2;
70855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
70865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size = buf->use + len + 100;
70875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
70885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size = buf->use + len + 100;
70895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
70905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
70925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size_t start_buf = buf->content - buf->contentIO;
70935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	newbuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + size);
70955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (newbuf == NULL) {
70965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("growing buffer");
70975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
70985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
70995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf->contentIO = newbuf;
71005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf->content = newbuf + start_buf;
71015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
71025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	newbuf = (xmlChar *) xmlRealloc(buf->content, size);
71035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (newbuf == NULL) {
71045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("growing buffer");
71055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
71065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
71075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf->content = newbuf;
71085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
71095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->size = size;
71105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(buf->size - buf->use);
71115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
71125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
71145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferDump:
71155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @file:  the file output
71165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer to dump
71175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
71185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Dumps an XML buffer to  a FILE *.
71195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of #xmlChar written
71205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
71215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
71225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferDump(FILE *file, xmlBufferPtr buf) {
71235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
71245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL) {
71265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_BUFFER
71275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
71285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlBufferDump: buf == NULL\n");
71295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
71305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
71315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
71325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->content == NULL) {
71335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_BUFFER
71345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
71355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlBufferDump: buf->content == NULL\n");
71365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
71375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(0);
71385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
71395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (file == NULL)
71405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	file = stdout;
71415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = fwrite(buf->content, sizeof(xmlChar), buf->use, file);
71425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
71435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
71445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
71465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferContent:
71475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer
71485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
71495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function to extract the content of a buffer
71505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
71515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the internal content
71525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
71535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const xmlChar *
71555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferContent(const xmlBufferPtr buf)
71565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
71575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!buf)
71585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NULL;
71595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return buf->content;
71615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
71625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
71645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferLength:
71655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer
71665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
71675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function to get the length of a buffer
71685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
71695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the length of data in the internal content
71705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
71715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
71735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferLength(const xmlBufferPtr buf)
71745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
71755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if(!buf)
71765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
71775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return buf->use;
71795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
71805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
71825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferResize:
71835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer to resize
71845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @size:  the desired size
71855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
71865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resize a buffer to accommodate minimum size of @size.
71875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
71885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns  0 in case of problems, 1 otherwise
71895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
71905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
71915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferResize(xmlBufferPtr buf, unsigned int size)
71925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
71935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int newSize;
71945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar* rebuf = NULL;
71955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t start_buf;
71965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL)
71985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(0);
71995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0);
72015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Don't resize if we don't have to */
72035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (size < buf->size)
72045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 1;
72055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* figure out new size */
72075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (buf->alloc){
72085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_BUFFER_ALLOC_IO:
72095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_BUFFER_ALLOC_DOUBLEIT:
72105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*take care of empty case*/
72115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    newSize = (buf->size ? buf->size*2 : size + 10);
72125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (size > newSize) {
72135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (newSize > UINT_MAX / 2) {
72145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            xmlTreeErrMemory("growing buffer");
72155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	            return 0;
72165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        }
72175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        newSize *= 2;
72185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
72195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
72205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_BUFFER_ALLOC_EXACT:
72215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    newSize = size+10;
72225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
72235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
72245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    newSize = size+10;
72255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
72265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
72275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
72295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        start_buf = buf->content - buf->contentIO;
72305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (start_buf > newSize) {
72325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* move data back to start */
72335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    memmove(buf->contentIO, buf->content, buf->use);
72345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf->content = buf->contentIO;
72355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf->content[buf->use] = 0;
72365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf->size += start_buf;
72375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
72385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    rebuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + newSize);
72395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (rebuf == NULL) {
72405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlTreeErrMemory("growing buffer");
72415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return 0;
72425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
72435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf->contentIO = rebuf;
72445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf->content = rebuf + start_buf;
72455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
72465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
72475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (buf->content == NULL) {
72485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    rebuf = (xmlChar *) xmlMallocAtomic(newSize);
72495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (buf->size - buf->use < 100) {
72505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    rebuf = (xmlChar *) xmlRealloc(buf->content, newSize);
72515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
72525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
72535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * if we are reallocating a buffer far from being full, it's
72545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * better to make a new allocation and copy only the used range
72555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * and free the old one.
72565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
72575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    rebuf = (xmlChar *) xmlMallocAtomic(newSize);
72585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (rebuf != NULL) {
72595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		memcpy(rebuf, buf->content, buf->use);
72605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree(buf->content);
72615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		rebuf[buf->use] = 0;
72625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
72635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
72645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (rebuf == NULL) {
72655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("growing buffer");
72665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return 0;
72675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
72685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	buf->content = rebuf;
72695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
72705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->size = newSize;
72715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
72735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
72745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
72765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferAdd:
72775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer to dump
72785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  the #xmlChar string
72795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the number of #xmlChar to add
72805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
72815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a string range to an XML buffer. if len == -1, the length of
72825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * str is recomputed.
72835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
72845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 successful, a positive error code number otherwise
72855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         and -1 in case of internal or API error.
72865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
72875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
72885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferAdd(xmlBufferPtr buf, const xmlChar *str, int len) {
72895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int needSize;
72905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((str == NULL) || (buf == NULL)) {
72925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return -1;
72935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
72945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1;
72955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < -1) {
72965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_BUFFER
72975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
72985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlBufferAdd: len < 0\n");
72995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
73005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return -1;
73015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
73025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len == 0) return 0;
73035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < 0)
73055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        len = xmlStrlen(str);
73065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < 0) return -1;
73085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len == 0) return 0;
73095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    needSize = buf->use + len + 2;
73115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (needSize > buf->size){
73125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!xmlBufferResize(buf, needSize)){
73135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("growing buffer");
73145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return XML_ERR_NO_MEMORY;
73155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
73165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
73175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memmove(&buf->content[buf->use], str, len*sizeof(xmlChar));
73195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->use += len;
73205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->content[buf->use] = 0;
73215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
73225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
73235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
73255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferAddHead:
73265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer
73275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  the #xmlChar string
73285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len:  the number of #xmlChar to add
73295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
73305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add a string range to the beginning of an XML buffer.
73315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if len == -1, the length of @str is recomputed.
73325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
73335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 successful, a positive error code number otherwise
73345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         and -1 in case of internal or API error.
73355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
73365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
73375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferAddHead(xmlBufferPtr buf, const xmlChar *str, int len) {
73385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int needSize;
73395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL)
73415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
73425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1;
73435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str == NULL) {
73445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_BUFFER
73455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
73465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlBufferAddHead: str == NULL\n");
73475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
73485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return -1;
73495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
73505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < -1) {
73515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_BUFFER
73525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
73535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlBufferAddHead: len < 0\n");
73545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
73555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return -1;
73565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
73575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len == 0) return 0;
73585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len < 0)
73605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        len = xmlStrlen(str);
73615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len <= 0) return -1;
73635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
73655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size_t start_buf = buf->content - buf->contentIO;
73665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (start_buf > (unsigned int) len) {
73685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
73695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * We can add it in the space previously shrinked
73705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
73715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf->content -= len;
73725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            memmove(&buf->content[0], str, len);
73735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf->use += len;
73745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    buf->size += len;
73755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(0);
73765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
73775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
73785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    needSize = buf->use + len + 2;
73795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (needSize > buf->size){
73805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!xmlBufferResize(buf, needSize)){
73815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("growing buffer");
73825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return XML_ERR_NO_MEMORY;
73835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
73845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
73855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memmove(&buf->content[len], &buf->content[0], buf->use);
73875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memmove(&buf->content[0], str, len);
73885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->use += len;
73895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->content[buf->use] = 0;
73905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
73915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
73925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
73945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferCat:
73955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer to add to
73965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  the #xmlChar string
73975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
73985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Append a zero terminated string to an XML buffer.
73995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
74005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 successful, a positive error code number otherwise
74015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         and -1 in case of internal or API error.
74025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
74035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
74045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferCat(xmlBufferPtr buf, const xmlChar *str) {
74055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL)
74065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
74075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1;
74085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str == NULL) return -1;
74095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return xmlBufferAdd(buf, str, -1);
74105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
74115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
74135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferCCat:
74145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the buffer to dump
74155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @str:  the C char string
74165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
74175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Append a zero terminated C string to an XML buffer.
74185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
74195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 successful, a positive error code number otherwise
74205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *         and -1 in case of internal or API error.
74215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
74225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
74235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferCCat(xmlBufferPtr buf, const char *str) {
74245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *cur;
74255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL)
74275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(-1);
74285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return -1;
74295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (str == NULL) {
74305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_BUFFER
74315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlGenericError(xmlGenericErrorContext,
74325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"xmlBufferCCat: str == NULL\n");
74335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
74345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return -1;
74355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
74365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (cur = str;*cur != 0;cur++) {
74375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (buf->use  + 10 >= buf->size) {
74385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!xmlBufferResize(buf, buf->use+10)){
74395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlTreeErrMemory("growing buffer");
74405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return XML_ERR_NO_MEMORY;
74415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
74425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
74435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buf->content[buf->use++] = *cur;
74445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
74455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buf->content[buf->use] = 0;
74465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
74475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
74485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
74505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferWriteCHAR:
74515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the XML buffer
74525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @string:  the string to add
74535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
74545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routine which manages and grows an output buffer. This one adds
74555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlChars at the end of the buffer.
74565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
74575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
74585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferWriteCHAR(xmlBufferPtr buf, const xmlChar *string) {
74595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL)
74605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
74615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return;
74625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlBufferCat(buf, string);
74635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
74645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
74665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferWriteChar:
74675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the XML buffer output
74685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @string:  the string to add
74695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
74705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routine which manage and grows an output buffer. This one add
74715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C chars at the end of the array.
74725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
74735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
74745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferWriteChar(xmlBufferPtr buf, const char *string) {
74755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL)
74765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
74775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return;
74785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlBufferCCat(buf, string);
74795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
74805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
74835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlBufferWriteQuotedString:
74845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf:  the XML buffer output
74855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @string:  the string to add
74865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
74875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * routine which manage and grows an output buffer. This one writes
74885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a quoted or double quoted #xmlChar string, checking first if it holds
74895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * quote or double-quotes internally
74905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
74915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
74925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlBufferWriteQuotedString(xmlBufferPtr buf, const xmlChar *string) {
74935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *cur, *base;
74945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf == NULL)
74955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
74965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return;
74975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrchr(string, '\"')) {
74985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (xmlStrchr(string, '\'')) {
74995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG_BUFFER
75005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlGenericError(xmlGenericErrorContext,
75015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlBufferWriteQuotedString: string contains quote and double-quotes !\n");
75025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
75035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferCCat(buf, "\"");
75045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base = cur = string;
75055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while(*cur != 0){
75065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if(*cur == '"'){
75075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    if (base != cur)
75085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        xmlBufferAdd(buf, base, cur - base);
75095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    xmlBufferAdd(buf, BAD_CAST "&quot;", 6);
75105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    cur++;
75115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base = cur;
75125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
75135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                else {
75145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    cur++;
75155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
75165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
75175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (base != cur)
75185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                xmlBufferAdd(buf, base, cur - base);
75195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferCCat(buf, "\"");
75205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
75215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else{
75225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferCCat(buf, "\'");
75235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xmlBufferCat(buf, string);
75245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlBufferCCat(buf, "\'");
75255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
75265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
75275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferCCat(buf, "\"");
75285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferCat(buf, string);
75295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xmlBufferCCat(buf, "\"");
75305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
75315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
75325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
75355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetDocCompressMode:
75365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
75375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * get the compression ratio for a document, ZLIB based
75395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 (uncompressed) to 9 (max compression)
75405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
75425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetDocCompressMode (xmlDocPtr doc) {
75435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) return(-1);
75445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(doc->compression);
75455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
75465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
75485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetDocCompressMode:
75495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc:  the document
75505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @mode:  the compression ratio
75515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * set the compression ratio for a document, ZLIB based
75535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Correct values: 0 (uncompressed) to 9 (max compression)
75545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
75565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetDocCompressMode (xmlDocPtr doc, int mode) {
75575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL) return;
75585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mode < 0) doc->compression = 0;
75595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (mode > 9) doc->compression = 9;
75605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else doc->compression = mode;
75615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
75625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
75645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetCompressMode:
75655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * get the default compression mode used, ZLIB based.
75675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 (uncompressed) to 9 (max compression)
75685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
75705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetCompressMode(void)
75715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
75725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (xmlCompressMode);
75735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
75745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
75765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlSetCompressMode:
75775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @mode:  the compression ratio
75785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * set the default compression mode used, ZLIB based
75805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Correct values: 0 (uncompressed) to 9 (max compression)
75815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
75835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSetCompressMode(int mode) {
75845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (mode < 0) xmlCompressMode = 0;
75855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (mode > 9) xmlCompressMode = 9;
75865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else xmlCompressMode = mode;
75875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
75885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_TREE_NSMAP_PARENT -1
75905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_TREE_NSMAP_XML -2
75915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_TREE_NSMAP_DOC -3
75925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_TREE_NSMAP_CUSTOM -4
75935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct xmlNsMapItem *xmlNsMapItemPtr;
75955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct xmlNsMapItem {
75965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr next;
75975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr prev;
75985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr oldNs; /* old ns decl reference */
75995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr newNs; /* new ns decl reference */
76005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int shadowDepth; /* Shadowed at this depth */
76015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
76025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * depth:
76035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * >= 0 == @node's ns-decls
76045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * -1   == @parent's ns-decls
76055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * -2   == the doc->oldNs XML ns-decl
76065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * -3   == the doc->oldNs storage ns-decls
76075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * -4   == ns-decls provided via custom ns-handling
76085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
76095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth;
76105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
76115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct xmlNsMap *xmlNsMapPtr;
76135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct xmlNsMap {
76145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr first;
76155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr last;
76165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr pool;
76175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
76185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_NSMAP_NOTEMPTY(m) (((m) != NULL) && ((m)->first != NULL))
76205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_NSMAP_FOREACH(m, i) for (i = (m)->first; i != NULL; i = (i)->next)
76215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_NSMAP_POP(m, i) \
76225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i = (m)->last; \
76235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (m)->last = (i)->prev; \
76245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((m)->last == NULL) \
76255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(m)->first = NULL; \
76265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else \
76275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(m)->last->next = NULL; \
76285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (i)->next = (m)->pool; \
76295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (m)->pool = i;
76305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
76325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapNsMapFree:
76335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @map: the ns-map
76345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
76355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Frees the ns-map
76365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
76375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
76385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapNsMapFree(xmlNsMapPtr nsmap)
76395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
76405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr cur, tmp;
76415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nsmap == NULL)
76435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
76445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = nsmap->pool;
76455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
76465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = cur;
76475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
76485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(tmp);
76495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
76505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = nsmap->first;
76515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
76525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmp = cur;
76535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->next;
76545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(tmp);
76555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
76565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(nsmap);
76575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
76585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
76605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapNsMapAddItem:
76615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @map: the ns-map
76625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @oldNs: the old ns-struct
76635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @newNs: the new ns-struct
76645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @depth: depth and ns-kind information
76655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
76665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Adds an ns-mapping item.
76675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
76685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsMapItemPtr
76695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapNsMapAddItem(xmlNsMapPtr *nsmap, int position,
76705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       xmlNsPtr oldNs, xmlNsPtr newNs, int depth)
76715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
76725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr ret;
76735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapPtr map;
76745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nsmap == NULL)
76765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
76775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((position != -1) && (position != 0))
76785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
76795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    map = *nsmap;
76805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (map == NULL) {
76825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
76835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create the ns-map.
76845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
76855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	map = (xmlNsMapPtr) xmlMalloc(sizeof(struct xmlNsMap));
76865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (map == NULL) {
76875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("allocating namespace map");
76885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
76895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
76905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memset(map, 0, sizeof(struct xmlNsMap));
76915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*nsmap = map;
76925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
76935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (map->pool != NULL) {
76955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
76965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Reuse an item from the pool.
76975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
76985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = map->pool;
76995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	map->pool = ret->next;
77005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memset(ret, 0, sizeof(struct xmlNsMapItem));
77015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
77025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
77035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create a new item.
77045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
77055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = (xmlNsMapItemPtr) xmlMalloc(sizeof(struct xmlNsMapItem));
77065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == NULL) {
77075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("allocating namespace map item");
77085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
77095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
77105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	memset(ret, 0, sizeof(struct xmlNsMapItem));
77115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
77125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (map->first == NULL) {
77145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
77155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* First ever.
77165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
77175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	map->first = ret;
77185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	map->last = ret;
77195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (position == -1) {
77205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
77215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Append.
77225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
77235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->prev = map->last;
77245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	map->last->next = ret;
77255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	map->last = ret;
77265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (position == 0) {
77275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
77285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Set on first position.
77295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
77305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	map->first->prev = ret;
77315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret->next = map->first;
77325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	map->first = ret;
77335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
77345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(NULL);
77355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->oldNs = oldNs;
77375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->newNs = newNs;
77385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->shadowDepth = -1;
77395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret->depth = depth;
77405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
77415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
77425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
77445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapStoreNs:
77455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @doc: the doc
77465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @nsName: the namespace name
77475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @prefix: the prefix
77485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
77495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Creates or reuses an xmlNs struct on doc->oldNs with
77505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* the given prefix and namespace name.
77515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
77525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns the aquired ns struct or NULL in case of an API
77535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         or internal error.
77545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
77555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsPtr
77565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapStoreNs(xmlDocPtr doc,
77575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *nsName,
77585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   const xmlChar *prefix)
77595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
77605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
77615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (doc == NULL)
77635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
77645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ns = xmlTreeEnsureXMLDecl(doc);
77655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns == NULL)
77665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
77675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns->next != NULL) {
77685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* Reuse. */
77695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns = ns->next;
77705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (ns != NULL) {
77715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (((ns->prefix == prefix) ||
77725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlStrEqual(ns->prefix, prefix)) &&
77735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlStrEqual(ns->href, nsName)) {
77745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (ns);
77755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
77765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ns->next == NULL)
77775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
77785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns = ns->next;
77795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
77805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
77815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Create. */
77825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ns != NULL) {
77835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ns->next = xmlNewNs(NULL, nsName, prefix);
77845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (ns->next);
77855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
77865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(NULL);
77875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
77885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
77905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapNewCtxt:
77915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
77925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Allocates and initializes a new DOM-wrapper context.
77935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
77945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns the xmlDOMWrapCtxtPtr or NULL in case of an internal errror.
77955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
77965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapCtxtPtr
77975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapNewCtxt(void)
77985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
77995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDOMWrapCtxtPtr ret;
78005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = xmlMalloc(sizeof(xmlDOMWrapCtxt));
78025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ret == NULL) {
78035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlTreeErrMemory("allocating DOM-wrapper context");
78045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
78055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
78065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(ret, 0, sizeof(xmlDOMWrapCtxt));
78075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
78085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
78095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
78115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapFreeCtxt:
78125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ctxt: the DOM-wrapper context
78135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
78145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Frees the DOM-wrapper context.
78155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
78165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
78175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapFreeCtxt(xmlDOMWrapCtxtPtr ctxt)
78185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
78195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt == NULL)
78205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
78215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt->namespaceMap != NULL)
78225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDOMWrapNsMapFree((xmlNsMapPtr) ctxt->namespaceMap);
78235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
78245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Store the namespace map in the context.
78255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
78265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFree(ctxt);
78275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
78285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
78305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlTreeLookupNsListByPrefix:
78315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @nsList: a list of ns-structs
78325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @prefix: the searched prefix
78335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
78345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Searches for a ns-decl with the given prefix in @nsList.
78355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
78365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns the ns-decl if found, NULL if not found and on
78375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         API errors.
78385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
78395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsPtr
78405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlTreeNSListLookupByPrefix(xmlNsPtr nsList, const xmlChar *prefix)
78415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
78425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nsList == NULL)
78435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (NULL);
78445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
78455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNsPtr ns;
78465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ns = nsList;
78475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	do {
78485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((prefix == ns->prefix) ||
78495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlStrEqual(prefix, ns->prefix)) {
78505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (ns);
78515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
78525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns = ns->next;
78535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} while (ns != NULL);
78545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
78555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (NULL);
78565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
78575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
78595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
78605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapNSNormGatherInScopeNs:
78615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @map: the namespace map
78625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @node: the node to start with
78635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
78645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Puts in-scope namespaces into the ns-map.
78655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
78665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 0 on success, -1 on API or internal errors.
78675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
78685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
78695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapNSNormGatherInScopeNs(xmlNsMapPtr *map,
78705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlNodePtr node)
78715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
78725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
78735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
78745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr mi;
78755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int shadowed;
78765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((map == NULL) || (*map != NULL))
78785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
78795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
78805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Get in-scope ns-decls of @parent.
78815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
78825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = node;
78835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while ((cur != NULL) && (cur != (xmlNodePtr) cur->doc)) {
78845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_ELEMENT_NODE) {
78855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->nsDef != NULL) {
78865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ns = cur->nsDef;
78875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		do {
78885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    shadowed = 0;
78895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (XML_NSMAP_NOTEMPTY(*map)) {
78905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
78915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Skip shadowed prefixes.
78925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
78935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			XML_NSMAP_FOREACH(*map, mi) {
78945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if ((ns->prefix == mi->newNs->prefix) ||
78955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlStrEqual(ns->prefix, mi->newNs->prefix)) {
78965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				shadowed = 1;
78975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				break;
78985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
78995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
79005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
79015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
79025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Insert mapping.
79035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
79045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    mi = xmlDOMWrapNsMapAddItem(map, 0, NULL,
79055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ns, XML_TREE_NSMAP_PARENT);
79065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (mi == NULL)
79075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (-1);
79085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (shadowed)
79095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			mi->shadowDepth = 0;
79105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = ns->next;
79115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (ns != NULL);
79125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
79135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
79145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->parent;
79155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
79165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
79175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
79185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
79205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* XML_TREE_ADOPT_STR: If we have a dest-dict, put @str in the dict;
79215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* otherwise copy it, when it was in the source-dict.
79225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
79235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_TREE_ADOPT_STR(str) \
79245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (adoptStr && (str != NULL)) { \
79255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (destDoc->dict) { \
79265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    const xmlChar *old = str;	\
79275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    str = xmlDictLookup(destDoc->dict, str, -1); \
79285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((sourceDoc == NULL) || (sourceDoc->dict == NULL) || \
79295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        (!xmlDictOwns(sourceDoc->dict, old))) \
79305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlFree((char *)old); \
79315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((sourceDoc) && (sourceDoc->dict) && \
79325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDictOwns(sourceDoc->dict, str)) { \
79335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    str = BAD_CAST xmlStrdup(str); \
79345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} \
79355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
79365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
79385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* XML_TREE_ADOPT_STR_2: If @str was in the source-dict, then
79395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* put it in dest-dict or copy it.
79405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
79415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XML_TREE_ADOPT_STR_2(str) \
79425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (adoptStr && (str != NULL) && (sourceDoc != NULL) && \
79435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(sourceDoc->dict != NULL) && \
79445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDictOwns(sourceDoc->dict, cur->content)) { \
79455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (destDoc->dict) \
79465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->content = (xmlChar *) \
79475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlDictLookup(destDoc->dict, cur->content, -1); \
79485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else \
79495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur->content = xmlStrdup(BAD_CAST cur->content); \
79505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
79515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
79535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapNSNormAddNsMapItem2:
79545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
79555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* For internal use. Adds a ns-decl mapping.
79565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
79575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 0 on success, -1 on internal errors.
79585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
79595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
79605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapNSNormAddNsMapItem2(xmlNsPtr **list, int *size, int *number,
79615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlNsPtr oldNs, xmlNsPtr newNs)
79625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
79635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*list == NULL) {
79645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*list = (xmlNsPtr *) xmlMalloc(6 * sizeof(xmlNsPtr));
79655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*list == NULL) {
79665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("alloc ns map item");
79675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
79685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
79695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*size = 3;
79705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*number = 0;
79715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if ((*number) >= (*size)) {
79725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*size *= 2;
79735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*list = (xmlNsPtr *) xmlRealloc(*list,
79745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (*size) * 2 * sizeof(xmlNsPtr));
79755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*list == NULL) {
79765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlTreeErrMemory("realloc ns map item");
79775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return(-1);
79785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
79795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
79805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*list)[2 * (*number)] = oldNs;
79815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*list)[2 * (*number) +1] = newNs;
79825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*number)++;
79835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
79845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
79855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
79875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapRemoveNode:
79885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ctxt: a DOM wrapper context
79895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @doc: the doc
79905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @node: the node to be removed.
79915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @options: set of options, unused at the moment
79925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
79935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Unlinks the given node from its owner.
79945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* This will substitute ns-references to node->nsDef for
79955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* ns-references to doc->oldNs, thus ensuring the removed
79965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* branch to be autark wrt ns-references.
79975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
79985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* NOTE: This function was not intensively tested.
79995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
80005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 0 on success, 1 if the node is not supported,
80015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         -1 on API and internal errors.
80025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
80035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
80045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapRemoveNode(xmlDOMWrapCtxtPtr ctxt, xmlDocPtr doc,
80055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     xmlNodePtr node, int options ATTRIBUTE_UNUSED)
80065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
80075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr *list = NULL;
80085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeList, nbList, i, j;
80095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
80105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (doc == NULL) || (node->doc != doc))
80125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
80135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* TODO: 0 or -1 ? */
80155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->parent == NULL)
80165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
80175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
80195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_TEXT_NODE:
80205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_CDATA_SECTION_NODE:
80215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ENTITY_REF_NODE:
80225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_PI_NODE:
80235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_COMMENT_NODE:
80245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlUnlinkNode(node);
80255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
80265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ELEMENT_NODE:
80275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ATTRIBUTE_NODE:
80285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
80295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
80305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (1);
80315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
80325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlUnlinkNode(node);
80335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
80345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Save out-of-scope ns-references in doc->oldNs.
80355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
80365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
80375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (node->type) {
80385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ELEMENT_NODE:
80395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((ctxt == NULL) && (node->nsDef != NULL)) {
80405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = node->nsDef;
80415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    do {
80425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDOMWrapNSNormAddNsMapItem2(&list, &sizeList,
80435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    &nbList, ns, ns) == -1)
80445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto internal_error;
80455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ns = ns->next;
80465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } while (ns != NULL);
80475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
80485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* No break on purpose. */
80495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ATTRIBUTE_NODE:
80505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (node->ns != NULL) {
80515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
80525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Find a mapping.
80535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
80545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (list != NULL) {
80555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			for (i = 0, j = 0; i < nbList; i++, j += 2) {
80565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (node->ns == list[j]) {
80575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				node->ns = list[++j];
80585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto next_node;
80595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
80605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
80615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
80625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = NULL;
80635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ctxt != NULL) {
80645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
80655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* User defined.
80665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
80675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else {
80685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
80695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Add to doc's oldNs.
80705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
80715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ns = xmlDOMWrapStoreNs(doc, node->ns->href,
80725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    node->ns->prefix);
80735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ns == NULL)
80745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto internal_error;
80755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
80765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ns != NULL) {
80775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
80785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Add mapping.
80795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
80805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDOMWrapNSNormAddNsMapItem2(&list, &sizeList,
80815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    &nbList, node->ns, ns) == -1)
80825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto internal_error;
80835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
80845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node->ns = ns;
80855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
80865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((node->type == XML_ELEMENT_NODE) &&
80875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (node->properties != NULL)) {
80885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    node = (xmlNodePtr) node->properties;
80895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
80905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
80915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
80925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
80935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto next_sibling;
80945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
80955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_node:
80965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((node->type == XML_ELEMENT_NODE) &&
80975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (node->children != NULL)) {
80985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = node->children;
80995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
81005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
81015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_sibling:
81025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node == NULL)
81035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
81045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (node->next != NULL)
81055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = node->next;
81065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
81075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    node = node->parent;
81085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto next_sibling;
81095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
81105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (node != NULL);
81115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list != NULL)
81135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(list);
81145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
81155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
81175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list != NULL)
81185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(list);
81195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
81205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
81215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
81235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlSearchNsByNamespaceStrict:
81245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @doc: the document
81255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @node: the start node
81265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @nsName: the searched namespace name
81275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @retNs: the resulting ns-decl
81285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @prefixed: if the found ns-decl must have a prefix (for attributes)
81295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
81305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Dynamically searches for a ns-declaration which matches
81315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* the given @nsName in the ancestor-or-self axis of @node.
81325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
81335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 1 if a ns-decl was found, 0 if not and -1 on API
81345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         and internal errors.
81355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
81365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
81375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSearchNsByNamespaceStrict(xmlDocPtr doc, xmlNodePtr node,
81385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     const xmlChar* nsName,
81395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     xmlNsPtr *retNs, int prefixed)
81405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
81415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur, prev = NULL, out = NULL;
81425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns, prevns;
81435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc == NULL) || (nsName == NULL) || (retNs == NULL))
81455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
81465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *retNs = NULL;
81485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (xmlStrEqual(nsName, XML_XML_NAMESPACE)) {
81495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*retNs = xmlTreeEnsureXMLDecl(doc);
81505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*retNs == NULL)
81515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
81525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
81535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
81545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = node;
81555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
81565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_ELEMENT_NODE) {
81575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->nsDef != NULL) {
81585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (ns = cur->nsDef; ns != NULL; ns = ns->next) {
81595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (prefixed && (ns->prefix == NULL))
81605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			continue;
81615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (prev != NULL) {
81625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
81635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Check the last level of ns-decls for a
81645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* shadowing prefix.
81655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
81665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			prevns = prev->nsDef;
81675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			do {
81685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if ((prevns->prefix == ns->prefix) ||
81695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				((prevns->prefix != NULL) &&
81705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				(ns->prefix != NULL) &&
81715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlStrEqual(prevns->prefix, ns->prefix))) {
81725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				/*
81735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				* Shadowed.
81745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				*/
81755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				break;
81765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
81775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    prevns = prevns->next;
81785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			} while (prevns != NULL);
81795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (prevns != NULL)
81805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    continue;
81815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
81825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
81835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Ns-name comparison.
81845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
81855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((nsName == ns->href) ||
81865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlStrEqual(nsName, ns->href)) {
81875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
81885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* At this point the prefix can only be shadowed,
81895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* if we are the the (at least) 3rd level of
81905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* ns-decls.
81915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
81925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (out) {
81935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    int ret;
81945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ret = xmlNsInScope(doc, node, prev, ns->prefix);
81965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (ret < 0)
81975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				return (-1);
81985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
81995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * TODO: Should we try to find a matching ns-name
82005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * only once? This here keeps on searching.
82015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * I think we should try further since, there might
82025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * be an other matching ns-decl with an unshadowed
82035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * prefix.
82045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
82055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (! ret)
82065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				continue;
82075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
82085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*retNs = ns;
82095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (1);
82105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
82115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
82125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		out = prev;
82135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prev = cur;
82145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
82155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((cur->type == XML_ENTITY_NODE) ||
82165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (cur->type == XML_ENTITY_DECL))
82175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
82185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->parent;
82195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while ((cur != NULL) && (cur->doc != (xmlDocPtr) cur));
82205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
82215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
82225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
82245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlSearchNsByPrefixStrict:
82255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @doc: the document
82265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @node: the start node
82275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @prefix: the searched namespace prefix
82285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @retNs: the resulting ns-decl
82295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
82305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Dynamically searches for a ns-declaration which matches
82315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* the given @nsName in the ancestor-or-self axis of @node.
82325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
82335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 1 if a ns-decl was found, 0 if not and -1 on API
82345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         and internal errors.
82355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
82365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
82375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlSearchNsByPrefixStrict(xmlDocPtr doc, xmlNodePtr node,
82385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  const xmlChar* prefix,
82395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  xmlNsPtr *retNs)
82405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
82415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
82425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
82435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc == NULL) || (node == NULL))
82455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
82465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (retNs)
82485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*retNs = NULL;
82495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_STR_XML(prefix)) {
82505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (retNs) {
82515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *retNs = xmlTreeEnsureXMLDecl(doc);
82525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (*retNs == NULL)
82535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
82545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
82555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (1);
82565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
82575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = node;
82585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
82595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_ELEMENT_NODE) {
82605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->nsDef != NULL) {
82615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ns = cur->nsDef;
82625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		do {
82635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((prefix == ns->prefix) ||
82645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlStrEqual(prefix, ns->prefix))
82655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
82665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
82675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Disabled namespaces, e.g. xmlns:abc="".
82685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
82695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ns->href == NULL)
82705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(0);
82715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (retNs)
82725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    *retNs = ns;
82735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return (1);
82745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
82755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = ns->next;
82765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} while (ns != NULL);
82775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
82785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if ((cur->type == XML_ENTITY_NODE) ||
82795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (cur->type == XML_ENTITY_DECL))
82805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (0);
82815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur = cur->parent;
82825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while ((cur != NULL) && (cur->doc != (xmlDocPtr) cur));
82835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
82845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
82855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
82875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapNSNormDeclareNsForced:
82885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @doc: the doc
82895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @elem: the element-node to declare on
82905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @nsName: the namespace-name of the ns-decl
82915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @prefix: the preferred prefix of the ns-decl
82925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @checkShadow: ensure that the new ns-decl doesn't shadow ancestor ns-decls
82935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
82945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Declares a new namespace on @elem. It tries to use the
82955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* given @prefix; if a ns-decl with the given prefix is already existent
82965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* on @elem, it will generate an other prefix.
82975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
82985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 1 if a ns-decl was found, 0 if not and -1 on API
82995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         and internal errors.
83005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
83015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsPtr
83025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapNSNormDeclareNsForced(xmlDocPtr doc,
83035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				xmlNodePtr elem,
83045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				const xmlChar *nsName,
83055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				const xmlChar *prefix,
83065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				int checkShadow)
83075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
83085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ret;
83105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char buf[50];
83115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const xmlChar *pref;
83125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int counter = 0;
83135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
83145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Create a ns-decl on @anchor.
83155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
83165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref = prefix;
83175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (1) {
83185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
83195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Lookup whether the prefix is unused in elem's ns-decls.
83205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
83215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((elem->nsDef != NULL) &&
83225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (xmlTreeNSListLookupByPrefix(elem->nsDef, pref) != NULL))
83235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto ns_next_prefix;
83245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (checkShadow && elem->parent &&
83255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ((xmlNodePtr) elem->parent->doc != elem->parent)) {
83265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
83275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Does it shadow ancestor ns-decls?
83285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
83295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSearchNsByPrefixStrict(doc, elem->parent, pref, NULL) == 1)
83305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto ns_next_prefix;
83315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
83325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlNewNs(NULL, nsName, pref);
83335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret == NULL)
83345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
83355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (elem->nsDef == NULL)
83365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    elem->nsDef = ret;
83375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
83385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNsPtr ns2 = elem->nsDef;
83395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while (ns2->next != NULL)
83405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ns2 = ns2->next;
83415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns2->next = ret;
83425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
83435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (ret);
83445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ns_next_prefix:
83455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	counter++;
83465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (counter > 1000)
83475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (NULL);
83485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (prefix == NULL) {
83495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf((char *) buf, sizeof(buf),
83505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		"ns_%d", counter);
83515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
83525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    snprintf((char *) buf, sizeof(buf),
83535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    "%.30s_%d", (char *)prefix, counter);
83545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	pref = BAD_CAST buf;
83555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
83565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
83575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
83595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapNSNormAquireNormalizedNs:
83605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @doc: the doc
83615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @elem: the element-node to declare namespaces on
83625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ns: the ns-struct to use for the search
83635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @retNs: the found/created ns-struct
83645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @nsMap: the ns-map
83655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @depth: the current tree depth
83665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ancestorsOnly: search in ancestor ns-decls only
83675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @prefixed: if the searched ns-decl must have a prefix (for attributes)
83685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
83695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Searches for a matching ns-name in the ns-decls of @nsMap, if not
83705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* found it will either declare it on @elem, or store it in doc->oldNs.
83715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* If a new ns-decl needs to be declared on @elem, it tries to use the
83725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ns->prefix for it, if this prefix is already in use on @elem, it will
83735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* change the prefix or the new ns-decl.
83745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
83755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 0 if succeeded, -1 otherwise and on API/internal errors.
83765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
83775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
83785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapNSNormAquireNormalizedNs(xmlDocPtr doc,
83795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlNodePtr elem,
83805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlNsPtr ns,
83815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlNsPtr *retNs,
83825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   xmlNsMapPtr *nsMap,
83835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   int depth,
83855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   int ancestorsOnly,
83865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   int prefixed)
83875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
83885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr mi;
83895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((doc == NULL) || (ns == NULL) || (retNs == NULL) ||
83915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(nsMap == NULL))
83925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
83935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *retNs = NULL;
83955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
83965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Handle XML namespace.
83975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
83985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IS_STR_XML(ns->prefix)) {
83995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
84005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Insert XML namespace mapping.
84015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
84025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*retNs = xmlTreeEnsureXMLDecl(doc);
84035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*retNs == NULL)
84045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
84055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
84065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
84075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
84085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * If the search should be done in ancestors only and no
84095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * @elem (the first ancestor) was specified, then skip the search.
84105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
84115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((XML_NSMAP_NOTEMPTY(*nsMap)) &&
84125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(! (ancestorsOnly && (elem == NULL))))
84135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
84145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
84155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Try to find an equal ns-name in in-scope ns-decls.
84165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
84175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	XML_NSMAP_FOREACH(*nsMap, mi) {
84185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
84195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
84205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* ancestorsOnly: This should be turned on to gain speed,
84215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* if one knows that the branch itself was already
84225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* ns-wellformed and no stale references existed.
84235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* I.e. it searches in the ancestor axis only.
84245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
84255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((! ancestorsOnly) || (mi->depth == XML_TREE_NSMAP_PARENT)) &&
84265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Skip shadowed prefixes. */
84275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(mi->shadowDepth == -1) &&
84285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Skip xmlns="" or xmlns:foo="". */
84295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((mi->newNs->href != NULL) &&
84305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(mi->newNs->href[0] != 0)) &&
84315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Ensure a prefix if wanted. */
84325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((! prefixed) || (mi->newNs->prefix != NULL)) &&
84335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Equal ns name */
84345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		((mi->newNs->href == ns->href) ||
84355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlStrEqual(mi->newNs->href, ns->href))) {
84365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Set the mapping. */
84375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		mi->oldNs = ns;
84385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*retNs = mi->newNs;
84395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (0);
84405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
84415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
84425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
84435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
84445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * No luck, the namespace is out of scope or shadowed.
84455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
84465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (elem == NULL) {
84475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNsPtr tmpns;
84485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
84505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Store ns-decls in "oldNs" of the document-node.
84515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
84525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmpns = xmlDOMWrapStoreNs(doc, ns->href, ns->prefix);
84535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (tmpns == NULL)
84545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
84555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
84565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Insert mapping.
84575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
84585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDOMWrapNsMapAddItem(nsMap, -1, ns,
84595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmpns, XML_TREE_NSMAP_DOC) == NULL) {
84605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNs(tmpns);
84615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
84625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
84635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*retNs = tmpns;
84645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
84655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNsPtr tmpns;
84665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	tmpns = xmlDOMWrapNSNormDeclareNsForced(doc, elem, ns->href,
84685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns->prefix, 0);
84695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (tmpns == NULL)
84705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
84715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (*nsMap != NULL) {
84735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
84745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Does it shadow ancestor ns-decls?
84755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
84765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_NSMAP_FOREACH(*nsMap, mi) {
84775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((mi->depth < depth) &&
84785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (mi->shadowDepth == -1) &&
84795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((ns->prefix == mi->newNs->prefix) ||
84805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlStrEqual(ns->prefix, mi->newNs->prefix))) {
84815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
84825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Shadows.
84835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
84845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    mi->shadowDepth = depth;
84855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
84865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
84875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
84885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
84895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (xmlDOMWrapNsMapAddItem(nsMap, -1, ns, tmpns, depth) == NULL) {
84905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNs(tmpns);
84915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (-1);
84925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
84935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*retNs = tmpns;
84945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
84955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
84965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
84975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum {
84995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_DOM_RECONNS_REMOVEREDUND = 1<<0
85005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xmlDOMReconcileNSOptions;
85015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
85035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapReconcileNamespaces:
85045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ctxt: DOM wrapper context, unused at the moment
85055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @elem: the element-node
85065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @options: option flags
85075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
85085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Ensures that ns-references point to ns-decls hold on element-nodes.
85095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Ensures that the tree is namespace wellformed by creating additional
85105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* ns-decls where needed. Note that, since prefixes of already existent
85115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* ns-decls can be shadowed by this process, it could break QNames in
85125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* attribute values or element content.
85135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
85145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* NOTE: This function was not intensively tested.
85155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
85165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 0 if succeeded, -1 otherwise and on API/internal errors.
85175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
85185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
85205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapReconcileNamespaces(xmlDOMWrapCtxtPtr ctxt ATTRIBUTE_UNUSED,
85215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      xmlNodePtr elem,
85225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      int options)
85235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
85245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth = -1, adoptns = 0, parnsdone = 0;
85255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns, prevns;
85265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDocPtr doc;
85275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur, curElem = NULL;
85285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapPtr nsMap = NULL;
85295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr /* topmi = NULL, */ mi;
85305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* @ancestorsOnly should be set by an option flag. */
85315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ancestorsOnly = 0;
85325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int optRemoveRedundantNS =
85335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((xmlDOMReconcileNSOptions) options & XML_DOM_RECONNS_REMOVEREDUND) ? 1 : 0;
85345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr *listRedund = NULL;
85355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sizeRedund = 0, nbRedund = 0, ret, i, j;
85365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((elem == NULL) || (elem->doc == NULL) ||
85385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(elem->type != XML_ELEMENT_NODE))
85395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
85405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc = elem->doc;
85425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = elem;
85435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
85445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (cur->type) {
85455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ELEMENT_NODE:
85465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		adoptns = 1;
85475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curElem = cur;
85485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		depth++;
85495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
85505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Namespace declarations.
85515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
85525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->nsDef != NULL) {
85535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    prevns = NULL;
85545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = cur->nsDef;
85555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    while (ns != NULL) {
85565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (! parnsdone) {
85575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if ((elem->parent) &&
85585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				((xmlNodePtr) elem->parent->doc != elem->parent)) {
85595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				/*
85605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				* Gather ancestor in-scope ns-decls.
85615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				*/
85625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
85635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    elem->parent) == -1)
85645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    goto internal_error;
85655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
85665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parnsdone = 1;
85675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
85685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
85705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Lookup the ns ancestor-axis for equal ns-decls in scope.
85715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
85725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (optRemoveRedundantNS && XML_NSMAP_NOTEMPTY(nsMap)) {
85735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_NSMAP_FOREACH(nsMap, mi) {
85745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
85755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    (mi->shadowDepth == -1) &&
85765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ((ns->prefix == mi->newNs->prefix) ||
85775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      xmlStrEqual(ns->prefix, mi->newNs->prefix)) &&
85785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ((ns->href == mi->newNs->href) ||
85795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      xmlStrEqual(ns->href, mi->newNs->href)))
85805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				{
85815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    /*
85825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    * A redundant ns-decl was found.
85835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    * Add it to the list of redundant ns-decls.
85845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    */
85855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    if (xmlDOMWrapNSNormAddNsMapItem2(&listRedund,
85865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					&sizeRedund, &nbRedund, ns, mi->newNs) == -1)
85875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					goto internal_error;
85885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    /*
85895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    * Remove the ns-decl from the element-node.
85905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    */
85915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    if (prevns)
85925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					prevns->next = ns->next;
85935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    else
85945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					cur->nsDef = ns->next;
85955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    goto next_ns_decl;
85965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
85975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
85985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
85995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
86015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Skip ns-references handling if the referenced
86025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* ns-decl is declared on the same element.
86035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
86045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((cur->ns != NULL) && adoptns && (cur->ns == ns))
86055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    adoptns = 0;
86065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
86075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Does it shadow any ns-decl?
86085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
86095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (XML_NSMAP_NOTEMPTY(nsMap)) {
86105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_NSMAP_FOREACH(nsMap, mi) {
86115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
86125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    (mi->shadowDepth == -1) &&
86135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ((ns->prefix == mi->newNs->prefix) ||
86145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlStrEqual(ns->prefix, mi->newNs->prefix))) {
86155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    mi->shadowDepth = depth;
86175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
86185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
86195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
86205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
86215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Push mapping.
86225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
86235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDOMWrapNsMapAddItem(&nsMap, -1, ns, ns,
86245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    depth) == NULL)
86255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto internal_error;
86265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			prevns = ns;
86285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_ns_decl:
86295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ns = ns->next;
86305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
86315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
86325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! adoptns)
86335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto ns_end;
86345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* No break on purpose. */
86355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ATTRIBUTE_NODE:
86365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* No ns, no fun. */
86375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->ns == NULL)
86385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto ns_end;
86395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! parnsdone) {
86415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((elem->parent) &&
86425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			((xmlNodePtr) elem->parent->doc != elem->parent)) {
86435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
86445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				elem->parent) == -1)
86455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto internal_error;
86465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
86475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parnsdone = 1;
86485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
86495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
86505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Adjust the reference if this was a redundant ns-decl.
86515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
86525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (listRedund) {
86535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   for (i = 0, j = 0; i < nbRedund; i++, j += 2) {
86545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       if (cur->ns == listRedund[j]) {
86555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   cur->ns = listRedund[++j];
86565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   break;
86575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       }
86585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   }
86595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
86605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
86615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Adopt ns-references.
86625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
86635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (XML_NSMAP_NOTEMPTY(nsMap)) {
86645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
86655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Search for a mapping.
86665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
86675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_NSMAP_FOREACH(nsMap, mi) {
86685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((mi->shadowDepth == -1) &&
86695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (cur->ns == mi->oldNs)) {
86705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    cur->ns = mi->newNs;
86725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto ns_end;
86735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
86745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
86755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
86765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
86775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Aquire a normalized ns-decl and add it to the map.
86785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
86795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlDOMWrapNSNormAquireNormalizedNs(doc, curElem,
86805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->ns, &ns,
86815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			&nsMap, depth,
86825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ancestorsOnly,
86835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1)
86845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
86855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->ns = ns;
86865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ns_end:
86885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((cur->type == XML_ELEMENT_NODE) &&
86895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (cur->properties != NULL)) {
86905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
86915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Process attributes.
86925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
86935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur = (xmlNodePtr) cur->properties;
86945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
86955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
86965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
86975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
86985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto next_sibling;
86995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)into_content:
87015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cur->type == XML_ELEMENT_NODE) &&
87025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (cur->children != NULL)) {
87035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
87045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Process content of element-nodes only.
87055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
87065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->children;
87075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
87085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_sibling:
87105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur == elem)
87115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
87125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->type == XML_ELEMENT_NODE) {
87135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (XML_NSMAP_NOTEMPTY(nsMap)) {
87145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
87155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Pop mappings.
87165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
87175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((nsMap->last != NULL) &&
87185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (nsMap->last->depth >= depth))
87195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
87205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_NSMAP_POP(nsMap, mi)
87215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
87225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
87235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Unshadow.
87245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
87255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_NSMAP_FOREACH(nsMap, mi) {
87265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (mi->shadowDepth >= depth)
87275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			mi->shadowDepth = -1;
87285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
87295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
87305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    depth--;
87315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->next != NULL)
87335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
87345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
87355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->type == XML_ATTRIBUTE_NODE) {
87365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->parent;
87375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto into_content;
87385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
87395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->parent;
87405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto next_sibling;
87415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (cur != NULL);
87435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = 0;
87455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit;
87465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
87475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = -1;
87485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
87495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (listRedund) {
87505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = 0, j = 0; i < nbRedund; i++, j += 2) {
87515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlFreeNs(listRedund[j]);
87525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
87535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(listRedund);
87545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
87555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nsMap != NULL)
87565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlDOMWrapNsMapFree(nsMap);
87575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
87585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
87595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
87615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapAdoptBranch:
87625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ctxt: the optional context for custom processing
87635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @sourceDoc: the optional sourceDoc
87645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @node: the element-node to start with
87655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destDoc: the destination doc for adoption
87665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destParent: the optional new parent of @node in @destDoc
87675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @options: option flags
87685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
87695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Ensures that ns-references point to @destDoc: either to
87705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* elements->nsDef entries if @destParent is given, or to
87715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destDoc->oldNs otherwise.
87725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* If @destParent is given, it ensures that the tree is namespace
87735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* wellformed by creating additional ns-decls where needed.
87745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Note that, since prefixes of already existent ns-decls can be
87755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* shadowed by this process, it could break QNames in attribute
87765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* values or element content.
87775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
87785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* NOTE: This function was not intensively tested.
87795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
87805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 0 if succeeded, -1 otherwise and on API/internal errors.
87815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
87825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
87835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapAdoptBranch(xmlDOMWrapCtxtPtr ctxt,
87845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlDocPtr sourceDoc,
87855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlNodePtr node,
87865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlDocPtr destDoc,
87875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlNodePtr destParent,
87885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      int options ATTRIBUTE_UNUSED)
87895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
87905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
87915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur, curElem = NULL;
87925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapPtr nsMap = NULL;
87935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr mi;
87945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns = NULL;
87955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth = -1, adoptStr = 1;
87965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* gather @parent's ns-decls. */
87975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int parnsdone;
87985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* @ancestorsOnly should be set per option. */
87995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ancestorsOnly = 0;
88005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
88025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Optimize string adoption for equal or none dicts.
88035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
88045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((sourceDoc != NULL) &&
88055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(sourceDoc->dict == destDoc->dict))
88065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	adoptStr = 0;
88075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
88085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	adoptStr = 1;
88095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
88115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Get the ns-map from the context if available.
88125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
88135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt)
88145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nsMap = (xmlNsMapPtr) ctxt->namespaceMap;
88155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
88165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Disable search for ns-decls in the parent-axis of the
88175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * desination element, if:
88185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 1) there's no destination parent
88195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * 2) custom ns-reference handling is used
88205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
88215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((destParent == NULL) ||
88225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(ctxt && ctxt->getNsForNodeFunc))
88235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
88245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parnsdone = 1;
88255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
88265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	parnsdone = 0;
88275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = node;
88295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
88305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
88315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Paranoid source-doc sanity check.
88325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
88335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->doc != sourceDoc) {
88345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
88355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We'll assume XIncluded nodes if the doc differs.
88365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Do we need to reconciliate XIncluded nodes?
88375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * This here skips XIncluded nodes and tries to handle
88385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * broken sequences.
88395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
88405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->next == NULL)
88415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
88425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    do {
88435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->next;
88445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((cur->type == XML_XINCLUDE_END) ||
88455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (cur->doc == node->doc))
88465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
88475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } while (cur->next != NULL);
88485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (cur->doc != node->doc)
88505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
88515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
88525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->doc = destDoc;
88535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (cur->type) {
88545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_XINCLUDE_START:
88555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_XINCLUDE_END:
88565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
88575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO
88585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
88595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
88605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ELEMENT_NODE:
88615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curElem = cur;
88625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		depth++;
88635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
88645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Namespace declarations.
88655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* - ns->href and ns->prefix are never in the dict, so
88665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*   we need not move the values over to the destination dict.
88675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* - Note that for custom handling of ns-references,
88685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*   the ns-decls need not be stored in the ns-map,
88695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*   since they won't be referenced by node->ns.
88705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
88715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((cur->nsDef) &&
88725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((ctxt == NULL) || (ctxt->getNsForNodeFunc == NULL)))
88735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
88745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (! parnsdone) {
88755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
88765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Gather @parent's in-scope ns-decls.
88775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
88785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
88795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    destParent) == -1)
88805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto internal_error;
88815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parnsdone = 1;
88825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
88835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (ns = cur->nsDef; ns != NULL; ns = ns->next) {
88845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
88855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* NOTE: ns->prefix and ns->href are never in the dict.
88865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* XML_TREE_ADOPT_STR(ns->prefix)
88875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* XML_TREE_ADOPT_STR(ns->href)
88885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
88895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
88905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Does it shadow any ns-decl?
88915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
88925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (XML_NSMAP_NOTEMPTY(nsMap)) {
88935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    XML_NSMAP_FOREACH(nsMap, mi) {
88945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
88955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    (mi->shadowDepth == -1) &&
88965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    ((ns->prefix == mi->newNs->prefix) ||
88975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    xmlStrEqual(ns->prefix,
88985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    mi->newNs->prefix))) {
88995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    mi->shadowDepth = depth;
89015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
89025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
89035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
89045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
89055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Push mapping.
89065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
89075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (xmlDOMWrapNsMapAddItem(&nsMap, -1,
89085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    ns, ns, depth) == NULL)
89095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto internal_error;
89105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
89115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
89125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* No break on purpose. */
89135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ATTRIBUTE_NODE:
89145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* No namespace, no fun. */
89155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->ns == NULL)
89165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto ns_end;
89175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (! parnsdone) {
89195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
89205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			destParent) == -1)
89215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
89225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parnsdone = 1;
89235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
89245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
89255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Adopt ns-references.
89265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
89275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (XML_NSMAP_NOTEMPTY(nsMap)) {
89285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
89295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Search for a mapping.
89305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
89315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_NSMAP_FOREACH(nsMap, mi) {
89325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((mi->shadowDepth == -1) &&
89335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (cur->ns == mi->oldNs)) {
89345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    cur->ns = mi->newNs;
89365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    goto ns_end;
89375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
89385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
89395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
89405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
89415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* No matching namespace in scope. We need a new one.
89425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
89435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((ctxt) && (ctxt->getNsForNodeFunc)) {
89445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
89455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * User-defined behaviour.
89465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
89475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ns = ctxt->getNsForNodeFunc(ctxt, cur,
89485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->ns->href, cur->ns->prefix);
89495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
89505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Insert mapping if ns is available; it's the users fault
89515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * if not.
89525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
89535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlDOMWrapNsMapAddItem(&nsMap, -1,
89545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    cur->ns, ns, XML_TREE_NSMAP_CUSTOM) == NULL)
89555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
89565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->ns = ns;
89575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
89585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
89595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Aquire a normalized ns-decl and add it to the map.
89605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
89615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlDOMWrapNSNormAquireNormalizedNs(destDoc,
89625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* ns-decls on curElem or on destDoc->oldNs */
89635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			destParent ? curElem : NULL,
89645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->ns, &ns,
89655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			&nsMap, depth,
89665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ancestorsOnly,
89675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* ns-decls must be prefixed for attributes. */
89685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1)
89695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
89705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->ns = ns;
89715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
89725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ns_end:
89735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
89745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Further node properties.
89755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: Is this all?
89765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
89775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_TREE_ADOPT_STR(cur->name)
89785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->type == XML_ELEMENT_NODE) {
89795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->psvi = NULL;
89805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->line = 0;
89815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cur->extra = 0;
89825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
89835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Walk attributes.
89845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
89855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (cur->properties != NULL) {
89865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
89875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Process first attribute node.
89885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
89895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur = (xmlNodePtr) cur->properties;
89905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			continue;
89915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
89925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
89935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
89945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Attributes.
89955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
89965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((sourceDoc != NULL) &&
89975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(((xmlAttrPtr) cur)->atype == XML_ATTRIBUTE_ID))
89985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
89995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlRemoveID(sourceDoc, (xmlAttrPtr) cur);
90005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
90015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((xmlAttrPtr) cur)->atype = 0;
90025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ((xmlAttrPtr) cur)->psvi = NULL;
90035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
90045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
90055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_TEXT_NODE:
90065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CDATA_SECTION_NODE:
90075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
90085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* This puts the content in the dest dict, only if
90095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* it was previously in the source dict.
90105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
90115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_TREE_ADOPT_STR_2(cur->content)
90125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
90135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ENTITY_REF_NODE:
90145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
90155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Remove reference to the entitity-node.
90165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
90175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->content = NULL;
90185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->children = NULL;
90195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->last = NULL;
90205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((destDoc->intSubset) || (destDoc->extSubset)) {
90215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlEntityPtr ent;
90225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
90235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Assign new entity-node if available.
90245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
90255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ent = xmlGetDocEntity(destDoc, cur->name);
90265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ent != NULL) {
90275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->content = ent->content;
90285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->children = (xmlNodePtr) ent;
90295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->last = (xmlNodePtr) ent;
90305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
90315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
90325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
90335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_PI_NODE:
90345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_TREE_ADOPT_STR(cur->name)
90355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_TREE_ADOPT_STR_2(cur->content)
90365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
90375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_COMMENT_NODE:
90385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
90395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
90405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
90415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
90425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
90435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Walk the tree.
90445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
90455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->children != NULL) {
90465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->children;
90475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
90485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
90495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)leave_node:
90515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur == node)
90525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
90535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cur->type == XML_ELEMENT_NODE) ||
90545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (cur->type == XML_XINCLUDE_START) ||
90555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (cur->type == XML_XINCLUDE_END))
90565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
90575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
90585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Do we expect nsDefs on XML_XINCLUDE_START?
90595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
90605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (XML_NSMAP_NOTEMPTY(nsMap)) {
90615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
90625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Pop mappings.
90635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
90645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((nsMap->last != NULL) &&
90655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (nsMap->last->depth >= depth))
90665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
90675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_NSMAP_POP(nsMap, mi)
90685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
90695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
90705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Unshadow.
90715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
90725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_NSMAP_FOREACH(nsMap, mi) {
90735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (mi->shadowDepth >= depth)
90745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			mi->shadowDepth = -1;
90755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
90765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
90775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    depth--;
90785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
90795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->next != NULL)
90805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
90815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if ((cur->type == XML_ATTRIBUTE_NODE) &&
90825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (cur->parent->children != NULL))
90835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
90845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->parent->children;
90855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
90865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->parent;
90875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto leave_node;
90885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
90895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
90905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit;
90925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
90945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = -1;
90955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
90975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
90985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Cleanup.
90995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
91005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nsMap != NULL) {
91015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ctxt) && (ctxt->namespaceMap == nsMap)) {
91025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
91035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Just cleanup the map but don't free.
91045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
91055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nsMap->first) {
91065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (nsMap->pool)
91075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nsMap->last->next = nsMap->pool;
91085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nsMap->pool = nsMap->first;
91095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nsMap->first = NULL;
91105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
91115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
91125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDOMWrapNsMapFree(nsMap);
91135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
91145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(ret);
91155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
91165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
91185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapCloneNode:
91195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ctxt: the optional context for custom processing
91205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @sourceDoc: the optional sourceDoc
91215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @node: the node to start with
91225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @resNode: the clone of the given @node
91235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destDoc: the destination doc
91245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destParent: the optional new parent of @node in @destDoc
91255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @deep: descend into child if set
91265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @options: option flags
91275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
91285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* References of out-of scope ns-decls are remapped to point to @destDoc:
91295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* 1) If @destParent is given, then nsDef entries on element-nodes are used
91305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* 2) If *no* @destParent is given, then @destDoc->oldNs entries are used.
91315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*    This is the case when you don't know already where the cloned branch
91325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*    will be added to.
91335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
91345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* If @destParent is given, it ensures that the tree is namespace
91355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* wellformed by creating additional ns-decls where needed.
91365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Note that, since prefixes of already existent ns-decls can be
91375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* shadowed by this process, it could break QNames in attribute
91385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* values or element content.
91395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* TODO:
91405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*   1) What to do with XInclude? Currently this returns an error for XInclude.
91415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
91425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 0 if the operation succeeded,
91435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         1 if a node of unsupported (or not yet supported) type was given,
91445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         -1 on API/internal errors.
91455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
91465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
91485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapCloneNode(xmlDOMWrapCtxtPtr ctxt,
91495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlDocPtr sourceDoc,
91505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlNodePtr node,
91515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlNodePtr *resNode,
91525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlDocPtr destDoc,
91535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      xmlNodePtr destParent,
91545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      int deep,
91555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      int options ATTRIBUTE_UNUSED)
91565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
91575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret = 0;
91585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur, curElem = NULL;
91595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapPtr nsMap = NULL;
91605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsMapItemPtr mi;
91615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr ns;
91625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int depth = -1;
91635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* int adoptStr = 1; */
91645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* gather @parent's ns-decls. */
91655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int parnsdone = 0;
91665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
91675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * @ancestorsOnly:
91685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: @ancestorsOnly should be set per option.
91695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *
91705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
91715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ancestorsOnly = 0;
91725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr resultClone = NULL, clone = NULL, parentClone = NULL, prevClone = NULL;
91735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNsPtr cloneNs = NULL, *cloneNsDefSlot = NULL;
91745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlDictPtr dict; /* The destination dict */
91755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (resNode == NULL) || (destDoc == NULL))
91775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
91785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
91795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Initially we support only element-nodes.
91805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
91815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->type != XML_ELEMENT_NODE)
91825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(1);
91835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
91845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check node->doc sanity.
91855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
91865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->doc != NULL) && (sourceDoc != NULL) &&
91875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->doc != sourceDoc)) {
91885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
91895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Might be an XIncluded node.
91905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
91915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
91925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
91935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sourceDoc == NULL)
91945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sourceDoc = node->doc;
91955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sourceDoc == NULL)
91965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return (-1);
91975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict = destDoc->dict;
91995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
92005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Reuse the namespace map of the context.
92015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
92025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ctxt)
92035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nsMap = (xmlNsMapPtr) ctxt->namespaceMap;
92045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *resNode = NULL;
92065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = node;
92085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
92095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->doc != sourceDoc) {
92105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
92115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * We'll assume XIncluded nodes if the doc differs.
92125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Do we need to reconciliate XIncluded nodes?
92135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: This here returns -1 in this case.
92145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
92155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
92165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
92175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
92185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Create a new node.
92195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
92205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (cur->type) {
92215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_XINCLUDE_START:
92225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_XINCLUDE_END:
92235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
92245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: What to do with XInclude?
92255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
92265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
92275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
92285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ELEMENT_NODE:
92295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_TEXT_NODE:
92305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CDATA_SECTION_NODE:
92315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_COMMENT_NODE:
92325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_PI_NODE:
92335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_DOCUMENT_FRAG_NODE:
92345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ENTITY_REF_NODE:
92355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ENTITY_NODE:
92365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
92375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Nodes of xmlNode structure.
92385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
92395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		clone = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
92405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (clone == NULL) {
92415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlTreeErrMemory("xmlDOMWrapCloneNode(): allocating a node");
92425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
92435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
92445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		memset(clone, 0, sizeof(xmlNode));
92455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
92465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Set hierachical links.
92475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
92485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (resultClone != NULL) {
92495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    clone->parent = parentClone;
92505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (prevClone) {
92515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			prevClone->next = clone;
92525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			clone->prev = prevClone;
92535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else
92545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parentClone->children = clone;
92555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
92565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    resultClone = clone;
92575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
92595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ATTRIBUTE_NODE:
92605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
92615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Attributes (xmlAttr).
92625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
92635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		clone = (xmlNodePtr) xmlMalloc(sizeof(xmlAttr));
92645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (clone == NULL) {
92655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlTreeErrMemory("xmlDOMWrapCloneNode(): allocating an attr-node");
92665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
92675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
92685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		memset(clone, 0, sizeof(xmlAttr));
92695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
92705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Set hierachical links.
92715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO: Change this to add to the end of attributes.
92725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
92735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (resultClone != NULL) {
92745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    clone->parent = parentClone;
92755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (prevClone) {
92765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			prevClone->next = clone;
92775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			clone->prev = prevClone;
92785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    } else
92795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parentClone->properties = (xmlAttrPtr) clone;
92805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else
92815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    resultClone = clone;
92825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
92835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
92845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
92855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO QUESTION: Any other nodes expected?
92865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
92875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
92885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
92895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	clone->type = cur->type;
92915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	clone->doc = destDoc;
92925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
92945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Clone the name of the node if any.
92955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
92965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->name == xmlStringText)
92975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    clone->name = xmlStringText;
92985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (cur->name == xmlStringTextNoenc)
92995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
93005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * NOTE: Although xmlStringTextNoenc is never assigned to a node
93015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *   in tree.c, it might be set in Libxslt via
93025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *   "xsl:disable-output-escaping".
93035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
93045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    clone->name = xmlStringTextNoenc;
93055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (cur->name == xmlStringComment)
93065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    clone->name = xmlStringComment;
93075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else if (cur->name != NULL) {
93085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    DICT_CONST_COPY(cur->name, clone->name);
93095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
93105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (cur->type) {
93125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_XINCLUDE_START:
93135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_XINCLUDE_END:
93145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
93155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* TODO
93165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
93175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return (-1);
93185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ELEMENT_NODE:
93195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		curElem = cur;
93205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		depth++;
93215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
93225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Namespace declarations.
93235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
93245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (cur->nsDef != NULL) {
93255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (! parnsdone) {
93265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (destParent && (ctxt == NULL)) {
93275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
93285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * Gather @parent's in-scope ns-decls.
93295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
93305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
93315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				destParent) == -1)
93325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
93335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
93345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parnsdone = 1;
93355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
93365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
93375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Clone namespace declarations.
93385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
93395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    cloneNsDefSlot = &(clone->nsDef);
93405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    for (ns = cur->nsDef; ns != NULL; ns = ns->next) {
93415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
93425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Create a new xmlNs.
93435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
93445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cloneNs = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
93455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (cloneNs == NULL) {
93465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    xmlTreeErrMemory("xmlDOMWrapCloneNode(): "
93475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				"allocating namespace");
93485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return(-1);
93495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
93505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			memset(cloneNs, 0, sizeof(xmlNs));
93515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cloneNs->type = XML_LOCAL_NAMESPACE;
93525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ns->href != NULL)
93545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    cloneNs->href = xmlStrdup(ns->href);
93555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ns->prefix != NULL)
93565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    cloneNs->prefix = xmlStrdup(ns->prefix);
93575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*cloneNsDefSlot = cloneNs;
93595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cloneNsDefSlot = &(cloneNs->next);
93605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
93625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Note that for custom handling of ns-references,
93635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* the ns-decls need not be stored in the ns-map,
93645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* since they won't be referenced by node->ns.
93655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
93665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((ctxt == NULL) ||
93675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (ctxt->getNsForNodeFunc == NULL))
93685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
93695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
93705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * Does it shadow any ns-decl?
93715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
93725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (XML_NSMAP_NOTEMPTY(nsMap)) {
93735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				XML_NSMAP_FOREACH(nsMap, mi) {
93745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
93755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					(mi->shadowDepth == -1) &&
93765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					((ns->prefix == mi->newNs->prefix) ||
93775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					xmlStrEqual(ns->prefix,
93785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					mi->newNs->prefix))) {
93795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					/*
93805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					* Mark as shadowed at the current
93815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					* depth.
93825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					*/
93835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					mi->shadowDepth = depth;
93845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    }
93855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
93865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
93875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /*
93885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    * Push mapping.
93895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    */
93905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (xmlDOMWrapNsMapAddItem(&nsMap, -1,
93915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				ns, cloneNs, depth) == NULL)
93925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				goto internal_error;
93935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
93945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
93955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
93965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* cur->ns will be processed further down. */
93975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
93985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ATTRIBUTE_NODE:
93995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* IDs will be processed further down. */
94005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* cur->ns will be processed further down. */
94015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
94025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_TEXT_NODE:
94035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CDATA_SECTION_NODE:
94045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
94055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Note that this will also cover the values of attributes.
94065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
94075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		DICT_COPY(cur->content, clone->content);
94085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
94095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ENTITY_NODE:
94105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* TODO: What to do here? */
94115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
94125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ENTITY_REF_NODE:
94135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (sourceDoc != destDoc) {
94145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if ((destDoc->intSubset) || (destDoc->extSubset)) {
94155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlEntityPtr ent;
94165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/*
94175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			* Different doc: Assign new entity-node if available.
94185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*/
94195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			ent = xmlGetDocEntity(destDoc, cur->name);
94205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (ent != NULL) {
94215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    clone->content = ent->content;
94225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    clone->children = (xmlNodePtr) ent;
94235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    clone->last = (xmlNodePtr) ent;
94245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
94255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
94265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} else {
94275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
94285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Same doc: Use the current node's entity declaration
94295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * and value.
94305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
94315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    clone->content = cur->content;
94325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    clone->children = cur->children;
94335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    clone->last = cur->last;
94345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
94355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
94365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_PI_NODE:
94375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		DICT_COPY(cur->content, clone->content);
94385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
94395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_COMMENT_NODE:
94405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		DICT_COPY(cur->content, clone->content);
94415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto leave_node;
94425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
94435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
94445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
94455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->ns == NULL)
94475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto end_ns_reference;
94485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* handle_ns_reference: */
94505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
94515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	** The following will take care of references to ns-decls ********
94525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	** and is intended only for element- and attribute-nodes.
94535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	**
94545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
94555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (! parnsdone) {
94565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (destParent && (ctxt == NULL)) {
94575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, destParent) == -1)
94585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto internal_error;
94595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
94605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parnsdone = 1;
94615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
94625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
94635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Adopt ns-references.
94645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
94655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (XML_NSMAP_NOTEMPTY(nsMap)) {
94665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
94675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Search for a mapping.
94685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
94695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    XML_NSMAP_FOREACH(nsMap, mi) {
94705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((mi->shadowDepth == -1) &&
94715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (cur->ns == mi->oldNs)) {
94725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
94735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * This is the nice case: a mapping was found.
94745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
94755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    clone->ns = mi->newNs;
94765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    goto end_ns_reference;
94775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
94785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
94795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
94805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
94815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* No matching namespace in scope. We need a new one.
94825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
94835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ctxt != NULL) && (ctxt->getNsForNodeFunc != NULL)) {
94845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
94855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * User-defined behaviour.
94865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
94875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns = ctxt->getNsForNodeFunc(ctxt, cur,
94885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->ns->href, cur->ns->prefix);
94895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
94905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Add user's mapping.
94915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
94925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlDOMWrapNsMapAddItem(&nsMap, -1,
94935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->ns, ns, XML_TREE_NSMAP_CUSTOM) == NULL)
94945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
94955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    clone->ns = ns;
94965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
94975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
94985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Aquire a normalized ns-decl and add it to the map.
94995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
95005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlDOMWrapNSNormAquireNormalizedNs(destDoc,
95015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* ns-decls on curElem or on destDoc->oldNs */
95025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		destParent ? curElem : NULL,
95035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->ns, &ns,
95045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&nsMap, depth,
95055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* if we need to search only in the ancestor-axis */
95065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ancestorsOnly,
95075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* ns-decls must be prefixed for attributes. */
95085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1)
95095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
95105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    clone->ns = ns;
95115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
95125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)end_ns_reference:
95145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
95165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Some post-processing.
95175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
95185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Handle ID attributes.
95195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
95205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((clone->type == XML_ATTRIBUTE_NODE) &&
95215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (clone->parent != NULL))
95225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
95235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlIsID(destDoc, clone->parent, (xmlAttrPtr) clone)) {
95245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlChar *idVal;
95265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		idVal = xmlNodeListGetString(cur->doc, cur->children, 1);
95285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (idVal != NULL) {
95295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (xmlAddID(NULL, destDoc, idVal, (xmlAttrPtr) cur) == NULL) {
95305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* TODO: error message. */
95315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			xmlFree(idVal);
95325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			goto internal_error;
95335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
95345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlFree(idVal);
95355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
95365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
95375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
95385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
95395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	**
95405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	** The following will traverse the tree **************************
95415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	**
95425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*
95435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Walk the element's attributes before descending into child-nodes.
95445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
95455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cur->type == XML_ELEMENT_NODE) && (cur->properties != NULL)) {
95465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prevClone = NULL;
95475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parentClone = clone;
95485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = (xmlNodePtr) cur->properties;
95495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
95505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
95515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)into_content:
95525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
95535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Descend into child-nodes.
95545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
95555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->children != NULL) {
95565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (deep || (cur->type == XML_ATTRIBUTE_NODE)) {
95575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		prevClone = NULL;
95585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parentClone = clone;
95595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur = cur->children;
95605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		continue;
95615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
95625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
95635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)leave_node:
95655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
95665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* At this point we are done with the node, its content
95675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* and an element-nodes's attribute-nodes.
95685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
95695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur == node)
95705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
95715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((cur->type == XML_ELEMENT_NODE) ||
95725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (cur->type == XML_XINCLUDE_START) ||
95735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (cur->type == XML_XINCLUDE_END)) {
95745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
95755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * TODO: Do we expect nsDefs on XML_XINCLUDE_START?
95765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
95775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (XML_NSMAP_NOTEMPTY(nsMap)) {
95785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
95795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Pop mappings.
95805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
95815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((nsMap->last != NULL) &&
95825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (nsMap->last->depth >= depth))
95835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
95845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    XML_NSMAP_POP(nsMap, mi)
95855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
95865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
95875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Unshadow.
95885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
95895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_NSMAP_FOREACH(nsMap, mi) {
95905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (mi->shadowDepth >= depth)
95915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			mi->shadowDepth = -1;
95925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
95935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
95945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    depth--;
95955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
95965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->next != NULL) {
95975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prevClone = clone;
95985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
95995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (cur->type != XML_ATTRIBUTE_NODE) {
96005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
96015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Set clone->last.
96025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
96035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (clone->parent != NULL)
96045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		clone->parent->last = clone;
96055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    clone = clone->parent;
96065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parentClone = clone->parent;
96075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
96085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Process parent --> next;
96095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
96105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->parent;
96115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto leave_node;
96125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
96135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* This is for attributes only. */
96145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    clone = clone->parent;
96155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parentClone = clone->parent;
96165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
96175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Process parent-element --> children.
96185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
96195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->parent;
96205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto into_content;
96215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
96225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
96235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit;
96245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
96265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = -1;
96275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit:
96295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
96305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Cleanup.
96315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
96325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nsMap != NULL) {
96335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((ctxt) && (ctxt->namespaceMap == nsMap)) {
96345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
96355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Just cleanup the map but don't free.
96365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
96375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (nsMap->first) {
96385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (nsMap->pool)
96395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    nsMap->last->next = nsMap->pool;
96405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nsMap->pool = nsMap->first;
96415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		nsMap->first = NULL;
96425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
96435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else
96445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlDOMWrapNsMapFree(nsMap);
96455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
96465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
96475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * TODO: Should we try a cleanup of the cloned node in case of a
96485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * fatal error?
96495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
96505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *resNode = resultClone;
96515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (ret);
96525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
96535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
96555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapAdoptAttr:
96565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ctxt: the optional context for custom processing
96575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @sourceDoc: the optional source document of attr
96585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @attr: the attribute-node to be adopted
96595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destDoc: the destination doc for adoption
96605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destParent: the optional new parent of @attr in @destDoc
96615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @options: option flags
96625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
96635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @attr is adopted by @destDoc.
96645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Ensures that ns-references point to @destDoc: either to
96655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* elements->nsDef entries if @destParent is given, or to
96665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destDoc->oldNs otherwise.
96675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
96685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 0 if succeeded, -1 otherwise and on API/internal errors.
96695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
96705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
96715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapAdoptAttr(xmlDOMWrapCtxtPtr ctxt,
96725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlDocPtr sourceDoc,
96735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlAttrPtr attr,
96745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlDocPtr destDoc,
96755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodePtr destParent,
96765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    int options ATTRIBUTE_UNUSED)
96775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
96785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlNodePtr cur;
96795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int adoptStr = 1;
96805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((attr == NULL) || (destDoc == NULL))
96825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
96835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr->doc = destDoc;
96855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->ns != NULL) {
96865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNsPtr ns = NULL;
96875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ctxt != NULL) {
96895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO: User defined. */
96905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
96915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* XML Namespace. */
96925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (IS_STR_XML(attr->ns->prefix)) {
96935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns = xmlTreeEnsureXMLDecl(destDoc);
96945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else if (destParent == NULL) {
96955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
96965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Store in @destDoc->oldNs.
96975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
96985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ns = xmlDOMWrapStoreNs(destDoc, attr->ns->href, attr->ns->prefix);
96995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} else {
97005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
97015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    * Declare on @destParent.
97025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    */
97035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (xmlSearchNsByNamespaceStrict(destDoc, destParent, attr->ns->href,
97045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		&ns, 1) == -1)
97055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		goto internal_error;
97065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (ns == NULL) {
97075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ns = xmlDOMWrapNSNormDeclareNsForced(destDoc, destParent,
97085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    attr->ns->href, attr->ns->prefix, 1);
97095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
97105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
97115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ns == NULL)
97125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto internal_error;
97135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	attr->ns = ns;
97145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
97155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XML_TREE_ADOPT_STR(attr->name);
97175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr->atype = 0;
97185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attr->psvi = NULL;
97195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
97205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Walk content.
97215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
97225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (attr->children == NULL)
97235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (0);
97245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cur = attr->children;
97255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (cur != NULL) {
97265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->doc = destDoc;
97275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (cur->type) {
97285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_TEXT_NODE:
97295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CDATA_SECTION_NODE:
97305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_TREE_ADOPT_STR_2(cur->content)
97315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
97325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ENTITY_REF_NODE:
97335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
97345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Remove reference to the entitity-node.
97355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
97365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->content = NULL;
97375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->children = NULL;
97385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cur->last = NULL;
97395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((destDoc->intSubset) || (destDoc->extSubset)) {
97405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlEntityPtr ent;
97415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
97425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Assign new entity-node if available.
97435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
97445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ent = xmlGetDocEntity(destDoc, cur->name);
97455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ent != NULL) {
97465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->content = ent->content;
97475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->children = (xmlNodePtr) ent;
97485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			cur->last = (xmlNodePtr) ent;
97495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
97505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
97515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
97525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
97535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
97545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
97555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->children != NULL) {
97565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->children;
97575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue;
97585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
97595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)next_sibling:
97605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur == (xmlNodePtr) attr)
97615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
97625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (cur->next != NULL)
97635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->next;
97645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
97655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    cur = cur->parent;
97665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    goto next_sibling;
97675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
97685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
97695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
97705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_error:
97715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (-1);
97725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
97735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
97755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xmlDOMWrapAdoptNode:
97765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ctxt: the optional context for custom processing
97775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @sourceDoc: the optional sourceDoc
97785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @node: the node to start with
97795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destDoc: the destination doc
97805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @destParent: the optional new parent of @node in @destDoc
97815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @options: option flags
97825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
97835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* References of out-of scope ns-decls are remapped to point to @destDoc:
97845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* 1) If @destParent is given, then nsDef entries on element-nodes are used
97855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* 2) If *no* @destParent is given, then @destDoc->oldNs entries are used
97865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*    This is the case when you have an unliked node and just want to move it
97875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*    to the context of
97885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
97895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* If @destParent is given, it ensures that the tree is namespace
97905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* wellformed by creating additional ns-decls where needed.
97915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Note that, since prefixes of already existent ns-decls can be
97925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* shadowed by this process, it could break QNames in attribute
97935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* values or element content.
97945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* NOTE: This function was not intensively tested.
97955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
97965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Returns 0 if the operation succeeded,
97975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         1 if a node of unsupported type was given,
97985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         2 if a node of not yet supported type was given and
97995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*         -1 on API/internal errors.
98005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
98015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
98025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDOMWrapAdoptNode(xmlDOMWrapCtxtPtr ctxt,
98035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlDocPtr sourceDoc,
98045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodePtr node,
98055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlDocPtr destDoc,
98065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlNodePtr destParent,
98075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    int options)
98085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
98095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node == NULL) || (destDoc == NULL) ||
98105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((destParent != NULL) && (destParent->doc != destDoc)))
98115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return(-1);
98125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
98135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Check node->doc sanity.
98145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
98155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->doc != NULL) && (sourceDoc != NULL) &&
98165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(node->doc != sourceDoc)) {
98175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
98185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Might be an XIncluded node.
98195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
98205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
98215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
98225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sourceDoc == NULL)
98235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	sourceDoc = node->doc;
98245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sourceDoc == destDoc)
98255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (-1);
98265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (node->type) {
98275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ELEMENT_NODE:
98285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ATTRIBUTE_NODE:
98295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_TEXT_NODE:
98305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_CDATA_SECTION_NODE:
98315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_ENTITY_REF_NODE:
98325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_PI_NODE:
98335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_COMMENT_NODE:
98345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
98355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case XML_DOCUMENT_FRAG_NODE:
98365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /* TODO: Support document-fragment-nodes. */
98375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (2);
98385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
98395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (1);
98405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
98415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
98425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * Unlink only if @node was not already added to @destParent.
98435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
98445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((node->parent != NULL) && (destParent != node->parent))
98455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlUnlinkNode(node);
98465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (node->type == XML_ELEMENT_NODE) {
98485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (xmlDOMWrapAdoptBranch(ctxt, sourceDoc, node,
98495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    destDoc, destParent, options));
98505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (node->type == XML_ATTRIBUTE_NODE) {
98515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return (xmlDOMWrapAdoptAttr(ctxt, sourceDoc,
98525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		(xmlAttrPtr) node, destDoc, destParent, options));
98535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
98545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlNodePtr cur = node;
98555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int adoptStr = 1;
98565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	cur->doc = destDoc;
98585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/*
98595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	* Optimize string adoption.
98605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*/
98615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if ((sourceDoc != NULL) &&
98625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (sourceDoc->dict == destDoc->dict))
98635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		adoptStr = 0;
98645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	switch (node->type) {
98655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_TEXT_NODE:
98665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_CDATA_SECTION_NODE:
98675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_TREE_ADOPT_STR_2(node->content)
98685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break;
98695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_ENTITY_REF_NODE:
98705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/*
98715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		* Remove reference to the entitity-node.
98725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*/
98735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node->content = NULL;
98745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node->children = NULL;
98755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		node->last = NULL;
98765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if ((destDoc->intSubset) || (destDoc->extSubset)) {
98775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    xmlEntityPtr ent;
98785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /*
98795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    * Assign new entity-node if available.
98805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    */
98815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ent = xmlGetDocEntity(destDoc, node->name);
98825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ent != NULL) {
98835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			node->content = ent->content;
98845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			node->children = (xmlNodePtr) ent;
98855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			node->last = (xmlNodePtr) ent;
98865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
98875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
98885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_TREE_ADOPT_STR(node->name)
98895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
98905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case XML_PI_NODE: {
98915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_TREE_ADOPT_STR(node->name)
98925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		XML_TREE_ADOPT_STR_2(node->content)
98935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
98945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
98955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
98965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
98975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
98985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
98995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (0);
99005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
99015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_tree
99035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h"
9904