1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * entities.c : implementation for the XML entities handling 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h> 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h> 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h> 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/entities.h> 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h> 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h> 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/dict.h> 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 2594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#include "save.h" 2694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The XML predefined entities. 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntity xmlEntityLt = { 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, XML_ENTITY_DECL, BAD_CAST "lt", 3394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun NULL, NULL, NULL, NULL, NULL, NULL, 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "<", BAD_CAST "<", 1, 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_INTERNAL_PREDEFINED_ENTITY, 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, NULL, 0, 1 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntity xmlEntityGt = { 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, XML_ENTITY_DECL, BAD_CAST "gt", 4094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun NULL, NULL, NULL, NULL, NULL, NULL, 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST ">", BAD_CAST ">", 1, 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_INTERNAL_PREDEFINED_ENTITY, 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, NULL, 0, 1 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntity xmlEntityAmp = { 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, XML_ENTITY_DECL, BAD_CAST "amp", 4794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun NULL, NULL, NULL, NULL, NULL, NULL, 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "&", BAD_CAST "&", 1, 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_INTERNAL_PREDEFINED_ENTITY, 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, NULL, 0, 1 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntity xmlEntityQuot = { 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, XML_ENTITY_DECL, BAD_CAST "quot", 5494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun NULL, NULL, NULL, NULL, NULL, NULL, 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "\"", BAD_CAST "\"", 1, 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_INTERNAL_PREDEFINED_ENTITY, 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, NULL, 0, 1 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntity xmlEntityApos = { 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, XML_ENTITY_DECL, BAD_CAST "apos", 6194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun NULL, NULL, NULL, NULL, NULL, NULL, 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project BAD_CAST "'", BAD_CAST "'", 1, 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_INTERNAL_PREDEFINED_ENTITY, 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL, NULL, NULL, 0, 1 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlEntitiesErrMemory: 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntitiesErrMemory(const char *extra) 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlSimpleError(XML_FROM_TREE, XML_ERR_NO_MEMORY, NULL, NULL, extra); 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlEntitiesErr: 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @code: the error code 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntitiesErr(xmlParserErrors code, const char *msg) 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlSimpleError(XML_FROM_TREE, code, NULL, msg, NULL); 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeEntity : clean-up an entity record. 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeEntity(xmlEntityPtr entity) 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict = NULL; 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity == NULL) 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity->doc != NULL) 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dict = entity->doc->dict; 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entity->children) && (entity->owner == 1) && 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (entity == (xmlEntityPtr) entity->children->parent)) 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeNodeList(entity->children); 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict != NULL) { 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entity->name != NULL) && (!xmlDictOwns(dict, entity->name))) 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->name); 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entity->ExternalID != NULL) && 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlDictOwns(dict, entity->ExternalID))) 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->ExternalID); 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entity->SystemID != NULL) && 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (!xmlDictOwns(dict, entity->SystemID))) 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->SystemID); 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entity->URI != NULL) && (!xmlDictOwns(dict, entity->URI))) 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->URI); 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entity->content != NULL) 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project && (!xmlDictOwns(dict, entity->content))) 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->content); 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((entity->orig != NULL) && (!xmlDictOwns(dict, entity->orig))) 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->orig); 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity->name != NULL) 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->name); 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity->ExternalID != NULL) 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->ExternalID); 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity->SystemID != NULL) 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->SystemID); 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity->URI != NULL) 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->URI); 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity->content != NULL) 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->content); 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity->orig != NULL) 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char *) entity->orig); 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(entity); 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 14460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlCreateEntity: 14560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 14660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * internal routine doing the entity node strutures allocations 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntityPtr 14960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlCreateEntity(xmlDictPtr dict, const xmlChar *name, int type, 15060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott const xmlChar *ExternalID, const xmlChar *SystemID, 15160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott const xmlChar *content) { 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntityPtr ret; 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 15660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlEntitiesErrMemory("xmlCreateEntity: malloc failed"); 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlEntity)); 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_ENTITY_DECL; 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->checked = 0; 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * fill the structure. 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->etype = (xmlEntityType) type; 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dict == NULL) { 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlStrdup(name); 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ExternalID != NULL) 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ExternalID = xmlStrdup(ExternalID); 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (SystemID != NULL) 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->SystemID = xmlStrdup(SystemID); 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = xmlDictLookup(dict, name, -1); 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ExternalID != NULL) 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->ExternalID = xmlDictLookup(dict, ExternalID, -1); 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (SystemID != NULL) 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->SystemID = xmlDictLookup(dict, SystemID, -1); 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (content != NULL) { 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->length = xmlStrlen(content); 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((dict != NULL) && (ret->length < 5)) 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = (xmlChar *) 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictLookup(dict, content, ret->length); 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = xmlStrndup(content, ret->length); 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->length = 0; 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->content = NULL; 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->URI = NULL; /* to be computed by the layer knowing 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project the defining entity */ 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->orig = NULL; 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->owner = 0; 19560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 19660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(ret); 19760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 19860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 19960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/* 20060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlAddEntity : register a new entity for an entities table. 20160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 20260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlEntityPtr 20360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlAddEntity(xmlDtdPtr dtd, const xmlChar *name, int type, 20460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott const xmlChar *ExternalID, const xmlChar *SystemID, 20560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott const xmlChar *content) { 20660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlDictPtr dict = NULL; 20760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlEntitiesTablePtr table = NULL; 20860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlEntityPtr ret; 20960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 21060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (name == NULL) 21160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 21260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (dtd == NULL) 21360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 21460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (dtd->doc != NULL) 21560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott dict = dtd->doc->dict; 21660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 21760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott switch (type) { 21860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_INTERNAL_GENERAL_ENTITY: 21960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 22060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 22160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (dtd->entities == NULL) 22260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott dtd->entities = xmlHashCreateDict(0, dict); 22360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott table = dtd->entities; 22460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott break; 22560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_INTERNAL_PARAMETER_ENTITY: 22660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_EXTERNAL_PARAMETER_ENTITY: 22760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (dtd->pentities == NULL) 22860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott dtd->pentities = xmlHashCreateDict(0, dict); 22960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott table = dtd->pentities; 23060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott break; 23160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case XML_INTERNAL_PREDEFINED_ENTITY: 23260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 23360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 23460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (table == NULL) 23560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 23660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); 23760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret == NULL) 23860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = dtd->doc; 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlHashAddEntry(table, name, ret)) { 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * entity was already defined at another level. 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeEntity(ret); 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetPredefinedEntity: 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check whether this name is an predefined entity. 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns NULL if not, otherwise the entity 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntityPtr 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetPredefinedEntity(const xmlChar *name) { 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (name == NULL) return(NULL); 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (name[0]) { 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'l': 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "lt")) 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(&xmlEntityLt); 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'g': 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "gt")) 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(&xmlEntityGt); 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'a': 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "amp")) 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(&xmlEntityAmp); 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "apos")) 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(&xmlEntityApos); 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case 'q': 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrEqual(name, BAD_CAST "quot")) 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(&xmlEntityQuot); 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAddDtdEntity: 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the entity type XML_xxx_yyy_ENTITY 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ExternalID: the entity external ID if available 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @SystemID: the entity system ID if available 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: the entity content 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new entity for this document DTD external subset. 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to the entity or NULL in case of error 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntityPtr 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type, 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ExternalID, const xmlChar *SystemID, 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *content) { 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntityPtr ret; 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr dtd; 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesErr(XML_DTD_NO_DOC, 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddDtdEntity: document is NULL"); 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->extSubset == NULL) { 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesErr(XML_DTD_NO_DTD, 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddDtdEntity: document without external subset"); 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd = doc->extSubset; 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) return(NULL); 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Link it to the DTD 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = dtd; 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = dtd->doc; 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->last == NULL) { 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->children = dtd->last = (xmlNodePtr) ret; 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->last->next = (xmlNodePtr) ret; 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prev = dtd->last; 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->last = (xmlNodePtr) ret; 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlAddDocEntity: 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the entity type XML_xxx_yyy_ENTITY 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ExternalID: the entity external ID if available 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @SystemID: the entity system ID if available 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: the entity content 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new entity for this document. 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to the entity or NULL in case of error 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntityPtr 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type, 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *ExternalID, const xmlChar *SystemID, 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *content) { 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntityPtr ret; 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDtdPtr dtd; 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesErr(XML_DTD_NO_DOC, 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddDocEntity: document is NULL"); 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->intSubset == NULL) { 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesErr(XML_DTD_NO_DTD, 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlAddDocEntity: document without internal subset"); 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd = doc->intSubset; 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlAddEntity(dtd, name, type, ExternalID, SystemID, content); 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) return(NULL); 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Link it to the DTD 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->parent = dtd; 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = dtd->doc; 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (dtd->last == NULL) { 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->children = dtd->last = (xmlNodePtr) ret; 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->last->next = (xmlNodePtr) ret; 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->prev = dtd->last; 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project dtd->last = (xmlNodePtr) ret; 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 38660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlNewEntity: 38760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @doc: the document 38860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @name: the entity name 38960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @type: the entity type XML_xxx_yyy_ENTITY 39060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ExternalID: the entity external ID if available 39160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @SystemID: the entity system ID if available 39260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @content: the entity content 39360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 39460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Create a new entity, this differs from xmlAddDocEntity() that if 39560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * the document is NULL or has no internal subset defined, then an 39660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * unlinked entity structure will be returned, it is then the responsability 39760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * of the caller to link it to the document later or free it when not needed 39860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * anymore. 39960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 40060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Returns a pointer to the entity or NULL in case of error 40160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 40260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlEntityPtr 40360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type, 40460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott const xmlChar *ExternalID, const xmlChar *SystemID, 40560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott const xmlChar *content) { 40660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlEntityPtr ret; 40760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlDictPtr dict; 40860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 40960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((doc != NULL) && (doc->intSubset != NULL)) { 41060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content)); 41160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 41260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (doc != NULL) 41360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott dict = doc->dict; 41460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 41560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott dict = NULL; 41660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ret = xmlCreateEntity(dict, name, type, ExternalID, SystemID, content); 41760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ret == NULL) 41860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 41960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ret->doc = doc; 42060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(ret); 42160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 42260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 42360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/** 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetEntityFromTable: 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: an entity table 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parameter: look for parameter entities 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do an entity lookup in the table. 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the corresponding parameter entity, if found. 43194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns A pointer to the entity structure or NULL if not found. 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntityPtr 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) { 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlEntityPtr) xmlHashLookup(table, name)); 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetParameterEntity: 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document referencing the entity 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do an entity lookup in the internal and external subsets and 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the corresponding parameter entity, if found. 44694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns A pointer to the entity structure or NULL if not found. 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntityPtr 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) { 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesTablePtr table; 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntityPtr ret; 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) { 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlEntitiesTablePtr) doc->intSubset->pentities; 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlGetEntityFromTable(table, name); 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) { 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlEntitiesTablePtr) doc->extSubset->pentities; 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlGetEntityFromTable(table, name)); 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetDtdEntity: 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document referencing the entity 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do an entity lookup in the DTD entity hash table and 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the corresponding entity, if found. 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: the first argument is the document node, not the DTD node. 47794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns A pointer to the entity structure or NULL if not found. 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntityPtr 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) { 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesTablePtr table; 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) { 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlEntitiesTablePtr) doc->extSubset->entities; 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlGetEntityFromTable(table, name)); 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetDocEntity: 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document referencing the entity 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the entity name 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do an entity lookup in the document entity hash table and 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the corresponding entity, otherwise a lookup is done 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in the predefined entities too. 50194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns A pointer to the entity structure or NULL if not found. 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntityPtr 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetDocEntity(xmlDocPtr doc, const xmlChar *name) { 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntityPtr cur; 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesTablePtr table; 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc != NULL) { 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) { 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlEntitiesTablePtr) doc->intSubset->entities; 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlGetEntityFromTable(table, name); 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc->standalone != 1) { 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((doc->extSubset != NULL) && 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (doc->extSubset->entities != NULL)) { 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project table = (xmlEntitiesTablePtr) doc->extSubset->entities; 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlGetEntityFromTable(table, name); 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur != NULL) 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlGetPredefinedEntity(name)); 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Macro used to grow the current buffer. 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define growBufferReentrant() { \ 53394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlChar *tmp; \ 53494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun size_t new_size = buffer_size * 2; \ 53594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (new_size < buffer_size) goto mem_error; \ 53694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun tmp = (xmlChar *) xmlRealloc(buffer, new_size); \ 53794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (tmp == NULL) goto mem_error; \ 53894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun buffer = tmp; \ 53994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun buffer_size = new_size; \ 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 54394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * xmlEncodeEntitiesInternal: 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document containing the string 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: A string to convert to XML. 54694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @attr: are we handling an atrbute value 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do a global encoding of a string, replacing the predefined entities 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and non ASCII values with their entities and CharRef counterparts. 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Contrary to xmlEncodeEntities, this routine is reentrant, and result 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * must be deallocated. 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns A newly allocated string with the substitution done. 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 55594442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic xmlChar * 55694442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlEncodeEntitiesInternal(xmlDocPtr doc, const xmlChar *input, int attr) { 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur = input; 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer = NULL; 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *out = NULL; 56094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun size_t buffer_size = 0; 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int html = 0; 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) return(NULL); 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc != NULL) 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project html = (doc->type == XML_HTML_DOCUMENT_NODE); 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocate an translation buffer. 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer_size = 1000; 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { 57394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlEntitiesErrMemory("xmlEncodeEntities: malloc failed"); 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = buffer; 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != '\0') { 57994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun size_t indx = out - buffer; 58094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (indx + 100 > buffer_size) { 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project growBufferReentrant(); 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = &buffer[indx]; 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * By default one have to encode at least '<', '>', '"' and '&' ! 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '<') { 59094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun const xmlChar *end; 59194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 59294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* 59394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Special handling of server side include in HTML attributes 59494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */ 59594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (html && attr && 59694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun (cur[1] == '!') && (cur[2] == '-') && (cur[3] == '-') && 59794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ((end = xmlStrstr(cur, BAD_CAST "-->")) != NULL)) { 59894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun while (cur != end) { 59994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *out++ = *cur++; 60094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun indx = out - buffer; 60194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (indx + 100 > buffer_size) { 60294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun growBufferReentrant(); 60394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun out = &buffer[indx]; 60494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 60594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 60694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *out++ = *cur++; 60794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *out++ = *cur++; 60894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *out++ = *cur++; 60994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun continue; 61094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'l'; 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 't'; 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur == '>') { 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'g'; 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 't'; 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur == '&') { 62194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun /* 62294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Special handling of &{...} construct from HTML 4, see 62394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1 62494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */ 62594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (html && attr && (cur[1] == '{') && 62694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun (strchr((const char *) cur, '}'))) { 62794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun while (*cur != '}') { 62894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *out++ = *cur++; 62994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun indx = out - buffer; 63094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (indx + 100 > buffer_size) { 63194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun growBufferReentrant(); 63294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun out = &buffer[indx]; 63394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 63494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 63594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *out++ = *cur++; 63694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun continue; 63794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun } 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'a'; 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'm'; 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'p'; 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (((*cur >= 0x20) && (*cur < 0x80)) || 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) { 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * default case, just copy ! 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = *cur; 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur >= 0x80) { 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((doc != NULL) && (doc->encoding != NULL)) || (html)) { 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 65294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Bjørn Reese <br@sseusa.com> provided the patch 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar xc; 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xc = (*cur & 0x3F) << 6; 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur[1] != 0) { 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xc += *(++cur) & 0x3F; 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = xc; 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = *cur; 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We assume we have UTF-8 input. 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char buf[11], *ptr; 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int val = 0, l = 1; 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur < 0xC0) { 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesErr(XML_CHECK_NOT_UTF8, 67094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun "xmlEncodeEntities: input not UTF-8"); 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc != NULL) 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buf, sizeof(buf), "&#%d;", *cur); 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[sizeof(buf) - 1] = 0; 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr = buf; 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*ptr != 0) *out++ = *ptr++; 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur < 0xE0) { 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0]) & 0x1F; 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val <<= 6; 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1]) & 0x3F; 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = 2; 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur < 0xF0) { 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0]) & 0x0F; 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val <<= 6; 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1]) & 0x3F; 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val <<= 6; 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[2]) & 0x3F; 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = 3; 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur < 0xF8) { 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val = (cur[0]) & 0x07; 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val <<= 6; 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[1]) & 0x3F; 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val <<= 6; 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[2]) & 0x3F; 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val <<= 6; 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project val |= (cur[3]) & 0x3F; 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project l = 4; 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((l == 1) || (!IS_CHAR(val))) { 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesErr(XML_ERR_INVALID_CHAR, 70394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun "xmlEncodeEntities: char out of range\n"); 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc != NULL) 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buf, sizeof(buf), "&#%d;", *cur); 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[sizeof(buf) - 1] = 0; 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr = buf; 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*ptr != 0) *out++ = *ptr++; 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We could do multiple things here. Just save as a char ref 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buf, sizeof(buf), "&#x%X;", val); 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[sizeof(buf) - 1] = 0; 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr = buf; 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*ptr != 0) *out++ = *ptr++; 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur += l; 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_BYTE_CHAR(*cur)) { 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char buf[11], *ptr; 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(buf, sizeof(buf), "&#%d;", *cur); 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buf[sizeof(buf) - 1] = 0; 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ptr = buf; 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*ptr != 0) *out++ = *ptr++; 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 733df143a5041f03a22808b59c76698770b74692815Selim Gurun *out = 0; 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(buffer); 73594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 73694442ad4107000e6d49f9b85a46a591495a57632Selim Gurunmem_error: 73794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlEntitiesErrMemory("xmlEncodeEntities: realloc failed"); 73894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlFree(buffer); 73994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return(NULL); 74094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun} 74194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 74294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun/** 74394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * xmlEncodeAttributeEntities: 74494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @doc: the document containing the string 74594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @input: A string to convert to XML. 74694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 74794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Do a global encoding of a string, replacing the predefined entities 74894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * and non ASCII values with their entities and CharRef counterparts for 74994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * attribute values. 75094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 75194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Returns A newly allocated string with the substitution done. 75294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */ 75394442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlChar * 75494442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlEncodeAttributeEntities(xmlDocPtr doc, const xmlChar *input) { 75594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return xmlEncodeEntitiesInternal(doc, input, 1); 75694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun} 75794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 75894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun/** 75994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * xmlEncodeEntitiesReentrant: 76094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @doc: the document containing the string 76194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @input: A string to convert to XML. 76294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 76394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Do a global encoding of a string, replacing the predefined entities 76494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * and non ASCII values with their entities and CharRef counterparts. 76594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Contrary to xmlEncodeEntities, this routine is reentrant, and result 76694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * must be deallocated. 76794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 76894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * Returns A newly allocated string with the substitution done. 76994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun */ 77094442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlChar * 77194442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) { 77294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return xmlEncodeEntitiesInternal(doc, input, 0); 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlEncodeSpecialChars: 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the document containing the string 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input: A string to convert to XML. 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do a global encoding of a string, replacing the predefined entities 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this routine is reentrant, and result must be deallocated. 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns A newly allocated string with the substitution done. 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar * 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEncodeSpecialChars(xmlDocPtr doc ATTRIBUTE_UNUSED, const xmlChar *input) { 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *cur = input; 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *buffer = NULL; 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *out = NULL; 79094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun size_t buffer_size = 0; 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (input == NULL) return(NULL); 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocate an translation buffer. 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer_size = 1000; 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project buffer = (xmlChar *) xmlMalloc(buffer_size * sizeof(xmlChar)); 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buffer == NULL) { 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesErrMemory("xmlEncodeSpecialChars: malloc failed"); 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = buffer; 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != '\0') { 80594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun size_t indx = out - buffer; 80694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (indx + 10 > buffer_size) { 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project growBufferReentrant(); 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project out = &buffer[indx]; 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * By default one have to encode at least '<', '>', '"' and '&' ! 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '<') { 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'l'; 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 't'; 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur == '>') { 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'g'; 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 't'; 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur == '&') { 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'a'; 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'm'; 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'p'; 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur == '"') { 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'q'; 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'u'; 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 'o'; 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = 't'; 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur == '\r') { 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '&'; 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '#'; 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '1'; 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = '3'; 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = ';'; 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Works because on UTF-8, all extended sequences cannot 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * result in bytes in the ASCII range. 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *out++ = *cur; 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 853df143a5041f03a22808b59c76698770b74692815Selim Gurun *out = 0; 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(buffer); 85594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 85694442ad4107000e6d49f9b85a46a591495a57632Selim Gurunmem_error: 85794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlEntitiesErrMemory("xmlEncodeSpecialChars: realloc failed"); 85894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun xmlFree(buffer); 85994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun return(NULL); 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCreateEntitiesTable: 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * create and initialize an empty entities hash table. 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This really doesn't make sense and should be deprecated 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlEntitiesTablePtr just created or NULL in case of error. 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntitiesTablePtr 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCreateEntitiesTable(void) { 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return((xmlEntitiesTablePtr) xmlHashCreate(0)); 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeEntityWrapper: 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @entity: An entity 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: its name 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an entities in the hash table. 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeEntityWrapper(xmlEntityPtr entity, 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name ATTRIBUTE_UNUSED) { 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (entity != NULL) 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeEntity(entity); 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeEntitiesTable: 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An entity table 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate the memory used by an entities hash table. 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeEntitiesTable(xmlEntitiesTablePtr table) { 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashFree(table, (xmlHashDeallocator) xmlFreeEntityWrapper); 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_TREE_ENABLED 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyEntity: 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ent: An entity 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of an entity 90694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlEntitiesPtr or NULL in case of error. 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntityPtr 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyEntity(xmlEntityPtr ent) { 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntityPtr cur; 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) { 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesErrMemory("xmlCopyEntity:: malloc failed"); 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(cur, 0, sizeof(xmlEntity)); 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->type = XML_ENTITY_DECL; 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->etype = ent->etype; 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->name != NULL) 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name = xmlStrdup(ent->name); 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->ExternalID != NULL) 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->ExternalID = xmlStrdup(ent->ExternalID); 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->SystemID != NULL) 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->SystemID = xmlStrdup(ent->SystemID); 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->content != NULL) 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->content = xmlStrdup(ent->content); 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->orig != NULL) 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->orig = xmlStrdup(ent->orig); 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->URI != NULL) 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->URI = xmlStrdup(ent->URI); 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCopyEntitiesTable: 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An entity table 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build a copy of an entity table. 94294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new xmlEntitiesTablePtr or NULL in case of error. 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlEntitiesTablePtr 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCopyEntitiesTable(xmlEntitiesTablePtr table) { 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlHashCopy(table, (xmlHashCopier) xmlCopyEntity)); 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_TREE_ENABLED */ 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpEntityContent: 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: An XML buffer. 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: The entity content. 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the quoted string value, taking care of the special 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * treatment required by % 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpEntityContent(xmlBufferPtr buf, const xmlChar *content) { 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return; 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlStrchr(content, '%')) { 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar * base, *cur; 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferCCat(buf, "\""); 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = cur = content; 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (*cur != 0) { 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (*cur == '"') { 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != cur) 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(buf, base, cur - base); 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(buf, BAD_CAST """, 6); 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = cur; 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (*cur == '%') { 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != cur) 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(buf, base, cur - base); 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(buf, BAD_CAST "%", 6); 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = cur; 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur++; 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != cur) 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferAdd(buf, base, cur - base); 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferCCat(buf, "\""); 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, content); 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpEntityDecl: 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: An XML buffer. 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ent: An entity table 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the entity table as an XML DTD definition 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) { 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buf == NULL) || (ent == NULL)) return; 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ent->etype) { 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_INTERNAL_GENERAL_ENTITY: 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ENTITY "); 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, ent->name); 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->orig != NULL) 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->orig); 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpEntityContent(buf, ent->content); 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ">\n"); 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXTERNAL_GENERAL_PARSED_ENTITY: 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ENTITY "); 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, ent->name); 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->ExternalID != NULL) { 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " PUBLIC "); 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->ExternalID); 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->SystemID); 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " SYSTEM "); 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->SystemID); 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ">\n"); 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY: 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ENTITY "); 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, ent->name); 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->ExternalID != NULL) { 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " PUBLIC "); 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->ExternalID); 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->SystemID); 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " SYSTEM "); 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->SystemID); 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->content != NULL) { /* Should be true ! */ 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " NDATA "); 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->orig != NULL) 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, ent->orig); 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, ent->content); 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ">\n"); 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_INTERNAL_PARAMETER_ENTITY: 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ENTITY % "); 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, ent->name); 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->orig == NULL) 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpEntityContent(buf, ent->content); 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->orig); 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ">\n"); 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XML_EXTERNAL_PARAMETER_ENTITY: 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, "<!ENTITY % "); 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteCHAR(buf, ent->name); 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ent->ExternalID != NULL) { 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " PUBLIC "); 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->ExternalID); 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " "); 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->SystemID); 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, " SYSTEM "); 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteQuotedString(buf, ent->SystemID); 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferWriteChar(buf, ">\n"); 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project default: 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlEntitiesErr(XML_DTD_UNKNOWN_ENTITY, 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlDumpEntitiesDecl: internal: unknown type entity type"); 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpEntityDeclScan: 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ent: An entity table 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: An XML buffer. 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * When using the hash table scan function, arguments need to be reversed 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpEntityDeclScan(xmlEntityPtr ent, xmlBufferPtr buf) { 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDumpEntityDecl(buf, ent); 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 109194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlDumpEntitiesTable: 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: An XML buffer. 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @table: An entity table 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will dump the content of the entity table as an XML DTD definition 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) { 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlHashScan(table, (xmlHashScanner)xmlDumpEntityDeclScan, buf); 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */ 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_entities 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 1106