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