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 "&quot;", 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 "&#x25;", 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