entities.c revision f4f4e4853a925905deb77a72a3311ab683fbeeb5
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",
31d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel 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",
38d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel 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",
45d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel 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",
52d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel 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",
59d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel 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/*
1423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddEntity : register a new entity for an entities table.
1433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
1443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorstatic xmlEntityPtr
1453473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type,
1463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	  const xmlChar *ExternalID, const xmlChar *SystemID,
1473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	  const xmlChar *content) {
1487da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    xmlDictPtr dict = NULL;
1493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table = NULL;
1503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
1513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (name == NULL)
1533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
1547da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (dtd == NULL)
1557da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	return(NULL);
1567da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (dtd->doc != NULL)
1577da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        dict = dtd->doc->dict;
1587da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard
1593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    switch (type) {
1603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        case XML_INTERNAL_GENERAL_ENTITY:
1613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
1623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
1633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (dtd->entities == NULL)
164316a5c398919cc1503c59130f7aed14a1111cab7Daniel Veillard		dtd->entities = xmlHashCreateDict(0, dict);
1653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    table = dtd->entities;
1663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
1673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        case XML_INTERNAL_PARAMETER_ENTITY:
1683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        case XML_EXTERNAL_PARAMETER_ENTITY:
1693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (dtd->pentities == NULL)
170316a5c398919cc1503c59130f7aed14a1111cab7Daniel Veillard		dtd->pentities = xmlHashCreateDict(0, dict);
1713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    table = dtd->pentities;
1723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
1733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        case XML_INTERNAL_PREDEFINED_ENTITY:
174d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    return(NULL);
1753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
1763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (table == NULL)
1773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
1783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
1793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) {
180ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlAddEntity:: malloc failed");
1813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
1823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
1833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    memset(ret, 0, sizeof(xmlEntity));
1843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->type = XML_ENTITY_DECL;
185a37a6ad91a61d168ecc4b29263def3363fff4da6Daniel Veillard    ret->checked = 0;
1863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
1883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * fill the structure.
1893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
1903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->etype = (xmlEntityType) type;
1917da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (dict == NULL) {
1927da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	ret->name = xmlStrdup(name);
1937da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (ExternalID != NULL)
1947da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->ExternalID = xmlStrdup(ExternalID);
1957da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (SystemID != NULL)
1967da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->SystemID = xmlStrdup(SystemID);
1977da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    } else {
1987da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        ret->name = xmlDictLookup(dict, name, -1);
1997da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (ExternalID != NULL)
2007da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->ExternalID = xmlDictLookup(dict, ExternalID, -1);
2017da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (SystemID != NULL)
2027da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->SystemID = xmlDictLookup(dict, SystemID, -1);
2037da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    }
2043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (content != NULL) {
2053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->length = xmlStrlen(content);
2067da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if ((dict != NULL) && (ret->length < 5))
2077da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->content = (xmlChar *)
2087da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	                   xmlDictLookup(dict, content, ret->length);
2097da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	else
2107da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->content = xmlStrndup(content, ret->length);
2113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     } else {
2123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->length = 0;
2133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->content = NULL;
2143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->URI = NULL; /* to be computed by the layer knowing
2163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor			the defining entity */
2173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->orig = NULL;
2182d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    ret->owner = 0;
2197da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    ret->doc = dtd->doc;
2203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (xmlHashAddEntry(table, name, ret)) {
2223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
2233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * entity was already defined at another level.
2243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
2253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        xmlFreeEntity(ret);
2263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
2273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
2293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
2303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
2323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetPredefinedEntity:
2333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
2343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Check whether this name is an predefined entity.
2363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
237cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Returns NULL if not, otherwise the entity
2383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
2393473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
2403473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetPredefinedEntity(const xmlChar *name) {
241d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    if (name == NULL) return(NULL);
242d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    switch (name[0]) {
243d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'l':
244d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "lt"))
245d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityLt);
246d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
247d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'g':
248d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "gt"))
249d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityGt);
250d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
251d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'a':
252d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "amp"))
253d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityAmp);
254d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "apos"))
255d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityApos);
256d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
257d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'q':
258d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "quot"))
259d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityQuot);
260d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
261d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	default:
262d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
263d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    }
264d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    return(NULL);
2653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
2663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
2683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDtdEntity:
2693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document
2703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
2713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type:  the entity type XML_xxx_yyy_ENTITY
2723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID:  the entity external ID if available
2733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID:  the entity system ID if available
2743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content:  the entity content
2753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document DTD external subset.
2773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error
2793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
2803473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
2813473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type,
2823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *ExternalID, const xmlChar *SystemID,
2833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		const xmlChar *content) {
2843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
2853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlDtdPtr dtd;
2863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc == NULL) {
288ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DOC,
289ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDtdEntity: document is NULL");
2903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
2913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc->extSubset == NULL) {
293ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DTD,
294ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDtdEntity: document without external subset");
2953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
2963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    dtd = doc->extSubset;
2983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
2993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) return(NULL);
3003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
302cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard     * Link it to the DTD
3033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
3043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->parent = dtd;
3053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->doc = dtd->doc;
3063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (dtd->last == NULL) {
3073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->children = dtd->last = (xmlNodePtr) ret;
3083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    } else {
3093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        dtd->last->next = (xmlNodePtr) ret;
3103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret->prev = dtd->last;
3113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last = (xmlNodePtr) ret;
3123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
3143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
3173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDocEntity:
3183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document
3193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
3203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type:  the entity type XML_xxx_yyy_ENTITY
3213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID:  the entity external ID if available
3223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID:  the entity system ID if available
3233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content:  the entity content
3243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document.
3263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error
3283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
3293473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
3303473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type,
3313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *ExternalID, const xmlChar *SystemID,
3323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *content) {
3333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
3343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlDtdPtr dtd;
3353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc == NULL) {
337ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DOC,
338ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDocEntity: document is NULL");
3393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc->intSubset == NULL) {
342ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DTD,
343ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDocEntity: document without internal subset");
3443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    dtd = doc->intSubset;
3473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
3483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) return(NULL);
3493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
351cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard     * Link it to the DTD
3523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
3533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->parent = dtd;
3543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->doc = dtd->doc;
3553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (dtd->last == NULL) {
3563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->children = dtd->last = (xmlNodePtr) ret;
3573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    } else {
3583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last->next = (xmlNodePtr) ret;
3593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret->prev = dtd->last;
3603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last = (xmlNodePtr) ret;
3613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
3633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
3663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetEntityFromTable:
3673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  an entity table
3683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
3693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @parameter:  look for parameter entities
3703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the table.
3723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found.
3733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
3753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
37656a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr
3773473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) {
3783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return((xmlEntityPtr) xmlHashLookup(table, name));
3793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
3823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetParameterEntity:
3833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
3843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
3853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the internal and external subsets and
3873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found.
3883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
3903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
3913473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
3923473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) {
3933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
3943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
3953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3963606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard    if (doc == NULL)
3973606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard	return(NULL);
3983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) {
3993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->intSubset->pentities;
4003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret = xmlGetEntityFromTable(table, name);
4013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (ret != NULL)
4023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    return(ret);
4033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) {
4053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->extSubset->pentities;
4063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(xmlGetEntityFromTable(table, name));
4073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(NULL);
4093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDtdEntity:
4133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
416cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Do an entity lookup in the DTD entity hash table and
4173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding entity, if found.
4183606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard * Note: the first argument is the document node, not the DTD node.
4193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4223473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
4233473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) {
4243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
4253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4263606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard    if (doc == NULL)
4273606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard	return(NULL);
4283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
4293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->extSubset->entities;
4303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(xmlGetEntityFromTable(table, name));
4313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(NULL);
4333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDocEntity:
4373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the document entity hash table and
441cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * returns the corresponding entity, otherwise a lookup is done
4423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * in the predefined entities too.
4433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4463473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
4473473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) {
4483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr cur;
4493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
4503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc != NULL) {
4523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
4533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    table = (xmlEntitiesTablePtr) doc->intSubset->entities;
4543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    cur = xmlGetEntityFromTable(table, name);
4553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (cur != NULL)
4563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		return(cur);
4573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
4582875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	if (doc->standalone != 1) {
4592875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	    if ((doc->extSubset != NULL) &&
4602875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		(doc->extSubset->entities != NULL)) {
4612875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		table = (xmlEntitiesTablePtr) doc->extSubset->entities;
4622875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		cur = xmlGetEntityFromTable(table, name);
4632875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		if (cur != NULL)
4642875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		    return(cur);
4652875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	    }
4663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
4673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
468d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    return(xmlGetPredefinedEntity(name));
4693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
4723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Macro used to grow the current buffer.
4733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#define growBufferReentrant() {						\
4753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size *= 2;							\
4763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *)						\
4773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    		xmlRealloc(buffer, buffer_size * sizeof(xmlChar));	\
4783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {						\
479ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlEncodeEntitiesReentrant: realloc failed");\
4803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);							\
4813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }									\
4823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlEncodeEntitiesReentrant:
4873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document containing the string
4883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input:  A string to convert to XML.
4893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities
4913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * and non ASCII values with their entities and CharRef counterparts.
4923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Contrary to xmlEncodeEntities, this routine is reentrant, and result
4933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * must be deallocated.
4943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done.
4963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4973473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlChar *
4983473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) {
4993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    const xmlChar *cur = input;
5003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *buffer = NULL;
5013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *out = NULL;
5023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    int buffer_size = 0;
5033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    int html = 0;
5043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (input == NULL) return(NULL);
5063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc != NULL)
5073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        html = (doc->type == XML_HTML_DOCUMENT_NODE);
5083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
5103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * allocate an translation buffer.
5113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
5123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size = 1000;
5133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
5143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {
515ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlEncodeEntitiesReentrant: malloc failed");
5163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
5173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
5183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    out = buffer;
5193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    while (*cur != '\0') {
5213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        if (out - buffer > buffer_size - 100) {
52256a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    int indx = out - buffer;
5233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    growBufferReentrant();
52556a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    out = &buffer[indx];
5263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
5273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
5293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * By default one have to encode at least '<', '>', '"' and '&' !
5303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
5313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (*cur == '<') {
5323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
5333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'l';
5343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
5353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
5363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '>') {
5373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
5383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'g';
5393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
5403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
5413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '&') {
5423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
5433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'a';
5443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'm';
5453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'p';
5463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
5473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (((*cur >= 0x20) && (*cur < 0x80)) ||
5480046c0fec2aa505a963d44de9621b6c92ccdc9e9Daniel Veillard	    (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) {
5493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    /*
5503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * default case, just copy !
5513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     */
5523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = *cur;
5533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur >= 0x80) {
554122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard	    if (((doc != NULL) && (doc->encoding != NULL)) || (html)) {
5553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
5563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * Bj�rn Reese <br@sseusa.com> provided the patch
5573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        xmlChar xc;
5583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        xc = (*cur & 0x3F) << 6;
5593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        if (cur[1] != 0) {
5603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xc += *(++cur) & 0x3F;
5613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    *out++ = xc;
5623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        } else
5633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
5642728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard		*out++ = *cur;
5653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
5663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
5673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * We assume we have UTF-8 input.
5683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
569b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard		char buf[11], *ptr;
5703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		int val = 0, l = 1;
5713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if (*cur < 0xC0) {
573ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		    xmlEntitiesErr(XML_CHECK_NOT_UTF8,
574ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard			    "xmlEncodeEntitiesReentrant : input not UTF-8");
575122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard		    if (doc != NULL)
576122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard			doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
5773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    snprintf(buf, sizeof(buf), "&#%d;", *cur);
5783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    buf[sizeof(buf) - 1] = 0;
5793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    ptr = buf;
5803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    while (*ptr != 0) *out++ = *ptr++;
58105c13a20b9ac8153adb9158359e2aa09bfe965d0Daniel Veillard		    cur++;
5823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    continue;
5833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xE0) {
5843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x1F;
5853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
5863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
5873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 2;
5883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xF0) {
5893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x0F;
5903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
5913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
5923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
5933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[2]) & 0x3F;
5943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 3;
5953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xF8) {
5963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x07;
5973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
5983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
5993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[2]) & 0x3F;
6013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[3]) & 0x3F;
6033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 4;
6043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		}
6053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if ((l == 1) || (!IS_CHAR(val))) {
606ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		    xmlEntitiesErr(XML_ERR_INVALID_CHAR,
6073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor			"xmlEncodeEntitiesReentrant : char out of range\n");
608122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard		    if (doc != NULL)
609122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard			doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
6103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    snprintf(buf, sizeof(buf), "&#%d;", *cur);
6113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    buf[sizeof(buf) - 1] = 0;
6123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    ptr = buf;
6133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    while (*ptr != 0) *out++ = *ptr++;
6143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    cur++;
6153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    continue;
6163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		}
6173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
6183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * We could do multiple things here. Just save as a char ref
6193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
6202728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard		snprintf(buf, sizeof(buf), "&#x%X;", val);
6213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		buf[sizeof(buf) - 1] = 0;
6223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		ptr = buf;
6233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		while (*ptr != 0) *out++ = *ptr++;
6243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		cur += l;
6253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		continue;
6263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
62776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BYTE_CHAR(*cur)) {
628b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard	    char buf[11], *ptr;
6293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    snprintf(buf, sizeof(buf), "&#%d;", *cur);
6313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    buf[sizeof(buf) - 1] = 0;
6323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor            ptr = buf;
6333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    while (*ptr != 0) *out++ = *ptr++;
6343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
6353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur++;
6363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
6373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    *out++ = 0;
6383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(buffer);
6393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
6403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
6423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlEncodeSpecialChars:
6433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document containing the string
6443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input:  A string to convert to XML.
6453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
6463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities
6473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * this routine is reentrant, and result must be deallocated.
6483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
6493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done.
6503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
6513473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlChar *
6529ee35f36437073d952bc88fd64cf1618aad27c7bDaniel VeillardxmlEncodeSpecialChars(xmlDocPtr doc ATTRIBUTE_UNUSED, const xmlChar *input) {
6533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    const xmlChar *cur = input;
6543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *buffer = NULL;
6553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *out = NULL;
6563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    int buffer_size = 0;
657899e64aa2fa3b7796cff6901ef9aafe84215f8b2William M. Brack    if (input == NULL) return(NULL);
6583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
6603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * allocate an translation buffer.
6613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
6623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size = 1000;
6633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
6643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {
665ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed");
6663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
6673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
6683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    out = buffer;
6693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    while (*cur != '\0') {
6713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        if (out - buffer > buffer_size - 10) {
67256a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    int indx = out - buffer;
6733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    growBufferReentrant();
67556a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    out = &buffer[indx];
6763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
6773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
6793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * By default one have to encode at least '<', '>', '"' and '&' !
6803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
6813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (*cur == '<') {
6823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'l';
6843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
6853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '>') {
6873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'g';
6893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
6903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '&') {
6923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'a';
6943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'm';
6953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'p';
6963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '"') {
6983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'q';
7003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'u';
7013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'o';
7023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
7033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
70419ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	} else if (*cur == '\r') {
70519ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '&';
70619ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '#';
70719ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '1';
70819ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '3';
70919ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = ';';
7103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else {
7113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    /*
7123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * Works because on UTF-8, all extended sequences cannot
7133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * result in bytes in the ASCII range.
7143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     */
7153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = *cur;
7163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
7173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur++;
7183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
7193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    *out++ = 0;
7203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(buffer);
7213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
7243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCreateEntitiesTable:
7253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * create and initialize an empty entities hash table.
727316a5c398919cc1503c59130f7aed14a1111cab7Daniel Veillard * This really doesn't make sense and should be deprecated
7283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the xmlEntitiesTablePtr just created or NULL in case of error.
7303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
7313473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr
7323473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCreateEntitiesTable(void) {
7333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return((xmlEntitiesTablePtr) xmlHashCreate(0));
7343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
7372d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * xmlFreeEntityWrapper:
7382d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @entity:  An entity
7392d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @name:  its name
7402d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard *
7412d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * Deallocate the memory used by an entities in the hash table.
7422d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard */
7432d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillardstatic void
7442d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel VeillardxmlFreeEntityWrapper(xmlEntityPtr entity,
7452d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard	               const xmlChar *name ATTRIBUTE_UNUSED) {
7462d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    if (entity != NULL)
7472d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard	xmlFreeEntity(entity);
7482d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard}
7492d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard
7502d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard/**
7513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlFreeEntitiesTable:
7523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
7533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Deallocate the memory used by an entities hash table.
7553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
7563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
7573473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlFreeEntitiesTable(xmlEntitiesTablePtr table) {
7582d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper);
7593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
761652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#ifdef LIBXML_TREE_ENABLED
7623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
7633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntity:
7643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent:  An entity
7653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity
7673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesPtr or NULL in case of error.
7693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
77056a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr
7713473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntity(xmlEntityPtr ent) {
7723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr cur;
7733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
7753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (cur == NULL) {
776ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed");
7773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
7783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
7793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    memset(cur, 0, sizeof(xmlEntity));
780845cce4cf1930d2ab9953ac1a345c5d3bed1ed94Daniel Veillard    cur->type = XML_ENTITY_DECL;
7813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    cur->etype = ent->etype;
7833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->name != NULL)
7843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->name = xmlStrdup(ent->name);
7853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->ExternalID != NULL)
7863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->ExternalID = xmlStrdup(ent->ExternalID);
7873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->SystemID != NULL)
7883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->SystemID = xmlStrdup(ent->SystemID);
7893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->content != NULL)
7903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->content = xmlStrdup(ent->content);
7913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->orig != NULL)
7923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->orig = xmlStrdup(ent->orig);
7938ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard    if (ent->URI != NULL)
7948ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard	cur->URI = xmlStrdup(ent->URI);
7953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(cur);
7963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
7993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntitiesTable:
8003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
8013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity table.
8033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesTablePtr or NULL in case of error.
8053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
8063473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr
8073473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntitiesTable(xmlEntitiesTablePtr table) {
8083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity));
8093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
810652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#endif /* LIBXML_TREE_ENABLED */
8113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
812a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
81318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
81418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard/**
81518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * xmlDumpEntityContent:
81618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @buf:  An XML buffer.
81718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @content:  The entity content.
81818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard *
81918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * This will dump the quoted string value, taking care of the special
82018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * treatment required by %
82118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard */
82218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillardstatic void
82318ab8721ff3d009b64d23a372370fa997cdea682Daniel VeillardxmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) {
82418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return;
82518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    if (xmlStrchr(content, '%')) {
82618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard        const xmlChar * base, *cur;
82718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
82818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	xmlBufferCCat(buf, "\"");
82918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	base = cur = content;
83018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	while (*cur != 0) {
83118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    if (*cur == '"') {
83218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		if (base != cur)
83318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		    xmlBufferAdd(buf, base, cur - base);
83418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlBufferAdd(buf, BAD_CAST "&quot;", 6);
83518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
83618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		base = cur;
83718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    } else if (*cur == '%') {
83818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		if (base != cur)
83918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		    xmlBufferAdd(buf, base, cur - base);
84018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlBufferAdd(buf, BAD_CAST "&#x25;", 6);
84118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
84218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		base = cur;
84318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    } else {
84418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
84518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    }
84618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	}
84718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	if (base != cur)
84818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    xmlBufferAdd(buf, base, cur - base);
84918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	xmlBufferCCat(buf, "\"");
85018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    } else {
85118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard        xmlBufferWriteQuotedString(buf, content);
85218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    }
85318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard}
85418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
8553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
8563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntityDecl:
8573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf:  An XML buffer.
8583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent:  An entity table
8593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition
8613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
8623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
8633473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) {
864ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if ((buf == NULL) || (ent == NULL)) return;
8653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    switch (ent->etype) {
8663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_INTERNAL_GENERAL_ENTITY:
8673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
8683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
8693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, " ");
8703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->orig != NULL)
8713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteQuotedString(buf, ent->orig);
8723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    else
87318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlDumpEntityContent(buf, ent->content);
8743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
8753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
8763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
8773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
8783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
8793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
8803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
8813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
8823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
8833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
8843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
8853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
8863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
8873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
8883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
8893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
8903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
8913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
8923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
8933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
8943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
8953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
8963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
8973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
8983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
8993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
9003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
9013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
9023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->content != NULL) { /* Should be true ! */
9033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteChar(buf, " NDATA ");
9043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if (ent->orig != NULL)
9053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xmlBufferWriteCHAR(buf, ent->orig);
9063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		else
9073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xmlBufferWriteCHAR(buf, ent->content);
9083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
9093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
9103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
9113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_INTERNAL_PARAMETER_ENTITY:
9123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY % ");
9133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
9143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, " ");
9153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->orig == NULL)
91618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlDumpEntityContent(buf, ent->content);
9173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    else
9183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteQuotedString(buf, ent->orig);
9193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
9203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
9213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_PARAMETER_ENTITY:
9223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY % ");
9233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
9243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
9253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
9263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
9273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
9283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
9293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
9303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
9313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
9323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
9333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
9343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
9353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	default:
936ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	    xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY,
937ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		"xmlDumpEntitiesDecl: internal: unknown type entity type");
9383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
9393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
9403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
9413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
9429e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * xmlDumpEntityDeclScan:
9439e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @ent:  An entity table
9449e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @buf:  An XML buffer.
9459e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack *
9469e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * When using the hash table scan function, arguments need to be reversed
9479e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack */
9489e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brackstatic void
9499e66059f08301b933a74bd78f09bdf80ada9d4c4William M. BrackxmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) {
9509e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack    xmlDumpEntityDecl(buf, ent);
9519e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack}
9529e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack
9539e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack/**
9543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntitiesTable:
9553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf:  An XML buffer.
9563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
9573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
9583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition
9593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
9603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
9613473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) {
9629e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack    xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf);
9633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
964a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
9655d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_entities
9665d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
967