⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 entities.c

📁 libxml,在UNIX/LINUX下非常重要的一个库,为XML相关应用提供方便.目前上载的是最新版本,若要取得最新版本,请参考里面的readme.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * entities.c : implementation for the XML entities handling * * See Copyright for the status of this software. * * daniel@veillard.com */#define IN_LIBXML#include "libxml.h"#include <string.h>#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif#include <libxml/xmlmemory.h>#include <libxml/hash.h>#include <libxml/entities.h>#include <libxml/parser.h>#include <libxml/parserInternals.h>#include <libxml/xmlerror.h>#include <libxml/globals.h>#include <libxml/dict.h>/* * The XML predefined entities. */static xmlEntity xmlEntityLt = {    NULL, XML_ENTITY_DECL, BAD_CAST "lt",    NULL, NULL, NULL, NULL, NULL, NULL,     BAD_CAST "<", BAD_CAST "<", 1,    XML_INTERNAL_PREDEFINED_ENTITY,    NULL, NULL, NULL, NULL, 0};static xmlEntity xmlEntityGt = {    NULL, XML_ENTITY_DECL, BAD_CAST "gt",    NULL, NULL, NULL, NULL, NULL, NULL,     BAD_CAST ">", BAD_CAST ">", 1,    XML_INTERNAL_PREDEFINED_ENTITY,    NULL, NULL, NULL, NULL, 0};static xmlEntity xmlEntityAmp = {    NULL, XML_ENTITY_DECL, BAD_CAST "amp",    NULL, NULL, NULL, NULL, NULL, NULL,     BAD_CAST "&", BAD_CAST "&", 1,    XML_INTERNAL_PREDEFINED_ENTITY,    NULL, NULL, NULL, NULL, 0};static xmlEntity xmlEntityQuot = {    NULL, XML_ENTITY_DECL, BAD_CAST "quot",    NULL, NULL, NULL, NULL, NULL, NULL,     BAD_CAST "\"", BAD_CAST "\"", 1,    XML_INTERNAL_PREDEFINED_ENTITY,    NULL, NULL, NULL, NULL, 0};static xmlEntity xmlEntityApos = {    NULL, XML_ENTITY_DECL, BAD_CAST "apos",    NULL, NULL, NULL, NULL, NULL, NULL,     BAD_CAST "'", BAD_CAST "'", 1,    XML_INTERNAL_PREDEFINED_ENTITY,    NULL, NULL, NULL, NULL, 0};/** * xmlEntitiesErrMemory: * @extra:  extra informations * * Handle an out of memory condition */static voidxmlEntitiesErrMemory(const char *extra){    __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra);}/** * xmlEntitiesErr: * @code:  the error code * @msg:  the message * * Handle an out of memory condition */static voidxmlEntitiesErr(xmlParserErrors code, const char *msg){    __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL);}/* * xmlFreeEntity : clean-up an entity record. */static voidxmlFreeEntity(xmlEntityPtr entity){    xmlDictPtr dict = NULL;    if (entity == NULL)        return;    if (entity->doc != NULL)        dict = entity->doc->dict;    if ((entity->children) && (entity->owner == 1) &&        (entity == (xmlEntityPtr) entity->children->parent))        xmlFreeNodeList(entity->children);    if (dict != NULL) {        if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name)))            xmlFree((char *) entity->name);        if ((entity->ExternalID != NULL) &&	    (!xmlDictOwns(dict, entity->ExternalID)))            xmlFree((char *) entity->ExternalID);        if ((entity->SystemID != NULL) &&	    (!xmlDictOwns(dict, entity->SystemID)))            xmlFree((char *) entity->SystemID);        if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI)))            xmlFree((char *) entity->URI);        if ((entity->content != NULL)            && (!xmlDictOwns(dict, entity->content)))            xmlFree((char *) entity->content);        if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig)))            xmlFree((char *) entity->orig);    } else {        if (entity->name != NULL)            xmlFree((char *) entity->name);        if (entity->ExternalID != NULL)            xmlFree((char *) entity->ExternalID);        if (entity->SystemID != NULL)            xmlFree((char *) entity->SystemID);        if (entity->URI != NULL)            xmlFree((char *) entity->URI);        if (entity->content != NULL)            xmlFree((char *) entity->content);        if (entity->orig != NULL)            xmlFree((char *) entity->orig);    }    xmlFree(entity);}/* * xmlAddEntity : register a new entity for an entities table. */static xmlEntityPtrxmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type,	  const xmlChar *ExternalID, const xmlChar *SystemID,	  const xmlChar *content) {    xmlDictPtr dict = NULL;    xmlEntitiesTablePtr table = NULL;    xmlEntityPtr ret;    if (name == NULL)	return(NULL);    if (dtd == NULL)	return(NULL);    if (dtd->doc != NULL)        dict = dtd->doc->dict;    switch (type) {        case XML_INTERNAL_GENERAL_ENTITY:        case XML_EXTERNAL_GENERAL_PARSED_ENTITY:        case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:	    if (dtd->entities == NULL)		dtd->entities = xmlHashCreateDict(0, dict);	    table = dtd->entities;	    break;        case XML_INTERNAL_PARAMETER_ENTITY:        case XML_EXTERNAL_PARAMETER_ENTITY:	    if (dtd->pentities == NULL)		dtd->pentities = xmlHashCreateDict(0, dict);	    table = dtd->pentities;	    break;        case XML_INTERNAL_PREDEFINED_ENTITY:	    return(NULL);    }    if (table == NULL)	return(NULL);    ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));    if (ret == NULL) {        xmlEntitiesErrMemory("xmlAddEntity:: malloc failed");	return(NULL);    }    memset(ret, 0, sizeof(xmlEntity));    ret->type = XML_ENTITY_DECL;    /*     * fill the structure.     */    ret->etype = (xmlEntityType) type;    if (dict == NULL) {	ret->name = xmlStrdup(name);	if (ExternalID != NULL)	    ret->ExternalID = xmlStrdup(ExternalID);	if (SystemID != NULL)	    ret->SystemID = xmlStrdup(SystemID);    } else {        ret->name = xmlDictLookup(dict, name, -1);	if (ExternalID != NULL)	    ret->ExternalID = xmlDictLookup(dict, ExternalID, -1);	if (SystemID != NULL)	    ret->SystemID = xmlDictLookup(dict, SystemID, -1);    }    if (content != NULL) {        ret->length = xmlStrlen(content);	if ((dict != NULL) && (ret->length < 5))	    ret->content = (xmlChar *)	                   xmlDictLookup(dict, content, ret->length);	else	    ret->content = xmlStrndup(content, ret->length);     } else {        ret->length = 0;        ret->content = NULL;    }    ret->URI = NULL; /* to be computed by the layer knowing			the defining entity */    ret->orig = NULL;    ret->owner = 0;    ret->doc = dtd->doc;    if (xmlHashAddEntry(table, name, ret)) {	/*	 * entity was already defined at another level.	 */        xmlFreeEntity(ret);	return(NULL);    }    return(ret);}/** * xmlGetPredefinedEntity: * @name:  the entity name * * Check whether this name is an predefined entity. * * Returns NULL if not, otherwise the entity */xmlEntityPtrxmlGetPredefinedEntity(const xmlChar *name) {    if (name == NULL) return(NULL);    switch (name[0]) {        case 'l':	    if (xmlStrEqual(name, BAD_CAST "lt"))	        return(&xmlEntityLt);	    break;        case 'g':	    if (xmlStrEqual(name, BAD_CAST "gt"))	        return(&xmlEntityGt);	    break;        case 'a':	    if (xmlStrEqual(name, BAD_CAST "amp"))	        return(&xmlEntityAmp);	    if (xmlStrEqual(name, BAD_CAST "apos"))	        return(&xmlEntityApos);	    break;        case 'q':	    if (xmlStrEqual(name, BAD_CAST "quot"))	        return(&xmlEntityQuot);	    break;	default:	    break;    }    return(NULL);}/** * xmlAddDtdEntity: * @doc:  the document * @name:  the entity name * @type:  the entity type XML_xxx_yyy_ENTITY * @ExternalID:  the entity external ID if available * @SystemID:  the entity system ID if available * @content:  the entity content * * Register a new entity for this document DTD external subset. * * Returns a pointer to the entity or NULL in case of error */xmlEntityPtrxmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type,	        const xmlChar *ExternalID, const xmlChar *SystemID,		const xmlChar *content) {    xmlEntityPtr ret;    xmlDtdPtr dtd;    if (doc == NULL) {	xmlEntitiesErr(XML_DTD_NO_DOC,	        "xmlAddDtdEntity: document is NULL");	return(NULL);    }    if (doc->extSubset == NULL) {	xmlEntitiesErr(XML_DTD_NO_DTD,	        "xmlAddDtdEntity: document without external subset");	return(NULL);    }    dtd = doc->extSubset;    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);    if (ret == NULL) return(NULL);    /*     * Link it to the DTD     */    ret->parent = dtd;    ret->doc = dtd->doc;    if (dtd->last == NULL) {	dtd->children = dtd->last = (xmlNodePtr) ret;    } else {        dtd->last->next = (xmlNodePtr) ret;	ret->prev = dtd->last;	dtd->last = (xmlNodePtr) ret;    }    return(ret);}/** * xmlAddDocEntity: * @doc:  the document * @name:  the entity name * @type:  the entity type XML_xxx_yyy_ENTITY * @ExternalID:  the entity external ID if available * @SystemID:  the entity system ID if available * @content:  the entity content * * Register a new entity for this document. * * Returns a pointer to the entity or NULL in case of error */xmlEntityPtrxmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type,	        const xmlChar *ExternalID, const xmlChar *SystemID,	        const xmlChar *content) {    xmlEntityPtr ret;    xmlDtdPtr dtd;    if (doc == NULL) {	xmlEntitiesErr(XML_DTD_NO_DOC,	        "xmlAddDocEntity: document is NULL");	return(NULL);    }    if (doc->intSubset == NULL) {	xmlEntitiesErr(XML_DTD_NO_DTD,	        "xmlAddDocEntity: document without internal subset");	return(NULL);    }    dtd = doc->intSubset;    ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content);    if (ret == NULL) return(NULL);    /*     * Link it to the DTD     */    ret->parent = dtd;    ret->doc = dtd->doc;    if (dtd->last == NULL) {	dtd->children = dtd->last = (xmlNodePtr) ret;    } else {	dtd->last->next = (xmlNodePtr) ret;	ret->prev = dtd->last;	dtd->last = (xmlNodePtr) ret;    }    return(ret);}/** * xmlGetEntityFromTable: * @table:  an entity table * @name:  the entity name * @parameter:  look for parameter entities * * Do an entity lookup in the table. * returns the corresponding parameter entity, if found. *  * Returns A pointer to the entity structure or NULL if not found. */static xmlEntityPtrxmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) {    return((xmlEntityPtr) xmlHashLookup(table, name));}/** * xmlGetParameterEntity: * @doc:  the document referencing the entity * @name:  the entity name * * Do an entity lookup in the internal and external subsets and * returns the corresponding parameter entity, if found. *  * Returns A pointer to the entity structure or NULL if not found. */xmlEntityPtrxmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) {    xmlEntitiesTablePtr table;    xmlEntityPtr ret;    if (doc == NULL)	return(NULL);    if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) {	table = (xmlEntitiesTablePtr) doc->intSubset->pentities;	ret = xmlGetEntityFromTable(table, name);	if (ret != NULL)	    return(ret);    }    if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) {	table = (xmlEntitiesTablePtr) doc->extSubset->pentities;	return(xmlGetEntityFromTable(table, name));    }    return(NULL);}/** * xmlGetDtdEntity: * @doc:  the document referencing the entity * @name:  the entity name * * Do an entity lookup in the DTD entity hash table and * returns the corresponding entity, if found. * Note: the first argument is the document node, not the DTD node. *  * Returns A pointer to the entity structure or NULL if not found. */xmlEntityPtrxmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) {    xmlEntitiesTablePtr table;    if (doc == NULL)	return(NULL);    if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {	table = (xmlEntitiesTablePtr) doc->extSubset->entities;	return(xmlGetEntityFromTable(table, name));    }    return(NULL);}/** * xmlGetDocEntity: * @doc:  the document referencing the entity * @name:  the entity name * * Do an entity lookup in the document entity hash table and * returns the corresponding entity, otherwise a lookup is done * in the predefined entities too. *  * Returns A pointer to the entity structure or NULL if not found. */xmlEntityPtrxmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) {    xmlEntityPtr cur;    xmlEntitiesTablePtr table;    if (doc != NULL) {	if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {	    table = (xmlEntitiesTablePtr) doc->intSubset->entities;	    cur = xmlGetEntityFromTable(table, name);	    if (cur != NULL)		return(cur);	}	if (doc->standalone != 1) {	    if ((doc->extSubset != NULL) &&		(doc->extSubset->entities != NULL)) {		table = (xmlEntitiesTablePtr) doc->extSubset->entities;		cur = xmlGetEntityFromTable(table, name);		if (cur != NULL)		    return(cur);	    }	}    }    return(xmlGetPredefinedEntity(name));}/* * Macro used to grow the current buffer. */#define growBufferReentrant() {						\    buffer_size *= 2;							\    buffer = (xmlChar *)						\    		xmlRealloc(buffer, buffer_size * sizeof(xmlChar));	\    if (buffer == NULL) {						\        xmlEntitiesErrMemory("xmlEncodeEntitiesReentrant: realloc failed");\	return(NULL);							\    }									\}/** * xmlEncodeEntitiesReentrant:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -