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