1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker * entities.c : implementation for the XML entities handling
3*7c568831SAndroid Build Coastguard Worker *
4*7c568831SAndroid Build Coastguard Worker * See Copyright for the status of this software.
5*7c568831SAndroid Build Coastguard Worker *
6*7c568831SAndroid Build Coastguard Worker * [email protected]
7*7c568831SAndroid Build Coastguard Worker */
8*7c568831SAndroid Build Coastguard Worker
9*7c568831SAndroid Build Coastguard Worker /* To avoid EBCDIC trouble when parsing on zOS */
10*7c568831SAndroid Build Coastguard Worker #if defined(__MVS__)
11*7c568831SAndroid Build Coastguard Worker #pragma convert("ISO8859-1")
12*7c568831SAndroid Build Coastguard Worker #endif
13*7c568831SAndroid Build Coastguard Worker
14*7c568831SAndroid Build Coastguard Worker #define IN_LIBXML
15*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
16*7c568831SAndroid Build Coastguard Worker
17*7c568831SAndroid Build Coastguard Worker #include <string.h>
18*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
19*7c568831SAndroid Build Coastguard Worker
20*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
21*7c568831SAndroid Build Coastguard Worker #include <libxml/hash.h>
22*7c568831SAndroid Build Coastguard Worker #include <libxml/entities.h>
23*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
24*7c568831SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
25*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
26*7c568831SAndroid Build Coastguard Worker #include <libxml/dict.h>
27*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlsave.h>
28*7c568831SAndroid Build Coastguard Worker
29*7c568831SAndroid Build Coastguard Worker #include "private/entities.h"
30*7c568831SAndroid Build Coastguard Worker #include "private/error.h"
31*7c568831SAndroid Build Coastguard Worker
32*7c568831SAndroid Build Coastguard Worker /*
33*7c568831SAndroid Build Coastguard Worker * The XML predefined entities.
34*7c568831SAndroid Build Coastguard Worker */
35*7c568831SAndroid Build Coastguard Worker
36*7c568831SAndroid Build Coastguard Worker static xmlEntity xmlEntityLt = {
37*7c568831SAndroid Build Coastguard Worker NULL, XML_ENTITY_DECL, BAD_CAST "lt",
38*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, NULL, NULL,
39*7c568831SAndroid Build Coastguard Worker BAD_CAST "<", BAD_CAST "<", 1,
40*7c568831SAndroid Build Coastguard Worker XML_INTERNAL_PREDEFINED_ENTITY,
41*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, 0, 0, 0
42*7c568831SAndroid Build Coastguard Worker };
43*7c568831SAndroid Build Coastguard Worker static xmlEntity xmlEntityGt = {
44*7c568831SAndroid Build Coastguard Worker NULL, XML_ENTITY_DECL, BAD_CAST "gt",
45*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, NULL, NULL,
46*7c568831SAndroid Build Coastguard Worker BAD_CAST ">", BAD_CAST ">", 1,
47*7c568831SAndroid Build Coastguard Worker XML_INTERNAL_PREDEFINED_ENTITY,
48*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, 0, 0, 0
49*7c568831SAndroid Build Coastguard Worker };
50*7c568831SAndroid Build Coastguard Worker static xmlEntity xmlEntityAmp = {
51*7c568831SAndroid Build Coastguard Worker NULL, XML_ENTITY_DECL, BAD_CAST "amp",
52*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, NULL, NULL,
53*7c568831SAndroid Build Coastguard Worker BAD_CAST "&", BAD_CAST "&", 1,
54*7c568831SAndroid Build Coastguard Worker XML_INTERNAL_PREDEFINED_ENTITY,
55*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, 0, 0, 0
56*7c568831SAndroid Build Coastguard Worker };
57*7c568831SAndroid Build Coastguard Worker static xmlEntity xmlEntityQuot = {
58*7c568831SAndroid Build Coastguard Worker NULL, XML_ENTITY_DECL, BAD_CAST "quot",
59*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, NULL, NULL,
60*7c568831SAndroid Build Coastguard Worker BAD_CAST "\"", BAD_CAST "\"", 1,
61*7c568831SAndroid Build Coastguard Worker XML_INTERNAL_PREDEFINED_ENTITY,
62*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, 0, 0, 0
63*7c568831SAndroid Build Coastguard Worker };
64*7c568831SAndroid Build Coastguard Worker static xmlEntity xmlEntityApos = {
65*7c568831SAndroid Build Coastguard Worker NULL, XML_ENTITY_DECL, BAD_CAST "apos",
66*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, NULL, NULL,
67*7c568831SAndroid Build Coastguard Worker BAD_CAST "'", BAD_CAST "'", 1,
68*7c568831SAndroid Build Coastguard Worker XML_INTERNAL_PREDEFINED_ENTITY,
69*7c568831SAndroid Build Coastguard Worker NULL, NULL, NULL, NULL, 0, 0, 0
70*7c568831SAndroid Build Coastguard Worker };
71*7c568831SAndroid Build Coastguard Worker
72*7c568831SAndroid Build Coastguard Worker /*
73*7c568831SAndroid Build Coastguard Worker * xmlFreeEntity:
74*7c568831SAndroid Build Coastguard Worker * @entity: an entity
75*7c568831SAndroid Build Coastguard Worker *
76*7c568831SAndroid Build Coastguard Worker * Frees the entity.
77*7c568831SAndroid Build Coastguard Worker */
78*7c568831SAndroid Build Coastguard Worker void
xmlFreeEntity(xmlEntityPtr entity)79*7c568831SAndroid Build Coastguard Worker xmlFreeEntity(xmlEntityPtr entity)
80*7c568831SAndroid Build Coastguard Worker {
81*7c568831SAndroid Build Coastguard Worker xmlDictPtr dict = NULL;
82*7c568831SAndroid Build Coastguard Worker
83*7c568831SAndroid Build Coastguard Worker if (entity == NULL)
84*7c568831SAndroid Build Coastguard Worker return;
85*7c568831SAndroid Build Coastguard Worker
86*7c568831SAndroid Build Coastguard Worker if (entity->doc != NULL)
87*7c568831SAndroid Build Coastguard Worker dict = entity->doc->dict;
88*7c568831SAndroid Build Coastguard Worker
89*7c568831SAndroid Build Coastguard Worker
90*7c568831SAndroid Build Coastguard Worker if ((entity->children) &&
91*7c568831SAndroid Build Coastguard Worker (entity == (xmlEntityPtr) entity->children->parent))
92*7c568831SAndroid Build Coastguard Worker xmlFreeNodeList(entity->children);
93*7c568831SAndroid Build Coastguard Worker if ((entity->name != NULL) &&
94*7c568831SAndroid Build Coastguard Worker ((dict == NULL) || (!xmlDictOwns(dict, entity->name))))
95*7c568831SAndroid Build Coastguard Worker xmlFree((char *) entity->name);
96*7c568831SAndroid Build Coastguard Worker if (entity->ExternalID != NULL)
97*7c568831SAndroid Build Coastguard Worker xmlFree((char *) entity->ExternalID);
98*7c568831SAndroid Build Coastguard Worker if (entity->SystemID != NULL)
99*7c568831SAndroid Build Coastguard Worker xmlFree((char *) entity->SystemID);
100*7c568831SAndroid Build Coastguard Worker if (entity->URI != NULL)
101*7c568831SAndroid Build Coastguard Worker xmlFree((char *) entity->URI);
102*7c568831SAndroid Build Coastguard Worker if (entity->content != NULL)
103*7c568831SAndroid Build Coastguard Worker xmlFree((char *) entity->content);
104*7c568831SAndroid Build Coastguard Worker if (entity->orig != NULL)
105*7c568831SAndroid Build Coastguard Worker xmlFree((char *) entity->orig);
106*7c568831SAndroid Build Coastguard Worker xmlFree(entity);
107*7c568831SAndroid Build Coastguard Worker }
108*7c568831SAndroid Build Coastguard Worker
109*7c568831SAndroid Build Coastguard Worker /*
110*7c568831SAndroid Build Coastguard Worker * xmlCreateEntity:
111*7c568831SAndroid Build Coastguard Worker *
112*7c568831SAndroid Build Coastguard Worker * internal routine doing the entity node structures allocations
113*7c568831SAndroid Build Coastguard Worker */
114*7c568831SAndroid Build Coastguard Worker static xmlEntityPtr
xmlCreateEntity(xmlDocPtr doc,const xmlChar * name,int type,const xmlChar * ExternalID,const xmlChar * SystemID,const xmlChar * content)115*7c568831SAndroid Build Coastguard Worker xmlCreateEntity(xmlDocPtr doc, const xmlChar *name, int type,
116*7c568831SAndroid Build Coastguard Worker const xmlChar *ExternalID, const xmlChar *SystemID,
117*7c568831SAndroid Build Coastguard Worker const xmlChar *content) {
118*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ret;
119*7c568831SAndroid Build Coastguard Worker
120*7c568831SAndroid Build Coastguard Worker ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
121*7c568831SAndroid Build Coastguard Worker if (ret == NULL)
122*7c568831SAndroid Build Coastguard Worker return(NULL);
123*7c568831SAndroid Build Coastguard Worker memset(ret, 0, sizeof(xmlEntity));
124*7c568831SAndroid Build Coastguard Worker ret->doc = doc;
125*7c568831SAndroid Build Coastguard Worker ret->type = XML_ENTITY_DECL;
126*7c568831SAndroid Build Coastguard Worker
127*7c568831SAndroid Build Coastguard Worker /*
128*7c568831SAndroid Build Coastguard Worker * fill the structure.
129*7c568831SAndroid Build Coastguard Worker */
130*7c568831SAndroid Build Coastguard Worker ret->etype = (xmlEntityType) type;
131*7c568831SAndroid Build Coastguard Worker if ((doc == NULL) || (doc->dict == NULL))
132*7c568831SAndroid Build Coastguard Worker ret->name = xmlStrdup(name);
133*7c568831SAndroid Build Coastguard Worker else
134*7c568831SAndroid Build Coastguard Worker ret->name = xmlDictLookup(doc->dict, name, -1);
135*7c568831SAndroid Build Coastguard Worker if (ret->name == NULL)
136*7c568831SAndroid Build Coastguard Worker goto error;
137*7c568831SAndroid Build Coastguard Worker if (ExternalID != NULL) {
138*7c568831SAndroid Build Coastguard Worker ret->ExternalID = xmlStrdup(ExternalID);
139*7c568831SAndroid Build Coastguard Worker if (ret->ExternalID == NULL)
140*7c568831SAndroid Build Coastguard Worker goto error;
141*7c568831SAndroid Build Coastguard Worker }
142*7c568831SAndroid Build Coastguard Worker if (SystemID != NULL) {
143*7c568831SAndroid Build Coastguard Worker ret->SystemID = xmlStrdup(SystemID);
144*7c568831SAndroid Build Coastguard Worker if (ret->SystemID == NULL)
145*7c568831SAndroid Build Coastguard Worker goto error;
146*7c568831SAndroid Build Coastguard Worker }
147*7c568831SAndroid Build Coastguard Worker if (content != NULL) {
148*7c568831SAndroid Build Coastguard Worker ret->length = xmlStrlen(content);
149*7c568831SAndroid Build Coastguard Worker ret->content = xmlStrndup(content, ret->length);
150*7c568831SAndroid Build Coastguard Worker if (ret->content == NULL)
151*7c568831SAndroid Build Coastguard Worker goto error;
152*7c568831SAndroid Build Coastguard Worker } else {
153*7c568831SAndroid Build Coastguard Worker ret->length = 0;
154*7c568831SAndroid Build Coastguard Worker ret->content = NULL;
155*7c568831SAndroid Build Coastguard Worker }
156*7c568831SAndroid Build Coastguard Worker ret->URI = NULL; /* to be computed by the layer knowing
157*7c568831SAndroid Build Coastguard Worker the defining entity */
158*7c568831SAndroid Build Coastguard Worker ret->orig = NULL;
159*7c568831SAndroid Build Coastguard Worker
160*7c568831SAndroid Build Coastguard Worker return(ret);
161*7c568831SAndroid Build Coastguard Worker
162*7c568831SAndroid Build Coastguard Worker error:
163*7c568831SAndroid Build Coastguard Worker xmlFreeEntity(ret);
164*7c568831SAndroid Build Coastguard Worker return(NULL);
165*7c568831SAndroid Build Coastguard Worker }
166*7c568831SAndroid Build Coastguard Worker
167*7c568831SAndroid Build Coastguard Worker /**
168*7c568831SAndroid Build Coastguard Worker * xmlAddEntity:
169*7c568831SAndroid Build Coastguard Worker * @doc: the document
170*7c568831SAndroid Build Coastguard Worker * @extSubset: add to the external or internal subset
171*7c568831SAndroid Build Coastguard Worker * @name: the entity name
172*7c568831SAndroid Build Coastguard Worker * @type: the entity type XML_xxx_yyy_ENTITY
173*7c568831SAndroid Build Coastguard Worker * @ExternalID: the entity external ID if available
174*7c568831SAndroid Build Coastguard Worker * @SystemID: the entity system ID if available
175*7c568831SAndroid Build Coastguard Worker * @content: the entity content
176*7c568831SAndroid Build Coastguard Worker * @out: pointer to resulting entity (optional)
177*7c568831SAndroid Build Coastguard Worker *
178*7c568831SAndroid Build Coastguard Worker * Register a new entity for this document.
179*7c568831SAndroid Build Coastguard Worker *
180*7c568831SAndroid Build Coastguard Worker * Available since 2.13.0.
181*7c568831SAndroid Build Coastguard Worker *
182*7c568831SAndroid Build Coastguard Worker * Returns an xmlParserErrors error code.
183*7c568831SAndroid Build Coastguard Worker */
184*7c568831SAndroid Build Coastguard Worker int
xmlAddEntity(xmlDocPtr doc,int extSubset,const xmlChar * name,int type,const xmlChar * ExternalID,const xmlChar * SystemID,const xmlChar * content,xmlEntityPtr * out)185*7c568831SAndroid Build Coastguard Worker xmlAddEntity(xmlDocPtr doc, int extSubset, const xmlChar *name, int type,
186*7c568831SAndroid Build Coastguard Worker const xmlChar *ExternalID, const xmlChar *SystemID,
187*7c568831SAndroid Build Coastguard Worker const xmlChar *content, xmlEntityPtr *out) {
188*7c568831SAndroid Build Coastguard Worker xmlDtdPtr dtd;
189*7c568831SAndroid Build Coastguard Worker xmlDictPtr dict = NULL;
190*7c568831SAndroid Build Coastguard Worker xmlEntitiesTablePtr table = NULL;
191*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ret, predef;
192*7c568831SAndroid Build Coastguard Worker int res;
193*7c568831SAndroid Build Coastguard Worker
194*7c568831SAndroid Build Coastguard Worker if (out != NULL)
195*7c568831SAndroid Build Coastguard Worker *out = NULL;
196*7c568831SAndroid Build Coastguard Worker if ((doc == NULL) || (name == NULL))
197*7c568831SAndroid Build Coastguard Worker return(XML_ERR_ARGUMENT);
198*7c568831SAndroid Build Coastguard Worker dict = doc->dict;
199*7c568831SAndroid Build Coastguard Worker
200*7c568831SAndroid Build Coastguard Worker if (extSubset)
201*7c568831SAndroid Build Coastguard Worker dtd = doc->extSubset;
202*7c568831SAndroid Build Coastguard Worker else
203*7c568831SAndroid Build Coastguard Worker dtd = doc->intSubset;
204*7c568831SAndroid Build Coastguard Worker if (dtd == NULL)
205*7c568831SAndroid Build Coastguard Worker return(XML_DTD_NO_DTD);
206*7c568831SAndroid Build Coastguard Worker
207*7c568831SAndroid Build Coastguard Worker switch (type) {
208*7c568831SAndroid Build Coastguard Worker case XML_INTERNAL_GENERAL_ENTITY:
209*7c568831SAndroid Build Coastguard Worker case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
210*7c568831SAndroid Build Coastguard Worker case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
211*7c568831SAndroid Build Coastguard Worker predef = xmlGetPredefinedEntity(name);
212*7c568831SAndroid Build Coastguard Worker if (predef != NULL) {
213*7c568831SAndroid Build Coastguard Worker int valid = 0;
214*7c568831SAndroid Build Coastguard Worker
215*7c568831SAndroid Build Coastguard Worker /* 4.6 Predefined Entities */
216*7c568831SAndroid Build Coastguard Worker if ((type == XML_INTERNAL_GENERAL_ENTITY) &&
217*7c568831SAndroid Build Coastguard Worker (content != NULL)) {
218*7c568831SAndroid Build Coastguard Worker int c = predef->content[0];
219*7c568831SAndroid Build Coastguard Worker
220*7c568831SAndroid Build Coastguard Worker if (((content[0] == c) && (content[1] == 0)) &&
221*7c568831SAndroid Build Coastguard Worker ((c == '>') || (c == '\'') || (c == '"'))) {
222*7c568831SAndroid Build Coastguard Worker valid = 1;
223*7c568831SAndroid Build Coastguard Worker } else if ((content[0] == '&') && (content[1] == '#')) {
224*7c568831SAndroid Build Coastguard Worker if (content[2] == 'x') {
225*7c568831SAndroid Build Coastguard Worker xmlChar *hex = BAD_CAST "0123456789ABCDEF";
226*7c568831SAndroid Build Coastguard Worker xmlChar ref[] = "00;";
227*7c568831SAndroid Build Coastguard Worker
228*7c568831SAndroid Build Coastguard Worker ref[0] = hex[c / 16 % 16];
229*7c568831SAndroid Build Coastguard Worker ref[1] = hex[c % 16];
230*7c568831SAndroid Build Coastguard Worker if (xmlStrcasecmp(&content[3], ref) == 0)
231*7c568831SAndroid Build Coastguard Worker valid = 1;
232*7c568831SAndroid Build Coastguard Worker } else {
233*7c568831SAndroid Build Coastguard Worker xmlChar ref[] = "00;";
234*7c568831SAndroid Build Coastguard Worker
235*7c568831SAndroid Build Coastguard Worker ref[0] = '0' + c / 10 % 10;
236*7c568831SAndroid Build Coastguard Worker ref[1] = '0' + c % 10;
237*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(&content[2], ref))
238*7c568831SAndroid Build Coastguard Worker valid = 1;
239*7c568831SAndroid Build Coastguard Worker }
240*7c568831SAndroid Build Coastguard Worker }
241*7c568831SAndroid Build Coastguard Worker }
242*7c568831SAndroid Build Coastguard Worker if (!valid)
243*7c568831SAndroid Build Coastguard Worker return(XML_ERR_REDECL_PREDEF_ENTITY);
244*7c568831SAndroid Build Coastguard Worker }
245*7c568831SAndroid Build Coastguard Worker if (dtd->entities == NULL) {
246*7c568831SAndroid Build Coastguard Worker dtd->entities = xmlHashCreateDict(0, dict);
247*7c568831SAndroid Build Coastguard Worker if (dtd->entities == NULL)
248*7c568831SAndroid Build Coastguard Worker return(XML_ERR_NO_MEMORY);
249*7c568831SAndroid Build Coastguard Worker }
250*7c568831SAndroid Build Coastguard Worker table = dtd->entities;
251*7c568831SAndroid Build Coastguard Worker break;
252*7c568831SAndroid Build Coastguard Worker case XML_INTERNAL_PARAMETER_ENTITY:
253*7c568831SAndroid Build Coastguard Worker case XML_EXTERNAL_PARAMETER_ENTITY:
254*7c568831SAndroid Build Coastguard Worker if (dtd->pentities == NULL) {
255*7c568831SAndroid Build Coastguard Worker dtd->pentities = xmlHashCreateDict(0, dict);
256*7c568831SAndroid Build Coastguard Worker if (dtd->pentities == NULL)
257*7c568831SAndroid Build Coastguard Worker return(XML_ERR_NO_MEMORY);
258*7c568831SAndroid Build Coastguard Worker }
259*7c568831SAndroid Build Coastguard Worker table = dtd->pentities;
260*7c568831SAndroid Build Coastguard Worker break;
261*7c568831SAndroid Build Coastguard Worker default:
262*7c568831SAndroid Build Coastguard Worker return(XML_ERR_ARGUMENT);
263*7c568831SAndroid Build Coastguard Worker }
264*7c568831SAndroid Build Coastguard Worker ret = xmlCreateEntity(dtd->doc, name, type, ExternalID, SystemID, content);
265*7c568831SAndroid Build Coastguard Worker if (ret == NULL)
266*7c568831SAndroid Build Coastguard Worker return(XML_ERR_NO_MEMORY);
267*7c568831SAndroid Build Coastguard Worker
268*7c568831SAndroid Build Coastguard Worker res = xmlHashAdd(table, name, ret);
269*7c568831SAndroid Build Coastguard Worker if (res < 0) {
270*7c568831SAndroid Build Coastguard Worker xmlFreeEntity(ret);
271*7c568831SAndroid Build Coastguard Worker return(XML_ERR_NO_MEMORY);
272*7c568831SAndroid Build Coastguard Worker } else if (res == 0) {
273*7c568831SAndroid Build Coastguard Worker /*
274*7c568831SAndroid Build Coastguard Worker * entity was already defined at another level.
275*7c568831SAndroid Build Coastguard Worker */
276*7c568831SAndroid Build Coastguard Worker xmlFreeEntity(ret);
277*7c568831SAndroid Build Coastguard Worker return(XML_WAR_ENTITY_REDEFINED);
278*7c568831SAndroid Build Coastguard Worker }
279*7c568831SAndroid Build Coastguard Worker
280*7c568831SAndroid Build Coastguard Worker /*
281*7c568831SAndroid Build Coastguard Worker * Link it to the DTD
282*7c568831SAndroid Build Coastguard Worker */
283*7c568831SAndroid Build Coastguard Worker ret->parent = dtd;
284*7c568831SAndroid Build Coastguard Worker ret->doc = dtd->doc;
285*7c568831SAndroid Build Coastguard Worker if (dtd->last == NULL) {
286*7c568831SAndroid Build Coastguard Worker dtd->children = dtd->last = (xmlNodePtr) ret;
287*7c568831SAndroid Build Coastguard Worker } else {
288*7c568831SAndroid Build Coastguard Worker dtd->last->next = (xmlNodePtr) ret;
289*7c568831SAndroid Build Coastguard Worker ret->prev = dtd->last;
290*7c568831SAndroid Build Coastguard Worker dtd->last = (xmlNodePtr) ret;
291*7c568831SAndroid Build Coastguard Worker }
292*7c568831SAndroid Build Coastguard Worker
293*7c568831SAndroid Build Coastguard Worker if (out != NULL)
294*7c568831SAndroid Build Coastguard Worker *out = ret;
295*7c568831SAndroid Build Coastguard Worker return(0);
296*7c568831SAndroid Build Coastguard Worker }
297*7c568831SAndroid Build Coastguard Worker
298*7c568831SAndroid Build Coastguard Worker /**
299*7c568831SAndroid Build Coastguard Worker * xmlGetPredefinedEntity:
300*7c568831SAndroid Build Coastguard Worker * @name: the entity name
301*7c568831SAndroid Build Coastguard Worker *
302*7c568831SAndroid Build Coastguard Worker * Check whether this name is an predefined entity.
303*7c568831SAndroid Build Coastguard Worker *
304*7c568831SAndroid Build Coastguard Worker * Returns NULL if not, otherwise the entity
305*7c568831SAndroid Build Coastguard Worker */
306*7c568831SAndroid Build Coastguard Worker xmlEntityPtr
xmlGetPredefinedEntity(const xmlChar * name)307*7c568831SAndroid Build Coastguard Worker xmlGetPredefinedEntity(const xmlChar *name) {
308*7c568831SAndroid Build Coastguard Worker if (name == NULL) return(NULL);
309*7c568831SAndroid Build Coastguard Worker switch (name[0]) {
310*7c568831SAndroid Build Coastguard Worker case 'l':
311*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(name, BAD_CAST "lt"))
312*7c568831SAndroid Build Coastguard Worker return(&xmlEntityLt);
313*7c568831SAndroid Build Coastguard Worker break;
314*7c568831SAndroid Build Coastguard Worker case 'g':
315*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(name, BAD_CAST "gt"))
316*7c568831SAndroid Build Coastguard Worker return(&xmlEntityGt);
317*7c568831SAndroid Build Coastguard Worker break;
318*7c568831SAndroid Build Coastguard Worker case 'a':
319*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(name, BAD_CAST "amp"))
320*7c568831SAndroid Build Coastguard Worker return(&xmlEntityAmp);
321*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(name, BAD_CAST "apos"))
322*7c568831SAndroid Build Coastguard Worker return(&xmlEntityApos);
323*7c568831SAndroid Build Coastguard Worker break;
324*7c568831SAndroid Build Coastguard Worker case 'q':
325*7c568831SAndroid Build Coastguard Worker if (xmlStrEqual(name, BAD_CAST "quot"))
326*7c568831SAndroid Build Coastguard Worker return(&xmlEntityQuot);
327*7c568831SAndroid Build Coastguard Worker break;
328*7c568831SAndroid Build Coastguard Worker default:
329*7c568831SAndroid Build Coastguard Worker break;
330*7c568831SAndroid Build Coastguard Worker }
331*7c568831SAndroid Build Coastguard Worker return(NULL);
332*7c568831SAndroid Build Coastguard Worker }
333*7c568831SAndroid Build Coastguard Worker
334*7c568831SAndroid Build Coastguard Worker /**
335*7c568831SAndroid Build Coastguard Worker * xmlAddDtdEntity:
336*7c568831SAndroid Build Coastguard Worker * @doc: the document
337*7c568831SAndroid Build Coastguard Worker * @name: the entity name
338*7c568831SAndroid Build Coastguard Worker * @type: the entity type XML_xxx_yyy_ENTITY
339*7c568831SAndroid Build Coastguard Worker * @ExternalID: the entity external ID if available
340*7c568831SAndroid Build Coastguard Worker * @SystemID: the entity system ID if available
341*7c568831SAndroid Build Coastguard Worker * @content: the entity content
342*7c568831SAndroid Build Coastguard Worker *
343*7c568831SAndroid Build Coastguard Worker * Register a new entity for this document DTD external subset.
344*7c568831SAndroid Build Coastguard Worker *
345*7c568831SAndroid Build Coastguard Worker * Returns a pointer to the entity or NULL in case of error
346*7c568831SAndroid Build Coastguard Worker */
347*7c568831SAndroid Build Coastguard Worker xmlEntityPtr
xmlAddDtdEntity(xmlDocPtr doc,const xmlChar * name,int type,const xmlChar * ExternalID,const xmlChar * SystemID,const xmlChar * content)348*7c568831SAndroid Build Coastguard Worker xmlAddDtdEntity(xmlDocPtr doc, const xmlChar *name, int type,
349*7c568831SAndroid Build Coastguard Worker const xmlChar *ExternalID, const xmlChar *SystemID,
350*7c568831SAndroid Build Coastguard Worker const xmlChar *content) {
351*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ret;
352*7c568831SAndroid Build Coastguard Worker
353*7c568831SAndroid Build Coastguard Worker xmlAddEntity(doc, 1, name, type, ExternalID, SystemID, content, &ret);
354*7c568831SAndroid Build Coastguard Worker return(ret);
355*7c568831SAndroid Build Coastguard Worker }
356*7c568831SAndroid Build Coastguard Worker
357*7c568831SAndroid Build Coastguard Worker /**
358*7c568831SAndroid Build Coastguard Worker * xmlAddDocEntity:
359*7c568831SAndroid Build Coastguard Worker * @doc: the document
360*7c568831SAndroid Build Coastguard Worker * @name: the entity name
361*7c568831SAndroid Build Coastguard Worker * @type: the entity type XML_xxx_yyy_ENTITY
362*7c568831SAndroid Build Coastguard Worker * @ExternalID: the entity external ID if available
363*7c568831SAndroid Build Coastguard Worker * @SystemID: the entity system ID if available
364*7c568831SAndroid Build Coastguard Worker * @content: the entity content
365*7c568831SAndroid Build Coastguard Worker *
366*7c568831SAndroid Build Coastguard Worker * Register a new entity for this document.
367*7c568831SAndroid Build Coastguard Worker *
368*7c568831SAndroid Build Coastguard Worker * Returns a pointer to the entity or NULL in case of error
369*7c568831SAndroid Build Coastguard Worker */
370*7c568831SAndroid Build Coastguard Worker xmlEntityPtr
xmlAddDocEntity(xmlDocPtr doc,const xmlChar * name,int type,const xmlChar * ExternalID,const xmlChar * SystemID,const xmlChar * content)371*7c568831SAndroid Build Coastguard Worker xmlAddDocEntity(xmlDocPtr doc, const xmlChar *name, int type,
372*7c568831SAndroid Build Coastguard Worker const xmlChar *ExternalID, const xmlChar *SystemID,
373*7c568831SAndroid Build Coastguard Worker const xmlChar *content) {
374*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ret;
375*7c568831SAndroid Build Coastguard Worker
376*7c568831SAndroid Build Coastguard Worker xmlAddEntity(doc, 0, name, type, ExternalID, SystemID, content, &ret);
377*7c568831SAndroid Build Coastguard Worker return(ret);
378*7c568831SAndroid Build Coastguard Worker }
379*7c568831SAndroid Build Coastguard Worker
380*7c568831SAndroid Build Coastguard Worker /**
381*7c568831SAndroid Build Coastguard Worker * xmlNewEntity:
382*7c568831SAndroid Build Coastguard Worker * @doc: the document
383*7c568831SAndroid Build Coastguard Worker * @name: the entity name
384*7c568831SAndroid Build Coastguard Worker * @type: the entity type XML_xxx_yyy_ENTITY
385*7c568831SAndroid Build Coastguard Worker * @ExternalID: the entity external ID if available
386*7c568831SAndroid Build Coastguard Worker * @SystemID: the entity system ID if available
387*7c568831SAndroid Build Coastguard Worker * @content: the entity content
388*7c568831SAndroid Build Coastguard Worker *
389*7c568831SAndroid Build Coastguard Worker * Create a new entity, this differs from xmlAddDocEntity() that if
390*7c568831SAndroid Build Coastguard Worker * the document is NULL or has no internal subset defined, then an
391*7c568831SAndroid Build Coastguard Worker * unlinked entity structure will be returned, it is then the responsibility
392*7c568831SAndroid Build Coastguard Worker * of the caller to link it to the document later or free it when not needed
393*7c568831SAndroid Build Coastguard Worker * anymore.
394*7c568831SAndroid Build Coastguard Worker *
395*7c568831SAndroid Build Coastguard Worker * Returns a pointer to the entity or NULL in case of error
396*7c568831SAndroid Build Coastguard Worker */
397*7c568831SAndroid Build Coastguard Worker xmlEntityPtr
xmlNewEntity(xmlDocPtr doc,const xmlChar * name,int type,const xmlChar * ExternalID,const xmlChar * SystemID,const xmlChar * content)398*7c568831SAndroid Build Coastguard Worker xmlNewEntity(xmlDocPtr doc, const xmlChar *name, int type,
399*7c568831SAndroid Build Coastguard Worker const xmlChar *ExternalID, const xmlChar *SystemID,
400*7c568831SAndroid Build Coastguard Worker const xmlChar *content) {
401*7c568831SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->intSubset != NULL)) {
402*7c568831SAndroid Build Coastguard Worker return(xmlAddDocEntity(doc, name, type, ExternalID, SystemID, content));
403*7c568831SAndroid Build Coastguard Worker }
404*7c568831SAndroid Build Coastguard Worker if (name == NULL)
405*7c568831SAndroid Build Coastguard Worker return(NULL);
406*7c568831SAndroid Build Coastguard Worker return(xmlCreateEntity(doc, name, type, ExternalID, SystemID, content));
407*7c568831SAndroid Build Coastguard Worker }
408*7c568831SAndroid Build Coastguard Worker
409*7c568831SAndroid Build Coastguard Worker /**
410*7c568831SAndroid Build Coastguard Worker * xmlGetEntityFromTable:
411*7c568831SAndroid Build Coastguard Worker * @table: an entity table
412*7c568831SAndroid Build Coastguard Worker * @name: the entity name
413*7c568831SAndroid Build Coastguard Worker * @parameter: look for parameter entities
414*7c568831SAndroid Build Coastguard Worker *
415*7c568831SAndroid Build Coastguard Worker * Do an entity lookup in the table.
416*7c568831SAndroid Build Coastguard Worker * returns the corresponding parameter entity, if found.
417*7c568831SAndroid Build Coastguard Worker *
418*7c568831SAndroid Build Coastguard Worker * Returns A pointer to the entity structure or NULL if not found.
419*7c568831SAndroid Build Coastguard Worker */
420*7c568831SAndroid Build Coastguard Worker static xmlEntityPtr
xmlGetEntityFromTable(xmlEntitiesTablePtr table,const xmlChar * name)421*7c568831SAndroid Build Coastguard Worker xmlGetEntityFromTable(xmlEntitiesTablePtr table, const xmlChar *name) {
422*7c568831SAndroid Build Coastguard Worker return((xmlEntityPtr) xmlHashLookup(table, name));
423*7c568831SAndroid Build Coastguard Worker }
424*7c568831SAndroid Build Coastguard Worker
425*7c568831SAndroid Build Coastguard Worker /**
426*7c568831SAndroid Build Coastguard Worker * xmlGetParameterEntity:
427*7c568831SAndroid Build Coastguard Worker * @doc: the document referencing the entity
428*7c568831SAndroid Build Coastguard Worker * @name: the entity name
429*7c568831SAndroid Build Coastguard Worker *
430*7c568831SAndroid Build Coastguard Worker * Do an entity lookup in the internal and external subsets and
431*7c568831SAndroid Build Coastguard Worker * returns the corresponding parameter entity, if found.
432*7c568831SAndroid Build Coastguard Worker *
433*7c568831SAndroid Build Coastguard Worker * Returns A pointer to the entity structure or NULL if not found.
434*7c568831SAndroid Build Coastguard Worker */
435*7c568831SAndroid Build Coastguard Worker xmlEntityPtr
xmlGetParameterEntity(xmlDocPtr doc,const xmlChar * name)436*7c568831SAndroid Build Coastguard Worker xmlGetParameterEntity(xmlDocPtr doc, const xmlChar *name) {
437*7c568831SAndroid Build Coastguard Worker xmlEntitiesTablePtr table;
438*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ret;
439*7c568831SAndroid Build Coastguard Worker
440*7c568831SAndroid Build Coastguard Worker if (doc == NULL)
441*7c568831SAndroid Build Coastguard Worker return(NULL);
442*7c568831SAndroid Build Coastguard Worker if ((doc->intSubset != NULL) && (doc->intSubset->pentities != NULL)) {
443*7c568831SAndroid Build Coastguard Worker table = (xmlEntitiesTablePtr) doc->intSubset->pentities;
444*7c568831SAndroid Build Coastguard Worker ret = xmlGetEntityFromTable(table, name);
445*7c568831SAndroid Build Coastguard Worker if (ret != NULL)
446*7c568831SAndroid Build Coastguard Worker return(ret);
447*7c568831SAndroid Build Coastguard Worker }
448*7c568831SAndroid Build Coastguard Worker if ((doc->extSubset != NULL) && (doc->extSubset->pentities != NULL)) {
449*7c568831SAndroid Build Coastguard Worker table = (xmlEntitiesTablePtr) doc->extSubset->pentities;
450*7c568831SAndroid Build Coastguard Worker return(xmlGetEntityFromTable(table, name));
451*7c568831SAndroid Build Coastguard Worker }
452*7c568831SAndroid Build Coastguard Worker return(NULL);
453*7c568831SAndroid Build Coastguard Worker }
454*7c568831SAndroid Build Coastguard Worker
455*7c568831SAndroid Build Coastguard Worker /**
456*7c568831SAndroid Build Coastguard Worker * xmlGetDtdEntity:
457*7c568831SAndroid Build Coastguard Worker * @doc: the document referencing the entity
458*7c568831SAndroid Build Coastguard Worker * @name: the entity name
459*7c568831SAndroid Build Coastguard Worker *
460*7c568831SAndroid Build Coastguard Worker * Do an entity lookup in the DTD entity hash table and
461*7c568831SAndroid Build Coastguard Worker * returns the corresponding entity, if found.
462*7c568831SAndroid Build Coastguard Worker * Note: the first argument is the document node, not the DTD node.
463*7c568831SAndroid Build Coastguard Worker *
464*7c568831SAndroid Build Coastguard Worker * Returns A pointer to the entity structure or NULL if not found.
465*7c568831SAndroid Build Coastguard Worker */
466*7c568831SAndroid Build Coastguard Worker xmlEntityPtr
xmlGetDtdEntity(xmlDocPtr doc,const xmlChar * name)467*7c568831SAndroid Build Coastguard Worker xmlGetDtdEntity(xmlDocPtr doc, const xmlChar *name) {
468*7c568831SAndroid Build Coastguard Worker xmlEntitiesTablePtr table;
469*7c568831SAndroid Build Coastguard Worker
470*7c568831SAndroid Build Coastguard Worker if (doc == NULL)
471*7c568831SAndroid Build Coastguard Worker return(NULL);
472*7c568831SAndroid Build Coastguard Worker if ((doc->extSubset != NULL) && (doc->extSubset->entities != NULL)) {
473*7c568831SAndroid Build Coastguard Worker table = (xmlEntitiesTablePtr) doc->extSubset->entities;
474*7c568831SAndroid Build Coastguard Worker return(xmlGetEntityFromTable(table, name));
475*7c568831SAndroid Build Coastguard Worker }
476*7c568831SAndroid Build Coastguard Worker return(NULL);
477*7c568831SAndroid Build Coastguard Worker }
478*7c568831SAndroid Build Coastguard Worker
479*7c568831SAndroid Build Coastguard Worker /**
480*7c568831SAndroid Build Coastguard Worker * xmlGetDocEntity:
481*7c568831SAndroid Build Coastguard Worker * @doc: the document referencing the entity
482*7c568831SAndroid Build Coastguard Worker * @name: the entity name
483*7c568831SAndroid Build Coastguard Worker *
484*7c568831SAndroid Build Coastguard Worker * Do an entity lookup in the document entity hash table and
485*7c568831SAndroid Build Coastguard Worker * returns the corresponding entity, otherwise a lookup is done
486*7c568831SAndroid Build Coastguard Worker * in the predefined entities too.
487*7c568831SAndroid Build Coastguard Worker *
488*7c568831SAndroid Build Coastguard Worker * Returns A pointer to the entity structure or NULL if not found.
489*7c568831SAndroid Build Coastguard Worker */
490*7c568831SAndroid Build Coastguard Worker xmlEntityPtr
xmlGetDocEntity(const xmlDoc * doc,const xmlChar * name)491*7c568831SAndroid Build Coastguard Worker xmlGetDocEntity(const xmlDoc *doc, const xmlChar *name) {
492*7c568831SAndroid Build Coastguard Worker xmlEntityPtr cur;
493*7c568831SAndroid Build Coastguard Worker xmlEntitiesTablePtr table;
494*7c568831SAndroid Build Coastguard Worker
495*7c568831SAndroid Build Coastguard Worker if (doc != NULL) {
496*7c568831SAndroid Build Coastguard Worker if ((doc->intSubset != NULL) && (doc->intSubset->entities != NULL)) {
497*7c568831SAndroid Build Coastguard Worker table = (xmlEntitiesTablePtr) doc->intSubset->entities;
498*7c568831SAndroid Build Coastguard Worker cur = xmlGetEntityFromTable(table, name);
499*7c568831SAndroid Build Coastguard Worker if (cur != NULL)
500*7c568831SAndroid Build Coastguard Worker return(cur);
501*7c568831SAndroid Build Coastguard Worker }
502*7c568831SAndroid Build Coastguard Worker if (doc->standalone != 1) {
503*7c568831SAndroid Build Coastguard Worker if ((doc->extSubset != NULL) &&
504*7c568831SAndroid Build Coastguard Worker (doc->extSubset->entities != NULL)) {
505*7c568831SAndroid Build Coastguard Worker table = (xmlEntitiesTablePtr) doc->extSubset->entities;
506*7c568831SAndroid Build Coastguard Worker cur = xmlGetEntityFromTable(table, name);
507*7c568831SAndroid Build Coastguard Worker if (cur != NULL)
508*7c568831SAndroid Build Coastguard Worker return(cur);
509*7c568831SAndroid Build Coastguard Worker }
510*7c568831SAndroid Build Coastguard Worker }
511*7c568831SAndroid Build Coastguard Worker }
512*7c568831SAndroid Build Coastguard Worker return(xmlGetPredefinedEntity(name));
513*7c568831SAndroid Build Coastguard Worker }
514*7c568831SAndroid Build Coastguard Worker
515*7c568831SAndroid Build Coastguard Worker int
xmlSerializeHexCharRef(char * buf,int val)516*7c568831SAndroid Build Coastguard Worker xmlSerializeHexCharRef(char *buf, int val) {
517*7c568831SAndroid Build Coastguard Worker char *out = buf;
518*7c568831SAndroid Build Coastguard Worker int shift = 0, bits;
519*7c568831SAndroid Build Coastguard Worker
520*7c568831SAndroid Build Coastguard Worker *out++ = '&';
521*7c568831SAndroid Build Coastguard Worker *out++ = '#';
522*7c568831SAndroid Build Coastguard Worker *out++ = 'x';
523*7c568831SAndroid Build Coastguard Worker
524*7c568831SAndroid Build Coastguard Worker bits = val;
525*7c568831SAndroid Build Coastguard Worker if (bits & 0xFF0000) {
526*7c568831SAndroid Build Coastguard Worker shift = 16;
527*7c568831SAndroid Build Coastguard Worker bits &= 0xFF0000;
528*7c568831SAndroid Build Coastguard Worker } else if (bits & 0x00FF00) {
529*7c568831SAndroid Build Coastguard Worker shift = 8;
530*7c568831SAndroid Build Coastguard Worker bits &= 0x00FF00;
531*7c568831SAndroid Build Coastguard Worker }
532*7c568831SAndroid Build Coastguard Worker if (bits & 0xF0F0F0) {
533*7c568831SAndroid Build Coastguard Worker shift += 4;
534*7c568831SAndroid Build Coastguard Worker }
535*7c568831SAndroid Build Coastguard Worker
536*7c568831SAndroid Build Coastguard Worker do {
537*7c568831SAndroid Build Coastguard Worker int d = (val >> shift) & 0x0F;
538*7c568831SAndroid Build Coastguard Worker
539*7c568831SAndroid Build Coastguard Worker if (d < 10)
540*7c568831SAndroid Build Coastguard Worker *out++ = '0' + d;
541*7c568831SAndroid Build Coastguard Worker else
542*7c568831SAndroid Build Coastguard Worker *out++ = 'A' + (d - 10);
543*7c568831SAndroid Build Coastguard Worker
544*7c568831SAndroid Build Coastguard Worker shift -= 4;
545*7c568831SAndroid Build Coastguard Worker } while (shift >= 0);
546*7c568831SAndroid Build Coastguard Worker
547*7c568831SAndroid Build Coastguard Worker *out++ = ';';
548*7c568831SAndroid Build Coastguard Worker
549*7c568831SAndroid Build Coastguard Worker return(out - buf);
550*7c568831SAndroid Build Coastguard Worker }
551*7c568831SAndroid Build Coastguard Worker
552*7c568831SAndroid Build Coastguard Worker int
xmlSerializeDecCharRef(char * buf,int val)553*7c568831SAndroid Build Coastguard Worker xmlSerializeDecCharRef(char *buf, int val) {
554*7c568831SAndroid Build Coastguard Worker char *out = buf;
555*7c568831SAndroid Build Coastguard Worker int len, i;
556*7c568831SAndroid Build Coastguard Worker
557*7c568831SAndroid Build Coastguard Worker *out++ = '&';
558*7c568831SAndroid Build Coastguard Worker *out++ = '#';
559*7c568831SAndroid Build Coastguard Worker
560*7c568831SAndroid Build Coastguard Worker if (val < 100) {
561*7c568831SAndroid Build Coastguard Worker len = (val < 10) ? 1 : 2;
562*7c568831SAndroid Build Coastguard Worker } else if (val < 10000) {
563*7c568831SAndroid Build Coastguard Worker len = (val < 1000) ? 3 : 4;
564*7c568831SAndroid Build Coastguard Worker } else if (val < 1000000) {
565*7c568831SAndroid Build Coastguard Worker len = (val < 100000) ? 5 : 6;
566*7c568831SAndroid Build Coastguard Worker } else {
567*7c568831SAndroid Build Coastguard Worker len = 7;
568*7c568831SAndroid Build Coastguard Worker }
569*7c568831SAndroid Build Coastguard Worker
570*7c568831SAndroid Build Coastguard Worker for (i = len - 1; i >= 0; i--) {
571*7c568831SAndroid Build Coastguard Worker out[i] = '0' + val % 10;
572*7c568831SAndroid Build Coastguard Worker val /= 10;
573*7c568831SAndroid Build Coastguard Worker }
574*7c568831SAndroid Build Coastguard Worker
575*7c568831SAndroid Build Coastguard Worker out[len] = ';';
576*7c568831SAndroid Build Coastguard Worker
577*7c568831SAndroid Build Coastguard Worker return(len + 3);
578*7c568831SAndroid Build Coastguard Worker }
579*7c568831SAndroid Build Coastguard Worker
580*7c568831SAndroid Build Coastguard Worker static const char xmlEscapeSafe[128] = {
581*7c568831SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
582*7c568831SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
583*7c568831SAndroid Build Coastguard Worker 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
584*7c568831SAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1,
585*7c568831SAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
586*7c568831SAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
587*7c568831SAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
588*7c568831SAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
589*7c568831SAndroid Build Coastguard Worker };
590*7c568831SAndroid Build Coastguard Worker
591*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlEscapeText(const xmlChar * text,int flags)592*7c568831SAndroid Build Coastguard Worker xmlEscapeText(const xmlChar *text, int flags) {
593*7c568831SAndroid Build Coastguard Worker const xmlChar *cur;
594*7c568831SAndroid Build Coastguard Worker xmlChar *buffer;
595*7c568831SAndroid Build Coastguard Worker xmlChar *out;
596*7c568831SAndroid Build Coastguard Worker const xmlChar *unescaped;
597*7c568831SAndroid Build Coastguard Worker size_t size = 50;
598*7c568831SAndroid Build Coastguard Worker
599*7c568831SAndroid Build Coastguard Worker buffer = xmlMalloc(size + 1);
600*7c568831SAndroid Build Coastguard Worker if (buffer == NULL)
601*7c568831SAndroid Build Coastguard Worker return(NULL);
602*7c568831SAndroid Build Coastguard Worker out = buffer;
603*7c568831SAndroid Build Coastguard Worker
604*7c568831SAndroid Build Coastguard Worker cur = text;
605*7c568831SAndroid Build Coastguard Worker unescaped = cur;
606*7c568831SAndroid Build Coastguard Worker
607*7c568831SAndroid Build Coastguard Worker while (*cur != '\0') {
608*7c568831SAndroid Build Coastguard Worker char buf[12];
609*7c568831SAndroid Build Coastguard Worker const xmlChar *end;
610*7c568831SAndroid Build Coastguard Worker const xmlChar *repl;
611*7c568831SAndroid Build Coastguard Worker size_t used;
612*7c568831SAndroid Build Coastguard Worker size_t replSize;
613*7c568831SAndroid Build Coastguard Worker size_t unescapedSize;
614*7c568831SAndroid Build Coastguard Worker size_t totalSize;
615*7c568831SAndroid Build Coastguard Worker int chunkSize = 1;
616*7c568831SAndroid Build Coastguard Worker int c;
617*7c568831SAndroid Build Coastguard Worker
618*7c568831SAndroid Build Coastguard Worker /* accelerator */
619*7c568831SAndroid Build Coastguard Worker while (1) {
620*7c568831SAndroid Build Coastguard Worker c = *cur;
621*7c568831SAndroid Build Coastguard Worker
622*7c568831SAndroid Build Coastguard Worker if (c < 0x80) {
623*7c568831SAndroid Build Coastguard Worker if (!xmlEscapeSafe[*cur])
624*7c568831SAndroid Build Coastguard Worker break;
625*7c568831SAndroid Build Coastguard Worker } else {
626*7c568831SAndroid Build Coastguard Worker if (flags & XML_ESCAPE_NON_ASCII)
627*7c568831SAndroid Build Coastguard Worker break;
628*7c568831SAndroid Build Coastguard Worker }
629*7c568831SAndroid Build Coastguard Worker cur += 1;
630*7c568831SAndroid Build Coastguard Worker }
631*7c568831SAndroid Build Coastguard Worker
632*7c568831SAndroid Build Coastguard Worker if (c == 0) {
633*7c568831SAndroid Build Coastguard Worker chunkSize = 0;
634*7c568831SAndroid Build Coastguard Worker repl = BAD_CAST "";
635*7c568831SAndroid Build Coastguard Worker replSize = 0;
636*7c568831SAndroid Build Coastguard Worker } else if (c == '<') {
637*7c568831SAndroid Build Coastguard Worker /*
638*7c568831SAndroid Build Coastguard Worker * Special handling of server side include in HTML attributes
639*7c568831SAndroid Build Coastguard Worker */
640*7c568831SAndroid Build Coastguard Worker if ((flags & XML_ESCAPE_HTML) && (flags & XML_ESCAPE_ATTR) &&
641*7c568831SAndroid Build Coastguard Worker (cur[1] == '!') && (cur[2] == '-') && (cur[3] == '-') &&
642*7c568831SAndroid Build Coastguard Worker ((end = xmlStrstr(cur, BAD_CAST "-->")) != NULL)) {
643*7c568831SAndroid Build Coastguard Worker chunkSize = (end - cur) + 3;
644*7c568831SAndroid Build Coastguard Worker repl = cur;
645*7c568831SAndroid Build Coastguard Worker replSize = chunkSize;
646*7c568831SAndroid Build Coastguard Worker } else {
647*7c568831SAndroid Build Coastguard Worker repl = BAD_CAST "<";
648*7c568831SAndroid Build Coastguard Worker replSize = 4;
649*7c568831SAndroid Build Coastguard Worker }
650*7c568831SAndroid Build Coastguard Worker } else if (c == '>') {
651*7c568831SAndroid Build Coastguard Worker repl = BAD_CAST ">";
652*7c568831SAndroid Build Coastguard Worker replSize = 4;
653*7c568831SAndroid Build Coastguard Worker } else if (c == '&') {
654*7c568831SAndroid Build Coastguard Worker /*
655*7c568831SAndroid Build Coastguard Worker * Special handling of &{...} construct from HTML 4, see
656*7c568831SAndroid Build Coastguard Worker * http://www.w3.org/TR/html401/appendix/notes.html#h-B.7.1
657*7c568831SAndroid Build Coastguard Worker */
658*7c568831SAndroid Build Coastguard Worker if ((flags & XML_ESCAPE_HTML) && (flags & XML_ESCAPE_ATTR) &&
659*7c568831SAndroid Build Coastguard Worker (cur[1] == '{') && (end = xmlStrchr(cur, '}'))) {
660*7c568831SAndroid Build Coastguard Worker chunkSize = (end - cur) + 1;
661*7c568831SAndroid Build Coastguard Worker repl = cur;
662*7c568831SAndroid Build Coastguard Worker replSize = chunkSize;
663*7c568831SAndroid Build Coastguard Worker } else {
664*7c568831SAndroid Build Coastguard Worker repl = BAD_CAST "&";
665*7c568831SAndroid Build Coastguard Worker replSize = 5;
666*7c568831SAndroid Build Coastguard Worker }
667*7c568831SAndroid Build Coastguard Worker } else if ((flags & XML_ESCAPE_QUOT) && (c == '"')) {
668*7c568831SAndroid Build Coastguard Worker repl = BAD_CAST """;
669*7c568831SAndroid Build Coastguard Worker replSize = 6;
670*7c568831SAndroid Build Coastguard Worker } else if (((flags & XML_ESCAPE_HTML) == 0) && (c == '\r')) {
671*7c568831SAndroid Build Coastguard Worker repl = BAD_CAST " ";
672*7c568831SAndroid Build Coastguard Worker replSize = 5;
673*7c568831SAndroid Build Coastguard Worker } else if ((flags & XML_ESCAPE_NON_ASCII) && (c >= 0x80)) {
674*7c568831SAndroid Build Coastguard Worker int val;
675*7c568831SAndroid Build Coastguard Worker
676*7c568831SAndroid Build Coastguard Worker chunkSize = 4;
677*7c568831SAndroid Build Coastguard Worker val = xmlGetUTF8Char(cur, &chunkSize);
678*7c568831SAndroid Build Coastguard Worker if (val < 0) {
679*7c568831SAndroid Build Coastguard Worker val = 0xFFFD;
680*7c568831SAndroid Build Coastguard Worker chunkSize = 1;
681*7c568831SAndroid Build Coastguard Worker } else if (((flags & XML_ESCAPE_ALLOW_INVALID) == 0) &&
682*7c568831SAndroid Build Coastguard Worker (!IS_CHAR(val))) {
683*7c568831SAndroid Build Coastguard Worker val = 0xFFFD;
684*7c568831SAndroid Build Coastguard Worker }
685*7c568831SAndroid Build Coastguard Worker
686*7c568831SAndroid Build Coastguard Worker replSize = xmlSerializeHexCharRef(buf, val);
687*7c568831SAndroid Build Coastguard Worker repl = BAD_CAST buf;
688*7c568831SAndroid Build Coastguard Worker } else if ((flags & XML_ESCAPE_ALLOW_INVALID) ||
689*7c568831SAndroid Build Coastguard Worker (c >= 0x20) ||
690*7c568831SAndroid Build Coastguard Worker (c == '\n') || (c == '\t') || (c == '\r')) {
691*7c568831SAndroid Build Coastguard Worker /* default case, just copy */
692*7c568831SAndroid Build Coastguard Worker cur += 1;
693*7c568831SAndroid Build Coastguard Worker if (*cur != 0)
694*7c568831SAndroid Build Coastguard Worker continue;
695*7c568831SAndroid Build Coastguard Worker
696*7c568831SAndroid Build Coastguard Worker chunkSize = 0;
697*7c568831SAndroid Build Coastguard Worker repl = BAD_CAST "";
698*7c568831SAndroid Build Coastguard Worker replSize = 0;
699*7c568831SAndroid Build Coastguard Worker } else {
700*7c568831SAndroid Build Coastguard Worker /* ignore */
701*7c568831SAndroid Build Coastguard Worker repl = BAD_CAST "";
702*7c568831SAndroid Build Coastguard Worker replSize = 0;
703*7c568831SAndroid Build Coastguard Worker }
704*7c568831SAndroid Build Coastguard Worker
705*7c568831SAndroid Build Coastguard Worker used = out - buffer;
706*7c568831SAndroid Build Coastguard Worker unescapedSize = cur - unescaped;
707*7c568831SAndroid Build Coastguard Worker totalSize = unescapedSize + replSize;
708*7c568831SAndroid Build Coastguard Worker
709*7c568831SAndroid Build Coastguard Worker cur += chunkSize;
710*7c568831SAndroid Build Coastguard Worker
711*7c568831SAndroid Build Coastguard Worker if (totalSize > size - used) {
712*7c568831SAndroid Build Coastguard Worker xmlChar *tmp;
713*7c568831SAndroid Build Coastguard Worker
714*7c568831SAndroid Build Coastguard Worker size += totalSize;
715*7c568831SAndroid Build Coastguard Worker if (*cur != 0)
716*7c568831SAndroid Build Coastguard Worker size *= 2;
717*7c568831SAndroid Build Coastguard Worker tmp = xmlRealloc(buffer, size + 1);
718*7c568831SAndroid Build Coastguard Worker if (tmp == NULL) {
719*7c568831SAndroid Build Coastguard Worker xmlFree(buffer);
720*7c568831SAndroid Build Coastguard Worker return(NULL);
721*7c568831SAndroid Build Coastguard Worker }
722*7c568831SAndroid Build Coastguard Worker buffer = tmp;
723*7c568831SAndroid Build Coastguard Worker out = buffer + used;
724*7c568831SAndroid Build Coastguard Worker }
725*7c568831SAndroid Build Coastguard Worker
726*7c568831SAndroid Build Coastguard Worker memcpy(out, unescaped, unescapedSize);
727*7c568831SAndroid Build Coastguard Worker out += unescapedSize;
728*7c568831SAndroid Build Coastguard Worker memcpy(out, repl, replSize);
729*7c568831SAndroid Build Coastguard Worker out += replSize;
730*7c568831SAndroid Build Coastguard Worker
731*7c568831SAndroid Build Coastguard Worker unescaped = cur;
732*7c568831SAndroid Build Coastguard Worker }
733*7c568831SAndroid Build Coastguard Worker
734*7c568831SAndroid Build Coastguard Worker *out = 0;
735*7c568831SAndroid Build Coastguard Worker return(buffer);
736*7c568831SAndroid Build Coastguard Worker }
737*7c568831SAndroid Build Coastguard Worker
738*7c568831SAndroid Build Coastguard Worker /**
739*7c568831SAndroid Build Coastguard Worker * xmlEncodeEntitiesInternal:
740*7c568831SAndroid Build Coastguard Worker * @doc: the document containing the string
741*7c568831SAndroid Build Coastguard Worker * @input: A string to convert to XML.
742*7c568831SAndroid Build Coastguard Worker * @attr: are we handling an attribute value
743*7c568831SAndroid Build Coastguard Worker *
744*7c568831SAndroid Build Coastguard Worker * Do a global encoding of a string, replacing the predefined entities
745*7c568831SAndroid Build Coastguard Worker * and non ASCII values with their entities and CharRef counterparts.
746*7c568831SAndroid Build Coastguard Worker * Contrary to xmlEncodeEntities, this routine is reentrant, and result
747*7c568831SAndroid Build Coastguard Worker * must be deallocated.
748*7c568831SAndroid Build Coastguard Worker *
749*7c568831SAndroid Build Coastguard Worker * Returns A newly allocated string with the substitution done.
750*7c568831SAndroid Build Coastguard Worker */
751*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlEncodeEntitiesInternal(xmlDocPtr doc,const xmlChar * input,unsigned flags)752*7c568831SAndroid Build Coastguard Worker xmlEncodeEntitiesInternal(xmlDocPtr doc, const xmlChar *input,
753*7c568831SAndroid Build Coastguard Worker unsigned flags) {
754*7c568831SAndroid Build Coastguard Worker if (input == NULL)
755*7c568831SAndroid Build Coastguard Worker return(NULL);
756*7c568831SAndroid Build Coastguard Worker
757*7c568831SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE))
758*7c568831SAndroid Build Coastguard Worker flags |= XML_ESCAPE_HTML;
759*7c568831SAndroid Build Coastguard Worker else if ((doc == NULL) || (doc->encoding == NULL))
760*7c568831SAndroid Build Coastguard Worker flags |= XML_ESCAPE_NON_ASCII;
761*7c568831SAndroid Build Coastguard Worker
762*7c568831SAndroid Build Coastguard Worker return(xmlEscapeText(input, flags));
763*7c568831SAndroid Build Coastguard Worker }
764*7c568831SAndroid Build Coastguard Worker
765*7c568831SAndroid Build Coastguard Worker /**
766*7c568831SAndroid Build Coastguard Worker * xmlEncodeEntitiesReentrant:
767*7c568831SAndroid Build Coastguard Worker * @doc: the document containing the string
768*7c568831SAndroid Build Coastguard Worker * @input: A string to convert to XML.
769*7c568831SAndroid Build Coastguard Worker *
770*7c568831SAndroid Build Coastguard Worker * Do a global encoding of a string, replacing the predefined entities
771*7c568831SAndroid Build Coastguard Worker * and non ASCII values with their entities and CharRef counterparts.
772*7c568831SAndroid Build Coastguard Worker * Contrary to xmlEncodeEntities, this routine is reentrant, and result
773*7c568831SAndroid Build Coastguard Worker * must be deallocated.
774*7c568831SAndroid Build Coastguard Worker *
775*7c568831SAndroid Build Coastguard Worker * This escapes '<', '>', '&' and '\r'. If the document has no encoding,
776*7c568831SAndroid Build Coastguard Worker * non-ASCII codepoints are escaped. There is some special handling for
777*7c568831SAndroid Build Coastguard Worker * HTML documents.
778*7c568831SAndroid Build Coastguard Worker *
779*7c568831SAndroid Build Coastguard Worker * Returns A newly allocated string with the substitution done.
780*7c568831SAndroid Build Coastguard Worker */
781*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlEncodeEntitiesReentrant(xmlDocPtr doc,const xmlChar * input)782*7c568831SAndroid Build Coastguard Worker xmlEncodeEntitiesReentrant(xmlDocPtr doc, const xmlChar *input) {
783*7c568831SAndroid Build Coastguard Worker return xmlEncodeEntitiesInternal(doc, input, 0);
784*7c568831SAndroid Build Coastguard Worker }
785*7c568831SAndroid Build Coastguard Worker
786*7c568831SAndroid Build Coastguard Worker /**
787*7c568831SAndroid Build Coastguard Worker * xmlEncodeSpecialChars:
788*7c568831SAndroid Build Coastguard Worker * @doc: unused
789*7c568831SAndroid Build Coastguard Worker * @input: A string to convert to XML.
790*7c568831SAndroid Build Coastguard Worker *
791*7c568831SAndroid Build Coastguard Worker * Do a global encoding of a string, replacing the predefined entities
792*7c568831SAndroid Build Coastguard Worker * this routine is reentrant, and result must be deallocated.
793*7c568831SAndroid Build Coastguard Worker *
794*7c568831SAndroid Build Coastguard Worker * This escapes '<', '>', '&', '"' and '\r' chars.
795*7c568831SAndroid Build Coastguard Worker *
796*7c568831SAndroid Build Coastguard Worker * Returns A newly allocated string with the substitution done.
797*7c568831SAndroid Build Coastguard Worker */
798*7c568831SAndroid Build Coastguard Worker xmlChar *
xmlEncodeSpecialChars(const xmlDoc * doc ATTRIBUTE_UNUSED,const xmlChar * input)799*7c568831SAndroid Build Coastguard Worker xmlEncodeSpecialChars(const xmlDoc *doc ATTRIBUTE_UNUSED,
800*7c568831SAndroid Build Coastguard Worker const xmlChar *input) {
801*7c568831SAndroid Build Coastguard Worker if (input == NULL)
802*7c568831SAndroid Build Coastguard Worker return(NULL);
803*7c568831SAndroid Build Coastguard Worker
804*7c568831SAndroid Build Coastguard Worker return(xmlEscapeText(input, XML_ESCAPE_QUOT | XML_ESCAPE_ALLOW_INVALID));
805*7c568831SAndroid Build Coastguard Worker }
806*7c568831SAndroid Build Coastguard Worker
807*7c568831SAndroid Build Coastguard Worker /**
808*7c568831SAndroid Build Coastguard Worker * xmlCreateEntitiesTable:
809*7c568831SAndroid Build Coastguard Worker *
810*7c568831SAndroid Build Coastguard Worker * create and initialize an empty entities hash table.
811*7c568831SAndroid Build Coastguard Worker * This really doesn't make sense and should be deprecated
812*7c568831SAndroid Build Coastguard Worker *
813*7c568831SAndroid Build Coastguard Worker * Returns the xmlEntitiesTablePtr just created or NULL in case of error.
814*7c568831SAndroid Build Coastguard Worker */
815*7c568831SAndroid Build Coastguard Worker xmlEntitiesTablePtr
xmlCreateEntitiesTable(void)816*7c568831SAndroid Build Coastguard Worker xmlCreateEntitiesTable(void) {
817*7c568831SAndroid Build Coastguard Worker return((xmlEntitiesTablePtr) xmlHashCreate(0));
818*7c568831SAndroid Build Coastguard Worker }
819*7c568831SAndroid Build Coastguard Worker
820*7c568831SAndroid Build Coastguard Worker /**
821*7c568831SAndroid Build Coastguard Worker * xmlFreeEntityWrapper:
822*7c568831SAndroid Build Coastguard Worker * @entity: An entity
823*7c568831SAndroid Build Coastguard Worker * @name: its name
824*7c568831SAndroid Build Coastguard Worker *
825*7c568831SAndroid Build Coastguard Worker * Deallocate the memory used by an entities in the hash table.
826*7c568831SAndroid Build Coastguard Worker */
827*7c568831SAndroid Build Coastguard Worker static void
xmlFreeEntityWrapper(void * entity,const xmlChar * name ATTRIBUTE_UNUSED)828*7c568831SAndroid Build Coastguard Worker xmlFreeEntityWrapper(void *entity, const xmlChar *name ATTRIBUTE_UNUSED) {
829*7c568831SAndroid Build Coastguard Worker if (entity != NULL)
830*7c568831SAndroid Build Coastguard Worker xmlFreeEntity((xmlEntityPtr) entity);
831*7c568831SAndroid Build Coastguard Worker }
832*7c568831SAndroid Build Coastguard Worker
833*7c568831SAndroid Build Coastguard Worker /**
834*7c568831SAndroid Build Coastguard Worker * xmlFreeEntitiesTable:
835*7c568831SAndroid Build Coastguard Worker * @table: An entity table
836*7c568831SAndroid Build Coastguard Worker *
837*7c568831SAndroid Build Coastguard Worker * Deallocate the memory used by an entities hash table.
838*7c568831SAndroid Build Coastguard Worker */
839*7c568831SAndroid Build Coastguard Worker void
xmlFreeEntitiesTable(xmlEntitiesTablePtr table)840*7c568831SAndroid Build Coastguard Worker xmlFreeEntitiesTable(xmlEntitiesTablePtr table) {
841*7c568831SAndroid Build Coastguard Worker xmlHashFree(table, xmlFreeEntityWrapper);
842*7c568831SAndroid Build Coastguard Worker }
843*7c568831SAndroid Build Coastguard Worker
844*7c568831SAndroid Build Coastguard Worker /**
845*7c568831SAndroid Build Coastguard Worker * xmlCopyEntity:
846*7c568831SAndroid Build Coastguard Worker * @ent: An entity
847*7c568831SAndroid Build Coastguard Worker *
848*7c568831SAndroid Build Coastguard Worker * Build a copy of an entity
849*7c568831SAndroid Build Coastguard Worker *
850*7c568831SAndroid Build Coastguard Worker * Returns the new xmlEntitiesPtr or NULL in case of error.
851*7c568831SAndroid Build Coastguard Worker */
852*7c568831SAndroid Build Coastguard Worker static void *
xmlCopyEntity(void * payload,const xmlChar * name ATTRIBUTE_UNUSED)853*7c568831SAndroid Build Coastguard Worker xmlCopyEntity(void *payload, const xmlChar *name ATTRIBUTE_UNUSED) {
854*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ent = (xmlEntityPtr) payload;
855*7c568831SAndroid Build Coastguard Worker xmlEntityPtr cur;
856*7c568831SAndroid Build Coastguard Worker
857*7c568831SAndroid Build Coastguard Worker cur = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity));
858*7c568831SAndroid Build Coastguard Worker if (cur == NULL)
859*7c568831SAndroid Build Coastguard Worker return(NULL);
860*7c568831SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlEntity));
861*7c568831SAndroid Build Coastguard Worker cur->type = XML_ENTITY_DECL;
862*7c568831SAndroid Build Coastguard Worker
863*7c568831SAndroid Build Coastguard Worker cur->etype = ent->etype;
864*7c568831SAndroid Build Coastguard Worker if (ent->name != NULL) {
865*7c568831SAndroid Build Coastguard Worker cur->name = xmlStrdup(ent->name);
866*7c568831SAndroid Build Coastguard Worker if (cur->name == NULL)
867*7c568831SAndroid Build Coastguard Worker goto error;
868*7c568831SAndroid Build Coastguard Worker }
869*7c568831SAndroid Build Coastguard Worker if (ent->ExternalID != NULL) {
870*7c568831SAndroid Build Coastguard Worker cur->ExternalID = xmlStrdup(ent->ExternalID);
871*7c568831SAndroid Build Coastguard Worker if (cur->ExternalID == NULL)
872*7c568831SAndroid Build Coastguard Worker goto error;
873*7c568831SAndroid Build Coastguard Worker }
874*7c568831SAndroid Build Coastguard Worker if (ent->SystemID != NULL) {
875*7c568831SAndroid Build Coastguard Worker cur->SystemID = xmlStrdup(ent->SystemID);
876*7c568831SAndroid Build Coastguard Worker if (cur->SystemID == NULL)
877*7c568831SAndroid Build Coastguard Worker goto error;
878*7c568831SAndroid Build Coastguard Worker }
879*7c568831SAndroid Build Coastguard Worker if (ent->content != NULL) {
880*7c568831SAndroid Build Coastguard Worker cur->content = xmlStrdup(ent->content);
881*7c568831SAndroid Build Coastguard Worker if (cur->content == NULL)
882*7c568831SAndroid Build Coastguard Worker goto error;
883*7c568831SAndroid Build Coastguard Worker }
884*7c568831SAndroid Build Coastguard Worker if (ent->orig != NULL) {
885*7c568831SAndroid Build Coastguard Worker cur->orig = xmlStrdup(ent->orig);
886*7c568831SAndroid Build Coastguard Worker if (cur->orig == NULL)
887*7c568831SAndroid Build Coastguard Worker goto error;
888*7c568831SAndroid Build Coastguard Worker }
889*7c568831SAndroid Build Coastguard Worker if (ent->URI != NULL) {
890*7c568831SAndroid Build Coastguard Worker cur->URI = xmlStrdup(ent->URI);
891*7c568831SAndroid Build Coastguard Worker if (cur->URI == NULL)
892*7c568831SAndroid Build Coastguard Worker goto error;
893*7c568831SAndroid Build Coastguard Worker }
894*7c568831SAndroid Build Coastguard Worker return(cur);
895*7c568831SAndroid Build Coastguard Worker
896*7c568831SAndroid Build Coastguard Worker error:
897*7c568831SAndroid Build Coastguard Worker xmlFreeEntity(cur);
898*7c568831SAndroid Build Coastguard Worker return(NULL);
899*7c568831SAndroid Build Coastguard Worker }
900*7c568831SAndroid Build Coastguard Worker
901*7c568831SAndroid Build Coastguard Worker /**
902*7c568831SAndroid Build Coastguard Worker * xmlCopyEntitiesTable:
903*7c568831SAndroid Build Coastguard Worker * @table: An entity table
904*7c568831SAndroid Build Coastguard Worker *
905*7c568831SAndroid Build Coastguard Worker * Build a copy of an entity table.
906*7c568831SAndroid Build Coastguard Worker *
907*7c568831SAndroid Build Coastguard Worker * Returns the new xmlEntitiesTablePtr or NULL in case of error.
908*7c568831SAndroid Build Coastguard Worker */
909*7c568831SAndroid Build Coastguard Worker xmlEntitiesTablePtr
xmlCopyEntitiesTable(xmlEntitiesTablePtr table)910*7c568831SAndroid Build Coastguard Worker xmlCopyEntitiesTable(xmlEntitiesTablePtr table) {
911*7c568831SAndroid Build Coastguard Worker return(xmlHashCopySafe(table, xmlCopyEntity, xmlFreeEntityWrapper));
912*7c568831SAndroid Build Coastguard Worker }
913*7c568831SAndroid Build Coastguard Worker
914*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
915*7c568831SAndroid Build Coastguard Worker
916*7c568831SAndroid Build Coastguard Worker /**
917*7c568831SAndroid Build Coastguard Worker * xmlDumpEntityDecl:
918*7c568831SAndroid Build Coastguard Worker * @buf: An XML buffer.
919*7c568831SAndroid Build Coastguard Worker * @ent: An entity table
920*7c568831SAndroid Build Coastguard Worker *
921*7c568831SAndroid Build Coastguard Worker * This will dump the content of the entity table as an XML DTD definition
922*7c568831SAndroid Build Coastguard Worker */
923*7c568831SAndroid Build Coastguard Worker void
xmlDumpEntityDecl(xmlBufferPtr buf,xmlEntityPtr ent)924*7c568831SAndroid Build Coastguard Worker xmlDumpEntityDecl(xmlBufferPtr buf, xmlEntityPtr ent) {
925*7c568831SAndroid Build Coastguard Worker xmlSaveCtxtPtr save;
926*7c568831SAndroid Build Coastguard Worker
927*7c568831SAndroid Build Coastguard Worker if ((buf == NULL) || (ent == NULL))
928*7c568831SAndroid Build Coastguard Worker return;
929*7c568831SAndroid Build Coastguard Worker
930*7c568831SAndroid Build Coastguard Worker save = xmlSaveToBuffer(buf, NULL, 0);
931*7c568831SAndroid Build Coastguard Worker xmlSaveTree(save, (xmlNodePtr) ent);
932*7c568831SAndroid Build Coastguard Worker if (xmlSaveFinish(save) != XML_ERR_OK)
933*7c568831SAndroid Build Coastguard Worker xmlFree(xmlBufferDetach(buf));
934*7c568831SAndroid Build Coastguard Worker }
935*7c568831SAndroid Build Coastguard Worker
936*7c568831SAndroid Build Coastguard Worker /**
937*7c568831SAndroid Build Coastguard Worker * xmlDumpEntityDeclScan:
938*7c568831SAndroid Build Coastguard Worker * @ent: An entity table
939*7c568831SAndroid Build Coastguard Worker * @buf: An XML buffer.
940*7c568831SAndroid Build Coastguard Worker *
941*7c568831SAndroid Build Coastguard Worker * When using the hash table scan function, arguments need to be reversed
942*7c568831SAndroid Build Coastguard Worker */
943*7c568831SAndroid Build Coastguard Worker static void
xmlDumpEntityDeclScan(void * ent,void * save,const xmlChar * name ATTRIBUTE_UNUSED)944*7c568831SAndroid Build Coastguard Worker xmlDumpEntityDeclScan(void *ent, void *save,
945*7c568831SAndroid Build Coastguard Worker const xmlChar *name ATTRIBUTE_UNUSED) {
946*7c568831SAndroid Build Coastguard Worker xmlSaveTree(save, ent);
947*7c568831SAndroid Build Coastguard Worker }
948*7c568831SAndroid Build Coastguard Worker
949*7c568831SAndroid Build Coastguard Worker /**
950*7c568831SAndroid Build Coastguard Worker * xmlDumpEntitiesTable:
951*7c568831SAndroid Build Coastguard Worker * @buf: An XML buffer.
952*7c568831SAndroid Build Coastguard Worker * @table: An entity table
953*7c568831SAndroid Build Coastguard Worker *
954*7c568831SAndroid Build Coastguard Worker * This will dump the content of the entity table as an XML DTD definition
955*7c568831SAndroid Build Coastguard Worker */
956*7c568831SAndroid Build Coastguard Worker void
xmlDumpEntitiesTable(xmlBufferPtr buf,xmlEntitiesTablePtr table)957*7c568831SAndroid Build Coastguard Worker xmlDumpEntitiesTable(xmlBufferPtr buf, xmlEntitiesTablePtr table) {
958*7c568831SAndroid Build Coastguard Worker xmlSaveCtxtPtr save;
959*7c568831SAndroid Build Coastguard Worker
960*7c568831SAndroid Build Coastguard Worker if ((buf == NULL) || (table == NULL))
961*7c568831SAndroid Build Coastguard Worker return;
962*7c568831SAndroid Build Coastguard Worker
963*7c568831SAndroid Build Coastguard Worker save = xmlSaveToBuffer(buf, NULL, 0);
964*7c568831SAndroid Build Coastguard Worker xmlHashScan(table, xmlDumpEntityDeclScan, save);
965*7c568831SAndroid Build Coastguard Worker if (xmlSaveFinish(save) != XML_ERR_OK)
966*7c568831SAndroid Build Coastguard Worker xmlFree(xmlBufferDetach(buf));
967*7c568831SAndroid Build Coastguard Worker }
968*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
969