entities.c revision f8e3db0445a1bc8cfe3f77326b07ec161482caa2
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", 31f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel 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", 38f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel 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", 45f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel 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", 52f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel 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", 59f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel 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/* 142aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlCreateEntity: 143aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * 144aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * internal routine doing the entity node strutures allocations 1453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 1463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorstatic xmlEntityPtr 147aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type, 148aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *ExternalID, const xmlChar *SystemID, 149aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *content) { 1503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr ret; 1513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 1523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); 1533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ret == NULL) { 154aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlEntitiesErrMemory("xmlCreateEntity: malloc failed"); 1553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 1563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 1573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor memset(ret, 0, sizeof(xmlEntity)); 1583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->type = XML_ENTITY_DECL; 159a37a6ad91a61d168ecc4b29263def3363fff4da6Daniel Veillard ret->checked = 0; 1603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 1613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 1623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * fill the structure. 1633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 1643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->etype = (xmlEntityType) type; 1657da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (dict == NULL) { 1667da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->name = xmlStrdup(name); 1677da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (ExternalID != NULL) 1687da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->ExternalID = xmlStrdup(ExternalID); 1697da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (SystemID != NULL) 1707da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->SystemID = xmlStrdup(SystemID); 1717da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard } else { 1727da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->name = xmlDictLookup(dict, name, -1); 1737da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (ExternalID != NULL) 1747da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->ExternalID = xmlDictLookup(dict, ExternalID, -1); 1757da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (SystemID != NULL) 1767da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->SystemID = xmlDictLookup(dict, SystemID, -1); 1777da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard } 1783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (content != NULL) { 1793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->length = xmlStrlen(content); 1807da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if ((dict != NULL) && (ret->length < 5)) 1817da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->content = (xmlChar *) 1827da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlDictLookup(dict, content, ret->length); 1837da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard else 1847da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->content = xmlStrndup(content, ret->length); 1853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 1863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->length = 0; 1873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->content = NULL; 1883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 1893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->URI = NULL; /* to be computed by the layer knowing 1903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor the defining entity */ 1913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->orig = NULL; 1922d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard ret->owner = 0; 193aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 194aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(ret); 195aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard} 196aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 197aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard/* 198aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlAddEntity : register a new entity for an entities table. 199aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard */ 200aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillardstatic xmlEntityPtr 201aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type, 202aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *ExternalID, const xmlChar *SystemID, 203aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *content) { 204aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlDictPtr dict = NULL; 205aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlEntitiesTablePtr table = NULL; 206aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlEntityPtr ret; 207aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 208aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (name == NULL) 209aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 210aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (dtd == NULL) 211aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 212aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (dtd->doc != NULL) 213aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dict = dtd->doc->dict; 214aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 215aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard switch (type) { 216aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_INTERNAL_GENERAL_ENTITY: 217aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 218aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 219aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (dtd->entities == NULL) 220aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dtd->entities = xmlHashCreateDict(0, dict); 221aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard table = dtd->entities; 222aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard break; 223aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_INTERNAL_PARAMETER_ENTITY: 224aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_EXTERNAL_PARAMETER_ENTITY: 225aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (dtd->pentities == NULL) 226aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dtd->pentities = xmlHashCreateDict(0, dict); 227aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard table = dtd->pentities; 228aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard break; 229aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_INTERNAL_PREDEFINED_ENTITY: 230aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 231aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard } 232aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (table == NULL) 233aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 234aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); 235aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (ret == NULL) 236aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 2377da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->doc = dtd->doc; 2383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 2393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (xmlHashAddEntry(table, name, ret)) { 2403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 2413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * entity was already defined at another level. 2423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 2433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlFreeEntity(ret); 2443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 2453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 2463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(ret); 2473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 2483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 2493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 2503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetPredefinedEntity: 2513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 2523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 2533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Check whether this name is an predefined entity. 2543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 255cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Returns NULL if not, otherwise the entity 2563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 2573473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 2583473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetPredefinedEntity(const xmlChar *name) { 259d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (name == NULL) return(NULL); 260d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard switch (name[0]) { 261d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard case 'l': 262d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "lt")) 263d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityLt); 264d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 265d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard case 'g': 266d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "gt")) 267d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityGt); 268d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 269d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard case 'a': 270d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "amp")) 271d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityAmp); 272d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "apos")) 273d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityApos); 274d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 275d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard case 'q': 276d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "quot")) 277d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityQuot); 278d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 279d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard default: 280d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 281d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard } 282d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(NULL); 2833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 2843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 2853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 2863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDtdEntity: 2873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document 2883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 2893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type: the entity type XML_xxx_yyy_ENTITY 2903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID: the entity external ID if available 2913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID: the entity system ID if available 2923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content: the entity content 2933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 2943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document DTD external subset. 2953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 2963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error 2973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 2983473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 2993473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type, 3003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *ExternalID, const xmlChar *SystemID, 3013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *content) { 3023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr ret; 3033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlDtdPtr dtd; 3043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc == NULL) { 306ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_NO_DOC, 307ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlAddDtdEntity: document is NULL"); 3083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 3093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc->extSubset == NULL) { 311ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_NO_DTD, 312ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlAddDtdEntity: document without external subset"); 3133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 3143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd = doc->extSubset; 3163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); 3173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ret == NULL) return(NULL); 3183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 320cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Link it to the DTD 3213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 3223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->parent = dtd; 3233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->doc = dtd->doc; 3243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (dtd->last == NULL) { 3253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->children = dtd->last = (xmlNodePtr) ret; 3263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 3273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->last->next = (xmlNodePtr) ret; 3283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->prev = dtd->last; 3293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->last = (xmlNodePtr) ret; 3303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(ret); 3323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 3333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 3353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDocEntity: 3363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document 3373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 3383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type: the entity type XML_xxx_yyy_ENTITY 3393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID: the entity external ID if available 3403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID: the entity system ID if available 3413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content: the entity content 3423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 3433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document. 3443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 3453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error 3463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 3473473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 3483473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type, 3493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *ExternalID, const xmlChar *SystemID, 3503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *content) { 3513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr ret; 3523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlDtdPtr dtd; 3533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc == NULL) { 355ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_NO_DOC, 356ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlAddDocEntity: document is NULL"); 3573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 3583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc->intSubset == NULL) { 360ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_NO_DTD, 361ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlAddDocEntity: document without internal subset"); 3623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 3633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd = doc->intSubset; 3653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); 3663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ret == NULL) return(NULL); 3673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 369cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Link it to the DTD 3703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 3713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->parent = dtd; 3723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->doc = dtd->doc; 3733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (dtd->last == NULL) { 3743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->children = dtd->last = (xmlNodePtr) ret; 3753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 3763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->last->next = (xmlNodePtr) ret; 3773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->prev = dtd->last; 3783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->last = (xmlNodePtr) ret; 3793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(ret); 3813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 3823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 384aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlNewEntity: 385aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @doc: the document 386aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @name: the entity name 387aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @type: the entity type XML_xxx_yyy_ENTITY 388aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @ExternalID: the entity external ID if available 389aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @SystemID: the entity system ID if available 390aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @content: the entity content 391aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * 392aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * Create a new entity, this differs from xmlAddDocEntity() that if 393aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * the document is NULL or has no internal subset defined, then an 394aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * unlinked entity structure will be returned, it is then the responsability 395aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * of the caller to link it to the document later or free it when not needed 396aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * anymore. 397aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * 398aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * Returns a pointer to the entity or NULL in case of error 399aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard */ 400aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlEntityPtr 401aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type, 402aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *ExternalID, const xmlChar *SystemID, 403aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *content) { 404aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlEntityPtr ret; 405aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlDictPtr dict; 406aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 407aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if ((doc != NULL) && (doc->intSubset != NULL)) { 408aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content)); 409aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard } 410aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (doc != NULL) 411aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dict = doc->dict; 412aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard else 413aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dict = NULL; 414aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); 415aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (ret == NULL) 416aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 417aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard ret->doc = doc; 418aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(ret); 419aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard} 420aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 421aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard/** 4223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetEntityFromTable: 4233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table: an entity table 4243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 4253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @parameter: look for parameter entities 4263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 4273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the table. 4283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found. 429f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 4303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found. 4313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 43256a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr 4333473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) { 4343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return((xmlEntityPtr) xmlHashLookup(table, name)); 4353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 4363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 4383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetParameterEntity: 4393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document referencing the entity 4403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 4413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 4423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the internal and external subsets and 4433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found. 444f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 4453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found. 4463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 4473473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 4483473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) { 4493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntitiesTablePtr table; 4503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr ret; 4513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4523606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard if (doc == NULL) 4533606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard return(NULL); 4543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) { 4553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor table = (xmlEntitiesTablePtr) doc->intSubset->pentities; 4563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret = xmlGetEntityFromTable(table, name); 4573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ret != NULL) 4583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(ret); 4593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 4603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) { 4613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor table = (xmlEntitiesTablePtr) doc->extSubset->pentities; 4623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(xmlGetEntityFromTable(table, name)); 4633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 4643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 4653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 4663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 4683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDtdEntity: 4693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document referencing the entity 4703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 4713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 472cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Do an entity lookup in the DTD entity hash table and 4733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding entity, if found. 4743606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard * Note: the first argument is the document node, not the DTD node. 475f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 4763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found. 4773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 4783473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 4793473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) { 4803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntitiesTablePtr table; 4813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4823606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard if (doc == NULL) 4833606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard return(NULL); 4843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { 4853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor table = (xmlEntitiesTablePtr) doc->extSubset->entities; 4863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(xmlGetEntityFromTable(table, name)); 4873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 4883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 4893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 4903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 4923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDocEntity: 4933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document referencing the entity 4943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 4953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 4963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the document entity hash table and 497cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * returns the corresponding entity, otherwise a lookup is done 4983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * in the predefined entities too. 499f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 5003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found. 5013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5023473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 5033473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) { 5043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr cur; 5053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntitiesTablePtr table; 5063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc != NULL) { 5083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { 5093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor table = (xmlEntitiesTablePtr) doc->intSubset->entities; 5103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur = xmlGetEntityFromTable(table, name); 5113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (cur != NULL) 5123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(cur); 5133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 5142875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard if (doc->standalone != 1) { 5152875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard if ((doc->extSubset != NULL) && 5162875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard (doc->extSubset->entities != NULL)) { 5172875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard table = (xmlEntitiesTablePtr) doc->extSubset->entities; 5182875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard cur = xmlGetEntityFromTable(table, name); 5192875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard if (cur != NULL) 5202875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard return(cur); 5212875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard } 5223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 5233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 524d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(xmlGetPredefinedEntity(name)); 5253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 5263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/* 5283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Macro used to grow the current buffer. 5293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#define growBufferReentrant() { \ 5314f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard xmlChar *tmp; \ 532baaf03f80f817bb34c421421e6cb4d68c353ac9aAron Xu size_t new_size = buffer_size * 2; \ 5334f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard if (new_size < buffer_size) goto mem_error; \ 5344f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard tmp = (xmlChar *) xmlRealloc(buffer, new_size); \ 5354f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard if (tmp == NULL) goto mem_error; \ 5364f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard buffer = tmp; \ 5374f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard buffer_size = new_size; \ 5383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 5393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 5417d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeEntitiesInternal: 5423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document containing the string 5433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input: A string to convert to XML. 5447d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @attr: are we handling an atrbute value 5453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 5463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities 5473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * and non ASCII values with their entities and CharRef counterparts. 5483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Contrary to xmlEncodeEntities, this routine is reentrant, and result 5493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * must be deallocated. 5503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 5513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done. 5523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5537d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillardstatic xmlChar * 5547d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeEntitiesInternal(xmlDocPtr doc, const xmlChar *input, int attr) { 5553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *cur = input; 5563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar *buffer = NULL; 5573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar *out = NULL; 5584f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard size_t buffer_size = 0; 5593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor int html = 0; 5603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (input == NULL) return(NULL); 5623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc != NULL) 5633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor html = (doc->type == XML_HTML_DOCUMENT_NODE); 5643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 5663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * allocate an translation buffer. 5673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buffer_size = 1000; 5693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); 5703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (buffer == NULL) { 5717d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard xmlEntitiesErrMemory("xmlEncodeEntities: malloc failed"); 5723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 5733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 5743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor out = buffer; 5753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*cur != '\0') { 5774f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard size_t indx = out - buffer; 5784f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard if (indx + 100 > buffer_size) { 5793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor growBufferReentrant(); 58156a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard out = &buffer[indx]; 5823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 5833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 5853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * By default one have to encode at least '<', '>', '"' and '&' ! 5863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (*cur == '<') { 5887d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard const xmlChar *end; 5897d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard 5907d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard /* 5917d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Special handling of server side include in HTML attributes 5927d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */ 5937d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard if (html && attr && 5947d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard (cur[1] == '!') && (cur[2] == '-') && (cur[3] == '-') && 5957d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard ((end = xmlStrstr(cur, BAD_CAST "-->")) != NULL)) { 5967d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard while (cur != end) { 5977d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 5987d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard indx = out - buffer; 5997d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard if (indx + 100 > buffer_size) { 6007d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard growBufferReentrant(); 6017d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard out = &buffer[indx]; 6027d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6037d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6047d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6057d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6067d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6077d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard continue; 6087d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 6103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'l'; 6113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 6123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 6133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '>') { 6143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 6153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'g'; 6163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 6173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 6183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '&') { 6197d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard /* 6207d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Special handling of &{...} construct from HTML 4, see 6217d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1 6227d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */ 6237d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard if (html && attr && (cur[1] == '{') && (strchr(cur, '}'))) { 6247d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard while (*cur != '}') { 6257d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6267d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard indx = out - buffer; 6277d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard if (indx + 100 > buffer_size) { 6287d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard growBufferReentrant(); 6297d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard out = &buffer[indx]; 6307d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6317d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6327d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6337d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard continue; 6347d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 6363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'a'; 6373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'm'; 6383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'p'; 6393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 6403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (((*cur >= 0x20) && (*cur < 0x80)) || 6410046c0fec2aa505a963d44de9621b6c92ccdc9e9Daniel Veillard (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) { 6423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 6433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * default case, just copy ! 6443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 6453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = *cur; 6463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur >= 0x80) { 647122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard if (((doc != NULL) && (doc->encoding != NULL)) || (html)) { 6483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 6493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Bj�rn Reese <br@sseusa.com> provided the patch 6503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar xc; 6513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xc = (*cur & 0x3F) << 6; 6523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (cur[1] != 0) { 6533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xc += *(++cur) & 0x3F; 6543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = xc; 6553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else 6563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 6572728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard *out++ = *cur; 6583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 6593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 6603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * We assume we have UTF-8 input. 6613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 662b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard char buf[11], *ptr; 6633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor int val = 0, l = 1; 6643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 6653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (*cur < 0xC0) { 666ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_CHECK_NOT_UTF8, 6677d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard "xmlEncodeEntities: input not UTF-8"); 668122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard if (doc != NULL) 669122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); 6703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor snprintf(buf, sizeof(buf), "&#%d;", *cur); 6713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buf[sizeof(buf) - 1] = 0; 6723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ptr = buf; 6733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*ptr != 0) *out++ = *ptr++; 67405c13a20b9ac8153adb9158359e2aa09bfe965d0Daniel Veillard cur++; 6753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor continue; 6763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur < 0xE0) { 6773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val = (cur[0]) & 0x1F; 6783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[1]) & 0x3F; 6803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor l = 2; 6813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur < 0xF0) { 6823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val = (cur[0]) & 0x0F; 6833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[1]) & 0x3F; 6853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[2]) & 0x3F; 6873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor l = 3; 6883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur < 0xF8) { 6893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val = (cur[0]) & 0x07; 6903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[1]) & 0x3F; 6923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[2]) & 0x3F; 6943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[3]) & 0x3F; 6963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor l = 4; 6973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 6983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((l == 1) || (!IS_CHAR(val))) { 699ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_ERR_INVALID_CHAR, 7007d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard "xmlEncodeEntities: char out of range\n"); 701122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard if (doc != NULL) 702122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); 7033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor snprintf(buf, sizeof(buf), "&#%d;", *cur); 7043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buf[sizeof(buf) - 1] = 0; 7053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ptr = buf; 7063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*ptr != 0) *out++ = *ptr++; 7073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur++; 7083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor continue; 7093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 7103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 7113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * We could do multiple things here. Just save as a char ref 7123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 7132728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard snprintf(buf, sizeof(buf), "&#x%X;", val); 7143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buf[sizeof(buf) - 1] = 0; 7153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ptr = buf; 7163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*ptr != 0) *out++ = *ptr++; 7173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur += l; 7183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor continue; 7193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 72076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BYTE_CHAR(*cur)) { 721b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard char buf[11], *ptr; 7223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 7233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor snprintf(buf, sizeof(buf), "&#%d;", *cur); 7243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buf[sizeof(buf) - 1] = 0; 7253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ptr = buf; 7263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*ptr != 0) *out++ = *ptr++; 7273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 7283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur++; 7293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 73013cee4e37ba9f2a401f976e069539514ebfce7bcDaniel Veillard *out = 0; 7313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(buffer); 7324f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard 7334f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillardmem_error: 7347d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard xmlEntitiesErrMemory("xmlEncodeEntities: realloc failed"); 7354f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard xmlFree(buffer); 7364f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard return(NULL); 7373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 7383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 7393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 7407d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeAttributeEntities: 7417d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @doc: the document containing the string 7427d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @input: A string to convert to XML. 7437d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * 7447d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Do a global encoding of a string, replacing the predefined entities 7457d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * and non ASCII values with their entities and CharRef counterparts for 7467d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * attribute values. 7477d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * 7487d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Returns A newly allocated string with the substitution done. 7497d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */ 7507d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlChar * 7517d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input) { 7527d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard return xmlEncodeEntitiesInternal(doc, input, 1); 7537d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard} 7547d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard 7557d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard/** 7567d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeEntitiesReentrant: 7577d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @doc: the document containing the string 7587d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @input: A string to convert to XML. 7597d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * 7607d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Do a global encoding of a string, replacing the predefined entities 7617d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * and non ASCII values with their entities and CharRef counterparts. 7627d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Contrary to xmlEncodeEntities, this routine is reentrant, and result 7637d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * must be deallocated. 7647d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * 7657d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Returns A newly allocated string with the substitution done. 7667d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */ 7677d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlChar * 7687d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) { 7697d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard return xmlEncodeEntitiesInternal(doc, input, 0); 7707d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard} 7717d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard 7727d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard/** 7733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlEncodeSpecialChars: 7743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document containing the string 7753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input: A string to convert to XML. 7763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 7773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities 7783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * this routine is reentrant, and result must be deallocated. 7793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 7803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done. 7813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 7823473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlChar * 7839ee35f36437073d952bc88fd64cf1618aad27c7bDaniel VeillardxmlEncodeSpecialChars(xmlDocPtr doc ATTRIBUTE_UNUSED, const xmlChar *input) { 7843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *cur = input; 7853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar *buffer = NULL; 7863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar *out = NULL; 7874f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard size_t buffer_size = 0; 788899e64aa2fa3b7796cff6901ef9aafe84215f8b2William M. Brack if (input == NULL) return(NULL); 7893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 7903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 7913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * allocate an translation buffer. 7923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 7933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buffer_size = 1000; 7943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); 7953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (buffer == NULL) { 796ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed"); 7973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 7983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 7993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor out = buffer; 8003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*cur != '\0') { 8024f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard size_t indx = out - buffer; 8034f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard if (indx + 10 > buffer_size) { 8043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor growBufferReentrant(); 80656a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard out = &buffer[indx]; 8073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 8083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 8103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * By default one have to encode at least '<', '>', '"' and '&' ! 8113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 8123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (*cur == '<') { 8133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 8143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'l'; 8153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 8163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 8173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '>') { 8183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 8193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'g'; 8203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 8213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 8223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '&') { 8233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 8243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'a'; 8253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'm'; 8263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'p'; 8273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 8283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '"') { 8293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 8303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'q'; 8313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'u'; 8323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'o'; 8333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 8343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 83519ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard } else if (*cur == '\r') { 83619ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = '&'; 83719ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = '#'; 83819ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = '1'; 83919ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = '3'; 84019ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = ';'; 8413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 8423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 8433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Works because on UTF-8, all extended sequences cannot 8443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * result in bytes in the ASCII range. 8453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 8463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = *cur; 8473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 8483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur++; 8493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 85013cee4e37ba9f2a401f976e069539514ebfce7bcDaniel Veillard *out = 0; 8513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(buffer); 8524f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard 8534f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillardmem_error: 8544f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard xmlEntitiesErrMemory("xmlEncodeSpecialChars: realloc failed"); 8554f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard xmlFree(buffer); 8564f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard return(NULL); 8573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 8583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 8603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCreateEntitiesTable: 8613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 8623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * create and initialize an empty entities hash table. 863316a5c398919cc1503c59130f7aed14a1111cab7Daniel Veillard * This really doesn't make sense and should be deprecated 8643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 8653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the xmlEntitiesTablePtr just created or NULL in case of error. 8663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 8673473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr 8683473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCreateEntitiesTable(void) { 8693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return((xmlEntitiesTablePtr) xmlHashCreate(0)); 8703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 8713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 8732d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * xmlFreeEntityWrapper: 8742d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @entity: An entity 8752d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @name: its name 8762d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * 8772d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * Deallocate the memory used by an entities in the hash table. 8782d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard */ 8792d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillardstatic void 8802d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel VeillardxmlFreeEntityWrapper(xmlEntityPtr entity, 8812d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard const xmlChar *name ATTRIBUTE_UNUSED) { 8822d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard if (entity != NULL) 8832d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard xmlFreeEntity(entity); 8842d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard} 8852d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard 8862d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard/** 8873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlFreeEntitiesTable: 8883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table: An entity table 8893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 8903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Deallocate the memory used by an entities hash table. 8913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 8923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid 8933473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlFreeEntitiesTable(xmlEntitiesTablePtr table) { 8942d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper); 8953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 8963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 897652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#ifdef LIBXML_TREE_ENABLED 8983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 8993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntity: 9003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent: An entity 9013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 9023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity 903f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 9043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesPtr or NULL in case of error. 9053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 90656a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr 9073473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntity(xmlEntityPtr ent) { 9083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr cur; 9093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 9103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); 9113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (cur == NULL) { 912ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed"); 9133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 9143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 9153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor memset(cur, 0, sizeof(xmlEntity)); 916845cce4cf1930d2ab9953ac1a345c5d3bed1ed94Daniel Veillard cur->type = XML_ENTITY_DECL; 9173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 9183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->etype = ent->etype; 9193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->name != NULL) 9203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->name = xmlStrdup(ent->name); 9213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->ExternalID != NULL) 9223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->ExternalID = xmlStrdup(ent->ExternalID); 9233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->SystemID != NULL) 9243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->SystemID = xmlStrdup(ent->SystemID); 9253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->content != NULL) 9263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->content = xmlStrdup(ent->content); 9273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->orig != NULL) 9283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->orig = xmlStrdup(ent->orig); 9298ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard if (ent->URI != NULL) 9308ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard cur->URI = xmlStrdup(ent->URI); 9313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(cur); 9323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 9333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 9343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 9353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntitiesTable: 9363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table: An entity table 9373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 9383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity table. 939f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 9403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesTablePtr or NULL in case of error. 9413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 9423473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr 9433473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntitiesTable(xmlEntitiesTablePtr table) { 9443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity)); 9453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 946652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#endif /* LIBXML_TREE_ENABLED */ 9473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 948a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 94918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard 95018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard/** 95118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * xmlDumpEntityContent: 95218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @buf: An XML buffer. 95318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @content: The entity content. 95418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * 95518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * This will dump the quoted string value, taking care of the special 95618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * treatment required by % 95718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard */ 95818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillardstatic void 95918ab8721ff3d009b64d23a372370fa997cdea682Daniel VeillardxmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) { 96018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; 96118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (xmlStrchr(content, '%')) { 96218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard const xmlChar * base, *cur; 96318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard 96418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferCCat(buf, "\""); 96518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard base = cur = content; 96618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard while (*cur != 0) { 96718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (*cur == '"') { 96818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (base != cur) 96918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, base, cur - base); 97018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, BAD_CAST """, 6); 97118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard cur++; 97218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard base = cur; 97318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } else if (*cur == '%') { 97418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (base != cur) 97518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, base, cur - base); 97618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, BAD_CAST "%", 6); 97718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard cur++; 97818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard base = cur; 97918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } else { 98018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard cur++; 98118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } 98218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } 98318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (base != cur) 98418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, base, cur - base); 98518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferCCat(buf, "\""); 98618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } else { 98718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferWriteQuotedString(buf, content); 98818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } 98918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard} 99018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard 9913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 9923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntityDecl: 9933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf: An XML buffer. 9943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent: An entity table 9953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 9963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition 9973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 9983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid 9993473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) { 1000ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if ((buf == NULL) || (ent == NULL)) return; 10013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor switch (ent->etype) { 10023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_INTERNAL_GENERAL_ENTITY: 10033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY "); 10043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->orig != NULL) 10073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->orig); 10083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor else 100918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlDumpEntityContent(buf, ent->content); 10103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 10133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY "); 10143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->ExternalID != NULL) { 10163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " PUBLIC "); 10173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->ExternalID); 10183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 10213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " SYSTEM "); 10223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 10273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY "); 10283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->ExternalID != NULL) { 10303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " PUBLIC "); 10313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->ExternalID); 10323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 10353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " SYSTEM "); 10363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->content != NULL) { /* Should be true ! */ 10393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " NDATA "); 10403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->orig != NULL) 10413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->orig); 10423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor else 10433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->content); 10443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_INTERNAL_PARAMETER_ENTITY: 10483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY % "); 10493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->orig == NULL) 105218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlDumpEntityContent(buf, ent->content); 10533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor else 10543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->orig); 10553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_EXTERNAL_PARAMETER_ENTITY: 10583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY % "); 10593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->ExternalID != NULL) { 10613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " PUBLIC "); 10623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->ExternalID); 10633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 10663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " SYSTEM "); 10673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor default: 1072ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY, 1073ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlDumpEntitiesDecl: internal: unknown type entity type"); 10743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 10763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 10773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 10789e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * xmlDumpEntityDeclScan: 10799e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @ent: An entity table 10809e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @buf: An XML buffer. 10819e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * 10829e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * When using the hash table scan function, arguments need to be reversed 10839e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack */ 10849e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brackstatic void 10859e66059f08301b933a74bd78f09bdf80ada9d4c4William M. BrackxmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) { 10869e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack xmlDumpEntityDecl(buf, ent); 10879e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack} 1088f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 10899e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack/** 10903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntitiesTable: 10913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf: An XML buffer. 10923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table: An entity table 10933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 10943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition 10953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 10963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid 10973473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) { 10989e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf); 10993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 1100a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */ 11015d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_entities 11025d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h" 1103