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 257651606f316c366a6d66358b72b3527a829fb7feDaniel Veillard#include "save.h" 267651606f316c366a6d66358b72b3527a829fb7feDaniel Veillard 273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/* 283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * The XML predefined entities. 293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 31d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityLt = { 32d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard NULL, XML_ENTITY_DECL, BAD_CAST "lt", 33f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard NULL, NULL, NULL, NULL, NULL, NULL, 34d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard BAD_CAST "<", BAD_CAST "<", 1, 35d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard XML_INTERNAL_PREDEFINED_ENTITY, 36f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard NULL, NULL, NULL, NULL, 0, 1 373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}; 38d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityGt = { 39d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard NULL, XML_ENTITY_DECL, BAD_CAST "gt", 40f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard NULL, NULL, NULL, NULL, NULL, NULL, 41d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard BAD_CAST ">", BAD_CAST ">", 1, 42d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard XML_INTERNAL_PREDEFINED_ENTITY, 43f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard NULL, NULL, NULL, NULL, 0, 1 44d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard}; 45d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityAmp = { 46d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard NULL, XML_ENTITY_DECL, BAD_CAST "amp", 47f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard NULL, NULL, NULL, NULL, NULL, NULL, 48d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard BAD_CAST "&", BAD_CAST "&", 1, 49d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard XML_INTERNAL_PREDEFINED_ENTITY, 50f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard NULL, NULL, NULL, NULL, 0, 1 51d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard}; 52d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityQuot = { 53d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard NULL, XML_ENTITY_DECL, BAD_CAST "quot", 54f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard NULL, NULL, NULL, NULL, NULL, NULL, 55d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard BAD_CAST "\"", BAD_CAST "\"", 1, 56d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard XML_INTERNAL_PREDEFINED_ENTITY, 57f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard NULL, NULL, NULL, NULL, 0, 1 58d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard}; 59d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillardstatic xmlEntity xmlEntityApos = { 60d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard NULL, XML_ENTITY_DECL, BAD_CAST "apos", 61f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard NULL, NULL, NULL, NULL, NULL, NULL, 62d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard BAD_CAST "'", BAD_CAST "'", 1, 63d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard XML_INTERNAL_PREDEFINED_ENTITY, 64f4f4e4853a925905deb77a72a3311ab683fbeeb5Daniel Veillard NULL, NULL, NULL, NULL, 0, 1 653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor}; 663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 67ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard/** 68ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * xmlEntitiesErrMemory: 69ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * @extra: extra informations 70ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * 71ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * Handle an out of memory condition 72ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard */ 73ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillardstatic void 74ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel VeillardxmlEntitiesErrMemory(const char *extra) 75ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard{ 76ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra); 77ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard} 78ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard 79ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard/** 80ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * xmlEntitiesErr: 81ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * @code: the error code 82ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * @msg: the message 83ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * 84ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard * Handle an out of memory condition 85ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard */ 864472c3a5a5b516aaf59b89be602fbce52756c3e9David Kilzerstatic void LIBXML_ATTR_FORMAT(2,0) 87ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel VeillardxmlEntitiesErr(xmlParserErrors code, const char *msg) 88ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard{ 89ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL); 90ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard} 91ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard 923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/* 933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlFreeEntity : clean-up an entity record. 943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 957da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillardstatic void 967da92709c8b44b9b01405417aba2f0a80312fc90Daniel VeillardxmlFreeEntity(xmlEntityPtr entity) 977da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard{ 987da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlDictPtr dict = NULL; 997da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard 1007da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (entity == NULL) 1017da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard return; 1027da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard 1037da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (entity->doc != NULL) 1047da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard dict = entity->doc->dict; 1057da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard 1063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 1072d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard if ((entity->children) && (entity->owner == 1) && 1087da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard (entity == (xmlEntityPtr) entity->children->parent)) 1097da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFreeNodeList(entity->children); 1107da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (dict != NULL) { 1117da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name))) 1127da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->name); 1137da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if ((entity->ExternalID != NULL) && 1147da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard (!xmlDictOwns(dict, entity->ExternalID))) 1157da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->ExternalID); 1167da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if ((entity->SystemID != NULL) && 1177da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard (!xmlDictOwns(dict, entity->SystemID))) 1187da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->SystemID); 1197da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI))) 1207da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->URI); 1217da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if ((entity->content != NULL) 1227da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard && (!xmlDictOwns(dict, entity->content))) 1237da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->content); 1247da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig))) 1257da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->orig); 1267da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard } else { 1277da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (entity->name != NULL) 1287da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->name); 1297da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (entity->ExternalID != NULL) 1307da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->ExternalID); 1317da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (entity->SystemID != NULL) 1327da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->SystemID); 1337da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (entity->URI != NULL) 1347da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->URI); 1357da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (entity->content != NULL) 1367da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->content); 1377da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (entity->orig != NULL) 1387da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlFree((char *) entity->orig); 1397da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard } 1403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlFree(entity); 1413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 1423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 1433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/* 144aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlCreateEntity: 145aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * 146aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * internal routine doing the entity node strutures allocations 1473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 1483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorstatic xmlEntityPtr 149aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type, 150aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *ExternalID, const xmlChar *SystemID, 151aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *content) { 1523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr ret; 1533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 1543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); 1553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ret == NULL) { 156aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlEntitiesErrMemory("xmlCreateEntity: malloc failed"); 1573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 1583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 1593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor memset(ret, 0, sizeof(xmlEntity)); 1603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->type = XML_ENTITY_DECL; 161a37a6ad91a61d168ecc4b29263def3363fff4da6Daniel Veillard ret->checked = 0; 1623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 1633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 1643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * fill the structure. 1653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 1663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->etype = (xmlEntityType) type; 1677da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (dict == NULL) { 1687da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->name = xmlStrdup(name); 1697da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (ExternalID != NULL) 1707da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->ExternalID = xmlStrdup(ExternalID); 1717da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (SystemID != NULL) 1727da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->SystemID = xmlStrdup(SystemID); 1737da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard } else { 1747da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->name = xmlDictLookup(dict, name, -1); 1757da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (ExternalID != NULL) 1767da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->ExternalID = xmlDictLookup(dict, ExternalID, -1); 1777da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if (SystemID != NULL) 1787da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->SystemID = xmlDictLookup(dict, SystemID, -1); 1797da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard } 1803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (content != NULL) { 1813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->length = xmlStrlen(content); 1827da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard if ((dict != NULL) && (ret->length < 5)) 1837da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->content = (xmlChar *) 1847da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard xmlDictLookup(dict, content, ret->length); 1857da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard else 1867da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->content = xmlStrndup(content, ret->length); 1873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 1883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->length = 0; 1893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->content = NULL; 1903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 1913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->URI = NULL; /* to be computed by the layer knowing 1923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor the defining entity */ 1933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->orig = NULL; 1942d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard ret->owner = 0; 195aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 196aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(ret); 197aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard} 198aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 199aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard/* 200aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlAddEntity : register a new entity for an entities table. 201aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard */ 202aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillardstatic xmlEntityPtr 203aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type, 204aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *ExternalID, const xmlChar *SystemID, 205aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *content) { 206aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlDictPtr dict = NULL; 207aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlEntitiesTablePtr table = NULL; 208aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlEntityPtr ret; 209aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 210aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (name == NULL) 211aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 212aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (dtd == NULL) 213aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 214aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (dtd->doc != NULL) 215aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dict = dtd->doc->dict; 216aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 217aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard switch (type) { 218aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_INTERNAL_GENERAL_ENTITY: 219aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 220aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 221aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (dtd->entities == NULL) 222aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dtd->entities = xmlHashCreateDict(0, dict); 223aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard table = dtd->entities; 224aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard break; 225aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_INTERNAL_PARAMETER_ENTITY: 226aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_EXTERNAL_PARAMETER_ENTITY: 227aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (dtd->pentities == NULL) 228aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dtd->pentities = xmlHashCreateDict(0, dict); 229aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard table = dtd->pentities; 230aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard break; 231aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard case XML_INTERNAL_PREDEFINED_ENTITY: 232aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 233aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard } 234aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (table == NULL) 235aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 236aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); 237aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (ret == NULL) 238aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 2397da92709c8b44b9b01405417aba2f0a80312fc90Daniel Veillard ret->doc = dtd->doc; 2403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 2413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (xmlHashAddEntry(table, name, ret)) { 2423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 2433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * entity was already defined at another level. 2443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 2453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlFreeEntity(ret); 2463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 2473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 2483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(ret); 2493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 2503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 2513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 2523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetPredefinedEntity: 2533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 2543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 2553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Check whether this name is an predefined entity. 2563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 257cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Returns NULL if not, otherwise the entity 2583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 2593473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 2603473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetPredefinedEntity(const xmlChar *name) { 261d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (name == NULL) return(NULL); 262d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard switch (name[0]) { 263d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard case 'l': 264d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "lt")) 265d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityLt); 266d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 267d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard case 'g': 268d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "gt")) 269d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityGt); 270d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 271d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard case 'a': 272d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "amp")) 273d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityAmp); 274d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "apos")) 275d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityApos); 276d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 277d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard case 'q': 278d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard if (xmlStrEqual(name, BAD_CAST "quot")) 279d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(&xmlEntityQuot); 280d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 281d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard default: 282d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard break; 283d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard } 284d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(NULL); 2853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 2863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 2873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 2883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDtdEntity: 2893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document 2903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 2913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type: the entity type XML_xxx_yyy_ENTITY 2923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID: the entity external ID if available 2933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID: the entity system ID if available 2943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content: the entity content 2953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 2963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document DTD external subset. 2973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 2983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error 2993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 3003473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 3013473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type, 3023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *ExternalID, const xmlChar *SystemID, 3033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *content) { 3043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr ret; 3053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlDtdPtr dtd; 3063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc == NULL) { 308ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_NO_DOC, 309ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlAddDtdEntity: document is NULL"); 3103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 3113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc->extSubset == NULL) { 313ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_NO_DTD, 314ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlAddDtdEntity: document without external subset"); 3153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 3163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd = doc->extSubset; 3183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); 3193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ret == NULL) return(NULL); 3203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 322cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Link it to the DTD 3233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 3243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->parent = dtd; 3253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->doc = dtd->doc; 3263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (dtd->last == NULL) { 3273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->children = dtd->last = (xmlNodePtr) ret; 3283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 3293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->last->next = (xmlNodePtr) ret; 3303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->prev = dtd->last; 3313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->last = (xmlNodePtr) ret; 3323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(ret); 3343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 3353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 3373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlAddDocEntity: 3383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document 3393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 3403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @type: the entity type XML_xxx_yyy_ENTITY 3413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ExternalID: the entity external ID if available 3423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @SystemID: the entity system ID if available 3433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @content: the entity content 3443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 3453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Register a new entity for this document. 3463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 3473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns a pointer to the entity or NULL in case of error 3483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 3493473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 3503473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type, 3513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *ExternalID, const xmlChar *SystemID, 3523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *content) { 3533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr ret; 3543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlDtdPtr dtd; 3553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc == NULL) { 357ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_NO_DOC, 358ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlAddDocEntity: document is NULL"); 3593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 3603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc->intSubset == NULL) { 362ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_NO_DTD, 363ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlAddDocEntity: document without internal subset"); 3643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 3653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd = doc->intSubset; 3673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); 3683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ret == NULL) return(NULL); 3693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 371cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Link it to the DTD 3723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 3733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->parent = dtd; 3743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->doc = dtd->doc; 3753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (dtd->last == NULL) { 3763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->children = dtd->last = (xmlNodePtr) ret; 3773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 3783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->last->next = (xmlNodePtr) ret; 3793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret->prev = dtd->last; 3803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor dtd->last = (xmlNodePtr) ret; 3813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 3823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(ret); 3833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 3843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 3853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 386aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * xmlNewEntity: 387aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @doc: the document 388aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @name: the entity name 389aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @type: the entity type XML_xxx_yyy_ENTITY 390aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @ExternalID: the entity external ID if available 391aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @SystemID: the entity system ID if available 392aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * @content: the entity content 393aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * 394aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * Create a new entity, this differs from xmlAddDocEntity() that if 395aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * the document is NULL or has no internal subset defined, then an 396aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * unlinked entity structure will be returned, it is then the responsability 397aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * of the caller to link it to the document later or free it when not needed 398aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * anymore. 399aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * 400aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard * Returns a pointer to the entity or NULL in case of error 401aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard */ 402aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlEntityPtr 403aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel VeillardxmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type, 404aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *ExternalID, const xmlChar *SystemID, 405aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard const xmlChar *content) { 406aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlEntityPtr ret; 407aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard xmlDictPtr dict; 408aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 409aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if ((doc != NULL) && (doc->intSubset != NULL)) { 410aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content)); 411aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard } 412aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (doc != NULL) 413aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dict = doc->dict; 414aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard else 415aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard dict = NULL; 416aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); 417aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard if (ret == NULL) 418aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(NULL); 419aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard ret->doc = doc; 420aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard return(ret); 421aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard} 422aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard 423aa6de47ebf0d4f96ed83e06c79a870a4e9b5dd0eDaniel Veillard/** 4243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetEntityFromTable: 4253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table: an entity table 4263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 4273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @parameter: look for parameter entities 4283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 4293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the table. 4303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found. 431f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 4323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found. 4333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 43456a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr 4353473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) { 4363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return((xmlEntityPtr) xmlHashLookup(table, name)); 4373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 4383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 4403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetParameterEntity: 4413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document referencing the entity 4423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 4433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 4443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the internal and external subsets and 4453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding parameter entity, if found. 446f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 4473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found. 4483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 4493473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 4503473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) { 4513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntitiesTablePtr table; 4523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr ret; 4533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4543606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard if (doc == NULL) 4553606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard return(NULL); 4563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) { 4573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor table = (xmlEntitiesTablePtr) doc->intSubset->pentities; 4583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ret = xmlGetEntityFromTable(table, name); 4593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ret != NULL) 4603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(ret); 4613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 4623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) { 4633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor table = (xmlEntitiesTablePtr) doc->extSubset->pentities; 4643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(xmlGetEntityFromTable(table, name)); 4653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 4663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 4673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 4683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 4703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDtdEntity: 4713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document referencing the entity 4723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 4733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 474cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * Do an entity lookup in the DTD entity hash table and 4753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * returns the corresponding entity, if found. 4763606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard * Note: the first argument is the document node, not the DTD node. 477f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 4783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found. 4793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 4803473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 4813473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) { 4823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntitiesTablePtr table; 4833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4843606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard if (doc == NULL) 4853606581dcd45fbabfa95ce3565918d0c7e407633Daniel Veillard return(NULL); 4863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { 4873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor table = (xmlEntitiesTablePtr) doc->extSubset->entities; 4883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(xmlGetEntityFromTable(table, name)); 4893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 4903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 4913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 4923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 4933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 4943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlGetDocEntity: 4953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document referencing the entity 4963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @name: the entity name 4973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 4983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do an entity lookup in the document entity hash table and 499cbaf399537a1fb69ef97b079e4cb553869aaa4d9Daniel Veillard * returns the corresponding entity, otherwise a lookup is done 5003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * in the predefined entities too. 501f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 5023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A pointer to the entity structure or NULL if not found. 5033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5043473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntityPtr 50595ebe53b50dfcff1fc5378309bc4f3c58173298eKurt RoeckxxmlGetDocEntity(const xmlDoc *doc, const xmlChar *name) { 5063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr cur; 5073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntitiesTablePtr table; 5083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc != NULL) { 5103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { 5113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor table = (xmlEntitiesTablePtr) doc->intSubset->entities; 5123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur = xmlGetEntityFromTable(table, name); 5133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (cur != NULL) 5143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(cur); 5153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 5162875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard if (doc->standalone != 1) { 5172875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard if ((doc->extSubset != NULL) && 5182875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard (doc->extSubset->entities != NULL)) { 5192875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard table = (xmlEntitiesTablePtr) doc->extSubset->entities; 5202875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard cur = xmlGetEntityFromTable(table, name); 5212875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard if (cur != NULL) 5222875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard return(cur); 5232875770e5301f96c4c7bf576d611613cf912b632Daniel Veillard } 5243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 5253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 526d3a2e4c2b34fa2e8ee056b04a685610483ffd1c4Daniel Veillard return(xmlGetPredefinedEntity(name)); 5273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 5283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/* 5303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Macro used to grow the current buffer. 5313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor#define growBufferReentrant() { \ 5334f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard xmlChar *tmp; \ 534baaf03f80f817bb34c421421e6cb4d68c353ac9aAron Xu size_t new_size = buffer_size * 2; \ 5354f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard if (new_size < buffer_size) goto mem_error; \ 5364f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard tmp = (xmlChar *) xmlRealloc(buffer, new_size); \ 5374f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard if (tmp == NULL) goto mem_error; \ 5384f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard buffer = tmp; \ 5394f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard buffer_size = new_size; \ 5403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 5413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 5437d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeEntitiesInternal: 5443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document containing the string 5453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input: A string to convert to XML. 5467d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @attr: are we handling an atrbute value 5473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 5483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities 5493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * and non ASCII values with their entities and CharRef counterparts. 5503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Contrary to xmlEncodeEntities, this routine is reentrant, and result 5513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * must be deallocated. 5523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 5533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done. 5543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5557d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillardstatic xmlChar * 5567d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeEntitiesInternal(xmlDocPtr doc, const xmlChar *input, int attr) { 5573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *cur = input; 5583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar *buffer = NULL; 5593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar *out = NULL; 5604f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard size_t buffer_size = 0; 5613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor int html = 0; 5623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (input == NULL) return(NULL); 5643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (doc != NULL) 5653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor html = (doc->type == XML_HTML_DOCUMENT_NODE); 5663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 5683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * allocate an translation buffer. 5693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buffer_size = 1000; 5713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); 5723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (buffer == NULL) { 5737d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard xmlEntitiesErrMemory("xmlEncodeEntities: malloc failed"); 5743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 5753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 5763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor out = buffer; 5773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*cur != '\0') { 5794f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard size_t indx = out - buffer; 5804f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard if (indx + 100 > buffer_size) { 5813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor growBufferReentrant(); 58356a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard out = &buffer[indx]; 5843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 5853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 5863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 5873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * By default one have to encode at least '<', '>', '"' and '&' ! 5883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 5893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (*cur == '<') { 5907d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard const xmlChar *end; 5917d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard 5927d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard /* 5937d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Special handling of server side include in HTML attributes 5947d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */ 5957d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard if (html && attr && 5967d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard (cur[1] == '!') && (cur[2] == '-') && (cur[3] == '-') && 5977d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard ((end = xmlStrstr(cur, BAD_CAST "-->")) != NULL)) { 5987d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard while (cur != end) { 5997d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6007d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard indx = out - buffer; 6017d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard if (indx + 100 > buffer_size) { 6027d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard growBufferReentrant(); 6037d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard out = &buffer[indx]; 6047d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6057d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6067d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6077d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6087d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6097d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard continue; 6107d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 6123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'l'; 6133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 6143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 6153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '>') { 6163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 6173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'g'; 6183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 6193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 6203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '&') { 6217d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard /* 6227d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Special handling of &{...} construct from HTML 4, see 6237d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1 6247d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */ 6257651606f316c366a6d66358b72b3527a829fb7feDaniel Veillard if (html && attr && (cur[1] == '{') && 6267651606f316c366a6d66358b72b3527a829fb7feDaniel Veillard (strchr((const char *) cur, '}'))) { 6277d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard while (*cur != '}') { 6287d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6297d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard indx = out - buffer; 6307d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard if (indx + 100 > buffer_size) { 6317d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard growBufferReentrant(); 6327d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard out = &buffer[indx]; 6337d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6347d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6357d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard *out++ = *cur++; 6367d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard continue; 6377d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard } 6383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 6393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'a'; 6403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'm'; 6413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'p'; 6423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 6433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (((*cur >= 0x20) && (*cur < 0x80)) || 6440046c0fec2aa505a963d44de9621b6c92ccdc9e9Daniel Veillard (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) { 6453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 6463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * default case, just copy ! 6473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 6483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = *cur; 6493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur >= 0x80) { 650122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard if (((doc != NULL) && (doc->encoding != NULL)) || (html)) { 6513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 6520ab8ce53024e80f671b135a58086a24bf76bc2ebDaniel Veillard * Bjørn Reese <br@sseusa.com> provided the patch 6533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar xc; 6543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xc = (*cur & 0x3F) << 6; 6553473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (cur[1] != 0) { 6563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xc += *(++cur) & 0x3F; 6573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = xc; 6583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else 6593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 6602728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard *out++ = *cur; 6613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 6623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 6633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * We assume we have UTF-8 input. 6643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 665b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard char buf[11], *ptr; 6663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor int val = 0, l = 1; 6673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 6683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (*cur < 0xC0) { 669ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_CHECK_NOT_UTF8, 6707d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard "xmlEncodeEntities: input not UTF-8"); 671122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard if (doc != NULL) 672122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); 6733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor snprintf(buf, sizeof(buf), "&#%d;", *cur); 6743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buf[sizeof(buf) - 1] = 0; 6753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ptr = buf; 6763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*ptr != 0) *out++ = *ptr++; 67705c13a20b9ac8153adb9158359e2aa09bfe965d0Daniel Veillard cur++; 6783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor continue; 6793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur < 0xE0) { 6803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val = (cur[0]) & 0x1F; 6813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[1]) & 0x3F; 6833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor l = 2; 6843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur < 0xF0) { 6853473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val = (cur[0]) & 0x0F; 6863473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[1]) & 0x3F; 6883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[2]) & 0x3F; 6903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor l = 3; 6913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur < 0xF8) { 6923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val = (cur[0]) & 0x07; 6933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[1]) & 0x3F; 6953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[2]) & 0x3F; 6973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val <<= 6; 6983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor val |= (cur[3]) & 0x3F; 6993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor l = 4; 7003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 7013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if ((l == 1) || (!IS_CHAR(val))) { 702ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_ERR_INVALID_CHAR, 7037d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard "xmlEncodeEntities: char out of range\n"); 704122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard if (doc != NULL) 705122376b8efbff2cd6b62af2dedcdea05e07f5766Daniel Veillard doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); 7063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor snprintf(buf, sizeof(buf), "&#%d;", *cur); 7073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buf[sizeof(buf) - 1] = 0; 7083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ptr = buf; 7093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*ptr != 0) *out++ = *ptr++; 7103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur++; 7113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor continue; 7123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 7133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 7143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * We could do multiple things here. Just save as a char ref 7153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 7162728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard snprintf(buf, sizeof(buf), "&#x%X;", val); 7173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buf[sizeof(buf) - 1] = 0; 7183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ptr = buf; 7193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*ptr != 0) *out++ = *ptr++; 7203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur += l; 7213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor continue; 7223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 72376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BYTE_CHAR(*cur)) { 724b2517d850dd0312fb82587662b2feec848192dafDaniel Veillard char buf[11], *ptr; 7253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 7263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor snprintf(buf, sizeof(buf), "&#%d;", *cur); 7273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buf[sizeof(buf) - 1] = 0; 7283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor ptr = buf; 7293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*ptr != 0) *out++ = *ptr++; 7303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 7313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur++; 7323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 73313cee4e37ba9f2a401f976e069539514ebfce7bcDaniel Veillard *out = 0; 7343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(buffer); 7354f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard 7364f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillardmem_error: 7377d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard xmlEntitiesErrMemory("xmlEncodeEntities: realloc failed"); 7384f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard xmlFree(buffer); 7394f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard return(NULL); 7403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 7413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 7423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 7437d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeAttributeEntities: 7447d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @doc: the document containing the string 7457d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @input: A string to convert to XML. 7467d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * 7477d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Do a global encoding of a string, replacing the predefined entities 7487d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * and non ASCII values with their entities and CharRef counterparts for 7497d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * attribute values. 7507d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * 7517d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Returns A newly allocated string with the substitution done. 7527d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */ 7537d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlChar * 7547d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input) { 7557d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard return xmlEncodeEntitiesInternal(doc, input, 1); 7567d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard} 7577d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard 7587d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard/** 7597d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * xmlEncodeEntitiesReentrant: 7607d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @doc: the document containing the string 7617d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * @input: A string to convert to XML. 7627d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * 7637d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Do a global encoding of a string, replacing the predefined entities 7647d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * and non ASCII values with their entities and CharRef counterparts. 7657d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Contrary to xmlEncodeEntities, this routine is reentrant, and result 7667d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * must be deallocated. 7677d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * 7687d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard * Returns A newly allocated string with the substitution done. 7697d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard */ 7707d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlChar * 7717d4c529a334845621e2f805c8ed0e154b3350cecDaniel VeillardxmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) { 7727d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard return xmlEncodeEntitiesInternal(doc, input, 0); 7737d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard} 7747d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard 7757d4c529a334845621e2f805c8ed0e154b3350cecDaniel Veillard/** 7763473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlEncodeSpecialChars: 7773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @doc: the document containing the string 7783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @input: A string to convert to XML. 7793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 7803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Do a global encoding of a string, replacing the predefined entities 7813473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * this routine is reentrant, and result must be deallocated. 7823473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 7833473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns A newly allocated string with the substitution done. 7843473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 7853473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlChar * 78695ebe53b50dfcff1fc5378309bc4f3c58173298eKurt RoeckxxmlEncodeSpecialChars(const xmlDoc *doc ATTRIBUTE_UNUSED, const xmlChar *input) { 7873473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor const xmlChar *cur = input; 7883473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar *buffer = NULL; 7893473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlChar *out = NULL; 7904f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard size_t buffer_size = 0; 791899e64aa2fa3b7796cff6901ef9aafe84215f8b2William M. Brack if (input == NULL) return(NULL); 7923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 7933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 7943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * allocate an translation buffer. 7953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 7963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buffer_size = 1000; 7973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); 7983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (buffer == NULL) { 799ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed"); 8003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 8013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 8023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor out = buffer; 8033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor while (*cur != '\0') { 8054f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard size_t indx = out - buffer; 8064f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard if (indx + 10 > buffer_size) { 8073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor growBufferReentrant(); 80956a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillard out = &buffer[indx]; 8103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 8113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 8133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * By default one have to encode at least '<', '>', '"' and '&' ! 8143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 8153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (*cur == '<') { 8163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 8173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'l'; 8183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 8193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 8203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '>') { 8213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 8223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'g'; 8233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 8243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 8253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '&') { 8263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 8273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'a'; 8283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'm'; 8293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'p'; 8303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 8313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else if (*cur == '"') { 8323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = '&'; 8333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'q'; 8343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'u'; 8353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 'o'; 8363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = 't'; 8373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = ';'; 83819ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard } else if (*cur == '\r') { 83919ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = '&'; 84019ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = '#'; 84119ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = '1'; 84219ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = '3'; 84319ab45b5a53e4a7462ee459e3dc5d70d1706e137Daniel Veillard *out++ = ';'; 8443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 8453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor /* 8463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Works because on UTF-8, all extended sequences cannot 8473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * result in bytes in the ASCII range. 8483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 8493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor *out++ = *cur; 8503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 8513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur++; 8523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 85313cee4e37ba9f2a401f976e069539514ebfce7bcDaniel Veillard *out = 0; 8543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(buffer); 8554f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard 8564f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillardmem_error: 8574f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard xmlEntitiesErrMemory("xmlEncodeSpecialChars: realloc failed"); 8584f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard xmlFree(buffer); 8594f9fdc709c4861c390cd84e2ed1fd878b3442e28Daniel Veillard return(NULL); 8603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 8613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 8633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCreateEntitiesTable: 8643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 8653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * create and initialize an empty entities hash table. 866316a5c398919cc1503c59130f7aed14a1111cab7Daniel Veillard * This really doesn't make sense and should be deprecated 8673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 8683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the xmlEntitiesTablePtr just created or NULL in case of error. 8693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 8703473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr 8713473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCreateEntitiesTable(void) { 8723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return((xmlEntitiesTablePtr) xmlHashCreate(0)); 8733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 8743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 8753473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 8762d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * xmlFreeEntityWrapper: 8772d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @entity: An entity 8782d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * @name: its name 8792d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * 8802d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard * Deallocate the memory used by an entities in the hash table. 8812d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard */ 8822d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillardstatic void 8832d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel VeillardxmlFreeEntityWrapper(xmlEntityPtr entity, 8842d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard const xmlChar *name ATTRIBUTE_UNUSED) { 8852d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard if (entity != NULL) 8862d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard xmlFreeEntity(entity); 8872d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard} 8882d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard 8892d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard/** 8903473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlFreeEntitiesTable: 8913473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table: An entity table 8923473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 8933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Deallocate the memory used by an entities hash table. 8943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 8953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid 8963473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlFreeEntitiesTable(xmlEntitiesTablePtr table) { 8972d84a89478ccf8e65d6ab94a919f403cc1968d47Daniel Veillard xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper); 8983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 8993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 900652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#ifdef LIBXML_TREE_ENABLED 9013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 9023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntity: 9033473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent: An entity 9043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 9053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity 906f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 9073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesPtr or NULL in case of error. 9083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 90956a4cb8c4d3eab4ab3295a61c87e8e92483922c6Daniel Veillardstatic xmlEntityPtr 9103473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntity(xmlEntityPtr ent) { 9113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlEntityPtr cur; 9123473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 9133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); 9143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (cur == NULL) { 915ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed"); 9163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(NULL); 9173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 9183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor memset(cur, 0, sizeof(xmlEntity)); 919845cce4cf1930d2ab9953ac1a345c5d3bed1ed94Daniel Veillard cur->type = XML_ENTITY_DECL; 9203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 9213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->etype = ent->etype; 9223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->name != NULL) 9233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->name = xmlStrdup(ent->name); 9243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->ExternalID != NULL) 9253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->ExternalID = xmlStrdup(ent->ExternalID); 9263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->SystemID != NULL) 9273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->SystemID = xmlStrdup(ent->SystemID); 9283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->content != NULL) 9293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->content = xmlStrdup(ent->content); 9303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->orig != NULL) 9313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor cur->orig = xmlStrdup(ent->orig); 9328ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard if (ent->URI != NULL) 9338ee9c8f6c4ac1d1865cd5fcdc02e59a0c8de2d8aDaniel Veillard cur->URI = xmlStrdup(ent->URI); 9343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(cur); 9353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 9363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 9373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 9383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlCopyEntitiesTable: 9393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table: An entity table 9403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 9413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Build a copy of an entity table. 942f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 9433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * Returns the new xmlEntitiesTablePtr or NULL in case of error. 9443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 9453473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlEntitiesTablePtr 9463473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlCopyEntitiesTable(xmlEntitiesTablePtr table) { 9473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity)); 9483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 949652327a727000b7e1a32d596e05471003c2d3d87Daniel Veillard#endif /* LIBXML_TREE_ENABLED */ 9503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 951a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 95218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard 95318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard/** 95418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * xmlDumpEntityContent: 95518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @buf: An XML buffer. 95618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * @content: The entity content. 95718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * 95818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * This will dump the quoted string value, taking care of the special 95918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard * treatment required by % 96018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard */ 96118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillardstatic void 96218ab8721ff3d009b64d23a372370fa997cdea682Daniel VeillardxmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) { 96318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; 96418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (xmlStrchr(content, '%')) { 96518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard const xmlChar * base, *cur; 96618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard 96718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferCCat(buf, "\""); 96818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard base = cur = content; 96918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard while (*cur != 0) { 97018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (*cur == '"') { 97118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (base != cur) 97218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, base, cur - base); 97318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, BAD_CAST """, 6); 97418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard cur++; 97518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard base = cur; 97618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } else if (*cur == '%') { 97718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (base != cur) 97818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, base, cur - base); 97918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, BAD_CAST "%", 6); 98018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard cur++; 98118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard base = cur; 98218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } else { 98318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard cur++; 98418ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } 98518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } 98618ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard if (base != cur) 98718ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferAdd(buf, base, cur - base); 98818ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferCCat(buf, "\""); 98918ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } else { 99018ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlBufferWriteQuotedString(buf, content); 99118ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard } 99218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard} 99318ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard 9943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 9953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntityDecl: 9963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf: An XML buffer. 9973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @ent: An entity table 9983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 9993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition 10003473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 10013473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid 10023473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) { 1003ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if ((buf == NULL) || (ent == NULL)) return; 10043473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor switch (ent->etype) { 10053473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_INTERNAL_GENERAL_ENTITY: 10063473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY "); 10073473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10083473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10093473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->orig != NULL) 10103473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->orig); 10113473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor else 101218ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlDumpEntityContent(buf, ent->content); 10133473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10143473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10153473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 10163473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY "); 10173473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10183473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->ExternalID != NULL) { 10193473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " PUBLIC "); 10203473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->ExternalID); 10213473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10223473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10233473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 10243473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " SYSTEM "); 10253473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10263473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10273473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10283473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10293473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 10303473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY "); 10313473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10323473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->ExternalID != NULL) { 10333473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " PUBLIC "); 10343473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->ExternalID); 10353473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10363473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10373473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 10383473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " SYSTEM "); 10393473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10403473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10413473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->content != NULL) { /* Should be true ! */ 10423473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " NDATA "); 10433473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->orig != NULL) 10443473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->orig); 10453473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor else 10463473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->content); 10473473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10483473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10493473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10503473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_INTERNAL_PARAMETER_ENTITY: 10513473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY % "); 10523473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10533473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10543473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->orig == NULL) 105518ab8721ff3d009b64d23a372370fa997cdea682Daniel Veillard xmlDumpEntityContent(buf, ent->content); 10563473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor else 10573473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->orig); 10583473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10593473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10603473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor case XML_EXTERNAL_PARAMETER_ENTITY: 10613473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, "<!ENTITY % "); 10623473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteCHAR(buf, ent->name); 10633473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor if (ent->ExternalID != NULL) { 10643473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " PUBLIC "); 10653473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->ExternalID); 10663473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " "); 10673473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10683473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } else { 10693473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, " SYSTEM "); 10703473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteQuotedString(buf, ent->SystemID); 10713473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10723473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor xmlBufferWriteChar(buf, ">\n"); 10733473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor break; 10743473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor default: 1075ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY, 1076ce244ad595eafff8e78a8f55fbd0004a0b42d789Daniel Veillard "xmlDumpEntitiesDecl: internal: unknown type entity type"); 10773473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor } 10783473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 10793473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor 10803473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor/** 10819e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * xmlDumpEntityDeclScan: 10829e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @ent: An entity table 10839e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * @buf: An XML buffer. 10849e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * 10859e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack * When using the hash table scan function, arguments need to be reversed 10869e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack */ 10879e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brackstatic void 10889e66059f08301b933a74bd78f09bdf80ada9d4c4William M. BrackxmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) { 10899e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack xmlDumpEntityDecl(buf, ent); 10909e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack} 1091f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 10929e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack/** 10933473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * xmlDumpEntitiesTable: 10943473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @buf: An XML buffer. 10953473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * @table: An entity table 10963473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * 10973473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor * This will dump the content of the entity table as an XML DTD definition 10983473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor */ 10993473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylorvoid 11003473f88a7abdf4e585e267288fb77e898c580d2bOwen TaylorxmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) { 11019e66059f08301b933a74bd78f09bdf80ada9d4c4William M. Brack xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf); 11023473f88a7abdf4e585e267288fb77e898c580d2bOwen Taylor} 1103a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */ 11045d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_entities 11055d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h" 1106