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
257651606f316c366a6d66358b72b3527a829fb7feDaniel Veillard#include "save.h"
267651606f316c366a6d66358b72b3527a829fb7feDaniel Veillard
273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * The XML predefined entities.
293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
31d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityLt = {
32d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "lt",
33f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
34d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST "<", BAD_CAST "<", 1,
35d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
36f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor};
38d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityGt = {
39d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "gt",
40f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
41d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST ">", BAD_CAST ">", 1,
42d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
43f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
44d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard};
45d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityAmp = {
46d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "amp",
47f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
48d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST "&", BAD_CAST "&", 1,
49d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
50f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
51d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard};
52d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityQuot = {
53d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "quot",
54f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
55d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST "\"", BAD_CAST "\"", 1,
56d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
57f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
58d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard};
59d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityApos = {
60d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, XML_ENTITY_DECL, BAD_CAST "apos",
61f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    NULL, NULL, NULL, NULL, NULL, NULL,
62d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    BAD_CAST "'", BAD_CAST "'", 1,
63d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    XML_INTERNAL_PREDEFINED_ENTITY,
64f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard    NULL, NULL, NULL, NULL, 0, 1
653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor};
663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
67ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard/**
68ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * xmlEntitiesErrMemory:
69ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * @extra:  extra informations
70ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard *
71ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * Handle an out of memory condition
72ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard */
73ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillardstatic void
74ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel VeillardxmlEntitiesErrMemory(const char *extra)
75ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard{
76ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard    __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra);
77ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard}
78ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard
79ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard/**
80ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * xmlEntitiesErr:
81ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * @code:  the error code
82ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * @msg:  the message
83ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard *
84ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * Handle an out of memory condition
85ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard */
864472c3a5a5b516aaf59b89be602fbce52756c3e9David Kilzerstatic void LIBXML_ATTR_FORMAT(2,0)
87ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel VeillardxmlEntitiesErr(xmlParserErrors code, const char *msg)
88ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard{
89ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard    __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL);
90ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard}
91ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard
923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlFreeEntity : clean-up an entity record.
943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
957da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillardstatic void
967da92709c8b44b9b01405417aba2f0a80312fc90Daniel VeillardxmlFreeEntity(xmlEntityPtr entity)
977da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard{
987da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    xmlDictPtr dict = NULL;
997da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard
1007da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (entity == NULL)
1017da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        return;
1027da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard
1037da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (entity->doc != NULL)
1047da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        dict = entity->doc->dict;
1057da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard
1063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1072d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    if ((entity->children) && (entity->owner == 1) &&
1087da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        (entity == (xmlEntityPtr) entity->children->parent))
1097da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        xmlFreeNodeList(entity->children);
1107da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (dict != NULL) {
1117da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name)))
1127da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->name);
1137da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->ExternalID != NULL) &&
1147da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    (!xmlDictOwns(dict, entity->ExternalID)))
1157da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->ExternalID);
1167da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->SystemID != NULL) &&
1177da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    (!xmlDictOwns(dict, entity->SystemID)))
1187da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->SystemID);
1197da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI)))
1207da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->URI);
1217da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->content != NULL)
1227da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            && (!xmlDictOwns(dict, entity->content)))
1237da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->content);
1247da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig)))
1257da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->orig);
1267da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    } else {
1277da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->name != NULL)
1287da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->name);
1297da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->ExternalID != NULL)
1307da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->ExternalID);
1317da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->SystemID != NULL)
1327da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->SystemID);
1337da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->URI != NULL)
1347da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->URI);
1357da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->content != NULL)
1367da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->content);
1377da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        if (entity->orig != NULL)
1387da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard            xmlFree((char *) entity->orig);
1397da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    }
1403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlFree(entity);
1413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
1423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
144aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlCreateEntity:
145aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard *
146aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * internal routine doing the entity node strutures allocations
1473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
1483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorstatic xmlEntityPtr
149aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type,
150aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	        const xmlChar *ExternalID, const xmlChar *SystemID,
151aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	        const xmlChar *content) {
1523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
1533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
1553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) {
156aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        xmlEntitiesErrMemory("xmlCreateEntity: malloc failed");
1573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
1583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
1593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    memset(ret, 0, sizeof(xmlEntity));
1603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->type = XML_ENTITY_DECL;
161a37a6ad91a61d168ecc4b29263def3363fff4da6Daniel Veillard    ret->checked = 0;
1623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
1643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * fill the structure.
1653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
1663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->etype = (xmlEntityType) type;
1677da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (dict == NULL) {
1687da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	ret->name = xmlStrdup(name);
1697da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (ExternalID != NULL)
1707da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->ExternalID = xmlStrdup(ExternalID);
1717da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (SystemID != NULL)
1727da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->SystemID = xmlStrdup(SystemID);
1737da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    } else {
1747da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        ret->name = xmlDictLookup(dict, name, -1);
1757da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (ExternalID != NULL)
1767da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->ExternalID = xmlDictLookup(dict, ExternalID, -1);
1777da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (SystemID != NULL)
1787da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->SystemID = xmlDictLookup(dict, SystemID, -1);
1797da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    }
1803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (content != NULL) {
1813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->length = xmlStrlen(content);
1827da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if ((dict != NULL) && (ret->length < 5))
1837da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->content = (xmlChar *)
1847da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	                   xmlDictLookup(dict, content, ret->length);
1857da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	else
1867da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->content = xmlStrndup(content, ret->length);
1873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     } else {
1883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->length = 0;
1893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->content = NULL;
1903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
1913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->URI = NULL; /* to be computed by the layer knowing
1923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor			the defining entity */
1933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->orig = NULL;
1942d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    ret->owner = 0;
195aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
196aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    return(ret);
197aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard}
198aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
199aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard/*
200aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlAddEntity : register a new entity for an entities table.
201aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard */
202aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillardstatic xmlEntityPtr
203aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type,
204aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	  const xmlChar *ExternalID, const xmlChar *SystemID,
205aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	  const xmlChar *content) {
206aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlDictPtr dict = NULL;
207aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlEntitiesTablePtr table = NULL;
208aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlEntityPtr ret;
209aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
210aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (name == NULL)
211aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	return(NULL);
212aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (dtd == NULL)
213aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	return(NULL);
214aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (dtd->doc != NULL)
215aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        dict = dtd->doc->dict;
216aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
217aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    switch (type) {
218aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_INTERNAL_GENERAL_ENTITY:
219aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
220aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
221aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    if (dtd->entities == NULL)
222aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard		dtd->entities = xmlHashCreateDict(0, dict);
223aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    table = dtd->entities;
224aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    break;
225aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_INTERNAL_PARAMETER_ENTITY:
226aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_EXTERNAL_PARAMETER_ENTITY:
227aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    if (dtd->pentities == NULL)
228aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard		dtd->pentities = xmlHashCreateDict(0, dict);
229aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    table = dtd->pentities;
230aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    break;
231aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        case XML_INTERNAL_PREDEFINED_ENTITY:
232aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	    return(NULL);
233aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    }
234aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (table == NULL)
235aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	return(NULL);
236aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content);
237aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (ret == NULL)
238aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        return(NULL);
2397da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    ret->doc = dtd->doc;
2403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (xmlHashAddEntry(table, name, ret)) {
2423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
2433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * entity was already defined at another level.
2443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
2453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        xmlFreeEntity(ret);
2463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
2473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
2493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
2503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
2523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetPredefinedEntity:
2533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
2543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Check whether this name is an predefined entity.
2563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
257cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Returns NULL if not, otherwise the entity
2583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
2593473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
2603473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetPredefinedEntity(const xmlChar *name) {
261d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    if (name == NULL) return(NULL);
262d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    switch (name[0]) {
263d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'l':
264d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "lt"))
265d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityLt);
266d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
267d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'g':
268d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "gt"))
269d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityGt);
270d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
271d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'a':
272d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "amp"))
273d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityAmp);
274d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "apos"))
275d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityApos);
276d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
277d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'q':
278d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "quot"))
279d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityQuot);
280d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
281d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	default:
282d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
283d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    }
284d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    return(NULL);
2853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
2863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
2883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDtdEntity:
2893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document
2903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
2913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type:  the entity type XML_xxx_yyy_ENTITY
2923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID:  the entity external ID if available
2933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID:  the entity system ID if available
2943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content:  the entity content
2953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document DTD external subset.
2973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error
2993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
3003473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
3013473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type,
3023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *ExternalID, const xmlChar *SystemID,
3033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		const xmlChar *content) {
3043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
3053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlDtdPtr dtd;
3063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc == NULL) {
308ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DOC,
309ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDtdEntity: document is NULL");
3103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc->extSubset == NULL) {
313ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DTD,
314ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDtdEntity: document without external subset");
3153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    dtd = doc->extSubset;
3183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
3193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) return(NULL);
3203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
322cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard     * Link it to the DTD
3233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
3243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->parent = dtd;
3253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->doc = dtd->doc;
3263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (dtd->last == NULL) {
3273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->children = dtd->last = (xmlNodePtr) ret;
3283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    } else {
3293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        dtd->last->next = (xmlNodePtr) ret;
3303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret->prev = dtd->last;
3313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last = (xmlNodePtr) ret;
3323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
3343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
3373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDocEntity:
3383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document
3393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
3403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type:  the entity type XML_xxx_yyy_ENTITY
3413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID:  the entity external ID if available
3423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID:  the entity system ID if available
3433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content:  the entity content
3443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document.
3463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error
3483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
3493473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
3503473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type,
3513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *ExternalID, const xmlChar *SystemID,
3523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *content) {
3533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
3543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlDtdPtr dtd;
3553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc == NULL) {
357ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DOC,
358ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDocEntity: document is NULL");
3593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc->intSubset == NULL) {
362ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DTD,
363ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDocEntity: document without internal subset");
3643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    dtd = doc->intSubset;
3673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
3683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) return(NULL);
3693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
371cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard     * Link it to the DTD
3723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
3733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->parent = dtd;
3743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->doc = dtd->doc;
3753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (dtd->last == NULL) {
3763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->children = dtd->last = (xmlNodePtr) ret;
3773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    } else {
3783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last->next = (xmlNodePtr) ret;
3793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret->prev = dtd->last;
3803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last = (xmlNodePtr) ret;
3813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
3833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
386aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlNewEntity:
387aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @doc:  the document
388aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @name:  the entity name
389aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @type:  the entity type XML_xxx_yyy_ENTITY
390aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @ExternalID:  the entity external ID if available
391aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @SystemID:  the entity system ID if available
392aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @content:  the entity content
393aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard *
394aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * Create a new entity, this differs from xmlAddDocEntity() that if
395aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * the document is NULL or has no internal subset defined, then an
396aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * unlinked entity structure will be returned, it is then the responsability
397aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * of the caller to link it to the document later or free it when not needed
398aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * anymore.
399aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard *
400aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * Returns a pointer to the entity or NULL in case of error
401aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard */
402aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlEntityPtr
403aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type,
404aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	     const xmlChar *ExternalID, const xmlChar *SystemID,
405aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	     const xmlChar *content) {
406aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlEntityPtr ret;
407aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    xmlDictPtr dict;
408aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
409aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if ((doc != NULL) && (doc->intSubset != NULL)) {
410aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard	return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content));
411aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    }
412aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (doc != NULL)
413aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        dict = doc->dict;
414aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    else
415aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        dict = NULL;
416aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content);
417aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    if (ret == NULL)
418aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard        return(NULL);
419aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    ret->doc = doc;
420aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard    return(ret);
421aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard}
422aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard
423aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard/**
4243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetEntityFromTable:
4253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  an entity table
4263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @parameter:  look for parameter entities
4283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the table.
4303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found.
431f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
4323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
43456a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr
4353473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) {
4363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return((xmlEntityPtr) xmlHashLookup(table, name));
4373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetParameterEntity:
4413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the internal and external subsets and
4453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found.
446f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
4473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4493473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
4503473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) {
4513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
4523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
4533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4543606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard    if (doc == NULL)
4553606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard	return(NULL);
4563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) {
4573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->intSubset->pentities;
4583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret = xmlGetEntityFromTable(table, name);
4593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (ret != NULL)
4603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    return(ret);
4613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) {
4633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->extSubset->pentities;
4643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(xmlGetEntityFromTable(table, name));
4653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(NULL);
4673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDtdEntity:
4713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
474cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Do an entity lookup in the DTD entity hash table and
4753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding entity, if found.
4763606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard * Note: the first argument is the document node, not the DTD node.
477f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
4783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4803473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
4813473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) {
4823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
4833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4843606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard    if (doc == NULL)
4853606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard	return(NULL);
4863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
4873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->extSubset->entities;
4883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(xmlGetEntityFromTable(table, name));
4893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(NULL);
4913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDocEntity:
4953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the document entity hash table and
499cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * returns the corresponding entity, otherwise a lookup is done
5003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * in the predefined entities too.
501f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
5023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
5033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
5043473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
50595ebe53b50dfcff1fc5378309bc4f3c58173298eKurt RoeckxxmlGetDocEntity(const xmlDoc *doc, const xmlChar *name) {
5063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr cur;
5073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
5083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc != NULL) {
5103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
5113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    table = (xmlEntitiesTablePtr) doc->intSubset->entities;
5123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    cur = xmlGetEntityFromTable(table, name);
5133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (cur != NULL)
5143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		return(cur);
5153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
5162875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	if (doc->standalone != 1) {
5172875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	    if ((doc->extSubset != NULL) &&
5182875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		(doc->extSubset->entities != NULL)) {
5192875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		table = (xmlEntitiesTablePtr) doc->extSubset->entities;
5202875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		cur = xmlGetEntityFromTable(table, name);
5212875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		if (cur != NULL)
5222875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		    return(cur);
5232875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	    }
5243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
5253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
526d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    return(xmlGetPredefinedEntity(name));
5273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
5283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
5303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Macro used to grow the current buffer.
5313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
5323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#define growBufferReentrant() {						\
5334f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    xmlChar *tmp;                                                       \
534baaf03f80f817bb34c421421e6cb4d68c353ac9aAron Xu    size_t new_size = buffer_size * 2;                                  \
5354f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    if (new_size < buffer_size) goto mem_error;                         \
5364f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    tmp = (xmlChar *) xmlRealloc(buffer, new_size);	                \
5374f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    if (tmp == NULL) goto mem_error;                                    \
5384f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    buffer = tmp;							\
5394f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    buffer_size = new_size;						\
5403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
5413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
5437d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeEntitiesInternal:
5443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document containing the string
5453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input:  A string to convert to XML.
5467d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @attr: are we handling an atrbute value
5473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
5483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities
5493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * and non ASCII values with their entities and CharRef counterparts.
5503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Contrary to xmlEncodeEntities, this routine is reentrant, and result
5513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * must be deallocated.
5523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
5533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done.
5543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
5557d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillardstatic xmlChar *
5567d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeEntitiesInternal(xmlDocPtr doc, const xmlChar *input, int attr) {
5573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    const xmlChar *cur = input;
5583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *buffer = NULL;
5593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *out = NULL;
5604f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    size_t buffer_size = 0;
5613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    int html = 0;
5623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (input == NULL) return(NULL);
5643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc != NULL)
5653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        html = (doc->type == XML_HTML_DOCUMENT_NODE);
5663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
5683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * allocate an translation buffer.
5693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
5703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size = 1000;
5713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
5723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {
5737d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard        xmlEntitiesErrMemory("xmlEncodeEntities: malloc failed");
5743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
5753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
5763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    out = buffer;
5773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    while (*cur != '\0') {
5794f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard        size_t indx = out - buffer;
5804f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard        if (indx + 100 > buffer_size) {
5813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    growBufferReentrant();
58356a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    out = &buffer[indx];
5843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
5853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
5873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * By default one have to encode at least '<', '>', '"' and '&' !
5883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
5893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (*cur == '<') {
5907d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    const xmlChar *end;
5917d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard
5927d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    /*
5937d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     * Special handling of server side include in HTML attributes
5947d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     */
5957d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    if (html && attr &&
5967d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	        (cur[1] == '!') && (cur[2] == '-') && (cur[3] == '-') &&
5977d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	        ((end = xmlStrstr(cur, BAD_CAST "-->")) != NULL)) {
5987d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	        while (cur != end) {
5997d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    *out++ = *cur++;
6007d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    indx = out - buffer;
6017d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    if (indx + 100 > buffer_size) {
6027d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			growBufferReentrant();
6037d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			out = &buffer[indx];
6047d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    }
6057d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		}
6067d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		*out++ = *cur++;
6077d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		*out++ = *cur++;
6087d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		*out++ = *cur++;
6097d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		continue;
6107d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    }
6113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'l';
6133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
6143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '>') {
6163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'g';
6183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
6193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '&') {
6217d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    /*
6227d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     * Special handling of &{...} construct from HTML 4, see
6237d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     * http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1
6247d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	     */
6257651606f316c366a6d66358b72b3527a829fb7feDaniel Veillard	    if (html && attr && (cur[1] == '{') &&
6267651606f316c366a6d66358b72b3527a829fb7feDaniel Veillard	        (strchr((const char *) cur, '}'))) {
6277d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	        while (*cur != '}') {
6287d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    *out++ = *cur++;
6297d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    indx = out - buffer;
6307d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    if (indx + 100 > buffer_size) {
6317d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			growBufferReentrant();
6327d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			out = &buffer[indx];
6337d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		    }
6347d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		}
6357d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		*out++ = *cur++;
6367d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard		continue;
6377d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard	    }
6383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'a';
6403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'm';
6413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'p';
6423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (((*cur >= 0x20) && (*cur < 0x80)) ||
6440046c0fec2aa505a963d44de9621b6c92ccdc9e9Daniel Veillard	    (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) {
6453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    /*
6463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * default case, just copy !
6473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     */
6483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = *cur;
6493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur >= 0x80) {
650122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard	    if (((doc != NULL) && (doc->encoding != NULL)) || (html)) {
6513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
6520ab8ce53024e80f671b135a58086a24bf76bc2ebDaniel Veillard		 * Bjørn Reese <br@sseusa.com> provided the patch
6533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        xmlChar xc;
6543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        xc = (*cur & 0x3F) << 6;
6553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        if (cur[1] != 0) {
6563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xc += *(++cur) & 0x3F;
6573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    *out++ = xc;
6583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        } else
6593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
6602728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard		*out++ = *cur;
6613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
6623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
6633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * We assume we have UTF-8 input.
6643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
665b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard		char buf[11], *ptr;
6663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		int val = 0, l = 1;
6673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if (*cur < 0xC0) {
669ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		    xmlEntitiesErr(XML_CHECK_NOT_UTF8,
6707d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			    "xmlEncodeEntities: input not UTF-8");
671122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard		    if (doc != NULL)
672122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard			doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
6733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    snprintf(buf, sizeof(buf), "&#%d;", *cur);
6743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    buf[sizeof(buf) - 1] = 0;
6753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    ptr = buf;
6763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    while (*ptr != 0) *out++ = *ptr++;
67705c13a20b9ac8153adb9158359e2aa09bfe965d0Daniel Veillard		    cur++;
6783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    continue;
6793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xE0) {
6803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x1F;
6813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
6833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 2;
6843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xF0) {
6853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x0F;
6863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
6883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[2]) & 0x3F;
6903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 3;
6913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xF8) {
6923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x07;
6933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
6953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[2]) & 0x3F;
6973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[3]) & 0x3F;
6993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 4;
7003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		}
7013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if ((l == 1) || (!IS_CHAR(val))) {
702ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		    xmlEntitiesErr(XML_ERR_INVALID_CHAR,
7037d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard			"xmlEncodeEntities: char out of range\n");
704122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard		    if (doc != NULL)
705122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard			doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
7063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    snprintf(buf, sizeof(buf), "&#%d;", *cur);
7073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    buf[sizeof(buf) - 1] = 0;
7083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    ptr = buf;
7093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    while (*ptr != 0) *out++ = *ptr++;
7103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    cur++;
7113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    continue;
7123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		}
7133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
7143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * We could do multiple things here. Just save as a char ref
7153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
7162728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard		snprintf(buf, sizeof(buf), "&#x%X;", val);
7173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		buf[sizeof(buf) - 1] = 0;
7183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		ptr = buf;
7193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		while (*ptr != 0) *out++ = *ptr++;
7203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		cur += l;
7213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		continue;
7223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
72376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BYTE_CHAR(*cur)) {
724b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard	    char buf[11], *ptr;
7253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    snprintf(buf, sizeof(buf), "&#%d;", *cur);
7273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    buf[sizeof(buf) - 1] = 0;
7283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor            ptr = buf;
7293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    while (*ptr != 0) *out++ = *ptr++;
7303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
7313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur++;
7323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
73313cee4e37ba9f2a401f976e069539514ebfce7bcDaniel Veillard    *out = 0;
7343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(buffer);
7354f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard
7364f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillardmem_error:
7377d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard    xmlEntitiesErrMemory("xmlEncodeEntities: realloc failed");
7384f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    xmlFree(buffer);
7394f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    return(NULL);
7403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
7437d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeAttributeEntities:
7447d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @doc:  the document containing the string
7457d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @input:  A string to convert to XML.
7467d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *
7477d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Do a global encoding of a string, replacing the predefined entities
7487d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * and non ASCII values with their entities and CharRef counterparts for
7497d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * attribute values.
7507d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *
7517d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Returns A newly allocated string with the substitution done.
7527d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */
7537d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlChar *
7547d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input) {
7557d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard    return xmlEncodeEntitiesInternal(doc, input, 1);
7567d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard}
7577d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard
7587d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard/**
7597d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeEntitiesReentrant:
7607d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @doc:  the document containing the string
7617d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @input:  A string to convert to XML.
7627d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *
7637d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Do a global encoding of a string, replacing the predefined entities
7647d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * and non ASCII values with their entities and CharRef counterparts.
7657d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Contrary to xmlEncodeEntities, this routine is reentrant, and result
7667d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * must be deallocated.
7677d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *
7687d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Returns A newly allocated string with the substitution done.
7697d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */
7707d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlChar *
7717d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) {
7727d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard    return xmlEncodeEntitiesInternal(doc, input, 0);
7737d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard}
7747d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard
7757d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard/**
7763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlEncodeSpecialChars:
7773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document containing the string
7783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input:  A string to convert to XML.
7793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities
7813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * this routine is reentrant, and result must be deallocated.
7823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done.
7843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
7853473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlChar *
78695ebe53b50dfcff1fc5378309bc4f3c58173298eKurt RoeckxxmlEncodeSpecialChars(const xmlDoc *doc ATTRIBUTE_UNUSED, const xmlChar *input) {
7873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    const xmlChar *cur = input;
7883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *buffer = NULL;
7893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *out = NULL;
7904f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    size_t buffer_size = 0;
791899e64aa2fa3b7796cff6901ef9aafe84215f8b2William M. Brack    if (input == NULL) return(NULL);
7923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
7943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * allocate an translation buffer.
7953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
7963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size = 1000;
7973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
7983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {
799ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed");
8003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
8013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
8023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    out = buffer;
8033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    while (*cur != '\0') {
8054f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard        size_t indx = out - buffer;
8064f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard        if (indx + 10 > buffer_size) {
8073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    growBufferReentrant();
80956a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    out = &buffer[indx];
8103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
8113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
8133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * By default one have to encode at least '<', '>', '"' and '&' !
8143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
8153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (*cur == '<') {
8163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
8173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'l';
8183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
8193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
8203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '>') {
8213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
8223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'g';
8233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
8243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
8253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '&') {
8263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
8273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'a';
8283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'm';
8293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'p';
8303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
8313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '"') {
8323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
8333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'q';
8343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'u';
8353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'o';
8363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
8373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
83819ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	} else if (*cur == '\r') {
83919ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '&';
84019ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '#';
84119ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '1';
84219ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '3';
84319ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = ';';
8443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else {
8453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    /*
8463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * Works because on UTF-8, all extended sequences cannot
8473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * result in bytes in the ASCII range.
8483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     */
8493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = *cur;
8503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
8513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur++;
8523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
85313cee4e37ba9f2a401f976e069539514ebfce7bcDaniel Veillard    *out = 0;
8543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(buffer);
8554f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard
8564f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillardmem_error:
8574f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    xmlEntitiesErrMemory("xmlEncodeSpecialChars: realloc failed");
8584f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    xmlFree(buffer);
8594f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard    return(NULL);
8603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
8613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
8633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCreateEntitiesTable:
8643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * create and initialize an empty entities hash table.
866316a5c398919cc1503c59130f7aed14a1111cab7Daniel Veillard * This really doesn't make sense and should be deprecated
8673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the xmlEntitiesTablePtr just created or NULL in case of error.
8693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
8703473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr
8713473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCreateEntitiesTable(void) {
8723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return((xmlEntitiesTablePtr) xmlHashCreate(0));
8733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
8743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
8762d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * xmlFreeEntityWrapper:
8772d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @entity:  An entity
8782d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @name:  its name
8792d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard *
8802d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * Deallocate the memory used by an entities in the hash table.
8812d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard */
8822d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillardstatic void
8832d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel VeillardxmlFreeEntityWrapper(xmlEntityPtr entity,
8842d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard	               const xmlChar *name ATTRIBUTE_UNUSED) {
8852d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    if (entity != NULL)
8862d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard	xmlFreeEntity(entity);
8872d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard}
8882d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard
8892d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard/**
8903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlFreeEntitiesTable:
8913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
8923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Deallocate the memory used by an entities hash table.
8943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
8953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
8963473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlFreeEntitiesTable(xmlEntitiesTablePtr table) {
8972d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper);
8983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
8993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
900652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#ifdef LIBXML_TREE_ENABLED
9013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
9023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntity:
9033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent:  An entity
9043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
9053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity
906f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
9073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesPtr or NULL in case of error.
9083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
90956a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr
9103473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntity(xmlEntityPtr ent) {
9113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr cur;
9123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
9133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
9143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (cur == NULL) {
915ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed");
9163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
9173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
9183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    memset(cur, 0, sizeof(xmlEntity));
919845cce4cf1930d2ab9953ac1a345c5d3bed1ed94Daniel Veillard    cur->type = XML_ENTITY_DECL;
9203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
9213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    cur->etype = ent->etype;
9223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->name != NULL)
9233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->name = xmlStrdup(ent->name);
9243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->ExternalID != NULL)
9253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->ExternalID = xmlStrdup(ent->ExternalID);
9263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->SystemID != NULL)
9273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->SystemID = xmlStrdup(ent->SystemID);
9283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->content != NULL)
9293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->content = xmlStrdup(ent->content);
9303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->orig != NULL)
9313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->orig = xmlStrdup(ent->orig);
9328ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard    if (ent->URI != NULL)
9338ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard	cur->URI = xmlStrdup(ent->URI);
9343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(cur);
9353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
9363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
9373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
9383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntitiesTable:
9393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
9403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
9413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity table.
942f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
9433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesTablePtr or NULL in case of error.
9443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
9453473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr
9463473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntitiesTable(xmlEntitiesTablePtr table) {
9473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity));
9483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
949652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#endif /* LIBXML_TREE_ENABLED */
9503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
951a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
95218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
95318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard/**
95418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * xmlDumpEntityContent:
95518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @buf:  An XML buffer.
95618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @content:  The entity content.
95718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard *
95818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * This will dump the quoted string value, taking care of the special
95918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * treatment required by %
96018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard */
96118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillardstatic void
96218ab8721ff3d009b64d23a372370fa997cdea682Daniel VeillardxmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) {
96318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return;
96418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    if (xmlStrchr(content, '%')) {
96518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard        const xmlChar * base, *cur;
96618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
96718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	xmlBufferCCat(buf, "\"");
96818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	base = cur = content;
96918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	while (*cur != 0) {
97018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    if (*cur == '"') {
97118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		if (base != cur)
97218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		    xmlBufferAdd(buf, base, cur - base);
97318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlBufferAdd(buf, BAD_CAST "&quot;", 6);
97418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
97518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		base = cur;
97618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    } else if (*cur == '%') {
97718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		if (base != cur)
97818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		    xmlBufferAdd(buf, base, cur - base);
97918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlBufferAdd(buf, BAD_CAST "&#x25;", 6);
98018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
98118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		base = cur;
98218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    } else {
98318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
98418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    }
98518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	}
98618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	if (base != cur)
98718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    xmlBufferAdd(buf, base, cur - base);
98818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	xmlBufferCCat(buf, "\"");
98918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    } else {
99018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard        xmlBufferWriteQuotedString(buf, content);
99118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    }
99218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard}
99318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
9943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
9953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntityDecl:
9963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf:  An XML buffer.
9973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent:  An entity table
9983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
9993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition
10003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
10013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
10023473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) {
1003ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if ((buf == NULL) || (ent == NULL)) return;
10043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    switch (ent->etype) {
10053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_INTERNAL_GENERAL_ENTITY:
10063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
10073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, " ");
10093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->orig != NULL)
10103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteQuotedString(buf, ent->orig);
10113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    else
101218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlDumpEntityContent(buf, ent->content);
10133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
10163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
10173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
10193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
10203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
10213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
10223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
10243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
10253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
10273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
10303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
10313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
10333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
10343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
10353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
10363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
10383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
10393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
10413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->content != NULL) { /* Should be true ! */
10423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteChar(buf, " NDATA ");
10433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if (ent->orig != NULL)
10443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xmlBufferWriteCHAR(buf, ent->orig);
10453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		else
10463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xmlBufferWriteCHAR(buf, ent->content);
10473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
10483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_INTERNAL_PARAMETER_ENTITY:
10513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY % ");
10523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, " ");
10543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->orig == NULL)
105518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlDumpEntityContent(buf, ent->content);
10563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    else
10573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteQuotedString(buf, ent->orig);
10583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_PARAMETER_ENTITY:
10613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY % ");
10623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
10633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
10643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
10653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
10663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
10673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
10693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
10703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
10713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
10723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
10733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
10743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	default:
1075ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	    xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY,
1076ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		"xmlDumpEntitiesDecl: internal: unknown type entity type");
10773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
10783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
10793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
10803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
10819e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * xmlDumpEntityDeclScan:
10829e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @ent:  An entity table
10839e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @buf:  An XML buffer.
10849e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack *
10859e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * When using the hash table scan function, arguments need to be reversed
10869e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack */
10879e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brackstatic void
10889e66059f08301b933a74bd78f09bdf80ada9d4c4William M. BrackxmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) {
10899e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack    xmlDumpEntityDecl(buf, ent);
10909e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack}
1091f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
10929e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack/**
10933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntitiesTable:
10943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf:  An XML buffer.
10953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
10963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
10973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition
10983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
10993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
11003473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) {
11019e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack    xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf);
11023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
1103a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
11045d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_entities
11055d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
1106