15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * entities.c : implementation for the XML entities handling 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXML 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/hash.h> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/entities.h> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/dict.h> 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The XML predefined entities. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntity xmlEntityLt = { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, XML_ENTITY_DECL, BAD_CAST "lt", 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, NULL, NULL, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "<", BAD_CAST "<", 1, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_INTERNAL_PREDEFINED_ENTITY, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, 0, 1 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntity xmlEntityGt = { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, XML_ENTITY_DECL, BAD_CAST "gt", 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, NULL, NULL, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST ">", BAD_CAST ">", 1, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_INTERNAL_PREDEFINED_ENTITY, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, 0, 1 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntity xmlEntityAmp = { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, XML_ENTITY_DECL, BAD_CAST "amp", 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, NULL, NULL, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "&", BAD_CAST "&", 1, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_INTERNAL_PREDEFINED_ENTITY, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, 0, 1 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntity xmlEntityQuot = { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, XML_ENTITY_DECL, BAD_CAST "quot", 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, NULL, NULL, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "\"", BAD_CAST "\"", 1, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_INTERNAL_PREDEFINED_ENTITY, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, 0, 1 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntity xmlEntityApos = { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, XML_ENTITY_DECL, BAD_CAST "apos", 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, NULL, NULL, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "'", BAD_CAST "'", 1, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XML_INTERNAL_PREDEFINED_ENTITY, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL, NULL, 0, 1 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlEntitiesErrMemory: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @extra: extra informations 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntitiesErrMemory(const char *extra) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlEntitiesErr: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @code: the error code 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @msg: the message 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle an out of memory condition 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntitiesErr(xmlParserErrors code, const char *msg) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeEntity : clean-up an entity record. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeEntity(xmlEntityPtr entity) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictPtr dict = NULL; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entity == NULL) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entity->doc != NULL) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict = entity->doc->dict; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((entity->children) && (entity->owner == 1) && 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (entity == (xmlEntityPtr) entity->children->parent)) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNodeList(entity->children); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dict != NULL) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name))) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->name); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((entity->ExternalID != NULL) && 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlDictOwns(dict, entity->ExternalID))) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->ExternalID); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((entity->SystemID != NULL) && 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlDictOwns(dict, entity->SystemID))) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->SystemID); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI))) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->URI); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((entity->content != NULL) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (!xmlDictOwns(dict, entity->content))) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->content); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig))) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->orig); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entity->name != NULL) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->name); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entity->ExternalID != NULL) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->ExternalID); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entity->SystemID != NULL) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->SystemID); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entity->URI != NULL) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->URI); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entity->content != NULL) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->content); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entity->orig != NULL) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((char *) entity->orig); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(entity); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCreateEntity: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * internal routine doing the entity node strutures allocations 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *ExternalID, const xmlChar *SystemID, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *content) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntityPtr ret; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErrMemory("xmlCreateEntity: malloc failed"); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xmlEntity)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->type = XML_ENTITY_DECL; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->checked = 0; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fill the structure. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->etype = (xmlEntityType) type; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dict == NULL) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->name = xmlStrdup(name); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ExternalID != NULL) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ExternalID = xmlStrdup(ExternalID); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (SystemID != NULL) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->SystemID = xmlStrdup(SystemID); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->name = xmlDictLookup(dict, name, -1); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ExternalID != NULL) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->ExternalID = xmlDictLookup(dict, ExternalID, -1); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (SystemID != NULL) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->SystemID = xmlDictLookup(dict, SystemID, -1); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content != NULL) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->length = xmlStrlen(content); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((dict != NULL) && (ret->length < 5)) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content = (xmlChar *) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictLookup(dict, content, ret->length); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content = xmlStrndup(content, ret->length); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->length = 0; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->content = NULL; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->URI = NULL; /* to be computed by the layer knowing 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the defining entity */ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->orig = NULL; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->owner = 0; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddEntity : register a new entity for an entities table. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *ExternalID, const xmlChar *SystemID, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *content) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictPtr dict = NULL; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesTablePtr table = NULL; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntityPtr ret; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == NULL) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dtd == NULL) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dtd->doc != NULL) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict = dtd->doc->dict; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_GENERAL_ENTITY: 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dtd->entities == NULL) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd->entities = xmlHashCreateDict(0, dict); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = dtd->entities; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_PARAMETER_ENTITY: 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_PARAMETER_ENTITY: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dtd->pentities == NULL) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd->pentities = xmlHashCreateDict(0, dict); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = dtd->pentities; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_PREDEFINED_ENTITY: 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (table == NULL) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = dtd->doc; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlHashAddEntry(table, name, ret)) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * entity was already defined at another level. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeEntity(ret); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetPredefinedEntity: 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the entity name 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check whether this name is an predefined entity. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns NULL if not, otherwise the entity 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntityPtr 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetPredefinedEntity(const xmlChar *name) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == NULL) return(NULL); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (name[0]) { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 'l': 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(name, BAD_CAST "lt")) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(&xmlEntityLt); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 'g': 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(name, BAD_CAST "gt")) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(&xmlEntityGt); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 'a': 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(name, BAD_CAST "amp")) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(&xmlEntityAmp); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(name, BAD_CAST "apos")) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(&xmlEntityApos); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 'q': 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(name, BAD_CAST "quot")) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(&xmlEntityQuot); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddDtdEntity: 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the entity name 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the entity type XML_xxx_yyy_ENTITY 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ExternalID: the entity external ID if available 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SystemID: the entity system ID if available 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content: the entity content 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register a new entity for this document DTD external subset. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the entity or NULL in case of error 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntityPtr 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *ExternalID, const xmlChar *SystemID, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *content) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntityPtr ret; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDtdPtr dtd; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErr(XML_DTD_NO_DOC, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlAddDtdEntity: document is NULL"); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->extSubset == NULL) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErr(XML_DTD_NO_DTD, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlAddDtdEntity: document without external subset"); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd = doc->extSubset; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) return(NULL); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Link it to the DTD 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->parent = dtd; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = dtd->doc; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dtd->last == NULL) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd->children = dtd->last = (xmlNodePtr) ret; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd->last->next = (xmlNodePtr) ret; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->prev = dtd->last; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd->last = (xmlNodePtr) ret; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlAddDocEntity: 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the entity name 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the entity type XML_xxx_yyy_ENTITY 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ExternalID: the entity external ID if available 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SystemID: the entity system ID if available 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content: the entity content 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register a new entity for this document. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the entity or NULL in case of error 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntityPtr 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *ExternalID, const xmlChar *SystemID, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *content) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntityPtr ret; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDtdPtr dtd; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErr(XML_DTD_NO_DOC, 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlAddDocEntity: document is NULL"); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->intSubset == NULL) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErr(XML_DTD_NO_DTD, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlAddDocEntity: document without internal subset"); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd = doc->intSubset; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) return(NULL); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Link it to the DTD 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->parent = dtd; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = dtd->doc; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dtd->last == NULL) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd->children = dtd->last = (xmlNodePtr) ret; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd->last->next = (xmlNodePtr) ret; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->prev = dtd->last; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd->last = (xmlNodePtr) ret; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNewEntity: 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the entity name 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type: the entity type XML_xxx_yyy_ENTITY 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ExternalID: the entity external ID if available 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SystemID: the entity system ID if available 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content: the entity content 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new entity, this differs from xmlAddDocEntity() that if 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the document is NULL or has no internal subset defined, then an 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * unlinked entity structure will be returned, it is then the responsability 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the caller to link it to the document later or free it when not needed 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * anymore. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the entity or NULL in case of error 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntityPtr 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *ExternalID, const xmlChar *SystemID, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *content) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntityPtr ret; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictPtr dict; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((doc != NULL) && (doc->intSubset != NULL)) { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content)); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc != NULL) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict = doc->dict; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict = NULL; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->doc = doc; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetEntityFromTable: 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @table: an entity table 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the entity name 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parameter: look for parameter entities 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do an entity lookup in the table. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns the corresponding parameter entity, if found. 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns A pointer to the entity structure or NULL if not found. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return((xmlEntityPtr) xmlHashLookup(table, name)); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetParameterEntity: 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document referencing the entity 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the entity name 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do an entity lookup in the internal and external subsets and 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns the corresponding parameter entity, if found. 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns A pointer to the entity structure or NULL if not found. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntityPtr 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesTablePtr table; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntityPtr ret; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = (xmlEntitiesTablePtr) doc->intSubset->pentities; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlGetEntityFromTable(table, name); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != NULL) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = (xmlEntitiesTablePtr) doc->extSubset->pentities; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlGetEntityFromTable(table, name)); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetDtdEntity: 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document referencing the entity 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the entity name 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do an entity lookup in the DTD entity hash table and 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns the corresponding entity, if found. 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note: the first argument is the document node, not the DTD node. 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns A pointer to the entity structure or NULL if not found. 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntityPtr 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesTablePtr table; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc == NULL) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = (xmlEntitiesTablePtr) doc->extSubset->entities; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlGetEntityFromTable(table, name)); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlGetDocEntity: 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document referencing the entity 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the entity name 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do an entity lookup in the document entity hash table and 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns the corresponding entity, otherwise a lookup is done 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the predefined entities too. 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns A pointer to the entity structure or NULL if not found. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntityPtr 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntityPtr cur; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesTablePtr table; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc != NULL) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = (xmlEntitiesTablePtr) doc->intSubset->entities; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlGetEntityFromTable(table, name); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->standalone != 1) { 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((doc->extSubset != NULL) && 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (doc->extSubset->entities != NULL)) { 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = (xmlEntitiesTablePtr) doc->extSubset->entities; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = xmlGetEntityFromTable(table, name); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlGetPredefinedEntity(name)); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Macro used to grow the current buffer. 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define growBufferReentrant() { \ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_size *= 2; \ 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer = (xmlChar *) \ 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlRealloc(buffer, buffer_size * sizeof(xmlChar)); \ 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer == NULL) { \ 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErrMemory("xmlEncodeEntitiesReentrant: realloc failed");\ 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); \ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \ 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlEncodeEntitiesReentrant: 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document containing the string 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input: A string to convert to XML. 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a global encoding of a string, replacing the predefined entities 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and non ASCII values with their entities and CharRef counterparts. 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Contrary to xmlEncodeEntities, this routine is reentrant, and result 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * must be deallocated. 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns A newly allocated string with the substitution done. 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) { 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *cur = input; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *buffer = NULL; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *out = NULL; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size = 0; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int html = 0; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) return(NULL); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc != NULL) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) html = (doc->type == XML_HTML_DOCUMENT_NODE); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * allocate an translation buffer. 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_size = 1000; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer == NULL) { 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErrMemory("xmlEncodeEntitiesReentrant: malloc failed"); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out = buffer; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*cur != '\0') { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out - buffer > buffer_size - 100) { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int indx = out - buffer; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) growBufferReentrant(); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out = &buffer[indx]; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * By default one have to encode at least '<', '>', '"' and '&' ! 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*cur == '<') { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '&'; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'l'; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 't'; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = ';'; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur == '>') { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '&'; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'g'; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 't'; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = ';'; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur == '&') { 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '&'; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'a'; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'm'; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'p'; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = ';'; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (((*cur >= 0x20) && (*cur < 0x80)) || 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * default case, just copy ! 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = *cur; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur >= 0x80) { 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((doc != NULL) && (doc->encoding != NULL)) || (html)) { 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Bjørn Reese <br@sseusa.com> provided the patch 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar xc; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xc = (*cur & 0x3F) << 6; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur[1] != 0) { 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xc += *(++cur) & 0x3F; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = xc; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = *cur; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We assume we have UTF-8 input. 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buf[11], *ptr; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int val = 0, l = 1; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*cur < 0xC0) { 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErr(XML_CHECK_NOT_UTF8, 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlEncodeEntitiesReentrant : input not UTF-8"); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc != NULL) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(buf, sizeof(buf), "&#%d;", *cur); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[sizeof(buf) - 1] = 0; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = buf; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*ptr != 0) *out++ = *ptr++; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur < 0xE0) { 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = (cur[0]) & 0x1F; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val <<= 6; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val |= (cur[1]) & 0x3F; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l = 2; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur < 0xF0) { 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = (cur[0]) & 0x0F; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val <<= 6; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val |= (cur[1]) & 0x3F; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val <<= 6; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val |= (cur[2]) & 0x3F; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l = 3; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur < 0xF8) { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = (cur[0]) & 0x07; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val <<= 6; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val |= (cur[1]) & 0x3F; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val <<= 6; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val |= (cur[2]) & 0x3F; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val <<= 6; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val |= (cur[3]) & 0x3F; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l = 4; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((l == 1) || (!IS_CHAR(val))) { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErr(XML_ERR_INVALID_CHAR, 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlEncodeEntitiesReentrant : char out of range\n"); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc != NULL) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(buf, sizeof(buf), "&#%d;", *cur); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[sizeof(buf) - 1] = 0; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = buf; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*ptr != 0) *out++ = *ptr++; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We could do multiple things here. Just save as a char ref 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(buf, sizeof(buf), "&#x%X;", val); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[sizeof(buf) - 1] = 0; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = buf; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*ptr != 0) *out++ = *ptr++; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur += l; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_BYTE_CHAR(*cur)) { 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buf[11], *ptr; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(buf, sizeof(buf), "&#%d;", *cur); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[sizeof(buf) - 1] = 0; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = buf; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*ptr != 0) *out++ = *ptr++; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out = 0; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(buffer); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlEncodeSpecialChars: 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the document containing the string 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @input: A string to convert to XML. 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a global encoding of a string, replacing the predefined entities 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this routine is reentrant, and result must be deallocated. 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns A newly allocated string with the substitution done. 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlChar * 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEncodeSpecialChars(xmlDocPtr doc ATTRIBUTE_UNUSED, const xmlChar *input) { 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *cur = input; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *buffer = NULL; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *out = NULL; 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size = 0; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input == NULL) return(NULL); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * allocate an translation buffer. 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_size = 1000; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer == NULL) { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed"); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out = buffer; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*cur != '\0') { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (out - buffer > buffer_size - 10) { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int indx = out - buffer; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) growBufferReentrant(); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out = &buffer[indx]; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * By default one have to encode at least '<', '>', '"' and '&' ! 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*cur == '<') { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '&'; 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'l'; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 't'; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = ';'; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur == '>') { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '&'; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'g'; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 't'; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = ';'; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur == '&') { 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '&'; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'a'; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'm'; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'p'; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = ';'; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur == '"') { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '&'; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'q'; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'u'; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 'o'; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = 't'; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = ';'; 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur == '\r') { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '&'; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '#'; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '1'; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = '3'; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = ';'; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Works because on UTF-8, all extended sequences cannot 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * result in bytes in the ASCII range. 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out++ = *cur; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out = 0; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(buffer); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCreateEntitiesTable: 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * create and initialize an empty entities hash table. 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This really doesn't make sense and should be deprecated 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xmlEntitiesTablePtr just created or NULL in case of error. 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntitiesTablePtr 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCreateEntitiesTable(void) { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return((xmlEntitiesTablePtr) xmlHashCreate(0)); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeEntityWrapper: 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @entity: An entity 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: its name 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate the memory used by an entities in the hash table. 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeEntityWrapper(xmlEntityPtr entity, 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *name ATTRIBUTE_UNUSED) { 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entity != NULL) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeEntity(entity); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlFreeEntitiesTable: 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @table: An entity table 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deallocate the memory used by an entities hash table. 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlFreeEntitiesTable(xmlEntitiesTablePtr table) { 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_TREE_ENABLED 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyEntity: 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ent: An entity 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Build a copy of an entity 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new xmlEntitiesPtr or NULL in case of error. 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlEntityPtr 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyEntity(xmlEntityPtr ent) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntityPtr cur; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) { 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed"); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(cur, 0, sizeof(xmlEntity)); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type = XML_ENTITY_DECL; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->etype = ent->etype; 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->name != NULL) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name = xmlStrdup(ent->name); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->ExternalID != NULL) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->ExternalID = xmlStrdup(ent->ExternalID); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->SystemID != NULL) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->SystemID = xmlStrdup(ent->SystemID); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->content != NULL) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content = xmlStrdup(ent->content); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->orig != NULL) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->orig = xmlStrdup(ent->orig); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->URI != NULL) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->URI = xmlStrdup(ent->URI); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlCopyEntitiesTable: 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @table: An entity table 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Build a copy of an entity table. 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new xmlEntitiesTablePtr or NULL in case of error. 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlEntitiesTablePtr 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlCopyEntitiesTable(xmlEntitiesTablePtr table) { 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity)); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_TREE_ENABLED */ 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_OUTPUT_ENABLED 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDumpEntityContent: 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf: An XML buffer. 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @content: The entity content. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This will dump the quoted string value, taking care of the special 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * treatment required by % 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrchr(content, '%')) { 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar * base, *cur; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferCCat(buf, "\""); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = cur = content; 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*cur != 0) { 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*cur == '"') { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != cur) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferAdd(buf, base, cur - base); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferAdd(buf, BAD_CAST """, 6); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = cur; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (*cur == '%') { 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != cur) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferAdd(buf, base, cur - base); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferAdd(buf, BAD_CAST "%", 6); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = cur; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur++; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != cur) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferAdd(buf, base, cur - base); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferCCat(buf, "\""); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, content); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDumpEntityDecl: 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf: An XML buffer. 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ent: An entity table 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This will dump the content of the entity table as an XML DTD definition 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) { 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((buf == NULL) || (ent == NULL)) return; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ent->etype) { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_GENERAL_ENTITY: 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, "<!ENTITY "); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteCHAR(buf, ent->name); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " "); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->orig != NULL) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->orig); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDumpEntityContent(buf, ent->content); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, ">\n"); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, "<!ENTITY "); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteCHAR(buf, ent->name); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->ExternalID != NULL) { 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " PUBLIC "); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->ExternalID); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " "); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->SystemID); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " SYSTEM "); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->SystemID); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, ">\n"); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, "<!ENTITY "); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteCHAR(buf, ent->name); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->ExternalID != NULL) { 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " PUBLIC "); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->ExternalID); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " "); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->SystemID); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " SYSTEM "); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->SystemID); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->content != NULL) { /* Should be true ! */ 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " NDATA "); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->orig != NULL) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteCHAR(buf, ent->orig); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteCHAR(buf, ent->content); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, ">\n"); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_INTERNAL_PARAMETER_ENTITY: 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, "<!ENTITY % "); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteCHAR(buf, ent->name); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " "); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->orig == NULL) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDumpEntityContent(buf, ent->content); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->orig); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, ">\n"); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_EXTERNAL_PARAMETER_ENTITY: 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, "<!ENTITY % "); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteCHAR(buf, ent->name); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ent->ExternalID != NULL) { 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " PUBLIC "); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->ExternalID); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " "); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->SystemID); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, " SYSTEM "); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteQuotedString(buf, ent->SystemID); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlBufferWriteChar(buf, ">\n"); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY, 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xmlDumpEntitiesDecl: internal: unknown type entity type"); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDumpEntityDeclScan: 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ent: An entity table 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf: An XML buffer. 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When using the hash table scan function, arguments need to be reversed 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) { 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDumpEntityDecl(buf, ent); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlDumpEntitiesTable: 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @buf: An XML buffer. 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @table: An entity table 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This will dump the content of the entity table as an XML DTD definition 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) { 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_OUTPUT_ENABLED */ 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define bottom_entities 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "elfgcchack.h" 1023