entities.c revision 316a5c398919cc1503c59130f7aed14a1111cab7
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,
34d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, NULL, NULL, NULL, 0
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,
41d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, NULL, NULL, NULL, 0
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,
48d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, NULL, NULL, NULL, 0
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,
55d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, NULL, NULL, NULL, 0
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,
62d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    NULL, NULL, NULL, NULL, 0
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;
1853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
1863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
1873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * fill the structure.
1883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
1893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->etype = (xmlEntityType) type;
1907da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    if (dict == NULL) {
1917da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	ret->name = xmlStrdup(name);
1927da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (ExternalID != NULL)
1937da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->ExternalID = xmlStrdup(ExternalID);
1947da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (SystemID != NULL)
1957da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->SystemID = xmlStrdup(SystemID);
1967da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    } else {
1977da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard        ret->name = xmlDictLookup(dict, name, -1);
1987da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (ExternalID != NULL)
1997da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->ExternalID = xmlDictLookup(dict, ExternalID, -1);
2007da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if (SystemID != NULL)
2017da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->SystemID = xmlDictLookup(dict, SystemID, -1);
2027da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    }
2033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (content != NULL) {
2043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->length = xmlStrlen(content);
2057da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	if ((dict != NULL) && (ret->length < 5))
2067da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->content = (xmlChar *)
2077da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	                   xmlDictLookup(dict, content, ret->length);
2087da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	else
2097da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard	    ret->content = xmlStrndup(content, ret->length);
2103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     } else {
2113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->length = 0;
2123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        ret->content = NULL;
2133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->URI = NULL; /* to be computed by the layer knowing
2153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor			the defining entity */
2163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->orig = NULL;
2172d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    ret->owner = 0;
2187da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard    ret->doc = dtd->doc;
2193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (xmlHashAddEntry(table, name, ret)) {
2213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
2223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * entity was already defined at another level.
2233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
2243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        xmlFreeEntity(ret);
2253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
2263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
2283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
2293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
2313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetPredefinedEntity:
2323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
2333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Check whether this name is an predefined entity.
2353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
236cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Returns NULL if not, otherwise the entity
2373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
2383473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
2393473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetPredefinedEntity(const xmlChar *name) {
240d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    if (name == NULL) return(NULL);
241d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    switch (name[0]) {
242d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'l':
243d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "lt"))
244d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityLt);
245d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
246d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'g':
247d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "gt"))
248d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityGt);
249d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
250d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'a':
251d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "amp"))
252d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityAmp);
253d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "apos"))
254d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityApos);
255d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
256d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard        case 'q':
257d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    if (xmlStrEqual(name, BAD_CAST "quot"))
258d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	        return(&xmlEntityQuot);
259d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
260d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	default:
261d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard	    break;
262d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    }
263d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    return(NULL);
2643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
2653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
2673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDtdEntity:
2683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document
2693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
2703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type:  the entity type XML_xxx_yyy_ENTITY
2713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID:  the entity external ID if available
2723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID:  the entity system ID if available
2733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content:  the entity content
2743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document DTD external subset.
2763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
2773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error
2783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
2793473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
2803473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type,
2813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *ExternalID, const xmlChar *SystemID,
2823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		const xmlChar *content) {
2833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
2843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlDtdPtr dtd;
2853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
2863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc == NULL) {
287ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DOC,
288ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDtdEntity: document is NULL");
2893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
2903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc->extSubset == NULL) {
292ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DTD,
293ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDtdEntity: document without external subset");
2943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
2953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
2963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    dtd = doc->extSubset;
2973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
2983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) return(NULL);
2993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
301cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard     * Link it to the DTD
3023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
3033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->parent = dtd;
3043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->doc = dtd->doc;
3053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (dtd->last == NULL) {
3063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->children = dtd->last = (xmlNodePtr) ret;
3073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    } else {
3083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        dtd->last->next = (xmlNodePtr) ret;
3093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret->prev = dtd->last;
3103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last = (xmlNodePtr) ret;
3113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
3133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
3163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDocEntity:
3173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document
3183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
3193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type:  the entity type XML_xxx_yyy_ENTITY
3203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID:  the entity external ID if available
3213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID:  the entity system ID if available
3223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content:  the entity content
3233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document.
3253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error
3273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
3283473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
3293473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type,
3303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *ExternalID, const xmlChar *SystemID,
3313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        const xmlChar *content) {
3323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
3333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlDtdPtr dtd;
3343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc == NULL) {
336ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DOC,
337ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDocEntity: document is NULL");
3383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc->intSubset == NULL) {
341ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	xmlEntitiesErr(XML_DTD_NO_DTD,
342ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	        "xmlAddDocEntity: document without internal subset");
3433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
3443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    dtd = doc->intSubset;
3463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);
3473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ret == NULL) return(NULL);
3483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
350cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard     * Link it to the DTD
3513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
3523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->parent = dtd;
3533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    ret->doc = dtd->doc;
3543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (dtd->last == NULL) {
3553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->children = dtd->last = (xmlNodePtr) ret;
3563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    } else {
3573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last->next = (xmlNodePtr) ret;
3583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret->prev = dtd->last;
3593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	dtd->last = (xmlNodePtr) ret;
3603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
3613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(ret);
3623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
3653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetEntityFromTable:
3663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  an entity table
3673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
3683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @parameter:  look for parameter entities
3693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the table.
3713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found.
3723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
3743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
37556a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr
3763473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) {
3773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return((xmlEntityPtr) xmlHashLookup(table, name));
3783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
3793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
3813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetParameterEntity:
3823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
3833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
3843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the internal and external subsets and
3863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found.
3873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
3883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
3893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
3903473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
3913473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) {
3923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
3933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr ret;
3943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
3953606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard    if (doc == NULL)
3963606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard	return(NULL);
3973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) {
3983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->intSubset->pentities;
3993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	ret = xmlGetEntityFromTable(table, name);
4003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (ret != NULL)
4013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    return(ret);
4023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) {
4043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->extSubset->pentities;
4053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(xmlGetEntityFromTable(table, name));
4063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(NULL);
4083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDtdEntity:
4123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
415cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Do an entity lookup in the DTD entity hash table and
4163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding entity, if found.
4173606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard * Note: the first argument is the document node, not the DTD node.
4183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4213473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
4223473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) {
4233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
4243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4253606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard    if (doc == NULL)
4263606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard	return(NULL);
4273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
4283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	table = (xmlEntitiesTablePtr) doc->extSubset->entities;
4293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(xmlGetEntityFromTable(table, name));
4303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
4313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(NULL);
4323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDocEntity:
4363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document referencing the entity
4373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name:  the entity name
4383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the document entity hash table and
440cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * returns the corresponding entity, otherwise a lookup is done
4413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * in the predefined entities too.
4423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found.
4443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4453473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr
4463473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) {
4473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr cur;
4483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntitiesTablePtr table;
4493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc != NULL) {
4513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
4523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    table = (xmlEntitiesTablePtr) doc->intSubset->entities;
4533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    cur = xmlGetEntityFromTable(table, name);
4543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (cur != NULL)
4553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		return(cur);
4563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
4572875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	if (doc->standalone != 1) {
4582875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	    if ((doc->extSubset != NULL) &&
4592875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		(doc->extSubset->entities != NULL)) {
4602875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		table = (xmlEntitiesTablePtr) doc->extSubset->entities;
4612875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		cur = xmlGetEntityFromTable(table, name);
4622875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		if (cur != NULL)
4632875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard		    return(cur);
4642875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard	    }
4653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
4663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
467d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard    return(xmlGetPredefinedEntity(name));
4683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/*
4713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Macro used to grow the current buffer.
4723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#define growBufferReentrant() {						\
4743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size *= 2;							\
4753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *)						\
4763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    		xmlRealloc(buffer, buffer_size * sizeof(xmlChar));	\
4773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {						\
478ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlEncodeEntitiesReentrant: realloc failed");\
4793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);							\
4803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }									\
4813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
4823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
4843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
4853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlEncodeEntitiesReentrant:
4863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document containing the string
4873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input:  A string to convert to XML.
4883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities
4903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * and non ASCII values with their entities and CharRef counterparts.
4913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Contrary to xmlEncodeEntities, this routine is reentrant, and result
4923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * must be deallocated.
4933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
4943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done.
4953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
4963473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlChar *
4973473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) {
4983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    const xmlChar *cur = input;
4993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *buffer = NULL;
5003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *out = NULL;
5013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    int buffer_size = 0;
5023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    int html = 0;
5033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (input == NULL) return(NULL);
5053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (doc != NULL)
5063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        html = (doc->type == XML_HTML_DOCUMENT_NODE);
5073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
5093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * allocate an translation buffer.
5103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
5113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size = 1000;
5123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
5133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {
514ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlEncodeEntitiesReentrant: malloc failed");
5153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
5163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
5173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    out = buffer;
5183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    while (*cur != '\0') {
5203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        if (out - buffer > buffer_size - 100) {
52156a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    int indx = out - buffer;
5223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    growBufferReentrant();
52456a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    out = &buffer[indx];
5253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
5263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
5283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * By default one have to encode at least '<', '>', '"' and '&' !
5293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
5303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (*cur == '<') {
5313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
5323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'l';
5333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
5343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
5353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '>') {
5363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
5373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'g';
5383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
5393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
5403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '&') {
5413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
5423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'a';
5433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'm';
5443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'p';
5453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
5463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (((*cur >= 0x20) && (*cur < 0x80)) ||
5470046c0fec2aa505a963d44de9621b6c92ccdc9e9Daniel Veillard	    (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) {
5483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    /*
5493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * default case, just copy !
5503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     */
5513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = *cur;
5523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur >= 0x80) {
553122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard	    if (((doc != NULL) && (doc->encoding != NULL)) || (html)) {
5543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
5553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * Bj�rn Reese <br@sseusa.com> provided the patch
5563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        xmlChar xc;
5573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        xc = (*cur & 0x3F) << 6;
5583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        if (cur[1] != 0) {
5593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xc += *(++cur) & 0x3F;
5603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    *out++ = xc;
5613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	        } else
5623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
5633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    *out++ = *cur;
5643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
5653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
5663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * We assume we have UTF-8 input.
5673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
568b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard		char buf[11], *ptr;
5693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		int val = 0, l = 1;
5703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
5713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if (*cur < 0xC0) {
572ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		    xmlEntitiesErr(XML_CHECK_NOT_UTF8,
573ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard			    "xmlEncodeEntitiesReentrant : input not UTF-8");
574122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard		    if (doc != NULL)
575122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard			doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
5763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    snprintf(buf, sizeof(buf), "&#%d;", *cur);
5773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    buf[sizeof(buf) - 1] = 0;
5783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    ptr = buf;
5793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    while (*ptr != 0) *out++ = *ptr++;
58005c13a20b9ac8153adb9158359e2aa09bfe965d0Daniel Veillard		    cur++;
5813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    continue;
5823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xE0) {
5833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x1F;
5843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
5853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
5863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 2;
5873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xF0) {
5883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x0F;
5893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
5903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
5913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
5923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[2]) & 0x3F;
5933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 3;
5943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		} else if (*cur < 0xF8) {
5953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor                    val = (cur[0]) & 0x07;
5963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
5973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[1]) & 0x3F;
5983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
5993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[2]) & 0x3F;
6003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val <<= 6;
6013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    val |= (cur[3]) & 0x3F;
6023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    l = 4;
6033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		}
6043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if ((l == 1) || (!IS_CHAR(val))) {
605ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		    xmlEntitiesErr(XML_ERR_INVALID_CHAR,
6063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor			"xmlEncodeEntitiesReentrant : char out of range\n");
607122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard		    if (doc != NULL)
608122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard			doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
6093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    snprintf(buf, sizeof(buf), "&#%d;", *cur);
6103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    buf[sizeof(buf) - 1] = 0;
6113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    ptr = buf;
6123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    while (*ptr != 0) *out++ = *ptr++;
6133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    cur++;
6143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    continue;
6153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		}
6163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		/*
6173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 * We could do multiple things here. Just save as a char ref
6183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 */
619166982816ee63ec70e8bdcabcdf337b1fe9e1e80Daniel Veillard		if (html)
620166982816ee63ec70e8bdcabcdf337b1fe9e1e80Daniel Veillard		    snprintf(buf, sizeof(buf), "&#%d;", val);
621166982816ee63ec70e8bdcabcdf337b1fe9e1e80Daniel Veillard		else
622166982816ee63ec70e8bdcabcdf337b1fe9e1e80Daniel Veillard		    snprintf(buf, sizeof(buf), "&#x%X;", val);
6233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		buf[sizeof(buf) - 1] = 0;
6243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		ptr = buf;
6253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		while (*ptr != 0) *out++ = *ptr++;
6263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		cur += l;
6273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		continue;
6283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
62976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BYTE_CHAR(*cur)) {
630b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard	    char buf[11], *ptr;
6313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    snprintf(buf, sizeof(buf), "&#%d;", *cur);
6333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    buf[sizeof(buf) - 1] = 0;
6343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor            ptr = buf;
6353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    while (*ptr != 0) *out++ = *ptr++;
6363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
6373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur++;
6383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
6393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    *out++ = 0;
6403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(buffer);
6413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
6423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
6443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlEncodeSpecialChars:
6453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc:  the document containing the string
6463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input:  A string to convert to XML.
6473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
6483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities
6493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * this routine is reentrant, and result must be deallocated.
6503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
6513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done.
6523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
6533473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlChar *
6549ee35f36437073d952bc88fd64cf1618aad27c7bDaniel VeillardxmlEncodeSpecialChars(xmlDocPtr doc ATTRIBUTE_UNUSED, const xmlChar *input) {
6553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    const xmlChar *cur = input;
6563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *buffer = NULL;
6573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlChar *out = NULL;
6583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    int buffer_size = 0;
659899e64aa2fa3b7796cff6901ef9aafe84215f8b2William M. Brack    if (input == NULL) return(NULL);
6603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    /*
6623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     * allocate an translation buffer.
6633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor     */
6643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer_size = 1000;
6653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar));
6663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (buffer == NULL) {
667ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed");
6683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
6693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
6703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    out = buffer;
6713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    while (*cur != '\0') {
6733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor        if (out - buffer > buffer_size - 10) {
67456a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    int indx = out - buffer;
6753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    growBufferReentrant();
67756a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard	    out = &buffer[indx];
6783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
6793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
6803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	/*
6813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 * By default one have to encode at least '<', '>', '"' and '&' !
6823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	 */
6833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	if (*cur == '<') {
6843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'l';
6863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
6873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '>') {
6893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'g';
6913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
6923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '&') {
6943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
6953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'a';
6963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'm';
6973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'p';
6983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
6993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else if (*cur == '"') {
7003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = '&';
7013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'q';
7023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'u';
7033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 'o';
7043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = 't';
7053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = ';';
70619ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	} else if (*cur == '\r') {
70719ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '&';
70819ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '#';
70919ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '1';
71019ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = '3';
71119ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard	    *out++ = ';';
7123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	} else {
7133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    /*
7143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * Works because on UTF-8, all extended sequences cannot
7153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     * result in bytes in the ASCII range.
7163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	     */
7173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    *out++ = *cur;
7183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	}
7193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur++;
7203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
7213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    *out++ = 0;
7223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(buffer);
7233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
7263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCreateEntitiesTable:
7273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * create and initialize an empty entities hash table.
729316a5c398919cc1503c59130f7aed14a1111cab7Daniel Veillard * This really doesn't make sense and should be deprecated
7303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the xmlEntitiesTablePtr just created or NULL in case of error.
7323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
7333473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr
7343473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCreateEntitiesTable(void) {
7353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return((xmlEntitiesTablePtr) xmlHashCreate(0));
7363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
7392d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * xmlFreeEntityWrapper:
7402d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @entity:  An entity
7412d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @name:  its name
7422d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard *
7432d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * Deallocate the memory used by an entities in the hash table.
7442d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard */
7452d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillardstatic void
7462d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel VeillardxmlFreeEntityWrapper(xmlEntityPtr entity,
7472d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard	               const xmlChar *name ATTRIBUTE_UNUSED) {
7482d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    if (entity != NULL)
7492d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard	xmlFreeEntity(entity);
7502d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard}
7512d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard
7522d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard/**
7533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlFreeEntitiesTable:
7543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
7553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Deallocate the memory used by an entities hash table.
7573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
7583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
7593473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlFreeEntitiesTable(xmlEntitiesTablePtr table) {
7602d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard    xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper);
7613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
763652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#ifdef LIBXML_TREE_ENABLED
7643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
7653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntity:
7663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent:  An entity
7673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity
7693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
7703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesPtr or NULL in case of error.
7713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
77256a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr
7733473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntity(xmlEntityPtr ent) {
7743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    xmlEntityPtr cur;
7753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
7773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (cur == NULL) {
778ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard        xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed");
7793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	return(NULL);
7803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
7813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    memset(cur, 0, sizeof(xmlEntity));
782845cce4cf1930d2ab9953ac1a345c5d3bed1ed94Daniel Veillard    cur->type = XML_ENTITY_DECL;
7833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
7843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    cur->etype = ent->etype;
7853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->name != NULL)
7863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->name = xmlStrdup(ent->name);
7873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->ExternalID != NULL)
7883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->ExternalID = xmlStrdup(ent->ExternalID);
7893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->SystemID != NULL)
7903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->SystemID = xmlStrdup(ent->SystemID);
7913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->content != NULL)
7923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->content = xmlStrdup(ent->content);
7933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    if (ent->orig != NULL)
7943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	cur->orig = xmlStrdup(ent->orig);
7958ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard    if (ent->URI != NULL)
7968ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard	cur->URI = xmlStrdup(ent->URI);
7973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(cur);
7983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
7993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
8003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
8013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntitiesTable:
8023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
8033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity table.
8053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesTablePtr or NULL in case of error.
8073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
8083473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr
8093473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntitiesTable(xmlEntitiesTablePtr table) {
8103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity));
8113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
812652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#endif /* LIBXML_TREE_ENABLED */
8133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
814a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
81518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
81618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard/**
81718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * xmlDumpEntityContent:
81818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @buf:  An XML buffer.
81918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @content:  The entity content.
82018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard *
82118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * This will dump the quoted string value, taking care of the special
82218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * treatment required by %
82318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard */
82418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillardstatic void
82518ab8721ff3d009b64d23a372370fa997cdea682Daniel VeillardxmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) {
82618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return;
82718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    if (xmlStrchr(content, '%')) {
82818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard        const xmlChar * base, *cur;
82918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
83018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	xmlBufferCCat(buf, "\"");
83118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	base = cur = content;
83218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	while (*cur != 0) {
83318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    if (*cur == '"') {
83418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		if (base != cur)
83518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		    xmlBufferAdd(buf, base, cur - base);
83618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlBufferAdd(buf, BAD_CAST "&quot;", 6);
83718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
83818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		base = cur;
83918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    } else if (*cur == '%') {
84018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		if (base != cur)
84118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		    xmlBufferAdd(buf, base, cur - base);
84218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlBufferAdd(buf, BAD_CAST "&#x25;", 6);
84318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
84418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		base = cur;
84518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    } else {
84618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		cur++;
84718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    }
84818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	}
84918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	if (base != cur)
85018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	    xmlBufferAdd(buf, base, cur - base);
85118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard	xmlBufferCCat(buf, "\"");
85218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    } else {
85318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard        xmlBufferWriteQuotedString(buf, content);
85418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard    }
85518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard}
85618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard
8573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
8583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntityDecl:
8593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf:  An XML buffer.
8603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent:  An entity table
8613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
8623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition
8633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
8643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
8653473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) {
866ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if ((buf == NULL) || (ent == NULL)) return;
8673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    switch (ent->etype) {
8683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_INTERNAL_GENERAL_ENTITY:
8693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
8703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
8713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, " ");
8723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->orig != NULL)
8733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteQuotedString(buf, ent->orig);
8743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    else
87518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlDumpEntityContent(buf, ent->content);
8763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
8773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
8783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
8793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
8803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
8813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
8823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
8833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
8843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
8853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
8863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
8873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
8883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
8893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
8903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
8913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
8923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
8933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY ");
8943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
8953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
8963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
8973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
8983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
8993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
9003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
9013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
9023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
9033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
9043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->content != NULL) { /* Should be true ! */
9053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteChar(buf, " NDATA ");
9063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		if (ent->orig != NULL)
9073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xmlBufferWriteCHAR(buf, ent->orig);
9083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		else
9093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		    xmlBufferWriteCHAR(buf, ent->content);
9103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
9113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
9123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
9133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_INTERNAL_PARAMETER_ENTITY:
9143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY % ");
9153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
9163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, " ");
9173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->orig == NULL)
91818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard		xmlDumpEntityContent(buf, ent->content);
9193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    else
9203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		xmlBufferWriteQuotedString(buf, ent->orig);
9213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
9223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
9233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	case XML_EXTERNAL_PARAMETER_ENTITY:
9243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, "<!ENTITY % ");
9253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteCHAR(buf, ent->name);
9263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    if (ent->ExternalID != NULL) {
9273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " PUBLIC ");
9283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->ExternalID);
9293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " ");
9303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
9313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    } else {
9323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteChar(buf, " SYSTEM ");
9333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor		 xmlBufferWriteQuotedString(buf, ent->SystemID);
9343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    }
9353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    xmlBufferWriteChar(buf, ">\n");
9363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	    break;
9373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor	default:
938ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard	    xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY,
939ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard		"xmlDumpEntitiesDecl: internal: unknown type entity type");
9403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor    }
9413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
9423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor
9433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/**
9449e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * xmlDumpEntityDeclScan:
9459e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @ent:  An entity table
9469e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @buf:  An XML buffer.
9479e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack *
9489e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * When using the hash table scan function, arguments need to be reversed
9499e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack */
9509e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brackstatic void
9519e66059f08301b933a74bd78f09bdf80ada9d4c4William M. BrackxmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) {
9529e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack    xmlDumpEntityDecl(buf, ent);
9539e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack}
9549e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack
9559e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack/**
9563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntitiesTable:
9573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf:  An XML buffer.
9583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table:  An entity table
9593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *
9603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition
9613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */
9623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid
9633473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) {
9649e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack    xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf);
9653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}
966a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
967