entities.c revision f8e3db0445a1bc8cfe3f77326b07ec161482caa2
13473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
2cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * entities.c : implementation for the XML entities handling
33473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
43473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * See Copyright for the status of this software.
53473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
6c5d64345cf19bfd72418eb0a837869b0462e9130Daniel Veillard * daniel@veillard.com
73473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
83473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
934ce8bece2f22cc99d25221b77315cd008f4866bDaniel Veillard#define IN_LIBXML
1070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#include "libxml.h"
113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#include <string.h>
133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#ifdef HAVE_STDLIB_H
143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#include <stdlib.h>
153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#endif
163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#include <libxml/xmlmemory.h>
173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#include <libxml/hash.h>
183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#include <libxml/entities.h>
193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#include <libxml/parser.h>
2076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack#include <libxml/parserInternals.h>
213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#include <libxml/xmlerror.h>
223c01b1d81b696fe8624b6d7e26ec0ebffcc7c06bDaniel Veillard#include <libxml/globals.h>
237da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard#include <libxml/dict.h>
243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * The XML predefined entities.
273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
29d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityLt = {
30d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "lt",
31f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
32d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST "<", BAD_CAST "<", 1,
33d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
34f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor};
36d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityGt = {
37d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "gt",
38f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
39d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST ">", BAD_CAST ">", 1,
40d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
41f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
42d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard};
43d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityAmp = {
44d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "amp",
45f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
46d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST "&", BAD_CAST "&", 1,
47d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
48f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
49d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard};
50d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityQuot = {
51d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "quot",
52f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
53d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST "\"", BAD_CAST "\"", 1,
54d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
55f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
56d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard};
57d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityApos = {
58d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "apos",
59f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
60d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST "'", BAD_CAST "'", 1,
61d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
62f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor};
643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
65ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard/**
66ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * xmlEntitiesErrMemory:
67ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * @extra:  extra informations
68ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard *
69ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * Handle an out of memory condition
70ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard */
71ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillardstatic void
72ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel VeillardxmlEntitiesErrMemory(const char *extra)
73ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard{
74ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard    __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra);
75ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard}
76ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard
77ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard/**
78ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * xmlEntitiesErr:
79ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * @code:  the error code
80ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * @msg:  the message
81ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard *
82ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * Handle an out of memory condition
83ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard */
84ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillardstatic void
85ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel VeillardxmlEntitiesErr(xmlParserErrors code, const char *msg)
86ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard{
87ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard    __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL);
88ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard}
89ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard
903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlFreeEntity : clean-up an entity record.
923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
937da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillardstatic void
947da92709c8b44b9b01405417aba2f0a80312fc90Daniel VeillardxmlFreeEntity(xmlEntityPtr entity)
957da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard{
967da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    xmlDictPtr dict = NULL;
977da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard
987da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (entity == NULL)
997da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        return;
1007da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard
1017da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (entity->doc != NULL)
1027da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        dict = entity->doc->dict;
1037da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard
1043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1052d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    if ((entity->children) && (entity->owner == 1) &&
1067da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        (entity == (xmlEntityPtr) entity->children->parent))
1077da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        xmlFreeNodeList(entity->children);
1087da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (dict != NULL) {
1097da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name)))
1107da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->name);
1117da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->ExternalID != NULL) &&
1127da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    (!xmlDictOwns(dict, entity->ExternalID)))
1137da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->ExternalID);
1147da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->SystemID != NULL) &&
1157da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    (!xmlDictOwns(dict, entity->SystemID)))
1167da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->SystemID);
1177da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI)))
1187da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->URI);
1197da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->content != NULL)
1207da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            && (!xmlDictOwns(dict, entity->content)))
1217da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->content);
1227da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig)))
1237da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->orig);
1247da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    } else {
1257da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->name != NULL)
1267da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->name);
1277da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->ExternalID != NULL)
1287da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->ExternalID);
1297da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->SystemID != NULL)
1307da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->SystemID);
1317da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->URI != NULL)
1327da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->URI);
1337da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->content != NULL)
1347da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->content);
1357da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->orig != NULL)
1367da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->orig);
1377da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    }
1383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlFree(entity);
1393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
1403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
142aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlCreateEntity:
143aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard *
144aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * internal routine doing the entity node strutures allocations
1453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
1463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorstatic xmlEntityPtr
147aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type,
148aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	        const xmlChar *ExternalID, const xmlChar *SystemID,
149aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	        const xmlChar *content) {
1503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
1513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
1533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) {
154aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        xmlEntitiesErrMemory("xmlCreateEntity: malloc failed");
1553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
1563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
1573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    memset(ret, 0, sizeof(xmlEntity));
1583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->type = XML_ENTITY_DECL;
159a37a6ad91a61d168ecc4b29263def3363fff4da6Daniel Veillard    ret->checked = 0;
1603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
1623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * fill the structure.
1633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
1643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->etype = (xmlEntityType) type;
1657da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (dict == NULL) {
1667da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	ret->name = xmlStrdup(name);
1677da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (ExternalID != NULL)
1687da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->ExternalID = xmlStrdup(ExternalID);
1697da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (SystemID != NULL)
1707da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->SystemID = xmlStrdup(SystemID);
1717da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    } else {
1727da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        ret->name = xmlDictLookup(dict, name, -1);
1737da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (ExternalID != NULL)
1747da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->ExternalID = xmlDictLookup(dict, ExternalID, -1);
1757da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (SystemID != NULL)
1767da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->SystemID = xmlDictLookup(dict, SystemID, -1);
1777da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    }
1783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (content != NULL) {
1793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->length = xmlStrlen(content);
1807da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if ((dict != NULL) && (ret->length < 5))
1817da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->content = (xmlChar *)
1827da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	                   xmlDictLookup(dict, content, ret->length);
1837da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	else
1847da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->content = xmlStrndup(content, ret->length);
1853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     } else {
1863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->length = 0;
1873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->content = NULL;
1883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
1893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->URI = NULL; /* to be computed by the layer knowing
1903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor			the defining entity */
1913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->orig = NULL;
1922d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    ret->owner = 0;
193aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
194aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    return(ret);
195aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard}
196aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
197aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard/*
198aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlAddEntity : register a new entity for an entities table.
199aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard */
200aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillardstatic xmlEntityPtr
201aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type,
202aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	  const xmlChar *ExternalID, const xmlChar *SystemID,
203aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	  const xmlChar *content) {
204aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlDictPtr dict = NULL;
205aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlEntitiesTablePtr table = NULL;
206aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlEntityPtr ret;
207aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
208aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (name == NULL)
209aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	return(NULL);
210aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (dtd == NULL)
211aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	return(NULL);
212aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (dtd->doc != NULL)
213aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        dict = dtd->doc->dict;
214aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
215aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    switch (type) {
216aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_INTERNAL_GENERAL_ENTITY:
217aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
218aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
219aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    if (dtd->entities == NULL)
220aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard		dtd->entities = xmlHashCreateDict(0, dict);
221aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    table = dtd->entities;
222aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    break;
223aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_INTERNAL_PARAMETER_ENTITY:
224aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_EXTERNAL_PARAMETER_ENTITY:
225aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    if (dtd->pentities == NULL)
226aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard		dtd->pentities = xmlHashCreateDict(0, dict);
227aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    table = dtd->pentities;
228aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    break;
229aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_INTERNAL_PREDEFINED_ENTITY:
230aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    return(NULL);
231aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    }
232aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (table == NULL)
233aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	return(NULL);
234aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content);
235aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (ret == NULL)
236aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        return(NULL);
2377da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    ret->doc = dtd->doc;
2383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (xmlHashAddEntry(table, name, ret)) {
2403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
2413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * entity was already defined at another level.
2423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
2433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        xmlFreeEntity(ret);
2443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
2453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
2473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
2483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
2503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetPredefinedEntity:
2513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
2523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Check whether this name is an predefined entity.
2543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
255cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Returns NULL if not, otherwise the entity
2563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
2573473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
2583473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetPredefinedEntity(const xmlChar *name) {
259d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    if (name == NULL) return(NULL);
260d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    switch (name[0]) {
261d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'l':
262d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "lt"))
263d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityLt);
264d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
265d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'g':
266d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "gt"))
267d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityGt);
268d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
269d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'a':
270d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "amp"))
271d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityAmp);
272d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "apos"))
273d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityApos);
274d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
275d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'q':
276d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "quot"))
277d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityQuot);
278d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
279d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	default:
280d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
281d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    }
282d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    return(NULL);
2833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
2843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
2863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDtdEntity:
2873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document
2883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
2893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type:  the entity type XML_xxx_yyy_ENTITY
2903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID:  the entity external ID if available
2913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID:  the entity system ID if available
2923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content:  the entity content
2933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document DTD external subset.
2953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error
2973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
2983473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
2993473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type,
3003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *ExternalID, const xmlChar *SystemID,
3013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		const xmlChar *content) {
3023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
3033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlDtdPtr dtd;
3043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc == NULL) {
306ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DOC,
307ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDtdEntity: document is NULL");
3083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc->extSubset == NULL) {
311ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DTD,
312ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDtdEntity: document without external subset");
3133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    dtd = doc->extSubset;
3163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
3173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) return(NULL);
3183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
320cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard     * Link it to the DTD
3213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
3223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->parent = dtd;
3233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->doc = dtd->doc;
3243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (dtd->last == NULL) {
3253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->children = dtd->last = (xmlNodePtr) ret;
3263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    } else {
3273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        dtd->last->next = (xmlNodePtr) ret;
3283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret->prev = dtd->last;
3293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last = (xmlNodePtr) ret;
3303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
3323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
3353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDocEntity:
3363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document
3373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
3383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type:  the entity type XML_xxx_yyy_ENTITY
3393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID:  the entity external ID if available
3403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID:  the entity system ID if available
3413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content:  the entity content
3423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document.
3443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error
3463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
3473473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
3483473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type,
3493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *ExternalID, const xmlChar *SystemID,
3503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *content) {
3513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
3523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlDtdPtr dtd;
3533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc == NULL) {
355ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DOC,
356ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDocEntity: document is NULL");
3573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc->intSubset == NULL) {
360ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DTD,
361ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDocEntity: document without internal subset");
3623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    dtd = doc->intSubset;
3653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
3663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) return(NULL);
3673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
369cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard     * Link it to the DTD
3703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
3713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->parent = dtd;
3723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->doc = dtd->doc;
3733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (dtd->last == NULL) {
3743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->children = dtd->last = (xmlNodePtr) ret;
3753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    } else {
3763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last->next = (xmlNodePtr) ret;
3773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret->prev = dtd->last;
3783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last = (xmlNodePtr) ret;
3793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
3813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
384aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlNewEntity:
385aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @doc:  the document
386aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @name:  the entity name
387aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @type:  the entity type XML_xxx_yyy_ENTITY
388aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @ExternalID:  the entity external ID if available
389aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @SystemID:  the entity system ID if available
390aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @content:  the entity content
391aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard *
392aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * Create a new entity, this differs from xmlAddDocEntity() that if
393aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * the document is NULL or has no internal subset defined, then an
394aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * unlinked entity structure will be returned, it is then the responsability
395aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * of the caller to link it to the document later or free it when not needed
396aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * anymore.
397aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard *
398aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * Returns a pointer to the entity or NULL in case of error
399aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard */
400aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlEntityPtr
401aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type,
402aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	     const xmlChar *ExternalID, const xmlChar *SystemID,
403aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	     const xmlChar *content) {
404aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlEntityPtr ret;
405aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlDictPtr dict;
406aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
407aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if ((doc != NULL) && (doc->intSubset != NULL)) {
408aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content));
409aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    }
410aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (doc != NULL)
411aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        dict = doc->dict;
412aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    else
413aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        dict = NULL;
414aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content);
415aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (ret == NULL)
416aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        return(NULL);
417aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    ret->doc = doc;
418aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    return(ret);
419aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard}
420aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
421aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard/**
4223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetEntityFromTable:
4233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  an entity table
4243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @parameter:  look for parameter entities
4263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the table.
4283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found.
429f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
4303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
43256a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr
4333473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) {
4343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return((xmlEntityPtr) xmlHashLookup(table, name));
4353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetParameterEntity:
4393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the internal and external subsets and
4433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found.
444f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
4453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4473473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
4483473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) {
4493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
4503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
4513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4523606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard    if (doc == NULL)
4533606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard	return(NULL);
4543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) {
4553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->intSubset->pentities;
4563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret = xmlGetEntityFromTable(table, name);
4573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (ret != NULL)
4583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    return(ret);
4593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) {
4613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->extSubset->pentities;
4623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(xmlGetEntityFromTable(table, name));
4633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(NULL);
4653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDtdEntity:
4693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
472cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Do an entity lookup in the DTD entity hash table and
4733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding entity, if found.
4743606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard * Note: the first argument is the document node, not the DTD node.
475f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
4763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4783473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
4793473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) {
4803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
4813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4823606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard    if (doc == NULL)
4833606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard	return(NULL);
4843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
4853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->extSubset->entities;
4863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(xmlGetEntityFromTable(table, name));
4873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(NULL);
4893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDocEntity:
4933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the document entity hash table and
497cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * returns the corresponding entity, otherwise a lookup is done
4983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * in the predefined entities too.
499f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
5003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
5013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
5023473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
5033473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) {
5043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr cur;
5053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
5063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc != NULL) {
5083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
5093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    table = (xmlEntitiesTablePtr) doc->intSubset->entities;
5103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    cur = xmlGetEntityFromTable(table, name);
5113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (cur != NULL)
5123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		return(cur);
5133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
5142875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	if (doc->standalone != 1) {
5152875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	    if ((doc->extSubset != NULL) &&
5162875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		(doc->extSubset->entities != NULL)) {
5172875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		table = (xmlEntitiesTablePtr) doc->extSubset->entities;
5182875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		cur = xmlGetEntityFromTable(table, name);
5192875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		if (cur != NULL)
5202875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		    return(cur);
5212875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	    }
5223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
5233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
524d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    return(xmlGetPredefinedEntity(name));
5253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
5263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
5283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Macro used to grow the current buffer.
5293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
5303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#define growBufferReentrant() {						\
5314f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    xmlChar *tmp;                                                       \
532baaf03f80f817bb34c421421e6cb4d68c353ac9aAron Xu    size_t new_size = buffer_size * 2;                                  \
5334f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    if (new_size < buffer_size) goto mem_error;                         \
5344f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    tmp = (xmlChar *) xmlRealloc(buffer, new_size);	                \
5354f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    if (tmp == NULL) goto mem_error;                                    \
5364f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    buffer = tmp;							\
5374f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    buffer_size = new_size;						\
5383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
5393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
5417d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeEntitiesInternal:
5423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document containing the string
5433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input:  A string to convert to XML.
5447d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @attr: are we handling an atrbute value
5453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
5463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities
5473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * and non ASCII values with their entities and CharRef counterparts.
5483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Contrary to xmlEncodeEntities, this routine is reentrant, and result
5493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * must be deallocated.
5503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
5513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done.
5523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
5537d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillardstatic xmlChar *
5547d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeEntitiesInternal(xmlDocPtr doc, const xmlChar *input, int attr) {
5553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    const xmlChar *cur = input;
5563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *buffer = NULL;
5573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *out = NULL;
5584f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    size_t buffer_size = 0;
5593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    int html = 0;
5603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (input == NULL) return(NULL);
5623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc != NULL)
5633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        html = (doc->type == XML_HTML_DOCUMENT_NODE);
5643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
5663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * allocate an translation buffer.
5673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
5683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size = 1000;
5693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
5703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {
5717d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard        xmlEntitiesErrMemory("xmlEncodeEntities: malloc failed");
5723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
5733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
5743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    out = buffer;
5753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    while (*cur != '\0') {
5774f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard        size_t indx = out - buffer;
5784f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard        if (indx + 100 > buffer_size) {
5793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    growBufferReentrant();
58156a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    out = &buffer[indx];
5823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
5833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
5853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * By default one have to encode at least '<', '>', '"' and '&' !
5863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
5873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (*cur == '<') {
5887d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    const xmlChar *end;
5897d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard
5907d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    /*
5917d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     * Special handling of server side include in HTML attributes
5927d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     */
5937d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    if (html && attr &&
5947d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	        (cur[1] == '!') && (cur[2] == '-') && (cur[3] == '-') &&
5957d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	        ((end = xmlStrstr(cur, BAD_CAST "-->")) != NULL)) {
5967d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	        while (cur != end) {
5977d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    *out++ = *cur++;
5987d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    indx = out - buffer;
5997d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    if (indx + 100 > buffer_size) {
6007d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			growBufferReentrant();
6017d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			out = &buffer[indx];
6027d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    }
6037d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		}
6047d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		*out++ = *cur++;
6057d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		*out++ = *cur++;
6067d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		*out++ = *cur++;
6077d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		continue;
6087d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    }
6093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'l';
6113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
6123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '>') {
6143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'g';
6163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
6173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '&') {
6197d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    /*
6207d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     * Special handling of &{...} construct from HTML 4, see
6217d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     * http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1
6227d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     */
6237d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    if (html && attr && (cur[1] == '{') && (strchr(cur, '}'))) {
6247d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	        while (*cur != '}') {
6257d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    *out++ = *cur++;
6267d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    indx = out - buffer;
6277d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    if (indx + 100 > buffer_size) {
6287d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			growBufferReentrant();
6297d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			out = &buffer[indx];
6307d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    }
6317d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		}
6327d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		*out++ = *cur++;
6337d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		continue;
6347d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    }
6353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'a';
6373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'm';
6383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'p';
6393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (((*cur >= 0x20) && (*cur < 0x80)) ||
6410046c0fec2aa505a963d44de9621b6c92ccdc9e9Daniel Veillard	    (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) {
6423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    /*
6433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * default case, just copy !
6443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     */
6453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = *cur;
6463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur >= 0x80) {
647122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard	    if (((doc != NULL) && (doc->encoding != NULL)) || (html)) {
6483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
6493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * Bj�rn Reese <br@sseusa.com> provided the patch
6503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        xmlChar xc;
6513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        xc = (*cur & 0x3F) << 6;
6523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        if (cur[1] != 0) {
6533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xc += *(++cur) & 0x3F;
6543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    *out++ = xc;
6553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        } else
6563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
6572728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard		*out++ = *cur;
6583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
6593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
6603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * We assume we have UTF-8 input.
6613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
662b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard		char buf[11], *ptr;
6633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		int val = 0, l = 1;
6643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if (*cur < 0xC0) {
666ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		    xmlEntitiesErr(XML_CHECK_NOT_UTF8,
6677d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			    "xmlEncodeEntities: input not UTF-8");
668122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard		    if (doc != NULL)
669122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard			doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
6703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    snprintf(buf, sizeof(buf), "&#%d;", *cur);
6713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    buf[sizeof(buf) - 1] = 0;
6723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    ptr = buf;
6733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    while (*ptr != 0) *out++ = *ptr++;
67405c13a20b9ac8153adb9158359e2aa09bfe965d0Daniel Veillard		    cur++;
6753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    continue;
6763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xE0) {
6773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x1F;
6783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
6803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 2;
6813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xF0) {
6823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x0F;
6833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
6853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[2]) & 0x3F;
6873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 3;
6883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xF8) {
6893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x07;
6903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
6923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[2]) & 0x3F;
6943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[3]) & 0x3F;
6963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 4;
6973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		}
6983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if ((l == 1) || (!IS_CHAR(val))) {
699ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		    xmlEntitiesErr(XML_ERR_INVALID_CHAR,
7007d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			"xmlEncodeEntities: char out of range\n");
701122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard		    if (doc != NULL)
702122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard			doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
7033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    snprintf(buf, sizeof(buf), "&#%d;", *cur);
7043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    buf[sizeof(buf) - 1] = 0;
7053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    ptr = buf;
7063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    while (*ptr != 0) *out++ = *ptr++;
7073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    cur++;
7083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    continue;
7093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		}
7103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
7113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * We could do multiple things here. Just save as a char ref
7123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
7132728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard		snprintf(buf, sizeof(buf), "&#x%X;", val);
7143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		buf[sizeof(buf) - 1] = 0;
7153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		ptr = buf;
7163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		while (*ptr != 0) *out++ = *ptr++;
7173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		cur += l;
7183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		continue;
7193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
72076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BYTE_CHAR(*cur)) {
721b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard	    char buf[11], *ptr;
7223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    snprintf(buf, sizeof(buf), "&#%d;", *cur);
7243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    buf[sizeof(buf) - 1] = 0;
7253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor            ptr = buf;
7263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    while (*ptr != 0) *out++ = *ptr++;
7273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
7283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur++;
7293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
73013cee4e37ba9f2a401f976e069539514ebfce7bcDaniel Veillard    *out = 0;
7313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(buffer);
7324f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard
7334f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillardmem_error:
7347d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard    xmlEntitiesErrMemory("xmlEncodeEntities: realloc failed");
7354f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    xmlFree(buffer);
7364f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    return(NULL);
7373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
7407d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeAttributeEntities:
7417d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @doc:  the document containing the string
7427d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @input:  A string to convert to XML.
7437d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *
7447d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Do a global encoding of a string, replacing the predefined entities
7457d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * and non ASCII values with their entities and CharRef counterparts for
7467d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * attribute values.
7477d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *
7487d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Returns A newly allocated string with the substitution done.
7497d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */
7507d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlChar *
7517d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input) {
7527d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard    return xmlEncodeEntitiesInternal(doc, input, 1);
7537d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard}
7547d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard
7557d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard/**
7567d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeEntitiesReentrant:
7577d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @doc:  the document containing the string
7587d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @input:  A string to convert to XML.
7597d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *
7607d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Do a global encoding of a string, replacing the predefined entities
7617d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * and non ASCII values with their entities and CharRef counterparts.
7627d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Contrary to xmlEncodeEntities, this routine is reentrant, and result
7637d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * must be deallocated.
7647d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *
7657d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Returns A newly allocated string with the substitution done.
7667d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */
7677d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlChar *
7687d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) {
7697d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard    return xmlEncodeEntitiesInternal(doc, input, 0);
7707d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard}
7717d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard
7727d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard/**
7733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlEncodeSpecialChars:
7743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document containing the string
7753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input:  A string to convert to XML.
7763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities
7783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * this routine is reentrant, and result must be deallocated.
7793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done.
7813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
7823473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlChar *
7839ee35f36437073d952bc88fd64cf1618aad27c7bDaniel VeillardxmlEncodeSpecialChars(xmlDocPtr doc ATTRIBUTE_UNUSED, const xmlChar *input) {
7843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    const xmlChar *cur = input;
7853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *buffer = NULL;
7863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *out = NULL;
7874f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    size_t buffer_size = 0;
788899e64aa2fa3b7796cff6901ef9aafe84215f8b2William M. Brack    if (input == NULL) return(NULL);
7893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
7913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * allocate an translation buffer.
7923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
7933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size = 1000;
7943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
7953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {
796ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed");
7973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
7983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
7993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    out = buffer;
8003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    while (*cur != '\0') {
8024f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard        size_t indx = out - buffer;
8034f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard        if (indx + 10 > buffer_size) {
8043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    growBufferReentrant();
80656a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    out = &buffer[indx];
8073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
8083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
8103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * By default one have to encode at least '<', '>', '"' and '&' !
8113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
8123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (*cur == '<') {
8133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
8143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'l';
8153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
8163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
8173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '>') {
8183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
8193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'g';
8203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
8213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
8223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '&') {
8233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
8243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'a';
8253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'm';
8263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'p';
8273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
8283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '"') {
8293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
8303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'q';
8313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'u';
8323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'o';
8333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
8343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
83519ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	} else if (*cur == '\r') {
83619ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '&';
83719ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '#';
83819ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '1';
83919ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '3';
84019ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = ';';
8413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else {
8423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    /*
8433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * Works because on UTF-8, all extended sequences cannot
8443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * result in bytes in the ASCII range.
8453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     */
8463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = *cur;
8473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
8483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur++;
8493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
85013cee4e37ba9f2a401f976e069539514ebfce7bcDaniel Veillard    *out = 0;
8513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(buffer);
8524f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard
8534f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillardmem_error:
8544f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    xmlEntitiesErrMemory("xmlEncodeSpecialChars: realloc failed");
8554f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    xmlFree(buffer);
8564f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    return(NULL);
8573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
8583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
8603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCreateEntitiesTable:
8613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * create and initialize an empty entities hash table.
863316a5c398919cc1503c59130f7aed14a1111cab7Daniel Veillard * This really doesn't make sense and should be deprecated
8643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the xmlEntitiesTablePtr just created or NULL in case of error.
8663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
8673473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr
8683473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCreateEntitiesTable(void) {
8693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return((xmlEntitiesTablePtr) xmlHashCreate(0));
8703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
8713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
8732d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * xmlFreeEntityWrapper:
8742d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @entity:  An entity
8752d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @name:  its name
8762d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard *
8772d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * Deallocate the memory used by an entities in the hash table.
8782d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard */
8792d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillardstatic void
8802d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel VeillardxmlFreeEntityWrapper(xmlEntityPtr entity,
8812d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard	               const xmlChar *name ATTRIBUTE_UNUSED) {
8822d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    if (entity != NULL)
8832d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard	xmlFreeEntity(entity);
8842d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard}
8852d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard
8862d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard/**
8873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlFreeEntitiesTable:
8883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
8893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Deallocate the memory used by an entities hash table.
8913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
8923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
8933473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlFreeEntitiesTable(xmlEntitiesTablePtr table) {
8942d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper);
8953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
8963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
897652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#ifdef LIBXML_TREE_ENABLED
8983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
8993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntity:
9003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent:  An entity
9013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
9023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity
903f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
9043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesPtr or NULL in case of error.
9053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
90656a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr
9073473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntity(xmlEntityPtr ent) {
9083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr cur;
9093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
9103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
9113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (cur == NULL) {
912ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed");
9133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
9143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
9153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    memset(cur, 0, sizeof(xmlEntity));
916845cce4cf1930d2ab9953ac1a345c5d3bed1ed94Daniel Veillard    cur->type = XML_ENTITY_DECL;
9173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
9183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    cur->etype = ent->etype;
9193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->name != NULL)
9203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->name = xmlStrdup(ent->name);
9213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->ExternalID != NULL)
9223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->ExternalID = xmlStrdup(ent->ExternalID);
9233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->SystemID != NULL)
9243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->SystemID = xmlStrdup(ent->SystemID);
9253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->content != NULL)
9263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->content = xmlStrdup(ent->content);
9273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->orig != NULL)
9283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->orig = xmlStrdup(ent->orig);
9298ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard    if (ent->URI != NULL)
9308ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard	cur->URI = xmlStrdup(ent->URI);
9313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(cur);
9323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
9333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
9343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
9353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntitiesTable:
9363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
9373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
9383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity table.
939f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
9403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesTablePtr or NULL in case of error.
9413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
9423473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr
9433473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntitiesTable(xmlEntitiesTablePtr table) {
9443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity));
9453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
946652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#endif /* LIBXML_TREE_ENABLED */
9473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
948a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
94918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
95018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard/**
95118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * xmlDumpEntityContent:
95218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @buf:  An XML buffer.
95318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @content:  The entity content.
95418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard *
95518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * This will dump the quoted string value, taking care of the special
95618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * treatment required by %
95718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard */
95818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillardstatic void
95918ab8721ff3d009b64d23a372370fa997cdea682Daniel VeillardxmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) {
96018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return;
96118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    if (xmlStrchr(content, '%')) {
96218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard        const xmlChar * base, *cur;
96318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
96418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	xmlBufferCCat(buf, "\"");
96518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	base = cur = content;
96618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	while (*cur != 0) {
96718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    if (*cur == '"') {
96818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		if (base != cur)
96918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		    xmlBufferAdd(buf, base, cur - base);
97018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlBufferAdd(buf, BAD_CAST "&quot;", 6);
97118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
97218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		base = cur;
97318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    } else if (*cur == '%') {
97418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		if (base != cur)
97518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		    xmlBufferAdd(buf, base, cur - base);
97618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlBufferAdd(buf, BAD_CAST "&#x25;", 6);
97718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
97818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		base = cur;
97918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    } else {
98018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
98118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    }
98218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	}
98318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	if (base != cur)
98418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    xmlBufferAdd(buf, base, cur - base);
98518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	xmlBufferCCat(buf, "\"");
98618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    } else {
98718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard        xmlBufferWriteQuotedString(buf, content);
98818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    }
98918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard}
99018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
9913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
9923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntityDecl:
9933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf:  An XML buffer.
9943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent:  An entity table
9953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
9963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition
9973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
9983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
9993473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) {
1000ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if ((buf == NULL) || (ent == NULL)) return;
10013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    switch (ent->etype) {
10023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_INTERNAL_GENERAL_ENTITY:
10033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
10043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, " ");
10063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->orig != NULL)
10073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteQuotedString(buf, ent->orig);
10083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    else
100918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlDumpEntityContent(buf, ent->content);
10103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
10133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
10143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
10163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
10173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
10183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
10193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
10213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
10223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
10243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
10273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
10283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
10303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
10313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
10323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
10333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
10353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
10363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
10383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->content != NULL) { /* Should be true ! */
10393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteChar(buf, " NDATA ");
10403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if (ent->orig != NULL)
10413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xmlBufferWriteCHAR(buf, ent->orig);
10423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		else
10433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xmlBufferWriteCHAR(buf, ent->content);
10443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
10453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_INTERNAL_PARAMETER_ENTITY:
10483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY % ");
10493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, " ");
10513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->orig == NULL)
105218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlDumpEntityContent(buf, ent->content);
10533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    else
10543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteQuotedString(buf, ent->orig);
10553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_PARAMETER_ENTITY:
10583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY % ");
10593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
10613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
10623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
10633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
10643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
10663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
10673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
10693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	default:
1072ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	    xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY,
1073ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		"xmlDumpEntitiesDecl: internal: unknown type entity type");
10743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
10753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
10763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
10773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
10789e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * xmlDumpEntityDeclScan:
10799e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @ent:  An entity table
10809e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @buf:  An XML buffer.
10819e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack *
10829e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * When using the hash table scan function, arguments need to be reversed
10839e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack */
10849e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brackstatic void
10859e66059f08301b933a74bd78f09bdf80ada9d4c4William M. BrackxmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) {
10869e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack    xmlDumpEntityDecl(buf, ent);
10879e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack}
1088f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
10899e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack/**
10903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntitiesTable:
10913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf:  An XML buffer.
10923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
10933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
10943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition
10953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
10963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
10973473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) {
10989e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack    xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf);
10993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
1100a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
11015d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_entities
11025d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
1103