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 """, 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 "%", 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