1*6777b538SAndroid Build Coastguard Worker /*
2*6777b538SAndroid Build Coastguard Worker * tree.c : implementation of access function for an XML tree.
3*6777b538SAndroid Build Coastguard Worker *
4*6777b538SAndroid Build Coastguard Worker * References:
5*6777b538SAndroid Build Coastguard Worker * XHTML 1.0 W3C REC: http://www.w3.org/TR/2002/REC-xhtml1-20020801/
6*6777b538SAndroid Build Coastguard Worker *
7*6777b538SAndroid Build Coastguard Worker * See Copyright for the status of this software.
8*6777b538SAndroid Build Coastguard Worker *
9*6777b538SAndroid Build Coastguard Worker * [email protected]
10*6777b538SAndroid Build Coastguard Worker *
11*6777b538SAndroid Build Coastguard Worker */
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker /* To avoid EBCDIC trouble when parsing on zOS */
14*6777b538SAndroid Build Coastguard Worker #if defined(__MVS__)
15*6777b538SAndroid Build Coastguard Worker #pragma convert("ISO8859-1")
16*6777b538SAndroid Build Coastguard Worker #endif
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker #define IN_LIBXML
19*6777b538SAndroid Build Coastguard Worker #include "libxml.h"
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker #include <string.h> /* for memset() only ! */
22*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
23*6777b538SAndroid Build Coastguard Worker #include <limits.h>
24*6777b538SAndroid Build Coastguard Worker #include <ctype.h>
25*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_ZLIB_ENABLED
28*6777b538SAndroid Build Coastguard Worker #include <zlib.h>
29*6777b538SAndroid Build Coastguard Worker #endif
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker #include <libxml/tree.h>
32*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
33*6777b538SAndroid Build Coastguard Worker #include <libxml/parser.h>
34*6777b538SAndroid Build Coastguard Worker #include <libxml/uri.h>
35*6777b538SAndroid Build Coastguard Worker #include <libxml/entities.h>
36*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
37*6777b538SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
38*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
39*6777b538SAndroid Build Coastguard Worker #include <libxml/HTMLtree.h>
40*6777b538SAndroid Build Coastguard Worker #endif
41*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_DEBUG_ENABLED
42*6777b538SAndroid Build Coastguard Worker #include <libxml/debugXML.h>
43*6777b538SAndroid Build Coastguard Worker #endif
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker #include "private/buf.h"
46*6777b538SAndroid Build Coastguard Worker #include "private/entities.h"
47*6777b538SAndroid Build Coastguard Worker #include "private/error.h"
48*6777b538SAndroid Build Coastguard Worker #include "private/tree.h"
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker int __xmlRegisterCallbacks = 0;
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker /************************************************************************
53*6777b538SAndroid Build Coastguard Worker * *
54*6777b538SAndroid Build Coastguard Worker * Forward declarations *
55*6777b538SAndroid Build Coastguard Worker * *
56*6777b538SAndroid Build Coastguard Worker ************************************************************************/
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker static xmlNsPtr
59*6777b538SAndroid Build Coastguard Worker xmlNewReconciledNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns);
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker static xmlChar* xmlGetPropNodeValueInternal(const xmlAttr *prop);
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker /************************************************************************
64*6777b538SAndroid Build Coastguard Worker * *
65*6777b538SAndroid Build Coastguard Worker * A few static variables and macros *
66*6777b538SAndroid Build Coastguard Worker * *
67*6777b538SAndroid Build Coastguard Worker ************************************************************************/
68*6777b538SAndroid Build Coastguard Worker /* #undef xmlStringText */
69*6777b538SAndroid Build Coastguard Worker const xmlChar xmlStringText[] = { 't', 'e', 'x', 't', 0 };
70*6777b538SAndroid Build Coastguard Worker /* #undef xmlStringTextNoenc */
71*6777b538SAndroid Build Coastguard Worker const xmlChar xmlStringTextNoenc[] =
72*6777b538SAndroid Build Coastguard Worker { 't', 'e', 'x', 't', 'n', 'o', 'e', 'n', 'c', 0 };
73*6777b538SAndroid Build Coastguard Worker /* #undef xmlStringComment */
74*6777b538SAndroid Build Coastguard Worker const xmlChar xmlStringComment[] = { 'c', 'o', 'm', 'm', 'e', 'n', 't', 0 };
75*6777b538SAndroid Build Coastguard Worker
76*6777b538SAndroid Build Coastguard Worker static int xmlCompressMode = 0;
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker #define UPDATE_LAST_CHILD_AND_PARENT(n) if ((n) != NULL) { \
79*6777b538SAndroid Build Coastguard Worker xmlNodePtr ulccur = (n)->children; \
80*6777b538SAndroid Build Coastguard Worker if (ulccur == NULL) { \
81*6777b538SAndroid Build Coastguard Worker (n)->last = NULL; \
82*6777b538SAndroid Build Coastguard Worker } else { \
83*6777b538SAndroid Build Coastguard Worker while (ulccur->next != NULL) { \
84*6777b538SAndroid Build Coastguard Worker ulccur->parent = (n); \
85*6777b538SAndroid Build Coastguard Worker ulccur = ulccur->next; \
86*6777b538SAndroid Build Coastguard Worker } \
87*6777b538SAndroid Build Coastguard Worker ulccur->parent = (n); \
88*6777b538SAndroid Build Coastguard Worker (n)->last = ulccur; \
89*6777b538SAndroid Build Coastguard Worker }}
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker #define IS_STR_XML(str) ((str != NULL) && (str[0] == 'x') && \
92*6777b538SAndroid Build Coastguard Worker (str[1] == 'm') && (str[2] == 'l') && (str[3] == 0))
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker /************************************************************************
95*6777b538SAndroid Build Coastguard Worker * *
96*6777b538SAndroid Build Coastguard Worker * Functions to move to entities.c once the *
97*6777b538SAndroid Build Coastguard Worker * API freeze is smoothen and they can be made public. *
98*6777b538SAndroid Build Coastguard Worker * *
99*6777b538SAndroid Build Coastguard Worker ************************************************************************/
100*6777b538SAndroid Build Coastguard Worker #include <libxml/hash.h>
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
103*6777b538SAndroid Build Coastguard Worker /**
104*6777b538SAndroid Build Coastguard Worker * xmlGetEntityFromDtd:
105*6777b538SAndroid Build Coastguard Worker * @dtd: A pointer to the DTD to search
106*6777b538SAndroid Build Coastguard Worker * @name: The entity name
107*6777b538SAndroid Build Coastguard Worker *
108*6777b538SAndroid Build Coastguard Worker * Do an entity lookup in the DTD entity hash table and
109*6777b538SAndroid Build Coastguard Worker * return the corresponding entity, if found.
110*6777b538SAndroid Build Coastguard Worker *
111*6777b538SAndroid Build Coastguard Worker * Returns A pointer to the entity structure or NULL if not found.
112*6777b538SAndroid Build Coastguard Worker */
113*6777b538SAndroid Build Coastguard Worker static xmlEntityPtr
xmlGetEntityFromDtd(const xmlDtd * dtd,const xmlChar * name)114*6777b538SAndroid Build Coastguard Worker xmlGetEntityFromDtd(const xmlDtd *dtd, const xmlChar *name) {
115*6777b538SAndroid Build Coastguard Worker xmlEntitiesTablePtr table;
116*6777b538SAndroid Build Coastguard Worker
117*6777b538SAndroid Build Coastguard Worker if((dtd != NULL) && (dtd->entities != NULL)) {
118*6777b538SAndroid Build Coastguard Worker table = (xmlEntitiesTablePtr) dtd->entities;
119*6777b538SAndroid Build Coastguard Worker return((xmlEntityPtr) xmlHashLookup(table, name));
120*6777b538SAndroid Build Coastguard Worker /* return(xmlGetEntityFromTable(table, name)); */
121*6777b538SAndroid Build Coastguard Worker }
122*6777b538SAndroid Build Coastguard Worker return(NULL);
123*6777b538SAndroid Build Coastguard Worker }
124*6777b538SAndroid Build Coastguard Worker /**
125*6777b538SAndroid Build Coastguard Worker * xmlGetParameterEntityFromDtd:
126*6777b538SAndroid Build Coastguard Worker * @dtd: A pointer to the DTD to search
127*6777b538SAndroid Build Coastguard Worker * @name: The entity name
128*6777b538SAndroid Build Coastguard Worker *
129*6777b538SAndroid Build Coastguard Worker * Do an entity lookup in the DTD parameter entity hash table and
130*6777b538SAndroid Build Coastguard Worker * return the corresponding entity, if found.
131*6777b538SAndroid Build Coastguard Worker *
132*6777b538SAndroid Build Coastguard Worker * Returns A pointer to the entity structure or NULL if not found.
133*6777b538SAndroid Build Coastguard Worker */
134*6777b538SAndroid Build Coastguard Worker static xmlEntityPtr
xmlGetParameterEntityFromDtd(const xmlDtd * dtd,const xmlChar * name)135*6777b538SAndroid Build Coastguard Worker xmlGetParameterEntityFromDtd(const xmlDtd *dtd, const xmlChar *name) {
136*6777b538SAndroid Build Coastguard Worker xmlEntitiesTablePtr table;
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker if ((dtd != NULL) && (dtd->pentities != NULL)) {
139*6777b538SAndroid Build Coastguard Worker table = (xmlEntitiesTablePtr) dtd->pentities;
140*6777b538SAndroid Build Coastguard Worker return((xmlEntityPtr) xmlHashLookup(table, name));
141*6777b538SAndroid Build Coastguard Worker /* return(xmlGetEntityFromTable(table, name)); */
142*6777b538SAndroid Build Coastguard Worker }
143*6777b538SAndroid Build Coastguard Worker return(NULL);
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker /************************************************************************
148*6777b538SAndroid Build Coastguard Worker * *
149*6777b538SAndroid Build Coastguard Worker * QName handling helper *
150*6777b538SAndroid Build Coastguard Worker * *
151*6777b538SAndroid Build Coastguard Worker ************************************************************************/
152*6777b538SAndroid Build Coastguard Worker
153*6777b538SAndroid Build Coastguard Worker /**
154*6777b538SAndroid Build Coastguard Worker * xmlBuildQName:
155*6777b538SAndroid Build Coastguard Worker * @ncname: the Name
156*6777b538SAndroid Build Coastguard Worker * @prefix: the prefix
157*6777b538SAndroid Build Coastguard Worker * @memory: preallocated memory
158*6777b538SAndroid Build Coastguard Worker * @len: preallocated memory length
159*6777b538SAndroid Build Coastguard Worker *
160*6777b538SAndroid Build Coastguard Worker * Builds the QName @prefix:@ncname in @memory if there is enough space
161*6777b538SAndroid Build Coastguard Worker * and prefix is not NULL nor empty, otherwise allocate a new string.
162*6777b538SAndroid Build Coastguard Worker * If prefix is NULL or empty it returns ncname.
163*6777b538SAndroid Build Coastguard Worker *
164*6777b538SAndroid Build Coastguard Worker * Returns the new string which must be freed by the caller if different from
165*6777b538SAndroid Build Coastguard Worker * @memory and @ncname or NULL in case of error
166*6777b538SAndroid Build Coastguard Worker */
167*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlBuildQName(const xmlChar * ncname,const xmlChar * prefix,xmlChar * memory,int len)168*6777b538SAndroid Build Coastguard Worker xmlBuildQName(const xmlChar *ncname, const xmlChar *prefix,
169*6777b538SAndroid Build Coastguard Worker xmlChar *memory, int len) {
170*6777b538SAndroid Build Coastguard Worker int lenn, lenp;
171*6777b538SAndroid Build Coastguard Worker xmlChar *ret;
172*6777b538SAndroid Build Coastguard Worker
173*6777b538SAndroid Build Coastguard Worker if (ncname == NULL) return(NULL);
174*6777b538SAndroid Build Coastguard Worker if (prefix == NULL) return((xmlChar *) ncname);
175*6777b538SAndroid Build Coastguard Worker
176*6777b538SAndroid Build Coastguard Worker lenn = strlen((char *) ncname);
177*6777b538SAndroid Build Coastguard Worker lenp = strlen((char *) prefix);
178*6777b538SAndroid Build Coastguard Worker
179*6777b538SAndroid Build Coastguard Worker if ((memory == NULL) || (len < lenn + lenp + 2)) {
180*6777b538SAndroid Build Coastguard Worker ret = (xmlChar *) xmlMallocAtomic(lenn + lenp + 2);
181*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
182*6777b538SAndroid Build Coastguard Worker return(NULL);
183*6777b538SAndroid Build Coastguard Worker } else {
184*6777b538SAndroid Build Coastguard Worker ret = memory;
185*6777b538SAndroid Build Coastguard Worker }
186*6777b538SAndroid Build Coastguard Worker memcpy(&ret[0], prefix, lenp);
187*6777b538SAndroid Build Coastguard Worker ret[lenp] = ':';
188*6777b538SAndroid Build Coastguard Worker memcpy(&ret[lenp + 1], ncname, lenn);
189*6777b538SAndroid Build Coastguard Worker ret[lenn + lenp + 1] = 0;
190*6777b538SAndroid Build Coastguard Worker return(ret);
191*6777b538SAndroid Build Coastguard Worker }
192*6777b538SAndroid Build Coastguard Worker
193*6777b538SAndroid Build Coastguard Worker /**
194*6777b538SAndroid Build Coastguard Worker * xmlSplitQName2:
195*6777b538SAndroid Build Coastguard Worker * @name: the full QName
196*6777b538SAndroid Build Coastguard Worker * @prefix: a xmlChar **
197*6777b538SAndroid Build Coastguard Worker *
198*6777b538SAndroid Build Coastguard Worker * DEPRECATED: This function doesn't report malloc failures.
199*6777b538SAndroid Build Coastguard Worker *
200*6777b538SAndroid Build Coastguard Worker * parse an XML qualified name string
201*6777b538SAndroid Build Coastguard Worker *
202*6777b538SAndroid Build Coastguard Worker * [NS 5] QName ::= (Prefix ':')? LocalPart
203*6777b538SAndroid Build Coastguard Worker *
204*6777b538SAndroid Build Coastguard Worker * [NS 6] Prefix ::= NCName
205*6777b538SAndroid Build Coastguard Worker *
206*6777b538SAndroid Build Coastguard Worker * [NS 7] LocalPart ::= NCName
207*6777b538SAndroid Build Coastguard Worker *
208*6777b538SAndroid Build Coastguard Worker * Returns NULL if the name doesn't have a prefix. Otherwise, returns the
209*6777b538SAndroid Build Coastguard Worker * local part, and prefix is updated to get the Prefix. Both the return value
210*6777b538SAndroid Build Coastguard Worker * and the prefix must be freed by the caller.
211*6777b538SAndroid Build Coastguard Worker */
212*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlSplitQName2(const xmlChar * name,xmlChar ** prefix)213*6777b538SAndroid Build Coastguard Worker xmlSplitQName2(const xmlChar *name, xmlChar **prefix) {
214*6777b538SAndroid Build Coastguard Worker int len = 0;
215*6777b538SAndroid Build Coastguard Worker xmlChar *ret = NULL;
216*6777b538SAndroid Build Coastguard Worker
217*6777b538SAndroid Build Coastguard Worker if (prefix == NULL) return(NULL);
218*6777b538SAndroid Build Coastguard Worker *prefix = NULL;
219*6777b538SAndroid Build Coastguard Worker if (name == NULL) return(NULL);
220*6777b538SAndroid Build Coastguard Worker
221*6777b538SAndroid Build Coastguard Worker #ifndef XML_XML_NAMESPACE
222*6777b538SAndroid Build Coastguard Worker /* xml: prefix is not really a namespace */
223*6777b538SAndroid Build Coastguard Worker if ((name[0] == 'x') && (name[1] == 'm') &&
224*6777b538SAndroid Build Coastguard Worker (name[2] == 'l') && (name[3] == ':'))
225*6777b538SAndroid Build Coastguard Worker return(NULL);
226*6777b538SAndroid Build Coastguard Worker #endif
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard Worker /* nasty but valid */
229*6777b538SAndroid Build Coastguard Worker if (name[0] == ':')
230*6777b538SAndroid Build Coastguard Worker return(NULL);
231*6777b538SAndroid Build Coastguard Worker
232*6777b538SAndroid Build Coastguard Worker /*
233*6777b538SAndroid Build Coastguard Worker * we are not trying to validate but just to cut, and yes it will
234*6777b538SAndroid Build Coastguard Worker * work even if this is as set of UTF-8 encoded chars
235*6777b538SAndroid Build Coastguard Worker */
236*6777b538SAndroid Build Coastguard Worker while ((name[len] != 0) && (name[len] != ':'))
237*6777b538SAndroid Build Coastguard Worker len++;
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker if (name[len] == 0)
240*6777b538SAndroid Build Coastguard Worker return(NULL);
241*6777b538SAndroid Build Coastguard Worker
242*6777b538SAndroid Build Coastguard Worker *prefix = xmlStrndup(name, len);
243*6777b538SAndroid Build Coastguard Worker if (*prefix == NULL)
244*6777b538SAndroid Build Coastguard Worker return(NULL);
245*6777b538SAndroid Build Coastguard Worker ret = xmlStrdup(&name[len + 1]);
246*6777b538SAndroid Build Coastguard Worker if (ret == NULL) {
247*6777b538SAndroid Build Coastguard Worker if (*prefix != NULL) {
248*6777b538SAndroid Build Coastguard Worker xmlFree(*prefix);
249*6777b538SAndroid Build Coastguard Worker *prefix = NULL;
250*6777b538SAndroid Build Coastguard Worker }
251*6777b538SAndroid Build Coastguard Worker return(NULL);
252*6777b538SAndroid Build Coastguard Worker }
253*6777b538SAndroid Build Coastguard Worker
254*6777b538SAndroid Build Coastguard Worker return(ret);
255*6777b538SAndroid Build Coastguard Worker }
256*6777b538SAndroid Build Coastguard Worker
257*6777b538SAndroid Build Coastguard Worker /**
258*6777b538SAndroid Build Coastguard Worker * xmlSplitQName3:
259*6777b538SAndroid Build Coastguard Worker * @name: the full QName
260*6777b538SAndroid Build Coastguard Worker * @len: an int *
261*6777b538SAndroid Build Coastguard Worker *
262*6777b538SAndroid Build Coastguard Worker * parse an XML qualified name string,i
263*6777b538SAndroid Build Coastguard Worker *
264*6777b538SAndroid Build Coastguard Worker * returns NULL if it is not a Qualified Name, otherwise, update len
265*6777b538SAndroid Build Coastguard Worker * with the length in byte of the prefix and return a pointer
266*6777b538SAndroid Build Coastguard Worker * to the start of the name without the prefix
267*6777b538SAndroid Build Coastguard Worker */
268*6777b538SAndroid Build Coastguard Worker
269*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlSplitQName3(const xmlChar * name,int * len)270*6777b538SAndroid Build Coastguard Worker xmlSplitQName3(const xmlChar *name, int *len) {
271*6777b538SAndroid Build Coastguard Worker int l = 0;
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker if (name == NULL) return(NULL);
274*6777b538SAndroid Build Coastguard Worker if (len == NULL) return(NULL);
275*6777b538SAndroid Build Coastguard Worker
276*6777b538SAndroid Build Coastguard Worker /* nasty but valid */
277*6777b538SAndroid Build Coastguard Worker if (name[0] == ':')
278*6777b538SAndroid Build Coastguard Worker return(NULL);
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard Worker /*
281*6777b538SAndroid Build Coastguard Worker * we are not trying to validate but just to cut, and yes it will
282*6777b538SAndroid Build Coastguard Worker * work even if this is as set of UTF-8 encoded chars
283*6777b538SAndroid Build Coastguard Worker */
284*6777b538SAndroid Build Coastguard Worker while ((name[l] != 0) && (name[l] != ':'))
285*6777b538SAndroid Build Coastguard Worker l++;
286*6777b538SAndroid Build Coastguard Worker
287*6777b538SAndroid Build Coastguard Worker if (name[l] == 0)
288*6777b538SAndroid Build Coastguard Worker return(NULL);
289*6777b538SAndroid Build Coastguard Worker
290*6777b538SAndroid Build Coastguard Worker *len = l;
291*6777b538SAndroid Build Coastguard Worker
292*6777b538SAndroid Build Coastguard Worker return(&name[l+1]);
293*6777b538SAndroid Build Coastguard Worker }
294*6777b538SAndroid Build Coastguard Worker
295*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlSplitQName4(const xmlChar * name,xmlChar ** prefixPtr)296*6777b538SAndroid Build Coastguard Worker xmlSplitQName4(const xmlChar *name, xmlChar **prefixPtr) {
297*6777b538SAndroid Build Coastguard Worker xmlChar *prefix;
298*6777b538SAndroid Build Coastguard Worker int l = 0;
299*6777b538SAndroid Build Coastguard Worker
300*6777b538SAndroid Build Coastguard Worker if ((name == NULL) || (prefixPtr == NULL))
301*6777b538SAndroid Build Coastguard Worker return(NULL);
302*6777b538SAndroid Build Coastguard Worker
303*6777b538SAndroid Build Coastguard Worker *prefixPtr = NULL;
304*6777b538SAndroid Build Coastguard Worker
305*6777b538SAndroid Build Coastguard Worker /* nasty but valid */
306*6777b538SAndroid Build Coastguard Worker if (name[0] == ':')
307*6777b538SAndroid Build Coastguard Worker return(name);
308*6777b538SAndroid Build Coastguard Worker
309*6777b538SAndroid Build Coastguard Worker /*
310*6777b538SAndroid Build Coastguard Worker * we are not trying to validate but just to cut, and yes it will
311*6777b538SAndroid Build Coastguard Worker * work even if this is as set of UTF-8 encoded chars
312*6777b538SAndroid Build Coastguard Worker */
313*6777b538SAndroid Build Coastguard Worker while ((name[l] != 0) && (name[l] != ':'))
314*6777b538SAndroid Build Coastguard Worker l++;
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard Worker /*
317*6777b538SAndroid Build Coastguard Worker * TODO: What about names with multiple colons?
318*6777b538SAndroid Build Coastguard Worker */
319*6777b538SAndroid Build Coastguard Worker if ((name[l] == 0) || (name[l+1] == 0))
320*6777b538SAndroid Build Coastguard Worker return(name);
321*6777b538SAndroid Build Coastguard Worker
322*6777b538SAndroid Build Coastguard Worker prefix = xmlStrndup(name, l);
323*6777b538SAndroid Build Coastguard Worker if (prefix == NULL)
324*6777b538SAndroid Build Coastguard Worker return(NULL);
325*6777b538SAndroid Build Coastguard Worker
326*6777b538SAndroid Build Coastguard Worker *prefixPtr = prefix;
327*6777b538SAndroid Build Coastguard Worker return(&name[l+1]);
328*6777b538SAndroid Build Coastguard Worker }
329*6777b538SAndroid Build Coastguard Worker
330*6777b538SAndroid Build Coastguard Worker /************************************************************************
331*6777b538SAndroid Build Coastguard Worker * *
332*6777b538SAndroid Build Coastguard Worker * Check Name, NCName and QName strings *
333*6777b538SAndroid Build Coastguard Worker * *
334*6777b538SAndroid Build Coastguard Worker ************************************************************************/
335*6777b538SAndroid Build Coastguard Worker
336*6777b538SAndroid Build Coastguard Worker #define CUR_SCHAR(s, l) xmlStringCurrentChar(NULL, s, &l)
337*6777b538SAndroid Build Coastguard Worker
338*6777b538SAndroid Build Coastguard Worker /**
339*6777b538SAndroid Build Coastguard Worker * xmlValidateNCName:
340*6777b538SAndroid Build Coastguard Worker * @value: the value to check
341*6777b538SAndroid Build Coastguard Worker * @space: allow spaces in front and end of the string
342*6777b538SAndroid Build Coastguard Worker *
343*6777b538SAndroid Build Coastguard Worker * Check that a value conforms to the lexical space of NCName
344*6777b538SAndroid Build Coastguard Worker *
345*6777b538SAndroid Build Coastguard Worker * Returns 0 if this validates, a positive error code number otherwise
346*6777b538SAndroid Build Coastguard Worker * and -1 in case of internal or API error.
347*6777b538SAndroid Build Coastguard Worker */
348*6777b538SAndroid Build Coastguard Worker int
xmlValidateNCName(const xmlChar * value,int space)349*6777b538SAndroid Build Coastguard Worker xmlValidateNCName(const xmlChar *value, int space) {
350*6777b538SAndroid Build Coastguard Worker const xmlChar *cur = value;
351*6777b538SAndroid Build Coastguard Worker int c,l;
352*6777b538SAndroid Build Coastguard Worker
353*6777b538SAndroid Build Coastguard Worker if (value == NULL)
354*6777b538SAndroid Build Coastguard Worker return(-1);
355*6777b538SAndroid Build Coastguard Worker
356*6777b538SAndroid Build Coastguard Worker /*
357*6777b538SAndroid Build Coastguard Worker * First quick algorithm for ASCII range
358*6777b538SAndroid Build Coastguard Worker */
359*6777b538SAndroid Build Coastguard Worker if (space)
360*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(*cur)) cur++;
361*6777b538SAndroid Build Coastguard Worker if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) ||
362*6777b538SAndroid Build Coastguard Worker (*cur == '_'))
363*6777b538SAndroid Build Coastguard Worker cur++;
364*6777b538SAndroid Build Coastguard Worker else
365*6777b538SAndroid Build Coastguard Worker goto try_complex;
366*6777b538SAndroid Build Coastguard Worker while (((*cur >= 'a') && (*cur <= 'z')) ||
367*6777b538SAndroid Build Coastguard Worker ((*cur >= 'A') && (*cur <= 'Z')) ||
368*6777b538SAndroid Build Coastguard Worker ((*cur >= '0') && (*cur <= '9')) ||
369*6777b538SAndroid Build Coastguard Worker (*cur == '_') || (*cur == '-') || (*cur == '.'))
370*6777b538SAndroid Build Coastguard Worker cur++;
371*6777b538SAndroid Build Coastguard Worker if (space)
372*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(*cur)) cur++;
373*6777b538SAndroid Build Coastguard Worker if (*cur == 0)
374*6777b538SAndroid Build Coastguard Worker return(0);
375*6777b538SAndroid Build Coastguard Worker
376*6777b538SAndroid Build Coastguard Worker try_complex:
377*6777b538SAndroid Build Coastguard Worker /*
378*6777b538SAndroid Build Coastguard Worker * Second check for chars outside the ASCII range
379*6777b538SAndroid Build Coastguard Worker */
380*6777b538SAndroid Build Coastguard Worker cur = value;
381*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
382*6777b538SAndroid Build Coastguard Worker if (space) {
383*6777b538SAndroid Build Coastguard Worker while (IS_BLANK(c)) {
384*6777b538SAndroid Build Coastguard Worker cur += l;
385*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
386*6777b538SAndroid Build Coastguard Worker }
387*6777b538SAndroid Build Coastguard Worker }
388*6777b538SAndroid Build Coastguard Worker if ((!IS_LETTER(c)) && (c != '_'))
389*6777b538SAndroid Build Coastguard Worker return(1);
390*6777b538SAndroid Build Coastguard Worker cur += l;
391*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
392*6777b538SAndroid Build Coastguard Worker while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') ||
393*6777b538SAndroid Build Coastguard Worker (c == '-') || (c == '_') || IS_COMBINING(c) ||
394*6777b538SAndroid Build Coastguard Worker IS_EXTENDER(c)) {
395*6777b538SAndroid Build Coastguard Worker cur += l;
396*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
397*6777b538SAndroid Build Coastguard Worker }
398*6777b538SAndroid Build Coastguard Worker if (space) {
399*6777b538SAndroid Build Coastguard Worker while (IS_BLANK(c)) {
400*6777b538SAndroid Build Coastguard Worker cur += l;
401*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
402*6777b538SAndroid Build Coastguard Worker }
403*6777b538SAndroid Build Coastguard Worker }
404*6777b538SAndroid Build Coastguard Worker if (c != 0)
405*6777b538SAndroid Build Coastguard Worker return(1);
406*6777b538SAndroid Build Coastguard Worker
407*6777b538SAndroid Build Coastguard Worker return(0);
408*6777b538SAndroid Build Coastguard Worker }
409*6777b538SAndroid Build Coastguard Worker
410*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
411*6777b538SAndroid Build Coastguard Worker /**
412*6777b538SAndroid Build Coastguard Worker * xmlValidateQName:
413*6777b538SAndroid Build Coastguard Worker * @value: the value to check
414*6777b538SAndroid Build Coastguard Worker * @space: allow spaces in front and end of the string
415*6777b538SAndroid Build Coastguard Worker *
416*6777b538SAndroid Build Coastguard Worker * Check that a value conforms to the lexical space of QName
417*6777b538SAndroid Build Coastguard Worker *
418*6777b538SAndroid Build Coastguard Worker * Returns 0 if this validates, a positive error code number otherwise
419*6777b538SAndroid Build Coastguard Worker * and -1 in case of internal or API error.
420*6777b538SAndroid Build Coastguard Worker */
421*6777b538SAndroid Build Coastguard Worker int
xmlValidateQName(const xmlChar * value,int space)422*6777b538SAndroid Build Coastguard Worker xmlValidateQName(const xmlChar *value, int space) {
423*6777b538SAndroid Build Coastguard Worker const xmlChar *cur = value;
424*6777b538SAndroid Build Coastguard Worker int c,l;
425*6777b538SAndroid Build Coastguard Worker
426*6777b538SAndroid Build Coastguard Worker if (value == NULL)
427*6777b538SAndroid Build Coastguard Worker return(-1);
428*6777b538SAndroid Build Coastguard Worker /*
429*6777b538SAndroid Build Coastguard Worker * First quick algorithm for ASCII range
430*6777b538SAndroid Build Coastguard Worker */
431*6777b538SAndroid Build Coastguard Worker if (space)
432*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(*cur)) cur++;
433*6777b538SAndroid Build Coastguard Worker if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) ||
434*6777b538SAndroid Build Coastguard Worker (*cur == '_'))
435*6777b538SAndroid Build Coastguard Worker cur++;
436*6777b538SAndroid Build Coastguard Worker else
437*6777b538SAndroid Build Coastguard Worker goto try_complex;
438*6777b538SAndroid Build Coastguard Worker while (((*cur >= 'a') && (*cur <= 'z')) ||
439*6777b538SAndroid Build Coastguard Worker ((*cur >= 'A') && (*cur <= 'Z')) ||
440*6777b538SAndroid Build Coastguard Worker ((*cur >= '0') && (*cur <= '9')) ||
441*6777b538SAndroid Build Coastguard Worker (*cur == '_') || (*cur == '-') || (*cur == '.'))
442*6777b538SAndroid Build Coastguard Worker cur++;
443*6777b538SAndroid Build Coastguard Worker if (*cur == ':') {
444*6777b538SAndroid Build Coastguard Worker cur++;
445*6777b538SAndroid Build Coastguard Worker if (((*cur >= 'a') && (*cur <= 'z')) ||
446*6777b538SAndroid Build Coastguard Worker ((*cur >= 'A') && (*cur <= 'Z')) ||
447*6777b538SAndroid Build Coastguard Worker (*cur == '_'))
448*6777b538SAndroid Build Coastguard Worker cur++;
449*6777b538SAndroid Build Coastguard Worker else
450*6777b538SAndroid Build Coastguard Worker goto try_complex;
451*6777b538SAndroid Build Coastguard Worker while (((*cur >= 'a') && (*cur <= 'z')) ||
452*6777b538SAndroid Build Coastguard Worker ((*cur >= 'A') && (*cur <= 'Z')) ||
453*6777b538SAndroid Build Coastguard Worker ((*cur >= '0') && (*cur <= '9')) ||
454*6777b538SAndroid Build Coastguard Worker (*cur == '_') || (*cur == '-') || (*cur == '.'))
455*6777b538SAndroid Build Coastguard Worker cur++;
456*6777b538SAndroid Build Coastguard Worker }
457*6777b538SAndroid Build Coastguard Worker if (space)
458*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(*cur)) cur++;
459*6777b538SAndroid Build Coastguard Worker if (*cur == 0)
460*6777b538SAndroid Build Coastguard Worker return(0);
461*6777b538SAndroid Build Coastguard Worker
462*6777b538SAndroid Build Coastguard Worker try_complex:
463*6777b538SAndroid Build Coastguard Worker /*
464*6777b538SAndroid Build Coastguard Worker * Second check for chars outside the ASCII range
465*6777b538SAndroid Build Coastguard Worker */
466*6777b538SAndroid Build Coastguard Worker cur = value;
467*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
468*6777b538SAndroid Build Coastguard Worker if (space) {
469*6777b538SAndroid Build Coastguard Worker while (IS_BLANK(c)) {
470*6777b538SAndroid Build Coastguard Worker cur += l;
471*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
472*6777b538SAndroid Build Coastguard Worker }
473*6777b538SAndroid Build Coastguard Worker }
474*6777b538SAndroid Build Coastguard Worker if ((!IS_LETTER(c)) && (c != '_'))
475*6777b538SAndroid Build Coastguard Worker return(1);
476*6777b538SAndroid Build Coastguard Worker cur += l;
477*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
478*6777b538SAndroid Build Coastguard Worker while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') ||
479*6777b538SAndroid Build Coastguard Worker (c == '-') || (c == '_') || IS_COMBINING(c) ||
480*6777b538SAndroid Build Coastguard Worker IS_EXTENDER(c)) {
481*6777b538SAndroid Build Coastguard Worker cur += l;
482*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
483*6777b538SAndroid Build Coastguard Worker }
484*6777b538SAndroid Build Coastguard Worker if (c == ':') {
485*6777b538SAndroid Build Coastguard Worker cur += l;
486*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
487*6777b538SAndroid Build Coastguard Worker if ((!IS_LETTER(c)) && (c != '_'))
488*6777b538SAndroid Build Coastguard Worker return(1);
489*6777b538SAndroid Build Coastguard Worker cur += l;
490*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
491*6777b538SAndroid Build Coastguard Worker while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') ||
492*6777b538SAndroid Build Coastguard Worker (c == '-') || (c == '_') || IS_COMBINING(c) ||
493*6777b538SAndroid Build Coastguard Worker IS_EXTENDER(c)) {
494*6777b538SAndroid Build Coastguard Worker cur += l;
495*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
496*6777b538SAndroid Build Coastguard Worker }
497*6777b538SAndroid Build Coastguard Worker }
498*6777b538SAndroid Build Coastguard Worker if (space) {
499*6777b538SAndroid Build Coastguard Worker while (IS_BLANK(c)) {
500*6777b538SAndroid Build Coastguard Worker cur += l;
501*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
502*6777b538SAndroid Build Coastguard Worker }
503*6777b538SAndroid Build Coastguard Worker }
504*6777b538SAndroid Build Coastguard Worker if (c != 0)
505*6777b538SAndroid Build Coastguard Worker return(1);
506*6777b538SAndroid Build Coastguard Worker return(0);
507*6777b538SAndroid Build Coastguard Worker }
508*6777b538SAndroid Build Coastguard Worker
509*6777b538SAndroid Build Coastguard Worker /**
510*6777b538SAndroid Build Coastguard Worker * xmlValidateName:
511*6777b538SAndroid Build Coastguard Worker * @value: the value to check
512*6777b538SAndroid Build Coastguard Worker * @space: allow spaces in front and end of the string
513*6777b538SAndroid Build Coastguard Worker *
514*6777b538SAndroid Build Coastguard Worker * Check that a value conforms to the lexical space of Name
515*6777b538SAndroid Build Coastguard Worker *
516*6777b538SAndroid Build Coastguard Worker * Returns 0 if this validates, a positive error code number otherwise
517*6777b538SAndroid Build Coastguard Worker * and -1 in case of internal or API error.
518*6777b538SAndroid Build Coastguard Worker */
519*6777b538SAndroid Build Coastguard Worker int
xmlValidateName(const xmlChar * value,int space)520*6777b538SAndroid Build Coastguard Worker xmlValidateName(const xmlChar *value, int space) {
521*6777b538SAndroid Build Coastguard Worker const xmlChar *cur = value;
522*6777b538SAndroid Build Coastguard Worker int c,l;
523*6777b538SAndroid Build Coastguard Worker
524*6777b538SAndroid Build Coastguard Worker if (value == NULL)
525*6777b538SAndroid Build Coastguard Worker return(-1);
526*6777b538SAndroid Build Coastguard Worker /*
527*6777b538SAndroid Build Coastguard Worker * First quick algorithm for ASCII range
528*6777b538SAndroid Build Coastguard Worker */
529*6777b538SAndroid Build Coastguard Worker if (space)
530*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(*cur)) cur++;
531*6777b538SAndroid Build Coastguard Worker if (((*cur >= 'a') && (*cur <= 'z')) || ((*cur >= 'A') && (*cur <= 'Z')) ||
532*6777b538SAndroid Build Coastguard Worker (*cur == '_') || (*cur == ':'))
533*6777b538SAndroid Build Coastguard Worker cur++;
534*6777b538SAndroid Build Coastguard Worker else
535*6777b538SAndroid Build Coastguard Worker goto try_complex;
536*6777b538SAndroid Build Coastguard Worker while (((*cur >= 'a') && (*cur <= 'z')) ||
537*6777b538SAndroid Build Coastguard Worker ((*cur >= 'A') && (*cur <= 'Z')) ||
538*6777b538SAndroid Build Coastguard Worker ((*cur >= '0') && (*cur <= '9')) ||
539*6777b538SAndroid Build Coastguard Worker (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':'))
540*6777b538SAndroid Build Coastguard Worker cur++;
541*6777b538SAndroid Build Coastguard Worker if (space)
542*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(*cur)) cur++;
543*6777b538SAndroid Build Coastguard Worker if (*cur == 0)
544*6777b538SAndroid Build Coastguard Worker return(0);
545*6777b538SAndroid Build Coastguard Worker
546*6777b538SAndroid Build Coastguard Worker try_complex:
547*6777b538SAndroid Build Coastguard Worker /*
548*6777b538SAndroid Build Coastguard Worker * Second check for chars outside the ASCII range
549*6777b538SAndroid Build Coastguard Worker */
550*6777b538SAndroid Build Coastguard Worker cur = value;
551*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
552*6777b538SAndroid Build Coastguard Worker if (space) {
553*6777b538SAndroid Build Coastguard Worker while (IS_BLANK(c)) {
554*6777b538SAndroid Build Coastguard Worker cur += l;
555*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
556*6777b538SAndroid Build Coastguard Worker }
557*6777b538SAndroid Build Coastguard Worker }
558*6777b538SAndroid Build Coastguard Worker if ((!IS_LETTER(c)) && (c != '_') && (c != ':'))
559*6777b538SAndroid Build Coastguard Worker return(1);
560*6777b538SAndroid Build Coastguard Worker cur += l;
561*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
562*6777b538SAndroid Build Coastguard Worker while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') ||
563*6777b538SAndroid Build Coastguard Worker (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)) {
564*6777b538SAndroid Build Coastguard Worker cur += l;
565*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
566*6777b538SAndroid Build Coastguard Worker }
567*6777b538SAndroid Build Coastguard Worker if (space) {
568*6777b538SAndroid Build Coastguard Worker while (IS_BLANK(c)) {
569*6777b538SAndroid Build Coastguard Worker cur += l;
570*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
571*6777b538SAndroid Build Coastguard Worker }
572*6777b538SAndroid Build Coastguard Worker }
573*6777b538SAndroid Build Coastguard Worker if (c != 0)
574*6777b538SAndroid Build Coastguard Worker return(1);
575*6777b538SAndroid Build Coastguard Worker return(0);
576*6777b538SAndroid Build Coastguard Worker }
577*6777b538SAndroid Build Coastguard Worker
578*6777b538SAndroid Build Coastguard Worker /**
579*6777b538SAndroid Build Coastguard Worker * xmlValidateNMToken:
580*6777b538SAndroid Build Coastguard Worker * @value: the value to check
581*6777b538SAndroid Build Coastguard Worker * @space: allow spaces in front and end of the string
582*6777b538SAndroid Build Coastguard Worker *
583*6777b538SAndroid Build Coastguard Worker * Check that a value conforms to the lexical space of NMToken
584*6777b538SAndroid Build Coastguard Worker *
585*6777b538SAndroid Build Coastguard Worker * Returns 0 if this validates, a positive error code number otherwise
586*6777b538SAndroid Build Coastguard Worker * and -1 in case of internal or API error.
587*6777b538SAndroid Build Coastguard Worker */
588*6777b538SAndroid Build Coastguard Worker int
xmlValidateNMToken(const xmlChar * value,int space)589*6777b538SAndroid Build Coastguard Worker xmlValidateNMToken(const xmlChar *value, int space) {
590*6777b538SAndroid Build Coastguard Worker const xmlChar *cur = value;
591*6777b538SAndroid Build Coastguard Worker int c,l;
592*6777b538SAndroid Build Coastguard Worker
593*6777b538SAndroid Build Coastguard Worker if (value == NULL)
594*6777b538SAndroid Build Coastguard Worker return(-1);
595*6777b538SAndroid Build Coastguard Worker /*
596*6777b538SAndroid Build Coastguard Worker * First quick algorithm for ASCII range
597*6777b538SAndroid Build Coastguard Worker */
598*6777b538SAndroid Build Coastguard Worker if (space)
599*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(*cur)) cur++;
600*6777b538SAndroid Build Coastguard Worker if (((*cur >= 'a') && (*cur <= 'z')) ||
601*6777b538SAndroid Build Coastguard Worker ((*cur >= 'A') && (*cur <= 'Z')) ||
602*6777b538SAndroid Build Coastguard Worker ((*cur >= '0') && (*cur <= '9')) ||
603*6777b538SAndroid Build Coastguard Worker (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':'))
604*6777b538SAndroid Build Coastguard Worker cur++;
605*6777b538SAndroid Build Coastguard Worker else
606*6777b538SAndroid Build Coastguard Worker goto try_complex;
607*6777b538SAndroid Build Coastguard Worker while (((*cur >= 'a') && (*cur <= 'z')) ||
608*6777b538SAndroid Build Coastguard Worker ((*cur >= 'A') && (*cur <= 'Z')) ||
609*6777b538SAndroid Build Coastguard Worker ((*cur >= '0') && (*cur <= '9')) ||
610*6777b538SAndroid Build Coastguard Worker (*cur == '_') || (*cur == '-') || (*cur == '.') || (*cur == ':'))
611*6777b538SAndroid Build Coastguard Worker cur++;
612*6777b538SAndroid Build Coastguard Worker if (space)
613*6777b538SAndroid Build Coastguard Worker while (IS_BLANK_CH(*cur)) cur++;
614*6777b538SAndroid Build Coastguard Worker if (*cur == 0)
615*6777b538SAndroid Build Coastguard Worker return(0);
616*6777b538SAndroid Build Coastguard Worker
617*6777b538SAndroid Build Coastguard Worker try_complex:
618*6777b538SAndroid Build Coastguard Worker /*
619*6777b538SAndroid Build Coastguard Worker * Second check for chars outside the ASCII range
620*6777b538SAndroid Build Coastguard Worker */
621*6777b538SAndroid Build Coastguard Worker cur = value;
622*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
623*6777b538SAndroid Build Coastguard Worker if (space) {
624*6777b538SAndroid Build Coastguard Worker while (IS_BLANK(c)) {
625*6777b538SAndroid Build Coastguard Worker cur += l;
626*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
627*6777b538SAndroid Build Coastguard Worker }
628*6777b538SAndroid Build Coastguard Worker }
629*6777b538SAndroid Build Coastguard Worker if (!(IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') ||
630*6777b538SAndroid Build Coastguard Worker (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)))
631*6777b538SAndroid Build Coastguard Worker return(1);
632*6777b538SAndroid Build Coastguard Worker cur += l;
633*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
634*6777b538SAndroid Build Coastguard Worker while (IS_LETTER(c) || IS_DIGIT(c) || (c == '.') || (c == ':') ||
635*6777b538SAndroid Build Coastguard Worker (c == '-') || (c == '_') || IS_COMBINING(c) || IS_EXTENDER(c)) {
636*6777b538SAndroid Build Coastguard Worker cur += l;
637*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
638*6777b538SAndroid Build Coastguard Worker }
639*6777b538SAndroid Build Coastguard Worker if (space) {
640*6777b538SAndroid Build Coastguard Worker while (IS_BLANK(c)) {
641*6777b538SAndroid Build Coastguard Worker cur += l;
642*6777b538SAndroid Build Coastguard Worker c = CUR_SCHAR(cur, l);
643*6777b538SAndroid Build Coastguard Worker }
644*6777b538SAndroid Build Coastguard Worker }
645*6777b538SAndroid Build Coastguard Worker if (c != 0)
646*6777b538SAndroid Build Coastguard Worker return(1);
647*6777b538SAndroid Build Coastguard Worker return(0);
648*6777b538SAndroid Build Coastguard Worker }
649*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
650*6777b538SAndroid Build Coastguard Worker
651*6777b538SAndroid Build Coastguard Worker /************************************************************************
652*6777b538SAndroid Build Coastguard Worker * *
653*6777b538SAndroid Build Coastguard Worker * Allocation and deallocation of basic structures *
654*6777b538SAndroid Build Coastguard Worker * *
655*6777b538SAndroid Build Coastguard Worker ************************************************************************/
656*6777b538SAndroid Build Coastguard Worker
657*6777b538SAndroid Build Coastguard Worker /**
658*6777b538SAndroid Build Coastguard Worker * xmlSetBufferAllocationScheme:
659*6777b538SAndroid Build Coastguard Worker * @scheme: allocation method to use
660*6777b538SAndroid Build Coastguard Worker *
661*6777b538SAndroid Build Coastguard Worker * Set the buffer allocation method. Types are
662*6777b538SAndroid Build Coastguard Worker * XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down
663*6777b538SAndroid Build Coastguard Worker * XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed,
664*6777b538SAndroid Build Coastguard Worker * improves performance
665*6777b538SAndroid Build Coastguard Worker */
666*6777b538SAndroid Build Coastguard Worker void
xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme)667*6777b538SAndroid Build Coastguard Worker xmlSetBufferAllocationScheme(xmlBufferAllocationScheme scheme) {
668*6777b538SAndroid Build Coastguard Worker if ((scheme == XML_BUFFER_ALLOC_EXACT) ||
669*6777b538SAndroid Build Coastguard Worker (scheme == XML_BUFFER_ALLOC_DOUBLEIT) ||
670*6777b538SAndroid Build Coastguard Worker (scheme == XML_BUFFER_ALLOC_HYBRID))
671*6777b538SAndroid Build Coastguard Worker xmlBufferAllocScheme = scheme;
672*6777b538SAndroid Build Coastguard Worker }
673*6777b538SAndroid Build Coastguard Worker
674*6777b538SAndroid Build Coastguard Worker /**
675*6777b538SAndroid Build Coastguard Worker * xmlGetBufferAllocationScheme:
676*6777b538SAndroid Build Coastguard Worker *
677*6777b538SAndroid Build Coastguard Worker * Types are
678*6777b538SAndroid Build Coastguard Worker * XML_BUFFER_ALLOC_EXACT - use exact sizes, keeps memory usage down
679*6777b538SAndroid Build Coastguard Worker * XML_BUFFER_ALLOC_DOUBLEIT - double buffer when extra needed,
680*6777b538SAndroid Build Coastguard Worker * improves performance
681*6777b538SAndroid Build Coastguard Worker * XML_BUFFER_ALLOC_HYBRID - use exact sizes on small strings to keep memory usage tight
682*6777b538SAndroid Build Coastguard Worker * in normal usage, and doubleit on large strings to avoid
683*6777b538SAndroid Build Coastguard Worker * pathological performance.
684*6777b538SAndroid Build Coastguard Worker *
685*6777b538SAndroid Build Coastguard Worker * Returns the current allocation scheme
686*6777b538SAndroid Build Coastguard Worker */
687*6777b538SAndroid Build Coastguard Worker xmlBufferAllocationScheme
xmlGetBufferAllocationScheme(void)688*6777b538SAndroid Build Coastguard Worker xmlGetBufferAllocationScheme(void) {
689*6777b538SAndroid Build Coastguard Worker return(xmlBufferAllocScheme);
690*6777b538SAndroid Build Coastguard Worker }
691*6777b538SAndroid Build Coastguard Worker
692*6777b538SAndroid Build Coastguard Worker /**
693*6777b538SAndroid Build Coastguard Worker * xmlNewNs:
694*6777b538SAndroid Build Coastguard Worker * @node: the element carrying the namespace
695*6777b538SAndroid Build Coastguard Worker * @href: the URI associated
696*6777b538SAndroid Build Coastguard Worker * @prefix: the prefix for the namespace
697*6777b538SAndroid Build Coastguard Worker *
698*6777b538SAndroid Build Coastguard Worker * Creation of a new Namespace. This function will refuse to create
699*6777b538SAndroid Build Coastguard Worker * a namespace with a similar prefix than an existing one present on this
700*6777b538SAndroid Build Coastguard Worker * node.
701*6777b538SAndroid Build Coastguard Worker * Note that for a default namespace, @prefix should be NULL.
702*6777b538SAndroid Build Coastguard Worker *
703*6777b538SAndroid Build Coastguard Worker * We use href==NULL in the case of an element creation where the namespace
704*6777b538SAndroid Build Coastguard Worker * was not defined.
705*6777b538SAndroid Build Coastguard Worker *
706*6777b538SAndroid Build Coastguard Worker * Returns a new namespace pointer or NULL
707*6777b538SAndroid Build Coastguard Worker */
708*6777b538SAndroid Build Coastguard Worker xmlNsPtr
xmlNewNs(xmlNodePtr node,const xmlChar * href,const xmlChar * prefix)709*6777b538SAndroid Build Coastguard Worker xmlNewNs(xmlNodePtr node, const xmlChar *href, const xmlChar *prefix) {
710*6777b538SAndroid Build Coastguard Worker xmlNsPtr cur;
711*6777b538SAndroid Build Coastguard Worker
712*6777b538SAndroid Build Coastguard Worker if ((node != NULL) && (node->type != XML_ELEMENT_NODE))
713*6777b538SAndroid Build Coastguard Worker return(NULL);
714*6777b538SAndroid Build Coastguard Worker
715*6777b538SAndroid Build Coastguard Worker /*
716*6777b538SAndroid Build Coastguard Worker * Allocate a new Namespace and fill the fields.
717*6777b538SAndroid Build Coastguard Worker */
718*6777b538SAndroid Build Coastguard Worker cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
719*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
720*6777b538SAndroid Build Coastguard Worker return(NULL);
721*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNs));
722*6777b538SAndroid Build Coastguard Worker cur->type = XML_LOCAL_NAMESPACE;
723*6777b538SAndroid Build Coastguard Worker
724*6777b538SAndroid Build Coastguard Worker if (href != NULL) {
725*6777b538SAndroid Build Coastguard Worker cur->href = xmlStrdup(href);
726*6777b538SAndroid Build Coastguard Worker if (cur->href == NULL)
727*6777b538SAndroid Build Coastguard Worker goto error;
728*6777b538SAndroid Build Coastguard Worker }
729*6777b538SAndroid Build Coastguard Worker if (prefix != NULL) {
730*6777b538SAndroid Build Coastguard Worker cur->prefix = xmlStrdup(prefix);
731*6777b538SAndroid Build Coastguard Worker if (cur->prefix == NULL)
732*6777b538SAndroid Build Coastguard Worker goto error;
733*6777b538SAndroid Build Coastguard Worker }
734*6777b538SAndroid Build Coastguard Worker
735*6777b538SAndroid Build Coastguard Worker /*
736*6777b538SAndroid Build Coastguard Worker * Add it at the end to preserve parsing order ...
737*6777b538SAndroid Build Coastguard Worker * and checks for existing use of the prefix
738*6777b538SAndroid Build Coastguard Worker */
739*6777b538SAndroid Build Coastguard Worker if (node != NULL) {
740*6777b538SAndroid Build Coastguard Worker if (node->nsDef == NULL) {
741*6777b538SAndroid Build Coastguard Worker node->nsDef = cur;
742*6777b538SAndroid Build Coastguard Worker } else {
743*6777b538SAndroid Build Coastguard Worker xmlNsPtr prev = node->nsDef;
744*6777b538SAndroid Build Coastguard Worker
745*6777b538SAndroid Build Coastguard Worker if (((prev->prefix == NULL) && (cur->prefix == NULL)) ||
746*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(prev->prefix, cur->prefix)))
747*6777b538SAndroid Build Coastguard Worker goto error;
748*6777b538SAndroid Build Coastguard Worker while (prev->next != NULL) {
749*6777b538SAndroid Build Coastguard Worker prev = prev->next;
750*6777b538SAndroid Build Coastguard Worker if (((prev->prefix == NULL) && (cur->prefix == NULL)) ||
751*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(prev->prefix, cur->prefix)))
752*6777b538SAndroid Build Coastguard Worker goto error;
753*6777b538SAndroid Build Coastguard Worker }
754*6777b538SAndroid Build Coastguard Worker prev->next = cur;
755*6777b538SAndroid Build Coastguard Worker }
756*6777b538SAndroid Build Coastguard Worker }
757*6777b538SAndroid Build Coastguard Worker return(cur);
758*6777b538SAndroid Build Coastguard Worker
759*6777b538SAndroid Build Coastguard Worker error:
760*6777b538SAndroid Build Coastguard Worker xmlFreeNs(cur);
761*6777b538SAndroid Build Coastguard Worker return(NULL);
762*6777b538SAndroid Build Coastguard Worker }
763*6777b538SAndroid Build Coastguard Worker
764*6777b538SAndroid Build Coastguard Worker /**
765*6777b538SAndroid Build Coastguard Worker * xmlSetNs:
766*6777b538SAndroid Build Coastguard Worker * @node: a node in the document
767*6777b538SAndroid Build Coastguard Worker * @ns: a namespace pointer
768*6777b538SAndroid Build Coastguard Worker *
769*6777b538SAndroid Build Coastguard Worker * Associate a namespace to a node, a posteriori.
770*6777b538SAndroid Build Coastguard Worker */
771*6777b538SAndroid Build Coastguard Worker void
xmlSetNs(xmlNodePtr node,xmlNsPtr ns)772*6777b538SAndroid Build Coastguard Worker xmlSetNs(xmlNodePtr node, xmlNsPtr ns) {
773*6777b538SAndroid Build Coastguard Worker if (node == NULL) {
774*6777b538SAndroid Build Coastguard Worker return;
775*6777b538SAndroid Build Coastguard Worker }
776*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_ELEMENT_NODE) ||
777*6777b538SAndroid Build Coastguard Worker (node->type == XML_ATTRIBUTE_NODE))
778*6777b538SAndroid Build Coastguard Worker node->ns = ns;
779*6777b538SAndroid Build Coastguard Worker }
780*6777b538SAndroid Build Coastguard Worker
781*6777b538SAndroid Build Coastguard Worker /**
782*6777b538SAndroid Build Coastguard Worker * xmlFreeNs:
783*6777b538SAndroid Build Coastguard Worker * @cur: the namespace pointer
784*6777b538SAndroid Build Coastguard Worker *
785*6777b538SAndroid Build Coastguard Worker * Free up the structures associated to a namespace
786*6777b538SAndroid Build Coastguard Worker */
787*6777b538SAndroid Build Coastguard Worker void
xmlFreeNs(xmlNsPtr cur)788*6777b538SAndroid Build Coastguard Worker xmlFreeNs(xmlNsPtr cur) {
789*6777b538SAndroid Build Coastguard Worker if (cur == NULL) {
790*6777b538SAndroid Build Coastguard Worker return;
791*6777b538SAndroid Build Coastguard Worker }
792*6777b538SAndroid Build Coastguard Worker if (cur->href != NULL) xmlFree((char *) cur->href);
793*6777b538SAndroid Build Coastguard Worker if (cur->prefix != NULL) xmlFree((char *) cur->prefix);
794*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
795*6777b538SAndroid Build Coastguard Worker }
796*6777b538SAndroid Build Coastguard Worker
797*6777b538SAndroid Build Coastguard Worker /**
798*6777b538SAndroid Build Coastguard Worker * xmlFreeNsList:
799*6777b538SAndroid Build Coastguard Worker * @cur: the first namespace pointer
800*6777b538SAndroid Build Coastguard Worker *
801*6777b538SAndroid Build Coastguard Worker * Free up all the structures associated to the chained namespaces.
802*6777b538SAndroid Build Coastguard Worker */
803*6777b538SAndroid Build Coastguard Worker void
xmlFreeNsList(xmlNsPtr cur)804*6777b538SAndroid Build Coastguard Worker xmlFreeNsList(xmlNsPtr cur) {
805*6777b538SAndroid Build Coastguard Worker xmlNsPtr next;
806*6777b538SAndroid Build Coastguard Worker if (cur == NULL) {
807*6777b538SAndroid Build Coastguard Worker return;
808*6777b538SAndroid Build Coastguard Worker }
809*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
810*6777b538SAndroid Build Coastguard Worker next = cur->next;
811*6777b538SAndroid Build Coastguard Worker xmlFreeNs(cur);
812*6777b538SAndroid Build Coastguard Worker cur = next;
813*6777b538SAndroid Build Coastguard Worker }
814*6777b538SAndroid Build Coastguard Worker }
815*6777b538SAndroid Build Coastguard Worker
816*6777b538SAndroid Build Coastguard Worker /**
817*6777b538SAndroid Build Coastguard Worker * xmlNewDtd:
818*6777b538SAndroid Build Coastguard Worker * @doc: the document pointer
819*6777b538SAndroid Build Coastguard Worker * @name: the DTD name
820*6777b538SAndroid Build Coastguard Worker * @ExternalID: the external ID
821*6777b538SAndroid Build Coastguard Worker * @SystemID: the system ID
822*6777b538SAndroid Build Coastguard Worker *
823*6777b538SAndroid Build Coastguard Worker * Creation of a new DTD for the external subset. To create an
824*6777b538SAndroid Build Coastguard Worker * internal subset, use xmlCreateIntSubset().
825*6777b538SAndroid Build Coastguard Worker *
826*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new DTD structure
827*6777b538SAndroid Build Coastguard Worker */
828*6777b538SAndroid Build Coastguard Worker xmlDtdPtr
xmlNewDtd(xmlDocPtr doc,const xmlChar * name,const xmlChar * ExternalID,const xmlChar * SystemID)829*6777b538SAndroid Build Coastguard Worker xmlNewDtd(xmlDocPtr doc, const xmlChar *name,
830*6777b538SAndroid Build Coastguard Worker const xmlChar *ExternalID, const xmlChar *SystemID) {
831*6777b538SAndroid Build Coastguard Worker xmlDtdPtr cur;
832*6777b538SAndroid Build Coastguard Worker
833*6777b538SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->extSubset != NULL)) {
834*6777b538SAndroid Build Coastguard Worker return(NULL);
835*6777b538SAndroid Build Coastguard Worker }
836*6777b538SAndroid Build Coastguard Worker
837*6777b538SAndroid Build Coastguard Worker /*
838*6777b538SAndroid Build Coastguard Worker * Allocate a new DTD and fill the fields.
839*6777b538SAndroid Build Coastguard Worker */
840*6777b538SAndroid Build Coastguard Worker cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd));
841*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
842*6777b538SAndroid Build Coastguard Worker return(NULL);
843*6777b538SAndroid Build Coastguard Worker memset(cur, 0 , sizeof(xmlDtd));
844*6777b538SAndroid Build Coastguard Worker cur->type = XML_DTD_NODE;
845*6777b538SAndroid Build Coastguard Worker
846*6777b538SAndroid Build Coastguard Worker if (name != NULL) {
847*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrdup(name);
848*6777b538SAndroid Build Coastguard Worker if (cur->name == NULL)
849*6777b538SAndroid Build Coastguard Worker goto error;
850*6777b538SAndroid Build Coastguard Worker }
851*6777b538SAndroid Build Coastguard Worker if (ExternalID != NULL) {
852*6777b538SAndroid Build Coastguard Worker cur->ExternalID = xmlStrdup(ExternalID);
853*6777b538SAndroid Build Coastguard Worker if (cur->ExternalID == NULL)
854*6777b538SAndroid Build Coastguard Worker goto error;
855*6777b538SAndroid Build Coastguard Worker }
856*6777b538SAndroid Build Coastguard Worker if (SystemID != NULL) {
857*6777b538SAndroid Build Coastguard Worker cur->SystemID = xmlStrdup(SystemID);
858*6777b538SAndroid Build Coastguard Worker if (cur->SystemID == NULL)
859*6777b538SAndroid Build Coastguard Worker goto error;
860*6777b538SAndroid Build Coastguard Worker }
861*6777b538SAndroid Build Coastguard Worker if (doc != NULL)
862*6777b538SAndroid Build Coastguard Worker doc->extSubset = cur;
863*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
864*6777b538SAndroid Build Coastguard Worker
865*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
866*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
867*6777b538SAndroid Build Coastguard Worker return(cur);
868*6777b538SAndroid Build Coastguard Worker
869*6777b538SAndroid Build Coastguard Worker error:
870*6777b538SAndroid Build Coastguard Worker xmlFreeDtd(cur);
871*6777b538SAndroid Build Coastguard Worker return(NULL);
872*6777b538SAndroid Build Coastguard Worker }
873*6777b538SAndroid Build Coastguard Worker
874*6777b538SAndroid Build Coastguard Worker /**
875*6777b538SAndroid Build Coastguard Worker * xmlGetIntSubset:
876*6777b538SAndroid Build Coastguard Worker * @doc: the document pointer
877*6777b538SAndroid Build Coastguard Worker *
878*6777b538SAndroid Build Coastguard Worker * Get the internal subset of a document
879*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the DTD structure or NULL if not found
880*6777b538SAndroid Build Coastguard Worker */
881*6777b538SAndroid Build Coastguard Worker
882*6777b538SAndroid Build Coastguard Worker xmlDtdPtr
xmlGetIntSubset(const xmlDoc * doc)883*6777b538SAndroid Build Coastguard Worker xmlGetIntSubset(const xmlDoc *doc) {
884*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
885*6777b538SAndroid Build Coastguard Worker
886*6777b538SAndroid Build Coastguard Worker if (doc == NULL)
887*6777b538SAndroid Build Coastguard Worker return(NULL);
888*6777b538SAndroid Build Coastguard Worker cur = doc->children;
889*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
890*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_DTD_NODE)
891*6777b538SAndroid Build Coastguard Worker return((xmlDtdPtr) cur);
892*6777b538SAndroid Build Coastguard Worker cur = cur->next;
893*6777b538SAndroid Build Coastguard Worker }
894*6777b538SAndroid Build Coastguard Worker return((xmlDtdPtr) doc->intSubset);
895*6777b538SAndroid Build Coastguard Worker }
896*6777b538SAndroid Build Coastguard Worker
897*6777b538SAndroid Build Coastguard Worker /**
898*6777b538SAndroid Build Coastguard Worker * xmlCreateIntSubset:
899*6777b538SAndroid Build Coastguard Worker * @doc: the document pointer
900*6777b538SAndroid Build Coastguard Worker * @name: the DTD name
901*6777b538SAndroid Build Coastguard Worker * @ExternalID: the external (PUBLIC) ID
902*6777b538SAndroid Build Coastguard Worker * @SystemID: the system ID
903*6777b538SAndroid Build Coastguard Worker *
904*6777b538SAndroid Build Coastguard Worker * Create the internal subset of a document
905*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new DTD structure
906*6777b538SAndroid Build Coastguard Worker */
907*6777b538SAndroid Build Coastguard Worker xmlDtdPtr
xmlCreateIntSubset(xmlDocPtr doc,const xmlChar * name,const xmlChar * ExternalID,const xmlChar * SystemID)908*6777b538SAndroid Build Coastguard Worker xmlCreateIntSubset(xmlDocPtr doc, const xmlChar *name,
909*6777b538SAndroid Build Coastguard Worker const xmlChar *ExternalID, const xmlChar *SystemID) {
910*6777b538SAndroid Build Coastguard Worker xmlDtdPtr cur;
911*6777b538SAndroid Build Coastguard Worker
912*6777b538SAndroid Build Coastguard Worker if (doc != NULL) {
913*6777b538SAndroid Build Coastguard Worker cur = xmlGetIntSubset(doc);
914*6777b538SAndroid Build Coastguard Worker if (cur != NULL)
915*6777b538SAndroid Build Coastguard Worker return(cur);
916*6777b538SAndroid Build Coastguard Worker }
917*6777b538SAndroid Build Coastguard Worker
918*6777b538SAndroid Build Coastguard Worker /*
919*6777b538SAndroid Build Coastguard Worker * Allocate a new DTD and fill the fields.
920*6777b538SAndroid Build Coastguard Worker */
921*6777b538SAndroid Build Coastguard Worker cur = (xmlDtdPtr) xmlMalloc(sizeof(xmlDtd));
922*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
923*6777b538SAndroid Build Coastguard Worker return(NULL);
924*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlDtd));
925*6777b538SAndroid Build Coastguard Worker cur->type = XML_DTD_NODE;
926*6777b538SAndroid Build Coastguard Worker
927*6777b538SAndroid Build Coastguard Worker if (name != NULL) {
928*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrdup(name);
929*6777b538SAndroid Build Coastguard Worker if (cur->name == NULL)
930*6777b538SAndroid Build Coastguard Worker goto error;
931*6777b538SAndroid Build Coastguard Worker }
932*6777b538SAndroid Build Coastguard Worker if (ExternalID != NULL) {
933*6777b538SAndroid Build Coastguard Worker cur->ExternalID = xmlStrdup(ExternalID);
934*6777b538SAndroid Build Coastguard Worker if (cur->ExternalID == NULL)
935*6777b538SAndroid Build Coastguard Worker goto error;
936*6777b538SAndroid Build Coastguard Worker }
937*6777b538SAndroid Build Coastguard Worker if (SystemID != NULL) {
938*6777b538SAndroid Build Coastguard Worker cur->SystemID = xmlStrdup(SystemID);
939*6777b538SAndroid Build Coastguard Worker if (cur->SystemID == NULL)
940*6777b538SAndroid Build Coastguard Worker goto error;
941*6777b538SAndroid Build Coastguard Worker }
942*6777b538SAndroid Build Coastguard Worker if (doc != NULL) {
943*6777b538SAndroid Build Coastguard Worker doc->intSubset = cur;
944*6777b538SAndroid Build Coastguard Worker cur->parent = doc;
945*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
946*6777b538SAndroid Build Coastguard Worker if (doc->children == NULL) {
947*6777b538SAndroid Build Coastguard Worker doc->children = (xmlNodePtr) cur;
948*6777b538SAndroid Build Coastguard Worker doc->last = (xmlNodePtr) cur;
949*6777b538SAndroid Build Coastguard Worker } else {
950*6777b538SAndroid Build Coastguard Worker if (doc->type == XML_HTML_DOCUMENT_NODE) {
951*6777b538SAndroid Build Coastguard Worker xmlNodePtr prev;
952*6777b538SAndroid Build Coastguard Worker
953*6777b538SAndroid Build Coastguard Worker prev = doc->children;
954*6777b538SAndroid Build Coastguard Worker prev->prev = (xmlNodePtr) cur;
955*6777b538SAndroid Build Coastguard Worker cur->next = prev;
956*6777b538SAndroid Build Coastguard Worker doc->children = (xmlNodePtr) cur;
957*6777b538SAndroid Build Coastguard Worker } else {
958*6777b538SAndroid Build Coastguard Worker xmlNodePtr next;
959*6777b538SAndroid Build Coastguard Worker
960*6777b538SAndroid Build Coastguard Worker next = doc->children;
961*6777b538SAndroid Build Coastguard Worker while ((next != NULL) && (next->type != XML_ELEMENT_NODE))
962*6777b538SAndroid Build Coastguard Worker next = next->next;
963*6777b538SAndroid Build Coastguard Worker if (next == NULL) {
964*6777b538SAndroid Build Coastguard Worker cur->prev = doc->last;
965*6777b538SAndroid Build Coastguard Worker cur->prev->next = (xmlNodePtr) cur;
966*6777b538SAndroid Build Coastguard Worker cur->next = NULL;
967*6777b538SAndroid Build Coastguard Worker doc->last = (xmlNodePtr) cur;
968*6777b538SAndroid Build Coastguard Worker } else {
969*6777b538SAndroid Build Coastguard Worker cur->next = next;
970*6777b538SAndroid Build Coastguard Worker cur->prev = next->prev;
971*6777b538SAndroid Build Coastguard Worker if (cur->prev == NULL)
972*6777b538SAndroid Build Coastguard Worker doc->children = (xmlNodePtr) cur;
973*6777b538SAndroid Build Coastguard Worker else
974*6777b538SAndroid Build Coastguard Worker cur->prev->next = (xmlNodePtr) cur;
975*6777b538SAndroid Build Coastguard Worker next->prev = (xmlNodePtr) cur;
976*6777b538SAndroid Build Coastguard Worker }
977*6777b538SAndroid Build Coastguard Worker }
978*6777b538SAndroid Build Coastguard Worker }
979*6777b538SAndroid Build Coastguard Worker }
980*6777b538SAndroid Build Coastguard Worker
981*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
982*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
983*6777b538SAndroid Build Coastguard Worker return(cur);
984*6777b538SAndroid Build Coastguard Worker
985*6777b538SAndroid Build Coastguard Worker error:
986*6777b538SAndroid Build Coastguard Worker xmlFreeDtd(cur);
987*6777b538SAndroid Build Coastguard Worker return(NULL);
988*6777b538SAndroid Build Coastguard Worker }
989*6777b538SAndroid Build Coastguard Worker
990*6777b538SAndroid Build Coastguard Worker /**
991*6777b538SAndroid Build Coastguard Worker * DICT_FREE:
992*6777b538SAndroid Build Coastguard Worker * @str: a string
993*6777b538SAndroid Build Coastguard Worker *
994*6777b538SAndroid Build Coastguard Worker * Free a string if it is not owned by the "dict" dictionary in the
995*6777b538SAndroid Build Coastguard Worker * current scope
996*6777b538SAndroid Build Coastguard Worker */
997*6777b538SAndroid Build Coastguard Worker #define DICT_FREE(str) \
998*6777b538SAndroid Build Coastguard Worker if ((str) && ((!dict) || \
999*6777b538SAndroid Build Coastguard Worker (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \
1000*6777b538SAndroid Build Coastguard Worker xmlFree((char *)(str));
1001*6777b538SAndroid Build Coastguard Worker
1002*6777b538SAndroid Build Coastguard Worker
1003*6777b538SAndroid Build Coastguard Worker /**
1004*6777b538SAndroid Build Coastguard Worker * DICT_COPY:
1005*6777b538SAndroid Build Coastguard Worker * @str: a string
1006*6777b538SAndroid Build Coastguard Worker *
1007*6777b538SAndroid Build Coastguard Worker * Copy a string using a "dict" dictionary in the current scope,
1008*6777b538SAndroid Build Coastguard Worker * if available.
1009*6777b538SAndroid Build Coastguard Worker */
1010*6777b538SAndroid Build Coastguard Worker #define DICT_COPY(str, cpy) \
1011*6777b538SAndroid Build Coastguard Worker if (str) { \
1012*6777b538SAndroid Build Coastguard Worker if (dict) { \
1013*6777b538SAndroid Build Coastguard Worker if (xmlDictOwns(dict, (const xmlChar *)(str))) \
1014*6777b538SAndroid Build Coastguard Worker cpy = (xmlChar *) (str); \
1015*6777b538SAndroid Build Coastguard Worker else \
1016*6777b538SAndroid Build Coastguard Worker cpy = (xmlChar *) xmlDictLookup((dict), (const xmlChar *)(str), -1); \
1017*6777b538SAndroid Build Coastguard Worker } else \
1018*6777b538SAndroid Build Coastguard Worker cpy = xmlStrdup((const xmlChar *)(str)); }
1019*6777b538SAndroid Build Coastguard Worker
1020*6777b538SAndroid Build Coastguard Worker /**
1021*6777b538SAndroid Build Coastguard Worker * DICT_CONST_COPY:
1022*6777b538SAndroid Build Coastguard Worker * @str: a string
1023*6777b538SAndroid Build Coastguard Worker *
1024*6777b538SAndroid Build Coastguard Worker * Copy a string using a "dict" dictionary in the current scope,
1025*6777b538SAndroid Build Coastguard Worker * if available.
1026*6777b538SAndroid Build Coastguard Worker */
1027*6777b538SAndroid Build Coastguard Worker #define DICT_CONST_COPY(str, cpy) \
1028*6777b538SAndroid Build Coastguard Worker if (str) { \
1029*6777b538SAndroid Build Coastguard Worker if (dict) { \
1030*6777b538SAndroid Build Coastguard Worker if (xmlDictOwns(dict, (const xmlChar *)(str))) \
1031*6777b538SAndroid Build Coastguard Worker cpy = (const xmlChar *) (str); \
1032*6777b538SAndroid Build Coastguard Worker else \
1033*6777b538SAndroid Build Coastguard Worker cpy = xmlDictLookup((dict), (const xmlChar *)(str), -1); \
1034*6777b538SAndroid Build Coastguard Worker } else \
1035*6777b538SAndroid Build Coastguard Worker cpy = (const xmlChar *) xmlStrdup((const xmlChar *)(str)); }
1036*6777b538SAndroid Build Coastguard Worker
1037*6777b538SAndroid Build Coastguard Worker
1038*6777b538SAndroid Build Coastguard Worker /**
1039*6777b538SAndroid Build Coastguard Worker * xmlFreeDtd:
1040*6777b538SAndroid Build Coastguard Worker * @cur: the DTD structure to free up
1041*6777b538SAndroid Build Coastguard Worker *
1042*6777b538SAndroid Build Coastguard Worker * Free a DTD structure.
1043*6777b538SAndroid Build Coastguard Worker */
1044*6777b538SAndroid Build Coastguard Worker void
xmlFreeDtd(xmlDtdPtr cur)1045*6777b538SAndroid Build Coastguard Worker xmlFreeDtd(xmlDtdPtr cur) {
1046*6777b538SAndroid Build Coastguard Worker xmlDictPtr dict = NULL;
1047*6777b538SAndroid Build Coastguard Worker
1048*6777b538SAndroid Build Coastguard Worker if (cur == NULL) {
1049*6777b538SAndroid Build Coastguard Worker return;
1050*6777b538SAndroid Build Coastguard Worker }
1051*6777b538SAndroid Build Coastguard Worker if (cur->doc != NULL) dict = cur->doc->dict;
1052*6777b538SAndroid Build Coastguard Worker
1053*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
1054*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
1055*6777b538SAndroid Build Coastguard Worker
1056*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL) {
1057*6777b538SAndroid Build Coastguard Worker xmlNodePtr next, c = cur->children;
1058*6777b538SAndroid Build Coastguard Worker
1059*6777b538SAndroid Build Coastguard Worker /*
1060*6777b538SAndroid Build Coastguard Worker * Cleanup all nodes which are not part of the specific lists
1061*6777b538SAndroid Build Coastguard Worker * of notations, elements, attributes and entities.
1062*6777b538SAndroid Build Coastguard Worker */
1063*6777b538SAndroid Build Coastguard Worker while (c != NULL) {
1064*6777b538SAndroid Build Coastguard Worker next = c->next;
1065*6777b538SAndroid Build Coastguard Worker if ((c->type != XML_NOTATION_NODE) &&
1066*6777b538SAndroid Build Coastguard Worker (c->type != XML_ELEMENT_DECL) &&
1067*6777b538SAndroid Build Coastguard Worker (c->type != XML_ATTRIBUTE_DECL) &&
1068*6777b538SAndroid Build Coastguard Worker (c->type != XML_ENTITY_DECL)) {
1069*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(c);
1070*6777b538SAndroid Build Coastguard Worker xmlFreeNode(c);
1071*6777b538SAndroid Build Coastguard Worker }
1072*6777b538SAndroid Build Coastguard Worker c = next;
1073*6777b538SAndroid Build Coastguard Worker }
1074*6777b538SAndroid Build Coastguard Worker }
1075*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->name)
1076*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->SystemID)
1077*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->ExternalID)
1078*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
1079*6777b538SAndroid Build Coastguard Worker if (cur->notations != NULL)
1080*6777b538SAndroid Build Coastguard Worker xmlFreeNotationTable((xmlNotationTablePtr) cur->notations);
1081*6777b538SAndroid Build Coastguard Worker
1082*6777b538SAndroid Build Coastguard Worker if (cur->elements != NULL)
1083*6777b538SAndroid Build Coastguard Worker xmlFreeElementTable((xmlElementTablePtr) cur->elements);
1084*6777b538SAndroid Build Coastguard Worker if (cur->attributes != NULL)
1085*6777b538SAndroid Build Coastguard Worker xmlFreeAttributeTable((xmlAttributeTablePtr) cur->attributes);
1086*6777b538SAndroid Build Coastguard Worker if (cur->entities != NULL)
1087*6777b538SAndroid Build Coastguard Worker xmlFreeEntitiesTable((xmlEntitiesTablePtr) cur->entities);
1088*6777b538SAndroid Build Coastguard Worker if (cur->pentities != NULL)
1089*6777b538SAndroid Build Coastguard Worker xmlFreeEntitiesTable((xmlEntitiesTablePtr) cur->pentities);
1090*6777b538SAndroid Build Coastguard Worker
1091*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
1092*6777b538SAndroid Build Coastguard Worker }
1093*6777b538SAndroid Build Coastguard Worker
1094*6777b538SAndroid Build Coastguard Worker /**
1095*6777b538SAndroid Build Coastguard Worker * xmlNewDoc:
1096*6777b538SAndroid Build Coastguard Worker * @version: xmlChar string giving the version of XML "1.0"
1097*6777b538SAndroid Build Coastguard Worker *
1098*6777b538SAndroid Build Coastguard Worker * Creates a new XML document
1099*6777b538SAndroid Build Coastguard Worker *
1100*6777b538SAndroid Build Coastguard Worker * Returns a new document
1101*6777b538SAndroid Build Coastguard Worker */
1102*6777b538SAndroid Build Coastguard Worker xmlDocPtr
xmlNewDoc(const xmlChar * version)1103*6777b538SAndroid Build Coastguard Worker xmlNewDoc(const xmlChar *version) {
1104*6777b538SAndroid Build Coastguard Worker xmlDocPtr cur;
1105*6777b538SAndroid Build Coastguard Worker
1106*6777b538SAndroid Build Coastguard Worker if (version == NULL)
1107*6777b538SAndroid Build Coastguard Worker version = (const xmlChar *) "1.0";
1108*6777b538SAndroid Build Coastguard Worker
1109*6777b538SAndroid Build Coastguard Worker /*
1110*6777b538SAndroid Build Coastguard Worker * Allocate a new document and fill the fields.
1111*6777b538SAndroid Build Coastguard Worker */
1112*6777b538SAndroid Build Coastguard Worker cur = (xmlDocPtr) xmlMalloc(sizeof(xmlDoc));
1113*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
1114*6777b538SAndroid Build Coastguard Worker return(NULL);
1115*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlDoc));
1116*6777b538SAndroid Build Coastguard Worker cur->type = XML_DOCUMENT_NODE;
1117*6777b538SAndroid Build Coastguard Worker
1118*6777b538SAndroid Build Coastguard Worker cur->version = xmlStrdup(version);
1119*6777b538SAndroid Build Coastguard Worker if (cur->version == NULL) {
1120*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
1121*6777b538SAndroid Build Coastguard Worker return(NULL);
1122*6777b538SAndroid Build Coastguard Worker }
1123*6777b538SAndroid Build Coastguard Worker cur->standalone = -1;
1124*6777b538SAndroid Build Coastguard Worker cur->compression = -1; /* not initialized */
1125*6777b538SAndroid Build Coastguard Worker cur->doc = cur;
1126*6777b538SAndroid Build Coastguard Worker cur->parseFlags = 0;
1127*6777b538SAndroid Build Coastguard Worker cur->properties = XML_DOC_USERBUILT;
1128*6777b538SAndroid Build Coastguard Worker /*
1129*6777b538SAndroid Build Coastguard Worker * The in memory encoding is always UTF8
1130*6777b538SAndroid Build Coastguard Worker * This field will never change and would
1131*6777b538SAndroid Build Coastguard Worker * be obsolete if not for binary compatibility.
1132*6777b538SAndroid Build Coastguard Worker */
1133*6777b538SAndroid Build Coastguard Worker cur->charset = XML_CHAR_ENCODING_UTF8;
1134*6777b538SAndroid Build Coastguard Worker
1135*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
1136*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
1137*6777b538SAndroid Build Coastguard Worker return(cur);
1138*6777b538SAndroid Build Coastguard Worker }
1139*6777b538SAndroid Build Coastguard Worker
1140*6777b538SAndroid Build Coastguard Worker /**
1141*6777b538SAndroid Build Coastguard Worker * xmlFreeDoc:
1142*6777b538SAndroid Build Coastguard Worker * @cur: pointer to the document
1143*6777b538SAndroid Build Coastguard Worker *
1144*6777b538SAndroid Build Coastguard Worker * Free up all the structures used by a document, tree included.
1145*6777b538SAndroid Build Coastguard Worker */
1146*6777b538SAndroid Build Coastguard Worker void
xmlFreeDoc(xmlDocPtr cur)1147*6777b538SAndroid Build Coastguard Worker xmlFreeDoc(xmlDocPtr cur) {
1148*6777b538SAndroid Build Coastguard Worker xmlDtdPtr extSubset, intSubset;
1149*6777b538SAndroid Build Coastguard Worker xmlDictPtr dict = NULL;
1150*6777b538SAndroid Build Coastguard Worker
1151*6777b538SAndroid Build Coastguard Worker if (cur == NULL) {
1152*6777b538SAndroid Build Coastguard Worker return;
1153*6777b538SAndroid Build Coastguard Worker }
1154*6777b538SAndroid Build Coastguard Worker
1155*6777b538SAndroid Build Coastguard Worker if (cur != NULL) dict = cur->dict;
1156*6777b538SAndroid Build Coastguard Worker
1157*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
1158*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
1159*6777b538SAndroid Build Coastguard Worker
1160*6777b538SAndroid Build Coastguard Worker /*
1161*6777b538SAndroid Build Coastguard Worker * Do this before freeing the children list to avoid ID lookups
1162*6777b538SAndroid Build Coastguard Worker */
1163*6777b538SAndroid Build Coastguard Worker if (cur->ids != NULL) xmlFreeIDTable((xmlIDTablePtr) cur->ids);
1164*6777b538SAndroid Build Coastguard Worker cur->ids = NULL;
1165*6777b538SAndroid Build Coastguard Worker if (cur->refs != NULL) xmlFreeRefTable((xmlRefTablePtr) cur->refs);
1166*6777b538SAndroid Build Coastguard Worker cur->refs = NULL;
1167*6777b538SAndroid Build Coastguard Worker extSubset = cur->extSubset;
1168*6777b538SAndroid Build Coastguard Worker intSubset = cur->intSubset;
1169*6777b538SAndroid Build Coastguard Worker if (intSubset == extSubset)
1170*6777b538SAndroid Build Coastguard Worker extSubset = NULL;
1171*6777b538SAndroid Build Coastguard Worker if (extSubset != NULL) {
1172*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode((xmlNodePtr) cur->extSubset);
1173*6777b538SAndroid Build Coastguard Worker cur->extSubset = NULL;
1174*6777b538SAndroid Build Coastguard Worker xmlFreeDtd(extSubset);
1175*6777b538SAndroid Build Coastguard Worker }
1176*6777b538SAndroid Build Coastguard Worker if (intSubset != NULL) {
1177*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode((xmlNodePtr) cur->intSubset);
1178*6777b538SAndroid Build Coastguard Worker cur->intSubset = NULL;
1179*6777b538SAndroid Build Coastguard Worker xmlFreeDtd(intSubset);
1180*6777b538SAndroid Build Coastguard Worker }
1181*6777b538SAndroid Build Coastguard Worker
1182*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL) xmlFreeNodeList(cur->children);
1183*6777b538SAndroid Build Coastguard Worker if (cur->oldNs != NULL) xmlFreeNsList(cur->oldNs);
1184*6777b538SAndroid Build Coastguard Worker
1185*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->version)
1186*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->name)
1187*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->encoding)
1188*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->URL)
1189*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
1190*6777b538SAndroid Build Coastguard Worker if (dict) xmlDictFree(dict);
1191*6777b538SAndroid Build Coastguard Worker }
1192*6777b538SAndroid Build Coastguard Worker
1193*6777b538SAndroid Build Coastguard Worker /**
1194*6777b538SAndroid Build Coastguard Worker * xmlStringLenGetNodeList:
1195*6777b538SAndroid Build Coastguard Worker * @doc: the document
1196*6777b538SAndroid Build Coastguard Worker * @value: the value of the text
1197*6777b538SAndroid Build Coastguard Worker * @len: the length of the string value
1198*6777b538SAndroid Build Coastguard Worker *
1199*6777b538SAndroid Build Coastguard Worker * Parse the value string and build the node list associated. Should
1200*6777b538SAndroid Build Coastguard Worker * produce a flat tree with only TEXTs and ENTITY_REFs.
1201*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the first child
1202*6777b538SAndroid Build Coastguard Worker */
1203*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlStringLenGetNodeList(const xmlDoc * doc,const xmlChar * value,int len)1204*6777b538SAndroid Build Coastguard Worker xmlStringLenGetNodeList(const xmlDoc *doc, const xmlChar *value, int len) {
1205*6777b538SAndroid Build Coastguard Worker xmlNodePtr ret = NULL, head = NULL, last = NULL;
1206*6777b538SAndroid Build Coastguard Worker xmlNodePtr node;
1207*6777b538SAndroid Build Coastguard Worker xmlChar *val = NULL;
1208*6777b538SAndroid Build Coastguard Worker const xmlChar *cur, *end;
1209*6777b538SAndroid Build Coastguard Worker const xmlChar *q;
1210*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
1211*6777b538SAndroid Build Coastguard Worker xmlBufPtr buf;
1212*6777b538SAndroid Build Coastguard Worker
1213*6777b538SAndroid Build Coastguard Worker /*
1214*6777b538SAndroid Build Coastguard Worker * This function should only receive valid attribute values that
1215*6777b538SAndroid Build Coastguard Worker * were checked by the parser, typically by xmlParseAttValueComplex
1216*6777b538SAndroid Build Coastguard Worker * calling xmlStringDecodeEntities.
1217*6777b538SAndroid Build Coastguard Worker *
1218*6777b538SAndroid Build Coastguard Worker * In recovery mode, the parser can produce invalid attribute
1219*6777b538SAndroid Build Coastguard Worker * values. For now, we ignore any errors silently. If this is fixed,
1220*6777b538SAndroid Build Coastguard Worker * we could add assertions here to catch parser issues.
1221*6777b538SAndroid Build Coastguard Worker */
1222*6777b538SAndroid Build Coastguard Worker
1223*6777b538SAndroid Build Coastguard Worker if (value == NULL) return(NULL);
1224*6777b538SAndroid Build Coastguard Worker cur = value;
1225*6777b538SAndroid Build Coastguard Worker end = cur + len;
1226*6777b538SAndroid Build Coastguard Worker
1227*6777b538SAndroid Build Coastguard Worker buf = xmlBufCreateSize(0);
1228*6777b538SAndroid Build Coastguard Worker if (buf == NULL) return(NULL);
1229*6777b538SAndroid Build Coastguard Worker xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT);
1230*6777b538SAndroid Build Coastguard Worker
1231*6777b538SAndroid Build Coastguard Worker q = cur;
1232*6777b538SAndroid Build Coastguard Worker while ((cur < end) && (*cur != 0)) {
1233*6777b538SAndroid Build Coastguard Worker if (cur[0] == '&') {
1234*6777b538SAndroid Build Coastguard Worker int charval = 0;
1235*6777b538SAndroid Build Coastguard Worker xmlChar tmp;
1236*6777b538SAndroid Build Coastguard Worker
1237*6777b538SAndroid Build Coastguard Worker /*
1238*6777b538SAndroid Build Coastguard Worker * Save the current text.
1239*6777b538SAndroid Build Coastguard Worker */
1240*6777b538SAndroid Build Coastguard Worker if (cur != q) {
1241*6777b538SAndroid Build Coastguard Worker if (xmlBufAdd(buf, q, cur - q))
1242*6777b538SAndroid Build Coastguard Worker goto out;
1243*6777b538SAndroid Build Coastguard Worker }
1244*6777b538SAndroid Build Coastguard Worker q = cur;
1245*6777b538SAndroid Build Coastguard Worker if ((cur + 2 < end) && (cur[1] == '#') && (cur[2] == 'x')) {
1246*6777b538SAndroid Build Coastguard Worker cur += 3;
1247*6777b538SAndroid Build Coastguard Worker if (cur < end)
1248*6777b538SAndroid Build Coastguard Worker tmp = *cur;
1249*6777b538SAndroid Build Coastguard Worker else
1250*6777b538SAndroid Build Coastguard Worker tmp = 0;
1251*6777b538SAndroid Build Coastguard Worker while (tmp != ';') { /* Non input consuming loop */
1252*6777b538SAndroid Build Coastguard Worker if ((tmp >= '0') && (tmp <= '9'))
1253*6777b538SAndroid Build Coastguard Worker charval = charval * 16 + (tmp - '0');
1254*6777b538SAndroid Build Coastguard Worker else if ((tmp >= 'a') && (tmp <= 'f'))
1255*6777b538SAndroid Build Coastguard Worker charval = charval * 16 + (tmp - 'a') + 10;
1256*6777b538SAndroid Build Coastguard Worker else if ((tmp >= 'A') && (tmp <= 'F'))
1257*6777b538SAndroid Build Coastguard Worker charval = charval * 16 + (tmp - 'A') + 10;
1258*6777b538SAndroid Build Coastguard Worker else {
1259*6777b538SAndroid Build Coastguard Worker charval = 0;
1260*6777b538SAndroid Build Coastguard Worker break;
1261*6777b538SAndroid Build Coastguard Worker }
1262*6777b538SAndroid Build Coastguard Worker cur++;
1263*6777b538SAndroid Build Coastguard Worker if (cur < end)
1264*6777b538SAndroid Build Coastguard Worker tmp = *cur;
1265*6777b538SAndroid Build Coastguard Worker else
1266*6777b538SAndroid Build Coastguard Worker tmp = 0;
1267*6777b538SAndroid Build Coastguard Worker }
1268*6777b538SAndroid Build Coastguard Worker if (tmp == ';')
1269*6777b538SAndroid Build Coastguard Worker cur++;
1270*6777b538SAndroid Build Coastguard Worker q = cur;
1271*6777b538SAndroid Build Coastguard Worker } else if ((cur + 1 < end) && (cur[1] == '#')) {
1272*6777b538SAndroid Build Coastguard Worker cur += 2;
1273*6777b538SAndroid Build Coastguard Worker if (cur < end)
1274*6777b538SAndroid Build Coastguard Worker tmp = *cur;
1275*6777b538SAndroid Build Coastguard Worker else
1276*6777b538SAndroid Build Coastguard Worker tmp = 0;
1277*6777b538SAndroid Build Coastguard Worker while (tmp != ';') { /* Non input consuming loops */
1278*6777b538SAndroid Build Coastguard Worker /* Don't check for integer overflow, see above. */
1279*6777b538SAndroid Build Coastguard Worker if ((tmp >= '0') && (tmp <= '9'))
1280*6777b538SAndroid Build Coastguard Worker charval = charval * 10 + (tmp - '0');
1281*6777b538SAndroid Build Coastguard Worker else {
1282*6777b538SAndroid Build Coastguard Worker charval = 0;
1283*6777b538SAndroid Build Coastguard Worker break;
1284*6777b538SAndroid Build Coastguard Worker }
1285*6777b538SAndroid Build Coastguard Worker cur++;
1286*6777b538SAndroid Build Coastguard Worker if (cur < end)
1287*6777b538SAndroid Build Coastguard Worker tmp = *cur;
1288*6777b538SAndroid Build Coastguard Worker else
1289*6777b538SAndroid Build Coastguard Worker tmp = 0;
1290*6777b538SAndroid Build Coastguard Worker }
1291*6777b538SAndroid Build Coastguard Worker if (tmp == ';')
1292*6777b538SAndroid Build Coastguard Worker cur++;
1293*6777b538SAndroid Build Coastguard Worker q = cur;
1294*6777b538SAndroid Build Coastguard Worker } else {
1295*6777b538SAndroid Build Coastguard Worker /*
1296*6777b538SAndroid Build Coastguard Worker * Read the entity string
1297*6777b538SAndroid Build Coastguard Worker */
1298*6777b538SAndroid Build Coastguard Worker cur++;
1299*6777b538SAndroid Build Coastguard Worker q = cur;
1300*6777b538SAndroid Build Coastguard Worker while ((cur < end) && (*cur != 0) && (*cur != ';')) cur++;
1301*6777b538SAndroid Build Coastguard Worker if ((cur >= end) || (*cur == 0))
1302*6777b538SAndroid Build Coastguard Worker break;
1303*6777b538SAndroid Build Coastguard Worker if (cur != q) {
1304*6777b538SAndroid Build Coastguard Worker /*
1305*6777b538SAndroid Build Coastguard Worker * Predefined entities don't generate nodes
1306*6777b538SAndroid Build Coastguard Worker */
1307*6777b538SAndroid Build Coastguard Worker val = xmlStrndup(q, cur - q);
1308*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(doc, val);
1309*6777b538SAndroid Build Coastguard Worker if ((ent != NULL) &&
1310*6777b538SAndroid Build Coastguard Worker (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
1311*6777b538SAndroid Build Coastguard Worker
1312*6777b538SAndroid Build Coastguard Worker if (xmlBufCat(buf, ent->content))
1313*6777b538SAndroid Build Coastguard Worker goto out;
1314*6777b538SAndroid Build Coastguard Worker } else {
1315*6777b538SAndroid Build Coastguard Worker /*
1316*6777b538SAndroid Build Coastguard Worker * Flush buffer so far
1317*6777b538SAndroid Build Coastguard Worker */
1318*6777b538SAndroid Build Coastguard Worker if (!xmlBufIsEmpty(buf)) {
1319*6777b538SAndroid Build Coastguard Worker node = xmlNewDocText(doc, NULL);
1320*6777b538SAndroid Build Coastguard Worker if (node == NULL)
1321*6777b538SAndroid Build Coastguard Worker goto out;
1322*6777b538SAndroid Build Coastguard Worker node->content = xmlBufDetach(buf);
1323*6777b538SAndroid Build Coastguard Worker
1324*6777b538SAndroid Build Coastguard Worker if (last == NULL) {
1325*6777b538SAndroid Build Coastguard Worker last = head = node;
1326*6777b538SAndroid Build Coastguard Worker } else {
1327*6777b538SAndroid Build Coastguard Worker last = xmlAddNextSibling(last, node);
1328*6777b538SAndroid Build Coastguard Worker }
1329*6777b538SAndroid Build Coastguard Worker }
1330*6777b538SAndroid Build Coastguard Worker
1331*6777b538SAndroid Build Coastguard Worker /*
1332*6777b538SAndroid Build Coastguard Worker * Create a new REFERENCE_REF node
1333*6777b538SAndroid Build Coastguard Worker */
1334*6777b538SAndroid Build Coastguard Worker node = xmlNewReference(doc, val);
1335*6777b538SAndroid Build Coastguard Worker if (node == NULL)
1336*6777b538SAndroid Build Coastguard Worker goto out;
1337*6777b538SAndroid Build Coastguard Worker else if ((ent != NULL) &&
1338*6777b538SAndroid Build Coastguard Worker ((ent->flags & XML_ENT_PARSED) == 0) &&
1339*6777b538SAndroid Build Coastguard Worker ((ent->flags & XML_ENT_EXPANDING) == 0)) {
1340*6777b538SAndroid Build Coastguard Worker xmlNodePtr temp;
1341*6777b538SAndroid Build Coastguard Worker
1342*6777b538SAndroid Build Coastguard Worker /*
1343*6777b538SAndroid Build Coastguard Worker * The entity should have been checked already,
1344*6777b538SAndroid Build Coastguard Worker * but set the flag anyway to avoid recursion.
1345*6777b538SAndroid Build Coastguard Worker */
1346*6777b538SAndroid Build Coastguard Worker if (node->content != NULL) {
1347*6777b538SAndroid Build Coastguard Worker ent->flags |= XML_ENT_EXPANDING;
1348*6777b538SAndroid Build Coastguard Worker ent->children = xmlStringGetNodeList(doc,
1349*6777b538SAndroid Build Coastguard Worker node->content);
1350*6777b538SAndroid Build Coastguard Worker ent->flags &= ~XML_ENT_EXPANDING;
1351*6777b538SAndroid Build Coastguard Worker if (ent->children == NULL) {
1352*6777b538SAndroid Build Coastguard Worker xmlFreeNode(node);
1353*6777b538SAndroid Build Coastguard Worker goto out;
1354*6777b538SAndroid Build Coastguard Worker }
1355*6777b538SAndroid Build Coastguard Worker }
1356*6777b538SAndroid Build Coastguard Worker ent->flags |= XML_ENT_PARSED;
1357*6777b538SAndroid Build Coastguard Worker temp = ent->children;
1358*6777b538SAndroid Build Coastguard Worker while (temp) {
1359*6777b538SAndroid Build Coastguard Worker temp->parent = (xmlNodePtr)ent;
1360*6777b538SAndroid Build Coastguard Worker ent->last = temp;
1361*6777b538SAndroid Build Coastguard Worker temp = temp->next;
1362*6777b538SAndroid Build Coastguard Worker }
1363*6777b538SAndroid Build Coastguard Worker }
1364*6777b538SAndroid Build Coastguard Worker if (last == NULL) {
1365*6777b538SAndroid Build Coastguard Worker last = head = node;
1366*6777b538SAndroid Build Coastguard Worker } else {
1367*6777b538SAndroid Build Coastguard Worker last = xmlAddNextSibling(last, node);
1368*6777b538SAndroid Build Coastguard Worker }
1369*6777b538SAndroid Build Coastguard Worker }
1370*6777b538SAndroid Build Coastguard Worker xmlFree(val);
1371*6777b538SAndroid Build Coastguard Worker val = NULL;
1372*6777b538SAndroid Build Coastguard Worker }
1373*6777b538SAndroid Build Coastguard Worker cur++;
1374*6777b538SAndroid Build Coastguard Worker q = cur;
1375*6777b538SAndroid Build Coastguard Worker }
1376*6777b538SAndroid Build Coastguard Worker if (charval != 0) {
1377*6777b538SAndroid Build Coastguard Worker xmlChar buffer[10];
1378*6777b538SAndroid Build Coastguard Worker int l;
1379*6777b538SAndroid Build Coastguard Worker
1380*6777b538SAndroid Build Coastguard Worker l = xmlCopyCharMultiByte(buffer, charval);
1381*6777b538SAndroid Build Coastguard Worker buffer[l] = 0;
1382*6777b538SAndroid Build Coastguard Worker
1383*6777b538SAndroid Build Coastguard Worker if (xmlBufCat(buf, buffer))
1384*6777b538SAndroid Build Coastguard Worker goto out;
1385*6777b538SAndroid Build Coastguard Worker charval = 0;
1386*6777b538SAndroid Build Coastguard Worker }
1387*6777b538SAndroid Build Coastguard Worker } else
1388*6777b538SAndroid Build Coastguard Worker cur++;
1389*6777b538SAndroid Build Coastguard Worker }
1390*6777b538SAndroid Build Coastguard Worker
1391*6777b538SAndroid Build Coastguard Worker if (cur != q) {
1392*6777b538SAndroid Build Coastguard Worker /*
1393*6777b538SAndroid Build Coastguard Worker * Handle the last piece of text.
1394*6777b538SAndroid Build Coastguard Worker */
1395*6777b538SAndroid Build Coastguard Worker if (xmlBufAdd(buf, q, cur - q))
1396*6777b538SAndroid Build Coastguard Worker goto out;
1397*6777b538SAndroid Build Coastguard Worker }
1398*6777b538SAndroid Build Coastguard Worker
1399*6777b538SAndroid Build Coastguard Worker if (!xmlBufIsEmpty(buf)) {
1400*6777b538SAndroid Build Coastguard Worker node = xmlNewDocText(doc, NULL);
1401*6777b538SAndroid Build Coastguard Worker if (node == NULL)
1402*6777b538SAndroid Build Coastguard Worker goto out;
1403*6777b538SAndroid Build Coastguard Worker node->content = xmlBufDetach(buf);
1404*6777b538SAndroid Build Coastguard Worker
1405*6777b538SAndroid Build Coastguard Worker if (last == NULL) {
1406*6777b538SAndroid Build Coastguard Worker head = node;
1407*6777b538SAndroid Build Coastguard Worker } else {
1408*6777b538SAndroid Build Coastguard Worker xmlAddNextSibling(last, node);
1409*6777b538SAndroid Build Coastguard Worker }
1410*6777b538SAndroid Build Coastguard Worker } else if (head == NULL) {
1411*6777b538SAndroid Build Coastguard Worker head = xmlNewDocText(doc, BAD_CAST "");
1412*6777b538SAndroid Build Coastguard Worker }
1413*6777b538SAndroid Build Coastguard Worker
1414*6777b538SAndroid Build Coastguard Worker ret = head;
1415*6777b538SAndroid Build Coastguard Worker head = NULL;
1416*6777b538SAndroid Build Coastguard Worker
1417*6777b538SAndroid Build Coastguard Worker out:
1418*6777b538SAndroid Build Coastguard Worker xmlBufFree(buf);
1419*6777b538SAndroid Build Coastguard Worker if (val != NULL)
1420*6777b538SAndroid Build Coastguard Worker xmlFree(val);
1421*6777b538SAndroid Build Coastguard Worker if (head != NULL)
1422*6777b538SAndroid Build Coastguard Worker xmlFreeNodeList(head);
1423*6777b538SAndroid Build Coastguard Worker return(ret);
1424*6777b538SAndroid Build Coastguard Worker }
1425*6777b538SAndroid Build Coastguard Worker
1426*6777b538SAndroid Build Coastguard Worker /**
1427*6777b538SAndroid Build Coastguard Worker * xmlStringGetNodeList:
1428*6777b538SAndroid Build Coastguard Worker * @doc: the document
1429*6777b538SAndroid Build Coastguard Worker * @value: the value of the attribute
1430*6777b538SAndroid Build Coastguard Worker *
1431*6777b538SAndroid Build Coastguard Worker * Parse the value string and build the node list associated. Should
1432*6777b538SAndroid Build Coastguard Worker * produce a flat tree with only TEXTs and ENTITY_REFs.
1433*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the first child
1434*6777b538SAndroid Build Coastguard Worker */
1435*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlStringGetNodeList(const xmlDoc * doc,const xmlChar * value)1436*6777b538SAndroid Build Coastguard Worker xmlStringGetNodeList(const xmlDoc *doc, const xmlChar *value) {
1437*6777b538SAndroid Build Coastguard Worker xmlNodePtr ret = NULL, head = NULL, last = NULL;
1438*6777b538SAndroid Build Coastguard Worker xmlNodePtr node;
1439*6777b538SAndroid Build Coastguard Worker xmlChar *val = NULL;
1440*6777b538SAndroid Build Coastguard Worker const xmlChar *cur = value;
1441*6777b538SAndroid Build Coastguard Worker const xmlChar *q;
1442*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
1443*6777b538SAndroid Build Coastguard Worker xmlBufPtr buf;
1444*6777b538SAndroid Build Coastguard Worker
1445*6777b538SAndroid Build Coastguard Worker /*
1446*6777b538SAndroid Build Coastguard Worker * This function should only receive valid attribute values that
1447*6777b538SAndroid Build Coastguard Worker * were checked by the parser, typically by xmlParseAttValueComplex
1448*6777b538SAndroid Build Coastguard Worker * calling xmlStringDecodeEntities.
1449*6777b538SAndroid Build Coastguard Worker *
1450*6777b538SAndroid Build Coastguard Worker * In recovery mode, the parser can produce invalid attribute
1451*6777b538SAndroid Build Coastguard Worker * values. For now, we ignore any errors silently. If this is fixed,
1452*6777b538SAndroid Build Coastguard Worker * we could add assertions here to catch parser issues.
1453*6777b538SAndroid Build Coastguard Worker */
1454*6777b538SAndroid Build Coastguard Worker
1455*6777b538SAndroid Build Coastguard Worker if (value == NULL) return(NULL);
1456*6777b538SAndroid Build Coastguard Worker
1457*6777b538SAndroid Build Coastguard Worker buf = xmlBufCreateSize(0);
1458*6777b538SAndroid Build Coastguard Worker if (buf == NULL) return(NULL);
1459*6777b538SAndroid Build Coastguard Worker xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT);
1460*6777b538SAndroid Build Coastguard Worker
1461*6777b538SAndroid Build Coastguard Worker q = cur;
1462*6777b538SAndroid Build Coastguard Worker while (*cur != 0) {
1463*6777b538SAndroid Build Coastguard Worker if (cur[0] == '&') {
1464*6777b538SAndroid Build Coastguard Worker int charval = 0;
1465*6777b538SAndroid Build Coastguard Worker xmlChar tmp;
1466*6777b538SAndroid Build Coastguard Worker
1467*6777b538SAndroid Build Coastguard Worker /*
1468*6777b538SAndroid Build Coastguard Worker * Save the current text.
1469*6777b538SAndroid Build Coastguard Worker */
1470*6777b538SAndroid Build Coastguard Worker if (cur != q) {
1471*6777b538SAndroid Build Coastguard Worker if (xmlBufAdd(buf, q, cur - q))
1472*6777b538SAndroid Build Coastguard Worker goto out;
1473*6777b538SAndroid Build Coastguard Worker }
1474*6777b538SAndroid Build Coastguard Worker q = cur;
1475*6777b538SAndroid Build Coastguard Worker if ((cur[1] == '#') && (cur[2] == 'x')) {
1476*6777b538SAndroid Build Coastguard Worker cur += 3;
1477*6777b538SAndroid Build Coastguard Worker tmp = *cur;
1478*6777b538SAndroid Build Coastguard Worker while (tmp != ';') { /* Non input consuming loop */
1479*6777b538SAndroid Build Coastguard Worker if ((tmp >= '0') && (tmp <= '9'))
1480*6777b538SAndroid Build Coastguard Worker charval = charval * 16 + (tmp - '0');
1481*6777b538SAndroid Build Coastguard Worker else if ((tmp >= 'a') && (tmp <= 'f'))
1482*6777b538SAndroid Build Coastguard Worker charval = charval * 16 + (tmp - 'a') + 10;
1483*6777b538SAndroid Build Coastguard Worker else if ((tmp >= 'A') && (tmp <= 'F'))
1484*6777b538SAndroid Build Coastguard Worker charval = charval * 16 + (tmp - 'A') + 10;
1485*6777b538SAndroid Build Coastguard Worker else {
1486*6777b538SAndroid Build Coastguard Worker charval = 0;
1487*6777b538SAndroid Build Coastguard Worker break;
1488*6777b538SAndroid Build Coastguard Worker }
1489*6777b538SAndroid Build Coastguard Worker cur++;
1490*6777b538SAndroid Build Coastguard Worker tmp = *cur;
1491*6777b538SAndroid Build Coastguard Worker }
1492*6777b538SAndroid Build Coastguard Worker if (tmp == ';')
1493*6777b538SAndroid Build Coastguard Worker cur++;
1494*6777b538SAndroid Build Coastguard Worker q = cur;
1495*6777b538SAndroid Build Coastguard Worker } else if (cur[1] == '#') {
1496*6777b538SAndroid Build Coastguard Worker cur += 2;
1497*6777b538SAndroid Build Coastguard Worker tmp = *cur;
1498*6777b538SAndroid Build Coastguard Worker while (tmp != ';') { /* Non input consuming loops */
1499*6777b538SAndroid Build Coastguard Worker /* Don't check for integer overflow, see above. */
1500*6777b538SAndroid Build Coastguard Worker if ((tmp >= '0') && (tmp <= '9'))
1501*6777b538SAndroid Build Coastguard Worker charval = charval * 10 + (tmp - '0');
1502*6777b538SAndroid Build Coastguard Worker else {
1503*6777b538SAndroid Build Coastguard Worker charval = 0;
1504*6777b538SAndroid Build Coastguard Worker break;
1505*6777b538SAndroid Build Coastguard Worker }
1506*6777b538SAndroid Build Coastguard Worker cur++;
1507*6777b538SAndroid Build Coastguard Worker tmp = *cur;
1508*6777b538SAndroid Build Coastguard Worker }
1509*6777b538SAndroid Build Coastguard Worker if (tmp == ';')
1510*6777b538SAndroid Build Coastguard Worker cur++;
1511*6777b538SAndroid Build Coastguard Worker q = cur;
1512*6777b538SAndroid Build Coastguard Worker } else {
1513*6777b538SAndroid Build Coastguard Worker /*
1514*6777b538SAndroid Build Coastguard Worker * Read the entity string
1515*6777b538SAndroid Build Coastguard Worker */
1516*6777b538SAndroid Build Coastguard Worker cur++;
1517*6777b538SAndroid Build Coastguard Worker q = cur;
1518*6777b538SAndroid Build Coastguard Worker while ((*cur != 0) && (*cur != ';')) cur++;
1519*6777b538SAndroid Build Coastguard Worker if (*cur == 0)
1520*6777b538SAndroid Build Coastguard Worker break;
1521*6777b538SAndroid Build Coastguard Worker if (cur != q) {
1522*6777b538SAndroid Build Coastguard Worker /*
1523*6777b538SAndroid Build Coastguard Worker * Predefined entities don't generate nodes
1524*6777b538SAndroid Build Coastguard Worker */
1525*6777b538SAndroid Build Coastguard Worker val = xmlStrndup(q, cur - q);
1526*6777b538SAndroid Build Coastguard Worker if (val == NULL)
1527*6777b538SAndroid Build Coastguard Worker goto out;
1528*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(doc, val);
1529*6777b538SAndroid Build Coastguard Worker if ((ent != NULL) &&
1530*6777b538SAndroid Build Coastguard Worker (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
1531*6777b538SAndroid Build Coastguard Worker
1532*6777b538SAndroid Build Coastguard Worker if (xmlBufCat(buf, ent->content))
1533*6777b538SAndroid Build Coastguard Worker goto out;
1534*6777b538SAndroid Build Coastguard Worker
1535*6777b538SAndroid Build Coastguard Worker } else {
1536*6777b538SAndroid Build Coastguard Worker /*
1537*6777b538SAndroid Build Coastguard Worker * Flush buffer so far
1538*6777b538SAndroid Build Coastguard Worker */
1539*6777b538SAndroid Build Coastguard Worker if (!xmlBufIsEmpty(buf)) {
1540*6777b538SAndroid Build Coastguard Worker node = xmlNewDocText(doc, NULL);
1541*6777b538SAndroid Build Coastguard Worker if (node == NULL)
1542*6777b538SAndroid Build Coastguard Worker goto out;
1543*6777b538SAndroid Build Coastguard Worker node->content = xmlBufDetach(buf);
1544*6777b538SAndroid Build Coastguard Worker
1545*6777b538SAndroid Build Coastguard Worker if (last == NULL) {
1546*6777b538SAndroid Build Coastguard Worker last = head = node;
1547*6777b538SAndroid Build Coastguard Worker } else {
1548*6777b538SAndroid Build Coastguard Worker last = xmlAddNextSibling(last, node);
1549*6777b538SAndroid Build Coastguard Worker }
1550*6777b538SAndroid Build Coastguard Worker }
1551*6777b538SAndroid Build Coastguard Worker
1552*6777b538SAndroid Build Coastguard Worker /*
1553*6777b538SAndroid Build Coastguard Worker * Create a new REFERENCE_REF node
1554*6777b538SAndroid Build Coastguard Worker */
1555*6777b538SAndroid Build Coastguard Worker node = xmlNewReference(doc, val);
1556*6777b538SAndroid Build Coastguard Worker if (node == NULL)
1557*6777b538SAndroid Build Coastguard Worker goto out;
1558*6777b538SAndroid Build Coastguard Worker if ((ent != NULL) &&
1559*6777b538SAndroid Build Coastguard Worker ((ent->flags & XML_ENT_PARSED) == 0) &&
1560*6777b538SAndroid Build Coastguard Worker ((ent->flags & XML_ENT_EXPANDING) == 0)) {
1561*6777b538SAndroid Build Coastguard Worker xmlNodePtr temp;
1562*6777b538SAndroid Build Coastguard Worker
1563*6777b538SAndroid Build Coastguard Worker /*
1564*6777b538SAndroid Build Coastguard Worker * The entity should have been checked already,
1565*6777b538SAndroid Build Coastguard Worker * but set the flag anyway to avoid recursion.
1566*6777b538SAndroid Build Coastguard Worker */
1567*6777b538SAndroid Build Coastguard Worker if (node->content != NULL) {
1568*6777b538SAndroid Build Coastguard Worker ent->flags |= XML_ENT_EXPANDING;
1569*6777b538SAndroid Build Coastguard Worker ent->children = xmlStringGetNodeList(doc,
1570*6777b538SAndroid Build Coastguard Worker node->content);
1571*6777b538SAndroid Build Coastguard Worker ent->flags &= ~XML_ENT_EXPANDING;
1572*6777b538SAndroid Build Coastguard Worker if (ent->children == NULL) {
1573*6777b538SAndroid Build Coastguard Worker xmlFreeNode(node);
1574*6777b538SAndroid Build Coastguard Worker goto out;
1575*6777b538SAndroid Build Coastguard Worker }
1576*6777b538SAndroid Build Coastguard Worker }
1577*6777b538SAndroid Build Coastguard Worker ent->flags |= XML_ENT_PARSED;
1578*6777b538SAndroid Build Coastguard Worker temp = ent->children;
1579*6777b538SAndroid Build Coastguard Worker while (temp) {
1580*6777b538SAndroid Build Coastguard Worker temp->parent = (xmlNodePtr)ent;
1581*6777b538SAndroid Build Coastguard Worker ent->last = temp;
1582*6777b538SAndroid Build Coastguard Worker temp = temp->next;
1583*6777b538SAndroid Build Coastguard Worker }
1584*6777b538SAndroid Build Coastguard Worker }
1585*6777b538SAndroid Build Coastguard Worker if (last == NULL) {
1586*6777b538SAndroid Build Coastguard Worker last = head = node;
1587*6777b538SAndroid Build Coastguard Worker } else {
1588*6777b538SAndroid Build Coastguard Worker last = xmlAddNextSibling(last, node);
1589*6777b538SAndroid Build Coastguard Worker }
1590*6777b538SAndroid Build Coastguard Worker }
1591*6777b538SAndroid Build Coastguard Worker xmlFree(val);
1592*6777b538SAndroid Build Coastguard Worker val = NULL;
1593*6777b538SAndroid Build Coastguard Worker }
1594*6777b538SAndroid Build Coastguard Worker cur++;
1595*6777b538SAndroid Build Coastguard Worker q = cur;
1596*6777b538SAndroid Build Coastguard Worker }
1597*6777b538SAndroid Build Coastguard Worker if (charval != 0) {
1598*6777b538SAndroid Build Coastguard Worker xmlChar buffer[10];
1599*6777b538SAndroid Build Coastguard Worker int len;
1600*6777b538SAndroid Build Coastguard Worker
1601*6777b538SAndroid Build Coastguard Worker len = xmlCopyCharMultiByte(buffer, charval);
1602*6777b538SAndroid Build Coastguard Worker buffer[len] = 0;
1603*6777b538SAndroid Build Coastguard Worker
1604*6777b538SAndroid Build Coastguard Worker if (xmlBufCat(buf, buffer))
1605*6777b538SAndroid Build Coastguard Worker goto out;
1606*6777b538SAndroid Build Coastguard Worker charval = 0;
1607*6777b538SAndroid Build Coastguard Worker }
1608*6777b538SAndroid Build Coastguard Worker } else
1609*6777b538SAndroid Build Coastguard Worker cur++;
1610*6777b538SAndroid Build Coastguard Worker }
1611*6777b538SAndroid Build Coastguard Worker if ((cur != q) || (head == NULL)) {
1612*6777b538SAndroid Build Coastguard Worker /*
1613*6777b538SAndroid Build Coastguard Worker * Handle the last piece of text.
1614*6777b538SAndroid Build Coastguard Worker */
1615*6777b538SAndroid Build Coastguard Worker xmlBufAdd(buf, q, cur - q);
1616*6777b538SAndroid Build Coastguard Worker }
1617*6777b538SAndroid Build Coastguard Worker
1618*6777b538SAndroid Build Coastguard Worker if (xmlBufIsEmpty(buf) <= 0) {
1619*6777b538SAndroid Build Coastguard Worker node = xmlNewDocText(doc, NULL);
1620*6777b538SAndroid Build Coastguard Worker if (node == NULL)
1621*6777b538SAndroid Build Coastguard Worker goto out;
1622*6777b538SAndroid Build Coastguard Worker node->content = xmlBufDetach(buf);
1623*6777b538SAndroid Build Coastguard Worker if (node->content == NULL) {
1624*6777b538SAndroid Build Coastguard Worker xmlFreeNode(node);
1625*6777b538SAndroid Build Coastguard Worker goto out;
1626*6777b538SAndroid Build Coastguard Worker }
1627*6777b538SAndroid Build Coastguard Worker
1628*6777b538SAndroid Build Coastguard Worker if (last == NULL) {
1629*6777b538SAndroid Build Coastguard Worker head = node;
1630*6777b538SAndroid Build Coastguard Worker } else {
1631*6777b538SAndroid Build Coastguard Worker xmlAddNextSibling(last, node);
1632*6777b538SAndroid Build Coastguard Worker }
1633*6777b538SAndroid Build Coastguard Worker } else if (head == NULL) {
1634*6777b538SAndroid Build Coastguard Worker head = xmlNewDocText(doc, BAD_CAST "");
1635*6777b538SAndroid Build Coastguard Worker }
1636*6777b538SAndroid Build Coastguard Worker
1637*6777b538SAndroid Build Coastguard Worker ret = head;
1638*6777b538SAndroid Build Coastguard Worker head = NULL;
1639*6777b538SAndroid Build Coastguard Worker
1640*6777b538SAndroid Build Coastguard Worker out:
1641*6777b538SAndroid Build Coastguard Worker xmlBufFree(buf);
1642*6777b538SAndroid Build Coastguard Worker if (val != NULL) xmlFree(val);
1643*6777b538SAndroid Build Coastguard Worker if (head != NULL) xmlFreeNodeList(head);
1644*6777b538SAndroid Build Coastguard Worker return(ret);
1645*6777b538SAndroid Build Coastguard Worker }
1646*6777b538SAndroid Build Coastguard Worker
1647*6777b538SAndroid Build Coastguard Worker /**
1648*6777b538SAndroid Build Coastguard Worker * xmlNodeListGetString:
1649*6777b538SAndroid Build Coastguard Worker * @doc: the document
1650*6777b538SAndroid Build Coastguard Worker * @list: a Node list
1651*6777b538SAndroid Build Coastguard Worker * @inLine: should we replace entity contents or show their external form
1652*6777b538SAndroid Build Coastguard Worker *
1653*6777b538SAndroid Build Coastguard Worker * Build the string equivalent to the text contained in the Node list
1654*6777b538SAndroid Build Coastguard Worker * made of TEXTs and ENTITY_REFs
1655*6777b538SAndroid Build Coastguard Worker *
1656*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the string copy, the caller must free it with xmlFree().
1657*6777b538SAndroid Build Coastguard Worker */
1658*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlNodeListGetString(xmlDocPtr doc,const xmlNode * list,int inLine)1659*6777b538SAndroid Build Coastguard Worker xmlNodeListGetString(xmlDocPtr doc, const xmlNode *list, int inLine)
1660*6777b538SAndroid Build Coastguard Worker {
1661*6777b538SAndroid Build Coastguard Worker const xmlNode *node = list;
1662*6777b538SAndroid Build Coastguard Worker xmlChar *ret = NULL;
1663*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
1664*6777b538SAndroid Build Coastguard Worker int attr;
1665*6777b538SAndroid Build Coastguard Worker
1666*6777b538SAndroid Build Coastguard Worker if (list == NULL)
1667*6777b538SAndroid Build Coastguard Worker return xmlStrdup(BAD_CAST "");
1668*6777b538SAndroid Build Coastguard Worker if ((list->parent != NULL) && (list->parent->type == XML_ATTRIBUTE_NODE))
1669*6777b538SAndroid Build Coastguard Worker attr = 1;
1670*6777b538SAndroid Build Coastguard Worker else
1671*6777b538SAndroid Build Coastguard Worker attr = 0;
1672*6777b538SAndroid Build Coastguard Worker
1673*6777b538SAndroid Build Coastguard Worker while (node != NULL) {
1674*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_TEXT_NODE) ||
1675*6777b538SAndroid Build Coastguard Worker (node->type == XML_CDATA_SECTION_NODE)) {
1676*6777b538SAndroid Build Coastguard Worker if (inLine) {
1677*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, node->content);
1678*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
1679*6777b538SAndroid Build Coastguard Worker goto error;
1680*6777b538SAndroid Build Coastguard Worker } else {
1681*6777b538SAndroid Build Coastguard Worker xmlChar *buffer;
1682*6777b538SAndroid Build Coastguard Worker
1683*6777b538SAndroid Build Coastguard Worker if (attr)
1684*6777b538SAndroid Build Coastguard Worker buffer = xmlEncodeAttributeEntities(doc, node->content);
1685*6777b538SAndroid Build Coastguard Worker else
1686*6777b538SAndroid Build Coastguard Worker buffer = xmlEncodeEntitiesReentrant(doc, node->content);
1687*6777b538SAndroid Build Coastguard Worker if (buffer == NULL)
1688*6777b538SAndroid Build Coastguard Worker goto error;
1689*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, buffer);
1690*6777b538SAndroid Build Coastguard Worker xmlFree(buffer);
1691*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
1692*6777b538SAndroid Build Coastguard Worker goto error;
1693*6777b538SAndroid Build Coastguard Worker }
1694*6777b538SAndroid Build Coastguard Worker } else if (node->type == XML_ENTITY_REF_NODE) {
1695*6777b538SAndroid Build Coastguard Worker if (inLine) {
1696*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(doc, node->name);
1697*6777b538SAndroid Build Coastguard Worker if (ent != NULL) {
1698*6777b538SAndroid Build Coastguard Worker if (ent->children != NULL) {
1699*6777b538SAndroid Build Coastguard Worker xmlChar *buffer;
1700*6777b538SAndroid Build Coastguard Worker
1701*6777b538SAndroid Build Coastguard Worker /* an entity content can be any "well balanced chunk",
1702*6777b538SAndroid Build Coastguard Worker * i.e. the result of the content [43] production:
1703*6777b538SAndroid Build Coastguard Worker * http://www.w3.org/TR/REC-xml#NT-content.
1704*6777b538SAndroid Build Coastguard Worker * So it can contain text, CDATA section or nested
1705*6777b538SAndroid Build Coastguard Worker * entity reference nodes (among others).
1706*6777b538SAndroid Build Coastguard Worker * -> we recursive call xmlNodeListGetString()
1707*6777b538SAndroid Build Coastguard Worker * which handles these types */
1708*6777b538SAndroid Build Coastguard Worker buffer = xmlNodeListGetString(doc, ent->children, 1);
1709*6777b538SAndroid Build Coastguard Worker if (buffer == NULL)
1710*6777b538SAndroid Build Coastguard Worker goto error;
1711*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, buffer);
1712*6777b538SAndroid Build Coastguard Worker xmlFree(buffer);
1713*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
1714*6777b538SAndroid Build Coastguard Worker goto error;
1715*6777b538SAndroid Build Coastguard Worker }
1716*6777b538SAndroid Build Coastguard Worker } else if (node->content != NULL) {
1717*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, node->content);
1718*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
1719*6777b538SAndroid Build Coastguard Worker goto error;
1720*6777b538SAndroid Build Coastguard Worker }
1721*6777b538SAndroid Build Coastguard Worker } else {
1722*6777b538SAndroid Build Coastguard Worker xmlChar buf[2];
1723*6777b538SAndroid Build Coastguard Worker
1724*6777b538SAndroid Build Coastguard Worker buf[0] = '&';
1725*6777b538SAndroid Build Coastguard Worker buf[1] = 0;
1726*6777b538SAndroid Build Coastguard Worker ret = xmlStrncat(ret, buf, 1);
1727*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, node->name);
1728*6777b538SAndroid Build Coastguard Worker buf[0] = ';';
1729*6777b538SAndroid Build Coastguard Worker buf[1] = 0;
1730*6777b538SAndroid Build Coastguard Worker ret = xmlStrncat(ret, buf, 1);
1731*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
1732*6777b538SAndroid Build Coastguard Worker goto error;
1733*6777b538SAndroid Build Coastguard Worker }
1734*6777b538SAndroid Build Coastguard Worker }
1735*6777b538SAndroid Build Coastguard Worker node = node->next;
1736*6777b538SAndroid Build Coastguard Worker }
1737*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
1738*6777b538SAndroid Build Coastguard Worker ret = xmlStrdup(BAD_CAST "");
1739*6777b538SAndroid Build Coastguard Worker return (ret);
1740*6777b538SAndroid Build Coastguard Worker
1741*6777b538SAndroid Build Coastguard Worker error:
1742*6777b538SAndroid Build Coastguard Worker xmlFree(ret);
1743*6777b538SAndroid Build Coastguard Worker return(NULL);
1744*6777b538SAndroid Build Coastguard Worker }
1745*6777b538SAndroid Build Coastguard Worker
1746*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
1747*6777b538SAndroid Build Coastguard Worker /**
1748*6777b538SAndroid Build Coastguard Worker * xmlNodeListGetRawString:
1749*6777b538SAndroid Build Coastguard Worker * @doc: the document
1750*6777b538SAndroid Build Coastguard Worker * @list: a Node list
1751*6777b538SAndroid Build Coastguard Worker * @inLine: should we replace entity contents or show their external form
1752*6777b538SAndroid Build Coastguard Worker *
1753*6777b538SAndroid Build Coastguard Worker * Builds the string equivalent to the text contained in the Node list
1754*6777b538SAndroid Build Coastguard Worker * made of TEXTs and ENTITY_REFs, contrary to xmlNodeListGetString()
1755*6777b538SAndroid Build Coastguard Worker * this function doesn't do any character encoding handling.
1756*6777b538SAndroid Build Coastguard Worker *
1757*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the string copy, the caller must free it with xmlFree().
1758*6777b538SAndroid Build Coastguard Worker */
1759*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlNodeListGetRawString(const xmlDoc * doc,const xmlNode * list,int inLine)1760*6777b538SAndroid Build Coastguard Worker xmlNodeListGetRawString(const xmlDoc *doc, const xmlNode *list, int inLine)
1761*6777b538SAndroid Build Coastguard Worker {
1762*6777b538SAndroid Build Coastguard Worker const xmlNode *node = list;
1763*6777b538SAndroid Build Coastguard Worker xmlChar *ret = NULL;
1764*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
1765*6777b538SAndroid Build Coastguard Worker
1766*6777b538SAndroid Build Coastguard Worker if (list == NULL)
1767*6777b538SAndroid Build Coastguard Worker return xmlStrdup(BAD_CAST "");
1768*6777b538SAndroid Build Coastguard Worker
1769*6777b538SAndroid Build Coastguard Worker while (node != NULL) {
1770*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_TEXT_NODE) ||
1771*6777b538SAndroid Build Coastguard Worker (node->type == XML_CDATA_SECTION_NODE)) {
1772*6777b538SAndroid Build Coastguard Worker if (inLine) {
1773*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, node->content);
1774*6777b538SAndroid Build Coastguard Worker } else {
1775*6777b538SAndroid Build Coastguard Worker xmlChar *buffer;
1776*6777b538SAndroid Build Coastguard Worker
1777*6777b538SAndroid Build Coastguard Worker buffer = xmlEncodeSpecialChars(doc, node->content);
1778*6777b538SAndroid Build Coastguard Worker if (buffer != NULL) {
1779*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, buffer);
1780*6777b538SAndroid Build Coastguard Worker xmlFree(buffer);
1781*6777b538SAndroid Build Coastguard Worker }
1782*6777b538SAndroid Build Coastguard Worker }
1783*6777b538SAndroid Build Coastguard Worker } else if (node->type == XML_ENTITY_REF_NODE) {
1784*6777b538SAndroid Build Coastguard Worker if (inLine) {
1785*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(doc, node->name);
1786*6777b538SAndroid Build Coastguard Worker if (ent != NULL) {
1787*6777b538SAndroid Build Coastguard Worker xmlChar *buffer;
1788*6777b538SAndroid Build Coastguard Worker
1789*6777b538SAndroid Build Coastguard Worker /* an entity content can be any "well balanced chunk",
1790*6777b538SAndroid Build Coastguard Worker * i.e. the result of the content [43] production:
1791*6777b538SAndroid Build Coastguard Worker * http://www.w3.org/TR/REC-xml#NT-content.
1792*6777b538SAndroid Build Coastguard Worker * So it can contain text, CDATA section or nested
1793*6777b538SAndroid Build Coastguard Worker * entity reference nodes (among others).
1794*6777b538SAndroid Build Coastguard Worker * -> we recursive call xmlNodeListGetRawString()
1795*6777b538SAndroid Build Coastguard Worker * which handles these types */
1796*6777b538SAndroid Build Coastguard Worker buffer =
1797*6777b538SAndroid Build Coastguard Worker xmlNodeListGetRawString(doc, ent->children, 1);
1798*6777b538SAndroid Build Coastguard Worker if (buffer != NULL) {
1799*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, buffer);
1800*6777b538SAndroid Build Coastguard Worker xmlFree(buffer);
1801*6777b538SAndroid Build Coastguard Worker }
1802*6777b538SAndroid Build Coastguard Worker } else {
1803*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, node->content);
1804*6777b538SAndroid Build Coastguard Worker }
1805*6777b538SAndroid Build Coastguard Worker } else {
1806*6777b538SAndroid Build Coastguard Worker xmlChar buf[2];
1807*6777b538SAndroid Build Coastguard Worker
1808*6777b538SAndroid Build Coastguard Worker buf[0] = '&';
1809*6777b538SAndroid Build Coastguard Worker buf[1] = 0;
1810*6777b538SAndroid Build Coastguard Worker ret = xmlStrncat(ret, buf, 1);
1811*6777b538SAndroid Build Coastguard Worker ret = xmlStrcat(ret, node->name);
1812*6777b538SAndroid Build Coastguard Worker buf[0] = ';';
1813*6777b538SAndroid Build Coastguard Worker buf[1] = 0;
1814*6777b538SAndroid Build Coastguard Worker ret = xmlStrncat(ret, buf, 1);
1815*6777b538SAndroid Build Coastguard Worker }
1816*6777b538SAndroid Build Coastguard Worker }
1817*6777b538SAndroid Build Coastguard Worker node = node->next;
1818*6777b538SAndroid Build Coastguard Worker }
1819*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
1820*6777b538SAndroid Build Coastguard Worker ret = xmlStrdup(BAD_CAST "");
1821*6777b538SAndroid Build Coastguard Worker return (ret);
1822*6777b538SAndroid Build Coastguard Worker }
1823*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
1824*6777b538SAndroid Build Coastguard Worker
1825*6777b538SAndroid Build Coastguard Worker static xmlAttrPtr
xmlNewPropInternal(xmlNodePtr node,xmlNsPtr ns,const xmlChar * name,const xmlChar * value,int eatname)1826*6777b538SAndroid Build Coastguard Worker xmlNewPropInternal(xmlNodePtr node, xmlNsPtr ns,
1827*6777b538SAndroid Build Coastguard Worker const xmlChar * name, const xmlChar * value,
1828*6777b538SAndroid Build Coastguard Worker int eatname)
1829*6777b538SAndroid Build Coastguard Worker {
1830*6777b538SAndroid Build Coastguard Worker xmlAttrPtr cur;
1831*6777b538SAndroid Build Coastguard Worker xmlDocPtr doc = NULL;
1832*6777b538SAndroid Build Coastguard Worker
1833*6777b538SAndroid Build Coastguard Worker if ((node != NULL) && (node->type != XML_ELEMENT_NODE)) {
1834*6777b538SAndroid Build Coastguard Worker if ((eatname == 1) &&
1835*6777b538SAndroid Build Coastguard Worker ((node->doc == NULL) || (node->doc->dict == NULL) ||
1836*6777b538SAndroid Build Coastguard Worker (!(xmlDictOwns(node->doc->dict, name)))))
1837*6777b538SAndroid Build Coastguard Worker xmlFree((xmlChar *) name);
1838*6777b538SAndroid Build Coastguard Worker return (NULL);
1839*6777b538SAndroid Build Coastguard Worker }
1840*6777b538SAndroid Build Coastguard Worker
1841*6777b538SAndroid Build Coastguard Worker /*
1842*6777b538SAndroid Build Coastguard Worker * Allocate a new property and fill the fields.
1843*6777b538SAndroid Build Coastguard Worker */
1844*6777b538SAndroid Build Coastguard Worker cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr));
1845*6777b538SAndroid Build Coastguard Worker if (cur == NULL) {
1846*6777b538SAndroid Build Coastguard Worker if ((eatname == 1) &&
1847*6777b538SAndroid Build Coastguard Worker ((node == NULL) || (node->doc == NULL) ||
1848*6777b538SAndroid Build Coastguard Worker (node->doc->dict == NULL) ||
1849*6777b538SAndroid Build Coastguard Worker (!(xmlDictOwns(node->doc->dict, name)))))
1850*6777b538SAndroid Build Coastguard Worker xmlFree((xmlChar *) name);
1851*6777b538SAndroid Build Coastguard Worker return (NULL);
1852*6777b538SAndroid Build Coastguard Worker }
1853*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlAttr));
1854*6777b538SAndroid Build Coastguard Worker cur->type = XML_ATTRIBUTE_NODE;
1855*6777b538SAndroid Build Coastguard Worker
1856*6777b538SAndroid Build Coastguard Worker cur->parent = node;
1857*6777b538SAndroid Build Coastguard Worker if (node != NULL) {
1858*6777b538SAndroid Build Coastguard Worker doc = node->doc;
1859*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
1860*6777b538SAndroid Build Coastguard Worker }
1861*6777b538SAndroid Build Coastguard Worker cur->ns = ns;
1862*6777b538SAndroid Build Coastguard Worker
1863*6777b538SAndroid Build Coastguard Worker if (eatname == 0) {
1864*6777b538SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->dict != NULL))
1865*6777b538SAndroid Build Coastguard Worker cur->name = (xmlChar *) xmlDictLookup(doc->dict, name, -1);
1866*6777b538SAndroid Build Coastguard Worker else
1867*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrdup(name);
1868*6777b538SAndroid Build Coastguard Worker if (cur->name == NULL)
1869*6777b538SAndroid Build Coastguard Worker goto error;
1870*6777b538SAndroid Build Coastguard Worker } else
1871*6777b538SAndroid Build Coastguard Worker cur->name = name;
1872*6777b538SAndroid Build Coastguard Worker
1873*6777b538SAndroid Build Coastguard Worker if (value != NULL) {
1874*6777b538SAndroid Build Coastguard Worker xmlNodePtr tmp;
1875*6777b538SAndroid Build Coastguard Worker
1876*6777b538SAndroid Build Coastguard Worker cur->children = xmlNewDocText(doc, value);
1877*6777b538SAndroid Build Coastguard Worker if (cur->children == NULL)
1878*6777b538SAndroid Build Coastguard Worker goto error;
1879*6777b538SAndroid Build Coastguard Worker cur->last = NULL;
1880*6777b538SAndroid Build Coastguard Worker tmp = cur->children;
1881*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
1882*6777b538SAndroid Build Coastguard Worker tmp->parent = (xmlNodePtr) cur;
1883*6777b538SAndroid Build Coastguard Worker if (tmp->next == NULL)
1884*6777b538SAndroid Build Coastguard Worker cur->last = tmp;
1885*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
1886*6777b538SAndroid Build Coastguard Worker }
1887*6777b538SAndroid Build Coastguard Worker }
1888*6777b538SAndroid Build Coastguard Worker
1889*6777b538SAndroid Build Coastguard Worker if ((value != NULL) && (node != NULL) &&
1890*6777b538SAndroid Build Coastguard Worker (xmlIsID(node->doc, node, cur) == 1) &&
1891*6777b538SAndroid Build Coastguard Worker (xmlAddIDSafe(node->doc, value, cur, 0, NULL) < 0))
1892*6777b538SAndroid Build Coastguard Worker goto error;
1893*6777b538SAndroid Build Coastguard Worker
1894*6777b538SAndroid Build Coastguard Worker /*
1895*6777b538SAndroid Build Coastguard Worker * Add it at the end to preserve parsing order ...
1896*6777b538SAndroid Build Coastguard Worker */
1897*6777b538SAndroid Build Coastguard Worker if (node != NULL) {
1898*6777b538SAndroid Build Coastguard Worker if (node->properties == NULL) {
1899*6777b538SAndroid Build Coastguard Worker node->properties = cur;
1900*6777b538SAndroid Build Coastguard Worker } else {
1901*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prev = node->properties;
1902*6777b538SAndroid Build Coastguard Worker
1903*6777b538SAndroid Build Coastguard Worker while (prev->next != NULL)
1904*6777b538SAndroid Build Coastguard Worker prev = prev->next;
1905*6777b538SAndroid Build Coastguard Worker prev->next = cur;
1906*6777b538SAndroid Build Coastguard Worker cur->prev = prev;
1907*6777b538SAndroid Build Coastguard Worker }
1908*6777b538SAndroid Build Coastguard Worker }
1909*6777b538SAndroid Build Coastguard Worker
1910*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
1911*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue((xmlNodePtr) cur);
1912*6777b538SAndroid Build Coastguard Worker return (cur);
1913*6777b538SAndroid Build Coastguard Worker
1914*6777b538SAndroid Build Coastguard Worker error:
1915*6777b538SAndroid Build Coastguard Worker xmlFreeProp(cur);
1916*6777b538SAndroid Build Coastguard Worker return(NULL);
1917*6777b538SAndroid Build Coastguard Worker }
1918*6777b538SAndroid Build Coastguard Worker
1919*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \
1920*6777b538SAndroid Build Coastguard Worker defined(LIBXML_SCHEMAS_ENABLED)
1921*6777b538SAndroid Build Coastguard Worker /**
1922*6777b538SAndroid Build Coastguard Worker * xmlNewProp:
1923*6777b538SAndroid Build Coastguard Worker * @node: the holding node
1924*6777b538SAndroid Build Coastguard Worker * @name: the name of the attribute
1925*6777b538SAndroid Build Coastguard Worker * @value: the value of the attribute
1926*6777b538SAndroid Build Coastguard Worker *
1927*6777b538SAndroid Build Coastguard Worker * Create a new property carried by a node.
1928*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the attribute
1929*6777b538SAndroid Build Coastguard Worker */
1930*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlNewProp(xmlNodePtr node,const xmlChar * name,const xmlChar * value)1931*6777b538SAndroid Build Coastguard Worker xmlNewProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value) {
1932*6777b538SAndroid Build Coastguard Worker
1933*6777b538SAndroid Build Coastguard Worker if (name == NULL) {
1934*6777b538SAndroid Build Coastguard Worker return(NULL);
1935*6777b538SAndroid Build Coastguard Worker }
1936*6777b538SAndroid Build Coastguard Worker
1937*6777b538SAndroid Build Coastguard Worker return xmlNewPropInternal(node, NULL, name, value, 0);
1938*6777b538SAndroid Build Coastguard Worker }
1939*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
1940*6777b538SAndroid Build Coastguard Worker
1941*6777b538SAndroid Build Coastguard Worker /**
1942*6777b538SAndroid Build Coastguard Worker * xmlNewNsProp:
1943*6777b538SAndroid Build Coastguard Worker * @node: the holding node
1944*6777b538SAndroid Build Coastguard Worker * @ns: the namespace
1945*6777b538SAndroid Build Coastguard Worker * @name: the name of the attribute
1946*6777b538SAndroid Build Coastguard Worker * @value: the value of the attribute
1947*6777b538SAndroid Build Coastguard Worker *
1948*6777b538SAndroid Build Coastguard Worker * Create a new property tagged with a namespace and carried by a node.
1949*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the attribute
1950*6777b538SAndroid Build Coastguard Worker */
1951*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlNewNsProp(xmlNodePtr node,xmlNsPtr ns,const xmlChar * name,const xmlChar * value)1952*6777b538SAndroid Build Coastguard Worker xmlNewNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name,
1953*6777b538SAndroid Build Coastguard Worker const xmlChar *value) {
1954*6777b538SAndroid Build Coastguard Worker
1955*6777b538SAndroid Build Coastguard Worker if (name == NULL) {
1956*6777b538SAndroid Build Coastguard Worker return(NULL);
1957*6777b538SAndroid Build Coastguard Worker }
1958*6777b538SAndroid Build Coastguard Worker
1959*6777b538SAndroid Build Coastguard Worker return xmlNewPropInternal(node, ns, name, value, 0);
1960*6777b538SAndroid Build Coastguard Worker }
1961*6777b538SAndroid Build Coastguard Worker
1962*6777b538SAndroid Build Coastguard Worker /**
1963*6777b538SAndroid Build Coastguard Worker * xmlNewNsPropEatName:
1964*6777b538SAndroid Build Coastguard Worker * @node: the holding node
1965*6777b538SAndroid Build Coastguard Worker * @ns: the namespace
1966*6777b538SAndroid Build Coastguard Worker * @name: the name of the attribute
1967*6777b538SAndroid Build Coastguard Worker * @value: the value of the attribute
1968*6777b538SAndroid Build Coastguard Worker *
1969*6777b538SAndroid Build Coastguard Worker * Create a new property tagged with a namespace and carried by a node.
1970*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the attribute
1971*6777b538SAndroid Build Coastguard Worker */
1972*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlNewNsPropEatName(xmlNodePtr node,xmlNsPtr ns,xmlChar * name,const xmlChar * value)1973*6777b538SAndroid Build Coastguard Worker xmlNewNsPropEatName(xmlNodePtr node, xmlNsPtr ns, xmlChar *name,
1974*6777b538SAndroid Build Coastguard Worker const xmlChar *value) {
1975*6777b538SAndroid Build Coastguard Worker
1976*6777b538SAndroid Build Coastguard Worker if (name == NULL) {
1977*6777b538SAndroid Build Coastguard Worker return(NULL);
1978*6777b538SAndroid Build Coastguard Worker }
1979*6777b538SAndroid Build Coastguard Worker
1980*6777b538SAndroid Build Coastguard Worker return xmlNewPropInternal(node, ns, name, value, 1);
1981*6777b538SAndroid Build Coastguard Worker }
1982*6777b538SAndroid Build Coastguard Worker
1983*6777b538SAndroid Build Coastguard Worker /**
1984*6777b538SAndroid Build Coastguard Worker * xmlNewDocProp:
1985*6777b538SAndroid Build Coastguard Worker * @doc: the document
1986*6777b538SAndroid Build Coastguard Worker * @name: the name of the attribute
1987*6777b538SAndroid Build Coastguard Worker * @value: the value of the attribute
1988*6777b538SAndroid Build Coastguard Worker *
1989*6777b538SAndroid Build Coastguard Worker * Create a new property carried by a document.
1990*6777b538SAndroid Build Coastguard Worker * NOTE: @value is supposed to be a piece of XML CDATA, so it allows entity
1991*6777b538SAndroid Build Coastguard Worker * references, but XML special chars need to be escaped first by using
1992*6777b538SAndroid Build Coastguard Worker * xmlEncodeEntitiesReentrant(). Use xmlNewProp() if you don't need
1993*6777b538SAndroid Build Coastguard Worker * entities support.
1994*6777b538SAndroid Build Coastguard Worker *
1995*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the attribute
1996*6777b538SAndroid Build Coastguard Worker */
1997*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlNewDocProp(xmlDocPtr doc,const xmlChar * name,const xmlChar * value)1998*6777b538SAndroid Build Coastguard Worker xmlNewDocProp(xmlDocPtr doc, const xmlChar *name, const xmlChar *value) {
1999*6777b538SAndroid Build Coastguard Worker xmlAttrPtr cur;
2000*6777b538SAndroid Build Coastguard Worker
2001*6777b538SAndroid Build Coastguard Worker if (name == NULL) {
2002*6777b538SAndroid Build Coastguard Worker return(NULL);
2003*6777b538SAndroid Build Coastguard Worker }
2004*6777b538SAndroid Build Coastguard Worker
2005*6777b538SAndroid Build Coastguard Worker /*
2006*6777b538SAndroid Build Coastguard Worker * Allocate a new property and fill the fields.
2007*6777b538SAndroid Build Coastguard Worker */
2008*6777b538SAndroid Build Coastguard Worker cur = (xmlAttrPtr) xmlMalloc(sizeof(xmlAttr));
2009*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2010*6777b538SAndroid Build Coastguard Worker return(NULL);
2011*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlAttr));
2012*6777b538SAndroid Build Coastguard Worker cur->type = XML_ATTRIBUTE_NODE;
2013*6777b538SAndroid Build Coastguard Worker
2014*6777b538SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->dict != NULL))
2015*6777b538SAndroid Build Coastguard Worker cur->name = xmlDictLookup(doc->dict, name, -1);
2016*6777b538SAndroid Build Coastguard Worker else
2017*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrdup(name);
2018*6777b538SAndroid Build Coastguard Worker if (cur->name == NULL)
2019*6777b538SAndroid Build Coastguard Worker goto error;
2020*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
2021*6777b538SAndroid Build Coastguard Worker if (value != NULL) {
2022*6777b538SAndroid Build Coastguard Worker xmlNodePtr tmp;
2023*6777b538SAndroid Build Coastguard Worker
2024*6777b538SAndroid Build Coastguard Worker cur->children = xmlStringGetNodeList(doc, value);
2025*6777b538SAndroid Build Coastguard Worker cur->last = NULL;
2026*6777b538SAndroid Build Coastguard Worker
2027*6777b538SAndroid Build Coastguard Worker tmp = cur->children;
2028*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
2029*6777b538SAndroid Build Coastguard Worker tmp->parent = (xmlNodePtr) cur;
2030*6777b538SAndroid Build Coastguard Worker if (tmp->next == NULL)
2031*6777b538SAndroid Build Coastguard Worker cur->last = tmp;
2032*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
2033*6777b538SAndroid Build Coastguard Worker }
2034*6777b538SAndroid Build Coastguard Worker }
2035*6777b538SAndroid Build Coastguard Worker
2036*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2037*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
2038*6777b538SAndroid Build Coastguard Worker return(cur);
2039*6777b538SAndroid Build Coastguard Worker
2040*6777b538SAndroid Build Coastguard Worker error:
2041*6777b538SAndroid Build Coastguard Worker xmlFreeProp(cur);
2042*6777b538SAndroid Build Coastguard Worker return(NULL);
2043*6777b538SAndroid Build Coastguard Worker }
2044*6777b538SAndroid Build Coastguard Worker
2045*6777b538SAndroid Build Coastguard Worker /**
2046*6777b538SAndroid Build Coastguard Worker * xmlFreePropList:
2047*6777b538SAndroid Build Coastguard Worker * @cur: the first property in the list
2048*6777b538SAndroid Build Coastguard Worker *
2049*6777b538SAndroid Build Coastguard Worker * Free a property and all its siblings, all the children are freed too.
2050*6777b538SAndroid Build Coastguard Worker */
2051*6777b538SAndroid Build Coastguard Worker void
xmlFreePropList(xmlAttrPtr cur)2052*6777b538SAndroid Build Coastguard Worker xmlFreePropList(xmlAttrPtr cur) {
2053*6777b538SAndroid Build Coastguard Worker xmlAttrPtr next;
2054*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return;
2055*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
2056*6777b538SAndroid Build Coastguard Worker next = cur->next;
2057*6777b538SAndroid Build Coastguard Worker xmlFreeProp(cur);
2058*6777b538SAndroid Build Coastguard Worker cur = next;
2059*6777b538SAndroid Build Coastguard Worker }
2060*6777b538SAndroid Build Coastguard Worker }
2061*6777b538SAndroid Build Coastguard Worker
2062*6777b538SAndroid Build Coastguard Worker /**
2063*6777b538SAndroid Build Coastguard Worker * xmlFreeProp:
2064*6777b538SAndroid Build Coastguard Worker * @cur: an attribute
2065*6777b538SAndroid Build Coastguard Worker *
2066*6777b538SAndroid Build Coastguard Worker * Free one attribute, all the content is freed too
2067*6777b538SAndroid Build Coastguard Worker */
2068*6777b538SAndroid Build Coastguard Worker void
xmlFreeProp(xmlAttrPtr cur)2069*6777b538SAndroid Build Coastguard Worker xmlFreeProp(xmlAttrPtr cur) {
2070*6777b538SAndroid Build Coastguard Worker xmlDictPtr dict = NULL;
2071*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return;
2072*6777b538SAndroid Build Coastguard Worker
2073*6777b538SAndroid Build Coastguard Worker if (cur->doc != NULL) dict = cur->doc->dict;
2074*6777b538SAndroid Build Coastguard Worker
2075*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
2076*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
2077*6777b538SAndroid Build Coastguard Worker
2078*6777b538SAndroid Build Coastguard Worker /* Check for ID removal -> leading to invalid references ! */
2079*6777b538SAndroid Build Coastguard Worker if ((cur->doc != NULL) && (cur->atype == XML_ATTRIBUTE_ID)) {
2080*6777b538SAndroid Build Coastguard Worker xmlRemoveID(cur->doc, cur);
2081*6777b538SAndroid Build Coastguard Worker }
2082*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL) xmlFreeNodeList(cur->children);
2083*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->name)
2084*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
2085*6777b538SAndroid Build Coastguard Worker }
2086*6777b538SAndroid Build Coastguard Worker
2087*6777b538SAndroid Build Coastguard Worker /**
2088*6777b538SAndroid Build Coastguard Worker * xmlRemoveProp:
2089*6777b538SAndroid Build Coastguard Worker * @cur: an attribute
2090*6777b538SAndroid Build Coastguard Worker *
2091*6777b538SAndroid Build Coastguard Worker * Unlink and free one attribute, all the content is freed too
2092*6777b538SAndroid Build Coastguard Worker * Note this doesn't work for namespace definition attributes
2093*6777b538SAndroid Build Coastguard Worker *
2094*6777b538SAndroid Build Coastguard Worker * Returns 0 if success and -1 in case of error.
2095*6777b538SAndroid Build Coastguard Worker */
2096*6777b538SAndroid Build Coastguard Worker int
xmlRemoveProp(xmlAttrPtr cur)2097*6777b538SAndroid Build Coastguard Worker xmlRemoveProp(xmlAttrPtr cur) {
2098*6777b538SAndroid Build Coastguard Worker xmlAttrPtr tmp;
2099*6777b538SAndroid Build Coastguard Worker if (cur == NULL) {
2100*6777b538SAndroid Build Coastguard Worker return(-1);
2101*6777b538SAndroid Build Coastguard Worker }
2102*6777b538SAndroid Build Coastguard Worker if (cur->parent == NULL) {
2103*6777b538SAndroid Build Coastguard Worker return(-1);
2104*6777b538SAndroid Build Coastguard Worker }
2105*6777b538SAndroid Build Coastguard Worker tmp = cur->parent->properties;
2106*6777b538SAndroid Build Coastguard Worker if (tmp == cur) {
2107*6777b538SAndroid Build Coastguard Worker cur->parent->properties = cur->next;
2108*6777b538SAndroid Build Coastguard Worker if (cur->next != NULL)
2109*6777b538SAndroid Build Coastguard Worker cur->next->prev = NULL;
2110*6777b538SAndroid Build Coastguard Worker xmlFreeProp(cur);
2111*6777b538SAndroid Build Coastguard Worker return(0);
2112*6777b538SAndroid Build Coastguard Worker }
2113*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
2114*6777b538SAndroid Build Coastguard Worker if (tmp->next == cur) {
2115*6777b538SAndroid Build Coastguard Worker tmp->next = cur->next;
2116*6777b538SAndroid Build Coastguard Worker if (tmp->next != NULL)
2117*6777b538SAndroid Build Coastguard Worker tmp->next->prev = tmp;
2118*6777b538SAndroid Build Coastguard Worker xmlFreeProp(cur);
2119*6777b538SAndroid Build Coastguard Worker return(0);
2120*6777b538SAndroid Build Coastguard Worker }
2121*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
2122*6777b538SAndroid Build Coastguard Worker }
2123*6777b538SAndroid Build Coastguard Worker return(-1);
2124*6777b538SAndroid Build Coastguard Worker }
2125*6777b538SAndroid Build Coastguard Worker
2126*6777b538SAndroid Build Coastguard Worker /**
2127*6777b538SAndroid Build Coastguard Worker * xmlNewDocPI:
2128*6777b538SAndroid Build Coastguard Worker * @doc: the target document
2129*6777b538SAndroid Build Coastguard Worker * @name: the processing instruction name
2130*6777b538SAndroid Build Coastguard Worker * @content: the PI content
2131*6777b538SAndroid Build Coastguard Worker *
2132*6777b538SAndroid Build Coastguard Worker * Creation of a processing instruction element.
2133*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2134*6777b538SAndroid Build Coastguard Worker */
2135*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewDocPI(xmlDocPtr doc,const xmlChar * name,const xmlChar * content)2136*6777b538SAndroid Build Coastguard Worker xmlNewDocPI(xmlDocPtr doc, const xmlChar *name, const xmlChar *content) {
2137*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2138*6777b538SAndroid Build Coastguard Worker
2139*6777b538SAndroid Build Coastguard Worker if (name == NULL) {
2140*6777b538SAndroid Build Coastguard Worker return(NULL);
2141*6777b538SAndroid Build Coastguard Worker }
2142*6777b538SAndroid Build Coastguard Worker
2143*6777b538SAndroid Build Coastguard Worker /*
2144*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
2145*6777b538SAndroid Build Coastguard Worker */
2146*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2147*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2148*6777b538SAndroid Build Coastguard Worker return(NULL);
2149*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2150*6777b538SAndroid Build Coastguard Worker cur->type = XML_PI_NODE;
2151*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
2152*6777b538SAndroid Build Coastguard Worker
2153*6777b538SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->dict != NULL))
2154*6777b538SAndroid Build Coastguard Worker cur->name = xmlDictLookup(doc->dict, name, -1);
2155*6777b538SAndroid Build Coastguard Worker else
2156*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrdup(name);
2157*6777b538SAndroid Build Coastguard Worker if (cur->name == NULL)
2158*6777b538SAndroid Build Coastguard Worker goto error;
2159*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
2160*6777b538SAndroid Build Coastguard Worker cur->content = xmlStrdup(content);
2161*6777b538SAndroid Build Coastguard Worker if (cur->content == NULL)
2162*6777b538SAndroid Build Coastguard Worker goto error;
2163*6777b538SAndroid Build Coastguard Worker }
2164*6777b538SAndroid Build Coastguard Worker
2165*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2166*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
2167*6777b538SAndroid Build Coastguard Worker return(cur);
2168*6777b538SAndroid Build Coastguard Worker
2169*6777b538SAndroid Build Coastguard Worker error:
2170*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
2171*6777b538SAndroid Build Coastguard Worker return(NULL);
2172*6777b538SAndroid Build Coastguard Worker }
2173*6777b538SAndroid Build Coastguard Worker
2174*6777b538SAndroid Build Coastguard Worker /**
2175*6777b538SAndroid Build Coastguard Worker * xmlNewPI:
2176*6777b538SAndroid Build Coastguard Worker * @name: the processing instruction name
2177*6777b538SAndroid Build Coastguard Worker * @content: the PI content
2178*6777b538SAndroid Build Coastguard Worker *
2179*6777b538SAndroid Build Coastguard Worker * Creation of a processing instruction element.
2180*6777b538SAndroid Build Coastguard Worker *
2181*6777b538SAndroid Build Coastguard Worker * Use of this function is DISCOURAGED in favor of xmlNewDocPI.
2182*6777b538SAndroid Build Coastguard Worker *
2183*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2184*6777b538SAndroid Build Coastguard Worker */
2185*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewPI(const xmlChar * name,const xmlChar * content)2186*6777b538SAndroid Build Coastguard Worker xmlNewPI(const xmlChar *name, const xmlChar *content) {
2187*6777b538SAndroid Build Coastguard Worker return(xmlNewDocPI(NULL, name, content));
2188*6777b538SAndroid Build Coastguard Worker }
2189*6777b538SAndroid Build Coastguard Worker
2190*6777b538SAndroid Build Coastguard Worker /**
2191*6777b538SAndroid Build Coastguard Worker * xmlNewNode:
2192*6777b538SAndroid Build Coastguard Worker * @ns: namespace if any
2193*6777b538SAndroid Build Coastguard Worker * @name: the node name
2194*6777b538SAndroid Build Coastguard Worker *
2195*6777b538SAndroid Build Coastguard Worker * Creation of a new node element. @ns is optional (NULL).
2196*6777b538SAndroid Build Coastguard Worker *
2197*6777b538SAndroid Build Coastguard Worker * Use of this function is DISCOURAGED in favor of xmlNewDocNode.
2198*6777b538SAndroid Build Coastguard Worker *
2199*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object. Uses xmlStrdup() to make
2200*6777b538SAndroid Build Coastguard Worker * copy of @name.
2201*6777b538SAndroid Build Coastguard Worker */
2202*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewNode(xmlNsPtr ns,const xmlChar * name)2203*6777b538SAndroid Build Coastguard Worker xmlNewNode(xmlNsPtr ns, const xmlChar *name) {
2204*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2205*6777b538SAndroid Build Coastguard Worker
2206*6777b538SAndroid Build Coastguard Worker if (name == NULL) {
2207*6777b538SAndroid Build Coastguard Worker return(NULL);
2208*6777b538SAndroid Build Coastguard Worker }
2209*6777b538SAndroid Build Coastguard Worker
2210*6777b538SAndroid Build Coastguard Worker /*
2211*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
2212*6777b538SAndroid Build Coastguard Worker */
2213*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2214*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2215*6777b538SAndroid Build Coastguard Worker return(NULL);
2216*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2217*6777b538SAndroid Build Coastguard Worker cur->type = XML_ELEMENT_NODE;
2218*6777b538SAndroid Build Coastguard Worker
2219*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrdup(name);
2220*6777b538SAndroid Build Coastguard Worker if (cur->name == NULL)
2221*6777b538SAndroid Build Coastguard Worker goto error;
2222*6777b538SAndroid Build Coastguard Worker cur->ns = ns;
2223*6777b538SAndroid Build Coastguard Worker
2224*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2225*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue(cur);
2226*6777b538SAndroid Build Coastguard Worker return(cur);
2227*6777b538SAndroid Build Coastguard Worker
2228*6777b538SAndroid Build Coastguard Worker error:
2229*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
2230*6777b538SAndroid Build Coastguard Worker return(NULL);
2231*6777b538SAndroid Build Coastguard Worker }
2232*6777b538SAndroid Build Coastguard Worker
2233*6777b538SAndroid Build Coastguard Worker /**
2234*6777b538SAndroid Build Coastguard Worker * xmlNewNodeEatName:
2235*6777b538SAndroid Build Coastguard Worker * @ns: namespace if any
2236*6777b538SAndroid Build Coastguard Worker * @name: the node name
2237*6777b538SAndroid Build Coastguard Worker *
2238*6777b538SAndroid Build Coastguard Worker * Creation of a new node element. @ns is optional (NULL).
2239*6777b538SAndroid Build Coastguard Worker *
2240*6777b538SAndroid Build Coastguard Worker * Use of this function is DISCOURAGED in favor of xmlNewDocNodeEatName.
2241*6777b538SAndroid Build Coastguard Worker *
2242*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object, with pointer @name as
2243*6777b538SAndroid Build Coastguard Worker * new node's name. Use xmlNewNode() if a copy of @name string is
2244*6777b538SAndroid Build Coastguard Worker * is needed as new node's name.
2245*6777b538SAndroid Build Coastguard Worker */
2246*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewNodeEatName(xmlNsPtr ns,xmlChar * name)2247*6777b538SAndroid Build Coastguard Worker xmlNewNodeEatName(xmlNsPtr ns, xmlChar *name) {
2248*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2249*6777b538SAndroid Build Coastguard Worker
2250*6777b538SAndroid Build Coastguard Worker if (name == NULL) {
2251*6777b538SAndroid Build Coastguard Worker return(NULL);
2252*6777b538SAndroid Build Coastguard Worker }
2253*6777b538SAndroid Build Coastguard Worker
2254*6777b538SAndroid Build Coastguard Worker /*
2255*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
2256*6777b538SAndroid Build Coastguard Worker */
2257*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2258*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2259*6777b538SAndroid Build Coastguard Worker return(NULL);
2260*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2261*6777b538SAndroid Build Coastguard Worker cur->type = XML_ELEMENT_NODE;
2262*6777b538SAndroid Build Coastguard Worker
2263*6777b538SAndroid Build Coastguard Worker cur->name = name;
2264*6777b538SAndroid Build Coastguard Worker cur->ns = ns;
2265*6777b538SAndroid Build Coastguard Worker
2266*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2267*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
2268*6777b538SAndroid Build Coastguard Worker return(cur);
2269*6777b538SAndroid Build Coastguard Worker }
2270*6777b538SAndroid Build Coastguard Worker
2271*6777b538SAndroid Build Coastguard Worker /**
2272*6777b538SAndroid Build Coastguard Worker * xmlNewDocNode:
2273*6777b538SAndroid Build Coastguard Worker * @doc: the document
2274*6777b538SAndroid Build Coastguard Worker * @ns: namespace if any
2275*6777b538SAndroid Build Coastguard Worker * @name: the node name
2276*6777b538SAndroid Build Coastguard Worker * @content: the XML text content if any
2277*6777b538SAndroid Build Coastguard Worker *
2278*6777b538SAndroid Build Coastguard Worker * Creation of a new node element within a document. @ns and @content
2279*6777b538SAndroid Build Coastguard Worker * are optional (NULL).
2280*6777b538SAndroid Build Coastguard Worker * NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities
2281*6777b538SAndroid Build Coastguard Worker * references, but XML special chars need to be escaped first by using
2282*6777b538SAndroid Build Coastguard Worker * xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't
2283*6777b538SAndroid Build Coastguard Worker * need entities support.
2284*6777b538SAndroid Build Coastguard Worker *
2285*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2286*6777b538SAndroid Build Coastguard Worker */
2287*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewDocNode(xmlDocPtr doc,xmlNsPtr ns,const xmlChar * name,const xmlChar * content)2288*6777b538SAndroid Build Coastguard Worker xmlNewDocNode(xmlDocPtr doc, xmlNsPtr ns,
2289*6777b538SAndroid Build Coastguard Worker const xmlChar *name, const xmlChar *content) {
2290*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2291*6777b538SAndroid Build Coastguard Worker
2292*6777b538SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->dict != NULL))
2293*6777b538SAndroid Build Coastguard Worker cur = xmlNewNodeEatName(ns, (xmlChar *)
2294*6777b538SAndroid Build Coastguard Worker xmlDictLookup(doc->dict, name, -1));
2295*6777b538SAndroid Build Coastguard Worker else
2296*6777b538SAndroid Build Coastguard Worker cur = xmlNewNode(ns, name);
2297*6777b538SAndroid Build Coastguard Worker if (cur != NULL) {
2298*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
2299*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
2300*6777b538SAndroid Build Coastguard Worker cur->children = xmlStringGetNodeList(doc, content);
2301*6777b538SAndroid Build Coastguard Worker UPDATE_LAST_CHILD_AND_PARENT(cur)
2302*6777b538SAndroid Build Coastguard Worker }
2303*6777b538SAndroid Build Coastguard Worker }
2304*6777b538SAndroid Build Coastguard Worker
2305*6777b538SAndroid Build Coastguard Worker return(cur);
2306*6777b538SAndroid Build Coastguard Worker }
2307*6777b538SAndroid Build Coastguard Worker
2308*6777b538SAndroid Build Coastguard Worker /**
2309*6777b538SAndroid Build Coastguard Worker * xmlNewDocNodeEatName:
2310*6777b538SAndroid Build Coastguard Worker * @doc: the document
2311*6777b538SAndroid Build Coastguard Worker * @ns: namespace if any
2312*6777b538SAndroid Build Coastguard Worker * @name: the node name
2313*6777b538SAndroid Build Coastguard Worker * @content: the XML text content if any
2314*6777b538SAndroid Build Coastguard Worker *
2315*6777b538SAndroid Build Coastguard Worker * Creation of a new node element within a document. @ns and @content
2316*6777b538SAndroid Build Coastguard Worker * are optional (NULL).
2317*6777b538SAndroid Build Coastguard Worker * NOTE: @content is supposed to be a piece of XML CDATA, so it allow entities
2318*6777b538SAndroid Build Coastguard Worker * references, but XML special chars need to be escaped first by using
2319*6777b538SAndroid Build Coastguard Worker * xmlEncodeEntitiesReentrant(). Use xmlNewDocRawNode() if you don't
2320*6777b538SAndroid Build Coastguard Worker * need entities support.
2321*6777b538SAndroid Build Coastguard Worker *
2322*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2323*6777b538SAndroid Build Coastguard Worker */
2324*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewDocNodeEatName(xmlDocPtr doc,xmlNsPtr ns,xmlChar * name,const xmlChar * content)2325*6777b538SAndroid Build Coastguard Worker xmlNewDocNodeEatName(xmlDocPtr doc, xmlNsPtr ns,
2326*6777b538SAndroid Build Coastguard Worker xmlChar *name, const xmlChar *content) {
2327*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2328*6777b538SAndroid Build Coastguard Worker
2329*6777b538SAndroid Build Coastguard Worker cur = xmlNewNodeEatName(ns, name);
2330*6777b538SAndroid Build Coastguard Worker if (cur != NULL) {
2331*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
2332*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
2333*6777b538SAndroid Build Coastguard Worker cur->children = xmlStringGetNodeList(doc, content);
2334*6777b538SAndroid Build Coastguard Worker if (cur->children == NULL) {
2335*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
2336*6777b538SAndroid Build Coastguard Worker return(NULL);
2337*6777b538SAndroid Build Coastguard Worker }
2338*6777b538SAndroid Build Coastguard Worker UPDATE_LAST_CHILD_AND_PARENT(cur)
2339*6777b538SAndroid Build Coastguard Worker }
2340*6777b538SAndroid Build Coastguard Worker } else {
2341*6777b538SAndroid Build Coastguard Worker /* if name don't come from the doc dictionary free it here */
2342*6777b538SAndroid Build Coastguard Worker if ((name != NULL) &&
2343*6777b538SAndroid Build Coastguard Worker ((doc == NULL) || (doc->dict == NULL) ||
2344*6777b538SAndroid Build Coastguard Worker (!(xmlDictOwns(doc->dict, name)))))
2345*6777b538SAndroid Build Coastguard Worker xmlFree(name);
2346*6777b538SAndroid Build Coastguard Worker }
2347*6777b538SAndroid Build Coastguard Worker return(cur);
2348*6777b538SAndroid Build Coastguard Worker }
2349*6777b538SAndroid Build Coastguard Worker
2350*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
2351*6777b538SAndroid Build Coastguard Worker /**
2352*6777b538SAndroid Build Coastguard Worker * xmlNewDocRawNode:
2353*6777b538SAndroid Build Coastguard Worker * @doc: the document
2354*6777b538SAndroid Build Coastguard Worker * @ns: namespace if any
2355*6777b538SAndroid Build Coastguard Worker * @name: the node name
2356*6777b538SAndroid Build Coastguard Worker * @content: the text content if any
2357*6777b538SAndroid Build Coastguard Worker *
2358*6777b538SAndroid Build Coastguard Worker * Creation of a new node element within a document. @ns and @content
2359*6777b538SAndroid Build Coastguard Worker * are optional (NULL).
2360*6777b538SAndroid Build Coastguard Worker *
2361*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2362*6777b538SAndroid Build Coastguard Worker */
2363*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewDocRawNode(xmlDocPtr doc,xmlNsPtr ns,const xmlChar * name,const xmlChar * content)2364*6777b538SAndroid Build Coastguard Worker xmlNewDocRawNode(xmlDocPtr doc, xmlNsPtr ns,
2365*6777b538SAndroid Build Coastguard Worker const xmlChar *name, const xmlChar *content) {
2366*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2367*6777b538SAndroid Build Coastguard Worker
2368*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocNode(doc, ns, name, NULL);
2369*6777b538SAndroid Build Coastguard Worker if (cur != NULL) {
2370*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
2371*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
2372*6777b538SAndroid Build Coastguard Worker cur->children = xmlNewDocText(doc, content);
2373*6777b538SAndroid Build Coastguard Worker UPDATE_LAST_CHILD_AND_PARENT(cur)
2374*6777b538SAndroid Build Coastguard Worker }
2375*6777b538SAndroid Build Coastguard Worker }
2376*6777b538SAndroid Build Coastguard Worker return(cur);
2377*6777b538SAndroid Build Coastguard Worker }
2378*6777b538SAndroid Build Coastguard Worker
2379*6777b538SAndroid Build Coastguard Worker /**
2380*6777b538SAndroid Build Coastguard Worker * xmlNewDocFragment:
2381*6777b538SAndroid Build Coastguard Worker * @doc: the document owning the fragment
2382*6777b538SAndroid Build Coastguard Worker *
2383*6777b538SAndroid Build Coastguard Worker * Creation of a new Fragment node.
2384*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2385*6777b538SAndroid Build Coastguard Worker */
2386*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewDocFragment(xmlDocPtr doc)2387*6777b538SAndroid Build Coastguard Worker xmlNewDocFragment(xmlDocPtr doc) {
2388*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2389*6777b538SAndroid Build Coastguard Worker
2390*6777b538SAndroid Build Coastguard Worker /*
2391*6777b538SAndroid Build Coastguard Worker * Allocate a new DocumentFragment node and fill the fields.
2392*6777b538SAndroid Build Coastguard Worker */
2393*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2394*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2395*6777b538SAndroid Build Coastguard Worker return(NULL);
2396*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2397*6777b538SAndroid Build Coastguard Worker cur->type = XML_DOCUMENT_FRAG_NODE;
2398*6777b538SAndroid Build Coastguard Worker
2399*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
2400*6777b538SAndroid Build Coastguard Worker
2401*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2402*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue(cur);
2403*6777b538SAndroid Build Coastguard Worker return(cur);
2404*6777b538SAndroid Build Coastguard Worker }
2405*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
2406*6777b538SAndroid Build Coastguard Worker
2407*6777b538SAndroid Build Coastguard Worker /**
2408*6777b538SAndroid Build Coastguard Worker * xmlNewText:
2409*6777b538SAndroid Build Coastguard Worker * @content: the text content
2410*6777b538SAndroid Build Coastguard Worker *
2411*6777b538SAndroid Build Coastguard Worker * Creation of a new text node.
2412*6777b538SAndroid Build Coastguard Worker *
2413*6777b538SAndroid Build Coastguard Worker * Use of this function is DISCOURAGED in favor of xmlNewDocText.
2414*6777b538SAndroid Build Coastguard Worker *
2415*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2416*6777b538SAndroid Build Coastguard Worker */
2417*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewText(const xmlChar * content)2418*6777b538SAndroid Build Coastguard Worker xmlNewText(const xmlChar *content) {
2419*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2420*6777b538SAndroid Build Coastguard Worker
2421*6777b538SAndroid Build Coastguard Worker /*
2422*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
2423*6777b538SAndroid Build Coastguard Worker */
2424*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2425*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2426*6777b538SAndroid Build Coastguard Worker return(NULL);
2427*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2428*6777b538SAndroid Build Coastguard Worker cur->type = XML_TEXT_NODE;
2429*6777b538SAndroid Build Coastguard Worker
2430*6777b538SAndroid Build Coastguard Worker cur->name = xmlStringText;
2431*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
2432*6777b538SAndroid Build Coastguard Worker cur->content = xmlStrdup(content);
2433*6777b538SAndroid Build Coastguard Worker if (cur->content == NULL)
2434*6777b538SAndroid Build Coastguard Worker goto error;
2435*6777b538SAndroid Build Coastguard Worker }
2436*6777b538SAndroid Build Coastguard Worker
2437*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2438*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue(cur);
2439*6777b538SAndroid Build Coastguard Worker return(cur);
2440*6777b538SAndroid Build Coastguard Worker
2441*6777b538SAndroid Build Coastguard Worker error:
2442*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
2443*6777b538SAndroid Build Coastguard Worker return(NULL);
2444*6777b538SAndroid Build Coastguard Worker }
2445*6777b538SAndroid Build Coastguard Worker
2446*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
2447*6777b538SAndroid Build Coastguard Worker /**
2448*6777b538SAndroid Build Coastguard Worker * xmlNewTextChild:
2449*6777b538SAndroid Build Coastguard Worker * @parent: the parent node
2450*6777b538SAndroid Build Coastguard Worker * @ns: a namespace if any
2451*6777b538SAndroid Build Coastguard Worker * @name: the name of the child
2452*6777b538SAndroid Build Coastguard Worker * @content: the text content of the child if any.
2453*6777b538SAndroid Build Coastguard Worker *
2454*6777b538SAndroid Build Coastguard Worker * Creation of a new child element, added at the end of @parent children list.
2455*6777b538SAndroid Build Coastguard Worker * @ns and @content parameters are optional (NULL). If @ns is NULL, the newly
2456*6777b538SAndroid Build Coastguard Worker * created element inherits the namespace of @parent. If @content is non NULL,
2457*6777b538SAndroid Build Coastguard Worker * a child TEXT node will be created containing the string @content.
2458*6777b538SAndroid Build Coastguard Worker * NOTE: Use xmlNewChild() if @content will contain entities that need to be
2459*6777b538SAndroid Build Coastguard Worker * preserved. Use this function, xmlNewTextChild(), if you need to ensure that
2460*6777b538SAndroid Build Coastguard Worker * reserved XML chars that might appear in @content, such as the ampersand,
2461*6777b538SAndroid Build Coastguard Worker * greater-than or less-than signs, are automatically replaced by their XML
2462*6777b538SAndroid Build Coastguard Worker * escaped entity representations.
2463*6777b538SAndroid Build Coastguard Worker *
2464*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2465*6777b538SAndroid Build Coastguard Worker */
2466*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewTextChild(xmlNodePtr parent,xmlNsPtr ns,const xmlChar * name,const xmlChar * content)2467*6777b538SAndroid Build Coastguard Worker xmlNewTextChild(xmlNodePtr parent, xmlNsPtr ns,
2468*6777b538SAndroid Build Coastguard Worker const xmlChar *name, const xmlChar *content) {
2469*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur, prev;
2470*6777b538SAndroid Build Coastguard Worker
2471*6777b538SAndroid Build Coastguard Worker if (parent == NULL) {
2472*6777b538SAndroid Build Coastguard Worker return(NULL);
2473*6777b538SAndroid Build Coastguard Worker }
2474*6777b538SAndroid Build Coastguard Worker
2475*6777b538SAndroid Build Coastguard Worker if (name == NULL) {
2476*6777b538SAndroid Build Coastguard Worker return(NULL);
2477*6777b538SAndroid Build Coastguard Worker }
2478*6777b538SAndroid Build Coastguard Worker
2479*6777b538SAndroid Build Coastguard Worker /*
2480*6777b538SAndroid Build Coastguard Worker * Allocate a new node
2481*6777b538SAndroid Build Coastguard Worker */
2482*6777b538SAndroid Build Coastguard Worker if (parent->type == XML_ELEMENT_NODE) {
2483*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
2484*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocRawNode(parent->doc, parent->ns, name, content);
2485*6777b538SAndroid Build Coastguard Worker else
2486*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocRawNode(parent->doc, ns, name, content);
2487*6777b538SAndroid Build Coastguard Worker } else if ((parent->type == XML_DOCUMENT_NODE) ||
2488*6777b538SAndroid Build Coastguard Worker (parent->type == XML_HTML_DOCUMENT_NODE)) {
2489*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
2490*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocRawNode((xmlDocPtr) parent, NULL, name, content);
2491*6777b538SAndroid Build Coastguard Worker else
2492*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocRawNode((xmlDocPtr) parent, ns, name, content);
2493*6777b538SAndroid Build Coastguard Worker } else if (parent->type == XML_DOCUMENT_FRAG_NODE) {
2494*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocRawNode( parent->doc, ns, name, content);
2495*6777b538SAndroid Build Coastguard Worker } else {
2496*6777b538SAndroid Build Coastguard Worker return(NULL);
2497*6777b538SAndroid Build Coastguard Worker }
2498*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return(NULL);
2499*6777b538SAndroid Build Coastguard Worker
2500*6777b538SAndroid Build Coastguard Worker /*
2501*6777b538SAndroid Build Coastguard Worker * add the new element at the end of the children list.
2502*6777b538SAndroid Build Coastguard Worker */
2503*6777b538SAndroid Build Coastguard Worker cur->type = XML_ELEMENT_NODE;
2504*6777b538SAndroid Build Coastguard Worker cur->parent = parent;
2505*6777b538SAndroid Build Coastguard Worker cur->doc = parent->doc;
2506*6777b538SAndroid Build Coastguard Worker if (parent->children == NULL) {
2507*6777b538SAndroid Build Coastguard Worker parent->children = cur;
2508*6777b538SAndroid Build Coastguard Worker parent->last = cur;
2509*6777b538SAndroid Build Coastguard Worker } else {
2510*6777b538SAndroid Build Coastguard Worker prev = parent->last;
2511*6777b538SAndroid Build Coastguard Worker prev->next = cur;
2512*6777b538SAndroid Build Coastguard Worker cur->prev = prev;
2513*6777b538SAndroid Build Coastguard Worker parent->last = cur;
2514*6777b538SAndroid Build Coastguard Worker }
2515*6777b538SAndroid Build Coastguard Worker
2516*6777b538SAndroid Build Coastguard Worker return(cur);
2517*6777b538SAndroid Build Coastguard Worker }
2518*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
2519*6777b538SAndroid Build Coastguard Worker
2520*6777b538SAndroid Build Coastguard Worker /**
2521*6777b538SAndroid Build Coastguard Worker * xmlNewCharRef:
2522*6777b538SAndroid Build Coastguard Worker * @doc: the document
2523*6777b538SAndroid Build Coastguard Worker * @name: the char ref string, starting with # or "&# ... ;"
2524*6777b538SAndroid Build Coastguard Worker *
2525*6777b538SAndroid Build Coastguard Worker * Creation of a new character reference node.
2526*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2527*6777b538SAndroid Build Coastguard Worker */
2528*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewCharRef(xmlDocPtr doc,const xmlChar * name)2529*6777b538SAndroid Build Coastguard Worker xmlNewCharRef(xmlDocPtr doc, const xmlChar *name) {
2530*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2531*6777b538SAndroid Build Coastguard Worker
2532*6777b538SAndroid Build Coastguard Worker if (name == NULL)
2533*6777b538SAndroid Build Coastguard Worker return(NULL);
2534*6777b538SAndroid Build Coastguard Worker
2535*6777b538SAndroid Build Coastguard Worker /*
2536*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
2537*6777b538SAndroid Build Coastguard Worker */
2538*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2539*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2540*6777b538SAndroid Build Coastguard Worker return(NULL);
2541*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2542*6777b538SAndroid Build Coastguard Worker cur->type = XML_ENTITY_REF_NODE;
2543*6777b538SAndroid Build Coastguard Worker
2544*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
2545*6777b538SAndroid Build Coastguard Worker if (name[0] == '&') {
2546*6777b538SAndroid Build Coastguard Worker int len;
2547*6777b538SAndroid Build Coastguard Worker name++;
2548*6777b538SAndroid Build Coastguard Worker len = xmlStrlen(name);
2549*6777b538SAndroid Build Coastguard Worker if (name[len - 1] == ';')
2550*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrndup(name, len - 1);
2551*6777b538SAndroid Build Coastguard Worker else
2552*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrndup(name, len);
2553*6777b538SAndroid Build Coastguard Worker } else
2554*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrdup(name);
2555*6777b538SAndroid Build Coastguard Worker if (cur->name == NULL)
2556*6777b538SAndroid Build Coastguard Worker goto error;
2557*6777b538SAndroid Build Coastguard Worker
2558*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2559*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue(cur);
2560*6777b538SAndroid Build Coastguard Worker return(cur);
2561*6777b538SAndroid Build Coastguard Worker
2562*6777b538SAndroid Build Coastguard Worker error:
2563*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
2564*6777b538SAndroid Build Coastguard Worker return(NULL);
2565*6777b538SAndroid Build Coastguard Worker }
2566*6777b538SAndroid Build Coastguard Worker
2567*6777b538SAndroid Build Coastguard Worker /**
2568*6777b538SAndroid Build Coastguard Worker * xmlNewReference:
2569*6777b538SAndroid Build Coastguard Worker * @doc: the document
2570*6777b538SAndroid Build Coastguard Worker * @name: the reference name, or the reference string with & and ;
2571*6777b538SAndroid Build Coastguard Worker *
2572*6777b538SAndroid Build Coastguard Worker * Creation of a new reference node.
2573*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2574*6777b538SAndroid Build Coastguard Worker */
2575*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewReference(const xmlDoc * doc,const xmlChar * name)2576*6777b538SAndroid Build Coastguard Worker xmlNewReference(const xmlDoc *doc, const xmlChar *name) {
2577*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2578*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
2579*6777b538SAndroid Build Coastguard Worker
2580*6777b538SAndroid Build Coastguard Worker if (name == NULL)
2581*6777b538SAndroid Build Coastguard Worker return(NULL);
2582*6777b538SAndroid Build Coastguard Worker
2583*6777b538SAndroid Build Coastguard Worker /*
2584*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
2585*6777b538SAndroid Build Coastguard Worker */
2586*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2587*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2588*6777b538SAndroid Build Coastguard Worker return(NULL);
2589*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2590*6777b538SAndroid Build Coastguard Worker cur->type = XML_ENTITY_REF_NODE;
2591*6777b538SAndroid Build Coastguard Worker
2592*6777b538SAndroid Build Coastguard Worker cur->doc = (xmlDoc *)doc;
2593*6777b538SAndroid Build Coastguard Worker if (name[0] == '&') {
2594*6777b538SAndroid Build Coastguard Worker int len;
2595*6777b538SAndroid Build Coastguard Worker name++;
2596*6777b538SAndroid Build Coastguard Worker len = xmlStrlen(name);
2597*6777b538SAndroid Build Coastguard Worker if (name[len - 1] == ';')
2598*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrndup(name, len - 1);
2599*6777b538SAndroid Build Coastguard Worker else
2600*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrndup(name, len);
2601*6777b538SAndroid Build Coastguard Worker } else
2602*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrdup(name);
2603*6777b538SAndroid Build Coastguard Worker if (cur->name == NULL)
2604*6777b538SAndroid Build Coastguard Worker goto error;
2605*6777b538SAndroid Build Coastguard Worker
2606*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(doc, cur->name);
2607*6777b538SAndroid Build Coastguard Worker if (ent != NULL) {
2608*6777b538SAndroid Build Coastguard Worker cur->content = ent->content;
2609*6777b538SAndroid Build Coastguard Worker /*
2610*6777b538SAndroid Build Coastguard Worker * The parent pointer in entity is a DTD pointer and thus is NOT
2611*6777b538SAndroid Build Coastguard Worker * updated. Not sure if this is 100% correct.
2612*6777b538SAndroid Build Coastguard Worker * -George
2613*6777b538SAndroid Build Coastguard Worker */
2614*6777b538SAndroid Build Coastguard Worker cur->children = (xmlNodePtr) ent;
2615*6777b538SAndroid Build Coastguard Worker cur->last = (xmlNodePtr) ent;
2616*6777b538SAndroid Build Coastguard Worker }
2617*6777b538SAndroid Build Coastguard Worker
2618*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2619*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue(cur);
2620*6777b538SAndroid Build Coastguard Worker return(cur);
2621*6777b538SAndroid Build Coastguard Worker
2622*6777b538SAndroid Build Coastguard Worker error:
2623*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
2624*6777b538SAndroid Build Coastguard Worker return(NULL);
2625*6777b538SAndroid Build Coastguard Worker }
2626*6777b538SAndroid Build Coastguard Worker
2627*6777b538SAndroid Build Coastguard Worker /**
2628*6777b538SAndroid Build Coastguard Worker * xmlNewDocText:
2629*6777b538SAndroid Build Coastguard Worker * @doc: the document
2630*6777b538SAndroid Build Coastguard Worker * @content: the text content
2631*6777b538SAndroid Build Coastguard Worker *
2632*6777b538SAndroid Build Coastguard Worker * Creation of a new text node within a document.
2633*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2634*6777b538SAndroid Build Coastguard Worker */
2635*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewDocText(const xmlDoc * doc,const xmlChar * content)2636*6777b538SAndroid Build Coastguard Worker xmlNewDocText(const xmlDoc *doc, const xmlChar *content) {
2637*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2638*6777b538SAndroid Build Coastguard Worker
2639*6777b538SAndroid Build Coastguard Worker cur = xmlNewText(content);
2640*6777b538SAndroid Build Coastguard Worker if (cur != NULL) cur->doc = (xmlDoc *)doc;
2641*6777b538SAndroid Build Coastguard Worker return(cur);
2642*6777b538SAndroid Build Coastguard Worker }
2643*6777b538SAndroid Build Coastguard Worker
2644*6777b538SAndroid Build Coastguard Worker /**
2645*6777b538SAndroid Build Coastguard Worker * xmlNewTextLen:
2646*6777b538SAndroid Build Coastguard Worker * @content: the text content
2647*6777b538SAndroid Build Coastguard Worker * @len: the text len.
2648*6777b538SAndroid Build Coastguard Worker *
2649*6777b538SAndroid Build Coastguard Worker * Use of this function is DISCOURAGED in favor of xmlNewDocTextLen.
2650*6777b538SAndroid Build Coastguard Worker *
2651*6777b538SAndroid Build Coastguard Worker * Creation of a new text node with an extra parameter for the content's length
2652*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2653*6777b538SAndroid Build Coastguard Worker */
2654*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewTextLen(const xmlChar * content,int len)2655*6777b538SAndroid Build Coastguard Worker xmlNewTextLen(const xmlChar *content, int len) {
2656*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2657*6777b538SAndroid Build Coastguard Worker
2658*6777b538SAndroid Build Coastguard Worker /*
2659*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
2660*6777b538SAndroid Build Coastguard Worker */
2661*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2662*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2663*6777b538SAndroid Build Coastguard Worker return(NULL);
2664*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2665*6777b538SAndroid Build Coastguard Worker cur->type = XML_TEXT_NODE;
2666*6777b538SAndroid Build Coastguard Worker
2667*6777b538SAndroid Build Coastguard Worker cur->name = xmlStringText;
2668*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
2669*6777b538SAndroid Build Coastguard Worker cur->content = xmlStrndup(content, len);
2670*6777b538SAndroid Build Coastguard Worker }
2671*6777b538SAndroid Build Coastguard Worker
2672*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2673*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue(cur);
2674*6777b538SAndroid Build Coastguard Worker return(cur);
2675*6777b538SAndroid Build Coastguard Worker }
2676*6777b538SAndroid Build Coastguard Worker
2677*6777b538SAndroid Build Coastguard Worker /**
2678*6777b538SAndroid Build Coastguard Worker * xmlNewDocTextLen:
2679*6777b538SAndroid Build Coastguard Worker * @doc: the document
2680*6777b538SAndroid Build Coastguard Worker * @content: the text content
2681*6777b538SAndroid Build Coastguard Worker * @len: the text len.
2682*6777b538SAndroid Build Coastguard Worker *
2683*6777b538SAndroid Build Coastguard Worker * Creation of a new text node with an extra content length parameter. The
2684*6777b538SAndroid Build Coastguard Worker * text node pertain to a given document.
2685*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2686*6777b538SAndroid Build Coastguard Worker */
2687*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewDocTextLen(xmlDocPtr doc,const xmlChar * content,int len)2688*6777b538SAndroid Build Coastguard Worker xmlNewDocTextLen(xmlDocPtr doc, const xmlChar *content, int len) {
2689*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2690*6777b538SAndroid Build Coastguard Worker
2691*6777b538SAndroid Build Coastguard Worker cur = xmlNewTextLen(content, len);
2692*6777b538SAndroid Build Coastguard Worker if (cur != NULL) cur->doc = doc;
2693*6777b538SAndroid Build Coastguard Worker return(cur);
2694*6777b538SAndroid Build Coastguard Worker }
2695*6777b538SAndroid Build Coastguard Worker
2696*6777b538SAndroid Build Coastguard Worker /**
2697*6777b538SAndroid Build Coastguard Worker * xmlNewComment:
2698*6777b538SAndroid Build Coastguard Worker * @content: the comment content
2699*6777b538SAndroid Build Coastguard Worker *
2700*6777b538SAndroid Build Coastguard Worker * Use of this function is DISCOURAGED in favor of xmlNewDocComment.
2701*6777b538SAndroid Build Coastguard Worker *
2702*6777b538SAndroid Build Coastguard Worker * Creation of a new node containing a comment.
2703*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2704*6777b538SAndroid Build Coastguard Worker */
2705*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewComment(const xmlChar * content)2706*6777b538SAndroid Build Coastguard Worker xmlNewComment(const xmlChar *content) {
2707*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2708*6777b538SAndroid Build Coastguard Worker
2709*6777b538SAndroid Build Coastguard Worker /*
2710*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
2711*6777b538SAndroid Build Coastguard Worker */
2712*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2713*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2714*6777b538SAndroid Build Coastguard Worker return(NULL);
2715*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2716*6777b538SAndroid Build Coastguard Worker cur->type = XML_COMMENT_NODE;
2717*6777b538SAndroid Build Coastguard Worker
2718*6777b538SAndroid Build Coastguard Worker cur->name = xmlStringComment;
2719*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
2720*6777b538SAndroid Build Coastguard Worker cur->content = xmlStrdup(content);
2721*6777b538SAndroid Build Coastguard Worker if (cur->content == NULL)
2722*6777b538SAndroid Build Coastguard Worker goto error;
2723*6777b538SAndroid Build Coastguard Worker }
2724*6777b538SAndroid Build Coastguard Worker
2725*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2726*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue(cur);
2727*6777b538SAndroid Build Coastguard Worker return(cur);
2728*6777b538SAndroid Build Coastguard Worker
2729*6777b538SAndroid Build Coastguard Worker error:
2730*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
2731*6777b538SAndroid Build Coastguard Worker return(NULL);
2732*6777b538SAndroid Build Coastguard Worker }
2733*6777b538SAndroid Build Coastguard Worker
2734*6777b538SAndroid Build Coastguard Worker /**
2735*6777b538SAndroid Build Coastguard Worker * xmlNewCDataBlock:
2736*6777b538SAndroid Build Coastguard Worker * @doc: the document
2737*6777b538SAndroid Build Coastguard Worker * @content: the CDATA block content content
2738*6777b538SAndroid Build Coastguard Worker * @len: the length of the block
2739*6777b538SAndroid Build Coastguard Worker *
2740*6777b538SAndroid Build Coastguard Worker * Creation of a new node containing a CDATA block.
2741*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2742*6777b538SAndroid Build Coastguard Worker */
2743*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewCDataBlock(xmlDocPtr doc,const xmlChar * content,int len)2744*6777b538SAndroid Build Coastguard Worker xmlNewCDataBlock(xmlDocPtr doc, const xmlChar *content, int len) {
2745*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2746*6777b538SAndroid Build Coastguard Worker
2747*6777b538SAndroid Build Coastguard Worker /*
2748*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
2749*6777b538SAndroid Build Coastguard Worker */
2750*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
2751*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
2752*6777b538SAndroid Build Coastguard Worker return(NULL);
2753*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNode));
2754*6777b538SAndroid Build Coastguard Worker cur->type = XML_CDATA_SECTION_NODE;
2755*6777b538SAndroid Build Coastguard Worker cur->doc = doc;
2756*6777b538SAndroid Build Coastguard Worker
2757*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
2758*6777b538SAndroid Build Coastguard Worker cur->content = xmlStrndup(content, len);
2759*6777b538SAndroid Build Coastguard Worker if (cur->content == NULL) {
2760*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
2761*6777b538SAndroid Build Coastguard Worker return(NULL);
2762*6777b538SAndroid Build Coastguard Worker }
2763*6777b538SAndroid Build Coastguard Worker }
2764*6777b538SAndroid Build Coastguard Worker
2765*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
2766*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue(cur);
2767*6777b538SAndroid Build Coastguard Worker return(cur);
2768*6777b538SAndroid Build Coastguard Worker }
2769*6777b538SAndroid Build Coastguard Worker
2770*6777b538SAndroid Build Coastguard Worker /**
2771*6777b538SAndroid Build Coastguard Worker * xmlNewDocComment:
2772*6777b538SAndroid Build Coastguard Worker * @doc: the document
2773*6777b538SAndroid Build Coastguard Worker * @content: the comment content
2774*6777b538SAndroid Build Coastguard Worker *
2775*6777b538SAndroid Build Coastguard Worker * Creation of a new node containing a comment within a document.
2776*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2777*6777b538SAndroid Build Coastguard Worker */
2778*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewDocComment(xmlDocPtr doc,const xmlChar * content)2779*6777b538SAndroid Build Coastguard Worker xmlNewDocComment(xmlDocPtr doc, const xmlChar *content) {
2780*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2781*6777b538SAndroid Build Coastguard Worker
2782*6777b538SAndroid Build Coastguard Worker cur = xmlNewComment(content);
2783*6777b538SAndroid Build Coastguard Worker if (cur != NULL) cur->doc = doc;
2784*6777b538SAndroid Build Coastguard Worker return(cur);
2785*6777b538SAndroid Build Coastguard Worker }
2786*6777b538SAndroid Build Coastguard Worker
_copyStringForNewDictIfNeeded(xmlDictPtr oldDict,xmlDictPtr newDict,const xmlChar * oldValue)2787*6777b538SAndroid Build Coastguard Worker static const xmlChar *_copyStringForNewDictIfNeeded(xmlDictPtr oldDict, xmlDictPtr newDict, const xmlChar *oldValue) {
2788*6777b538SAndroid Build Coastguard Worker const xmlChar *newValue = oldValue;
2789*6777b538SAndroid Build Coastguard Worker if (oldValue) {
2790*6777b538SAndroid Build Coastguard Worker int oldDictOwnsOldValue = oldDict && (xmlDictOwns(oldDict, oldValue) == 1);
2791*6777b538SAndroid Build Coastguard Worker if (oldDictOwnsOldValue) {
2792*6777b538SAndroid Build Coastguard Worker if (newDict)
2793*6777b538SAndroid Build Coastguard Worker newValue = xmlDictLookup(newDict, oldValue, -1);
2794*6777b538SAndroid Build Coastguard Worker else
2795*6777b538SAndroid Build Coastguard Worker newValue = xmlStrdup(oldValue);
2796*6777b538SAndroid Build Coastguard Worker }
2797*6777b538SAndroid Build Coastguard Worker }
2798*6777b538SAndroid Build Coastguard Worker return newValue;
2799*6777b538SAndroid Build Coastguard Worker }
2800*6777b538SAndroid Build Coastguard Worker
2801*6777b538SAndroid Build Coastguard Worker /**
2802*6777b538SAndroid Build Coastguard Worker * xmlSetTreeDoc:
2803*6777b538SAndroid Build Coastguard Worker * @tree: the top element
2804*6777b538SAndroid Build Coastguard Worker * @doc: the document
2805*6777b538SAndroid Build Coastguard Worker *
2806*6777b538SAndroid Build Coastguard Worker * update all nodes under the tree to point to the right document
2807*6777b538SAndroid Build Coastguard Worker */
2808*6777b538SAndroid Build Coastguard Worker void
xmlSetTreeDoc(xmlNodePtr tree,xmlDocPtr doc)2809*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(xmlNodePtr tree, xmlDocPtr doc) {
2810*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
2811*6777b538SAndroid Build Coastguard Worker
2812*6777b538SAndroid Build Coastguard Worker if ((tree == NULL) || (tree->type == XML_NAMESPACE_DECL))
2813*6777b538SAndroid Build Coastguard Worker return;
2814*6777b538SAndroid Build Coastguard Worker if (tree->doc != doc) {
2815*6777b538SAndroid Build Coastguard Worker xmlDictPtr oldTreeDict = tree->doc ? tree->doc->dict : NULL;
2816*6777b538SAndroid Build Coastguard Worker xmlDictPtr newDict = doc ? doc->dict : NULL;
2817*6777b538SAndroid Build Coastguard Worker
2818*6777b538SAndroid Build Coastguard Worker if(tree->type == XML_ELEMENT_NODE) {
2819*6777b538SAndroid Build Coastguard Worker prop = tree->properties;
2820*6777b538SAndroid Build Coastguard Worker while (prop != NULL) {
2821*6777b538SAndroid Build Coastguard Worker if (prop->atype == XML_ATTRIBUTE_ID) {
2822*6777b538SAndroid Build Coastguard Worker xmlRemoveID(tree->doc, prop);
2823*6777b538SAndroid Build Coastguard Worker }
2824*6777b538SAndroid Build Coastguard Worker
2825*6777b538SAndroid Build Coastguard Worker if (prop->doc != doc) {
2826*6777b538SAndroid Build Coastguard Worker xmlDictPtr oldPropDict = prop->doc ? prop->doc->dict : NULL;
2827*6777b538SAndroid Build Coastguard Worker /* TODO: malloc check */
2828*6777b538SAndroid Build Coastguard Worker prop->name = _copyStringForNewDictIfNeeded(oldPropDict, newDict, prop->name);
2829*6777b538SAndroid Build Coastguard Worker prop->doc = doc;
2830*6777b538SAndroid Build Coastguard Worker }
2831*6777b538SAndroid Build Coastguard Worker xmlSetListDoc(prop->children, doc);
2832*6777b538SAndroid Build Coastguard Worker
2833*6777b538SAndroid Build Coastguard Worker /*
2834*6777b538SAndroid Build Coastguard Worker * TODO: ID attributes should be also added to the new
2835*6777b538SAndroid Build Coastguard Worker * document, but this breaks things like xmlReplaceNode.
2836*6777b538SAndroid Build Coastguard Worker * The underlying problem is that xmlRemoveID is only called
2837*6777b538SAndroid Build Coastguard Worker * if a node is destroyed, not if it's unlinked.
2838*6777b538SAndroid Build Coastguard Worker */
2839*6777b538SAndroid Build Coastguard Worker #if 0
2840*6777b538SAndroid Build Coastguard Worker if (xmlIsID(doc, tree, prop)) {
2841*6777b538SAndroid Build Coastguard Worker xmlChar *idVal = xmlNodeListGetString(doc, prop->children,
2842*6777b538SAndroid Build Coastguard Worker 1);
2843*6777b538SAndroid Build Coastguard Worker xmlAddID(NULL, doc, idVal, prop);
2844*6777b538SAndroid Build Coastguard Worker }
2845*6777b538SAndroid Build Coastguard Worker #endif
2846*6777b538SAndroid Build Coastguard Worker
2847*6777b538SAndroid Build Coastguard Worker prop = prop->next;
2848*6777b538SAndroid Build Coastguard Worker }
2849*6777b538SAndroid Build Coastguard Worker }
2850*6777b538SAndroid Build Coastguard Worker if (tree->type == XML_ENTITY_REF_NODE) {
2851*6777b538SAndroid Build Coastguard Worker /*
2852*6777b538SAndroid Build Coastguard Worker * Clear 'children' which points to the entity declaration
2853*6777b538SAndroid Build Coastguard Worker * from the original document.
2854*6777b538SAndroid Build Coastguard Worker */
2855*6777b538SAndroid Build Coastguard Worker tree->children = NULL;
2856*6777b538SAndroid Build Coastguard Worker } else if (tree->children != NULL) {
2857*6777b538SAndroid Build Coastguard Worker xmlSetListDoc(tree->children, doc);
2858*6777b538SAndroid Build Coastguard Worker }
2859*6777b538SAndroid Build Coastguard Worker
2860*6777b538SAndroid Build Coastguard Worker /* TODO: malloc check */
2861*6777b538SAndroid Build Coastguard Worker tree->name = _copyStringForNewDictIfNeeded(oldTreeDict, newDict, tree->name);
2862*6777b538SAndroid Build Coastguard Worker tree->content = (xmlChar *)_copyStringForNewDictIfNeeded(oldTreeDict, NULL, tree->content);
2863*6777b538SAndroid Build Coastguard Worker /* FIXME: tree->ns should be updated as in xmlStaticCopyNode(). */
2864*6777b538SAndroid Build Coastguard Worker tree->doc = doc;
2865*6777b538SAndroid Build Coastguard Worker }
2866*6777b538SAndroid Build Coastguard Worker }
2867*6777b538SAndroid Build Coastguard Worker
2868*6777b538SAndroid Build Coastguard Worker /**
2869*6777b538SAndroid Build Coastguard Worker * xmlSetListDoc:
2870*6777b538SAndroid Build Coastguard Worker * @list: the first element
2871*6777b538SAndroid Build Coastguard Worker * @doc: the document
2872*6777b538SAndroid Build Coastguard Worker *
2873*6777b538SAndroid Build Coastguard Worker * update all nodes in the list to point to the right document
2874*6777b538SAndroid Build Coastguard Worker */
2875*6777b538SAndroid Build Coastguard Worker void
xmlSetListDoc(xmlNodePtr list,xmlDocPtr doc)2876*6777b538SAndroid Build Coastguard Worker xmlSetListDoc(xmlNodePtr list, xmlDocPtr doc) {
2877*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
2878*6777b538SAndroid Build Coastguard Worker
2879*6777b538SAndroid Build Coastguard Worker if ((list == NULL) || (list->type == XML_NAMESPACE_DECL))
2880*6777b538SAndroid Build Coastguard Worker return;
2881*6777b538SAndroid Build Coastguard Worker cur = list;
2882*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
2883*6777b538SAndroid Build Coastguard Worker if (cur->doc != doc)
2884*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(cur, doc);
2885*6777b538SAndroid Build Coastguard Worker cur = cur->next;
2886*6777b538SAndroid Build Coastguard Worker }
2887*6777b538SAndroid Build Coastguard Worker }
2888*6777b538SAndroid Build Coastguard Worker
2889*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
2890*6777b538SAndroid Build Coastguard Worker /**
2891*6777b538SAndroid Build Coastguard Worker * xmlNewChild:
2892*6777b538SAndroid Build Coastguard Worker * @parent: the parent node
2893*6777b538SAndroid Build Coastguard Worker * @ns: a namespace if any
2894*6777b538SAndroid Build Coastguard Worker * @name: the name of the child
2895*6777b538SAndroid Build Coastguard Worker * @content: the XML content of the child if any.
2896*6777b538SAndroid Build Coastguard Worker *
2897*6777b538SAndroid Build Coastguard Worker * Creation of a new child element, added at the end of @parent children list.
2898*6777b538SAndroid Build Coastguard Worker * @ns and @content parameters are optional (NULL). If @ns is NULL, the newly
2899*6777b538SAndroid Build Coastguard Worker * created element inherits the namespace of @parent. If @content is non NULL,
2900*6777b538SAndroid Build Coastguard Worker * a child list containing the TEXTs and ENTITY_REFs node will be created.
2901*6777b538SAndroid Build Coastguard Worker * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity
2902*6777b538SAndroid Build Coastguard Worker * references. XML special chars must be escaped first by using
2903*6777b538SAndroid Build Coastguard Worker * xmlEncodeEntitiesReentrant(), or xmlNewTextChild() should be used.
2904*6777b538SAndroid Build Coastguard Worker *
2905*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the new node object.
2906*6777b538SAndroid Build Coastguard Worker */
2907*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNewChild(xmlNodePtr parent,xmlNsPtr ns,const xmlChar * name,const xmlChar * content)2908*6777b538SAndroid Build Coastguard Worker xmlNewChild(xmlNodePtr parent, xmlNsPtr ns,
2909*6777b538SAndroid Build Coastguard Worker const xmlChar *name, const xmlChar *content) {
2910*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur, prev;
2911*6777b538SAndroid Build Coastguard Worker
2912*6777b538SAndroid Build Coastguard Worker if (parent == NULL) {
2913*6777b538SAndroid Build Coastguard Worker return(NULL);
2914*6777b538SAndroid Build Coastguard Worker }
2915*6777b538SAndroid Build Coastguard Worker
2916*6777b538SAndroid Build Coastguard Worker if (name == NULL) {
2917*6777b538SAndroid Build Coastguard Worker return(NULL);
2918*6777b538SAndroid Build Coastguard Worker }
2919*6777b538SAndroid Build Coastguard Worker
2920*6777b538SAndroid Build Coastguard Worker /*
2921*6777b538SAndroid Build Coastguard Worker * Allocate a new node
2922*6777b538SAndroid Build Coastguard Worker */
2923*6777b538SAndroid Build Coastguard Worker if (parent->type == XML_ELEMENT_NODE) {
2924*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
2925*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocNode(parent->doc, parent->ns, name, content);
2926*6777b538SAndroid Build Coastguard Worker else
2927*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocNode(parent->doc, ns, name, content);
2928*6777b538SAndroid Build Coastguard Worker } else if ((parent->type == XML_DOCUMENT_NODE) ||
2929*6777b538SAndroid Build Coastguard Worker (parent->type == XML_HTML_DOCUMENT_NODE)) {
2930*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
2931*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocNode((xmlDocPtr) parent, NULL, name, content);
2932*6777b538SAndroid Build Coastguard Worker else
2933*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocNode((xmlDocPtr) parent, ns, name, content);
2934*6777b538SAndroid Build Coastguard Worker } else if (parent->type == XML_DOCUMENT_FRAG_NODE) {
2935*6777b538SAndroid Build Coastguard Worker cur = xmlNewDocNode( parent->doc, ns, name, content);
2936*6777b538SAndroid Build Coastguard Worker } else {
2937*6777b538SAndroid Build Coastguard Worker return(NULL);
2938*6777b538SAndroid Build Coastguard Worker }
2939*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return(NULL);
2940*6777b538SAndroid Build Coastguard Worker
2941*6777b538SAndroid Build Coastguard Worker /*
2942*6777b538SAndroid Build Coastguard Worker * add the new element at the end of the children list.
2943*6777b538SAndroid Build Coastguard Worker */
2944*6777b538SAndroid Build Coastguard Worker cur->type = XML_ELEMENT_NODE;
2945*6777b538SAndroid Build Coastguard Worker cur->parent = parent;
2946*6777b538SAndroid Build Coastguard Worker cur->doc = parent->doc;
2947*6777b538SAndroid Build Coastguard Worker if (parent->children == NULL) {
2948*6777b538SAndroid Build Coastguard Worker parent->children = cur;
2949*6777b538SAndroid Build Coastguard Worker parent->last = cur;
2950*6777b538SAndroid Build Coastguard Worker } else {
2951*6777b538SAndroid Build Coastguard Worker prev = parent->last;
2952*6777b538SAndroid Build Coastguard Worker prev->next = cur;
2953*6777b538SAndroid Build Coastguard Worker cur->prev = prev;
2954*6777b538SAndroid Build Coastguard Worker parent->last = cur;
2955*6777b538SAndroid Build Coastguard Worker }
2956*6777b538SAndroid Build Coastguard Worker
2957*6777b538SAndroid Build Coastguard Worker return(cur);
2958*6777b538SAndroid Build Coastguard Worker }
2959*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
2960*6777b538SAndroid Build Coastguard Worker
2961*6777b538SAndroid Build Coastguard Worker /**
2962*6777b538SAndroid Build Coastguard Worker * xmlAddPropSibling:
2963*6777b538SAndroid Build Coastguard Worker * @prev: the attribute to which @prop is added after
2964*6777b538SAndroid Build Coastguard Worker * @cur: the base attribute passed to calling function
2965*6777b538SAndroid Build Coastguard Worker * @prop: the new attribute
2966*6777b538SAndroid Build Coastguard Worker *
2967*6777b538SAndroid Build Coastguard Worker * Add a new attribute after @prev using @cur as base attribute.
2968*6777b538SAndroid Build Coastguard Worker * When inserting before @cur, @prev is passed as @cur->prev.
2969*6777b538SAndroid Build Coastguard Worker * When inserting after @cur, @prev is passed as @cur.
2970*6777b538SAndroid Build Coastguard Worker * If an existing attribute is found it is destroyed prior to adding @prop.
2971*6777b538SAndroid Build Coastguard Worker *
2972*6777b538SAndroid Build Coastguard Worker * See the note regarding namespaces in xmlAddChild.
2973*6777b538SAndroid Build Coastguard Worker *
2974*6777b538SAndroid Build Coastguard Worker * Returns the attribute being inserted or NULL in case of error.
2975*6777b538SAndroid Build Coastguard Worker */
2976*6777b538SAndroid Build Coastguard Worker static xmlNodePtr
xmlAddPropSibling(xmlNodePtr prev,xmlNodePtr cur,xmlNodePtr prop)2977*6777b538SAndroid Build Coastguard Worker xmlAddPropSibling(xmlNodePtr prev, xmlNodePtr cur, xmlNodePtr prop) {
2978*6777b538SAndroid Build Coastguard Worker xmlAttrPtr attr;
2979*6777b538SAndroid Build Coastguard Worker
2980*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (cur->type != XML_ATTRIBUTE_NODE) ||
2981*6777b538SAndroid Build Coastguard Worker (prop == NULL) || (prop->type != XML_ATTRIBUTE_NODE) ||
2982*6777b538SAndroid Build Coastguard Worker ((prev != NULL) && (prev->type != XML_ATTRIBUTE_NODE)))
2983*6777b538SAndroid Build Coastguard Worker return(NULL);
2984*6777b538SAndroid Build Coastguard Worker
2985*6777b538SAndroid Build Coastguard Worker /* check if an attribute with the same name exists */
2986*6777b538SAndroid Build Coastguard Worker if (prop->ns == NULL)
2987*6777b538SAndroid Build Coastguard Worker attr = xmlHasNsProp(cur->parent, prop->name, NULL);
2988*6777b538SAndroid Build Coastguard Worker else
2989*6777b538SAndroid Build Coastguard Worker attr = xmlHasNsProp(cur->parent, prop->name, prop->ns->href);
2990*6777b538SAndroid Build Coastguard Worker
2991*6777b538SAndroid Build Coastguard Worker if (prop->doc != cur->doc) {
2992*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(prop, cur->doc);
2993*6777b538SAndroid Build Coastguard Worker }
2994*6777b538SAndroid Build Coastguard Worker prop->parent = cur->parent;
2995*6777b538SAndroid Build Coastguard Worker prop->prev = prev;
2996*6777b538SAndroid Build Coastguard Worker if (prev != NULL) {
2997*6777b538SAndroid Build Coastguard Worker prop->next = prev->next;
2998*6777b538SAndroid Build Coastguard Worker prev->next = prop;
2999*6777b538SAndroid Build Coastguard Worker if (prop->next)
3000*6777b538SAndroid Build Coastguard Worker prop->next->prev = prop;
3001*6777b538SAndroid Build Coastguard Worker } else {
3002*6777b538SAndroid Build Coastguard Worker prop->next = cur;
3003*6777b538SAndroid Build Coastguard Worker cur->prev = prop;
3004*6777b538SAndroid Build Coastguard Worker }
3005*6777b538SAndroid Build Coastguard Worker if (prop->prev == NULL && prop->parent != NULL)
3006*6777b538SAndroid Build Coastguard Worker prop->parent->properties = (xmlAttrPtr) prop;
3007*6777b538SAndroid Build Coastguard Worker if ((attr != NULL) && (attr->type != XML_ATTRIBUTE_DECL)) {
3008*6777b538SAndroid Build Coastguard Worker /* different instance, destroy it (attributes must be unique) */
3009*6777b538SAndroid Build Coastguard Worker xmlRemoveProp((xmlAttrPtr) attr);
3010*6777b538SAndroid Build Coastguard Worker }
3011*6777b538SAndroid Build Coastguard Worker return prop;
3012*6777b538SAndroid Build Coastguard Worker }
3013*6777b538SAndroid Build Coastguard Worker
3014*6777b538SAndroid Build Coastguard Worker /**
3015*6777b538SAndroid Build Coastguard Worker * xmlAddNextSibling:
3016*6777b538SAndroid Build Coastguard Worker * @cur: the child node
3017*6777b538SAndroid Build Coastguard Worker * @elem: the new node
3018*6777b538SAndroid Build Coastguard Worker *
3019*6777b538SAndroid Build Coastguard Worker * Add a new node @elem as the next sibling of @cur
3020*6777b538SAndroid Build Coastguard Worker * If the new node was already inserted in a document it is
3021*6777b538SAndroid Build Coastguard Worker * first unlinked from its existing context.
3022*6777b538SAndroid Build Coastguard Worker * As a result of text merging @elem may be freed.
3023*6777b538SAndroid Build Coastguard Worker * If the new node is ATTRIBUTE, it is added into properties instead of children.
3024*6777b538SAndroid Build Coastguard Worker * If there is an attribute with equal name, it is first destroyed.
3025*6777b538SAndroid Build Coastguard Worker *
3026*6777b538SAndroid Build Coastguard Worker * See the note regarding namespaces in xmlAddChild.
3027*6777b538SAndroid Build Coastguard Worker *
3028*6777b538SAndroid Build Coastguard Worker * Returns the new node or NULL in case of error.
3029*6777b538SAndroid Build Coastguard Worker */
3030*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlAddNextSibling(xmlNodePtr cur,xmlNodePtr elem)3031*6777b538SAndroid Build Coastguard Worker xmlAddNextSibling(xmlNodePtr cur, xmlNodePtr elem) {
3032*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) {
3033*6777b538SAndroid Build Coastguard Worker return(NULL);
3034*6777b538SAndroid Build Coastguard Worker }
3035*6777b538SAndroid Build Coastguard Worker if ((elem == NULL) || (elem->type == XML_NAMESPACE_DECL)) {
3036*6777b538SAndroid Build Coastguard Worker return(NULL);
3037*6777b538SAndroid Build Coastguard Worker }
3038*6777b538SAndroid Build Coastguard Worker
3039*6777b538SAndroid Build Coastguard Worker if (cur == elem) {
3040*6777b538SAndroid Build Coastguard Worker return(NULL);
3041*6777b538SAndroid Build Coastguard Worker }
3042*6777b538SAndroid Build Coastguard Worker
3043*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(elem);
3044*6777b538SAndroid Build Coastguard Worker
3045*6777b538SAndroid Build Coastguard Worker if (elem->type == XML_TEXT_NODE) {
3046*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_TEXT_NODE) {
3047*6777b538SAndroid Build Coastguard Worker xmlNodeAddContent(cur, elem->content);
3048*6777b538SAndroid Build Coastguard Worker xmlFreeNode(elem);
3049*6777b538SAndroid Build Coastguard Worker return(cur);
3050*6777b538SAndroid Build Coastguard Worker }
3051*6777b538SAndroid Build Coastguard Worker if ((cur->next != NULL) && (cur->next->type == XML_TEXT_NODE) &&
3052*6777b538SAndroid Build Coastguard Worker (cur->name == cur->next->name)) {
3053*6777b538SAndroid Build Coastguard Worker xmlChar *tmp;
3054*6777b538SAndroid Build Coastguard Worker
3055*6777b538SAndroid Build Coastguard Worker /* TODO: malloc check */
3056*6777b538SAndroid Build Coastguard Worker tmp = xmlStrdup(elem->content);
3057*6777b538SAndroid Build Coastguard Worker tmp = xmlStrcat(tmp, cur->next->content);
3058*6777b538SAndroid Build Coastguard Worker xmlNodeSetContent(cur->next, tmp);
3059*6777b538SAndroid Build Coastguard Worker xmlFree(tmp);
3060*6777b538SAndroid Build Coastguard Worker xmlFreeNode(elem);
3061*6777b538SAndroid Build Coastguard Worker return(cur->next);
3062*6777b538SAndroid Build Coastguard Worker }
3063*6777b538SAndroid Build Coastguard Worker } else if (elem->type == XML_ATTRIBUTE_NODE) {
3064*6777b538SAndroid Build Coastguard Worker return xmlAddPropSibling(cur, cur, elem);
3065*6777b538SAndroid Build Coastguard Worker }
3066*6777b538SAndroid Build Coastguard Worker
3067*6777b538SAndroid Build Coastguard Worker if (elem->doc != cur->doc) {
3068*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(elem, cur->doc);
3069*6777b538SAndroid Build Coastguard Worker }
3070*6777b538SAndroid Build Coastguard Worker elem->parent = cur->parent;
3071*6777b538SAndroid Build Coastguard Worker elem->prev = cur;
3072*6777b538SAndroid Build Coastguard Worker elem->next = cur->next;
3073*6777b538SAndroid Build Coastguard Worker cur->next = elem;
3074*6777b538SAndroid Build Coastguard Worker if (elem->next != NULL)
3075*6777b538SAndroid Build Coastguard Worker elem->next->prev = elem;
3076*6777b538SAndroid Build Coastguard Worker if ((elem->parent != NULL) && (elem->parent->last == cur))
3077*6777b538SAndroid Build Coastguard Worker elem->parent->last = elem;
3078*6777b538SAndroid Build Coastguard Worker return(elem);
3079*6777b538SAndroid Build Coastguard Worker }
3080*6777b538SAndroid Build Coastguard Worker
3081*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_HTML_ENABLED) || \
3082*6777b538SAndroid Build Coastguard Worker defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED)
3083*6777b538SAndroid Build Coastguard Worker /**
3084*6777b538SAndroid Build Coastguard Worker * xmlAddPrevSibling:
3085*6777b538SAndroid Build Coastguard Worker * @cur: the child node
3086*6777b538SAndroid Build Coastguard Worker * @elem: the new node
3087*6777b538SAndroid Build Coastguard Worker *
3088*6777b538SAndroid Build Coastguard Worker * Add a new node @elem as the previous sibling of @cur
3089*6777b538SAndroid Build Coastguard Worker * merging adjacent TEXT nodes (@elem may be freed)
3090*6777b538SAndroid Build Coastguard Worker * If the new node was already inserted in a document it is
3091*6777b538SAndroid Build Coastguard Worker * first unlinked from its existing context.
3092*6777b538SAndroid Build Coastguard Worker * If the new node is ATTRIBUTE, it is added into properties instead of children.
3093*6777b538SAndroid Build Coastguard Worker * If there is an attribute with equal name, it is first destroyed.
3094*6777b538SAndroid Build Coastguard Worker *
3095*6777b538SAndroid Build Coastguard Worker * See the note regarding namespaces in xmlAddChild.
3096*6777b538SAndroid Build Coastguard Worker *
3097*6777b538SAndroid Build Coastguard Worker * Returns the new node or NULL in case of error.
3098*6777b538SAndroid Build Coastguard Worker */
3099*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlAddPrevSibling(xmlNodePtr cur,xmlNodePtr elem)3100*6777b538SAndroid Build Coastguard Worker xmlAddPrevSibling(xmlNodePtr cur, xmlNodePtr elem) {
3101*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) {
3102*6777b538SAndroid Build Coastguard Worker return(NULL);
3103*6777b538SAndroid Build Coastguard Worker }
3104*6777b538SAndroid Build Coastguard Worker if ((elem == NULL) || (elem->type == XML_NAMESPACE_DECL)) {
3105*6777b538SAndroid Build Coastguard Worker return(NULL);
3106*6777b538SAndroid Build Coastguard Worker }
3107*6777b538SAndroid Build Coastguard Worker
3108*6777b538SAndroid Build Coastguard Worker if (cur == elem) {
3109*6777b538SAndroid Build Coastguard Worker return(NULL);
3110*6777b538SAndroid Build Coastguard Worker }
3111*6777b538SAndroid Build Coastguard Worker
3112*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(elem);
3113*6777b538SAndroid Build Coastguard Worker
3114*6777b538SAndroid Build Coastguard Worker if (elem->type == XML_TEXT_NODE) {
3115*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_TEXT_NODE) {
3116*6777b538SAndroid Build Coastguard Worker xmlChar *tmp;
3117*6777b538SAndroid Build Coastguard Worker
3118*6777b538SAndroid Build Coastguard Worker /* TODO: malloc check */
3119*6777b538SAndroid Build Coastguard Worker tmp = xmlStrdup(elem->content);
3120*6777b538SAndroid Build Coastguard Worker tmp = xmlStrcat(tmp, cur->content);
3121*6777b538SAndroid Build Coastguard Worker xmlNodeSetContent(cur, tmp);
3122*6777b538SAndroid Build Coastguard Worker xmlFree(tmp);
3123*6777b538SAndroid Build Coastguard Worker xmlFreeNode(elem);
3124*6777b538SAndroid Build Coastguard Worker return(cur);
3125*6777b538SAndroid Build Coastguard Worker }
3126*6777b538SAndroid Build Coastguard Worker if ((cur->prev != NULL) && (cur->prev->type == XML_TEXT_NODE) &&
3127*6777b538SAndroid Build Coastguard Worker (cur->name == cur->prev->name)) {
3128*6777b538SAndroid Build Coastguard Worker xmlNodeAddContent(cur->prev, elem->content);
3129*6777b538SAndroid Build Coastguard Worker xmlFreeNode(elem);
3130*6777b538SAndroid Build Coastguard Worker return(cur->prev);
3131*6777b538SAndroid Build Coastguard Worker }
3132*6777b538SAndroid Build Coastguard Worker } else if (elem->type == XML_ATTRIBUTE_NODE) {
3133*6777b538SAndroid Build Coastguard Worker return xmlAddPropSibling(cur->prev, cur, elem);
3134*6777b538SAndroid Build Coastguard Worker }
3135*6777b538SAndroid Build Coastguard Worker
3136*6777b538SAndroid Build Coastguard Worker if (elem->doc != cur->doc) {
3137*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(elem, cur->doc);
3138*6777b538SAndroid Build Coastguard Worker }
3139*6777b538SAndroid Build Coastguard Worker elem->parent = cur->parent;
3140*6777b538SAndroid Build Coastguard Worker elem->next = cur;
3141*6777b538SAndroid Build Coastguard Worker elem->prev = cur->prev;
3142*6777b538SAndroid Build Coastguard Worker cur->prev = elem;
3143*6777b538SAndroid Build Coastguard Worker if (elem->prev != NULL)
3144*6777b538SAndroid Build Coastguard Worker elem->prev->next = elem;
3145*6777b538SAndroid Build Coastguard Worker if ((elem->parent != NULL) && (elem->parent->children == cur)) {
3146*6777b538SAndroid Build Coastguard Worker elem->parent->children = elem;
3147*6777b538SAndroid Build Coastguard Worker }
3148*6777b538SAndroid Build Coastguard Worker return(elem);
3149*6777b538SAndroid Build Coastguard Worker }
3150*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
3151*6777b538SAndroid Build Coastguard Worker
3152*6777b538SAndroid Build Coastguard Worker /**
3153*6777b538SAndroid Build Coastguard Worker * xmlAddSibling:
3154*6777b538SAndroid Build Coastguard Worker * @cur: the child node
3155*6777b538SAndroid Build Coastguard Worker * @elem: the new node
3156*6777b538SAndroid Build Coastguard Worker *
3157*6777b538SAndroid Build Coastguard Worker * Add a new element @elem to the list of siblings of @cur
3158*6777b538SAndroid Build Coastguard Worker * merging adjacent TEXT nodes (@elem may be freed)
3159*6777b538SAndroid Build Coastguard Worker * If the new element was already inserted in a document it is
3160*6777b538SAndroid Build Coastguard Worker * first unlinked from its existing context.
3161*6777b538SAndroid Build Coastguard Worker *
3162*6777b538SAndroid Build Coastguard Worker * See the note regarding namespaces in xmlAddChild.
3163*6777b538SAndroid Build Coastguard Worker *
3164*6777b538SAndroid Build Coastguard Worker * Returns the new element or NULL in case of error.
3165*6777b538SAndroid Build Coastguard Worker */
3166*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlAddSibling(xmlNodePtr cur,xmlNodePtr elem)3167*6777b538SAndroid Build Coastguard Worker xmlAddSibling(xmlNodePtr cur, xmlNodePtr elem) {
3168*6777b538SAndroid Build Coastguard Worker xmlNodePtr parent;
3169*6777b538SAndroid Build Coastguard Worker
3170*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) {
3171*6777b538SAndroid Build Coastguard Worker return(NULL);
3172*6777b538SAndroid Build Coastguard Worker }
3173*6777b538SAndroid Build Coastguard Worker
3174*6777b538SAndroid Build Coastguard Worker if ((elem == NULL) || (elem->type == XML_NAMESPACE_DECL)) {
3175*6777b538SAndroid Build Coastguard Worker return(NULL);
3176*6777b538SAndroid Build Coastguard Worker }
3177*6777b538SAndroid Build Coastguard Worker
3178*6777b538SAndroid Build Coastguard Worker if (cur == elem) {
3179*6777b538SAndroid Build Coastguard Worker return(NULL);
3180*6777b538SAndroid Build Coastguard Worker }
3181*6777b538SAndroid Build Coastguard Worker
3182*6777b538SAndroid Build Coastguard Worker /*
3183*6777b538SAndroid Build Coastguard Worker * Constant time is we can rely on the ->parent->last to find
3184*6777b538SAndroid Build Coastguard Worker * the last sibling.
3185*6777b538SAndroid Build Coastguard Worker */
3186*6777b538SAndroid Build Coastguard Worker if ((cur->type != XML_ATTRIBUTE_NODE) && (cur->parent != NULL) &&
3187*6777b538SAndroid Build Coastguard Worker (cur->parent->children != NULL) &&
3188*6777b538SAndroid Build Coastguard Worker (cur->parent->last != NULL) &&
3189*6777b538SAndroid Build Coastguard Worker (cur->parent->last->next == NULL)) {
3190*6777b538SAndroid Build Coastguard Worker cur = cur->parent->last;
3191*6777b538SAndroid Build Coastguard Worker } else {
3192*6777b538SAndroid Build Coastguard Worker while (cur->next != NULL) cur = cur->next;
3193*6777b538SAndroid Build Coastguard Worker }
3194*6777b538SAndroid Build Coastguard Worker
3195*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(elem);
3196*6777b538SAndroid Build Coastguard Worker
3197*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_TEXT_NODE) && (elem->type == XML_TEXT_NODE) &&
3198*6777b538SAndroid Build Coastguard Worker (cur->name == elem->name)) {
3199*6777b538SAndroid Build Coastguard Worker xmlNodeAddContent(cur, elem->content);
3200*6777b538SAndroid Build Coastguard Worker xmlFreeNode(elem);
3201*6777b538SAndroid Build Coastguard Worker return(cur);
3202*6777b538SAndroid Build Coastguard Worker } else if (elem->type == XML_ATTRIBUTE_NODE) {
3203*6777b538SAndroid Build Coastguard Worker return xmlAddPropSibling(cur, cur, elem);
3204*6777b538SAndroid Build Coastguard Worker }
3205*6777b538SAndroid Build Coastguard Worker
3206*6777b538SAndroid Build Coastguard Worker if (elem->doc != cur->doc) {
3207*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(elem, cur->doc);
3208*6777b538SAndroid Build Coastguard Worker }
3209*6777b538SAndroid Build Coastguard Worker parent = cur->parent;
3210*6777b538SAndroid Build Coastguard Worker elem->prev = cur;
3211*6777b538SAndroid Build Coastguard Worker elem->next = NULL;
3212*6777b538SAndroid Build Coastguard Worker elem->parent = parent;
3213*6777b538SAndroid Build Coastguard Worker cur->next = elem;
3214*6777b538SAndroid Build Coastguard Worker if (parent != NULL)
3215*6777b538SAndroid Build Coastguard Worker parent->last = elem;
3216*6777b538SAndroid Build Coastguard Worker
3217*6777b538SAndroid Build Coastguard Worker return(elem);
3218*6777b538SAndroid Build Coastguard Worker }
3219*6777b538SAndroid Build Coastguard Worker
3220*6777b538SAndroid Build Coastguard Worker /**
3221*6777b538SAndroid Build Coastguard Worker * xmlAddChildList:
3222*6777b538SAndroid Build Coastguard Worker * @parent: the parent node
3223*6777b538SAndroid Build Coastguard Worker * @cur: the first node in the list
3224*6777b538SAndroid Build Coastguard Worker *
3225*6777b538SAndroid Build Coastguard Worker * Add a list of node at the end of the child list of the parent
3226*6777b538SAndroid Build Coastguard Worker * merging adjacent TEXT nodes (@cur may be freed)
3227*6777b538SAndroid Build Coastguard Worker *
3228*6777b538SAndroid Build Coastguard Worker * See the note regarding namespaces in xmlAddChild.
3229*6777b538SAndroid Build Coastguard Worker *
3230*6777b538SAndroid Build Coastguard Worker * Returns the last child or NULL in case of error.
3231*6777b538SAndroid Build Coastguard Worker */
3232*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlAddChildList(xmlNodePtr parent,xmlNodePtr cur)3233*6777b538SAndroid Build Coastguard Worker xmlAddChildList(xmlNodePtr parent, xmlNodePtr cur) {
3234*6777b538SAndroid Build Coastguard Worker xmlNodePtr prev;
3235*6777b538SAndroid Build Coastguard Worker
3236*6777b538SAndroid Build Coastguard Worker if ((parent == NULL) || (parent->type == XML_NAMESPACE_DECL)) {
3237*6777b538SAndroid Build Coastguard Worker return(NULL);
3238*6777b538SAndroid Build Coastguard Worker }
3239*6777b538SAndroid Build Coastguard Worker
3240*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) {
3241*6777b538SAndroid Build Coastguard Worker return(NULL);
3242*6777b538SAndroid Build Coastguard Worker }
3243*6777b538SAndroid Build Coastguard Worker
3244*6777b538SAndroid Build Coastguard Worker if ((cur->doc != NULL) && (parent->doc != NULL) &&
3245*6777b538SAndroid Build Coastguard Worker (cur->doc != parent->doc)) {
3246*6777b538SAndroid Build Coastguard Worker }
3247*6777b538SAndroid Build Coastguard Worker
3248*6777b538SAndroid Build Coastguard Worker /*
3249*6777b538SAndroid Build Coastguard Worker * add the first element at the end of the children list.
3250*6777b538SAndroid Build Coastguard Worker */
3251*6777b538SAndroid Build Coastguard Worker
3252*6777b538SAndroid Build Coastguard Worker if (parent->children == NULL) {
3253*6777b538SAndroid Build Coastguard Worker parent->children = cur;
3254*6777b538SAndroid Build Coastguard Worker } else {
3255*6777b538SAndroid Build Coastguard Worker /*
3256*6777b538SAndroid Build Coastguard Worker * If cur and parent->last both are TEXT nodes, then merge them.
3257*6777b538SAndroid Build Coastguard Worker */
3258*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_TEXT_NODE) &&
3259*6777b538SAndroid Build Coastguard Worker (parent->last->type == XML_TEXT_NODE) &&
3260*6777b538SAndroid Build Coastguard Worker (cur->name == parent->last->name)) {
3261*6777b538SAndroid Build Coastguard Worker xmlNodeAddContent(parent->last, cur->content);
3262*6777b538SAndroid Build Coastguard Worker /*
3263*6777b538SAndroid Build Coastguard Worker * if it's the only child, nothing more to be done.
3264*6777b538SAndroid Build Coastguard Worker */
3265*6777b538SAndroid Build Coastguard Worker if (cur->next == NULL) {
3266*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
3267*6777b538SAndroid Build Coastguard Worker return(parent->last);
3268*6777b538SAndroid Build Coastguard Worker }
3269*6777b538SAndroid Build Coastguard Worker prev = cur;
3270*6777b538SAndroid Build Coastguard Worker cur = cur->next;
3271*6777b538SAndroid Build Coastguard Worker xmlFreeNode(prev);
3272*6777b538SAndroid Build Coastguard Worker }
3273*6777b538SAndroid Build Coastguard Worker prev = parent->last;
3274*6777b538SAndroid Build Coastguard Worker prev->next = cur;
3275*6777b538SAndroid Build Coastguard Worker cur->prev = prev;
3276*6777b538SAndroid Build Coastguard Worker }
3277*6777b538SAndroid Build Coastguard Worker while (cur->next != NULL) {
3278*6777b538SAndroid Build Coastguard Worker cur->parent = parent;
3279*6777b538SAndroid Build Coastguard Worker if (cur->doc != parent->doc) {
3280*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(cur, parent->doc);
3281*6777b538SAndroid Build Coastguard Worker }
3282*6777b538SAndroid Build Coastguard Worker cur = cur->next;
3283*6777b538SAndroid Build Coastguard Worker }
3284*6777b538SAndroid Build Coastguard Worker cur->parent = parent;
3285*6777b538SAndroid Build Coastguard Worker /* the parent may not be linked to a doc ! */
3286*6777b538SAndroid Build Coastguard Worker if (cur->doc != parent->doc) {
3287*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(cur, parent->doc);
3288*6777b538SAndroid Build Coastguard Worker }
3289*6777b538SAndroid Build Coastguard Worker parent->last = cur;
3290*6777b538SAndroid Build Coastguard Worker
3291*6777b538SAndroid Build Coastguard Worker return(cur);
3292*6777b538SAndroid Build Coastguard Worker }
3293*6777b538SAndroid Build Coastguard Worker
3294*6777b538SAndroid Build Coastguard Worker /**
3295*6777b538SAndroid Build Coastguard Worker * xmlAddChild:
3296*6777b538SAndroid Build Coastguard Worker * @parent: the parent node
3297*6777b538SAndroid Build Coastguard Worker * @cur: the child node
3298*6777b538SAndroid Build Coastguard Worker *
3299*6777b538SAndroid Build Coastguard Worker * Add a new node to @parent, at the end of the child (or property) list
3300*6777b538SAndroid Build Coastguard Worker * merging adjacent TEXT nodes (in which case @cur is freed)
3301*6777b538SAndroid Build Coastguard Worker * If the new node is ATTRIBUTE, it is added into properties instead of children.
3302*6777b538SAndroid Build Coastguard Worker * If there is an attribute with equal name, it is first destroyed.
3303*6777b538SAndroid Build Coastguard Worker *
3304*6777b538SAndroid Build Coastguard Worker * All tree manipulation functions can safely move nodes within a document.
3305*6777b538SAndroid Build Coastguard Worker * But when moving nodes from one document to another, references to
3306*6777b538SAndroid Build Coastguard Worker * namespaces in element or attribute nodes are NOT fixed. In this case,
3307*6777b538SAndroid Build Coastguard Worker * you MUST call xmlReconciliateNs after the move operation to avoid
3308*6777b538SAndroid Build Coastguard Worker * memory errors.
3309*6777b538SAndroid Build Coastguard Worker *
3310*6777b538SAndroid Build Coastguard Worker * Returns the child or NULL in case of error.
3311*6777b538SAndroid Build Coastguard Worker */
3312*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlAddChild(xmlNodePtr parent,xmlNodePtr cur)3313*6777b538SAndroid Build Coastguard Worker xmlAddChild(xmlNodePtr parent, xmlNodePtr cur) {
3314*6777b538SAndroid Build Coastguard Worker xmlNodePtr prev;
3315*6777b538SAndroid Build Coastguard Worker
3316*6777b538SAndroid Build Coastguard Worker if ((parent == NULL) || (parent->type == XML_NAMESPACE_DECL)) {
3317*6777b538SAndroid Build Coastguard Worker return(NULL);
3318*6777b538SAndroid Build Coastguard Worker }
3319*6777b538SAndroid Build Coastguard Worker
3320*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) {
3321*6777b538SAndroid Build Coastguard Worker return(NULL);
3322*6777b538SAndroid Build Coastguard Worker }
3323*6777b538SAndroid Build Coastguard Worker
3324*6777b538SAndroid Build Coastguard Worker if (parent == cur) {
3325*6777b538SAndroid Build Coastguard Worker return(NULL);
3326*6777b538SAndroid Build Coastguard Worker }
3327*6777b538SAndroid Build Coastguard Worker /*
3328*6777b538SAndroid Build Coastguard Worker * If cur is a TEXT node, merge its content with adjacent TEXT nodes
3329*6777b538SAndroid Build Coastguard Worker * cur is then freed.
3330*6777b538SAndroid Build Coastguard Worker */
3331*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_TEXT_NODE) {
3332*6777b538SAndroid Build Coastguard Worker if ((parent->type == XML_TEXT_NODE) &&
3333*6777b538SAndroid Build Coastguard Worker (parent->content != NULL) &&
3334*6777b538SAndroid Build Coastguard Worker (parent->name == cur->name)) {
3335*6777b538SAndroid Build Coastguard Worker if (xmlNodeAddContent(parent, cur->content) != 0) {
3336*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
3337*6777b538SAndroid Build Coastguard Worker return(NULL);
3338*6777b538SAndroid Build Coastguard Worker }
3339*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
3340*6777b538SAndroid Build Coastguard Worker return(parent);
3341*6777b538SAndroid Build Coastguard Worker }
3342*6777b538SAndroid Build Coastguard Worker if ((parent->last != NULL) && (parent->last->type == XML_TEXT_NODE) &&
3343*6777b538SAndroid Build Coastguard Worker (parent->last->name == cur->name) &&
3344*6777b538SAndroid Build Coastguard Worker (parent->last != cur)) {
3345*6777b538SAndroid Build Coastguard Worker if (xmlNodeAddContent(parent->last, cur->content) != 0) {
3346*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
3347*6777b538SAndroid Build Coastguard Worker return(NULL);
3348*6777b538SAndroid Build Coastguard Worker }
3349*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
3350*6777b538SAndroid Build Coastguard Worker return(parent->last);
3351*6777b538SAndroid Build Coastguard Worker }
3352*6777b538SAndroid Build Coastguard Worker }
3353*6777b538SAndroid Build Coastguard Worker
3354*6777b538SAndroid Build Coastguard Worker /*
3355*6777b538SAndroid Build Coastguard Worker * add the new element at the end of the children list.
3356*6777b538SAndroid Build Coastguard Worker */
3357*6777b538SAndroid Build Coastguard Worker prev = cur->parent;
3358*6777b538SAndroid Build Coastguard Worker cur->parent = parent;
3359*6777b538SAndroid Build Coastguard Worker if (cur->doc != parent->doc) {
3360*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(cur, parent->doc);
3361*6777b538SAndroid Build Coastguard Worker }
3362*6777b538SAndroid Build Coastguard Worker /* this check prevents a loop on tree-traversions if a developer
3363*6777b538SAndroid Build Coastguard Worker * tries to add a node to its parent multiple times
3364*6777b538SAndroid Build Coastguard Worker */
3365*6777b538SAndroid Build Coastguard Worker if (prev == parent)
3366*6777b538SAndroid Build Coastguard Worker return(cur);
3367*6777b538SAndroid Build Coastguard Worker
3368*6777b538SAndroid Build Coastguard Worker /*
3369*6777b538SAndroid Build Coastguard Worker * Coalescing
3370*6777b538SAndroid Build Coastguard Worker */
3371*6777b538SAndroid Build Coastguard Worker if ((parent->type == XML_TEXT_NODE) &&
3372*6777b538SAndroid Build Coastguard Worker (parent->content != NULL) &&
3373*6777b538SAndroid Build Coastguard Worker (parent != cur)) {
3374*6777b538SAndroid Build Coastguard Worker if (xmlNodeAddContent(parent, cur->content) != 0) {
3375*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
3376*6777b538SAndroid Build Coastguard Worker return(NULL);
3377*6777b538SAndroid Build Coastguard Worker }
3378*6777b538SAndroid Build Coastguard Worker xmlFreeNode(cur);
3379*6777b538SAndroid Build Coastguard Worker return(parent);
3380*6777b538SAndroid Build Coastguard Worker }
3381*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ATTRIBUTE_NODE) {
3382*6777b538SAndroid Build Coastguard Worker if (parent->type != XML_ELEMENT_NODE)
3383*6777b538SAndroid Build Coastguard Worker return(NULL);
3384*6777b538SAndroid Build Coastguard Worker if (parent->properties != NULL) {
3385*6777b538SAndroid Build Coastguard Worker /* check if an attribute with the same name exists */
3386*6777b538SAndroid Build Coastguard Worker xmlAttrPtr lastattr;
3387*6777b538SAndroid Build Coastguard Worker
3388*6777b538SAndroid Build Coastguard Worker if (cur->ns == NULL)
3389*6777b538SAndroid Build Coastguard Worker lastattr = xmlHasNsProp(parent, cur->name, NULL);
3390*6777b538SAndroid Build Coastguard Worker else
3391*6777b538SAndroid Build Coastguard Worker lastattr = xmlHasNsProp(parent, cur->name, cur->ns->href);
3392*6777b538SAndroid Build Coastguard Worker if ((lastattr != NULL) && (lastattr != (xmlAttrPtr) cur) && (lastattr->type != XML_ATTRIBUTE_DECL)) {
3393*6777b538SAndroid Build Coastguard Worker /* different instance, destroy it (attributes must be unique) */
3394*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode((xmlNodePtr) lastattr);
3395*6777b538SAndroid Build Coastguard Worker xmlFreeProp(lastattr);
3396*6777b538SAndroid Build Coastguard Worker }
3397*6777b538SAndroid Build Coastguard Worker if (lastattr == (xmlAttrPtr) cur)
3398*6777b538SAndroid Build Coastguard Worker return(cur);
3399*6777b538SAndroid Build Coastguard Worker
3400*6777b538SAndroid Build Coastguard Worker }
3401*6777b538SAndroid Build Coastguard Worker if (parent->properties == NULL) {
3402*6777b538SAndroid Build Coastguard Worker parent->properties = (xmlAttrPtr) cur;
3403*6777b538SAndroid Build Coastguard Worker } else {
3404*6777b538SAndroid Build Coastguard Worker /* find the end */
3405*6777b538SAndroid Build Coastguard Worker xmlAttrPtr lastattr = parent->properties;
3406*6777b538SAndroid Build Coastguard Worker while (lastattr->next != NULL) {
3407*6777b538SAndroid Build Coastguard Worker lastattr = lastattr->next;
3408*6777b538SAndroid Build Coastguard Worker }
3409*6777b538SAndroid Build Coastguard Worker lastattr->next = (xmlAttrPtr) cur;
3410*6777b538SAndroid Build Coastguard Worker ((xmlAttrPtr) cur)->prev = lastattr;
3411*6777b538SAndroid Build Coastguard Worker }
3412*6777b538SAndroid Build Coastguard Worker } else {
3413*6777b538SAndroid Build Coastguard Worker if (parent->children == NULL) {
3414*6777b538SAndroid Build Coastguard Worker parent->children = cur;
3415*6777b538SAndroid Build Coastguard Worker parent->last = cur;
3416*6777b538SAndroid Build Coastguard Worker } else {
3417*6777b538SAndroid Build Coastguard Worker prev = parent->last;
3418*6777b538SAndroid Build Coastguard Worker prev->next = cur;
3419*6777b538SAndroid Build Coastguard Worker cur->prev = prev;
3420*6777b538SAndroid Build Coastguard Worker parent->last = cur;
3421*6777b538SAndroid Build Coastguard Worker }
3422*6777b538SAndroid Build Coastguard Worker }
3423*6777b538SAndroid Build Coastguard Worker return(cur);
3424*6777b538SAndroid Build Coastguard Worker }
3425*6777b538SAndroid Build Coastguard Worker
3426*6777b538SAndroid Build Coastguard Worker /**
3427*6777b538SAndroid Build Coastguard Worker * xmlGetLastChild:
3428*6777b538SAndroid Build Coastguard Worker * @parent: the parent node
3429*6777b538SAndroid Build Coastguard Worker *
3430*6777b538SAndroid Build Coastguard Worker * Search the last child of a node.
3431*6777b538SAndroid Build Coastguard Worker * Returns the last child or NULL if none.
3432*6777b538SAndroid Build Coastguard Worker */
3433*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlGetLastChild(const xmlNode * parent)3434*6777b538SAndroid Build Coastguard Worker xmlGetLastChild(const xmlNode *parent) {
3435*6777b538SAndroid Build Coastguard Worker if ((parent == NULL) || (parent->type == XML_NAMESPACE_DECL)) {
3436*6777b538SAndroid Build Coastguard Worker return(NULL);
3437*6777b538SAndroid Build Coastguard Worker }
3438*6777b538SAndroid Build Coastguard Worker return(parent->last);
3439*6777b538SAndroid Build Coastguard Worker }
3440*6777b538SAndroid Build Coastguard Worker
3441*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
3442*6777b538SAndroid Build Coastguard Worker /*
3443*6777b538SAndroid Build Coastguard Worker * 5 interfaces from DOM ElementTraversal
3444*6777b538SAndroid Build Coastguard Worker */
3445*6777b538SAndroid Build Coastguard Worker
3446*6777b538SAndroid Build Coastguard Worker /**
3447*6777b538SAndroid Build Coastguard Worker * xmlChildElementCount:
3448*6777b538SAndroid Build Coastguard Worker * @parent: the parent node
3449*6777b538SAndroid Build Coastguard Worker *
3450*6777b538SAndroid Build Coastguard Worker * Finds the current number of child nodes of that element which are
3451*6777b538SAndroid Build Coastguard Worker * element nodes.
3452*6777b538SAndroid Build Coastguard Worker * Note the handling of entities references is different than in
3453*6777b538SAndroid Build Coastguard Worker * the W3C DOM element traversal spec since we don't have back reference
3454*6777b538SAndroid Build Coastguard Worker * from entities content to entities references.
3455*6777b538SAndroid Build Coastguard Worker *
3456*6777b538SAndroid Build Coastguard Worker * Returns the count of element child or 0 if not available
3457*6777b538SAndroid Build Coastguard Worker */
3458*6777b538SAndroid Build Coastguard Worker unsigned long
xmlChildElementCount(xmlNodePtr parent)3459*6777b538SAndroid Build Coastguard Worker xmlChildElementCount(xmlNodePtr parent) {
3460*6777b538SAndroid Build Coastguard Worker unsigned long ret = 0;
3461*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur = NULL;
3462*6777b538SAndroid Build Coastguard Worker
3463*6777b538SAndroid Build Coastguard Worker if (parent == NULL)
3464*6777b538SAndroid Build Coastguard Worker return(0);
3465*6777b538SAndroid Build Coastguard Worker switch (parent->type) {
3466*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
3467*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
3468*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
3469*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
3470*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
3471*6777b538SAndroid Build Coastguard Worker cur = parent->children;
3472*6777b538SAndroid Build Coastguard Worker break;
3473*6777b538SAndroid Build Coastguard Worker default:
3474*6777b538SAndroid Build Coastguard Worker return(0);
3475*6777b538SAndroid Build Coastguard Worker }
3476*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
3477*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ELEMENT_NODE)
3478*6777b538SAndroid Build Coastguard Worker ret++;
3479*6777b538SAndroid Build Coastguard Worker cur = cur->next;
3480*6777b538SAndroid Build Coastguard Worker }
3481*6777b538SAndroid Build Coastguard Worker return(ret);
3482*6777b538SAndroid Build Coastguard Worker }
3483*6777b538SAndroid Build Coastguard Worker
3484*6777b538SAndroid Build Coastguard Worker /**
3485*6777b538SAndroid Build Coastguard Worker * xmlFirstElementChild:
3486*6777b538SAndroid Build Coastguard Worker * @parent: the parent node
3487*6777b538SAndroid Build Coastguard Worker *
3488*6777b538SAndroid Build Coastguard Worker * Finds the first child node of that element which is a Element node
3489*6777b538SAndroid Build Coastguard Worker * Note the handling of entities references is different than in
3490*6777b538SAndroid Build Coastguard Worker * the W3C DOM element traversal spec since we don't have back reference
3491*6777b538SAndroid Build Coastguard Worker * from entities content to entities references.
3492*6777b538SAndroid Build Coastguard Worker *
3493*6777b538SAndroid Build Coastguard Worker * Returns the first element child or NULL if not available
3494*6777b538SAndroid Build Coastguard Worker */
3495*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlFirstElementChild(xmlNodePtr parent)3496*6777b538SAndroid Build Coastguard Worker xmlFirstElementChild(xmlNodePtr parent) {
3497*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur = NULL;
3498*6777b538SAndroid Build Coastguard Worker
3499*6777b538SAndroid Build Coastguard Worker if (parent == NULL)
3500*6777b538SAndroid Build Coastguard Worker return(NULL);
3501*6777b538SAndroid Build Coastguard Worker switch (parent->type) {
3502*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
3503*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
3504*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
3505*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
3506*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
3507*6777b538SAndroid Build Coastguard Worker cur = parent->children;
3508*6777b538SAndroid Build Coastguard Worker break;
3509*6777b538SAndroid Build Coastguard Worker default:
3510*6777b538SAndroid Build Coastguard Worker return(NULL);
3511*6777b538SAndroid Build Coastguard Worker }
3512*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
3513*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ELEMENT_NODE)
3514*6777b538SAndroid Build Coastguard Worker return(cur);
3515*6777b538SAndroid Build Coastguard Worker cur = cur->next;
3516*6777b538SAndroid Build Coastguard Worker }
3517*6777b538SAndroid Build Coastguard Worker return(NULL);
3518*6777b538SAndroid Build Coastguard Worker }
3519*6777b538SAndroid Build Coastguard Worker
3520*6777b538SAndroid Build Coastguard Worker /**
3521*6777b538SAndroid Build Coastguard Worker * xmlLastElementChild:
3522*6777b538SAndroid Build Coastguard Worker * @parent: the parent node
3523*6777b538SAndroid Build Coastguard Worker *
3524*6777b538SAndroid Build Coastguard Worker * Finds the last child node of that element which is a Element node
3525*6777b538SAndroid Build Coastguard Worker * Note the handling of entities references is different than in
3526*6777b538SAndroid Build Coastguard Worker * the W3C DOM element traversal spec since we don't have back reference
3527*6777b538SAndroid Build Coastguard Worker * from entities content to entities references.
3528*6777b538SAndroid Build Coastguard Worker *
3529*6777b538SAndroid Build Coastguard Worker * Returns the last element child or NULL if not available
3530*6777b538SAndroid Build Coastguard Worker */
3531*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlLastElementChild(xmlNodePtr parent)3532*6777b538SAndroid Build Coastguard Worker xmlLastElementChild(xmlNodePtr parent) {
3533*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur = NULL;
3534*6777b538SAndroid Build Coastguard Worker
3535*6777b538SAndroid Build Coastguard Worker if (parent == NULL)
3536*6777b538SAndroid Build Coastguard Worker return(NULL);
3537*6777b538SAndroid Build Coastguard Worker switch (parent->type) {
3538*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
3539*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
3540*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
3541*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
3542*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
3543*6777b538SAndroid Build Coastguard Worker cur = parent->last;
3544*6777b538SAndroid Build Coastguard Worker break;
3545*6777b538SAndroid Build Coastguard Worker default:
3546*6777b538SAndroid Build Coastguard Worker return(NULL);
3547*6777b538SAndroid Build Coastguard Worker }
3548*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
3549*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ELEMENT_NODE)
3550*6777b538SAndroid Build Coastguard Worker return(cur);
3551*6777b538SAndroid Build Coastguard Worker cur = cur->prev;
3552*6777b538SAndroid Build Coastguard Worker }
3553*6777b538SAndroid Build Coastguard Worker return(NULL);
3554*6777b538SAndroid Build Coastguard Worker }
3555*6777b538SAndroid Build Coastguard Worker
3556*6777b538SAndroid Build Coastguard Worker /**
3557*6777b538SAndroid Build Coastguard Worker * xmlPreviousElementSibling:
3558*6777b538SAndroid Build Coastguard Worker * @node: the current node
3559*6777b538SAndroid Build Coastguard Worker *
3560*6777b538SAndroid Build Coastguard Worker * Finds the first closest previous sibling of the node which is an
3561*6777b538SAndroid Build Coastguard Worker * element node.
3562*6777b538SAndroid Build Coastguard Worker * Note the handling of entities references is different than in
3563*6777b538SAndroid Build Coastguard Worker * the W3C DOM element traversal spec since we don't have back reference
3564*6777b538SAndroid Build Coastguard Worker * from entities content to entities references.
3565*6777b538SAndroid Build Coastguard Worker *
3566*6777b538SAndroid Build Coastguard Worker * Returns the previous element sibling or NULL if not available
3567*6777b538SAndroid Build Coastguard Worker */
3568*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlPreviousElementSibling(xmlNodePtr node)3569*6777b538SAndroid Build Coastguard Worker xmlPreviousElementSibling(xmlNodePtr node) {
3570*6777b538SAndroid Build Coastguard Worker if (node == NULL)
3571*6777b538SAndroid Build Coastguard Worker return(NULL);
3572*6777b538SAndroid Build Coastguard Worker switch (node->type) {
3573*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
3574*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
3575*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
3576*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
3577*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
3578*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
3579*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
3580*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
3581*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
3582*6777b538SAndroid Build Coastguard Worker node = node->prev;
3583*6777b538SAndroid Build Coastguard Worker break;
3584*6777b538SAndroid Build Coastguard Worker default:
3585*6777b538SAndroid Build Coastguard Worker return(NULL);
3586*6777b538SAndroid Build Coastguard Worker }
3587*6777b538SAndroid Build Coastguard Worker while (node != NULL) {
3588*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE)
3589*6777b538SAndroid Build Coastguard Worker return(node);
3590*6777b538SAndroid Build Coastguard Worker node = node->prev;
3591*6777b538SAndroid Build Coastguard Worker }
3592*6777b538SAndroid Build Coastguard Worker return(NULL);
3593*6777b538SAndroid Build Coastguard Worker }
3594*6777b538SAndroid Build Coastguard Worker
3595*6777b538SAndroid Build Coastguard Worker /**
3596*6777b538SAndroid Build Coastguard Worker * xmlNextElementSibling:
3597*6777b538SAndroid Build Coastguard Worker * @node: the current node
3598*6777b538SAndroid Build Coastguard Worker *
3599*6777b538SAndroid Build Coastguard Worker * Finds the first closest next sibling of the node which is an
3600*6777b538SAndroid Build Coastguard Worker * element node.
3601*6777b538SAndroid Build Coastguard Worker * Note the handling of entities references is different than in
3602*6777b538SAndroid Build Coastguard Worker * the W3C DOM element traversal spec since we don't have back reference
3603*6777b538SAndroid Build Coastguard Worker * from entities content to entities references.
3604*6777b538SAndroid Build Coastguard Worker *
3605*6777b538SAndroid Build Coastguard Worker * Returns the next element sibling or NULL if not available
3606*6777b538SAndroid Build Coastguard Worker */
3607*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlNextElementSibling(xmlNodePtr node)3608*6777b538SAndroid Build Coastguard Worker xmlNextElementSibling(xmlNodePtr node) {
3609*6777b538SAndroid Build Coastguard Worker if (node == NULL)
3610*6777b538SAndroid Build Coastguard Worker return(NULL);
3611*6777b538SAndroid Build Coastguard Worker switch (node->type) {
3612*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
3613*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
3614*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
3615*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
3616*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
3617*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
3618*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
3619*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
3620*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
3621*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
3622*6777b538SAndroid Build Coastguard Worker node = node->next;
3623*6777b538SAndroid Build Coastguard Worker break;
3624*6777b538SAndroid Build Coastguard Worker default:
3625*6777b538SAndroid Build Coastguard Worker return(NULL);
3626*6777b538SAndroid Build Coastguard Worker }
3627*6777b538SAndroid Build Coastguard Worker while (node != NULL) {
3628*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE)
3629*6777b538SAndroid Build Coastguard Worker return(node);
3630*6777b538SAndroid Build Coastguard Worker node = node->next;
3631*6777b538SAndroid Build Coastguard Worker }
3632*6777b538SAndroid Build Coastguard Worker return(NULL);
3633*6777b538SAndroid Build Coastguard Worker }
3634*6777b538SAndroid Build Coastguard Worker
3635*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
3636*6777b538SAndroid Build Coastguard Worker
3637*6777b538SAndroid Build Coastguard Worker /**
3638*6777b538SAndroid Build Coastguard Worker * xmlFreeNodeList:
3639*6777b538SAndroid Build Coastguard Worker * @cur: the first node in the list
3640*6777b538SAndroid Build Coastguard Worker *
3641*6777b538SAndroid Build Coastguard Worker * Free a node and all its siblings, this is a recursive behaviour, all
3642*6777b538SAndroid Build Coastguard Worker * the children are freed too.
3643*6777b538SAndroid Build Coastguard Worker */
3644*6777b538SAndroid Build Coastguard Worker void
xmlFreeNodeList(xmlNodePtr cur)3645*6777b538SAndroid Build Coastguard Worker xmlFreeNodeList(xmlNodePtr cur) {
3646*6777b538SAndroid Build Coastguard Worker xmlNodePtr next;
3647*6777b538SAndroid Build Coastguard Worker xmlNodePtr parent;
3648*6777b538SAndroid Build Coastguard Worker xmlDictPtr dict = NULL;
3649*6777b538SAndroid Build Coastguard Worker size_t depth = 0;
3650*6777b538SAndroid Build Coastguard Worker
3651*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return;
3652*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_NAMESPACE_DECL) {
3653*6777b538SAndroid Build Coastguard Worker xmlFreeNsList((xmlNsPtr) cur);
3654*6777b538SAndroid Build Coastguard Worker return;
3655*6777b538SAndroid Build Coastguard Worker }
3656*6777b538SAndroid Build Coastguard Worker if (cur->doc != NULL) dict = cur->doc->dict;
3657*6777b538SAndroid Build Coastguard Worker while (1) {
3658*6777b538SAndroid Build Coastguard Worker while ((cur->children != NULL) &&
3659*6777b538SAndroid Build Coastguard Worker (cur->type != XML_DOCUMENT_NODE) &&
3660*6777b538SAndroid Build Coastguard Worker (cur->type != XML_HTML_DOCUMENT_NODE) &&
3661*6777b538SAndroid Build Coastguard Worker (cur->type != XML_DTD_NODE) &&
3662*6777b538SAndroid Build Coastguard Worker (cur->type != XML_ENTITY_REF_NODE)) {
3663*6777b538SAndroid Build Coastguard Worker cur = cur->children;
3664*6777b538SAndroid Build Coastguard Worker depth += 1;
3665*6777b538SAndroid Build Coastguard Worker }
3666*6777b538SAndroid Build Coastguard Worker
3667*6777b538SAndroid Build Coastguard Worker next = cur->next;
3668*6777b538SAndroid Build Coastguard Worker parent = cur->parent;
3669*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_DOCUMENT_NODE) ||
3670*6777b538SAndroid Build Coastguard Worker (cur->type == XML_HTML_DOCUMENT_NODE)) {
3671*6777b538SAndroid Build Coastguard Worker xmlFreeDoc((xmlDocPtr) cur);
3672*6777b538SAndroid Build Coastguard Worker } else if (cur->type != XML_DTD_NODE) {
3673*6777b538SAndroid Build Coastguard Worker
3674*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
3675*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeDefaultValue(cur);
3676*6777b538SAndroid Build Coastguard Worker
3677*6777b538SAndroid Build Coastguard Worker if (((cur->type == XML_ELEMENT_NODE) ||
3678*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_START) ||
3679*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_END)) &&
3680*6777b538SAndroid Build Coastguard Worker (cur->properties != NULL))
3681*6777b538SAndroid Build Coastguard Worker xmlFreePropList(cur->properties);
3682*6777b538SAndroid Build Coastguard Worker if ((cur->type != XML_ELEMENT_NODE) &&
3683*6777b538SAndroid Build Coastguard Worker (cur->type != XML_XINCLUDE_START) &&
3684*6777b538SAndroid Build Coastguard Worker (cur->type != XML_XINCLUDE_END) &&
3685*6777b538SAndroid Build Coastguard Worker (cur->type != XML_ENTITY_REF_NODE) &&
3686*6777b538SAndroid Build Coastguard Worker (cur->content != (xmlChar *) &(cur->properties))) {
3687*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->content)
3688*6777b538SAndroid Build Coastguard Worker }
3689*6777b538SAndroid Build Coastguard Worker if (((cur->type == XML_ELEMENT_NODE) ||
3690*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_START) ||
3691*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_END)) &&
3692*6777b538SAndroid Build Coastguard Worker (cur->nsDef != NULL))
3693*6777b538SAndroid Build Coastguard Worker xmlFreeNsList(cur->nsDef);
3694*6777b538SAndroid Build Coastguard Worker
3695*6777b538SAndroid Build Coastguard Worker /*
3696*6777b538SAndroid Build Coastguard Worker * When a node is a text node or a comment, it uses a global static
3697*6777b538SAndroid Build Coastguard Worker * variable for the name of the node.
3698*6777b538SAndroid Build Coastguard Worker * Otherwise the node name might come from the document's
3699*6777b538SAndroid Build Coastguard Worker * dictionary
3700*6777b538SAndroid Build Coastguard Worker */
3701*6777b538SAndroid Build Coastguard Worker if ((cur->name != NULL) &&
3702*6777b538SAndroid Build Coastguard Worker (cur->type != XML_TEXT_NODE) &&
3703*6777b538SAndroid Build Coastguard Worker (cur->type != XML_COMMENT_NODE))
3704*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->name)
3705*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
3706*6777b538SAndroid Build Coastguard Worker }
3707*6777b538SAndroid Build Coastguard Worker
3708*6777b538SAndroid Build Coastguard Worker if (next != NULL) {
3709*6777b538SAndroid Build Coastguard Worker cur = next;
3710*6777b538SAndroid Build Coastguard Worker } else {
3711*6777b538SAndroid Build Coastguard Worker if ((depth == 0) || (parent == NULL))
3712*6777b538SAndroid Build Coastguard Worker break;
3713*6777b538SAndroid Build Coastguard Worker depth -= 1;
3714*6777b538SAndroid Build Coastguard Worker cur = parent;
3715*6777b538SAndroid Build Coastguard Worker cur->children = NULL;
3716*6777b538SAndroid Build Coastguard Worker }
3717*6777b538SAndroid Build Coastguard Worker }
3718*6777b538SAndroid Build Coastguard Worker }
3719*6777b538SAndroid Build Coastguard Worker
3720*6777b538SAndroid Build Coastguard Worker /**
3721*6777b538SAndroid Build Coastguard Worker * xmlFreeNode:
3722*6777b538SAndroid Build Coastguard Worker * @cur: the node
3723*6777b538SAndroid Build Coastguard Worker *
3724*6777b538SAndroid Build Coastguard Worker * Free a node, this is a recursive behaviour, all the children are freed too.
3725*6777b538SAndroid Build Coastguard Worker * This doesn't unlink the child from the list, use xmlUnlinkNode() first.
3726*6777b538SAndroid Build Coastguard Worker */
3727*6777b538SAndroid Build Coastguard Worker void
xmlFreeNode(xmlNodePtr cur)3728*6777b538SAndroid Build Coastguard Worker xmlFreeNode(xmlNodePtr cur) {
3729*6777b538SAndroid Build Coastguard Worker xmlDictPtr dict = NULL;
3730*6777b538SAndroid Build Coastguard Worker
3731*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return;
3732*6777b538SAndroid Build Coastguard Worker
3733*6777b538SAndroid Build Coastguard Worker /* use xmlFreeDtd for DTD nodes */
3734*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_DTD_NODE) {
3735*6777b538SAndroid Build Coastguard Worker xmlFreeDtd((xmlDtdPtr) cur);
3736*6777b538SAndroid Build Coastguard Worker return;
3737*6777b538SAndroid Build Coastguard Worker }
3738*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_NAMESPACE_DECL) {
3739*6777b538SAndroid Build Coastguard Worker xmlFreeNs((xmlNsPtr) cur);
3740*6777b538SAndroid Build Coastguard Worker return;
3741*6777b538SAndroid Build Coastguard Worker }
3742*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ATTRIBUTE_NODE) {
3743*6777b538SAndroid Build Coastguard Worker xmlFreeProp((xmlAttrPtr) cur);
3744*6777b538SAndroid Build Coastguard Worker return;
3745*6777b538SAndroid Build Coastguard Worker }
3746*6777b538SAndroid Build Coastguard Worker
3747*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue))
3748*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeDefaultValue(cur);
3749*6777b538SAndroid Build Coastguard Worker
3750*6777b538SAndroid Build Coastguard Worker if (cur->doc != NULL) dict = cur->doc->dict;
3751*6777b538SAndroid Build Coastguard Worker
3752*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ENTITY_DECL) {
3753*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent = (xmlEntityPtr) cur;
3754*6777b538SAndroid Build Coastguard Worker DICT_FREE(ent->SystemID);
3755*6777b538SAndroid Build Coastguard Worker DICT_FREE(ent->ExternalID);
3756*6777b538SAndroid Build Coastguard Worker }
3757*6777b538SAndroid Build Coastguard Worker if ((cur->children != NULL) &&
3758*6777b538SAndroid Build Coastguard Worker (cur->type != XML_ENTITY_REF_NODE))
3759*6777b538SAndroid Build Coastguard Worker xmlFreeNodeList(cur->children);
3760*6777b538SAndroid Build Coastguard Worker
3761*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_ELEMENT_NODE) ||
3762*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_START) ||
3763*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_END)) {
3764*6777b538SAndroid Build Coastguard Worker if (cur->properties != NULL)
3765*6777b538SAndroid Build Coastguard Worker xmlFreePropList(cur->properties);
3766*6777b538SAndroid Build Coastguard Worker if (cur->nsDef != NULL)
3767*6777b538SAndroid Build Coastguard Worker xmlFreeNsList(cur->nsDef);
3768*6777b538SAndroid Build Coastguard Worker } else if ((cur->content != NULL) &&
3769*6777b538SAndroid Build Coastguard Worker (cur->type != XML_ENTITY_REF_NODE) &&
3770*6777b538SAndroid Build Coastguard Worker (cur->content != (xmlChar *) &(cur->properties))) {
3771*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->content)
3772*6777b538SAndroid Build Coastguard Worker }
3773*6777b538SAndroid Build Coastguard Worker
3774*6777b538SAndroid Build Coastguard Worker /*
3775*6777b538SAndroid Build Coastguard Worker * When a node is a text node or a comment, it uses a global static
3776*6777b538SAndroid Build Coastguard Worker * variable for the name of the node.
3777*6777b538SAndroid Build Coastguard Worker * Otherwise the node name might come from the document's dictionary
3778*6777b538SAndroid Build Coastguard Worker */
3779*6777b538SAndroid Build Coastguard Worker if ((cur->name != NULL) &&
3780*6777b538SAndroid Build Coastguard Worker (cur->type != XML_TEXT_NODE) &&
3781*6777b538SAndroid Build Coastguard Worker (cur->type != XML_COMMENT_NODE))
3782*6777b538SAndroid Build Coastguard Worker DICT_FREE(cur->name)
3783*6777b538SAndroid Build Coastguard Worker
3784*6777b538SAndroid Build Coastguard Worker xmlFree(cur);
3785*6777b538SAndroid Build Coastguard Worker }
3786*6777b538SAndroid Build Coastguard Worker
3787*6777b538SAndroid Build Coastguard Worker /**
3788*6777b538SAndroid Build Coastguard Worker * xmlUnlinkNode:
3789*6777b538SAndroid Build Coastguard Worker * @cur: the node
3790*6777b538SAndroid Build Coastguard Worker *
3791*6777b538SAndroid Build Coastguard Worker * Unlink a node from it's current context, the node is not freed
3792*6777b538SAndroid Build Coastguard Worker * If one need to free the node, use xmlFreeNode() routine after the
3793*6777b538SAndroid Build Coastguard Worker * unlink to discard it.
3794*6777b538SAndroid Build Coastguard Worker * Note that namespace nodes can't be unlinked as they do not have
3795*6777b538SAndroid Build Coastguard Worker * pointer to their parent.
3796*6777b538SAndroid Build Coastguard Worker */
3797*6777b538SAndroid Build Coastguard Worker void
xmlUnlinkNode(xmlNodePtr cur)3798*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(xmlNodePtr cur) {
3799*6777b538SAndroid Build Coastguard Worker if (cur == NULL) {
3800*6777b538SAndroid Build Coastguard Worker return;
3801*6777b538SAndroid Build Coastguard Worker }
3802*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_NAMESPACE_DECL)
3803*6777b538SAndroid Build Coastguard Worker return;
3804*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_DTD_NODE) {
3805*6777b538SAndroid Build Coastguard Worker xmlDocPtr doc;
3806*6777b538SAndroid Build Coastguard Worker doc = cur->doc;
3807*6777b538SAndroid Build Coastguard Worker if (doc != NULL) {
3808*6777b538SAndroid Build Coastguard Worker if (doc->intSubset == (xmlDtdPtr) cur)
3809*6777b538SAndroid Build Coastguard Worker doc->intSubset = NULL;
3810*6777b538SAndroid Build Coastguard Worker if (doc->extSubset == (xmlDtdPtr) cur)
3811*6777b538SAndroid Build Coastguard Worker doc->extSubset = NULL;
3812*6777b538SAndroid Build Coastguard Worker }
3813*6777b538SAndroid Build Coastguard Worker }
3814*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ENTITY_DECL) {
3815*6777b538SAndroid Build Coastguard Worker xmlDocPtr doc;
3816*6777b538SAndroid Build Coastguard Worker doc = cur->doc;
3817*6777b538SAndroid Build Coastguard Worker if (doc != NULL) {
3818*6777b538SAndroid Build Coastguard Worker if (doc->intSubset != NULL) {
3819*6777b538SAndroid Build Coastguard Worker if (xmlHashLookup(doc->intSubset->entities, cur->name) == cur)
3820*6777b538SAndroid Build Coastguard Worker xmlHashRemoveEntry(doc->intSubset->entities, cur->name,
3821*6777b538SAndroid Build Coastguard Worker NULL);
3822*6777b538SAndroid Build Coastguard Worker if (xmlHashLookup(doc->intSubset->pentities, cur->name) == cur)
3823*6777b538SAndroid Build Coastguard Worker xmlHashRemoveEntry(doc->intSubset->pentities, cur->name,
3824*6777b538SAndroid Build Coastguard Worker NULL);
3825*6777b538SAndroid Build Coastguard Worker }
3826*6777b538SAndroid Build Coastguard Worker if (doc->extSubset != NULL) {
3827*6777b538SAndroid Build Coastguard Worker if (xmlHashLookup(doc->extSubset->entities, cur->name) == cur)
3828*6777b538SAndroid Build Coastguard Worker xmlHashRemoveEntry(doc->extSubset->entities, cur->name,
3829*6777b538SAndroid Build Coastguard Worker NULL);
3830*6777b538SAndroid Build Coastguard Worker if (xmlHashLookup(doc->extSubset->pentities, cur->name) == cur)
3831*6777b538SAndroid Build Coastguard Worker xmlHashRemoveEntry(doc->extSubset->pentities, cur->name,
3832*6777b538SAndroid Build Coastguard Worker NULL);
3833*6777b538SAndroid Build Coastguard Worker }
3834*6777b538SAndroid Build Coastguard Worker }
3835*6777b538SAndroid Build Coastguard Worker }
3836*6777b538SAndroid Build Coastguard Worker if (cur->parent != NULL) {
3837*6777b538SAndroid Build Coastguard Worker xmlNodePtr parent;
3838*6777b538SAndroid Build Coastguard Worker parent = cur->parent;
3839*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ATTRIBUTE_NODE) {
3840*6777b538SAndroid Build Coastguard Worker if (parent->properties == (xmlAttrPtr) cur)
3841*6777b538SAndroid Build Coastguard Worker parent->properties = ((xmlAttrPtr) cur)->next;
3842*6777b538SAndroid Build Coastguard Worker } else {
3843*6777b538SAndroid Build Coastguard Worker if (parent->children == cur)
3844*6777b538SAndroid Build Coastguard Worker parent->children = cur->next;
3845*6777b538SAndroid Build Coastguard Worker if (parent->last == cur)
3846*6777b538SAndroid Build Coastguard Worker parent->last = cur->prev;
3847*6777b538SAndroid Build Coastguard Worker }
3848*6777b538SAndroid Build Coastguard Worker cur->parent = NULL;
3849*6777b538SAndroid Build Coastguard Worker }
3850*6777b538SAndroid Build Coastguard Worker if (cur->next != NULL)
3851*6777b538SAndroid Build Coastguard Worker cur->next->prev = cur->prev;
3852*6777b538SAndroid Build Coastguard Worker if (cur->prev != NULL)
3853*6777b538SAndroid Build Coastguard Worker cur->prev->next = cur->next;
3854*6777b538SAndroid Build Coastguard Worker cur->next = cur->prev = NULL;
3855*6777b538SAndroid Build Coastguard Worker }
3856*6777b538SAndroid Build Coastguard Worker
3857*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED)
3858*6777b538SAndroid Build Coastguard Worker /**
3859*6777b538SAndroid Build Coastguard Worker * xmlReplaceNode:
3860*6777b538SAndroid Build Coastguard Worker * @old: the old node
3861*6777b538SAndroid Build Coastguard Worker * @cur: the node
3862*6777b538SAndroid Build Coastguard Worker *
3863*6777b538SAndroid Build Coastguard Worker * Unlink the old node from its current context, prune the new one
3864*6777b538SAndroid Build Coastguard Worker * at the same place. If @cur was already inserted in a document it is
3865*6777b538SAndroid Build Coastguard Worker * first unlinked from its existing context.
3866*6777b538SAndroid Build Coastguard Worker *
3867*6777b538SAndroid Build Coastguard Worker * See the note regarding namespaces in xmlAddChild.
3868*6777b538SAndroid Build Coastguard Worker *
3869*6777b538SAndroid Build Coastguard Worker * Returns the @old node
3870*6777b538SAndroid Build Coastguard Worker */
3871*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlReplaceNode(xmlNodePtr old,xmlNodePtr cur)3872*6777b538SAndroid Build Coastguard Worker xmlReplaceNode(xmlNodePtr old, xmlNodePtr cur) {
3873*6777b538SAndroid Build Coastguard Worker if (old == cur) return(NULL);
3874*6777b538SAndroid Build Coastguard Worker if ((old == NULL) || (old->type == XML_NAMESPACE_DECL) ||
3875*6777b538SAndroid Build Coastguard Worker (old->parent == NULL)) {
3876*6777b538SAndroid Build Coastguard Worker return(NULL);
3877*6777b538SAndroid Build Coastguard Worker }
3878*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) {
3879*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(old);
3880*6777b538SAndroid Build Coastguard Worker return(old);
3881*6777b538SAndroid Build Coastguard Worker }
3882*6777b538SAndroid Build Coastguard Worker if (cur == old) {
3883*6777b538SAndroid Build Coastguard Worker return(old);
3884*6777b538SAndroid Build Coastguard Worker }
3885*6777b538SAndroid Build Coastguard Worker if ((old->type==XML_ATTRIBUTE_NODE) && (cur->type!=XML_ATTRIBUTE_NODE)) {
3886*6777b538SAndroid Build Coastguard Worker return(old);
3887*6777b538SAndroid Build Coastguard Worker }
3888*6777b538SAndroid Build Coastguard Worker if ((cur->type==XML_ATTRIBUTE_NODE) && (old->type!=XML_ATTRIBUTE_NODE)) {
3889*6777b538SAndroid Build Coastguard Worker return(old);
3890*6777b538SAndroid Build Coastguard Worker }
3891*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(cur);
3892*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(cur, old->doc);
3893*6777b538SAndroid Build Coastguard Worker cur->parent = old->parent;
3894*6777b538SAndroid Build Coastguard Worker cur->next = old->next;
3895*6777b538SAndroid Build Coastguard Worker if (cur->next != NULL)
3896*6777b538SAndroid Build Coastguard Worker cur->next->prev = cur;
3897*6777b538SAndroid Build Coastguard Worker cur->prev = old->prev;
3898*6777b538SAndroid Build Coastguard Worker if (cur->prev != NULL)
3899*6777b538SAndroid Build Coastguard Worker cur->prev->next = cur;
3900*6777b538SAndroid Build Coastguard Worker if (cur->parent != NULL) {
3901*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ATTRIBUTE_NODE) {
3902*6777b538SAndroid Build Coastguard Worker if (cur->parent->properties == (xmlAttrPtr)old)
3903*6777b538SAndroid Build Coastguard Worker cur->parent->properties = ((xmlAttrPtr) cur);
3904*6777b538SAndroid Build Coastguard Worker } else {
3905*6777b538SAndroid Build Coastguard Worker if (cur->parent->children == old)
3906*6777b538SAndroid Build Coastguard Worker cur->parent->children = cur;
3907*6777b538SAndroid Build Coastguard Worker if (cur->parent->last == old)
3908*6777b538SAndroid Build Coastguard Worker cur->parent->last = cur;
3909*6777b538SAndroid Build Coastguard Worker }
3910*6777b538SAndroid Build Coastguard Worker }
3911*6777b538SAndroid Build Coastguard Worker old->next = old->prev = NULL;
3912*6777b538SAndroid Build Coastguard Worker old->parent = NULL;
3913*6777b538SAndroid Build Coastguard Worker return(old);
3914*6777b538SAndroid Build Coastguard Worker }
3915*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
3916*6777b538SAndroid Build Coastguard Worker
3917*6777b538SAndroid Build Coastguard Worker /************************************************************************
3918*6777b538SAndroid Build Coastguard Worker * *
3919*6777b538SAndroid Build Coastguard Worker * Copy operations *
3920*6777b538SAndroid Build Coastguard Worker * *
3921*6777b538SAndroid Build Coastguard Worker ************************************************************************/
3922*6777b538SAndroid Build Coastguard Worker
3923*6777b538SAndroid Build Coastguard Worker /**
3924*6777b538SAndroid Build Coastguard Worker * xmlCopyNamespace:
3925*6777b538SAndroid Build Coastguard Worker * @cur: the namespace
3926*6777b538SAndroid Build Coastguard Worker *
3927*6777b538SAndroid Build Coastguard Worker * Do a copy of the namespace.
3928*6777b538SAndroid Build Coastguard Worker *
3929*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlNsPtr, or NULL in case of error.
3930*6777b538SAndroid Build Coastguard Worker */
3931*6777b538SAndroid Build Coastguard Worker xmlNsPtr
xmlCopyNamespace(xmlNsPtr cur)3932*6777b538SAndroid Build Coastguard Worker xmlCopyNamespace(xmlNsPtr cur) {
3933*6777b538SAndroid Build Coastguard Worker xmlNsPtr ret;
3934*6777b538SAndroid Build Coastguard Worker
3935*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return(NULL);
3936*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
3937*6777b538SAndroid Build Coastguard Worker case XML_LOCAL_NAMESPACE:
3938*6777b538SAndroid Build Coastguard Worker ret = xmlNewNs(NULL, cur->href, cur->prefix);
3939*6777b538SAndroid Build Coastguard Worker break;
3940*6777b538SAndroid Build Coastguard Worker default:
3941*6777b538SAndroid Build Coastguard Worker return(NULL);
3942*6777b538SAndroid Build Coastguard Worker }
3943*6777b538SAndroid Build Coastguard Worker return(ret);
3944*6777b538SAndroid Build Coastguard Worker }
3945*6777b538SAndroid Build Coastguard Worker
3946*6777b538SAndroid Build Coastguard Worker /**
3947*6777b538SAndroid Build Coastguard Worker * xmlCopyNamespaceList:
3948*6777b538SAndroid Build Coastguard Worker * @cur: the first namespace
3949*6777b538SAndroid Build Coastguard Worker *
3950*6777b538SAndroid Build Coastguard Worker * Do a copy of an namespace list.
3951*6777b538SAndroid Build Coastguard Worker *
3952*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlNsPtr, or NULL in case of error.
3953*6777b538SAndroid Build Coastguard Worker */
3954*6777b538SAndroid Build Coastguard Worker xmlNsPtr
xmlCopyNamespaceList(xmlNsPtr cur)3955*6777b538SAndroid Build Coastguard Worker xmlCopyNamespaceList(xmlNsPtr cur) {
3956*6777b538SAndroid Build Coastguard Worker xmlNsPtr ret = NULL;
3957*6777b538SAndroid Build Coastguard Worker xmlNsPtr p = NULL,q;
3958*6777b538SAndroid Build Coastguard Worker
3959*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
3960*6777b538SAndroid Build Coastguard Worker q = xmlCopyNamespace(cur);
3961*6777b538SAndroid Build Coastguard Worker if (q == NULL) {
3962*6777b538SAndroid Build Coastguard Worker xmlFreeNsList(ret);
3963*6777b538SAndroid Build Coastguard Worker return(NULL);
3964*6777b538SAndroid Build Coastguard Worker }
3965*6777b538SAndroid Build Coastguard Worker if (p == NULL) {
3966*6777b538SAndroid Build Coastguard Worker ret = p = q;
3967*6777b538SAndroid Build Coastguard Worker } else {
3968*6777b538SAndroid Build Coastguard Worker p->next = q;
3969*6777b538SAndroid Build Coastguard Worker p = q;
3970*6777b538SAndroid Build Coastguard Worker }
3971*6777b538SAndroid Build Coastguard Worker cur = cur->next;
3972*6777b538SAndroid Build Coastguard Worker }
3973*6777b538SAndroid Build Coastguard Worker return(ret);
3974*6777b538SAndroid Build Coastguard Worker }
3975*6777b538SAndroid Build Coastguard Worker
3976*6777b538SAndroid Build Coastguard Worker static xmlAttrPtr
xmlCopyPropInternal(xmlDocPtr doc,xmlNodePtr target,xmlAttrPtr cur)3977*6777b538SAndroid Build Coastguard Worker xmlCopyPropInternal(xmlDocPtr doc, xmlNodePtr target, xmlAttrPtr cur) {
3978*6777b538SAndroid Build Coastguard Worker xmlAttrPtr ret = NULL;
3979*6777b538SAndroid Build Coastguard Worker
3980*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return(NULL);
3981*6777b538SAndroid Build Coastguard Worker if ((target != NULL) && (target->type != XML_ELEMENT_NODE))
3982*6777b538SAndroid Build Coastguard Worker return(NULL);
3983*6777b538SAndroid Build Coastguard Worker if (target != NULL)
3984*6777b538SAndroid Build Coastguard Worker ret = xmlNewDocProp(target->doc, cur->name, NULL);
3985*6777b538SAndroid Build Coastguard Worker else if (doc != NULL)
3986*6777b538SAndroid Build Coastguard Worker ret = xmlNewDocProp(doc, cur->name, NULL);
3987*6777b538SAndroid Build Coastguard Worker else if (cur->parent != NULL)
3988*6777b538SAndroid Build Coastguard Worker ret = xmlNewDocProp(cur->parent->doc, cur->name, NULL);
3989*6777b538SAndroid Build Coastguard Worker else if (cur->children != NULL)
3990*6777b538SAndroid Build Coastguard Worker ret = xmlNewDocProp(cur->children->doc, cur->name, NULL);
3991*6777b538SAndroid Build Coastguard Worker else
3992*6777b538SAndroid Build Coastguard Worker ret = xmlNewDocProp(NULL, cur->name, NULL);
3993*6777b538SAndroid Build Coastguard Worker if (ret == NULL) return(NULL);
3994*6777b538SAndroid Build Coastguard Worker ret->parent = target;
3995*6777b538SAndroid Build Coastguard Worker
3996*6777b538SAndroid Build Coastguard Worker if ((cur->ns != NULL) && (target != NULL)) {
3997*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
3998*6777b538SAndroid Build Coastguard Worker
3999*6777b538SAndroid Build Coastguard Worker ns = xmlSearchNs(target->doc, target, cur->ns->prefix);
4000*6777b538SAndroid Build Coastguard Worker if (ns == NULL) {
4001*6777b538SAndroid Build Coastguard Worker /*
4002*6777b538SAndroid Build Coastguard Worker * Humm, we are copying an element whose namespace is defined
4003*6777b538SAndroid Build Coastguard Worker * out of the new tree scope. Search it in the original tree
4004*6777b538SAndroid Build Coastguard Worker * and add it at the top of the new tree
4005*6777b538SAndroid Build Coastguard Worker */
4006*6777b538SAndroid Build Coastguard Worker ns = xmlSearchNs(cur->doc, cur->parent, cur->ns->prefix);
4007*6777b538SAndroid Build Coastguard Worker if (ns != NULL) {
4008*6777b538SAndroid Build Coastguard Worker xmlNodePtr root = target;
4009*6777b538SAndroid Build Coastguard Worker xmlNodePtr pred = NULL;
4010*6777b538SAndroid Build Coastguard Worker
4011*6777b538SAndroid Build Coastguard Worker while (root->parent != NULL) {
4012*6777b538SAndroid Build Coastguard Worker pred = root;
4013*6777b538SAndroid Build Coastguard Worker root = root->parent;
4014*6777b538SAndroid Build Coastguard Worker }
4015*6777b538SAndroid Build Coastguard Worker if (root == (xmlNodePtr) target->doc) {
4016*6777b538SAndroid Build Coastguard Worker /* correct possibly cycling above the document elt */
4017*6777b538SAndroid Build Coastguard Worker root = pred;
4018*6777b538SAndroid Build Coastguard Worker }
4019*6777b538SAndroid Build Coastguard Worker ret->ns = xmlNewNs(root, ns->href, ns->prefix);
4020*6777b538SAndroid Build Coastguard Worker if (ret->ns == NULL)
4021*6777b538SAndroid Build Coastguard Worker goto error;
4022*6777b538SAndroid Build Coastguard Worker }
4023*6777b538SAndroid Build Coastguard Worker } else {
4024*6777b538SAndroid Build Coastguard Worker /*
4025*6777b538SAndroid Build Coastguard Worker * we have to find something appropriate here since
4026*6777b538SAndroid Build Coastguard Worker * we can't be sure, that the namespace we found is identified
4027*6777b538SAndroid Build Coastguard Worker * by the prefix
4028*6777b538SAndroid Build Coastguard Worker */
4029*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(ns->href, cur->ns->href)) {
4030*6777b538SAndroid Build Coastguard Worker /* this is the nice case */
4031*6777b538SAndroid Build Coastguard Worker ret->ns = ns;
4032*6777b538SAndroid Build Coastguard Worker } else {
4033*6777b538SAndroid Build Coastguard Worker /*
4034*6777b538SAndroid Build Coastguard Worker * we are in trouble: we need a new reconciled namespace.
4035*6777b538SAndroid Build Coastguard Worker * This is expensive
4036*6777b538SAndroid Build Coastguard Worker */
4037*6777b538SAndroid Build Coastguard Worker ret->ns = xmlNewReconciledNs(target->doc, target, cur->ns);
4038*6777b538SAndroid Build Coastguard Worker if (ret->ns == NULL)
4039*6777b538SAndroid Build Coastguard Worker goto error;
4040*6777b538SAndroid Build Coastguard Worker }
4041*6777b538SAndroid Build Coastguard Worker }
4042*6777b538SAndroid Build Coastguard Worker
4043*6777b538SAndroid Build Coastguard Worker } else
4044*6777b538SAndroid Build Coastguard Worker ret->ns = NULL;
4045*6777b538SAndroid Build Coastguard Worker
4046*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL) {
4047*6777b538SAndroid Build Coastguard Worker xmlNodePtr tmp;
4048*6777b538SAndroid Build Coastguard Worker
4049*6777b538SAndroid Build Coastguard Worker ret->children = xmlStaticCopyNodeList(cur->children, ret->doc, (xmlNodePtr) ret);
4050*6777b538SAndroid Build Coastguard Worker if (ret->children == NULL)
4051*6777b538SAndroid Build Coastguard Worker goto error;
4052*6777b538SAndroid Build Coastguard Worker ret->last = NULL;
4053*6777b538SAndroid Build Coastguard Worker tmp = ret->children;
4054*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
4055*6777b538SAndroid Build Coastguard Worker /* tmp->parent = (xmlNodePtr)ret; */
4056*6777b538SAndroid Build Coastguard Worker if (tmp->next == NULL)
4057*6777b538SAndroid Build Coastguard Worker ret->last = tmp;
4058*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
4059*6777b538SAndroid Build Coastguard Worker }
4060*6777b538SAndroid Build Coastguard Worker }
4061*6777b538SAndroid Build Coastguard Worker /*
4062*6777b538SAndroid Build Coastguard Worker * Try to handle IDs
4063*6777b538SAndroid Build Coastguard Worker */
4064*6777b538SAndroid Build Coastguard Worker if ((target != NULL) && (cur != NULL) &&
4065*6777b538SAndroid Build Coastguard Worker (target->doc != NULL) && (cur->doc != NULL) &&
4066*6777b538SAndroid Build Coastguard Worker (cur->doc->ids != NULL) &&
4067*6777b538SAndroid Build Coastguard Worker (cur->parent != NULL) &&
4068*6777b538SAndroid Build Coastguard Worker (cur->children != NULL)) {
4069*6777b538SAndroid Build Coastguard Worker int res = xmlIsID(cur->doc, cur->parent, cur);
4070*6777b538SAndroid Build Coastguard Worker
4071*6777b538SAndroid Build Coastguard Worker if (res < 0)
4072*6777b538SAndroid Build Coastguard Worker goto error;
4073*6777b538SAndroid Build Coastguard Worker if (res != 0) {
4074*6777b538SAndroid Build Coastguard Worker xmlChar *id;
4075*6777b538SAndroid Build Coastguard Worker
4076*6777b538SAndroid Build Coastguard Worker id = xmlNodeListGetString(cur->doc, cur->children, 1);
4077*6777b538SAndroid Build Coastguard Worker if (id == NULL)
4078*6777b538SAndroid Build Coastguard Worker goto error;
4079*6777b538SAndroid Build Coastguard Worker res = xmlAddIDSafe(target->doc, id, ret, 0, NULL);
4080*6777b538SAndroid Build Coastguard Worker xmlFree(id);
4081*6777b538SAndroid Build Coastguard Worker if (res < 0)
4082*6777b538SAndroid Build Coastguard Worker goto error;
4083*6777b538SAndroid Build Coastguard Worker }
4084*6777b538SAndroid Build Coastguard Worker }
4085*6777b538SAndroid Build Coastguard Worker return(ret);
4086*6777b538SAndroid Build Coastguard Worker
4087*6777b538SAndroid Build Coastguard Worker error:
4088*6777b538SAndroid Build Coastguard Worker xmlFreeProp(ret);
4089*6777b538SAndroid Build Coastguard Worker return(NULL);
4090*6777b538SAndroid Build Coastguard Worker }
4091*6777b538SAndroid Build Coastguard Worker
4092*6777b538SAndroid Build Coastguard Worker /**
4093*6777b538SAndroid Build Coastguard Worker * xmlCopyProp:
4094*6777b538SAndroid Build Coastguard Worker * @target: the element where the attribute will be grafted
4095*6777b538SAndroid Build Coastguard Worker * @cur: the attribute
4096*6777b538SAndroid Build Coastguard Worker *
4097*6777b538SAndroid Build Coastguard Worker * Do a copy of the attribute.
4098*6777b538SAndroid Build Coastguard Worker *
4099*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlAttrPtr, or NULL in case of error.
4100*6777b538SAndroid Build Coastguard Worker */
4101*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlCopyProp(xmlNodePtr target,xmlAttrPtr cur)4102*6777b538SAndroid Build Coastguard Worker xmlCopyProp(xmlNodePtr target, xmlAttrPtr cur) {
4103*6777b538SAndroid Build Coastguard Worker return xmlCopyPropInternal(NULL, target, cur);
4104*6777b538SAndroid Build Coastguard Worker }
4105*6777b538SAndroid Build Coastguard Worker
4106*6777b538SAndroid Build Coastguard Worker /**
4107*6777b538SAndroid Build Coastguard Worker * xmlCopyPropList:
4108*6777b538SAndroid Build Coastguard Worker * @target: the element where the attributes will be grafted
4109*6777b538SAndroid Build Coastguard Worker * @cur: the first attribute
4110*6777b538SAndroid Build Coastguard Worker *
4111*6777b538SAndroid Build Coastguard Worker * Do a copy of an attribute list.
4112*6777b538SAndroid Build Coastguard Worker *
4113*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlAttrPtr, or NULL in case of error.
4114*6777b538SAndroid Build Coastguard Worker */
4115*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlCopyPropList(xmlNodePtr target,xmlAttrPtr cur)4116*6777b538SAndroid Build Coastguard Worker xmlCopyPropList(xmlNodePtr target, xmlAttrPtr cur) {
4117*6777b538SAndroid Build Coastguard Worker xmlAttrPtr ret = NULL;
4118*6777b538SAndroid Build Coastguard Worker xmlAttrPtr p = NULL,q;
4119*6777b538SAndroid Build Coastguard Worker
4120*6777b538SAndroid Build Coastguard Worker if ((target != NULL) && (target->type != XML_ELEMENT_NODE))
4121*6777b538SAndroid Build Coastguard Worker return(NULL);
4122*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
4123*6777b538SAndroid Build Coastguard Worker q = xmlCopyProp(target, cur);
4124*6777b538SAndroid Build Coastguard Worker if (q == NULL) {
4125*6777b538SAndroid Build Coastguard Worker xmlFreePropList(ret);
4126*6777b538SAndroid Build Coastguard Worker return(NULL);
4127*6777b538SAndroid Build Coastguard Worker }
4128*6777b538SAndroid Build Coastguard Worker if (p == NULL) {
4129*6777b538SAndroid Build Coastguard Worker ret = p = q;
4130*6777b538SAndroid Build Coastguard Worker } else {
4131*6777b538SAndroid Build Coastguard Worker p->next = q;
4132*6777b538SAndroid Build Coastguard Worker q->prev = p;
4133*6777b538SAndroid Build Coastguard Worker p = q;
4134*6777b538SAndroid Build Coastguard Worker }
4135*6777b538SAndroid Build Coastguard Worker cur = cur->next;
4136*6777b538SAndroid Build Coastguard Worker }
4137*6777b538SAndroid Build Coastguard Worker return(ret);
4138*6777b538SAndroid Build Coastguard Worker }
4139*6777b538SAndroid Build Coastguard Worker
4140*6777b538SAndroid Build Coastguard Worker /*
4141*6777b538SAndroid Build Coastguard Worker * NOTE about the CopyNode operations !
4142*6777b538SAndroid Build Coastguard Worker *
4143*6777b538SAndroid Build Coastguard Worker * They are split into external and internal parts for one
4144*6777b538SAndroid Build Coastguard Worker * tricky reason: namespaces. Doing a direct copy of a node
4145*6777b538SAndroid Build Coastguard Worker * say RPM:Copyright without changing the namespace pointer to
4146*6777b538SAndroid Build Coastguard Worker * something else can produce stale links. One way to do it is
4147*6777b538SAndroid Build Coastguard Worker * to keep a reference counter but this doesn't work as soon
4148*6777b538SAndroid Build Coastguard Worker * as one moves the element or the subtree out of the scope of
4149*6777b538SAndroid Build Coastguard Worker * the existing namespace. The actual solution seems to be to add
4150*6777b538SAndroid Build Coastguard Worker * a copy of the namespace at the top of the copied tree if
4151*6777b538SAndroid Build Coastguard Worker * not available in the subtree.
4152*6777b538SAndroid Build Coastguard Worker * Hence two functions, the public front-end call the inner ones
4153*6777b538SAndroid Build Coastguard Worker * The argument "recursive" normally indicates a recursive copy
4154*6777b538SAndroid Build Coastguard Worker * of the node with values 0 (no) and 1 (yes). For XInclude,
4155*6777b538SAndroid Build Coastguard Worker * however, we allow a value of 2 to indicate copy properties and
4156*6777b538SAndroid Build Coastguard Worker * namespace info, but don't recurse on children.
4157*6777b538SAndroid Build Coastguard Worker */
4158*6777b538SAndroid Build Coastguard Worker
4159*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlStaticCopyNode(xmlNodePtr node,xmlDocPtr doc,xmlNodePtr parent,int extended)4160*6777b538SAndroid Build Coastguard Worker xmlStaticCopyNode(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent,
4161*6777b538SAndroid Build Coastguard Worker int extended) {
4162*6777b538SAndroid Build Coastguard Worker xmlNodePtr ret;
4163*6777b538SAndroid Build Coastguard Worker
4164*6777b538SAndroid Build Coastguard Worker if (node == NULL) return(NULL);
4165*6777b538SAndroid Build Coastguard Worker switch (node->type) {
4166*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
4167*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
4168*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
4169*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
4170*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
4171*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
4172*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
4173*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
4174*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
4175*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
4176*6777b538SAndroid Build Coastguard Worker break;
4177*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
4178*6777b538SAndroid Build Coastguard Worker return((xmlNodePtr) xmlCopyPropInternal(doc, parent, (xmlAttrPtr) node));
4179*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL:
4180*6777b538SAndroid Build Coastguard Worker return((xmlNodePtr) xmlCopyNamespaceList((xmlNsPtr) node));
4181*6777b538SAndroid Build Coastguard Worker
4182*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
4183*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
4184*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
4185*6777b538SAndroid Build Coastguard Worker return((xmlNodePtr) xmlCopyDoc((xmlDocPtr) node, extended));
4186*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
4187*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
4188*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE:
4189*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
4190*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
4191*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
4192*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
4193*6777b538SAndroid Build Coastguard Worker return(NULL);
4194*6777b538SAndroid Build Coastguard Worker }
4195*6777b538SAndroid Build Coastguard Worker
4196*6777b538SAndroid Build Coastguard Worker /*
4197*6777b538SAndroid Build Coastguard Worker * Allocate a new node and fill the fields.
4198*6777b538SAndroid Build Coastguard Worker */
4199*6777b538SAndroid Build Coastguard Worker ret = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
4200*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
4201*6777b538SAndroid Build Coastguard Worker return(NULL);
4202*6777b538SAndroid Build Coastguard Worker memset(ret, 0, sizeof(xmlNode));
4203*6777b538SAndroid Build Coastguard Worker ret->type = node->type;
4204*6777b538SAndroid Build Coastguard Worker
4205*6777b538SAndroid Build Coastguard Worker ret->doc = doc;
4206*6777b538SAndroid Build Coastguard Worker ret->parent = parent;
4207*6777b538SAndroid Build Coastguard Worker if (node->name == xmlStringText)
4208*6777b538SAndroid Build Coastguard Worker ret->name = xmlStringText;
4209*6777b538SAndroid Build Coastguard Worker else if (node->name == xmlStringTextNoenc)
4210*6777b538SAndroid Build Coastguard Worker ret->name = xmlStringTextNoenc;
4211*6777b538SAndroid Build Coastguard Worker else if (node->name == xmlStringComment)
4212*6777b538SAndroid Build Coastguard Worker ret->name = xmlStringComment;
4213*6777b538SAndroid Build Coastguard Worker else if (node->name != NULL) {
4214*6777b538SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->dict != NULL))
4215*6777b538SAndroid Build Coastguard Worker ret->name = xmlDictLookup(doc->dict, node->name, -1);
4216*6777b538SAndroid Build Coastguard Worker else
4217*6777b538SAndroid Build Coastguard Worker ret->name = xmlStrdup(node->name);
4218*6777b538SAndroid Build Coastguard Worker if (ret->name == NULL)
4219*6777b538SAndroid Build Coastguard Worker goto error;
4220*6777b538SAndroid Build Coastguard Worker }
4221*6777b538SAndroid Build Coastguard Worker if ((node->type != XML_ELEMENT_NODE) &&
4222*6777b538SAndroid Build Coastguard Worker (node->content != NULL) &&
4223*6777b538SAndroid Build Coastguard Worker (node->type != XML_ENTITY_REF_NODE) &&
4224*6777b538SAndroid Build Coastguard Worker (node->type != XML_XINCLUDE_END) &&
4225*6777b538SAndroid Build Coastguard Worker (node->type != XML_XINCLUDE_START)) {
4226*6777b538SAndroid Build Coastguard Worker ret->content = xmlStrdup(node->content);
4227*6777b538SAndroid Build Coastguard Worker if (ret->content == NULL)
4228*6777b538SAndroid Build Coastguard Worker goto error;
4229*6777b538SAndroid Build Coastguard Worker }else{
4230*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE)
4231*6777b538SAndroid Build Coastguard Worker ret->line = node->line;
4232*6777b538SAndroid Build Coastguard Worker }
4233*6777b538SAndroid Build Coastguard Worker if (parent != NULL) {
4234*6777b538SAndroid Build Coastguard Worker xmlNodePtr tmp;
4235*6777b538SAndroid Build Coastguard Worker
4236*6777b538SAndroid Build Coastguard Worker /*
4237*6777b538SAndroid Build Coastguard Worker * this is a tricky part for the node register thing:
4238*6777b538SAndroid Build Coastguard Worker * in case ret does get coalesced in xmlAddChild
4239*6777b538SAndroid Build Coastguard Worker * the deregister-node callback is called; so we register ret now already
4240*6777b538SAndroid Build Coastguard Worker */
4241*6777b538SAndroid Build Coastguard Worker if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
4242*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue((xmlNodePtr)ret);
4243*6777b538SAndroid Build Coastguard Worker
4244*6777b538SAndroid Build Coastguard Worker /*
4245*6777b538SAndroid Build Coastguard Worker * Note that since ret->parent is already set, xmlAddChild will
4246*6777b538SAndroid Build Coastguard Worker * return early and not actually insert the node. It will only
4247*6777b538SAndroid Build Coastguard Worker * coalesce text nodes and unnecessarily call xmlSetTreeDoc.
4248*6777b538SAndroid Build Coastguard Worker * Assuming that the subtree to be copied always has its text
4249*6777b538SAndroid Build Coastguard Worker * nodes coalesced, the somewhat confusing call to xmlAddChild
4250*6777b538SAndroid Build Coastguard Worker * could be removed.
4251*6777b538SAndroid Build Coastguard Worker */
4252*6777b538SAndroid Build Coastguard Worker tmp = xmlAddChild(parent, ret);
4253*6777b538SAndroid Build Coastguard Worker /* node could have coalesced */
4254*6777b538SAndroid Build Coastguard Worker if (tmp != ret)
4255*6777b538SAndroid Build Coastguard Worker return(tmp);
4256*6777b538SAndroid Build Coastguard Worker }
4257*6777b538SAndroid Build Coastguard Worker
4258*6777b538SAndroid Build Coastguard Worker if (!extended)
4259*6777b538SAndroid Build Coastguard Worker goto out;
4260*6777b538SAndroid Build Coastguard Worker if (((node->type == XML_ELEMENT_NODE) ||
4261*6777b538SAndroid Build Coastguard Worker (node->type == XML_XINCLUDE_START)) && (node->nsDef != NULL)) {
4262*6777b538SAndroid Build Coastguard Worker ret->nsDef = xmlCopyNamespaceList(node->nsDef);
4263*6777b538SAndroid Build Coastguard Worker if (ret->nsDef == NULL)
4264*6777b538SAndroid Build Coastguard Worker goto error;
4265*6777b538SAndroid Build Coastguard Worker }
4266*6777b538SAndroid Build Coastguard Worker
4267*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_ELEMENT_NODE) && (node->ns != NULL)) {
4268*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
4269*6777b538SAndroid Build Coastguard Worker
4270*6777b538SAndroid Build Coastguard Worker ns = xmlSearchNs(doc, ret, node->ns->prefix);
4271*6777b538SAndroid Build Coastguard Worker if (ns == NULL) {
4272*6777b538SAndroid Build Coastguard Worker /*
4273*6777b538SAndroid Build Coastguard Worker * Humm, we are copying an element whose namespace is defined
4274*6777b538SAndroid Build Coastguard Worker * out of the new tree scope. Search it in the original tree
4275*6777b538SAndroid Build Coastguard Worker * and add it at the top of the new tree.
4276*6777b538SAndroid Build Coastguard Worker *
4277*6777b538SAndroid Build Coastguard Worker * TODO: Searching the original tree seems unnecessary. We
4278*6777b538SAndroid Build Coastguard Worker * already have a namespace URI.
4279*6777b538SAndroid Build Coastguard Worker */
4280*6777b538SAndroid Build Coastguard Worker ns = xmlSearchNs(node->doc, node, node->ns->prefix);
4281*6777b538SAndroid Build Coastguard Worker if (ns != NULL) {
4282*6777b538SAndroid Build Coastguard Worker xmlNodePtr root = ret;
4283*6777b538SAndroid Build Coastguard Worker
4284*6777b538SAndroid Build Coastguard Worker while (root->parent != NULL) root = root->parent;
4285*6777b538SAndroid Build Coastguard Worker ret->ns = xmlNewNs(root, ns->href, ns->prefix);
4286*6777b538SAndroid Build Coastguard Worker } else {
4287*6777b538SAndroid Build Coastguard Worker ret->ns = xmlNewReconciledNs(doc, ret, node->ns);
4288*6777b538SAndroid Build Coastguard Worker }
4289*6777b538SAndroid Build Coastguard Worker if (ret->ns == NULL)
4290*6777b538SAndroid Build Coastguard Worker goto error;
4291*6777b538SAndroid Build Coastguard Worker } else {
4292*6777b538SAndroid Build Coastguard Worker /*
4293*6777b538SAndroid Build Coastguard Worker * reference the existing namespace definition in our own tree.
4294*6777b538SAndroid Build Coastguard Worker */
4295*6777b538SAndroid Build Coastguard Worker ret->ns = ns;
4296*6777b538SAndroid Build Coastguard Worker }
4297*6777b538SAndroid Build Coastguard Worker }
4298*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_ELEMENT_NODE) && (node->properties != NULL)) {
4299*6777b538SAndroid Build Coastguard Worker ret->properties = xmlCopyPropList(ret, node->properties);
4300*6777b538SAndroid Build Coastguard Worker if (ret->properties == NULL)
4301*6777b538SAndroid Build Coastguard Worker goto error;
4302*6777b538SAndroid Build Coastguard Worker }
4303*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ENTITY_REF_NODE) {
4304*6777b538SAndroid Build Coastguard Worker if ((doc == NULL) || (node->doc != doc)) {
4305*6777b538SAndroid Build Coastguard Worker /*
4306*6777b538SAndroid Build Coastguard Worker * The copied node will go into a separate document, so
4307*6777b538SAndroid Build Coastguard Worker * to avoid dangling references to the ENTITY_DECL node
4308*6777b538SAndroid Build Coastguard Worker * we cannot keep the reference. Try to find it in the
4309*6777b538SAndroid Build Coastguard Worker * target document.
4310*6777b538SAndroid Build Coastguard Worker */
4311*6777b538SAndroid Build Coastguard Worker ret->children = (xmlNodePtr) xmlGetDocEntity(doc, ret->name);
4312*6777b538SAndroid Build Coastguard Worker } else {
4313*6777b538SAndroid Build Coastguard Worker ret->children = node->children;
4314*6777b538SAndroid Build Coastguard Worker }
4315*6777b538SAndroid Build Coastguard Worker ret->last = ret->children;
4316*6777b538SAndroid Build Coastguard Worker } else if ((node->children != NULL) && (extended != 2)) {
4317*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur, insert;
4318*6777b538SAndroid Build Coastguard Worker
4319*6777b538SAndroid Build Coastguard Worker cur = node->children;
4320*6777b538SAndroid Build Coastguard Worker insert = ret;
4321*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
4322*6777b538SAndroid Build Coastguard Worker xmlNodePtr copy = xmlStaticCopyNode(cur, doc, insert, 2);
4323*6777b538SAndroid Build Coastguard Worker if (copy == NULL)
4324*6777b538SAndroid Build Coastguard Worker goto error;
4325*6777b538SAndroid Build Coastguard Worker
4326*6777b538SAndroid Build Coastguard Worker /* Check for coalesced text nodes */
4327*6777b538SAndroid Build Coastguard Worker if (insert->last != copy) {
4328*6777b538SAndroid Build Coastguard Worker if (insert->last == NULL) {
4329*6777b538SAndroid Build Coastguard Worker insert->children = copy;
4330*6777b538SAndroid Build Coastguard Worker } else {
4331*6777b538SAndroid Build Coastguard Worker copy->prev = insert->last;
4332*6777b538SAndroid Build Coastguard Worker insert->last->next = copy;
4333*6777b538SAndroid Build Coastguard Worker }
4334*6777b538SAndroid Build Coastguard Worker insert->last = copy;
4335*6777b538SAndroid Build Coastguard Worker }
4336*6777b538SAndroid Build Coastguard Worker
4337*6777b538SAndroid Build Coastguard Worker if ((cur->type != XML_ENTITY_REF_NODE) &&
4338*6777b538SAndroid Build Coastguard Worker (cur->children != NULL)) {
4339*6777b538SAndroid Build Coastguard Worker cur = cur->children;
4340*6777b538SAndroid Build Coastguard Worker insert = copy;
4341*6777b538SAndroid Build Coastguard Worker continue;
4342*6777b538SAndroid Build Coastguard Worker }
4343*6777b538SAndroid Build Coastguard Worker
4344*6777b538SAndroid Build Coastguard Worker while (1) {
4345*6777b538SAndroid Build Coastguard Worker if (cur->next != NULL) {
4346*6777b538SAndroid Build Coastguard Worker cur = cur->next;
4347*6777b538SAndroid Build Coastguard Worker break;
4348*6777b538SAndroid Build Coastguard Worker }
4349*6777b538SAndroid Build Coastguard Worker
4350*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
4351*6777b538SAndroid Build Coastguard Worker insert = insert->parent;
4352*6777b538SAndroid Build Coastguard Worker if (cur == node) {
4353*6777b538SAndroid Build Coastguard Worker cur = NULL;
4354*6777b538SAndroid Build Coastguard Worker break;
4355*6777b538SAndroid Build Coastguard Worker }
4356*6777b538SAndroid Build Coastguard Worker }
4357*6777b538SAndroid Build Coastguard Worker }
4358*6777b538SAndroid Build Coastguard Worker }
4359*6777b538SAndroid Build Coastguard Worker
4360*6777b538SAndroid Build Coastguard Worker out:
4361*6777b538SAndroid Build Coastguard Worker /* if parent != NULL we already registered the node above */
4362*6777b538SAndroid Build Coastguard Worker if ((parent == NULL) &&
4363*6777b538SAndroid Build Coastguard Worker ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue)))
4364*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue((xmlNodePtr)ret);
4365*6777b538SAndroid Build Coastguard Worker return(ret);
4366*6777b538SAndroid Build Coastguard Worker
4367*6777b538SAndroid Build Coastguard Worker error:
4368*6777b538SAndroid Build Coastguard Worker xmlFreeNode(ret);
4369*6777b538SAndroid Build Coastguard Worker return(NULL);
4370*6777b538SAndroid Build Coastguard Worker }
4371*6777b538SAndroid Build Coastguard Worker
4372*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlStaticCopyNodeList(xmlNodePtr node,xmlDocPtr doc,xmlNodePtr parent)4373*6777b538SAndroid Build Coastguard Worker xmlStaticCopyNodeList(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent) {
4374*6777b538SAndroid Build Coastguard Worker xmlNodePtr ret = NULL;
4375*6777b538SAndroid Build Coastguard Worker xmlNodePtr p = NULL,q;
4376*6777b538SAndroid Build Coastguard Worker xmlDtdPtr newSubset = NULL;
4377*6777b538SAndroid Build Coastguard Worker int linkedSubset = 0;
4378*6777b538SAndroid Build Coastguard Worker
4379*6777b538SAndroid Build Coastguard Worker while (node != NULL) {
4380*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
4381*6777b538SAndroid Build Coastguard Worker if (node->type == XML_DTD_NODE ) {
4382*6777b538SAndroid Build Coastguard Worker if (doc == NULL) {
4383*6777b538SAndroid Build Coastguard Worker node = node->next;
4384*6777b538SAndroid Build Coastguard Worker continue;
4385*6777b538SAndroid Build Coastguard Worker }
4386*6777b538SAndroid Build Coastguard Worker if ((doc->intSubset == NULL) && (newSubset == NULL)) {
4387*6777b538SAndroid Build Coastguard Worker q = (xmlNodePtr) xmlCopyDtd( (xmlDtdPtr) node );
4388*6777b538SAndroid Build Coastguard Worker if (q == NULL) goto error;
4389*6777b538SAndroid Build Coastguard Worker q->doc = doc;
4390*6777b538SAndroid Build Coastguard Worker q->parent = parent;
4391*6777b538SAndroid Build Coastguard Worker newSubset = (xmlDtdPtr) q;
4392*6777b538SAndroid Build Coastguard Worker xmlAddChild(parent, q);
4393*6777b538SAndroid Build Coastguard Worker } else {
4394*6777b538SAndroid Build Coastguard Worker linkedSubset = 1;
4395*6777b538SAndroid Build Coastguard Worker q = (xmlNodePtr) doc->intSubset;
4396*6777b538SAndroid Build Coastguard Worker xmlAddChild(parent, q);
4397*6777b538SAndroid Build Coastguard Worker }
4398*6777b538SAndroid Build Coastguard Worker } else
4399*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
4400*6777b538SAndroid Build Coastguard Worker q = xmlStaticCopyNode(node, doc, parent, 1);
4401*6777b538SAndroid Build Coastguard Worker if (q == NULL) goto error;
4402*6777b538SAndroid Build Coastguard Worker if (ret == NULL) {
4403*6777b538SAndroid Build Coastguard Worker q->prev = NULL;
4404*6777b538SAndroid Build Coastguard Worker ret = p = q;
4405*6777b538SAndroid Build Coastguard Worker } else if (p != q) {
4406*6777b538SAndroid Build Coastguard Worker /* the test is required if xmlStaticCopyNode coalesced 2 text nodes */
4407*6777b538SAndroid Build Coastguard Worker p->next = q;
4408*6777b538SAndroid Build Coastguard Worker q->prev = p;
4409*6777b538SAndroid Build Coastguard Worker p = q;
4410*6777b538SAndroid Build Coastguard Worker }
4411*6777b538SAndroid Build Coastguard Worker node = node->next;
4412*6777b538SAndroid Build Coastguard Worker }
4413*6777b538SAndroid Build Coastguard Worker if ((doc != NULL) && (newSubset != NULL))
4414*6777b538SAndroid Build Coastguard Worker doc->intSubset = newSubset;
4415*6777b538SAndroid Build Coastguard Worker return(ret);
4416*6777b538SAndroid Build Coastguard Worker error:
4417*6777b538SAndroid Build Coastguard Worker xmlFreeNodeList(ret);
4418*6777b538SAndroid Build Coastguard Worker if (linkedSubset != 0) {
4419*6777b538SAndroid Build Coastguard Worker doc->intSubset->next = NULL;
4420*6777b538SAndroid Build Coastguard Worker doc->intSubset->prev = NULL;
4421*6777b538SAndroid Build Coastguard Worker }
4422*6777b538SAndroid Build Coastguard Worker return(NULL);
4423*6777b538SAndroid Build Coastguard Worker }
4424*6777b538SAndroid Build Coastguard Worker
4425*6777b538SAndroid Build Coastguard Worker /**
4426*6777b538SAndroid Build Coastguard Worker * xmlCopyNode:
4427*6777b538SAndroid Build Coastguard Worker * @node: the node
4428*6777b538SAndroid Build Coastguard Worker * @extended: if 1 do a recursive copy (properties, namespaces and children
4429*6777b538SAndroid Build Coastguard Worker * when applicable)
4430*6777b538SAndroid Build Coastguard Worker * if 2 copy properties and namespaces (when applicable)
4431*6777b538SAndroid Build Coastguard Worker *
4432*6777b538SAndroid Build Coastguard Worker * Do a copy of the node.
4433*6777b538SAndroid Build Coastguard Worker *
4434*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlNodePtr, or NULL in case of error.
4435*6777b538SAndroid Build Coastguard Worker */
4436*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlCopyNode(xmlNodePtr node,int extended)4437*6777b538SAndroid Build Coastguard Worker xmlCopyNode(xmlNodePtr node, int extended) {
4438*6777b538SAndroid Build Coastguard Worker xmlNodePtr ret;
4439*6777b538SAndroid Build Coastguard Worker
4440*6777b538SAndroid Build Coastguard Worker ret = xmlStaticCopyNode(node, NULL, NULL, extended);
4441*6777b538SAndroid Build Coastguard Worker return(ret);
4442*6777b538SAndroid Build Coastguard Worker }
4443*6777b538SAndroid Build Coastguard Worker
4444*6777b538SAndroid Build Coastguard Worker /**
4445*6777b538SAndroid Build Coastguard Worker * xmlDocCopyNode:
4446*6777b538SAndroid Build Coastguard Worker * @node: the node
4447*6777b538SAndroid Build Coastguard Worker * @doc: the document
4448*6777b538SAndroid Build Coastguard Worker * @extended: if 1 do a recursive copy (properties, namespaces and children
4449*6777b538SAndroid Build Coastguard Worker * when applicable)
4450*6777b538SAndroid Build Coastguard Worker * if 2 copy properties and namespaces (when applicable)
4451*6777b538SAndroid Build Coastguard Worker *
4452*6777b538SAndroid Build Coastguard Worker * Do a copy of the node to a given document.
4453*6777b538SAndroid Build Coastguard Worker *
4454*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlNodePtr, or NULL in case of error.
4455*6777b538SAndroid Build Coastguard Worker */
4456*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlDocCopyNode(xmlNodePtr node,xmlDocPtr doc,int extended)4457*6777b538SAndroid Build Coastguard Worker xmlDocCopyNode(xmlNodePtr node, xmlDocPtr doc, int extended) {
4458*6777b538SAndroid Build Coastguard Worker xmlNodePtr ret;
4459*6777b538SAndroid Build Coastguard Worker
4460*6777b538SAndroid Build Coastguard Worker ret = xmlStaticCopyNode(node, doc, NULL, extended);
4461*6777b538SAndroid Build Coastguard Worker return(ret);
4462*6777b538SAndroid Build Coastguard Worker }
4463*6777b538SAndroid Build Coastguard Worker
4464*6777b538SAndroid Build Coastguard Worker /**
4465*6777b538SAndroid Build Coastguard Worker * xmlDocCopyNodeList:
4466*6777b538SAndroid Build Coastguard Worker * @doc: the target document
4467*6777b538SAndroid Build Coastguard Worker * @node: the first node in the list.
4468*6777b538SAndroid Build Coastguard Worker *
4469*6777b538SAndroid Build Coastguard Worker * Do a recursive copy of the node list.
4470*6777b538SAndroid Build Coastguard Worker *
4471*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlNodePtr, or NULL in case of error.
4472*6777b538SAndroid Build Coastguard Worker */
xmlDocCopyNodeList(xmlDocPtr doc,xmlNodePtr node)4473*6777b538SAndroid Build Coastguard Worker xmlNodePtr xmlDocCopyNodeList(xmlDocPtr doc, xmlNodePtr node) {
4474*6777b538SAndroid Build Coastguard Worker xmlNodePtr ret = xmlStaticCopyNodeList(node, doc, NULL);
4475*6777b538SAndroid Build Coastguard Worker return(ret);
4476*6777b538SAndroid Build Coastguard Worker }
4477*6777b538SAndroid Build Coastguard Worker
4478*6777b538SAndroid Build Coastguard Worker /**
4479*6777b538SAndroid Build Coastguard Worker * xmlCopyNodeList:
4480*6777b538SAndroid Build Coastguard Worker * @node: the first node in the list.
4481*6777b538SAndroid Build Coastguard Worker *
4482*6777b538SAndroid Build Coastguard Worker * Do a recursive copy of the node list.
4483*6777b538SAndroid Build Coastguard Worker * Use xmlDocCopyNodeList() if possible to ensure string interning.
4484*6777b538SAndroid Build Coastguard Worker *
4485*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlNodePtr, or NULL in case of error.
4486*6777b538SAndroid Build Coastguard Worker */
xmlCopyNodeList(xmlNodePtr node)4487*6777b538SAndroid Build Coastguard Worker xmlNodePtr xmlCopyNodeList(xmlNodePtr node) {
4488*6777b538SAndroid Build Coastguard Worker xmlNodePtr ret = xmlStaticCopyNodeList(node, NULL, NULL);
4489*6777b538SAndroid Build Coastguard Worker return(ret);
4490*6777b538SAndroid Build Coastguard Worker }
4491*6777b538SAndroid Build Coastguard Worker
4492*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED)
4493*6777b538SAndroid Build Coastguard Worker /**
4494*6777b538SAndroid Build Coastguard Worker * xmlCopyDtd:
4495*6777b538SAndroid Build Coastguard Worker * @dtd: the dtd
4496*6777b538SAndroid Build Coastguard Worker *
4497*6777b538SAndroid Build Coastguard Worker * Do a copy of the dtd.
4498*6777b538SAndroid Build Coastguard Worker *
4499*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlDtdPtr, or NULL in case of error.
4500*6777b538SAndroid Build Coastguard Worker */
4501*6777b538SAndroid Build Coastguard Worker xmlDtdPtr
xmlCopyDtd(xmlDtdPtr dtd)4502*6777b538SAndroid Build Coastguard Worker xmlCopyDtd(xmlDtdPtr dtd) {
4503*6777b538SAndroid Build Coastguard Worker xmlDtdPtr ret;
4504*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur, p = NULL, q;
4505*6777b538SAndroid Build Coastguard Worker
4506*6777b538SAndroid Build Coastguard Worker if (dtd == NULL) return(NULL);
4507*6777b538SAndroid Build Coastguard Worker ret = xmlNewDtd(NULL, dtd->name, dtd->ExternalID, dtd->SystemID);
4508*6777b538SAndroid Build Coastguard Worker if (ret == NULL) return(NULL);
4509*6777b538SAndroid Build Coastguard Worker if (dtd->entities != NULL) {
4510*6777b538SAndroid Build Coastguard Worker ret->entities = (void *) xmlCopyEntitiesTable(
4511*6777b538SAndroid Build Coastguard Worker (xmlEntitiesTablePtr) dtd->entities);
4512*6777b538SAndroid Build Coastguard Worker if (ret->entities == NULL)
4513*6777b538SAndroid Build Coastguard Worker goto error;
4514*6777b538SAndroid Build Coastguard Worker }
4515*6777b538SAndroid Build Coastguard Worker if (dtd->notations != NULL) {
4516*6777b538SAndroid Build Coastguard Worker ret->notations = (void *) xmlCopyNotationTable(
4517*6777b538SAndroid Build Coastguard Worker (xmlNotationTablePtr) dtd->notations);
4518*6777b538SAndroid Build Coastguard Worker if (ret->notations == NULL)
4519*6777b538SAndroid Build Coastguard Worker goto error;
4520*6777b538SAndroid Build Coastguard Worker }
4521*6777b538SAndroid Build Coastguard Worker if (dtd->elements != NULL) {
4522*6777b538SAndroid Build Coastguard Worker ret->elements = (void *) xmlCopyElementTable(
4523*6777b538SAndroid Build Coastguard Worker (xmlElementTablePtr) dtd->elements);
4524*6777b538SAndroid Build Coastguard Worker if (ret->elements == NULL)
4525*6777b538SAndroid Build Coastguard Worker goto error;
4526*6777b538SAndroid Build Coastguard Worker }
4527*6777b538SAndroid Build Coastguard Worker if (dtd->attributes != NULL) {
4528*6777b538SAndroid Build Coastguard Worker ret->attributes = (void *) xmlCopyAttributeTable(
4529*6777b538SAndroid Build Coastguard Worker (xmlAttributeTablePtr) dtd->attributes);
4530*6777b538SAndroid Build Coastguard Worker if (ret->attributes == NULL)
4531*6777b538SAndroid Build Coastguard Worker goto error;
4532*6777b538SAndroid Build Coastguard Worker }
4533*6777b538SAndroid Build Coastguard Worker if (dtd->pentities != NULL) {
4534*6777b538SAndroid Build Coastguard Worker ret->pentities = (void *) xmlCopyEntitiesTable(
4535*6777b538SAndroid Build Coastguard Worker (xmlEntitiesTablePtr) dtd->pentities);
4536*6777b538SAndroid Build Coastguard Worker if (ret->pentities == NULL)
4537*6777b538SAndroid Build Coastguard Worker goto error;
4538*6777b538SAndroid Build Coastguard Worker }
4539*6777b538SAndroid Build Coastguard Worker
4540*6777b538SAndroid Build Coastguard Worker cur = dtd->children;
4541*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
4542*6777b538SAndroid Build Coastguard Worker q = NULL;
4543*6777b538SAndroid Build Coastguard Worker
4544*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ENTITY_DECL) {
4545*6777b538SAndroid Build Coastguard Worker xmlEntityPtr tmp = (xmlEntityPtr) cur;
4546*6777b538SAndroid Build Coastguard Worker switch (tmp->etype) {
4547*6777b538SAndroid Build Coastguard Worker case XML_INTERNAL_GENERAL_ENTITY:
4548*6777b538SAndroid Build Coastguard Worker case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
4549*6777b538SAndroid Build Coastguard Worker case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
4550*6777b538SAndroid Build Coastguard Worker q = (xmlNodePtr) xmlGetEntityFromDtd(ret, tmp->name);
4551*6777b538SAndroid Build Coastguard Worker break;
4552*6777b538SAndroid Build Coastguard Worker case XML_INTERNAL_PARAMETER_ENTITY:
4553*6777b538SAndroid Build Coastguard Worker case XML_EXTERNAL_PARAMETER_ENTITY:
4554*6777b538SAndroid Build Coastguard Worker q = (xmlNodePtr)
4555*6777b538SAndroid Build Coastguard Worker xmlGetParameterEntityFromDtd(ret, tmp->name);
4556*6777b538SAndroid Build Coastguard Worker break;
4557*6777b538SAndroid Build Coastguard Worker case XML_INTERNAL_PREDEFINED_ENTITY:
4558*6777b538SAndroid Build Coastguard Worker break;
4559*6777b538SAndroid Build Coastguard Worker }
4560*6777b538SAndroid Build Coastguard Worker } else if (cur->type == XML_ELEMENT_DECL) {
4561*6777b538SAndroid Build Coastguard Worker xmlElementPtr tmp = (xmlElementPtr) cur;
4562*6777b538SAndroid Build Coastguard Worker q = (xmlNodePtr)
4563*6777b538SAndroid Build Coastguard Worker xmlGetDtdQElementDesc(ret, tmp->name, tmp->prefix);
4564*6777b538SAndroid Build Coastguard Worker } else if (cur->type == XML_ATTRIBUTE_DECL) {
4565*6777b538SAndroid Build Coastguard Worker xmlAttributePtr tmp = (xmlAttributePtr) cur;
4566*6777b538SAndroid Build Coastguard Worker q = (xmlNodePtr)
4567*6777b538SAndroid Build Coastguard Worker xmlGetDtdQAttrDesc(ret, tmp->elem, tmp->name, tmp->prefix);
4568*6777b538SAndroid Build Coastguard Worker } else if (cur->type == XML_COMMENT_NODE) {
4569*6777b538SAndroid Build Coastguard Worker q = xmlCopyNode(cur, 0);
4570*6777b538SAndroid Build Coastguard Worker if (q == NULL)
4571*6777b538SAndroid Build Coastguard Worker goto error;
4572*6777b538SAndroid Build Coastguard Worker }
4573*6777b538SAndroid Build Coastguard Worker
4574*6777b538SAndroid Build Coastguard Worker if (q == NULL) {
4575*6777b538SAndroid Build Coastguard Worker cur = cur->next;
4576*6777b538SAndroid Build Coastguard Worker continue;
4577*6777b538SAndroid Build Coastguard Worker }
4578*6777b538SAndroid Build Coastguard Worker
4579*6777b538SAndroid Build Coastguard Worker if (p == NULL)
4580*6777b538SAndroid Build Coastguard Worker ret->children = q;
4581*6777b538SAndroid Build Coastguard Worker else
4582*6777b538SAndroid Build Coastguard Worker p->next = q;
4583*6777b538SAndroid Build Coastguard Worker
4584*6777b538SAndroid Build Coastguard Worker q->prev = p;
4585*6777b538SAndroid Build Coastguard Worker q->parent = (xmlNodePtr) ret;
4586*6777b538SAndroid Build Coastguard Worker q->next = NULL;
4587*6777b538SAndroid Build Coastguard Worker ret->last = q;
4588*6777b538SAndroid Build Coastguard Worker p = q;
4589*6777b538SAndroid Build Coastguard Worker cur = cur->next;
4590*6777b538SAndroid Build Coastguard Worker }
4591*6777b538SAndroid Build Coastguard Worker
4592*6777b538SAndroid Build Coastguard Worker return(ret);
4593*6777b538SAndroid Build Coastguard Worker
4594*6777b538SAndroid Build Coastguard Worker error:
4595*6777b538SAndroid Build Coastguard Worker xmlFreeDtd(ret);
4596*6777b538SAndroid Build Coastguard Worker return(NULL);
4597*6777b538SAndroid Build Coastguard Worker }
4598*6777b538SAndroid Build Coastguard Worker #endif
4599*6777b538SAndroid Build Coastguard Worker
4600*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
4601*6777b538SAndroid Build Coastguard Worker /**
4602*6777b538SAndroid Build Coastguard Worker * xmlCopyDoc:
4603*6777b538SAndroid Build Coastguard Worker * @doc: the document
4604*6777b538SAndroid Build Coastguard Worker * @recursive: if not zero do a recursive copy.
4605*6777b538SAndroid Build Coastguard Worker *
4606*6777b538SAndroid Build Coastguard Worker * Do a copy of the document info. If recursive, the content tree will
4607*6777b538SAndroid Build Coastguard Worker * be copied too as well as DTD, namespaces and entities.
4608*6777b538SAndroid Build Coastguard Worker *
4609*6777b538SAndroid Build Coastguard Worker * Returns: a new #xmlDocPtr, or NULL in case of error.
4610*6777b538SAndroid Build Coastguard Worker */
4611*6777b538SAndroid Build Coastguard Worker xmlDocPtr
xmlCopyDoc(xmlDocPtr doc,int recursive)4612*6777b538SAndroid Build Coastguard Worker xmlCopyDoc(xmlDocPtr doc, int recursive) {
4613*6777b538SAndroid Build Coastguard Worker xmlDocPtr ret;
4614*6777b538SAndroid Build Coastguard Worker
4615*6777b538SAndroid Build Coastguard Worker if (doc == NULL) return(NULL);
4616*6777b538SAndroid Build Coastguard Worker ret = xmlNewDoc(doc->version);
4617*6777b538SAndroid Build Coastguard Worker if (ret == NULL) return(NULL);
4618*6777b538SAndroid Build Coastguard Worker ret->type = doc->type;
4619*6777b538SAndroid Build Coastguard Worker if (doc->name != NULL) {
4620*6777b538SAndroid Build Coastguard Worker ret->name = xmlMemStrdup(doc->name);
4621*6777b538SAndroid Build Coastguard Worker if (ret->name == NULL)
4622*6777b538SAndroid Build Coastguard Worker goto error;
4623*6777b538SAndroid Build Coastguard Worker }
4624*6777b538SAndroid Build Coastguard Worker if (doc->encoding != NULL) {
4625*6777b538SAndroid Build Coastguard Worker ret->encoding = xmlStrdup(doc->encoding);
4626*6777b538SAndroid Build Coastguard Worker if (ret->encoding == NULL)
4627*6777b538SAndroid Build Coastguard Worker goto error;
4628*6777b538SAndroid Build Coastguard Worker }
4629*6777b538SAndroid Build Coastguard Worker if (doc->URL != NULL) {
4630*6777b538SAndroid Build Coastguard Worker ret->URL = xmlStrdup(doc->URL);
4631*6777b538SAndroid Build Coastguard Worker if (ret->URL == NULL)
4632*6777b538SAndroid Build Coastguard Worker goto error;
4633*6777b538SAndroid Build Coastguard Worker }
4634*6777b538SAndroid Build Coastguard Worker ret->charset = doc->charset;
4635*6777b538SAndroid Build Coastguard Worker ret->compression = doc->compression;
4636*6777b538SAndroid Build Coastguard Worker ret->standalone = doc->standalone;
4637*6777b538SAndroid Build Coastguard Worker if (!recursive) return(ret);
4638*6777b538SAndroid Build Coastguard Worker
4639*6777b538SAndroid Build Coastguard Worker ret->last = NULL;
4640*6777b538SAndroid Build Coastguard Worker ret->children = NULL;
4641*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
4642*6777b538SAndroid Build Coastguard Worker if (doc->intSubset != NULL) {
4643*6777b538SAndroid Build Coastguard Worker ret->intSubset = xmlCopyDtd(doc->intSubset);
4644*6777b538SAndroid Build Coastguard Worker if (ret->intSubset == NULL)
4645*6777b538SAndroid Build Coastguard Worker goto error;
4646*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc((xmlNodePtr)ret->intSubset, ret);
4647*6777b538SAndroid Build Coastguard Worker ret->intSubset->parent = ret;
4648*6777b538SAndroid Build Coastguard Worker }
4649*6777b538SAndroid Build Coastguard Worker #endif
4650*6777b538SAndroid Build Coastguard Worker if (doc->oldNs != NULL) {
4651*6777b538SAndroid Build Coastguard Worker ret->oldNs = xmlCopyNamespaceList(doc->oldNs);
4652*6777b538SAndroid Build Coastguard Worker if (ret->oldNs == NULL)
4653*6777b538SAndroid Build Coastguard Worker goto error;
4654*6777b538SAndroid Build Coastguard Worker }
4655*6777b538SAndroid Build Coastguard Worker if (doc->children != NULL) {
4656*6777b538SAndroid Build Coastguard Worker xmlNodePtr tmp;
4657*6777b538SAndroid Build Coastguard Worker
4658*6777b538SAndroid Build Coastguard Worker ret->children = xmlStaticCopyNodeList(doc->children, ret,
4659*6777b538SAndroid Build Coastguard Worker (xmlNodePtr)ret);
4660*6777b538SAndroid Build Coastguard Worker if (ret->children == NULL)
4661*6777b538SAndroid Build Coastguard Worker goto error;
4662*6777b538SAndroid Build Coastguard Worker ret->last = NULL;
4663*6777b538SAndroid Build Coastguard Worker tmp = ret->children;
4664*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
4665*6777b538SAndroid Build Coastguard Worker if (tmp->next == NULL)
4666*6777b538SAndroid Build Coastguard Worker ret->last = tmp;
4667*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
4668*6777b538SAndroid Build Coastguard Worker }
4669*6777b538SAndroid Build Coastguard Worker }
4670*6777b538SAndroid Build Coastguard Worker return(ret);
4671*6777b538SAndroid Build Coastguard Worker
4672*6777b538SAndroid Build Coastguard Worker error:
4673*6777b538SAndroid Build Coastguard Worker xmlFreeDoc(ret);
4674*6777b538SAndroid Build Coastguard Worker return(NULL);
4675*6777b538SAndroid Build Coastguard Worker }
4676*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
4677*6777b538SAndroid Build Coastguard Worker
4678*6777b538SAndroid Build Coastguard Worker /************************************************************************
4679*6777b538SAndroid Build Coastguard Worker * *
4680*6777b538SAndroid Build Coastguard Worker * Content access functions *
4681*6777b538SAndroid Build Coastguard Worker * *
4682*6777b538SAndroid Build Coastguard Worker ************************************************************************/
4683*6777b538SAndroid Build Coastguard Worker
4684*6777b538SAndroid Build Coastguard Worker /**
4685*6777b538SAndroid Build Coastguard Worker * xmlGetLineNoInternal:
4686*6777b538SAndroid Build Coastguard Worker * @node: valid node
4687*6777b538SAndroid Build Coastguard Worker * @depth: used to limit any risk of recursion
4688*6777b538SAndroid Build Coastguard Worker *
4689*6777b538SAndroid Build Coastguard Worker * Get line number of @node.
4690*6777b538SAndroid Build Coastguard Worker * Try to override the limitation of lines being store in 16 bits ints
4691*6777b538SAndroid Build Coastguard Worker *
4692*6777b538SAndroid Build Coastguard Worker * Returns the line number if successful, -1 otherwise
4693*6777b538SAndroid Build Coastguard Worker */
4694*6777b538SAndroid Build Coastguard Worker static long
xmlGetLineNoInternal(const xmlNode * node,int depth)4695*6777b538SAndroid Build Coastguard Worker xmlGetLineNoInternal(const xmlNode *node, int depth)
4696*6777b538SAndroid Build Coastguard Worker {
4697*6777b538SAndroid Build Coastguard Worker long result = -1;
4698*6777b538SAndroid Build Coastguard Worker
4699*6777b538SAndroid Build Coastguard Worker if (depth >= 5)
4700*6777b538SAndroid Build Coastguard Worker return(-1);
4701*6777b538SAndroid Build Coastguard Worker
4702*6777b538SAndroid Build Coastguard Worker if (!node)
4703*6777b538SAndroid Build Coastguard Worker return result;
4704*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_ELEMENT_NODE) ||
4705*6777b538SAndroid Build Coastguard Worker (node->type == XML_TEXT_NODE) ||
4706*6777b538SAndroid Build Coastguard Worker (node->type == XML_COMMENT_NODE) ||
4707*6777b538SAndroid Build Coastguard Worker (node->type == XML_PI_NODE)) {
4708*6777b538SAndroid Build Coastguard Worker if (node->line == 65535) {
4709*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_TEXT_NODE) && (node->psvi != NULL))
4710*6777b538SAndroid Build Coastguard Worker result = (long) (ptrdiff_t) node->psvi;
4711*6777b538SAndroid Build Coastguard Worker else if ((node->type == XML_ELEMENT_NODE) &&
4712*6777b538SAndroid Build Coastguard Worker (node->children != NULL))
4713*6777b538SAndroid Build Coastguard Worker result = xmlGetLineNoInternal(node->children, depth + 1);
4714*6777b538SAndroid Build Coastguard Worker else if (node->next != NULL)
4715*6777b538SAndroid Build Coastguard Worker result = xmlGetLineNoInternal(node->next, depth + 1);
4716*6777b538SAndroid Build Coastguard Worker else if (node->prev != NULL)
4717*6777b538SAndroid Build Coastguard Worker result = xmlGetLineNoInternal(node->prev, depth + 1);
4718*6777b538SAndroid Build Coastguard Worker }
4719*6777b538SAndroid Build Coastguard Worker if ((result == -1) || (result == 65535))
4720*6777b538SAndroid Build Coastguard Worker result = (long) node->line;
4721*6777b538SAndroid Build Coastguard Worker } else if ((node->prev != NULL) &&
4722*6777b538SAndroid Build Coastguard Worker ((node->prev->type == XML_ELEMENT_NODE) ||
4723*6777b538SAndroid Build Coastguard Worker (node->prev->type == XML_TEXT_NODE) ||
4724*6777b538SAndroid Build Coastguard Worker (node->prev->type == XML_COMMENT_NODE) ||
4725*6777b538SAndroid Build Coastguard Worker (node->prev->type == XML_PI_NODE)))
4726*6777b538SAndroid Build Coastguard Worker result = xmlGetLineNoInternal(node->prev, depth + 1);
4727*6777b538SAndroid Build Coastguard Worker else if ((node->parent != NULL) &&
4728*6777b538SAndroid Build Coastguard Worker (node->parent->type == XML_ELEMENT_NODE))
4729*6777b538SAndroid Build Coastguard Worker result = xmlGetLineNoInternal(node->parent, depth + 1);
4730*6777b538SAndroid Build Coastguard Worker
4731*6777b538SAndroid Build Coastguard Worker return result;
4732*6777b538SAndroid Build Coastguard Worker }
4733*6777b538SAndroid Build Coastguard Worker
4734*6777b538SAndroid Build Coastguard Worker /**
4735*6777b538SAndroid Build Coastguard Worker * xmlGetLineNo:
4736*6777b538SAndroid Build Coastguard Worker * @node: valid node
4737*6777b538SAndroid Build Coastguard Worker *
4738*6777b538SAndroid Build Coastguard Worker * Get line number of @node.
4739*6777b538SAndroid Build Coastguard Worker * Try to override the limitation of lines being store in 16 bits ints
4740*6777b538SAndroid Build Coastguard Worker * if XML_PARSE_BIG_LINES parser option was used
4741*6777b538SAndroid Build Coastguard Worker *
4742*6777b538SAndroid Build Coastguard Worker * Returns the line number if successful, -1 otherwise
4743*6777b538SAndroid Build Coastguard Worker */
4744*6777b538SAndroid Build Coastguard Worker long
xmlGetLineNo(const xmlNode * node)4745*6777b538SAndroid Build Coastguard Worker xmlGetLineNo(const xmlNode *node)
4746*6777b538SAndroid Build Coastguard Worker {
4747*6777b538SAndroid Build Coastguard Worker return(xmlGetLineNoInternal(node, 0));
4748*6777b538SAndroid Build Coastguard Worker }
4749*6777b538SAndroid Build Coastguard Worker
4750*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
4751*6777b538SAndroid Build Coastguard Worker /**
4752*6777b538SAndroid Build Coastguard Worker * xmlGetNodePath:
4753*6777b538SAndroid Build Coastguard Worker * @node: a node
4754*6777b538SAndroid Build Coastguard Worker *
4755*6777b538SAndroid Build Coastguard Worker * Build a structure based Path for the given node
4756*6777b538SAndroid Build Coastguard Worker *
4757*6777b538SAndroid Build Coastguard Worker * Returns the new path or NULL in case of error. The caller must free
4758*6777b538SAndroid Build Coastguard Worker * the returned string
4759*6777b538SAndroid Build Coastguard Worker */
4760*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlGetNodePath(const xmlNode * node)4761*6777b538SAndroid Build Coastguard Worker xmlGetNodePath(const xmlNode *node)
4762*6777b538SAndroid Build Coastguard Worker {
4763*6777b538SAndroid Build Coastguard Worker const xmlNode *cur, *tmp, *next;
4764*6777b538SAndroid Build Coastguard Worker xmlChar *buffer = NULL, *temp;
4765*6777b538SAndroid Build Coastguard Worker size_t buf_len;
4766*6777b538SAndroid Build Coastguard Worker xmlChar *buf;
4767*6777b538SAndroid Build Coastguard Worker const char *sep;
4768*6777b538SAndroid Build Coastguard Worker const char *name;
4769*6777b538SAndroid Build Coastguard Worker char nametemp[100];
4770*6777b538SAndroid Build Coastguard Worker int occur = 0, generic;
4771*6777b538SAndroid Build Coastguard Worker
4772*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type == XML_NAMESPACE_DECL))
4773*6777b538SAndroid Build Coastguard Worker return (NULL);
4774*6777b538SAndroid Build Coastguard Worker
4775*6777b538SAndroid Build Coastguard Worker buf_len = 500;
4776*6777b538SAndroid Build Coastguard Worker buffer = (xmlChar *) xmlMallocAtomic(buf_len);
4777*6777b538SAndroid Build Coastguard Worker if (buffer == NULL)
4778*6777b538SAndroid Build Coastguard Worker return (NULL);
4779*6777b538SAndroid Build Coastguard Worker buf = (xmlChar *) xmlMallocAtomic(buf_len);
4780*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
4781*6777b538SAndroid Build Coastguard Worker xmlFree(buffer);
4782*6777b538SAndroid Build Coastguard Worker return (NULL);
4783*6777b538SAndroid Build Coastguard Worker }
4784*6777b538SAndroid Build Coastguard Worker
4785*6777b538SAndroid Build Coastguard Worker buffer[0] = 0;
4786*6777b538SAndroid Build Coastguard Worker cur = node;
4787*6777b538SAndroid Build Coastguard Worker do {
4788*6777b538SAndroid Build Coastguard Worker name = "";
4789*6777b538SAndroid Build Coastguard Worker sep = "?";
4790*6777b538SAndroid Build Coastguard Worker occur = 0;
4791*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_DOCUMENT_NODE) ||
4792*6777b538SAndroid Build Coastguard Worker (cur->type == XML_HTML_DOCUMENT_NODE)) {
4793*6777b538SAndroid Build Coastguard Worker if (buffer[0] == '/')
4794*6777b538SAndroid Build Coastguard Worker break;
4795*6777b538SAndroid Build Coastguard Worker sep = "/";
4796*6777b538SAndroid Build Coastguard Worker next = NULL;
4797*6777b538SAndroid Build Coastguard Worker } else if (cur->type == XML_ELEMENT_NODE) {
4798*6777b538SAndroid Build Coastguard Worker generic = 0;
4799*6777b538SAndroid Build Coastguard Worker sep = "/";
4800*6777b538SAndroid Build Coastguard Worker name = (const char *) cur->name;
4801*6777b538SAndroid Build Coastguard Worker if (cur->ns) {
4802*6777b538SAndroid Build Coastguard Worker if (cur->ns->prefix != NULL) {
4803*6777b538SAndroid Build Coastguard Worker snprintf(nametemp, sizeof(nametemp) - 1, "%s:%s",
4804*6777b538SAndroid Build Coastguard Worker (char *)cur->ns->prefix, (char *)cur->name);
4805*6777b538SAndroid Build Coastguard Worker nametemp[sizeof(nametemp) - 1] = 0;
4806*6777b538SAndroid Build Coastguard Worker name = nametemp;
4807*6777b538SAndroid Build Coastguard Worker } else {
4808*6777b538SAndroid Build Coastguard Worker /*
4809*6777b538SAndroid Build Coastguard Worker * We cannot express named elements in the default
4810*6777b538SAndroid Build Coastguard Worker * namespace, so use "*".
4811*6777b538SAndroid Build Coastguard Worker */
4812*6777b538SAndroid Build Coastguard Worker generic = 1;
4813*6777b538SAndroid Build Coastguard Worker name = "*";
4814*6777b538SAndroid Build Coastguard Worker }
4815*6777b538SAndroid Build Coastguard Worker }
4816*6777b538SAndroid Build Coastguard Worker next = cur->parent;
4817*6777b538SAndroid Build Coastguard Worker
4818*6777b538SAndroid Build Coastguard Worker /*
4819*6777b538SAndroid Build Coastguard Worker * Thumbler index computation
4820*6777b538SAndroid Build Coastguard Worker * TODO: the occurrence test seems bogus for namespaced names
4821*6777b538SAndroid Build Coastguard Worker */
4822*6777b538SAndroid Build Coastguard Worker tmp = cur->prev;
4823*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
4824*6777b538SAndroid Build Coastguard Worker if ((tmp->type == XML_ELEMENT_NODE) &&
4825*6777b538SAndroid Build Coastguard Worker (generic ||
4826*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->name, tmp->name) &&
4827*6777b538SAndroid Build Coastguard Worker ((tmp->ns == cur->ns) ||
4828*6777b538SAndroid Build Coastguard Worker ((tmp->ns != NULL) && (cur->ns != NULL) &&
4829*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->ns->prefix, tmp->ns->prefix)))))))
4830*6777b538SAndroid Build Coastguard Worker occur++;
4831*6777b538SAndroid Build Coastguard Worker tmp = tmp->prev;
4832*6777b538SAndroid Build Coastguard Worker }
4833*6777b538SAndroid Build Coastguard Worker if (occur == 0) {
4834*6777b538SAndroid Build Coastguard Worker tmp = cur->next;
4835*6777b538SAndroid Build Coastguard Worker while (tmp != NULL && occur == 0) {
4836*6777b538SAndroid Build Coastguard Worker if ((tmp->type == XML_ELEMENT_NODE) &&
4837*6777b538SAndroid Build Coastguard Worker (generic ||
4838*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->name, tmp->name) &&
4839*6777b538SAndroid Build Coastguard Worker ((tmp->ns == cur->ns) ||
4840*6777b538SAndroid Build Coastguard Worker ((tmp->ns != NULL) && (cur->ns != NULL) &&
4841*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->ns->prefix, tmp->ns->prefix)))))))
4842*6777b538SAndroid Build Coastguard Worker occur++;
4843*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
4844*6777b538SAndroid Build Coastguard Worker }
4845*6777b538SAndroid Build Coastguard Worker if (occur != 0)
4846*6777b538SAndroid Build Coastguard Worker occur = 1;
4847*6777b538SAndroid Build Coastguard Worker } else
4848*6777b538SAndroid Build Coastguard Worker occur++;
4849*6777b538SAndroid Build Coastguard Worker } else if (cur->type == XML_COMMENT_NODE) {
4850*6777b538SAndroid Build Coastguard Worker sep = "/";
4851*6777b538SAndroid Build Coastguard Worker name = "comment()";
4852*6777b538SAndroid Build Coastguard Worker next = cur->parent;
4853*6777b538SAndroid Build Coastguard Worker
4854*6777b538SAndroid Build Coastguard Worker /*
4855*6777b538SAndroid Build Coastguard Worker * Thumbler index computation
4856*6777b538SAndroid Build Coastguard Worker */
4857*6777b538SAndroid Build Coastguard Worker tmp = cur->prev;
4858*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
4859*6777b538SAndroid Build Coastguard Worker if (tmp->type == XML_COMMENT_NODE)
4860*6777b538SAndroid Build Coastguard Worker occur++;
4861*6777b538SAndroid Build Coastguard Worker tmp = tmp->prev;
4862*6777b538SAndroid Build Coastguard Worker }
4863*6777b538SAndroid Build Coastguard Worker if (occur == 0) {
4864*6777b538SAndroid Build Coastguard Worker tmp = cur->next;
4865*6777b538SAndroid Build Coastguard Worker while (tmp != NULL && occur == 0) {
4866*6777b538SAndroid Build Coastguard Worker if (tmp->type == XML_COMMENT_NODE)
4867*6777b538SAndroid Build Coastguard Worker occur++;
4868*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
4869*6777b538SAndroid Build Coastguard Worker }
4870*6777b538SAndroid Build Coastguard Worker if (occur != 0)
4871*6777b538SAndroid Build Coastguard Worker occur = 1;
4872*6777b538SAndroid Build Coastguard Worker } else
4873*6777b538SAndroid Build Coastguard Worker occur++;
4874*6777b538SAndroid Build Coastguard Worker } else if ((cur->type == XML_TEXT_NODE) ||
4875*6777b538SAndroid Build Coastguard Worker (cur->type == XML_CDATA_SECTION_NODE)) {
4876*6777b538SAndroid Build Coastguard Worker sep = "/";
4877*6777b538SAndroid Build Coastguard Worker name = "text()";
4878*6777b538SAndroid Build Coastguard Worker next = cur->parent;
4879*6777b538SAndroid Build Coastguard Worker
4880*6777b538SAndroid Build Coastguard Worker /*
4881*6777b538SAndroid Build Coastguard Worker * Thumbler index computation
4882*6777b538SAndroid Build Coastguard Worker */
4883*6777b538SAndroid Build Coastguard Worker tmp = cur->prev;
4884*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
4885*6777b538SAndroid Build Coastguard Worker if ((tmp->type == XML_TEXT_NODE) ||
4886*6777b538SAndroid Build Coastguard Worker (tmp->type == XML_CDATA_SECTION_NODE))
4887*6777b538SAndroid Build Coastguard Worker occur++;
4888*6777b538SAndroid Build Coastguard Worker tmp = tmp->prev;
4889*6777b538SAndroid Build Coastguard Worker }
4890*6777b538SAndroid Build Coastguard Worker /*
4891*6777b538SAndroid Build Coastguard Worker * Evaluate if this is the only text- or CDATA-section-node;
4892*6777b538SAndroid Build Coastguard Worker * if yes, then we'll get "text()", otherwise "text()[1]".
4893*6777b538SAndroid Build Coastguard Worker */
4894*6777b538SAndroid Build Coastguard Worker if (occur == 0) {
4895*6777b538SAndroid Build Coastguard Worker tmp = cur->next;
4896*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
4897*6777b538SAndroid Build Coastguard Worker if ((tmp->type == XML_TEXT_NODE) ||
4898*6777b538SAndroid Build Coastguard Worker (tmp->type == XML_CDATA_SECTION_NODE))
4899*6777b538SAndroid Build Coastguard Worker {
4900*6777b538SAndroid Build Coastguard Worker occur = 1;
4901*6777b538SAndroid Build Coastguard Worker break;
4902*6777b538SAndroid Build Coastguard Worker }
4903*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
4904*6777b538SAndroid Build Coastguard Worker }
4905*6777b538SAndroid Build Coastguard Worker } else
4906*6777b538SAndroid Build Coastguard Worker occur++;
4907*6777b538SAndroid Build Coastguard Worker } else if (cur->type == XML_PI_NODE) {
4908*6777b538SAndroid Build Coastguard Worker sep = "/";
4909*6777b538SAndroid Build Coastguard Worker snprintf(nametemp, sizeof(nametemp) - 1,
4910*6777b538SAndroid Build Coastguard Worker "processing-instruction('%s')", (char *)cur->name);
4911*6777b538SAndroid Build Coastguard Worker nametemp[sizeof(nametemp) - 1] = 0;
4912*6777b538SAndroid Build Coastguard Worker name = nametemp;
4913*6777b538SAndroid Build Coastguard Worker
4914*6777b538SAndroid Build Coastguard Worker next = cur->parent;
4915*6777b538SAndroid Build Coastguard Worker
4916*6777b538SAndroid Build Coastguard Worker /*
4917*6777b538SAndroid Build Coastguard Worker * Thumbler index computation
4918*6777b538SAndroid Build Coastguard Worker */
4919*6777b538SAndroid Build Coastguard Worker tmp = cur->prev;
4920*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
4921*6777b538SAndroid Build Coastguard Worker if ((tmp->type == XML_PI_NODE) &&
4922*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->name, tmp->name)))
4923*6777b538SAndroid Build Coastguard Worker occur++;
4924*6777b538SAndroid Build Coastguard Worker tmp = tmp->prev;
4925*6777b538SAndroid Build Coastguard Worker }
4926*6777b538SAndroid Build Coastguard Worker if (occur == 0) {
4927*6777b538SAndroid Build Coastguard Worker tmp = cur->next;
4928*6777b538SAndroid Build Coastguard Worker while (tmp != NULL && occur == 0) {
4929*6777b538SAndroid Build Coastguard Worker if ((tmp->type == XML_PI_NODE) &&
4930*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->name, tmp->name)))
4931*6777b538SAndroid Build Coastguard Worker occur++;
4932*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
4933*6777b538SAndroid Build Coastguard Worker }
4934*6777b538SAndroid Build Coastguard Worker if (occur != 0)
4935*6777b538SAndroid Build Coastguard Worker occur = 1;
4936*6777b538SAndroid Build Coastguard Worker } else
4937*6777b538SAndroid Build Coastguard Worker occur++;
4938*6777b538SAndroid Build Coastguard Worker
4939*6777b538SAndroid Build Coastguard Worker } else if (cur->type == XML_ATTRIBUTE_NODE) {
4940*6777b538SAndroid Build Coastguard Worker sep = "/@";
4941*6777b538SAndroid Build Coastguard Worker name = (const char *) (((xmlAttrPtr) cur)->name);
4942*6777b538SAndroid Build Coastguard Worker if (cur->ns) {
4943*6777b538SAndroid Build Coastguard Worker if (cur->ns->prefix != NULL)
4944*6777b538SAndroid Build Coastguard Worker snprintf(nametemp, sizeof(nametemp) - 1, "%s:%s",
4945*6777b538SAndroid Build Coastguard Worker (char *)cur->ns->prefix, (char *)cur->name);
4946*6777b538SAndroid Build Coastguard Worker else
4947*6777b538SAndroid Build Coastguard Worker snprintf(nametemp, sizeof(nametemp) - 1, "%s",
4948*6777b538SAndroid Build Coastguard Worker (char *)cur->name);
4949*6777b538SAndroid Build Coastguard Worker nametemp[sizeof(nametemp) - 1] = 0;
4950*6777b538SAndroid Build Coastguard Worker name = nametemp;
4951*6777b538SAndroid Build Coastguard Worker }
4952*6777b538SAndroid Build Coastguard Worker next = ((xmlAttrPtr) cur)->parent;
4953*6777b538SAndroid Build Coastguard Worker } else {
4954*6777b538SAndroid Build Coastguard Worker xmlFree(buf);
4955*6777b538SAndroid Build Coastguard Worker xmlFree(buffer);
4956*6777b538SAndroid Build Coastguard Worker return (NULL);
4957*6777b538SAndroid Build Coastguard Worker }
4958*6777b538SAndroid Build Coastguard Worker
4959*6777b538SAndroid Build Coastguard Worker /*
4960*6777b538SAndroid Build Coastguard Worker * Make sure there is enough room
4961*6777b538SAndroid Build Coastguard Worker */
4962*6777b538SAndroid Build Coastguard Worker if (xmlStrlen(buffer) + sizeof(nametemp) + 20 > buf_len) {
4963*6777b538SAndroid Build Coastguard Worker buf_len =
4964*6777b538SAndroid Build Coastguard Worker 2 * buf_len + xmlStrlen(buffer) + sizeof(nametemp) + 20;
4965*6777b538SAndroid Build Coastguard Worker temp = (xmlChar *) xmlRealloc(buffer, buf_len);
4966*6777b538SAndroid Build Coastguard Worker if (temp == NULL) {
4967*6777b538SAndroid Build Coastguard Worker xmlFree(buf);
4968*6777b538SAndroid Build Coastguard Worker xmlFree(buffer);
4969*6777b538SAndroid Build Coastguard Worker return (NULL);
4970*6777b538SAndroid Build Coastguard Worker }
4971*6777b538SAndroid Build Coastguard Worker buffer = temp;
4972*6777b538SAndroid Build Coastguard Worker temp = (xmlChar *) xmlRealloc(buf, buf_len);
4973*6777b538SAndroid Build Coastguard Worker if (temp == NULL) {
4974*6777b538SAndroid Build Coastguard Worker xmlFree(buf);
4975*6777b538SAndroid Build Coastguard Worker xmlFree(buffer);
4976*6777b538SAndroid Build Coastguard Worker return (NULL);
4977*6777b538SAndroid Build Coastguard Worker }
4978*6777b538SAndroid Build Coastguard Worker buf = temp;
4979*6777b538SAndroid Build Coastguard Worker }
4980*6777b538SAndroid Build Coastguard Worker if (occur == 0)
4981*6777b538SAndroid Build Coastguard Worker snprintf((char *) buf, buf_len, "%s%s%s",
4982*6777b538SAndroid Build Coastguard Worker sep, name, (char *) buffer);
4983*6777b538SAndroid Build Coastguard Worker else
4984*6777b538SAndroid Build Coastguard Worker snprintf((char *) buf, buf_len, "%s%s[%d]%s",
4985*6777b538SAndroid Build Coastguard Worker sep, name, occur, (char *) buffer);
4986*6777b538SAndroid Build Coastguard Worker snprintf((char *) buffer, buf_len, "%s", (char *)buf);
4987*6777b538SAndroid Build Coastguard Worker cur = next;
4988*6777b538SAndroid Build Coastguard Worker } while (cur != NULL);
4989*6777b538SAndroid Build Coastguard Worker xmlFree(buf);
4990*6777b538SAndroid Build Coastguard Worker return (buffer);
4991*6777b538SAndroid Build Coastguard Worker }
4992*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
4993*6777b538SAndroid Build Coastguard Worker
4994*6777b538SAndroid Build Coastguard Worker /**
4995*6777b538SAndroid Build Coastguard Worker * xmlDocGetRootElement:
4996*6777b538SAndroid Build Coastguard Worker * @doc: the document
4997*6777b538SAndroid Build Coastguard Worker *
4998*6777b538SAndroid Build Coastguard Worker * Get the root element of the document (doc->children is a list
4999*6777b538SAndroid Build Coastguard Worker * containing possibly comments, PIs, etc ...).
5000*6777b538SAndroid Build Coastguard Worker *
5001*6777b538SAndroid Build Coastguard Worker * Returns the #xmlNodePtr for the root or NULL
5002*6777b538SAndroid Build Coastguard Worker */
5003*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlDocGetRootElement(const xmlDoc * doc)5004*6777b538SAndroid Build Coastguard Worker xmlDocGetRootElement(const xmlDoc *doc) {
5005*6777b538SAndroid Build Coastguard Worker xmlNodePtr ret;
5006*6777b538SAndroid Build Coastguard Worker
5007*6777b538SAndroid Build Coastguard Worker if (doc == NULL) return(NULL);
5008*6777b538SAndroid Build Coastguard Worker ret = doc->children;
5009*6777b538SAndroid Build Coastguard Worker while (ret != NULL) {
5010*6777b538SAndroid Build Coastguard Worker if (ret->type == XML_ELEMENT_NODE)
5011*6777b538SAndroid Build Coastguard Worker return(ret);
5012*6777b538SAndroid Build Coastguard Worker ret = ret->next;
5013*6777b538SAndroid Build Coastguard Worker }
5014*6777b538SAndroid Build Coastguard Worker return(ret);
5015*6777b538SAndroid Build Coastguard Worker }
5016*6777b538SAndroid Build Coastguard Worker
5017*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_WRITER_ENABLED)
5018*6777b538SAndroid Build Coastguard Worker /**
5019*6777b538SAndroid Build Coastguard Worker * xmlDocSetRootElement:
5020*6777b538SAndroid Build Coastguard Worker * @doc: the document
5021*6777b538SAndroid Build Coastguard Worker * @root: the new document root element, if root is NULL no action is taken,
5022*6777b538SAndroid Build Coastguard Worker * to remove a node from a document use xmlUnlinkNode(root) instead.
5023*6777b538SAndroid Build Coastguard Worker *
5024*6777b538SAndroid Build Coastguard Worker * Set the root element of the document (doc->children is a list
5025*6777b538SAndroid Build Coastguard Worker * containing possibly comments, PIs, etc ...).
5026*6777b538SAndroid Build Coastguard Worker *
5027*6777b538SAndroid Build Coastguard Worker * Returns the old root element if any was found, NULL if root was NULL
5028*6777b538SAndroid Build Coastguard Worker */
5029*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlDocSetRootElement(xmlDocPtr doc,xmlNodePtr root)5030*6777b538SAndroid Build Coastguard Worker xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root) {
5031*6777b538SAndroid Build Coastguard Worker xmlNodePtr old = NULL;
5032*6777b538SAndroid Build Coastguard Worker
5033*6777b538SAndroid Build Coastguard Worker if (doc == NULL) return(NULL);
5034*6777b538SAndroid Build Coastguard Worker if ((root == NULL) || (root->type == XML_NAMESPACE_DECL))
5035*6777b538SAndroid Build Coastguard Worker return(NULL);
5036*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(root);
5037*6777b538SAndroid Build Coastguard Worker xmlSetTreeDoc(root, doc);
5038*6777b538SAndroid Build Coastguard Worker root->parent = (xmlNodePtr) doc;
5039*6777b538SAndroid Build Coastguard Worker old = doc->children;
5040*6777b538SAndroid Build Coastguard Worker while (old != NULL) {
5041*6777b538SAndroid Build Coastguard Worker if (old->type == XML_ELEMENT_NODE)
5042*6777b538SAndroid Build Coastguard Worker break;
5043*6777b538SAndroid Build Coastguard Worker old = old->next;
5044*6777b538SAndroid Build Coastguard Worker }
5045*6777b538SAndroid Build Coastguard Worker if (old == NULL) {
5046*6777b538SAndroid Build Coastguard Worker if (doc->children == NULL) {
5047*6777b538SAndroid Build Coastguard Worker doc->children = root;
5048*6777b538SAndroid Build Coastguard Worker doc->last = root;
5049*6777b538SAndroid Build Coastguard Worker } else {
5050*6777b538SAndroid Build Coastguard Worker xmlAddSibling(doc->children, root);
5051*6777b538SAndroid Build Coastguard Worker }
5052*6777b538SAndroid Build Coastguard Worker } else {
5053*6777b538SAndroid Build Coastguard Worker xmlReplaceNode(old, root);
5054*6777b538SAndroid Build Coastguard Worker }
5055*6777b538SAndroid Build Coastguard Worker return(old);
5056*6777b538SAndroid Build Coastguard Worker }
5057*6777b538SAndroid Build Coastguard Worker #endif
5058*6777b538SAndroid Build Coastguard Worker
5059*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED)
5060*6777b538SAndroid Build Coastguard Worker /**
5061*6777b538SAndroid Build Coastguard Worker * xmlNodeSetLang:
5062*6777b538SAndroid Build Coastguard Worker * @cur: the node being changed
5063*6777b538SAndroid Build Coastguard Worker * @lang: the language description
5064*6777b538SAndroid Build Coastguard Worker *
5065*6777b538SAndroid Build Coastguard Worker * Set the language of a node, i.e. the values of the xml:lang
5066*6777b538SAndroid Build Coastguard Worker * attribute.
5067*6777b538SAndroid Build Coastguard Worker */
5068*6777b538SAndroid Build Coastguard Worker void
xmlNodeSetLang(xmlNodePtr cur,const xmlChar * lang)5069*6777b538SAndroid Build Coastguard Worker xmlNodeSetLang(xmlNodePtr cur, const xmlChar *lang) {
5070*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
5071*6777b538SAndroid Build Coastguard Worker
5072*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return;
5073*6777b538SAndroid Build Coastguard Worker switch(cur->type) {
5074*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5075*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5076*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
5077*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
5078*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
5079*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
5080*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE:
5081*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
5082*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
5083*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
5084*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
5085*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
5086*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
5087*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
5088*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
5089*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL:
5090*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
5091*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
5092*6777b538SAndroid Build Coastguard Worker return;
5093*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
5094*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
5095*6777b538SAndroid Build Coastguard Worker break;
5096*6777b538SAndroid Build Coastguard Worker }
5097*6777b538SAndroid Build Coastguard Worker ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE);
5098*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
5099*6777b538SAndroid Build Coastguard Worker return;
5100*6777b538SAndroid Build Coastguard Worker xmlSetNsProp(cur, ns, BAD_CAST "lang", lang);
5101*6777b538SAndroid Build Coastguard Worker }
5102*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
5103*6777b538SAndroid Build Coastguard Worker
5104*6777b538SAndroid Build Coastguard Worker /**
5105*6777b538SAndroid Build Coastguard Worker * xmlNodeGetLang:
5106*6777b538SAndroid Build Coastguard Worker * @cur: the node being checked
5107*6777b538SAndroid Build Coastguard Worker *
5108*6777b538SAndroid Build Coastguard Worker * Searches the language of a node, i.e. the values of the xml:lang
5109*6777b538SAndroid Build Coastguard Worker * attribute or the one carried by the nearest ancestor.
5110*6777b538SAndroid Build Coastguard Worker *
5111*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the lang value, or NULL if not found
5112*6777b538SAndroid Build Coastguard Worker * It's up to the caller to free the memory with xmlFree().
5113*6777b538SAndroid Build Coastguard Worker */
5114*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlNodeGetLang(const xmlNode * cur)5115*6777b538SAndroid Build Coastguard Worker xmlNodeGetLang(const xmlNode *cur) {
5116*6777b538SAndroid Build Coastguard Worker xmlChar *lang;
5117*6777b538SAndroid Build Coastguard Worker
5118*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL))
5119*6777b538SAndroid Build Coastguard Worker return(NULL);
5120*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
5121*6777b538SAndroid Build Coastguard Worker lang = xmlGetNsProp(cur, BAD_CAST "lang", XML_XML_NAMESPACE);
5122*6777b538SAndroid Build Coastguard Worker if (lang != NULL)
5123*6777b538SAndroid Build Coastguard Worker return(lang);
5124*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
5125*6777b538SAndroid Build Coastguard Worker }
5126*6777b538SAndroid Build Coastguard Worker return(NULL);
5127*6777b538SAndroid Build Coastguard Worker }
5128*6777b538SAndroid Build Coastguard Worker
5129*6777b538SAndroid Build Coastguard Worker
5130*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
5131*6777b538SAndroid Build Coastguard Worker /**
5132*6777b538SAndroid Build Coastguard Worker * xmlNodeSetSpacePreserve:
5133*6777b538SAndroid Build Coastguard Worker * @cur: the node being changed
5134*6777b538SAndroid Build Coastguard Worker * @val: the xml:space value ("0": default, 1: "preserve")
5135*6777b538SAndroid Build Coastguard Worker *
5136*6777b538SAndroid Build Coastguard Worker * Set (or reset) the space preserving behaviour of a node, i.e. the
5137*6777b538SAndroid Build Coastguard Worker * value of the xml:space attribute.
5138*6777b538SAndroid Build Coastguard Worker */
5139*6777b538SAndroid Build Coastguard Worker void
xmlNodeSetSpacePreserve(xmlNodePtr cur,int val)5140*6777b538SAndroid Build Coastguard Worker xmlNodeSetSpacePreserve(xmlNodePtr cur, int val) {
5141*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
5142*6777b538SAndroid Build Coastguard Worker
5143*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return;
5144*6777b538SAndroid Build Coastguard Worker switch(cur->type) {
5145*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5146*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5147*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
5148*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
5149*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
5150*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
5151*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE:
5152*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
5153*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
5154*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
5155*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
5156*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
5157*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
5158*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
5159*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
5160*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL:
5161*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
5162*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
5163*6777b538SAndroid Build Coastguard Worker return;
5164*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
5165*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
5166*6777b538SAndroid Build Coastguard Worker break;
5167*6777b538SAndroid Build Coastguard Worker }
5168*6777b538SAndroid Build Coastguard Worker ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE);
5169*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
5170*6777b538SAndroid Build Coastguard Worker return;
5171*6777b538SAndroid Build Coastguard Worker switch (val) {
5172*6777b538SAndroid Build Coastguard Worker case 0:
5173*6777b538SAndroid Build Coastguard Worker xmlSetNsProp(cur, ns, BAD_CAST "space", BAD_CAST "default");
5174*6777b538SAndroid Build Coastguard Worker break;
5175*6777b538SAndroid Build Coastguard Worker case 1:
5176*6777b538SAndroid Build Coastguard Worker xmlSetNsProp(cur, ns, BAD_CAST "space", BAD_CAST "preserve");
5177*6777b538SAndroid Build Coastguard Worker break;
5178*6777b538SAndroid Build Coastguard Worker }
5179*6777b538SAndroid Build Coastguard Worker }
5180*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
5181*6777b538SAndroid Build Coastguard Worker
5182*6777b538SAndroid Build Coastguard Worker /**
5183*6777b538SAndroid Build Coastguard Worker * xmlNodeGetSpacePreserve:
5184*6777b538SAndroid Build Coastguard Worker * @cur: the node being checked
5185*6777b538SAndroid Build Coastguard Worker *
5186*6777b538SAndroid Build Coastguard Worker * Searches the space preserving behaviour of a node, i.e. the values
5187*6777b538SAndroid Build Coastguard Worker * of the xml:space attribute or the one carried by the nearest
5188*6777b538SAndroid Build Coastguard Worker * ancestor.
5189*6777b538SAndroid Build Coastguard Worker *
5190*6777b538SAndroid Build Coastguard Worker * Returns -1 if xml:space is not inherited, 0 if "default", 1 if "preserve"
5191*6777b538SAndroid Build Coastguard Worker */
5192*6777b538SAndroid Build Coastguard Worker int
xmlNodeGetSpacePreserve(const xmlNode * cur)5193*6777b538SAndroid Build Coastguard Worker xmlNodeGetSpacePreserve(const xmlNode *cur) {
5194*6777b538SAndroid Build Coastguard Worker xmlChar *space;
5195*6777b538SAndroid Build Coastguard Worker
5196*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (cur->type != XML_ELEMENT_NODE))
5197*6777b538SAndroid Build Coastguard Worker return(-1);
5198*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
5199*6777b538SAndroid Build Coastguard Worker space = xmlGetNsProp(cur, BAD_CAST "space", XML_XML_NAMESPACE);
5200*6777b538SAndroid Build Coastguard Worker if (space != NULL) {
5201*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(space, BAD_CAST "preserve")) {
5202*6777b538SAndroid Build Coastguard Worker xmlFree(space);
5203*6777b538SAndroid Build Coastguard Worker return(1);
5204*6777b538SAndroid Build Coastguard Worker }
5205*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(space, BAD_CAST "default")) {
5206*6777b538SAndroid Build Coastguard Worker xmlFree(space);
5207*6777b538SAndroid Build Coastguard Worker return(0);
5208*6777b538SAndroid Build Coastguard Worker }
5209*6777b538SAndroid Build Coastguard Worker xmlFree(space);
5210*6777b538SAndroid Build Coastguard Worker }
5211*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
5212*6777b538SAndroid Build Coastguard Worker }
5213*6777b538SAndroid Build Coastguard Worker return(-1);
5214*6777b538SAndroid Build Coastguard Worker }
5215*6777b538SAndroid Build Coastguard Worker
5216*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
5217*6777b538SAndroid Build Coastguard Worker /**
5218*6777b538SAndroid Build Coastguard Worker * xmlNodeSetName:
5219*6777b538SAndroid Build Coastguard Worker * @cur: the node being changed
5220*6777b538SAndroid Build Coastguard Worker * @name: the new tag name
5221*6777b538SAndroid Build Coastguard Worker *
5222*6777b538SAndroid Build Coastguard Worker * Set (or reset) the name of a node.
5223*6777b538SAndroid Build Coastguard Worker */
5224*6777b538SAndroid Build Coastguard Worker void
xmlNodeSetName(xmlNodePtr cur,const xmlChar * name)5225*6777b538SAndroid Build Coastguard Worker xmlNodeSetName(xmlNodePtr cur, const xmlChar *name) {
5226*6777b538SAndroid Build Coastguard Worker xmlDocPtr doc;
5227*6777b538SAndroid Build Coastguard Worker xmlDictPtr dict;
5228*6777b538SAndroid Build Coastguard Worker const xmlChar *freeme = NULL;
5229*6777b538SAndroid Build Coastguard Worker
5230*6777b538SAndroid Build Coastguard Worker if (cur == NULL) return;
5231*6777b538SAndroid Build Coastguard Worker if (name == NULL) return;
5232*6777b538SAndroid Build Coastguard Worker switch(cur->type) {
5233*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5234*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5235*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
5236*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
5237*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
5238*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE:
5239*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
5240*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL:
5241*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
5242*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
5243*6777b538SAndroid Build Coastguard Worker return;
5244*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
5245*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
5246*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
5247*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
5248*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
5249*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
5250*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
5251*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
5252*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
5253*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
5254*6777b538SAndroid Build Coastguard Worker break;
5255*6777b538SAndroid Build Coastguard Worker }
5256*6777b538SAndroid Build Coastguard Worker doc = cur->doc;
5257*6777b538SAndroid Build Coastguard Worker if (doc != NULL)
5258*6777b538SAndroid Build Coastguard Worker dict = doc->dict;
5259*6777b538SAndroid Build Coastguard Worker else
5260*6777b538SAndroid Build Coastguard Worker dict = NULL;
5261*6777b538SAndroid Build Coastguard Worker /* TODO: malloc check */
5262*6777b538SAndroid Build Coastguard Worker if (dict != NULL) {
5263*6777b538SAndroid Build Coastguard Worker if ((cur->name != NULL) && (!xmlDictOwns(dict, cur->name)))
5264*6777b538SAndroid Build Coastguard Worker freeme = cur->name;
5265*6777b538SAndroid Build Coastguard Worker cur->name = xmlDictLookup(dict, name, -1);
5266*6777b538SAndroid Build Coastguard Worker } else {
5267*6777b538SAndroid Build Coastguard Worker if (cur->name != NULL)
5268*6777b538SAndroid Build Coastguard Worker freeme = cur->name;
5269*6777b538SAndroid Build Coastguard Worker cur->name = xmlStrdup(name);
5270*6777b538SAndroid Build Coastguard Worker }
5271*6777b538SAndroid Build Coastguard Worker
5272*6777b538SAndroid Build Coastguard Worker if (freeme)
5273*6777b538SAndroid Build Coastguard Worker xmlFree((xmlChar *) freeme);
5274*6777b538SAndroid Build Coastguard Worker }
5275*6777b538SAndroid Build Coastguard Worker #endif
5276*6777b538SAndroid Build Coastguard Worker
5277*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED)
5278*6777b538SAndroid Build Coastguard Worker /**
5279*6777b538SAndroid Build Coastguard Worker * xmlNodeSetBase:
5280*6777b538SAndroid Build Coastguard Worker * @cur: the node being changed
5281*6777b538SAndroid Build Coastguard Worker * @uri: the new base URI
5282*6777b538SAndroid Build Coastguard Worker *
5283*6777b538SAndroid Build Coastguard Worker * Set (or reset) the base URI of a node, i.e. the value of the
5284*6777b538SAndroid Build Coastguard Worker * xml:base attribute.
5285*6777b538SAndroid Build Coastguard Worker *
5286*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, -1 on error.
5287*6777b538SAndroid Build Coastguard Worker */
5288*6777b538SAndroid Build Coastguard Worker int
xmlNodeSetBase(xmlNodePtr cur,const xmlChar * uri)5289*6777b538SAndroid Build Coastguard Worker xmlNodeSetBase(xmlNodePtr cur, const xmlChar* uri) {
5290*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
5291*6777b538SAndroid Build Coastguard Worker xmlChar* fixed;
5292*6777b538SAndroid Build Coastguard Worker
5293*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
5294*6777b538SAndroid Build Coastguard Worker return(-1);
5295*6777b538SAndroid Build Coastguard Worker switch(cur->type) {
5296*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5297*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5298*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
5299*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
5300*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
5301*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE:
5302*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
5303*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
5304*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
5305*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
5306*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
5307*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
5308*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
5309*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL:
5310*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
5311*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
5312*6777b538SAndroid Build Coastguard Worker return(-1);
5313*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
5314*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
5315*6777b538SAndroid Build Coastguard Worker break;
5316*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
5317*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE: {
5318*6777b538SAndroid Build Coastguard Worker xmlDocPtr doc = (xmlDocPtr) cur;
5319*6777b538SAndroid Build Coastguard Worker
5320*6777b538SAndroid Build Coastguard Worker if (doc->URL != NULL)
5321*6777b538SAndroid Build Coastguard Worker xmlFree((xmlChar *) doc->URL);
5322*6777b538SAndroid Build Coastguard Worker if (uri == NULL) {
5323*6777b538SAndroid Build Coastguard Worker doc->URL = NULL;
5324*6777b538SAndroid Build Coastguard Worker } else {
5325*6777b538SAndroid Build Coastguard Worker doc->URL = xmlPathToURI(uri);
5326*6777b538SAndroid Build Coastguard Worker if (doc->URL == NULL)
5327*6777b538SAndroid Build Coastguard Worker return(-1);
5328*6777b538SAndroid Build Coastguard Worker }
5329*6777b538SAndroid Build Coastguard Worker return(0);
5330*6777b538SAndroid Build Coastguard Worker }
5331*6777b538SAndroid Build Coastguard Worker }
5332*6777b538SAndroid Build Coastguard Worker
5333*6777b538SAndroid Build Coastguard Worker ns = xmlSearchNsByHref(cur->doc, cur, XML_XML_NAMESPACE);
5334*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
5335*6777b538SAndroid Build Coastguard Worker return(-1);
5336*6777b538SAndroid Build Coastguard Worker fixed = xmlPathToURI(uri);
5337*6777b538SAndroid Build Coastguard Worker if (fixed == NULL)
5338*6777b538SAndroid Build Coastguard Worker return(-1);
5339*6777b538SAndroid Build Coastguard Worker if (xmlSetNsProp(cur, ns, BAD_CAST "base", fixed) == NULL) {
5340*6777b538SAndroid Build Coastguard Worker xmlFree(fixed);
5341*6777b538SAndroid Build Coastguard Worker return(-1);
5342*6777b538SAndroid Build Coastguard Worker }
5343*6777b538SAndroid Build Coastguard Worker xmlFree(fixed);
5344*6777b538SAndroid Build Coastguard Worker
5345*6777b538SAndroid Build Coastguard Worker return(0);
5346*6777b538SAndroid Build Coastguard Worker }
5347*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
5348*6777b538SAndroid Build Coastguard Worker
5349*6777b538SAndroid Build Coastguard Worker /**
5350*6777b538SAndroid Build Coastguard Worker * xmlNodeGetBase:
5351*6777b538SAndroid Build Coastguard Worker * @doc: the document the node pertains to
5352*6777b538SAndroid Build Coastguard Worker * @cur: the node being checked
5353*6777b538SAndroid Build Coastguard Worker * @baseOut: pointer to base
5354*6777b538SAndroid Build Coastguard Worker *
5355*6777b538SAndroid Build Coastguard Worker * Searches for the BASE URL. The code should work on both XML
5356*6777b538SAndroid Build Coastguard Worker * and HTML document even if base mechanisms are completely different.
5357*6777b538SAndroid Build Coastguard Worker * It returns the base as defined in RFC 2396 sections
5358*6777b538SAndroid Build Coastguard Worker * 5.1.1. Base URI within Document Content
5359*6777b538SAndroid Build Coastguard Worker * and
5360*6777b538SAndroid Build Coastguard Worker * 5.1.2. Base URI from the Encapsulating Entity
5361*6777b538SAndroid Build Coastguard Worker * However it does not return the document base (5.1.3), use
5362*6777b538SAndroid Build Coastguard Worker * doc->URL in this case
5363*6777b538SAndroid Build Coastguard Worker *
5364*6777b538SAndroid Build Coastguard Worker * Return 0 in case of success, 1 if a URI or argument is invalid, -1 if a
5365*6777b538SAndroid Build Coastguard Worker * memory allocation failed.
5366*6777b538SAndroid Build Coastguard Worker */
5367*6777b538SAndroid Build Coastguard Worker int
xmlNodeGetBaseSafe(const xmlDoc * doc,const xmlNode * cur,xmlChar ** baseOut)5368*6777b538SAndroid Build Coastguard Worker xmlNodeGetBaseSafe(const xmlDoc *doc, const xmlNode *cur, xmlChar **baseOut) {
5369*6777b538SAndroid Build Coastguard Worker xmlChar *ret = NULL;
5370*6777b538SAndroid Build Coastguard Worker xmlChar *base, *newbase;
5371*6777b538SAndroid Build Coastguard Worker int res;
5372*6777b538SAndroid Build Coastguard Worker
5373*6777b538SAndroid Build Coastguard Worker if (baseOut == NULL)
5374*6777b538SAndroid Build Coastguard Worker return(1);
5375*6777b538SAndroid Build Coastguard Worker *baseOut = NULL;
5376*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) && (doc == NULL))
5377*6777b538SAndroid Build Coastguard Worker return(1);
5378*6777b538SAndroid Build Coastguard Worker if ((cur != NULL) && (cur->type == XML_NAMESPACE_DECL))
5379*6777b538SAndroid Build Coastguard Worker return(1);
5380*6777b538SAndroid Build Coastguard Worker if (doc == NULL)
5381*6777b538SAndroid Build Coastguard Worker doc = cur->doc;
5382*6777b538SAndroid Build Coastguard Worker
5383*6777b538SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) {
5384*6777b538SAndroid Build Coastguard Worker cur = doc->children;
5385*6777b538SAndroid Build Coastguard Worker while ((cur != NULL) && (cur->name != NULL)) {
5386*6777b538SAndroid Build Coastguard Worker if (cur->type != XML_ELEMENT_NODE) {
5387*6777b538SAndroid Build Coastguard Worker cur = cur->next;
5388*6777b538SAndroid Build Coastguard Worker continue;
5389*6777b538SAndroid Build Coastguard Worker }
5390*6777b538SAndroid Build Coastguard Worker if (!xmlStrcasecmp(cur->name, BAD_CAST "html")) {
5391*6777b538SAndroid Build Coastguard Worker cur = cur->children;
5392*6777b538SAndroid Build Coastguard Worker continue;
5393*6777b538SAndroid Build Coastguard Worker }
5394*6777b538SAndroid Build Coastguard Worker if (!xmlStrcasecmp(cur->name, BAD_CAST "head")) {
5395*6777b538SAndroid Build Coastguard Worker cur = cur->children;
5396*6777b538SAndroid Build Coastguard Worker continue;
5397*6777b538SAndroid Build Coastguard Worker }
5398*6777b538SAndroid Build Coastguard Worker if (!xmlStrcasecmp(cur->name, BAD_CAST "base")) {
5399*6777b538SAndroid Build Coastguard Worker if (xmlNodeGetAttrValue(cur, BAD_CAST "href", NULL, &ret) < 0)
5400*6777b538SAndroid Build Coastguard Worker return(-1);
5401*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
5402*6777b538SAndroid Build Coastguard Worker return(1);
5403*6777b538SAndroid Build Coastguard Worker goto found;
5404*6777b538SAndroid Build Coastguard Worker }
5405*6777b538SAndroid Build Coastguard Worker cur = cur->next;
5406*6777b538SAndroid Build Coastguard Worker }
5407*6777b538SAndroid Build Coastguard Worker return(0);
5408*6777b538SAndroid Build Coastguard Worker }
5409*6777b538SAndroid Build Coastguard Worker
5410*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
5411*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ENTITY_DECL) {
5412*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent = (xmlEntityPtr) cur;
5413*6777b538SAndroid Build Coastguard Worker
5414*6777b538SAndroid Build Coastguard Worker xmlFree(ret);
5415*6777b538SAndroid Build Coastguard Worker ret = xmlStrdup(ent->URI);
5416*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
5417*6777b538SAndroid Build Coastguard Worker return(-1);
5418*6777b538SAndroid Build Coastguard Worker goto found;
5419*6777b538SAndroid Build Coastguard Worker }
5420*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ELEMENT_NODE) {
5421*6777b538SAndroid Build Coastguard Worker if (xmlNodeGetAttrValue(cur, BAD_CAST "base", XML_XML_NAMESPACE,
5422*6777b538SAndroid Build Coastguard Worker &base) < 0) {
5423*6777b538SAndroid Build Coastguard Worker xmlFree(ret);
5424*6777b538SAndroid Build Coastguard Worker return(-1);
5425*6777b538SAndroid Build Coastguard Worker }
5426*6777b538SAndroid Build Coastguard Worker if (base != NULL) {
5427*6777b538SAndroid Build Coastguard Worker if (ret != NULL) {
5428*6777b538SAndroid Build Coastguard Worker res = xmlBuildURISafe(ret, base, &newbase);
5429*6777b538SAndroid Build Coastguard Worker xmlFree(ret);
5430*6777b538SAndroid Build Coastguard Worker xmlFree(base);
5431*6777b538SAndroid Build Coastguard Worker if (res != 0)
5432*6777b538SAndroid Build Coastguard Worker return(res);
5433*6777b538SAndroid Build Coastguard Worker ret = newbase;
5434*6777b538SAndroid Build Coastguard Worker } else {
5435*6777b538SAndroid Build Coastguard Worker ret = base;
5436*6777b538SAndroid Build Coastguard Worker }
5437*6777b538SAndroid Build Coastguard Worker if ((!xmlStrncmp(ret, BAD_CAST "http://", 7)) ||
5438*6777b538SAndroid Build Coastguard Worker (!xmlStrncmp(ret, BAD_CAST "ftp://", 6)) ||
5439*6777b538SAndroid Build Coastguard Worker (!xmlStrncmp(ret, BAD_CAST "urn:", 4)))
5440*6777b538SAndroid Build Coastguard Worker goto found;
5441*6777b538SAndroid Build Coastguard Worker }
5442*6777b538SAndroid Build Coastguard Worker }
5443*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
5444*6777b538SAndroid Build Coastguard Worker }
5445*6777b538SAndroid Build Coastguard Worker
5446*6777b538SAndroid Build Coastguard Worker if ((doc != NULL) && (doc->URL != NULL)) {
5447*6777b538SAndroid Build Coastguard Worker if (ret == NULL) {
5448*6777b538SAndroid Build Coastguard Worker ret = xmlStrdup(doc->URL);
5449*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
5450*6777b538SAndroid Build Coastguard Worker return(-1);
5451*6777b538SAndroid Build Coastguard Worker } else {
5452*6777b538SAndroid Build Coastguard Worker res = xmlBuildURISafe(ret, doc->URL, &newbase);
5453*6777b538SAndroid Build Coastguard Worker xmlFree(ret);
5454*6777b538SAndroid Build Coastguard Worker if (res != 0)
5455*6777b538SAndroid Build Coastguard Worker return(res);
5456*6777b538SAndroid Build Coastguard Worker ret = newbase;
5457*6777b538SAndroid Build Coastguard Worker }
5458*6777b538SAndroid Build Coastguard Worker }
5459*6777b538SAndroid Build Coastguard Worker
5460*6777b538SAndroid Build Coastguard Worker found:
5461*6777b538SAndroid Build Coastguard Worker *baseOut = ret;
5462*6777b538SAndroid Build Coastguard Worker return(0);
5463*6777b538SAndroid Build Coastguard Worker }
5464*6777b538SAndroid Build Coastguard Worker
5465*6777b538SAndroid Build Coastguard Worker /**
5466*6777b538SAndroid Build Coastguard Worker * xmlNodeGetBase:
5467*6777b538SAndroid Build Coastguard Worker * @doc: the document the node pertains to
5468*6777b538SAndroid Build Coastguard Worker * @cur: the node being checked
5469*6777b538SAndroid Build Coastguard Worker *
5470*6777b538SAndroid Build Coastguard Worker * See xmlNodeGetBaseSafe. This function doesn't allow to distinguish
5471*6777b538SAndroid Build Coastguard Worker * memory allocation failures from a non-existing base.
5472*6777b538SAndroid Build Coastguard Worker *
5473*6777b538SAndroid Build Coastguard Worker * Returns a pointer to the base URL, or NULL if not found
5474*6777b538SAndroid Build Coastguard Worker * It's up to the caller to free the memory with xmlFree().
5475*6777b538SAndroid Build Coastguard Worker */
5476*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlNodeGetBase(const xmlDoc * doc,const xmlNode * cur)5477*6777b538SAndroid Build Coastguard Worker xmlNodeGetBase(const xmlDoc *doc, const xmlNode *cur) {
5478*6777b538SAndroid Build Coastguard Worker xmlChar *base;
5479*6777b538SAndroid Build Coastguard Worker
5480*6777b538SAndroid Build Coastguard Worker xmlNodeGetBaseSafe(doc, cur, &base);
5481*6777b538SAndroid Build Coastguard Worker return(base);
5482*6777b538SAndroid Build Coastguard Worker }
5483*6777b538SAndroid Build Coastguard Worker
5484*6777b538SAndroid Build Coastguard Worker /**
5485*6777b538SAndroid Build Coastguard Worker * xmlNodeBufGetContent:
5486*6777b538SAndroid Build Coastguard Worker * @buffer: a buffer
5487*6777b538SAndroid Build Coastguard Worker * @cur: the node being read
5488*6777b538SAndroid Build Coastguard Worker *
5489*6777b538SAndroid Build Coastguard Worker * Read the value of a node @cur, this can be either the text carried
5490*6777b538SAndroid Build Coastguard Worker * directly by this node if it's a TEXT node or the aggregate string
5491*6777b538SAndroid Build Coastguard Worker * of the values carried by this node child's (TEXT and ENTITY_REF).
5492*6777b538SAndroid Build Coastguard Worker * Entity references are substituted.
5493*6777b538SAndroid Build Coastguard Worker * Fills up the buffer @buffer with this value
5494*6777b538SAndroid Build Coastguard Worker *
5495*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of success and -1 in case of error.
5496*6777b538SAndroid Build Coastguard Worker */
5497*6777b538SAndroid Build Coastguard Worker int
xmlNodeBufGetContent(xmlBufferPtr buffer,const xmlNode * cur)5498*6777b538SAndroid Build Coastguard Worker xmlNodeBufGetContent(xmlBufferPtr buffer, const xmlNode *cur)
5499*6777b538SAndroid Build Coastguard Worker {
5500*6777b538SAndroid Build Coastguard Worker xmlBufPtr buf;
5501*6777b538SAndroid Build Coastguard Worker int ret;
5502*6777b538SAndroid Build Coastguard Worker
5503*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (buffer == NULL)) return(-1);
5504*6777b538SAndroid Build Coastguard Worker buf = xmlBufFromBuffer(buffer);
5505*6777b538SAndroid Build Coastguard Worker ret = xmlBufGetNodeContent(buf, cur);
5506*6777b538SAndroid Build Coastguard Worker buffer = xmlBufBackToBuffer(buf);
5507*6777b538SAndroid Build Coastguard Worker if ((ret < 0) || (buffer == NULL))
5508*6777b538SAndroid Build Coastguard Worker return(-1);
5509*6777b538SAndroid Build Coastguard Worker return(0);
5510*6777b538SAndroid Build Coastguard Worker }
5511*6777b538SAndroid Build Coastguard Worker
5512*6777b538SAndroid Build Coastguard Worker /**
5513*6777b538SAndroid Build Coastguard Worker * xmlBufGetNodeContent:
5514*6777b538SAndroid Build Coastguard Worker * @buf: a buffer xmlBufPtr
5515*6777b538SAndroid Build Coastguard Worker * @cur: the node being read
5516*6777b538SAndroid Build Coastguard Worker *
5517*6777b538SAndroid Build Coastguard Worker * Read the value of a node @cur, this can be either the text carried
5518*6777b538SAndroid Build Coastguard Worker * directly by this node if it's a TEXT node or the aggregate string
5519*6777b538SAndroid Build Coastguard Worker * of the values carried by this node child's (TEXT and ENTITY_REF).
5520*6777b538SAndroid Build Coastguard Worker * Entity references are substituted.
5521*6777b538SAndroid Build Coastguard Worker * Fills up the buffer @buf with this value
5522*6777b538SAndroid Build Coastguard Worker *
5523*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of success and -1 in case of error.
5524*6777b538SAndroid Build Coastguard Worker */
5525*6777b538SAndroid Build Coastguard Worker int
xmlBufGetNodeContent(xmlBufPtr buf,const xmlNode * cur)5526*6777b538SAndroid Build Coastguard Worker xmlBufGetNodeContent(xmlBufPtr buf, const xmlNode *cur)
5527*6777b538SAndroid Build Coastguard Worker {
5528*6777b538SAndroid Build Coastguard Worker if ((cur == NULL) || (buf == NULL)) return(-1);
5529*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
5530*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5531*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5532*6777b538SAndroid Build Coastguard Worker xmlBufCat(buf, cur->content);
5533*6777b538SAndroid Build Coastguard Worker break;
5534*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
5535*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:{
5536*6777b538SAndroid Build Coastguard Worker const xmlNode *tmp = cur;
5537*6777b538SAndroid Build Coastguard Worker
5538*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
5539*6777b538SAndroid Build Coastguard Worker switch (tmp->type) {
5540*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5541*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5542*6777b538SAndroid Build Coastguard Worker if (tmp->content != NULL)
5543*6777b538SAndroid Build Coastguard Worker xmlBufCat(buf, tmp->content);
5544*6777b538SAndroid Build Coastguard Worker break;
5545*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
5546*6777b538SAndroid Build Coastguard Worker xmlBufGetNodeContent(buf, tmp);
5547*6777b538SAndroid Build Coastguard Worker break;
5548*6777b538SAndroid Build Coastguard Worker default:
5549*6777b538SAndroid Build Coastguard Worker break;
5550*6777b538SAndroid Build Coastguard Worker }
5551*6777b538SAndroid Build Coastguard Worker /*
5552*6777b538SAndroid Build Coastguard Worker * Skip to next node
5553*6777b538SAndroid Build Coastguard Worker */
5554*6777b538SAndroid Build Coastguard Worker if (tmp->children != NULL) {
5555*6777b538SAndroid Build Coastguard Worker if (tmp->children->type != XML_ENTITY_DECL) {
5556*6777b538SAndroid Build Coastguard Worker tmp = tmp->children;
5557*6777b538SAndroid Build Coastguard Worker continue;
5558*6777b538SAndroid Build Coastguard Worker }
5559*6777b538SAndroid Build Coastguard Worker }
5560*6777b538SAndroid Build Coastguard Worker if (tmp == cur)
5561*6777b538SAndroid Build Coastguard Worker break;
5562*6777b538SAndroid Build Coastguard Worker
5563*6777b538SAndroid Build Coastguard Worker if (tmp->next != NULL) {
5564*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
5565*6777b538SAndroid Build Coastguard Worker continue;
5566*6777b538SAndroid Build Coastguard Worker }
5567*6777b538SAndroid Build Coastguard Worker
5568*6777b538SAndroid Build Coastguard Worker do {
5569*6777b538SAndroid Build Coastguard Worker tmp = tmp->parent;
5570*6777b538SAndroid Build Coastguard Worker if (tmp == NULL)
5571*6777b538SAndroid Build Coastguard Worker break;
5572*6777b538SAndroid Build Coastguard Worker if (tmp == cur) {
5573*6777b538SAndroid Build Coastguard Worker tmp = NULL;
5574*6777b538SAndroid Build Coastguard Worker break;
5575*6777b538SAndroid Build Coastguard Worker }
5576*6777b538SAndroid Build Coastguard Worker if (tmp->next != NULL) {
5577*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
5578*6777b538SAndroid Build Coastguard Worker break;
5579*6777b538SAndroid Build Coastguard Worker }
5580*6777b538SAndroid Build Coastguard Worker } while (tmp != NULL);
5581*6777b538SAndroid Build Coastguard Worker }
5582*6777b538SAndroid Build Coastguard Worker break;
5583*6777b538SAndroid Build Coastguard Worker }
5584*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:{
5585*6777b538SAndroid Build Coastguard Worker xmlAttrPtr attr = (xmlAttrPtr) cur;
5586*6777b538SAndroid Build Coastguard Worker xmlNodePtr tmp = attr->children;
5587*6777b538SAndroid Build Coastguard Worker
5588*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
5589*6777b538SAndroid Build Coastguard Worker if (tmp->type == XML_TEXT_NODE)
5590*6777b538SAndroid Build Coastguard Worker xmlBufCat(buf, tmp->content);
5591*6777b538SAndroid Build Coastguard Worker else
5592*6777b538SAndroid Build Coastguard Worker xmlBufGetNodeContent(buf, tmp);
5593*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
5594*6777b538SAndroid Build Coastguard Worker }
5595*6777b538SAndroid Build Coastguard Worker break;
5596*6777b538SAndroid Build Coastguard Worker }
5597*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
5598*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
5599*6777b538SAndroid Build Coastguard Worker xmlBufCat(buf, cur->content);
5600*6777b538SAndroid Build Coastguard Worker break;
5601*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:{
5602*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
5603*6777b538SAndroid Build Coastguard Worker xmlNodePtr tmp;
5604*6777b538SAndroid Build Coastguard Worker
5605*6777b538SAndroid Build Coastguard Worker /* lookup entity declaration */
5606*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(cur->doc, cur->name);
5607*6777b538SAndroid Build Coastguard Worker if (ent == NULL)
5608*6777b538SAndroid Build Coastguard Worker return(-1);
5609*6777b538SAndroid Build Coastguard Worker
5610*6777b538SAndroid Build Coastguard Worker /* an entity content can be any "well balanced chunk",
5611*6777b538SAndroid Build Coastguard Worker * i.e. the result of the content [43] production:
5612*6777b538SAndroid Build Coastguard Worker * http://www.w3.org/TR/REC-xml#NT-content
5613*6777b538SAndroid Build Coastguard Worker * -> we iterate through child nodes and recursive call
5614*6777b538SAndroid Build Coastguard Worker * xmlNodeGetContent() which handles all possible node types */
5615*6777b538SAndroid Build Coastguard Worker tmp = ent->children;
5616*6777b538SAndroid Build Coastguard Worker while (tmp) {
5617*6777b538SAndroid Build Coastguard Worker xmlBufGetNodeContent(buf, tmp);
5618*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
5619*6777b538SAndroid Build Coastguard Worker }
5620*6777b538SAndroid Build Coastguard Worker break;
5621*6777b538SAndroid Build Coastguard Worker }
5622*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
5623*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
5624*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE:
5625*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
5626*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
5627*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
5628*6777b538SAndroid Build Coastguard Worker break;
5629*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
5630*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
5631*6777b538SAndroid Build Coastguard Worker cur = cur->children;
5632*6777b538SAndroid Build Coastguard Worker while (cur!= NULL) {
5633*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_ELEMENT_NODE) ||
5634*6777b538SAndroid Build Coastguard Worker (cur->type == XML_TEXT_NODE) ||
5635*6777b538SAndroid Build Coastguard Worker (cur->type == XML_CDATA_SECTION_NODE)) {
5636*6777b538SAndroid Build Coastguard Worker xmlBufGetNodeContent(buf, cur);
5637*6777b538SAndroid Build Coastguard Worker }
5638*6777b538SAndroid Build Coastguard Worker cur = cur->next;
5639*6777b538SAndroid Build Coastguard Worker }
5640*6777b538SAndroid Build Coastguard Worker break;
5641*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL:
5642*6777b538SAndroid Build Coastguard Worker xmlBufCat(buf, ((xmlNsPtr) cur)->href);
5643*6777b538SAndroid Build Coastguard Worker break;
5644*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
5645*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
5646*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
5647*6777b538SAndroid Build Coastguard Worker break;
5648*6777b538SAndroid Build Coastguard Worker }
5649*6777b538SAndroid Build Coastguard Worker return(0);
5650*6777b538SAndroid Build Coastguard Worker }
5651*6777b538SAndroid Build Coastguard Worker
5652*6777b538SAndroid Build Coastguard Worker /**
5653*6777b538SAndroid Build Coastguard Worker * xmlNodeGetContent:
5654*6777b538SAndroid Build Coastguard Worker * @cur: the node being read
5655*6777b538SAndroid Build Coastguard Worker *
5656*6777b538SAndroid Build Coastguard Worker * Read the value of a node, this can be either the text carried
5657*6777b538SAndroid Build Coastguard Worker * directly by this node if it's a TEXT node or the aggregate string
5658*6777b538SAndroid Build Coastguard Worker * of the values carried by this node child's (TEXT and ENTITY_REF).
5659*6777b538SAndroid Build Coastguard Worker * Entity references are substituted.
5660*6777b538SAndroid Build Coastguard Worker * Returns a new #xmlChar * or NULL if no content is available.
5661*6777b538SAndroid Build Coastguard Worker * It's up to the caller to free the memory with xmlFree().
5662*6777b538SAndroid Build Coastguard Worker */
5663*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlNodeGetContent(const xmlNode * cur)5664*6777b538SAndroid Build Coastguard Worker xmlNodeGetContent(const xmlNode *cur)
5665*6777b538SAndroid Build Coastguard Worker {
5666*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
5667*6777b538SAndroid Build Coastguard Worker return (NULL);
5668*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
5669*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
5670*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:{
5671*6777b538SAndroid Build Coastguard Worker xmlBufPtr buf;
5672*6777b538SAndroid Build Coastguard Worker xmlChar *ret;
5673*6777b538SAndroid Build Coastguard Worker
5674*6777b538SAndroid Build Coastguard Worker buf = xmlBufCreateSize(64);
5675*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
5676*6777b538SAndroid Build Coastguard Worker return (NULL);
5677*6777b538SAndroid Build Coastguard Worker xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT);
5678*6777b538SAndroid Build Coastguard Worker xmlBufGetNodeContent(buf, cur);
5679*6777b538SAndroid Build Coastguard Worker ret = xmlBufDetach(buf);
5680*6777b538SAndroid Build Coastguard Worker xmlBufFree(buf);
5681*6777b538SAndroid Build Coastguard Worker return (ret);
5682*6777b538SAndroid Build Coastguard Worker }
5683*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
5684*6777b538SAndroid Build Coastguard Worker return(xmlGetPropNodeValueInternal((xmlAttrPtr) cur));
5685*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
5686*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
5687*6777b538SAndroid Build Coastguard Worker if (cur->content != NULL)
5688*6777b538SAndroid Build Coastguard Worker return (xmlStrdup(cur->content));
5689*6777b538SAndroid Build Coastguard Worker else
5690*6777b538SAndroid Build Coastguard Worker return (xmlStrdup(BAD_CAST ""));
5691*6777b538SAndroid Build Coastguard Worker return (NULL);
5692*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:{
5693*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
5694*6777b538SAndroid Build Coastguard Worker xmlBufPtr buf;
5695*6777b538SAndroid Build Coastguard Worker xmlChar *ret;
5696*6777b538SAndroid Build Coastguard Worker
5697*6777b538SAndroid Build Coastguard Worker /* lookup entity declaration */
5698*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(cur->doc, cur->name);
5699*6777b538SAndroid Build Coastguard Worker if (ent == NULL)
5700*6777b538SAndroid Build Coastguard Worker return (NULL);
5701*6777b538SAndroid Build Coastguard Worker
5702*6777b538SAndroid Build Coastguard Worker buf = xmlBufCreate();
5703*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
5704*6777b538SAndroid Build Coastguard Worker return (NULL);
5705*6777b538SAndroid Build Coastguard Worker xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT);
5706*6777b538SAndroid Build Coastguard Worker
5707*6777b538SAndroid Build Coastguard Worker xmlBufGetNodeContent(buf, cur);
5708*6777b538SAndroid Build Coastguard Worker
5709*6777b538SAndroid Build Coastguard Worker ret = xmlBufDetach(buf);
5710*6777b538SAndroid Build Coastguard Worker xmlBufFree(buf);
5711*6777b538SAndroid Build Coastguard Worker return (ret);
5712*6777b538SAndroid Build Coastguard Worker }
5713*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
5714*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
5715*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE:
5716*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
5717*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
5718*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
5719*6777b538SAndroid Build Coastguard Worker return (NULL);
5720*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
5721*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE: {
5722*6777b538SAndroid Build Coastguard Worker xmlBufPtr buf;
5723*6777b538SAndroid Build Coastguard Worker xmlChar *ret;
5724*6777b538SAndroid Build Coastguard Worker
5725*6777b538SAndroid Build Coastguard Worker buf = xmlBufCreate();
5726*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
5727*6777b538SAndroid Build Coastguard Worker return (NULL);
5728*6777b538SAndroid Build Coastguard Worker xmlBufSetAllocationScheme(buf, XML_BUFFER_ALLOC_DOUBLEIT);
5729*6777b538SAndroid Build Coastguard Worker
5730*6777b538SAndroid Build Coastguard Worker xmlBufGetNodeContent(buf, (xmlNodePtr) cur);
5731*6777b538SAndroid Build Coastguard Worker
5732*6777b538SAndroid Build Coastguard Worker ret = xmlBufDetach(buf);
5733*6777b538SAndroid Build Coastguard Worker xmlBufFree(buf);
5734*6777b538SAndroid Build Coastguard Worker return (ret);
5735*6777b538SAndroid Build Coastguard Worker }
5736*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL: {
5737*6777b538SAndroid Build Coastguard Worker xmlChar *tmp;
5738*6777b538SAndroid Build Coastguard Worker
5739*6777b538SAndroid Build Coastguard Worker tmp = xmlStrdup(((xmlNsPtr) cur)->href);
5740*6777b538SAndroid Build Coastguard Worker return (tmp);
5741*6777b538SAndroid Build Coastguard Worker }
5742*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
5743*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
5744*6777b538SAndroid Build Coastguard Worker return (NULL);
5745*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
5746*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
5747*6777b538SAndroid Build Coastguard Worker return (NULL);
5748*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
5749*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
5750*6777b538SAndroid Build Coastguard Worker return (NULL);
5751*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5752*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5753*6777b538SAndroid Build Coastguard Worker if (cur->content != NULL)
5754*6777b538SAndroid Build Coastguard Worker return (xmlStrdup(cur->content));
5755*6777b538SAndroid Build Coastguard Worker return (NULL);
5756*6777b538SAndroid Build Coastguard Worker }
5757*6777b538SAndroid Build Coastguard Worker return (NULL);
5758*6777b538SAndroid Build Coastguard Worker }
5759*6777b538SAndroid Build Coastguard Worker
5760*6777b538SAndroid Build Coastguard Worker /**
5761*6777b538SAndroid Build Coastguard Worker * xmlNodeSetContent:
5762*6777b538SAndroid Build Coastguard Worker * @cur: the node being modified
5763*6777b538SAndroid Build Coastguard Worker * @content: the new value of the content
5764*6777b538SAndroid Build Coastguard Worker *
5765*6777b538SAndroid Build Coastguard Worker * Replace the content of a node.
5766*6777b538SAndroid Build Coastguard Worker * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity
5767*6777b538SAndroid Build Coastguard Worker * references, but XML special chars need to be escaped first by using
5768*6777b538SAndroid Build Coastguard Worker * xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().
5769*6777b538SAndroid Build Coastguard Worker *
5770*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, 1 on error, -1 if a memory allocation failed.
5771*6777b538SAndroid Build Coastguard Worker */
5772*6777b538SAndroid Build Coastguard Worker int
xmlNodeSetContent(xmlNodePtr cur,const xmlChar * content)5773*6777b538SAndroid Build Coastguard Worker xmlNodeSetContent(xmlNodePtr cur, const xmlChar *content) {
5774*6777b538SAndroid Build Coastguard Worker if (cur == NULL) {
5775*6777b538SAndroid Build Coastguard Worker return(1);
5776*6777b538SAndroid Build Coastguard Worker }
5777*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
5778*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
5779*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
5780*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE: {
5781*6777b538SAndroid Build Coastguard Worker xmlNodePtr list = NULL;
5782*6777b538SAndroid Build Coastguard Worker
5783*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
5784*6777b538SAndroid Build Coastguard Worker list = xmlStringGetNodeList(cur->doc, content);
5785*6777b538SAndroid Build Coastguard Worker if (list == NULL)
5786*6777b538SAndroid Build Coastguard Worker return(-1);
5787*6777b538SAndroid Build Coastguard Worker }
5788*6777b538SAndroid Build Coastguard Worker
5789*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL)
5790*6777b538SAndroid Build Coastguard Worker xmlFreeNodeList(cur->children);
5791*6777b538SAndroid Build Coastguard Worker cur->children = list;
5792*6777b538SAndroid Build Coastguard Worker UPDATE_LAST_CHILD_AND_PARENT(cur)
5793*6777b538SAndroid Build Coastguard Worker break;
5794*6777b538SAndroid Build Coastguard Worker }
5795*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5796*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5797*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
5798*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
5799*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
5800*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE: {
5801*6777b538SAndroid Build Coastguard Worker xmlChar *copy = NULL;
5802*6777b538SAndroid Build Coastguard Worker
5803*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
5804*6777b538SAndroid Build Coastguard Worker copy = xmlStrdup(content);
5805*6777b538SAndroid Build Coastguard Worker if (copy == NULL)
5806*6777b538SAndroid Build Coastguard Worker return(-1);
5807*6777b538SAndroid Build Coastguard Worker }
5808*6777b538SAndroid Build Coastguard Worker
5809*6777b538SAndroid Build Coastguard Worker if ((cur->content != NULL) &&
5810*6777b538SAndroid Build Coastguard Worker (cur->content != (xmlChar *) &(cur->properties))) {
5811*6777b538SAndroid Build Coastguard Worker if (!((cur->doc != NULL) && (cur->doc->dict != NULL) &&
5812*6777b538SAndroid Build Coastguard Worker (xmlDictOwns(cur->doc->dict, cur->content))))
5813*6777b538SAndroid Build Coastguard Worker xmlFree(cur->content);
5814*6777b538SAndroid Build Coastguard Worker }
5815*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL)
5816*6777b538SAndroid Build Coastguard Worker xmlFreeNodeList(cur->children);
5817*6777b538SAndroid Build Coastguard Worker cur->last = cur->children = NULL;
5818*6777b538SAndroid Build Coastguard Worker cur->content = copy;
5819*6777b538SAndroid Build Coastguard Worker break;
5820*6777b538SAndroid Build Coastguard Worker }
5821*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
5822*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
5823*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
5824*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
5825*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
5826*6777b538SAndroid Build Coastguard Worker break;
5827*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE:
5828*6777b538SAndroid Build Coastguard Worker break;
5829*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
5830*6777b538SAndroid Build Coastguard Worker break;
5831*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL:
5832*6777b538SAndroid Build Coastguard Worker break;
5833*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
5834*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
5835*6777b538SAndroid Build Coastguard Worker break;
5836*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
5837*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
5838*6777b538SAndroid Build Coastguard Worker break;
5839*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
5840*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
5841*6777b538SAndroid Build Coastguard Worker break;
5842*6777b538SAndroid Build Coastguard Worker }
5843*6777b538SAndroid Build Coastguard Worker
5844*6777b538SAndroid Build Coastguard Worker return(0);
5845*6777b538SAndroid Build Coastguard Worker }
5846*6777b538SAndroid Build Coastguard Worker
5847*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
5848*6777b538SAndroid Build Coastguard Worker /**
5849*6777b538SAndroid Build Coastguard Worker * xmlNodeSetContentLen:
5850*6777b538SAndroid Build Coastguard Worker * @cur: the node being modified
5851*6777b538SAndroid Build Coastguard Worker * @content: the new value of the content
5852*6777b538SAndroid Build Coastguard Worker * @len: the size of @content
5853*6777b538SAndroid Build Coastguard Worker *
5854*6777b538SAndroid Build Coastguard Worker * Replace the content of a node.
5855*6777b538SAndroid Build Coastguard Worker * NOTE: @content is supposed to be a piece of XML CDATA, so it allows entity
5856*6777b538SAndroid Build Coastguard Worker * references, but XML special chars need to be escaped first by using
5857*6777b538SAndroid Build Coastguard Worker * xmlEncodeEntitiesReentrant() resp. xmlEncodeSpecialChars().
5858*6777b538SAndroid Build Coastguard Worker *
5859*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, 1 on error, -1 if a memory allocation failed.
5860*6777b538SAndroid Build Coastguard Worker */
5861*6777b538SAndroid Build Coastguard Worker int
xmlNodeSetContentLen(xmlNodePtr cur,const xmlChar * content,int len)5862*6777b538SAndroid Build Coastguard Worker xmlNodeSetContentLen(xmlNodePtr cur, const xmlChar *content, int len) {
5863*6777b538SAndroid Build Coastguard Worker if (cur == NULL) {
5864*6777b538SAndroid Build Coastguard Worker return(1);
5865*6777b538SAndroid Build Coastguard Worker }
5866*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
5867*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
5868*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
5869*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE: {
5870*6777b538SAndroid Build Coastguard Worker xmlNodePtr list = NULL;
5871*6777b538SAndroid Build Coastguard Worker
5872*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
5873*6777b538SAndroid Build Coastguard Worker list = xmlStringLenGetNodeList(cur->doc, content, len);
5874*6777b538SAndroid Build Coastguard Worker if (list == NULL)
5875*6777b538SAndroid Build Coastguard Worker return(-1);
5876*6777b538SAndroid Build Coastguard Worker }
5877*6777b538SAndroid Build Coastguard Worker
5878*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL)
5879*6777b538SAndroid Build Coastguard Worker xmlFreeNodeList(cur->children);
5880*6777b538SAndroid Build Coastguard Worker cur->children = list;
5881*6777b538SAndroid Build Coastguard Worker UPDATE_LAST_CHILD_AND_PARENT(cur)
5882*6777b538SAndroid Build Coastguard Worker break;
5883*6777b538SAndroid Build Coastguard Worker }
5884*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5885*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5886*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
5887*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
5888*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
5889*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
5890*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE: {
5891*6777b538SAndroid Build Coastguard Worker xmlChar *copy = NULL;
5892*6777b538SAndroid Build Coastguard Worker
5893*6777b538SAndroid Build Coastguard Worker if (content != NULL) {
5894*6777b538SAndroid Build Coastguard Worker copy = xmlStrndup(content, len);
5895*6777b538SAndroid Build Coastguard Worker if (copy == NULL)
5896*6777b538SAndroid Build Coastguard Worker return(-1);
5897*6777b538SAndroid Build Coastguard Worker }
5898*6777b538SAndroid Build Coastguard Worker
5899*6777b538SAndroid Build Coastguard Worker if ((cur->content != NULL) &&
5900*6777b538SAndroid Build Coastguard Worker (cur->content != (xmlChar *) &(cur->properties))) {
5901*6777b538SAndroid Build Coastguard Worker if (!((cur->doc != NULL) && (cur->doc->dict != NULL) &&
5902*6777b538SAndroid Build Coastguard Worker (xmlDictOwns(cur->doc->dict, cur->content))))
5903*6777b538SAndroid Build Coastguard Worker xmlFree(cur->content);
5904*6777b538SAndroid Build Coastguard Worker }
5905*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL)
5906*6777b538SAndroid Build Coastguard Worker xmlFreeNodeList(cur->children);
5907*6777b538SAndroid Build Coastguard Worker cur->children = cur->last = NULL;
5908*6777b538SAndroid Build Coastguard Worker cur->content = copy;
5909*6777b538SAndroid Build Coastguard Worker cur->properties = NULL;
5910*6777b538SAndroid Build Coastguard Worker break;
5911*6777b538SAndroid Build Coastguard Worker }
5912*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
5913*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
5914*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
5915*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
5916*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL:
5917*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
5918*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
5919*6777b538SAndroid Build Coastguard Worker break;
5920*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
5921*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
5922*6777b538SAndroid Build Coastguard Worker break;
5923*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
5924*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
5925*6777b538SAndroid Build Coastguard Worker break;
5926*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
5927*6777b538SAndroid Build Coastguard Worker /* TODO !!! */
5928*6777b538SAndroid Build Coastguard Worker break;
5929*6777b538SAndroid Build Coastguard Worker }
5930*6777b538SAndroid Build Coastguard Worker
5931*6777b538SAndroid Build Coastguard Worker return(0);
5932*6777b538SAndroid Build Coastguard Worker }
5933*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
5934*6777b538SAndroid Build Coastguard Worker
5935*6777b538SAndroid Build Coastguard Worker /**
5936*6777b538SAndroid Build Coastguard Worker * xmlNodeAddContentLen:
5937*6777b538SAndroid Build Coastguard Worker * @cur: the node being modified
5938*6777b538SAndroid Build Coastguard Worker * @content: extra content
5939*6777b538SAndroid Build Coastguard Worker * @len: the size of @content
5940*6777b538SAndroid Build Coastguard Worker *
5941*6777b538SAndroid Build Coastguard Worker * Append the extra substring to the node content.
5942*6777b538SAndroid Build Coastguard Worker * NOTE: In contrast to xmlNodeSetContentLen(), @content is supposed to be
5943*6777b538SAndroid Build Coastguard Worker * raw text, so unescaped XML special chars are allowed, entity
5944*6777b538SAndroid Build Coastguard Worker * references are not supported.
5945*6777b538SAndroid Build Coastguard Worker *
5946*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, 1 on error, -1 if a memory allocation failed.
5947*6777b538SAndroid Build Coastguard Worker */
5948*6777b538SAndroid Build Coastguard Worker int
xmlNodeAddContentLen(xmlNodePtr cur,const xmlChar * content,int len)5949*6777b538SAndroid Build Coastguard Worker xmlNodeAddContentLen(xmlNodePtr cur, const xmlChar *content, int len) {
5950*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
5951*6777b538SAndroid Build Coastguard Worker return(1);
5952*6777b538SAndroid Build Coastguard Worker if ((content == NULL) || (len <= 0))
5953*6777b538SAndroid Build Coastguard Worker return(0);
5954*6777b538SAndroid Build Coastguard Worker
5955*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
5956*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
5957*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE: {
5958*6777b538SAndroid Build Coastguard Worker xmlNodePtr newNode, tmp;
5959*6777b538SAndroid Build Coastguard Worker
5960*6777b538SAndroid Build Coastguard Worker newNode = xmlNewDocTextLen(cur->doc, content, len);
5961*6777b538SAndroid Build Coastguard Worker if (newNode == NULL)
5962*6777b538SAndroid Build Coastguard Worker return(-1);
5963*6777b538SAndroid Build Coastguard Worker tmp = xmlAddChild(cur, newNode);
5964*6777b538SAndroid Build Coastguard Worker if (tmp == NULL)
5965*6777b538SAndroid Build Coastguard Worker return(-1);
5966*6777b538SAndroid Build Coastguard Worker break;
5967*6777b538SAndroid Build Coastguard Worker }
5968*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
5969*6777b538SAndroid Build Coastguard Worker break;
5970*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
5971*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
5972*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
5973*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
5974*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
5975*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
5976*6777b538SAndroid Build Coastguard Worker case XML_NOTATION_NODE: {
5977*6777b538SAndroid Build Coastguard Worker xmlChar *newContent = NULL;
5978*6777b538SAndroid Build Coastguard Worker
5979*6777b538SAndroid Build Coastguard Worker if ((cur->content == (xmlChar *) &(cur->properties)) ||
5980*6777b538SAndroid Build Coastguard Worker ((cur->doc != NULL) && (cur->doc->dict != NULL) &&
5981*6777b538SAndroid Build Coastguard Worker xmlDictOwns(cur->doc->dict, cur->content))) {
5982*6777b538SAndroid Build Coastguard Worker newContent = xmlStrncatNew(cur->content, content, len);
5983*6777b538SAndroid Build Coastguard Worker if (newContent == NULL)
5984*6777b538SAndroid Build Coastguard Worker return(-1);
5985*6777b538SAndroid Build Coastguard Worker cur->properties = NULL;
5986*6777b538SAndroid Build Coastguard Worker } else {
5987*6777b538SAndroid Build Coastguard Worker newContent = xmlStrncatNew(cur->content, content, len);
5988*6777b538SAndroid Build Coastguard Worker if (newContent == NULL)
5989*6777b538SAndroid Build Coastguard Worker return(-1);
5990*6777b538SAndroid Build Coastguard Worker xmlFree(cur->content);
5991*6777b538SAndroid Build Coastguard Worker }
5992*6777b538SAndroid Build Coastguard Worker cur->content = newContent;
5993*6777b538SAndroid Build Coastguard Worker break;
5994*6777b538SAndroid Build Coastguard Worker }
5995*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
5996*6777b538SAndroid Build Coastguard Worker case XML_DTD_NODE:
5997*6777b538SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
5998*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_TYPE_NODE:
5999*6777b538SAndroid Build Coastguard Worker case XML_NAMESPACE_DECL:
6000*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
6001*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
6002*6777b538SAndroid Build Coastguard Worker break;
6003*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
6004*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
6005*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_DECL:
6006*6777b538SAndroid Build Coastguard Worker break;
6007*6777b538SAndroid Build Coastguard Worker }
6008*6777b538SAndroid Build Coastguard Worker
6009*6777b538SAndroid Build Coastguard Worker return(0);
6010*6777b538SAndroid Build Coastguard Worker }
6011*6777b538SAndroid Build Coastguard Worker
6012*6777b538SAndroid Build Coastguard Worker /**
6013*6777b538SAndroid Build Coastguard Worker * xmlNodeAddContent:
6014*6777b538SAndroid Build Coastguard Worker * @cur: the node being modified
6015*6777b538SAndroid Build Coastguard Worker * @content: extra content
6016*6777b538SAndroid Build Coastguard Worker *
6017*6777b538SAndroid Build Coastguard Worker * Append the extra substring to the node content.
6018*6777b538SAndroid Build Coastguard Worker * NOTE: In contrast to xmlNodeSetContent(), @content is supposed to be
6019*6777b538SAndroid Build Coastguard Worker * raw text, so unescaped XML special chars are allowed, entity
6020*6777b538SAndroid Build Coastguard Worker * references are not supported.
6021*6777b538SAndroid Build Coastguard Worker *
6022*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, 1 on error, -1 if a memory allocation failed.
6023*6777b538SAndroid Build Coastguard Worker */
6024*6777b538SAndroid Build Coastguard Worker int
xmlNodeAddContent(xmlNodePtr cur,const xmlChar * content)6025*6777b538SAndroid Build Coastguard Worker xmlNodeAddContent(xmlNodePtr cur, const xmlChar *content) {
6026*6777b538SAndroid Build Coastguard Worker return(xmlNodeAddContentLen(cur, content, xmlStrlen(content)));
6027*6777b538SAndroid Build Coastguard Worker }
6028*6777b538SAndroid Build Coastguard Worker
6029*6777b538SAndroid Build Coastguard Worker /**
6030*6777b538SAndroid Build Coastguard Worker * xmlTextMerge:
6031*6777b538SAndroid Build Coastguard Worker * @first: the first text node
6032*6777b538SAndroid Build Coastguard Worker * @second: the second text node being merged
6033*6777b538SAndroid Build Coastguard Worker *
6034*6777b538SAndroid Build Coastguard Worker * Merge two text nodes into one
6035*6777b538SAndroid Build Coastguard Worker * Returns the first text node augmented
6036*6777b538SAndroid Build Coastguard Worker */
6037*6777b538SAndroid Build Coastguard Worker xmlNodePtr
xmlTextMerge(xmlNodePtr first,xmlNodePtr second)6038*6777b538SAndroid Build Coastguard Worker xmlTextMerge(xmlNodePtr first, xmlNodePtr second) {
6039*6777b538SAndroid Build Coastguard Worker if (first == NULL) return(second);
6040*6777b538SAndroid Build Coastguard Worker if (second == NULL) return(first);
6041*6777b538SAndroid Build Coastguard Worker if (first->type != XML_TEXT_NODE) return(first);
6042*6777b538SAndroid Build Coastguard Worker if (second->type != XML_TEXT_NODE) return(first);
6043*6777b538SAndroid Build Coastguard Worker if (second->name != first->name)
6044*6777b538SAndroid Build Coastguard Worker return(first);
6045*6777b538SAndroid Build Coastguard Worker xmlNodeAddContent(first, second->content);
6046*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(second);
6047*6777b538SAndroid Build Coastguard Worker xmlFreeNode(second);
6048*6777b538SAndroid Build Coastguard Worker return(first);
6049*6777b538SAndroid Build Coastguard Worker }
6050*6777b538SAndroid Build Coastguard Worker
6051*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
6052*6777b538SAndroid Build Coastguard Worker /**
6053*6777b538SAndroid Build Coastguard Worker * xmlGetNsList:
6054*6777b538SAndroid Build Coastguard Worker * @doc: the document
6055*6777b538SAndroid Build Coastguard Worker * @node: the current node
6056*6777b538SAndroid Build Coastguard Worker * @out: the returned namespace array
6057*6777b538SAndroid Build Coastguard Worker *
6058*6777b538SAndroid Build Coastguard Worker * Search all the namespace applying to a given element. @out returns
6059*6777b538SAndroid Build Coastguard Worker * a NULL terminated array of all the namespaces found that needs to be
6060*6777b538SAndroid Build Coastguard Worker * freed by the caller allocation failed.
6061*6777b538SAndroid Build Coastguard Worker *
6062*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, 1 if no namespace were found, -1 if a memory
6063*6777b538SAndroid Build Coastguard Worker * allocation failed.
6064*6777b538SAndroid Build Coastguard Worker */
6065*6777b538SAndroid Build Coastguard Worker int
xmlGetNsListSafe(const xmlDoc * doc ATTRIBUTE_UNUSED,const xmlNode * node,xmlNsPtr ** out)6066*6777b538SAndroid Build Coastguard Worker xmlGetNsListSafe(const xmlDoc *doc ATTRIBUTE_UNUSED, const xmlNode *node,
6067*6777b538SAndroid Build Coastguard Worker xmlNsPtr **out)
6068*6777b538SAndroid Build Coastguard Worker {
6069*6777b538SAndroid Build Coastguard Worker xmlNsPtr cur;
6070*6777b538SAndroid Build Coastguard Worker xmlNsPtr *namespaces = NULL;
6071*6777b538SAndroid Build Coastguard Worker int nbns = 0;
6072*6777b538SAndroid Build Coastguard Worker int maxns = 0;
6073*6777b538SAndroid Build Coastguard Worker int i;
6074*6777b538SAndroid Build Coastguard Worker
6075*6777b538SAndroid Build Coastguard Worker if (out == NULL)
6076*6777b538SAndroid Build Coastguard Worker return(1);
6077*6777b538SAndroid Build Coastguard Worker *out = NULL;
6078*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type == XML_NAMESPACE_DECL))
6079*6777b538SAndroid Build Coastguard Worker return(1);
6080*6777b538SAndroid Build Coastguard Worker
6081*6777b538SAndroid Build Coastguard Worker while (node != NULL) {
6082*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE) {
6083*6777b538SAndroid Build Coastguard Worker cur = node->nsDef;
6084*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
6085*6777b538SAndroid Build Coastguard Worker for (i = 0; i < nbns; i++) {
6086*6777b538SAndroid Build Coastguard Worker if ((cur->prefix == namespaces[i]->prefix) ||
6087*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->prefix, namespaces[i]->prefix)))
6088*6777b538SAndroid Build Coastguard Worker break;
6089*6777b538SAndroid Build Coastguard Worker }
6090*6777b538SAndroid Build Coastguard Worker if (i >= nbns) {
6091*6777b538SAndroid Build Coastguard Worker if (nbns >= maxns) {
6092*6777b538SAndroid Build Coastguard Worker xmlNsPtr *tmp;
6093*6777b538SAndroid Build Coastguard Worker
6094*6777b538SAndroid Build Coastguard Worker maxns = maxns ? maxns * 2 : 10;
6095*6777b538SAndroid Build Coastguard Worker tmp = (xmlNsPtr *) xmlRealloc(namespaces,
6096*6777b538SAndroid Build Coastguard Worker (maxns + 1) *
6097*6777b538SAndroid Build Coastguard Worker sizeof(xmlNsPtr));
6098*6777b538SAndroid Build Coastguard Worker if (tmp == NULL) {
6099*6777b538SAndroid Build Coastguard Worker xmlFree(namespaces);
6100*6777b538SAndroid Build Coastguard Worker return(-1);
6101*6777b538SAndroid Build Coastguard Worker }
6102*6777b538SAndroid Build Coastguard Worker namespaces = tmp;
6103*6777b538SAndroid Build Coastguard Worker }
6104*6777b538SAndroid Build Coastguard Worker namespaces[nbns++] = cur;
6105*6777b538SAndroid Build Coastguard Worker namespaces[nbns] = NULL;
6106*6777b538SAndroid Build Coastguard Worker }
6107*6777b538SAndroid Build Coastguard Worker
6108*6777b538SAndroid Build Coastguard Worker cur = cur->next;
6109*6777b538SAndroid Build Coastguard Worker }
6110*6777b538SAndroid Build Coastguard Worker }
6111*6777b538SAndroid Build Coastguard Worker node = node->parent;
6112*6777b538SAndroid Build Coastguard Worker }
6113*6777b538SAndroid Build Coastguard Worker
6114*6777b538SAndroid Build Coastguard Worker *out = namespaces;
6115*6777b538SAndroid Build Coastguard Worker return((namespaces == NULL) ? 1 : 0);
6116*6777b538SAndroid Build Coastguard Worker }
6117*6777b538SAndroid Build Coastguard Worker
6118*6777b538SAndroid Build Coastguard Worker /**
6119*6777b538SAndroid Build Coastguard Worker * xmlGetNsList:
6120*6777b538SAndroid Build Coastguard Worker * @doc: the document
6121*6777b538SAndroid Build Coastguard Worker * @node: the current node
6122*6777b538SAndroid Build Coastguard Worker *
6123*6777b538SAndroid Build Coastguard Worker * Search all the namespace applying to a given element.
6124*6777b538SAndroid Build Coastguard Worker * Returns an NULL terminated array of all the #xmlNsPtr found
6125*6777b538SAndroid Build Coastguard Worker * that need to be freed by the caller or NULL if a memory
6126*6777b538SAndroid Build Coastguard Worker * allocation failed
6127*6777b538SAndroid Build Coastguard Worker */
6128*6777b538SAndroid Build Coastguard Worker xmlNsPtr *
xmlGetNsList(const xmlDoc * doc,const xmlNode * node)6129*6777b538SAndroid Build Coastguard Worker xmlGetNsList(const xmlDoc *doc, const xmlNode *node)
6130*6777b538SAndroid Build Coastguard Worker {
6131*6777b538SAndroid Build Coastguard Worker xmlNsPtr *ret;
6132*6777b538SAndroid Build Coastguard Worker
6133*6777b538SAndroid Build Coastguard Worker xmlGetNsListSafe(doc, node, &ret);
6134*6777b538SAndroid Build Coastguard Worker return(ret);
6135*6777b538SAndroid Build Coastguard Worker }
6136*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
6137*6777b538SAndroid Build Coastguard Worker
6138*6777b538SAndroid Build Coastguard Worker /*
6139*6777b538SAndroid Build Coastguard Worker * xmlTreeEnsureXMLDecl:
6140*6777b538SAndroid Build Coastguard Worker * @doc: the doc
6141*6777b538SAndroid Build Coastguard Worker *
6142*6777b538SAndroid Build Coastguard Worker * Ensures that there is an XML namespace declaration on the doc.
6143*6777b538SAndroid Build Coastguard Worker *
6144*6777b538SAndroid Build Coastguard Worker * Returns the XML ns-struct or NULL if a memory allocation failed.
6145*6777b538SAndroid Build Coastguard Worker */
6146*6777b538SAndroid Build Coastguard Worker xmlNsPtr
xmlTreeEnsureXMLDecl(xmlDocPtr doc)6147*6777b538SAndroid Build Coastguard Worker xmlTreeEnsureXMLDecl(xmlDocPtr doc)
6148*6777b538SAndroid Build Coastguard Worker {
6149*6777b538SAndroid Build Coastguard Worker if (doc == NULL)
6150*6777b538SAndroid Build Coastguard Worker return (NULL);
6151*6777b538SAndroid Build Coastguard Worker if (doc->oldNs != NULL)
6152*6777b538SAndroid Build Coastguard Worker return (doc->oldNs);
6153*6777b538SAndroid Build Coastguard Worker {
6154*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
6155*6777b538SAndroid Build Coastguard Worker ns = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
6156*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
6157*6777b538SAndroid Build Coastguard Worker return(NULL);
6158*6777b538SAndroid Build Coastguard Worker memset(ns, 0, sizeof(xmlNs));
6159*6777b538SAndroid Build Coastguard Worker ns->type = XML_LOCAL_NAMESPACE;
6160*6777b538SAndroid Build Coastguard Worker ns->href = xmlStrdup(XML_XML_NAMESPACE);
6161*6777b538SAndroid Build Coastguard Worker if (ns->href == NULL) {
6162*6777b538SAndroid Build Coastguard Worker xmlFreeNs(ns);
6163*6777b538SAndroid Build Coastguard Worker return(NULL);
6164*6777b538SAndroid Build Coastguard Worker }
6165*6777b538SAndroid Build Coastguard Worker ns->prefix = xmlStrdup((const xmlChar *)"xml");
6166*6777b538SAndroid Build Coastguard Worker if (ns->prefix == NULL) {
6167*6777b538SAndroid Build Coastguard Worker xmlFreeNs(ns);
6168*6777b538SAndroid Build Coastguard Worker return(NULL);
6169*6777b538SAndroid Build Coastguard Worker }
6170*6777b538SAndroid Build Coastguard Worker doc->oldNs = ns;
6171*6777b538SAndroid Build Coastguard Worker return (ns);
6172*6777b538SAndroid Build Coastguard Worker }
6173*6777b538SAndroid Build Coastguard Worker }
6174*6777b538SAndroid Build Coastguard Worker
6175*6777b538SAndroid Build Coastguard Worker /**
6176*6777b538SAndroid Build Coastguard Worker * xmlSearchNs:
6177*6777b538SAndroid Build Coastguard Worker * @doc: the document
6178*6777b538SAndroid Build Coastguard Worker * @node: the current node
6179*6777b538SAndroid Build Coastguard Worker * @nameSpace: the namespace prefix
6180*6777b538SAndroid Build Coastguard Worker *
6181*6777b538SAndroid Build Coastguard Worker * Search a Ns registered under a given name space for a document.
6182*6777b538SAndroid Build Coastguard Worker * recurse on the parents until it finds the defined namespace
6183*6777b538SAndroid Build Coastguard Worker * or return NULL otherwise.
6184*6777b538SAndroid Build Coastguard Worker * @nameSpace can be NULL, this is a search for the default namespace.
6185*6777b538SAndroid Build Coastguard Worker * We don't allow to cross entities boundaries. If you don't declare
6186*6777b538SAndroid Build Coastguard Worker * the namespace within those you will be in troubles !!! A warning
6187*6777b538SAndroid Build Coastguard Worker * is generated to cover this case.
6188*6777b538SAndroid Build Coastguard Worker *
6189*6777b538SAndroid Build Coastguard Worker * Returns the namespace pointer or NULL if no namespace was found or
6190*6777b538SAndroid Build Coastguard Worker * a memory allocation failed. Allocations can only fail if the "xml"
6191*6777b538SAndroid Build Coastguard Worker * namespace is queried and xmlTreeEnsureXMLDecl wasn't called
6192*6777b538SAndroid Build Coastguard Worker * successfully or doc is NULL.
6193*6777b538SAndroid Build Coastguard Worker */
6194*6777b538SAndroid Build Coastguard Worker xmlNsPtr
xmlSearchNs(xmlDocPtr doc,xmlNodePtr node,const xmlChar * nameSpace)6195*6777b538SAndroid Build Coastguard Worker xmlSearchNs(xmlDocPtr doc, xmlNodePtr node, const xmlChar *nameSpace) {
6196*6777b538SAndroid Build Coastguard Worker
6197*6777b538SAndroid Build Coastguard Worker xmlNsPtr cur;
6198*6777b538SAndroid Build Coastguard Worker const xmlNode *orig = node;
6199*6777b538SAndroid Build Coastguard Worker
6200*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) return(NULL);
6201*6777b538SAndroid Build Coastguard Worker if ((nameSpace != NULL) &&
6202*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(nameSpace, (const xmlChar *)"xml"))) {
6203*6777b538SAndroid Build Coastguard Worker if ((doc == NULL) && (node->type == XML_ELEMENT_NODE)) {
6204*6777b538SAndroid Build Coastguard Worker /*
6205*6777b538SAndroid Build Coastguard Worker * The XML-1.0 namespace is normally held on the root
6206*6777b538SAndroid Build Coastguard Worker * element. In this case exceptionally create it on the
6207*6777b538SAndroid Build Coastguard Worker * node element.
6208*6777b538SAndroid Build Coastguard Worker */
6209*6777b538SAndroid Build Coastguard Worker cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
6210*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
6211*6777b538SAndroid Build Coastguard Worker return(NULL);
6212*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNs));
6213*6777b538SAndroid Build Coastguard Worker cur->type = XML_LOCAL_NAMESPACE;
6214*6777b538SAndroid Build Coastguard Worker cur->href = xmlStrdup(XML_XML_NAMESPACE);
6215*6777b538SAndroid Build Coastguard Worker cur->prefix = xmlStrdup((const xmlChar *)"xml");
6216*6777b538SAndroid Build Coastguard Worker cur->next = node->nsDef;
6217*6777b538SAndroid Build Coastguard Worker node->nsDef = cur;
6218*6777b538SAndroid Build Coastguard Worker return(cur);
6219*6777b538SAndroid Build Coastguard Worker }
6220*6777b538SAndroid Build Coastguard Worker if (doc == NULL) {
6221*6777b538SAndroid Build Coastguard Worker doc = node->doc;
6222*6777b538SAndroid Build Coastguard Worker if (doc == NULL)
6223*6777b538SAndroid Build Coastguard Worker return(NULL);
6224*6777b538SAndroid Build Coastguard Worker }
6225*6777b538SAndroid Build Coastguard Worker /*
6226*6777b538SAndroid Build Coastguard Worker * Return the XML namespace declaration held by the doc.
6227*6777b538SAndroid Build Coastguard Worker */
6228*6777b538SAndroid Build Coastguard Worker if (doc->oldNs == NULL)
6229*6777b538SAndroid Build Coastguard Worker return(xmlTreeEnsureXMLDecl(doc));
6230*6777b538SAndroid Build Coastguard Worker else
6231*6777b538SAndroid Build Coastguard Worker return(doc->oldNs);
6232*6777b538SAndroid Build Coastguard Worker }
6233*6777b538SAndroid Build Coastguard Worker while (node != NULL) {
6234*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_ENTITY_REF_NODE) ||
6235*6777b538SAndroid Build Coastguard Worker (node->type == XML_ENTITY_NODE) ||
6236*6777b538SAndroid Build Coastguard Worker (node->type == XML_ENTITY_DECL))
6237*6777b538SAndroid Build Coastguard Worker return(NULL);
6238*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE) {
6239*6777b538SAndroid Build Coastguard Worker cur = node->nsDef;
6240*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
6241*6777b538SAndroid Build Coastguard Worker if ((cur->prefix == NULL) && (nameSpace == NULL) &&
6242*6777b538SAndroid Build Coastguard Worker (cur->href != NULL))
6243*6777b538SAndroid Build Coastguard Worker return(cur);
6244*6777b538SAndroid Build Coastguard Worker if ((cur->prefix != NULL) && (nameSpace != NULL) &&
6245*6777b538SAndroid Build Coastguard Worker (cur->href != NULL) &&
6246*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->prefix, nameSpace)))
6247*6777b538SAndroid Build Coastguard Worker return(cur);
6248*6777b538SAndroid Build Coastguard Worker cur = cur->next;
6249*6777b538SAndroid Build Coastguard Worker }
6250*6777b538SAndroid Build Coastguard Worker if (orig != node) {
6251*6777b538SAndroid Build Coastguard Worker cur = node->ns;
6252*6777b538SAndroid Build Coastguard Worker if (cur != NULL) {
6253*6777b538SAndroid Build Coastguard Worker if ((cur->prefix == NULL) && (nameSpace == NULL) &&
6254*6777b538SAndroid Build Coastguard Worker (cur->href != NULL))
6255*6777b538SAndroid Build Coastguard Worker return(cur);
6256*6777b538SAndroid Build Coastguard Worker if ((cur->prefix != NULL) && (nameSpace != NULL) &&
6257*6777b538SAndroid Build Coastguard Worker (cur->href != NULL) &&
6258*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->prefix, nameSpace)))
6259*6777b538SAndroid Build Coastguard Worker return(cur);
6260*6777b538SAndroid Build Coastguard Worker }
6261*6777b538SAndroid Build Coastguard Worker }
6262*6777b538SAndroid Build Coastguard Worker }
6263*6777b538SAndroid Build Coastguard Worker node = node->parent;
6264*6777b538SAndroid Build Coastguard Worker }
6265*6777b538SAndroid Build Coastguard Worker return(NULL);
6266*6777b538SAndroid Build Coastguard Worker }
6267*6777b538SAndroid Build Coastguard Worker
6268*6777b538SAndroid Build Coastguard Worker /**
6269*6777b538SAndroid Build Coastguard Worker * xmlNsInScope:
6270*6777b538SAndroid Build Coastguard Worker * @doc: the document
6271*6777b538SAndroid Build Coastguard Worker * @node: the current node
6272*6777b538SAndroid Build Coastguard Worker * @ancestor: the ancestor carrying the namespace
6273*6777b538SAndroid Build Coastguard Worker * @prefix: the namespace prefix
6274*6777b538SAndroid Build Coastguard Worker *
6275*6777b538SAndroid Build Coastguard Worker * Verify that the given namespace held on @ancestor is still in scope
6276*6777b538SAndroid Build Coastguard Worker * on node.
6277*6777b538SAndroid Build Coastguard Worker *
6278*6777b538SAndroid Build Coastguard Worker * Returns 1 if true, 0 if false and -1 in case of error.
6279*6777b538SAndroid Build Coastguard Worker */
6280*6777b538SAndroid Build Coastguard Worker static int
xmlNsInScope(xmlDocPtr doc ATTRIBUTE_UNUSED,xmlNodePtr node,xmlNodePtr ancestor,const xmlChar * prefix)6281*6777b538SAndroid Build Coastguard Worker xmlNsInScope(xmlDocPtr doc ATTRIBUTE_UNUSED, xmlNodePtr node,
6282*6777b538SAndroid Build Coastguard Worker xmlNodePtr ancestor, const xmlChar * prefix)
6283*6777b538SAndroid Build Coastguard Worker {
6284*6777b538SAndroid Build Coastguard Worker xmlNsPtr tst;
6285*6777b538SAndroid Build Coastguard Worker
6286*6777b538SAndroid Build Coastguard Worker while ((node != NULL) && (node != ancestor)) {
6287*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_ENTITY_REF_NODE) ||
6288*6777b538SAndroid Build Coastguard Worker (node->type == XML_ENTITY_NODE) ||
6289*6777b538SAndroid Build Coastguard Worker (node->type == XML_ENTITY_DECL))
6290*6777b538SAndroid Build Coastguard Worker return (-1);
6291*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE) {
6292*6777b538SAndroid Build Coastguard Worker tst = node->nsDef;
6293*6777b538SAndroid Build Coastguard Worker while (tst != NULL) {
6294*6777b538SAndroid Build Coastguard Worker if ((tst->prefix == NULL)
6295*6777b538SAndroid Build Coastguard Worker && (prefix == NULL))
6296*6777b538SAndroid Build Coastguard Worker return (0);
6297*6777b538SAndroid Build Coastguard Worker if ((tst->prefix != NULL)
6298*6777b538SAndroid Build Coastguard Worker && (prefix != NULL)
6299*6777b538SAndroid Build Coastguard Worker && (xmlStrEqual(tst->prefix, prefix)))
6300*6777b538SAndroid Build Coastguard Worker return (0);
6301*6777b538SAndroid Build Coastguard Worker tst = tst->next;
6302*6777b538SAndroid Build Coastguard Worker }
6303*6777b538SAndroid Build Coastguard Worker }
6304*6777b538SAndroid Build Coastguard Worker node = node->parent;
6305*6777b538SAndroid Build Coastguard Worker }
6306*6777b538SAndroid Build Coastguard Worker if (node != ancestor)
6307*6777b538SAndroid Build Coastguard Worker return (-1);
6308*6777b538SAndroid Build Coastguard Worker return (1);
6309*6777b538SAndroid Build Coastguard Worker }
6310*6777b538SAndroid Build Coastguard Worker
6311*6777b538SAndroid Build Coastguard Worker /**
6312*6777b538SAndroid Build Coastguard Worker * xmlSearchNsByHref:
6313*6777b538SAndroid Build Coastguard Worker * @doc: the document
6314*6777b538SAndroid Build Coastguard Worker * @node: the current node
6315*6777b538SAndroid Build Coastguard Worker * @href: the namespace value
6316*6777b538SAndroid Build Coastguard Worker *
6317*6777b538SAndroid Build Coastguard Worker * Search a Ns aliasing a given URI. Recurse on the parents until it finds
6318*6777b538SAndroid Build Coastguard Worker * the defined namespace or return NULL otherwise.
6319*6777b538SAndroid Build Coastguard Worker *
6320*6777b538SAndroid Build Coastguard Worker * Returns the namespace pointer or NULL if no namespace was found or
6321*6777b538SAndroid Build Coastguard Worker * a memory allocation failed. Allocations can only fail if the "xml"
6322*6777b538SAndroid Build Coastguard Worker * namespace is queried and xmlTreeEnsureXMLDecl wasn't called
6323*6777b538SAndroid Build Coastguard Worker * successfully or doc is NULL.
6324*6777b538SAndroid Build Coastguard Worker */
6325*6777b538SAndroid Build Coastguard Worker xmlNsPtr
xmlSearchNsByHref(xmlDocPtr doc,xmlNodePtr node,const xmlChar * href)6326*6777b538SAndroid Build Coastguard Worker xmlSearchNsByHref(xmlDocPtr doc, xmlNodePtr node, const xmlChar * href)
6327*6777b538SAndroid Build Coastguard Worker {
6328*6777b538SAndroid Build Coastguard Worker xmlNsPtr cur;
6329*6777b538SAndroid Build Coastguard Worker xmlNodePtr orig = node;
6330*6777b538SAndroid Build Coastguard Worker int is_attr;
6331*6777b538SAndroid Build Coastguard Worker
6332*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type == XML_NAMESPACE_DECL) || (href == NULL))
6333*6777b538SAndroid Build Coastguard Worker return (NULL);
6334*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(href, XML_XML_NAMESPACE)) {
6335*6777b538SAndroid Build Coastguard Worker /*
6336*6777b538SAndroid Build Coastguard Worker * Only the document can hold the XML spec namespace.
6337*6777b538SAndroid Build Coastguard Worker */
6338*6777b538SAndroid Build Coastguard Worker if ((doc == NULL) && (node->type == XML_ELEMENT_NODE)) {
6339*6777b538SAndroid Build Coastguard Worker /*
6340*6777b538SAndroid Build Coastguard Worker * The XML-1.0 namespace is normally held on the root
6341*6777b538SAndroid Build Coastguard Worker * element. In this case exceptionally create it on the
6342*6777b538SAndroid Build Coastguard Worker * node element.
6343*6777b538SAndroid Build Coastguard Worker */
6344*6777b538SAndroid Build Coastguard Worker cur = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
6345*6777b538SAndroid Build Coastguard Worker if (cur == NULL)
6346*6777b538SAndroid Build Coastguard Worker return (NULL);
6347*6777b538SAndroid Build Coastguard Worker memset(cur, 0, sizeof(xmlNs));
6348*6777b538SAndroid Build Coastguard Worker cur->type = XML_LOCAL_NAMESPACE;
6349*6777b538SAndroid Build Coastguard Worker cur->href = xmlStrdup(XML_XML_NAMESPACE);
6350*6777b538SAndroid Build Coastguard Worker cur->prefix = xmlStrdup((const xmlChar *) "xml");
6351*6777b538SAndroid Build Coastguard Worker cur->next = node->nsDef;
6352*6777b538SAndroid Build Coastguard Worker node->nsDef = cur;
6353*6777b538SAndroid Build Coastguard Worker return (cur);
6354*6777b538SAndroid Build Coastguard Worker }
6355*6777b538SAndroid Build Coastguard Worker if (doc == NULL) {
6356*6777b538SAndroid Build Coastguard Worker doc = node->doc;
6357*6777b538SAndroid Build Coastguard Worker if (doc == NULL)
6358*6777b538SAndroid Build Coastguard Worker return(NULL);
6359*6777b538SAndroid Build Coastguard Worker }
6360*6777b538SAndroid Build Coastguard Worker /*
6361*6777b538SAndroid Build Coastguard Worker * Return the XML namespace declaration held by the doc.
6362*6777b538SAndroid Build Coastguard Worker */
6363*6777b538SAndroid Build Coastguard Worker if (doc->oldNs == NULL)
6364*6777b538SAndroid Build Coastguard Worker return(xmlTreeEnsureXMLDecl(doc));
6365*6777b538SAndroid Build Coastguard Worker else
6366*6777b538SAndroid Build Coastguard Worker return(doc->oldNs);
6367*6777b538SAndroid Build Coastguard Worker }
6368*6777b538SAndroid Build Coastguard Worker is_attr = (node->type == XML_ATTRIBUTE_NODE);
6369*6777b538SAndroid Build Coastguard Worker while (node != NULL) {
6370*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_ENTITY_REF_NODE) ||
6371*6777b538SAndroid Build Coastguard Worker (node->type == XML_ENTITY_NODE) ||
6372*6777b538SAndroid Build Coastguard Worker (node->type == XML_ENTITY_DECL))
6373*6777b538SAndroid Build Coastguard Worker return (NULL);
6374*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE) {
6375*6777b538SAndroid Build Coastguard Worker cur = node->nsDef;
6376*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
6377*6777b538SAndroid Build Coastguard Worker if ((cur->href != NULL) && (href != NULL) &&
6378*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->href, href))) {
6379*6777b538SAndroid Build Coastguard Worker if (((!is_attr) || (cur->prefix != NULL)) &&
6380*6777b538SAndroid Build Coastguard Worker (xmlNsInScope(doc, orig, node, cur->prefix) == 1))
6381*6777b538SAndroid Build Coastguard Worker return (cur);
6382*6777b538SAndroid Build Coastguard Worker }
6383*6777b538SAndroid Build Coastguard Worker cur = cur->next;
6384*6777b538SAndroid Build Coastguard Worker }
6385*6777b538SAndroid Build Coastguard Worker if (orig != node) {
6386*6777b538SAndroid Build Coastguard Worker cur = node->ns;
6387*6777b538SAndroid Build Coastguard Worker if (cur != NULL) {
6388*6777b538SAndroid Build Coastguard Worker if ((cur->href != NULL) && (href != NULL) &&
6389*6777b538SAndroid Build Coastguard Worker (xmlStrEqual(cur->href, href))) {
6390*6777b538SAndroid Build Coastguard Worker if (((!is_attr) || (cur->prefix != NULL)) &&
6391*6777b538SAndroid Build Coastguard Worker (xmlNsInScope(doc, orig, node, cur->prefix) == 1))
6392*6777b538SAndroid Build Coastguard Worker return (cur);
6393*6777b538SAndroid Build Coastguard Worker }
6394*6777b538SAndroid Build Coastguard Worker }
6395*6777b538SAndroid Build Coastguard Worker }
6396*6777b538SAndroid Build Coastguard Worker }
6397*6777b538SAndroid Build Coastguard Worker node = node->parent;
6398*6777b538SAndroid Build Coastguard Worker }
6399*6777b538SAndroid Build Coastguard Worker return (NULL);
6400*6777b538SAndroid Build Coastguard Worker }
6401*6777b538SAndroid Build Coastguard Worker
6402*6777b538SAndroid Build Coastguard Worker /**
6403*6777b538SAndroid Build Coastguard Worker * xmlNewReconciledNs:
6404*6777b538SAndroid Build Coastguard Worker * @doc: the document
6405*6777b538SAndroid Build Coastguard Worker * @tree: a node expected to hold the new namespace
6406*6777b538SAndroid Build Coastguard Worker * @ns: the original namespace
6407*6777b538SAndroid Build Coastguard Worker *
6408*6777b538SAndroid Build Coastguard Worker * This function tries to locate a namespace definition in a tree
6409*6777b538SAndroid Build Coastguard Worker * ancestors, or create a new namespace definition node similar to
6410*6777b538SAndroid Build Coastguard Worker * @ns trying to reuse the same prefix. However if the given prefix is
6411*6777b538SAndroid Build Coastguard Worker * null (default namespace) or reused within the subtree defined by
6412*6777b538SAndroid Build Coastguard Worker * @tree or on one of its ancestors then a new prefix is generated.
6413*6777b538SAndroid Build Coastguard Worker * Returns the (new) namespace definition or NULL in case of error
6414*6777b538SAndroid Build Coastguard Worker */
6415*6777b538SAndroid Build Coastguard Worker static xmlNsPtr
xmlNewReconciledNs(xmlDocPtr doc,xmlNodePtr tree,xmlNsPtr ns)6416*6777b538SAndroid Build Coastguard Worker xmlNewReconciledNs(xmlDocPtr doc, xmlNodePtr tree, xmlNsPtr ns) {
6417*6777b538SAndroid Build Coastguard Worker xmlNsPtr def;
6418*6777b538SAndroid Build Coastguard Worker xmlChar prefix[50];
6419*6777b538SAndroid Build Coastguard Worker int counter = 1;
6420*6777b538SAndroid Build Coastguard Worker
6421*6777b538SAndroid Build Coastguard Worker if ((tree == NULL) || (tree->type != XML_ELEMENT_NODE)) {
6422*6777b538SAndroid Build Coastguard Worker return(NULL);
6423*6777b538SAndroid Build Coastguard Worker }
6424*6777b538SAndroid Build Coastguard Worker if ((ns == NULL) || (ns->type != XML_NAMESPACE_DECL)) {
6425*6777b538SAndroid Build Coastguard Worker return(NULL);
6426*6777b538SAndroid Build Coastguard Worker }
6427*6777b538SAndroid Build Coastguard Worker /*
6428*6777b538SAndroid Build Coastguard Worker * Search an existing namespace definition inherited.
6429*6777b538SAndroid Build Coastguard Worker */
6430*6777b538SAndroid Build Coastguard Worker def = xmlSearchNsByHref(doc, tree, ns->href);
6431*6777b538SAndroid Build Coastguard Worker if (def != NULL)
6432*6777b538SAndroid Build Coastguard Worker return(def);
6433*6777b538SAndroid Build Coastguard Worker
6434*6777b538SAndroid Build Coastguard Worker /*
6435*6777b538SAndroid Build Coastguard Worker * Find a close prefix which is not already in use.
6436*6777b538SAndroid Build Coastguard Worker * Let's strip namespace prefixes longer than 20 chars !
6437*6777b538SAndroid Build Coastguard Worker */
6438*6777b538SAndroid Build Coastguard Worker if (ns->prefix == NULL)
6439*6777b538SAndroid Build Coastguard Worker snprintf((char *) prefix, sizeof(prefix), "default");
6440*6777b538SAndroid Build Coastguard Worker else
6441*6777b538SAndroid Build Coastguard Worker snprintf((char *) prefix, sizeof(prefix), "%.20s", (char *)ns->prefix);
6442*6777b538SAndroid Build Coastguard Worker
6443*6777b538SAndroid Build Coastguard Worker def = xmlSearchNs(doc, tree, prefix);
6444*6777b538SAndroid Build Coastguard Worker while (def != NULL) {
6445*6777b538SAndroid Build Coastguard Worker if (counter > 1000) return(NULL);
6446*6777b538SAndroid Build Coastguard Worker if (ns->prefix == NULL)
6447*6777b538SAndroid Build Coastguard Worker snprintf((char *) prefix, sizeof(prefix), "default%d", counter++);
6448*6777b538SAndroid Build Coastguard Worker else
6449*6777b538SAndroid Build Coastguard Worker snprintf((char *) prefix, sizeof(prefix), "%.20s%d",
6450*6777b538SAndroid Build Coastguard Worker (char *)ns->prefix, counter++);
6451*6777b538SAndroid Build Coastguard Worker def = xmlSearchNs(doc, tree, prefix);
6452*6777b538SAndroid Build Coastguard Worker }
6453*6777b538SAndroid Build Coastguard Worker
6454*6777b538SAndroid Build Coastguard Worker /*
6455*6777b538SAndroid Build Coastguard Worker * OK, now we are ready to create a new one.
6456*6777b538SAndroid Build Coastguard Worker */
6457*6777b538SAndroid Build Coastguard Worker def = xmlNewNs(tree, ns->href, prefix);
6458*6777b538SAndroid Build Coastguard Worker return(def);
6459*6777b538SAndroid Build Coastguard Worker }
6460*6777b538SAndroid Build Coastguard Worker
6461*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
6462*6777b538SAndroid Build Coastguard Worker /**
6463*6777b538SAndroid Build Coastguard Worker * xmlReconciliateNs:
6464*6777b538SAndroid Build Coastguard Worker * @doc: the document
6465*6777b538SAndroid Build Coastguard Worker * @tree: a node defining the subtree to reconciliate
6466*6777b538SAndroid Build Coastguard Worker *
6467*6777b538SAndroid Build Coastguard Worker * This function checks that all the namespaces declared within the given
6468*6777b538SAndroid Build Coastguard Worker * tree are properly declared. This is needed for example after Copy or Cut
6469*6777b538SAndroid Build Coastguard Worker * and then paste operations. The subtree may still hold pointers to
6470*6777b538SAndroid Build Coastguard Worker * namespace declarations outside the subtree or invalid/masked. As much
6471*6777b538SAndroid Build Coastguard Worker * as possible the function try to reuse the existing namespaces found in
6472*6777b538SAndroid Build Coastguard Worker * the new environment. If not possible the new namespaces are redeclared
6473*6777b538SAndroid Build Coastguard Worker * on @tree at the top of the given subtree.
6474*6777b538SAndroid Build Coastguard Worker * Returns the number of namespace declarations created or -1 in case of error.
6475*6777b538SAndroid Build Coastguard Worker */
6476*6777b538SAndroid Build Coastguard Worker int
xmlReconciliateNs(xmlDocPtr doc,xmlNodePtr tree)6477*6777b538SAndroid Build Coastguard Worker xmlReconciliateNs(xmlDocPtr doc, xmlNodePtr tree) {
6478*6777b538SAndroid Build Coastguard Worker xmlNsPtr *oldNs = NULL;
6479*6777b538SAndroid Build Coastguard Worker xmlNsPtr *newNs = NULL;
6480*6777b538SAndroid Build Coastguard Worker int sizeCache = 0;
6481*6777b538SAndroid Build Coastguard Worker int nbCache = 0;
6482*6777b538SAndroid Build Coastguard Worker
6483*6777b538SAndroid Build Coastguard Worker xmlNsPtr n;
6484*6777b538SAndroid Build Coastguard Worker xmlNodePtr node = tree;
6485*6777b538SAndroid Build Coastguard Worker xmlAttrPtr attr;
6486*6777b538SAndroid Build Coastguard Worker int ret = 0, i;
6487*6777b538SAndroid Build Coastguard Worker
6488*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) return(-1);
6489*6777b538SAndroid Build Coastguard Worker if ((doc == NULL) || (doc->type != XML_DOCUMENT_NODE)) return(-1);
6490*6777b538SAndroid Build Coastguard Worker if (node->doc != doc) return(-1);
6491*6777b538SAndroid Build Coastguard Worker while (node != NULL) {
6492*6777b538SAndroid Build Coastguard Worker /*
6493*6777b538SAndroid Build Coastguard Worker * Reconciliate the node namespace
6494*6777b538SAndroid Build Coastguard Worker */
6495*6777b538SAndroid Build Coastguard Worker if (node->ns != NULL) {
6496*6777b538SAndroid Build Coastguard Worker /*
6497*6777b538SAndroid Build Coastguard Worker * initialize the cache if needed
6498*6777b538SAndroid Build Coastguard Worker */
6499*6777b538SAndroid Build Coastguard Worker if (sizeCache == 0) {
6500*6777b538SAndroid Build Coastguard Worker sizeCache = 10;
6501*6777b538SAndroid Build Coastguard Worker oldNs = (xmlNsPtr *) xmlMalloc(sizeCache *
6502*6777b538SAndroid Build Coastguard Worker sizeof(xmlNsPtr));
6503*6777b538SAndroid Build Coastguard Worker if (oldNs == NULL)
6504*6777b538SAndroid Build Coastguard Worker return(-1);
6505*6777b538SAndroid Build Coastguard Worker newNs = (xmlNsPtr *) xmlMalloc(sizeCache *
6506*6777b538SAndroid Build Coastguard Worker sizeof(xmlNsPtr));
6507*6777b538SAndroid Build Coastguard Worker if (newNs == NULL) {
6508*6777b538SAndroid Build Coastguard Worker xmlFree(oldNs);
6509*6777b538SAndroid Build Coastguard Worker return(-1);
6510*6777b538SAndroid Build Coastguard Worker }
6511*6777b538SAndroid Build Coastguard Worker }
6512*6777b538SAndroid Build Coastguard Worker for (i = 0;i < nbCache;i++) {
6513*6777b538SAndroid Build Coastguard Worker if (oldNs[i] == node->ns) {
6514*6777b538SAndroid Build Coastguard Worker node->ns = newNs[i];
6515*6777b538SAndroid Build Coastguard Worker break;
6516*6777b538SAndroid Build Coastguard Worker }
6517*6777b538SAndroid Build Coastguard Worker }
6518*6777b538SAndroid Build Coastguard Worker if (i == nbCache) {
6519*6777b538SAndroid Build Coastguard Worker /*
6520*6777b538SAndroid Build Coastguard Worker * OK we need to recreate a new namespace definition
6521*6777b538SAndroid Build Coastguard Worker */
6522*6777b538SAndroid Build Coastguard Worker n = xmlNewReconciledNs(doc, tree, node->ns);
6523*6777b538SAndroid Build Coastguard Worker if (n != NULL) { /* :-( what if else ??? */
6524*6777b538SAndroid Build Coastguard Worker /*
6525*6777b538SAndroid Build Coastguard Worker * check if we need to grow the cache buffers.
6526*6777b538SAndroid Build Coastguard Worker */
6527*6777b538SAndroid Build Coastguard Worker if (sizeCache <= nbCache) {
6528*6777b538SAndroid Build Coastguard Worker sizeCache *= 2;
6529*6777b538SAndroid Build Coastguard Worker oldNs = (xmlNsPtr *) xmlRealloc(oldNs, sizeCache *
6530*6777b538SAndroid Build Coastguard Worker sizeof(xmlNsPtr));
6531*6777b538SAndroid Build Coastguard Worker if (oldNs == NULL) {
6532*6777b538SAndroid Build Coastguard Worker xmlFree(newNs);
6533*6777b538SAndroid Build Coastguard Worker return(-1);
6534*6777b538SAndroid Build Coastguard Worker }
6535*6777b538SAndroid Build Coastguard Worker newNs = (xmlNsPtr *) xmlRealloc(newNs, sizeCache *
6536*6777b538SAndroid Build Coastguard Worker sizeof(xmlNsPtr));
6537*6777b538SAndroid Build Coastguard Worker if (newNs == NULL) {
6538*6777b538SAndroid Build Coastguard Worker xmlFree(oldNs);
6539*6777b538SAndroid Build Coastguard Worker return(-1);
6540*6777b538SAndroid Build Coastguard Worker }
6541*6777b538SAndroid Build Coastguard Worker }
6542*6777b538SAndroid Build Coastguard Worker newNs[nbCache] = n;
6543*6777b538SAndroid Build Coastguard Worker oldNs[nbCache++] = node->ns;
6544*6777b538SAndroid Build Coastguard Worker node->ns = n;
6545*6777b538SAndroid Build Coastguard Worker }
6546*6777b538SAndroid Build Coastguard Worker }
6547*6777b538SAndroid Build Coastguard Worker }
6548*6777b538SAndroid Build Coastguard Worker /*
6549*6777b538SAndroid Build Coastguard Worker * now check for namespace held by attributes on the node.
6550*6777b538SAndroid Build Coastguard Worker */
6551*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE) {
6552*6777b538SAndroid Build Coastguard Worker attr = node->properties;
6553*6777b538SAndroid Build Coastguard Worker while (attr != NULL) {
6554*6777b538SAndroid Build Coastguard Worker if (attr->ns != NULL) {
6555*6777b538SAndroid Build Coastguard Worker /*
6556*6777b538SAndroid Build Coastguard Worker * initialize the cache if needed
6557*6777b538SAndroid Build Coastguard Worker */
6558*6777b538SAndroid Build Coastguard Worker if (sizeCache == 0) {
6559*6777b538SAndroid Build Coastguard Worker sizeCache = 10;
6560*6777b538SAndroid Build Coastguard Worker oldNs = (xmlNsPtr *) xmlMalloc(sizeCache *
6561*6777b538SAndroid Build Coastguard Worker sizeof(xmlNsPtr));
6562*6777b538SAndroid Build Coastguard Worker if (oldNs == NULL)
6563*6777b538SAndroid Build Coastguard Worker return(-1);
6564*6777b538SAndroid Build Coastguard Worker newNs = (xmlNsPtr *) xmlMalloc(sizeCache *
6565*6777b538SAndroid Build Coastguard Worker sizeof(xmlNsPtr));
6566*6777b538SAndroid Build Coastguard Worker if (newNs == NULL) {
6567*6777b538SAndroid Build Coastguard Worker xmlFree(oldNs);
6568*6777b538SAndroid Build Coastguard Worker return(-1);
6569*6777b538SAndroid Build Coastguard Worker }
6570*6777b538SAndroid Build Coastguard Worker }
6571*6777b538SAndroid Build Coastguard Worker for (i = 0;i < nbCache;i++) {
6572*6777b538SAndroid Build Coastguard Worker if (oldNs[i] == attr->ns) {
6573*6777b538SAndroid Build Coastguard Worker attr->ns = newNs[i];
6574*6777b538SAndroid Build Coastguard Worker break;
6575*6777b538SAndroid Build Coastguard Worker }
6576*6777b538SAndroid Build Coastguard Worker }
6577*6777b538SAndroid Build Coastguard Worker if (i == nbCache) {
6578*6777b538SAndroid Build Coastguard Worker /*
6579*6777b538SAndroid Build Coastguard Worker * OK we need to recreate a new namespace definition
6580*6777b538SAndroid Build Coastguard Worker */
6581*6777b538SAndroid Build Coastguard Worker n = xmlNewReconciledNs(doc, tree, attr->ns);
6582*6777b538SAndroid Build Coastguard Worker if (n != NULL) { /* :-( what if else ??? */
6583*6777b538SAndroid Build Coastguard Worker /*
6584*6777b538SAndroid Build Coastguard Worker * check if we need to grow the cache buffers.
6585*6777b538SAndroid Build Coastguard Worker */
6586*6777b538SAndroid Build Coastguard Worker if (sizeCache <= nbCache) {
6587*6777b538SAndroid Build Coastguard Worker sizeCache *= 2;
6588*6777b538SAndroid Build Coastguard Worker oldNs = (xmlNsPtr *) xmlRealloc(oldNs,
6589*6777b538SAndroid Build Coastguard Worker sizeCache * sizeof(xmlNsPtr));
6590*6777b538SAndroid Build Coastguard Worker if (oldNs == NULL) {
6591*6777b538SAndroid Build Coastguard Worker xmlFree(newNs);
6592*6777b538SAndroid Build Coastguard Worker return(-1);
6593*6777b538SAndroid Build Coastguard Worker }
6594*6777b538SAndroid Build Coastguard Worker newNs = (xmlNsPtr *) xmlRealloc(newNs,
6595*6777b538SAndroid Build Coastguard Worker sizeCache * sizeof(xmlNsPtr));
6596*6777b538SAndroid Build Coastguard Worker if (newNs == NULL) {
6597*6777b538SAndroid Build Coastguard Worker xmlFree(oldNs);
6598*6777b538SAndroid Build Coastguard Worker return(-1);
6599*6777b538SAndroid Build Coastguard Worker }
6600*6777b538SAndroid Build Coastguard Worker }
6601*6777b538SAndroid Build Coastguard Worker newNs[nbCache] = n;
6602*6777b538SAndroid Build Coastguard Worker oldNs[nbCache++] = attr->ns;
6603*6777b538SAndroid Build Coastguard Worker attr->ns = n;
6604*6777b538SAndroid Build Coastguard Worker }
6605*6777b538SAndroid Build Coastguard Worker }
6606*6777b538SAndroid Build Coastguard Worker }
6607*6777b538SAndroid Build Coastguard Worker attr = attr->next;
6608*6777b538SAndroid Build Coastguard Worker }
6609*6777b538SAndroid Build Coastguard Worker }
6610*6777b538SAndroid Build Coastguard Worker
6611*6777b538SAndroid Build Coastguard Worker /*
6612*6777b538SAndroid Build Coastguard Worker * Browse the full subtree, deep first
6613*6777b538SAndroid Build Coastguard Worker */
6614*6777b538SAndroid Build Coastguard Worker if ((node->children != NULL) && (node->type != XML_ENTITY_REF_NODE)) {
6615*6777b538SAndroid Build Coastguard Worker /* deep first */
6616*6777b538SAndroid Build Coastguard Worker node = node->children;
6617*6777b538SAndroid Build Coastguard Worker } else if ((node != tree) && (node->next != NULL)) {
6618*6777b538SAndroid Build Coastguard Worker /* then siblings */
6619*6777b538SAndroid Build Coastguard Worker node = node->next;
6620*6777b538SAndroid Build Coastguard Worker } else if (node != tree) {
6621*6777b538SAndroid Build Coastguard Worker /* go up to parents->next if needed */
6622*6777b538SAndroid Build Coastguard Worker while (node != tree) {
6623*6777b538SAndroid Build Coastguard Worker if (node->parent != NULL)
6624*6777b538SAndroid Build Coastguard Worker node = node->parent;
6625*6777b538SAndroid Build Coastguard Worker if ((node != tree) && (node->next != NULL)) {
6626*6777b538SAndroid Build Coastguard Worker node = node->next;
6627*6777b538SAndroid Build Coastguard Worker break;
6628*6777b538SAndroid Build Coastguard Worker }
6629*6777b538SAndroid Build Coastguard Worker if (node->parent == NULL) {
6630*6777b538SAndroid Build Coastguard Worker node = NULL;
6631*6777b538SAndroid Build Coastguard Worker break;
6632*6777b538SAndroid Build Coastguard Worker }
6633*6777b538SAndroid Build Coastguard Worker }
6634*6777b538SAndroid Build Coastguard Worker /* exit condition */
6635*6777b538SAndroid Build Coastguard Worker if (node == tree)
6636*6777b538SAndroid Build Coastguard Worker node = NULL;
6637*6777b538SAndroid Build Coastguard Worker } else
6638*6777b538SAndroid Build Coastguard Worker break;
6639*6777b538SAndroid Build Coastguard Worker }
6640*6777b538SAndroid Build Coastguard Worker if (oldNs != NULL)
6641*6777b538SAndroid Build Coastguard Worker xmlFree(oldNs);
6642*6777b538SAndroid Build Coastguard Worker if (newNs != NULL)
6643*6777b538SAndroid Build Coastguard Worker xmlFree(newNs);
6644*6777b538SAndroid Build Coastguard Worker return(ret);
6645*6777b538SAndroid Build Coastguard Worker }
6646*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
6647*6777b538SAndroid Build Coastguard Worker
6648*6777b538SAndroid Build Coastguard Worker static xmlAttrPtr
xmlGetPropNodeInternal(const xmlNode * node,const xmlChar * name,const xmlChar * nsName,int useDTD)6649*6777b538SAndroid Build Coastguard Worker xmlGetPropNodeInternal(const xmlNode *node, const xmlChar *name,
6650*6777b538SAndroid Build Coastguard Worker const xmlChar *nsName, int useDTD)
6651*6777b538SAndroid Build Coastguard Worker {
6652*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
6653*6777b538SAndroid Build Coastguard Worker
6654*6777b538SAndroid Build Coastguard Worker /* Avoid unused variable warning if features are disabled. */
6655*6777b538SAndroid Build Coastguard Worker (void) useDTD;
6656*6777b538SAndroid Build Coastguard Worker
6657*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type != XML_ELEMENT_NODE) || (name == NULL))
6658*6777b538SAndroid Build Coastguard Worker return(NULL);
6659*6777b538SAndroid Build Coastguard Worker
6660*6777b538SAndroid Build Coastguard Worker if (node->properties != NULL) {
6661*6777b538SAndroid Build Coastguard Worker prop = node->properties;
6662*6777b538SAndroid Build Coastguard Worker if (nsName == NULL) {
6663*6777b538SAndroid Build Coastguard Worker /*
6664*6777b538SAndroid Build Coastguard Worker * We want the attr to be in no namespace.
6665*6777b538SAndroid Build Coastguard Worker */
6666*6777b538SAndroid Build Coastguard Worker do {
6667*6777b538SAndroid Build Coastguard Worker if ((prop->ns == NULL) && xmlStrEqual(prop->name, name)) {
6668*6777b538SAndroid Build Coastguard Worker return(prop);
6669*6777b538SAndroid Build Coastguard Worker }
6670*6777b538SAndroid Build Coastguard Worker prop = prop->next;
6671*6777b538SAndroid Build Coastguard Worker } while (prop != NULL);
6672*6777b538SAndroid Build Coastguard Worker } else {
6673*6777b538SAndroid Build Coastguard Worker /*
6674*6777b538SAndroid Build Coastguard Worker * We want the attr to be in the specified namespace.
6675*6777b538SAndroid Build Coastguard Worker */
6676*6777b538SAndroid Build Coastguard Worker do {
6677*6777b538SAndroid Build Coastguard Worker if ((prop->ns != NULL) && xmlStrEqual(prop->name, name) &&
6678*6777b538SAndroid Build Coastguard Worker ((prop->ns->href == nsName) ||
6679*6777b538SAndroid Build Coastguard Worker xmlStrEqual(prop->ns->href, nsName)))
6680*6777b538SAndroid Build Coastguard Worker {
6681*6777b538SAndroid Build Coastguard Worker return(prop);
6682*6777b538SAndroid Build Coastguard Worker }
6683*6777b538SAndroid Build Coastguard Worker prop = prop->next;
6684*6777b538SAndroid Build Coastguard Worker } while (prop != NULL);
6685*6777b538SAndroid Build Coastguard Worker }
6686*6777b538SAndroid Build Coastguard Worker }
6687*6777b538SAndroid Build Coastguard Worker
6688*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
6689*6777b538SAndroid Build Coastguard Worker if (! useDTD)
6690*6777b538SAndroid Build Coastguard Worker return(NULL);
6691*6777b538SAndroid Build Coastguard Worker /*
6692*6777b538SAndroid Build Coastguard Worker * Check if there is a default/fixed attribute declaration in
6693*6777b538SAndroid Build Coastguard Worker * the internal or external subset.
6694*6777b538SAndroid Build Coastguard Worker */
6695*6777b538SAndroid Build Coastguard Worker if ((node->doc != NULL) && (node->doc->intSubset != NULL)) {
6696*6777b538SAndroid Build Coastguard Worker xmlDocPtr doc = node->doc;
6697*6777b538SAndroid Build Coastguard Worker xmlAttributePtr attrDecl = NULL;
6698*6777b538SAndroid Build Coastguard Worker xmlChar *elemQName, *tmpstr = NULL;
6699*6777b538SAndroid Build Coastguard Worker
6700*6777b538SAndroid Build Coastguard Worker /*
6701*6777b538SAndroid Build Coastguard Worker * We need the QName of the element for the DTD-lookup.
6702*6777b538SAndroid Build Coastguard Worker */
6703*6777b538SAndroid Build Coastguard Worker if ((node->ns != NULL) && (node->ns->prefix != NULL)) {
6704*6777b538SAndroid Build Coastguard Worker tmpstr = xmlStrdup(node->ns->prefix);
6705*6777b538SAndroid Build Coastguard Worker tmpstr = xmlStrcat(tmpstr, BAD_CAST ":");
6706*6777b538SAndroid Build Coastguard Worker tmpstr = xmlStrcat(tmpstr, node->name);
6707*6777b538SAndroid Build Coastguard Worker if (tmpstr == NULL)
6708*6777b538SAndroid Build Coastguard Worker return(NULL);
6709*6777b538SAndroid Build Coastguard Worker elemQName = tmpstr;
6710*6777b538SAndroid Build Coastguard Worker } else
6711*6777b538SAndroid Build Coastguard Worker elemQName = (xmlChar *) node->name;
6712*6777b538SAndroid Build Coastguard Worker if (nsName == NULL) {
6713*6777b538SAndroid Build Coastguard Worker /*
6714*6777b538SAndroid Build Coastguard Worker * The common and nice case: Attr in no namespace.
6715*6777b538SAndroid Build Coastguard Worker */
6716*6777b538SAndroid Build Coastguard Worker attrDecl = xmlGetDtdQAttrDesc(doc->intSubset,
6717*6777b538SAndroid Build Coastguard Worker elemQName, name, NULL);
6718*6777b538SAndroid Build Coastguard Worker if ((attrDecl == NULL) && (doc->extSubset != NULL)) {
6719*6777b538SAndroid Build Coastguard Worker attrDecl = xmlGetDtdQAttrDesc(doc->extSubset,
6720*6777b538SAndroid Build Coastguard Worker elemQName, name, NULL);
6721*6777b538SAndroid Build Coastguard Worker }
6722*6777b538SAndroid Build Coastguard Worker } else if (xmlStrEqual(nsName, XML_XML_NAMESPACE)) {
6723*6777b538SAndroid Build Coastguard Worker /*
6724*6777b538SAndroid Build Coastguard Worker * The XML namespace must be bound to prefix 'xml'.
6725*6777b538SAndroid Build Coastguard Worker */
6726*6777b538SAndroid Build Coastguard Worker attrDecl = xmlGetDtdQAttrDesc(doc->intSubset,
6727*6777b538SAndroid Build Coastguard Worker elemQName, name, BAD_CAST "xml");
6728*6777b538SAndroid Build Coastguard Worker if ((attrDecl == NULL) && (doc->extSubset != NULL)) {
6729*6777b538SAndroid Build Coastguard Worker attrDecl = xmlGetDtdQAttrDesc(doc->extSubset,
6730*6777b538SAndroid Build Coastguard Worker elemQName, name, BAD_CAST "xml");
6731*6777b538SAndroid Build Coastguard Worker }
6732*6777b538SAndroid Build Coastguard Worker } else {
6733*6777b538SAndroid Build Coastguard Worker xmlNsPtr *nsList, *cur;
6734*6777b538SAndroid Build Coastguard Worker
6735*6777b538SAndroid Build Coastguard Worker /*
6736*6777b538SAndroid Build Coastguard Worker * The ugly case: Search using the prefixes of in-scope
6737*6777b538SAndroid Build Coastguard Worker * ns-decls corresponding to @nsName.
6738*6777b538SAndroid Build Coastguard Worker */
6739*6777b538SAndroid Build Coastguard Worker nsList = xmlGetNsList(node->doc, node);
6740*6777b538SAndroid Build Coastguard Worker if (nsList == NULL) {
6741*6777b538SAndroid Build Coastguard Worker if (tmpstr != NULL)
6742*6777b538SAndroid Build Coastguard Worker xmlFree(tmpstr);
6743*6777b538SAndroid Build Coastguard Worker return(NULL);
6744*6777b538SAndroid Build Coastguard Worker }
6745*6777b538SAndroid Build Coastguard Worker cur = nsList;
6746*6777b538SAndroid Build Coastguard Worker while (*cur != NULL) {
6747*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual((*cur)->href, nsName)) {
6748*6777b538SAndroid Build Coastguard Worker attrDecl = xmlGetDtdQAttrDesc(doc->intSubset, elemQName,
6749*6777b538SAndroid Build Coastguard Worker name, (*cur)->prefix);
6750*6777b538SAndroid Build Coastguard Worker if (attrDecl)
6751*6777b538SAndroid Build Coastguard Worker break;
6752*6777b538SAndroid Build Coastguard Worker if (doc->extSubset != NULL) {
6753*6777b538SAndroid Build Coastguard Worker attrDecl = xmlGetDtdQAttrDesc(doc->extSubset, elemQName,
6754*6777b538SAndroid Build Coastguard Worker name, (*cur)->prefix);
6755*6777b538SAndroid Build Coastguard Worker if (attrDecl)
6756*6777b538SAndroid Build Coastguard Worker break;
6757*6777b538SAndroid Build Coastguard Worker }
6758*6777b538SAndroid Build Coastguard Worker }
6759*6777b538SAndroid Build Coastguard Worker cur++;
6760*6777b538SAndroid Build Coastguard Worker }
6761*6777b538SAndroid Build Coastguard Worker xmlFree(nsList);
6762*6777b538SAndroid Build Coastguard Worker }
6763*6777b538SAndroid Build Coastguard Worker if (tmpstr != NULL)
6764*6777b538SAndroid Build Coastguard Worker xmlFree(tmpstr);
6765*6777b538SAndroid Build Coastguard Worker /*
6766*6777b538SAndroid Build Coastguard Worker * Only default/fixed attrs are relevant.
6767*6777b538SAndroid Build Coastguard Worker */
6768*6777b538SAndroid Build Coastguard Worker if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL))
6769*6777b538SAndroid Build Coastguard Worker return((xmlAttrPtr) attrDecl);
6770*6777b538SAndroid Build Coastguard Worker }
6771*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
6772*6777b538SAndroid Build Coastguard Worker return(NULL);
6773*6777b538SAndroid Build Coastguard Worker }
6774*6777b538SAndroid Build Coastguard Worker
6775*6777b538SAndroid Build Coastguard Worker static xmlChar*
xmlGetPropNodeValueInternal(const xmlAttr * prop)6776*6777b538SAndroid Build Coastguard Worker xmlGetPropNodeValueInternal(const xmlAttr *prop)
6777*6777b538SAndroid Build Coastguard Worker {
6778*6777b538SAndroid Build Coastguard Worker if (prop == NULL)
6779*6777b538SAndroid Build Coastguard Worker return(NULL);
6780*6777b538SAndroid Build Coastguard Worker if (prop->type == XML_ATTRIBUTE_NODE) {
6781*6777b538SAndroid Build Coastguard Worker /*
6782*6777b538SAndroid Build Coastguard Worker * Note that we return at least the empty string.
6783*6777b538SAndroid Build Coastguard Worker */
6784*6777b538SAndroid Build Coastguard Worker if (prop->children != NULL) {
6785*6777b538SAndroid Build Coastguard Worker if ((prop->children->next == NULL) &&
6786*6777b538SAndroid Build Coastguard Worker ((prop->children->type == XML_TEXT_NODE) ||
6787*6777b538SAndroid Build Coastguard Worker (prop->children->type == XML_CDATA_SECTION_NODE)))
6788*6777b538SAndroid Build Coastguard Worker {
6789*6777b538SAndroid Build Coastguard Worker /*
6790*6777b538SAndroid Build Coastguard Worker * Optimization for the common case: only 1 text node.
6791*6777b538SAndroid Build Coastguard Worker */
6792*6777b538SAndroid Build Coastguard Worker return(xmlStrdup(prop->children->content));
6793*6777b538SAndroid Build Coastguard Worker } else {
6794*6777b538SAndroid Build Coastguard Worker return(xmlNodeListGetString(prop->doc, prop->children, 1));
6795*6777b538SAndroid Build Coastguard Worker }
6796*6777b538SAndroid Build Coastguard Worker }
6797*6777b538SAndroid Build Coastguard Worker return(xmlStrdup((xmlChar *)""));
6798*6777b538SAndroid Build Coastguard Worker } else if (prop->type == XML_ATTRIBUTE_DECL) {
6799*6777b538SAndroid Build Coastguard Worker return(xmlStrdup(((xmlAttributePtr)prop)->defaultValue));
6800*6777b538SAndroid Build Coastguard Worker }
6801*6777b538SAndroid Build Coastguard Worker return(NULL);
6802*6777b538SAndroid Build Coastguard Worker }
6803*6777b538SAndroid Build Coastguard Worker
6804*6777b538SAndroid Build Coastguard Worker /**
6805*6777b538SAndroid Build Coastguard Worker * xmlHasProp:
6806*6777b538SAndroid Build Coastguard Worker * @node: the node
6807*6777b538SAndroid Build Coastguard Worker * @name: the attribute name
6808*6777b538SAndroid Build Coastguard Worker *
6809*6777b538SAndroid Build Coastguard Worker * Search an attribute associated to a node
6810*6777b538SAndroid Build Coastguard Worker * This function also looks in DTD attribute declaration for #FIXED or
6811*6777b538SAndroid Build Coastguard Worker * default declaration values unless DTD use has been turned off.
6812*6777b538SAndroid Build Coastguard Worker *
6813*6777b538SAndroid Build Coastguard Worker * Returns the attribute or the attribute declaration or NULL if
6814*6777b538SAndroid Build Coastguard Worker * neither was found.
6815*6777b538SAndroid Build Coastguard Worker */
6816*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlHasProp(const xmlNode * node,const xmlChar * name)6817*6777b538SAndroid Build Coastguard Worker xmlHasProp(const xmlNode *node, const xmlChar *name) {
6818*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
6819*6777b538SAndroid Build Coastguard Worker xmlDocPtr doc;
6820*6777b538SAndroid Build Coastguard Worker
6821*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type != XML_ELEMENT_NODE) || (name == NULL))
6822*6777b538SAndroid Build Coastguard Worker return(NULL);
6823*6777b538SAndroid Build Coastguard Worker /*
6824*6777b538SAndroid Build Coastguard Worker * Check on the properties attached to the node
6825*6777b538SAndroid Build Coastguard Worker */
6826*6777b538SAndroid Build Coastguard Worker prop = node->properties;
6827*6777b538SAndroid Build Coastguard Worker while (prop != NULL) {
6828*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(prop->name, name)) {
6829*6777b538SAndroid Build Coastguard Worker return(prop);
6830*6777b538SAndroid Build Coastguard Worker }
6831*6777b538SAndroid Build Coastguard Worker prop = prop->next;
6832*6777b538SAndroid Build Coastguard Worker }
6833*6777b538SAndroid Build Coastguard Worker
6834*6777b538SAndroid Build Coastguard Worker /*
6835*6777b538SAndroid Build Coastguard Worker * Check if there is a default declaration in the internal
6836*6777b538SAndroid Build Coastguard Worker * or external subsets
6837*6777b538SAndroid Build Coastguard Worker */
6838*6777b538SAndroid Build Coastguard Worker doc = node->doc;
6839*6777b538SAndroid Build Coastguard Worker if (doc != NULL) {
6840*6777b538SAndroid Build Coastguard Worker xmlAttributePtr attrDecl;
6841*6777b538SAndroid Build Coastguard Worker if (doc->intSubset != NULL) {
6842*6777b538SAndroid Build Coastguard Worker attrDecl = xmlGetDtdAttrDesc(doc->intSubset, node->name, name);
6843*6777b538SAndroid Build Coastguard Worker if ((attrDecl == NULL) && (doc->extSubset != NULL))
6844*6777b538SAndroid Build Coastguard Worker attrDecl = xmlGetDtdAttrDesc(doc->extSubset, node->name, name);
6845*6777b538SAndroid Build Coastguard Worker if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL))
6846*6777b538SAndroid Build Coastguard Worker /* return attribute declaration only if a default value is given
6847*6777b538SAndroid Build Coastguard Worker (that includes #FIXED declarations) */
6848*6777b538SAndroid Build Coastguard Worker return((xmlAttrPtr) attrDecl);
6849*6777b538SAndroid Build Coastguard Worker }
6850*6777b538SAndroid Build Coastguard Worker }
6851*6777b538SAndroid Build Coastguard Worker return(NULL);
6852*6777b538SAndroid Build Coastguard Worker }
6853*6777b538SAndroid Build Coastguard Worker
6854*6777b538SAndroid Build Coastguard Worker /**
6855*6777b538SAndroid Build Coastguard Worker * xmlHasNsProp:
6856*6777b538SAndroid Build Coastguard Worker * @node: the node
6857*6777b538SAndroid Build Coastguard Worker * @name: the attribute name
6858*6777b538SAndroid Build Coastguard Worker * @nameSpace: the URI of the namespace
6859*6777b538SAndroid Build Coastguard Worker *
6860*6777b538SAndroid Build Coastguard Worker * Search for an attribute associated to a node
6861*6777b538SAndroid Build Coastguard Worker * This attribute has to be anchored in the namespace specified.
6862*6777b538SAndroid Build Coastguard Worker * This does the entity substitution.
6863*6777b538SAndroid Build Coastguard Worker * This function looks in DTD attribute declaration for #FIXED or
6864*6777b538SAndroid Build Coastguard Worker * default declaration values unless DTD use has been turned off.
6865*6777b538SAndroid Build Coastguard Worker * Note that a namespace of NULL indicates to use the default namespace.
6866*6777b538SAndroid Build Coastguard Worker *
6867*6777b538SAndroid Build Coastguard Worker * Returns the attribute or the attribute declaration or NULL
6868*6777b538SAndroid Build Coastguard Worker * if neither was found.
6869*6777b538SAndroid Build Coastguard Worker */
6870*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlHasNsProp(const xmlNode * node,const xmlChar * name,const xmlChar * nameSpace)6871*6777b538SAndroid Build Coastguard Worker xmlHasNsProp(const xmlNode *node, const xmlChar *name, const xmlChar *nameSpace) {
6872*6777b538SAndroid Build Coastguard Worker
6873*6777b538SAndroid Build Coastguard Worker return(xmlGetPropNodeInternal(node, name, nameSpace, 1));
6874*6777b538SAndroid Build Coastguard Worker }
6875*6777b538SAndroid Build Coastguard Worker
6876*6777b538SAndroid Build Coastguard Worker /**
6877*6777b538SAndroid Build Coastguard Worker * xmlNodeGetAttrValue:
6878*6777b538SAndroid Build Coastguard Worker * @node: the node
6879*6777b538SAndroid Build Coastguard Worker * @name: the attribute name
6880*6777b538SAndroid Build Coastguard Worker * @nsUri: the URI of the namespace
6881*6777b538SAndroid Build Coastguard Worker * @out: the returned string
6882*6777b538SAndroid Build Coastguard Worker *
6883*6777b538SAndroid Build Coastguard Worker * Search and get the value of an attribute associated to a node
6884*6777b538SAndroid Build Coastguard Worker * This attribute has to be anchored in the namespace specified.
6885*6777b538SAndroid Build Coastguard Worker * This does the entity substitution. The returned value must be
6886*6777b538SAndroid Build Coastguard Worker * freed by the caller.
6887*6777b538SAndroid Build Coastguard Worker *
6888*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, 1 if no attribute was found, -1 if a
6889*6777b538SAndroid Build Coastguard Worker * memory allocation failed.
6890*6777b538SAndroid Build Coastguard Worker */
6891*6777b538SAndroid Build Coastguard Worker int
xmlNodeGetAttrValue(const xmlNode * node,const xmlChar * name,const xmlChar * nsUri,xmlChar ** out)6892*6777b538SAndroid Build Coastguard Worker xmlNodeGetAttrValue(const xmlNode *node, const xmlChar *name,
6893*6777b538SAndroid Build Coastguard Worker const xmlChar *nsUri, xmlChar **out) {
6894*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
6895*6777b538SAndroid Build Coastguard Worker
6896*6777b538SAndroid Build Coastguard Worker if (out == NULL)
6897*6777b538SAndroid Build Coastguard Worker return(1);
6898*6777b538SAndroid Build Coastguard Worker *out = NULL;
6899*6777b538SAndroid Build Coastguard Worker
6900*6777b538SAndroid Build Coastguard Worker prop = xmlGetPropNodeInternal(node, name, nsUri, 0);
6901*6777b538SAndroid Build Coastguard Worker if (prop == NULL)
6902*6777b538SAndroid Build Coastguard Worker return(1);
6903*6777b538SAndroid Build Coastguard Worker
6904*6777b538SAndroid Build Coastguard Worker *out = xmlGetPropNodeValueInternal(prop);
6905*6777b538SAndroid Build Coastguard Worker if (*out == NULL)
6906*6777b538SAndroid Build Coastguard Worker return(-1);
6907*6777b538SAndroid Build Coastguard Worker return(0);
6908*6777b538SAndroid Build Coastguard Worker }
6909*6777b538SAndroid Build Coastguard Worker
6910*6777b538SAndroid Build Coastguard Worker /**
6911*6777b538SAndroid Build Coastguard Worker * xmlGetProp:
6912*6777b538SAndroid Build Coastguard Worker * @node: the node
6913*6777b538SAndroid Build Coastguard Worker * @name: the attribute name
6914*6777b538SAndroid Build Coastguard Worker *
6915*6777b538SAndroid Build Coastguard Worker * Search and get the value of an attribute associated to a node
6916*6777b538SAndroid Build Coastguard Worker * This does the entity substitution.
6917*6777b538SAndroid Build Coastguard Worker * This function looks in DTD attribute declaration for #FIXED or
6918*6777b538SAndroid Build Coastguard Worker * default declaration values.
6919*6777b538SAndroid Build Coastguard Worker *
6920*6777b538SAndroid Build Coastguard Worker * NOTE: This function acts independently of namespaces associated
6921*6777b538SAndroid Build Coastguard Worker * to the attribute. Use xmlGetNsProp() or xmlGetNoNsProp()
6922*6777b538SAndroid Build Coastguard Worker * for namespace aware processing.
6923*6777b538SAndroid Build Coastguard Worker *
6924*6777b538SAndroid Build Coastguard Worker * NOTE: This function doesn't allow to distinguish malloc failures from
6925*6777b538SAndroid Build Coastguard Worker * missing attributes. It's more robust to use xmlNodeGetAttrValue.
6926*6777b538SAndroid Build Coastguard Worker *
6927*6777b538SAndroid Build Coastguard Worker * Returns the attribute value or NULL if not found or a memory allocation
6928*6777b538SAndroid Build Coastguard Worker * failed. It's up to the caller to free the memory with xmlFree().
6929*6777b538SAndroid Build Coastguard Worker */
6930*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlGetProp(const xmlNode * node,const xmlChar * name)6931*6777b538SAndroid Build Coastguard Worker xmlGetProp(const xmlNode *node, const xmlChar *name) {
6932*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
6933*6777b538SAndroid Build Coastguard Worker
6934*6777b538SAndroid Build Coastguard Worker prop = xmlHasProp(node, name);
6935*6777b538SAndroid Build Coastguard Worker if (prop == NULL)
6936*6777b538SAndroid Build Coastguard Worker return(NULL);
6937*6777b538SAndroid Build Coastguard Worker return(xmlGetPropNodeValueInternal(prop));
6938*6777b538SAndroid Build Coastguard Worker }
6939*6777b538SAndroid Build Coastguard Worker
6940*6777b538SAndroid Build Coastguard Worker /**
6941*6777b538SAndroid Build Coastguard Worker * xmlGetNoNsProp:
6942*6777b538SAndroid Build Coastguard Worker * @node: the node
6943*6777b538SAndroid Build Coastguard Worker * @name: the attribute name
6944*6777b538SAndroid Build Coastguard Worker *
6945*6777b538SAndroid Build Coastguard Worker * Search and get the value of an attribute associated to a node
6946*6777b538SAndroid Build Coastguard Worker * This does the entity substitution.
6947*6777b538SAndroid Build Coastguard Worker * This function looks in DTD attribute declaration for #FIXED or
6948*6777b538SAndroid Build Coastguard Worker * default declaration values.
6949*6777b538SAndroid Build Coastguard Worker * This function is similar to xmlGetProp except it will accept only
6950*6777b538SAndroid Build Coastguard Worker * an attribute in no namespace.
6951*6777b538SAndroid Build Coastguard Worker *
6952*6777b538SAndroid Build Coastguard Worker * NOTE: This function doesn't allow to distinguish malloc failures from
6953*6777b538SAndroid Build Coastguard Worker * missing attributes. It's more robust to use xmlNodeGetAttrValue.
6954*6777b538SAndroid Build Coastguard Worker *
6955*6777b538SAndroid Build Coastguard Worker * Returns the attribute value or NULL if not found or a memory allocation
6956*6777b538SAndroid Build Coastguard Worker * failed. It's up to the caller to free the memory with xmlFree().
6957*6777b538SAndroid Build Coastguard Worker */
6958*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlGetNoNsProp(const xmlNode * node,const xmlChar * name)6959*6777b538SAndroid Build Coastguard Worker xmlGetNoNsProp(const xmlNode *node, const xmlChar *name) {
6960*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
6961*6777b538SAndroid Build Coastguard Worker
6962*6777b538SAndroid Build Coastguard Worker prop = xmlGetPropNodeInternal(node, name, NULL, 1);
6963*6777b538SAndroid Build Coastguard Worker if (prop == NULL)
6964*6777b538SAndroid Build Coastguard Worker return(NULL);
6965*6777b538SAndroid Build Coastguard Worker return(xmlGetPropNodeValueInternal(prop));
6966*6777b538SAndroid Build Coastguard Worker }
6967*6777b538SAndroid Build Coastguard Worker
6968*6777b538SAndroid Build Coastguard Worker /**
6969*6777b538SAndroid Build Coastguard Worker * xmlGetNsProp:
6970*6777b538SAndroid Build Coastguard Worker * @node: the node
6971*6777b538SAndroid Build Coastguard Worker * @name: the attribute name
6972*6777b538SAndroid Build Coastguard Worker * @nameSpace: the URI of the namespace
6973*6777b538SAndroid Build Coastguard Worker *
6974*6777b538SAndroid Build Coastguard Worker * Search and get the value of an attribute associated to a node
6975*6777b538SAndroid Build Coastguard Worker * This attribute has to be anchored in the namespace specified.
6976*6777b538SAndroid Build Coastguard Worker * This does the entity substitution.
6977*6777b538SAndroid Build Coastguard Worker * This function looks in DTD attribute declaration for #FIXED or
6978*6777b538SAndroid Build Coastguard Worker * default declaration values.
6979*6777b538SAndroid Build Coastguard Worker *
6980*6777b538SAndroid Build Coastguard Worker * NOTE: This function doesn't allow to distinguish malloc failures from
6981*6777b538SAndroid Build Coastguard Worker * missing attributes. It's more robust to use xmlNodeGetAttrValue.
6982*6777b538SAndroid Build Coastguard Worker *
6983*6777b538SAndroid Build Coastguard Worker * Returns the attribute value or NULL if not found or a memory allocation
6984*6777b538SAndroid Build Coastguard Worker * failed. It's up to the caller to free the memory with xmlFree().
6985*6777b538SAndroid Build Coastguard Worker */
6986*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlGetNsProp(const xmlNode * node,const xmlChar * name,const xmlChar * nameSpace)6987*6777b538SAndroid Build Coastguard Worker xmlGetNsProp(const xmlNode *node, const xmlChar *name, const xmlChar *nameSpace) {
6988*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
6989*6777b538SAndroid Build Coastguard Worker
6990*6777b538SAndroid Build Coastguard Worker prop = xmlGetPropNodeInternal(node, name, nameSpace, 1);
6991*6777b538SAndroid Build Coastguard Worker if (prop == NULL)
6992*6777b538SAndroid Build Coastguard Worker return(NULL);
6993*6777b538SAndroid Build Coastguard Worker return(xmlGetPropNodeValueInternal(prop));
6994*6777b538SAndroid Build Coastguard Worker }
6995*6777b538SAndroid Build Coastguard Worker
6996*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
6997*6777b538SAndroid Build Coastguard Worker /**
6998*6777b538SAndroid Build Coastguard Worker * xmlUnsetProp:
6999*6777b538SAndroid Build Coastguard Worker * @node: the node
7000*6777b538SAndroid Build Coastguard Worker * @name: the attribute name
7001*6777b538SAndroid Build Coastguard Worker *
7002*6777b538SAndroid Build Coastguard Worker * Remove an attribute carried by a node.
7003*6777b538SAndroid Build Coastguard Worker * This handles only attributes in no namespace.
7004*6777b538SAndroid Build Coastguard Worker * Returns 0 if successful, -1 if not found
7005*6777b538SAndroid Build Coastguard Worker */
7006*6777b538SAndroid Build Coastguard Worker int
xmlUnsetProp(xmlNodePtr node,const xmlChar * name)7007*6777b538SAndroid Build Coastguard Worker xmlUnsetProp(xmlNodePtr node, const xmlChar *name) {
7008*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
7009*6777b538SAndroid Build Coastguard Worker
7010*6777b538SAndroid Build Coastguard Worker prop = xmlGetPropNodeInternal(node, name, NULL, 0);
7011*6777b538SAndroid Build Coastguard Worker if (prop == NULL)
7012*6777b538SAndroid Build Coastguard Worker return(-1);
7013*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode((xmlNodePtr) prop);
7014*6777b538SAndroid Build Coastguard Worker xmlFreeProp(prop);
7015*6777b538SAndroid Build Coastguard Worker return(0);
7016*6777b538SAndroid Build Coastguard Worker }
7017*6777b538SAndroid Build Coastguard Worker
7018*6777b538SAndroid Build Coastguard Worker /**
7019*6777b538SAndroid Build Coastguard Worker * xmlUnsetNsProp:
7020*6777b538SAndroid Build Coastguard Worker * @node: the node
7021*6777b538SAndroid Build Coastguard Worker * @ns: the namespace definition
7022*6777b538SAndroid Build Coastguard Worker * @name: the attribute name
7023*6777b538SAndroid Build Coastguard Worker *
7024*6777b538SAndroid Build Coastguard Worker * Remove an attribute carried by a node.
7025*6777b538SAndroid Build Coastguard Worker * Returns 0 if successful, -1 if not found
7026*6777b538SAndroid Build Coastguard Worker */
7027*6777b538SAndroid Build Coastguard Worker int
xmlUnsetNsProp(xmlNodePtr node,xmlNsPtr ns,const xmlChar * name)7028*6777b538SAndroid Build Coastguard Worker xmlUnsetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name) {
7029*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
7030*6777b538SAndroid Build Coastguard Worker
7031*6777b538SAndroid Build Coastguard Worker prop = xmlGetPropNodeInternal(node, name,
7032*6777b538SAndroid Build Coastguard Worker (ns != NULL) ? ns->href : NULL, 0);
7033*6777b538SAndroid Build Coastguard Worker if (prop == NULL)
7034*6777b538SAndroid Build Coastguard Worker return(-1);
7035*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode((xmlNodePtr) prop);
7036*6777b538SAndroid Build Coastguard Worker xmlFreeProp(prop);
7037*6777b538SAndroid Build Coastguard Worker return(0);
7038*6777b538SAndroid Build Coastguard Worker }
7039*6777b538SAndroid Build Coastguard Worker #endif
7040*6777b538SAndroid Build Coastguard Worker
7041*6777b538SAndroid Build Coastguard Worker #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_XINCLUDE_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_HTML_ENABLED)
7042*6777b538SAndroid Build Coastguard Worker /**
7043*6777b538SAndroid Build Coastguard Worker * xmlSetProp:
7044*6777b538SAndroid Build Coastguard Worker * @node: the node
7045*6777b538SAndroid Build Coastguard Worker * @name: the attribute name (a QName)
7046*6777b538SAndroid Build Coastguard Worker * @value: the attribute value
7047*6777b538SAndroid Build Coastguard Worker *
7048*6777b538SAndroid Build Coastguard Worker * Set (or reset) an attribute carried by a node.
7049*6777b538SAndroid Build Coastguard Worker * If @name has a prefix, then the corresponding
7050*6777b538SAndroid Build Coastguard Worker * namespace-binding will be used, if in scope; it is an
7051*6777b538SAndroid Build Coastguard Worker * error it there's no such ns-binding for the prefix in
7052*6777b538SAndroid Build Coastguard Worker * scope.
7053*6777b538SAndroid Build Coastguard Worker * Returns the attribute pointer.
7054*6777b538SAndroid Build Coastguard Worker *
7055*6777b538SAndroid Build Coastguard Worker */
7056*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlSetProp(xmlNodePtr node,const xmlChar * name,const xmlChar * value)7057*6777b538SAndroid Build Coastguard Worker xmlSetProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value) {
7058*6777b538SAndroid Build Coastguard Worker int len;
7059*6777b538SAndroid Build Coastguard Worker const xmlChar *nqname;
7060*6777b538SAndroid Build Coastguard Worker
7061*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (name == NULL) || (node->type != XML_ELEMENT_NODE))
7062*6777b538SAndroid Build Coastguard Worker return(NULL);
7063*6777b538SAndroid Build Coastguard Worker
7064*6777b538SAndroid Build Coastguard Worker /*
7065*6777b538SAndroid Build Coastguard Worker * handle QNames
7066*6777b538SAndroid Build Coastguard Worker */
7067*6777b538SAndroid Build Coastguard Worker nqname = xmlSplitQName3(name, &len);
7068*6777b538SAndroid Build Coastguard Worker if (nqname != NULL) {
7069*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
7070*6777b538SAndroid Build Coastguard Worker xmlChar *prefix = xmlStrndup(name, len);
7071*6777b538SAndroid Build Coastguard Worker ns = xmlSearchNs(node->doc, node, prefix);
7072*6777b538SAndroid Build Coastguard Worker if (prefix != NULL)
7073*6777b538SAndroid Build Coastguard Worker xmlFree(prefix);
7074*6777b538SAndroid Build Coastguard Worker if (ns != NULL)
7075*6777b538SAndroid Build Coastguard Worker return(xmlSetNsProp(node, ns, nqname, value));
7076*6777b538SAndroid Build Coastguard Worker }
7077*6777b538SAndroid Build Coastguard Worker return(xmlSetNsProp(node, NULL, name, value));
7078*6777b538SAndroid Build Coastguard Worker }
7079*6777b538SAndroid Build Coastguard Worker
7080*6777b538SAndroid Build Coastguard Worker /**
7081*6777b538SAndroid Build Coastguard Worker * xmlSetNsProp:
7082*6777b538SAndroid Build Coastguard Worker * @node: the node
7083*6777b538SAndroid Build Coastguard Worker * @ns: the namespace definition
7084*6777b538SAndroid Build Coastguard Worker * @name: the attribute name
7085*6777b538SAndroid Build Coastguard Worker * @value: the attribute value
7086*6777b538SAndroid Build Coastguard Worker *
7087*6777b538SAndroid Build Coastguard Worker * Set (or reset) an attribute carried by a node.
7088*6777b538SAndroid Build Coastguard Worker * The ns structure must be in scope, this is not checked
7089*6777b538SAndroid Build Coastguard Worker *
7090*6777b538SAndroid Build Coastguard Worker * Returns the attribute pointer.
7091*6777b538SAndroid Build Coastguard Worker */
7092*6777b538SAndroid Build Coastguard Worker xmlAttrPtr
xmlSetNsProp(xmlNodePtr node,xmlNsPtr ns,const xmlChar * name,const xmlChar * value)7093*6777b538SAndroid Build Coastguard Worker xmlSetNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name,
7094*6777b538SAndroid Build Coastguard Worker const xmlChar *value)
7095*6777b538SAndroid Build Coastguard Worker {
7096*6777b538SAndroid Build Coastguard Worker xmlAttrPtr prop;
7097*6777b538SAndroid Build Coastguard Worker
7098*6777b538SAndroid Build Coastguard Worker if (ns && (ns->href == NULL))
7099*6777b538SAndroid Build Coastguard Worker return(NULL);
7100*6777b538SAndroid Build Coastguard Worker prop = xmlGetPropNodeInternal(node, name,
7101*6777b538SAndroid Build Coastguard Worker (ns != NULL) ? ns->href : NULL, 0);
7102*6777b538SAndroid Build Coastguard Worker if (prop != NULL) {
7103*6777b538SAndroid Build Coastguard Worker xmlNodePtr children = NULL;
7104*6777b538SAndroid Build Coastguard Worker
7105*6777b538SAndroid Build Coastguard Worker /*
7106*6777b538SAndroid Build Coastguard Worker * Modify the attribute's value.
7107*6777b538SAndroid Build Coastguard Worker */
7108*6777b538SAndroid Build Coastguard Worker if (value != NULL) {
7109*6777b538SAndroid Build Coastguard Worker children = xmlNewDocText(node->doc, value);
7110*6777b538SAndroid Build Coastguard Worker if (children == NULL)
7111*6777b538SAndroid Build Coastguard Worker return(NULL);
7112*6777b538SAndroid Build Coastguard Worker }
7113*6777b538SAndroid Build Coastguard Worker
7114*6777b538SAndroid Build Coastguard Worker if (prop->atype == XML_ATTRIBUTE_ID) {
7115*6777b538SAndroid Build Coastguard Worker xmlRemoveID(node->doc, prop);
7116*6777b538SAndroid Build Coastguard Worker prop->atype = XML_ATTRIBUTE_ID;
7117*6777b538SAndroid Build Coastguard Worker }
7118*6777b538SAndroid Build Coastguard Worker if (prop->children != NULL)
7119*6777b538SAndroid Build Coastguard Worker xmlFreeNodeList(prop->children);
7120*6777b538SAndroid Build Coastguard Worker prop->children = NULL;
7121*6777b538SAndroid Build Coastguard Worker prop->last = NULL;
7122*6777b538SAndroid Build Coastguard Worker prop->ns = ns;
7123*6777b538SAndroid Build Coastguard Worker if (value != NULL) {
7124*6777b538SAndroid Build Coastguard Worker xmlNodePtr tmp;
7125*6777b538SAndroid Build Coastguard Worker
7126*6777b538SAndroid Build Coastguard Worker prop->children = children;
7127*6777b538SAndroid Build Coastguard Worker prop->last = NULL;
7128*6777b538SAndroid Build Coastguard Worker tmp = prop->children;
7129*6777b538SAndroid Build Coastguard Worker while (tmp != NULL) {
7130*6777b538SAndroid Build Coastguard Worker tmp->parent = (xmlNodePtr) prop;
7131*6777b538SAndroid Build Coastguard Worker if (tmp->next == NULL)
7132*6777b538SAndroid Build Coastguard Worker prop->last = tmp;
7133*6777b538SAndroid Build Coastguard Worker tmp = tmp->next;
7134*6777b538SAndroid Build Coastguard Worker }
7135*6777b538SAndroid Build Coastguard Worker }
7136*6777b538SAndroid Build Coastguard Worker if ((prop->atype == XML_ATTRIBUTE_ID) &&
7137*6777b538SAndroid Build Coastguard Worker (xmlAddIDSafe(node->doc, value, prop, 0, NULL) < 0)) {
7138*6777b538SAndroid Build Coastguard Worker return(NULL);
7139*6777b538SAndroid Build Coastguard Worker }
7140*6777b538SAndroid Build Coastguard Worker return(prop);
7141*6777b538SAndroid Build Coastguard Worker }
7142*6777b538SAndroid Build Coastguard Worker /*
7143*6777b538SAndroid Build Coastguard Worker * No equal attr found; create a new one.
7144*6777b538SAndroid Build Coastguard Worker */
7145*6777b538SAndroid Build Coastguard Worker return(xmlNewPropInternal(node, ns, name, value, 0));
7146*6777b538SAndroid Build Coastguard Worker }
7147*6777b538SAndroid Build Coastguard Worker
7148*6777b538SAndroid Build Coastguard Worker #endif /* LIBXML_TREE_ENABLED */
7149*6777b538SAndroid Build Coastguard Worker
7150*6777b538SAndroid Build Coastguard Worker /**
7151*6777b538SAndroid Build Coastguard Worker * xmlNodeIsText:
7152*6777b538SAndroid Build Coastguard Worker * @node: the node
7153*6777b538SAndroid Build Coastguard Worker *
7154*6777b538SAndroid Build Coastguard Worker * Is this node a Text node ?
7155*6777b538SAndroid Build Coastguard Worker * Returns 1 yes, 0 no
7156*6777b538SAndroid Build Coastguard Worker */
7157*6777b538SAndroid Build Coastguard Worker int
xmlNodeIsText(const xmlNode * node)7158*6777b538SAndroid Build Coastguard Worker xmlNodeIsText(const xmlNode *node) {
7159*6777b538SAndroid Build Coastguard Worker if (node == NULL) return(0);
7160*6777b538SAndroid Build Coastguard Worker
7161*6777b538SAndroid Build Coastguard Worker if (node->type == XML_TEXT_NODE) return(1);
7162*6777b538SAndroid Build Coastguard Worker return(0);
7163*6777b538SAndroid Build Coastguard Worker }
7164*6777b538SAndroid Build Coastguard Worker
7165*6777b538SAndroid Build Coastguard Worker /**
7166*6777b538SAndroid Build Coastguard Worker * xmlIsBlankNode:
7167*6777b538SAndroid Build Coastguard Worker * @node: the node
7168*6777b538SAndroid Build Coastguard Worker *
7169*6777b538SAndroid Build Coastguard Worker * Checks whether this node is an empty or whitespace only
7170*6777b538SAndroid Build Coastguard Worker * (and possibly ignorable) text-node.
7171*6777b538SAndroid Build Coastguard Worker *
7172*6777b538SAndroid Build Coastguard Worker * Returns 1 yes, 0 no
7173*6777b538SAndroid Build Coastguard Worker */
7174*6777b538SAndroid Build Coastguard Worker int
xmlIsBlankNode(const xmlNode * node)7175*6777b538SAndroid Build Coastguard Worker xmlIsBlankNode(const xmlNode *node) {
7176*6777b538SAndroid Build Coastguard Worker const xmlChar *cur;
7177*6777b538SAndroid Build Coastguard Worker if (node == NULL) return(0);
7178*6777b538SAndroid Build Coastguard Worker
7179*6777b538SAndroid Build Coastguard Worker if ((node->type != XML_TEXT_NODE) &&
7180*6777b538SAndroid Build Coastguard Worker (node->type != XML_CDATA_SECTION_NODE))
7181*6777b538SAndroid Build Coastguard Worker return(0);
7182*6777b538SAndroid Build Coastguard Worker if (node->content == NULL) return(1);
7183*6777b538SAndroid Build Coastguard Worker cur = node->content;
7184*6777b538SAndroid Build Coastguard Worker while (*cur != 0) {
7185*6777b538SAndroid Build Coastguard Worker if (!IS_BLANK_CH(*cur)) return(0);
7186*6777b538SAndroid Build Coastguard Worker cur++;
7187*6777b538SAndroid Build Coastguard Worker }
7188*6777b538SAndroid Build Coastguard Worker
7189*6777b538SAndroid Build Coastguard Worker return(1);
7190*6777b538SAndroid Build Coastguard Worker }
7191*6777b538SAndroid Build Coastguard Worker
7192*6777b538SAndroid Build Coastguard Worker /**
7193*6777b538SAndroid Build Coastguard Worker * xmlTextConcat:
7194*6777b538SAndroid Build Coastguard Worker * @node: the node
7195*6777b538SAndroid Build Coastguard Worker * @content: the content
7196*6777b538SAndroid Build Coastguard Worker * @len: @content length
7197*6777b538SAndroid Build Coastguard Worker *
7198*6777b538SAndroid Build Coastguard Worker * Concat the given string at the end of the existing node content
7199*6777b538SAndroid Build Coastguard Worker *
7200*6777b538SAndroid Build Coastguard Worker * Returns -1 in case of error, 0 otherwise
7201*6777b538SAndroid Build Coastguard Worker */
7202*6777b538SAndroid Build Coastguard Worker
7203*6777b538SAndroid Build Coastguard Worker int
xmlTextConcat(xmlNodePtr node,const xmlChar * content,int len)7204*6777b538SAndroid Build Coastguard Worker xmlTextConcat(xmlNodePtr node, const xmlChar *content, int len) {
7205*6777b538SAndroid Build Coastguard Worker if (node == NULL) return(-1);
7206*6777b538SAndroid Build Coastguard Worker
7207*6777b538SAndroid Build Coastguard Worker if ((node->type != XML_TEXT_NODE) &&
7208*6777b538SAndroid Build Coastguard Worker (node->type != XML_CDATA_SECTION_NODE) &&
7209*6777b538SAndroid Build Coastguard Worker (node->type != XML_COMMENT_NODE) &&
7210*6777b538SAndroid Build Coastguard Worker (node->type != XML_PI_NODE)) {
7211*6777b538SAndroid Build Coastguard Worker return(-1);
7212*6777b538SAndroid Build Coastguard Worker }
7213*6777b538SAndroid Build Coastguard Worker /* need to check if content is currently in the dictionary */
7214*6777b538SAndroid Build Coastguard Worker if ((node->content == (xmlChar *) &(node->properties)) ||
7215*6777b538SAndroid Build Coastguard Worker ((node->doc != NULL) && (node->doc->dict != NULL) &&
7216*6777b538SAndroid Build Coastguard Worker xmlDictOwns(node->doc->dict, node->content))) {
7217*6777b538SAndroid Build Coastguard Worker node->content = xmlStrncatNew(node->content, content, len);
7218*6777b538SAndroid Build Coastguard Worker } else {
7219*6777b538SAndroid Build Coastguard Worker node->content = xmlStrncat(node->content, content, len);
7220*6777b538SAndroid Build Coastguard Worker }
7221*6777b538SAndroid Build Coastguard Worker node->properties = NULL;
7222*6777b538SAndroid Build Coastguard Worker if (node->content == NULL)
7223*6777b538SAndroid Build Coastguard Worker return(-1);
7224*6777b538SAndroid Build Coastguard Worker return(0);
7225*6777b538SAndroid Build Coastguard Worker }
7226*6777b538SAndroid Build Coastguard Worker
7227*6777b538SAndroid Build Coastguard Worker /************************************************************************
7228*6777b538SAndroid Build Coastguard Worker * *
7229*6777b538SAndroid Build Coastguard Worker * Output : to a FILE or in memory *
7230*6777b538SAndroid Build Coastguard Worker * *
7231*6777b538SAndroid Build Coastguard Worker ************************************************************************/
7232*6777b538SAndroid Build Coastguard Worker
7233*6777b538SAndroid Build Coastguard Worker /**
7234*6777b538SAndroid Build Coastguard Worker * xmlBufferCreate:
7235*6777b538SAndroid Build Coastguard Worker *
7236*6777b538SAndroid Build Coastguard Worker * routine to create an XML buffer.
7237*6777b538SAndroid Build Coastguard Worker * returns the new structure.
7238*6777b538SAndroid Build Coastguard Worker */
7239*6777b538SAndroid Build Coastguard Worker xmlBufferPtr
xmlBufferCreate(void)7240*6777b538SAndroid Build Coastguard Worker xmlBufferCreate(void) {
7241*6777b538SAndroid Build Coastguard Worker xmlBufferPtr ret;
7242*6777b538SAndroid Build Coastguard Worker
7243*6777b538SAndroid Build Coastguard Worker ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer));
7244*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
7245*6777b538SAndroid Build Coastguard Worker return(NULL);
7246*6777b538SAndroid Build Coastguard Worker ret->use = 0;
7247*6777b538SAndroid Build Coastguard Worker ret->size = xmlDefaultBufferSize;
7248*6777b538SAndroid Build Coastguard Worker ret->alloc = xmlBufferAllocScheme;
7249*6777b538SAndroid Build Coastguard Worker ret->content = (xmlChar *) xmlMallocAtomic(ret->size);
7250*6777b538SAndroid Build Coastguard Worker if (ret->content == NULL) {
7251*6777b538SAndroid Build Coastguard Worker xmlFree(ret);
7252*6777b538SAndroid Build Coastguard Worker return(NULL);
7253*6777b538SAndroid Build Coastguard Worker }
7254*6777b538SAndroid Build Coastguard Worker ret->content[0] = 0;
7255*6777b538SAndroid Build Coastguard Worker ret->contentIO = NULL;
7256*6777b538SAndroid Build Coastguard Worker return(ret);
7257*6777b538SAndroid Build Coastguard Worker }
7258*6777b538SAndroid Build Coastguard Worker
7259*6777b538SAndroid Build Coastguard Worker /**
7260*6777b538SAndroid Build Coastguard Worker * xmlBufferCreateSize:
7261*6777b538SAndroid Build Coastguard Worker * @size: initial size of buffer
7262*6777b538SAndroid Build Coastguard Worker *
7263*6777b538SAndroid Build Coastguard Worker * routine to create an XML buffer.
7264*6777b538SAndroid Build Coastguard Worker * returns the new structure.
7265*6777b538SAndroid Build Coastguard Worker */
7266*6777b538SAndroid Build Coastguard Worker xmlBufferPtr
xmlBufferCreateSize(size_t size)7267*6777b538SAndroid Build Coastguard Worker xmlBufferCreateSize(size_t size) {
7268*6777b538SAndroid Build Coastguard Worker xmlBufferPtr ret;
7269*6777b538SAndroid Build Coastguard Worker
7270*6777b538SAndroid Build Coastguard Worker if (size >= UINT_MAX)
7271*6777b538SAndroid Build Coastguard Worker return(NULL);
7272*6777b538SAndroid Build Coastguard Worker ret = (xmlBufferPtr) xmlMalloc(sizeof(xmlBuffer));
7273*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
7274*6777b538SAndroid Build Coastguard Worker return(NULL);
7275*6777b538SAndroid Build Coastguard Worker ret->use = 0;
7276*6777b538SAndroid Build Coastguard Worker ret->alloc = xmlBufferAllocScheme;
7277*6777b538SAndroid Build Coastguard Worker ret->size = (size ? size + 1 : 0); /* +1 for ending null */
7278*6777b538SAndroid Build Coastguard Worker if (ret->size){
7279*6777b538SAndroid Build Coastguard Worker ret->content = (xmlChar *) xmlMallocAtomic(ret->size);
7280*6777b538SAndroid Build Coastguard Worker if (ret->content == NULL) {
7281*6777b538SAndroid Build Coastguard Worker xmlFree(ret);
7282*6777b538SAndroid Build Coastguard Worker return(NULL);
7283*6777b538SAndroid Build Coastguard Worker }
7284*6777b538SAndroid Build Coastguard Worker ret->content[0] = 0;
7285*6777b538SAndroid Build Coastguard Worker } else
7286*6777b538SAndroid Build Coastguard Worker ret->content = NULL;
7287*6777b538SAndroid Build Coastguard Worker ret->contentIO = NULL;
7288*6777b538SAndroid Build Coastguard Worker return(ret);
7289*6777b538SAndroid Build Coastguard Worker }
7290*6777b538SAndroid Build Coastguard Worker
7291*6777b538SAndroid Build Coastguard Worker /**
7292*6777b538SAndroid Build Coastguard Worker * xmlBufferDetach:
7293*6777b538SAndroid Build Coastguard Worker * @buf: the buffer
7294*6777b538SAndroid Build Coastguard Worker *
7295*6777b538SAndroid Build Coastguard Worker * Remove the string contained in a buffer and gie it back to the
7296*6777b538SAndroid Build Coastguard Worker * caller. The buffer is reset to an empty content.
7297*6777b538SAndroid Build Coastguard Worker * This doesn't work with immutable buffers as they can't be reset.
7298*6777b538SAndroid Build Coastguard Worker *
7299*6777b538SAndroid Build Coastguard Worker * Returns the previous string contained by the buffer.
7300*6777b538SAndroid Build Coastguard Worker */
7301*6777b538SAndroid Build Coastguard Worker xmlChar *
xmlBufferDetach(xmlBufferPtr buf)7302*6777b538SAndroid Build Coastguard Worker xmlBufferDetach(xmlBufferPtr buf) {
7303*6777b538SAndroid Build Coastguard Worker xmlChar *ret;
7304*6777b538SAndroid Build Coastguard Worker
7305*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
7306*6777b538SAndroid Build Coastguard Worker return(NULL);
7307*6777b538SAndroid Build Coastguard Worker
7308*6777b538SAndroid Build Coastguard Worker ret = buf->content;
7309*6777b538SAndroid Build Coastguard Worker buf->content = NULL;
7310*6777b538SAndroid Build Coastguard Worker buf->size = 0;
7311*6777b538SAndroid Build Coastguard Worker buf->use = 0;
7312*6777b538SAndroid Build Coastguard Worker
7313*6777b538SAndroid Build Coastguard Worker return ret;
7314*6777b538SAndroid Build Coastguard Worker }
7315*6777b538SAndroid Build Coastguard Worker
7316*6777b538SAndroid Build Coastguard Worker
7317*6777b538SAndroid Build Coastguard Worker /**
7318*6777b538SAndroid Build Coastguard Worker * xmlBufferCreateStatic:
7319*6777b538SAndroid Build Coastguard Worker * @mem: the memory area
7320*6777b538SAndroid Build Coastguard Worker * @size: the size in byte
7321*6777b538SAndroid Build Coastguard Worker *
7322*6777b538SAndroid Build Coastguard Worker * Returns an XML buffer initialized with bytes.
7323*6777b538SAndroid Build Coastguard Worker */
7324*6777b538SAndroid Build Coastguard Worker xmlBufferPtr
xmlBufferCreateStatic(void * mem,size_t size)7325*6777b538SAndroid Build Coastguard Worker xmlBufferCreateStatic(void *mem, size_t size) {
7326*6777b538SAndroid Build Coastguard Worker xmlBufferPtr buf = xmlBufferCreateSize(size);
7327*6777b538SAndroid Build Coastguard Worker
7328*6777b538SAndroid Build Coastguard Worker xmlBufferAdd(buf, mem, size);
7329*6777b538SAndroid Build Coastguard Worker return(buf);
7330*6777b538SAndroid Build Coastguard Worker }
7331*6777b538SAndroid Build Coastguard Worker
7332*6777b538SAndroid Build Coastguard Worker /**
7333*6777b538SAndroid Build Coastguard Worker * xmlBufferSetAllocationScheme:
7334*6777b538SAndroid Build Coastguard Worker * @buf: the buffer to tune
7335*6777b538SAndroid Build Coastguard Worker * @scheme: allocation scheme to use
7336*6777b538SAndroid Build Coastguard Worker *
7337*6777b538SAndroid Build Coastguard Worker * Sets the allocation scheme for this buffer
7338*6777b538SAndroid Build Coastguard Worker */
7339*6777b538SAndroid Build Coastguard Worker void
xmlBufferSetAllocationScheme(xmlBufferPtr buf,xmlBufferAllocationScheme scheme)7340*6777b538SAndroid Build Coastguard Worker xmlBufferSetAllocationScheme(xmlBufferPtr buf,
7341*6777b538SAndroid Build Coastguard Worker xmlBufferAllocationScheme scheme) {
7342*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
7343*6777b538SAndroid Build Coastguard Worker return;
7344*6777b538SAndroid Build Coastguard Worker }
7345*6777b538SAndroid Build Coastguard Worker if (buf->alloc == XML_BUFFER_ALLOC_IO) return;
7346*6777b538SAndroid Build Coastguard Worker if ((scheme == XML_BUFFER_ALLOC_DOUBLEIT) ||
7347*6777b538SAndroid Build Coastguard Worker (scheme == XML_BUFFER_ALLOC_EXACT) ||
7348*6777b538SAndroid Build Coastguard Worker (scheme == XML_BUFFER_ALLOC_HYBRID))
7349*6777b538SAndroid Build Coastguard Worker buf->alloc = scheme;
7350*6777b538SAndroid Build Coastguard Worker }
7351*6777b538SAndroid Build Coastguard Worker
7352*6777b538SAndroid Build Coastguard Worker /**
7353*6777b538SAndroid Build Coastguard Worker * xmlBufferFree:
7354*6777b538SAndroid Build Coastguard Worker * @buf: the buffer to free
7355*6777b538SAndroid Build Coastguard Worker *
7356*6777b538SAndroid Build Coastguard Worker * Frees an XML buffer. It frees both the content and the structure which
7357*6777b538SAndroid Build Coastguard Worker * encapsulate it.
7358*6777b538SAndroid Build Coastguard Worker */
7359*6777b538SAndroid Build Coastguard Worker void
xmlBufferFree(xmlBufferPtr buf)7360*6777b538SAndroid Build Coastguard Worker xmlBufferFree(xmlBufferPtr buf) {
7361*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
7362*6777b538SAndroid Build Coastguard Worker return;
7363*6777b538SAndroid Build Coastguard Worker }
7364*6777b538SAndroid Build Coastguard Worker
7365*6777b538SAndroid Build Coastguard Worker if ((buf->alloc == XML_BUFFER_ALLOC_IO) &&
7366*6777b538SAndroid Build Coastguard Worker (buf->contentIO != NULL)) {
7367*6777b538SAndroid Build Coastguard Worker xmlFree(buf->contentIO);
7368*6777b538SAndroid Build Coastguard Worker } else if (buf->content != NULL) {
7369*6777b538SAndroid Build Coastguard Worker xmlFree(buf->content);
7370*6777b538SAndroid Build Coastguard Worker }
7371*6777b538SAndroid Build Coastguard Worker xmlFree(buf);
7372*6777b538SAndroid Build Coastguard Worker }
7373*6777b538SAndroid Build Coastguard Worker
7374*6777b538SAndroid Build Coastguard Worker /**
7375*6777b538SAndroid Build Coastguard Worker * xmlBufferEmpty:
7376*6777b538SAndroid Build Coastguard Worker * @buf: the buffer
7377*6777b538SAndroid Build Coastguard Worker *
7378*6777b538SAndroid Build Coastguard Worker * empty a buffer.
7379*6777b538SAndroid Build Coastguard Worker */
7380*6777b538SAndroid Build Coastguard Worker void
xmlBufferEmpty(xmlBufferPtr buf)7381*6777b538SAndroid Build Coastguard Worker xmlBufferEmpty(xmlBufferPtr buf) {
7382*6777b538SAndroid Build Coastguard Worker if (buf == NULL) return;
7383*6777b538SAndroid Build Coastguard Worker if (buf->content == NULL) return;
7384*6777b538SAndroid Build Coastguard Worker buf->use = 0;
7385*6777b538SAndroid Build Coastguard Worker if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
7386*6777b538SAndroid Build Coastguard Worker size_t start_buf = buf->content - buf->contentIO;
7387*6777b538SAndroid Build Coastguard Worker
7388*6777b538SAndroid Build Coastguard Worker buf->size += start_buf;
7389*6777b538SAndroid Build Coastguard Worker buf->content = buf->contentIO;
7390*6777b538SAndroid Build Coastguard Worker buf->content[0] = 0;
7391*6777b538SAndroid Build Coastguard Worker } else {
7392*6777b538SAndroid Build Coastguard Worker buf->content[0] = 0;
7393*6777b538SAndroid Build Coastguard Worker }
7394*6777b538SAndroid Build Coastguard Worker }
7395*6777b538SAndroid Build Coastguard Worker
7396*6777b538SAndroid Build Coastguard Worker /**
7397*6777b538SAndroid Build Coastguard Worker * xmlBufferShrink:
7398*6777b538SAndroid Build Coastguard Worker * @buf: the buffer to dump
7399*6777b538SAndroid Build Coastguard Worker * @len: the number of xmlChar to remove
7400*6777b538SAndroid Build Coastguard Worker *
7401*6777b538SAndroid Build Coastguard Worker * Remove the beginning of an XML buffer.
7402*6777b538SAndroid Build Coastguard Worker *
7403*6777b538SAndroid Build Coastguard Worker * Returns the number of #xmlChar removed, or -1 in case of failure.
7404*6777b538SAndroid Build Coastguard Worker */
7405*6777b538SAndroid Build Coastguard Worker int
xmlBufferShrink(xmlBufferPtr buf,unsigned int len)7406*6777b538SAndroid Build Coastguard Worker xmlBufferShrink(xmlBufferPtr buf, unsigned int len) {
7407*6777b538SAndroid Build Coastguard Worker if (buf == NULL) return(-1);
7408*6777b538SAndroid Build Coastguard Worker if (len == 0) return(0);
7409*6777b538SAndroid Build Coastguard Worker if (len > buf->use) return(-1);
7410*6777b538SAndroid Build Coastguard Worker
7411*6777b538SAndroid Build Coastguard Worker buf->use -= len;
7412*6777b538SAndroid Build Coastguard Worker if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
7413*6777b538SAndroid Build Coastguard Worker /*
7414*6777b538SAndroid Build Coastguard Worker * we just move the content pointer, but also make sure
7415*6777b538SAndroid Build Coastguard Worker * the perceived buffer size has shrunk accordingly
7416*6777b538SAndroid Build Coastguard Worker */
7417*6777b538SAndroid Build Coastguard Worker buf->content += len;
7418*6777b538SAndroid Build Coastguard Worker buf->size -= len;
7419*6777b538SAndroid Build Coastguard Worker
7420*6777b538SAndroid Build Coastguard Worker /*
7421*6777b538SAndroid Build Coastguard Worker * sometimes though it maybe be better to really shrink
7422*6777b538SAndroid Build Coastguard Worker * on IO buffers
7423*6777b538SAndroid Build Coastguard Worker */
7424*6777b538SAndroid Build Coastguard Worker if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
7425*6777b538SAndroid Build Coastguard Worker size_t start_buf = buf->content - buf->contentIO;
7426*6777b538SAndroid Build Coastguard Worker if (start_buf >= buf->size) {
7427*6777b538SAndroid Build Coastguard Worker memmove(buf->contentIO, &buf->content[0], buf->use);
7428*6777b538SAndroid Build Coastguard Worker buf->content = buf->contentIO;
7429*6777b538SAndroid Build Coastguard Worker buf->content[buf->use] = 0;
7430*6777b538SAndroid Build Coastguard Worker buf->size += start_buf;
7431*6777b538SAndroid Build Coastguard Worker }
7432*6777b538SAndroid Build Coastguard Worker }
7433*6777b538SAndroid Build Coastguard Worker } else {
7434*6777b538SAndroid Build Coastguard Worker memmove(buf->content, &buf->content[len], buf->use);
7435*6777b538SAndroid Build Coastguard Worker buf->content[buf->use] = 0;
7436*6777b538SAndroid Build Coastguard Worker }
7437*6777b538SAndroid Build Coastguard Worker return(len);
7438*6777b538SAndroid Build Coastguard Worker }
7439*6777b538SAndroid Build Coastguard Worker
7440*6777b538SAndroid Build Coastguard Worker /**
7441*6777b538SAndroid Build Coastguard Worker * xmlBufferGrow:
7442*6777b538SAndroid Build Coastguard Worker * @buf: the buffer
7443*6777b538SAndroid Build Coastguard Worker * @len: the minimum free size to allocate
7444*6777b538SAndroid Build Coastguard Worker *
7445*6777b538SAndroid Build Coastguard Worker * Grow the available space of an XML buffer.
7446*6777b538SAndroid Build Coastguard Worker *
7447*6777b538SAndroid Build Coastguard Worker * Returns the new available space or -1 in case of error
7448*6777b538SAndroid Build Coastguard Worker */
7449*6777b538SAndroid Build Coastguard Worker int
xmlBufferGrow(xmlBufferPtr buf,unsigned int len)7450*6777b538SAndroid Build Coastguard Worker xmlBufferGrow(xmlBufferPtr buf, unsigned int len) {
7451*6777b538SAndroid Build Coastguard Worker unsigned int size;
7452*6777b538SAndroid Build Coastguard Worker xmlChar *newbuf;
7453*6777b538SAndroid Build Coastguard Worker
7454*6777b538SAndroid Build Coastguard Worker if (buf == NULL) return(-1);
7455*6777b538SAndroid Build Coastguard Worker
7456*6777b538SAndroid Build Coastguard Worker if (len < buf->size - buf->use)
7457*6777b538SAndroid Build Coastguard Worker return(0);
7458*6777b538SAndroid Build Coastguard Worker if (len >= UINT_MAX - buf->use)
7459*6777b538SAndroid Build Coastguard Worker return(-1);
7460*6777b538SAndroid Build Coastguard Worker
7461*6777b538SAndroid Build Coastguard Worker if (buf->size > (size_t) len) {
7462*6777b538SAndroid Build Coastguard Worker size = buf->size > UINT_MAX / 2 ? UINT_MAX : buf->size * 2;
7463*6777b538SAndroid Build Coastguard Worker } else {
7464*6777b538SAndroid Build Coastguard Worker size = buf->use + len;
7465*6777b538SAndroid Build Coastguard Worker size = size > UINT_MAX - 100 ? UINT_MAX : size + 100;
7466*6777b538SAndroid Build Coastguard Worker }
7467*6777b538SAndroid Build Coastguard Worker
7468*6777b538SAndroid Build Coastguard Worker if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
7469*6777b538SAndroid Build Coastguard Worker size_t start_buf = buf->content - buf->contentIO;
7470*6777b538SAndroid Build Coastguard Worker
7471*6777b538SAndroid Build Coastguard Worker newbuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + size);
7472*6777b538SAndroid Build Coastguard Worker if (newbuf == NULL)
7473*6777b538SAndroid Build Coastguard Worker return(-1);
7474*6777b538SAndroid Build Coastguard Worker buf->contentIO = newbuf;
7475*6777b538SAndroid Build Coastguard Worker buf->content = newbuf + start_buf;
7476*6777b538SAndroid Build Coastguard Worker } else {
7477*6777b538SAndroid Build Coastguard Worker newbuf = (xmlChar *) xmlRealloc(buf->content, size);
7478*6777b538SAndroid Build Coastguard Worker if (newbuf == NULL)
7479*6777b538SAndroid Build Coastguard Worker return(-1);
7480*6777b538SAndroid Build Coastguard Worker buf->content = newbuf;
7481*6777b538SAndroid Build Coastguard Worker }
7482*6777b538SAndroid Build Coastguard Worker buf->size = size;
7483*6777b538SAndroid Build Coastguard Worker return(buf->size - buf->use - 1);
7484*6777b538SAndroid Build Coastguard Worker }
7485*6777b538SAndroid Build Coastguard Worker
7486*6777b538SAndroid Build Coastguard Worker /**
7487*6777b538SAndroid Build Coastguard Worker * xmlBufferDump:
7488*6777b538SAndroid Build Coastguard Worker * @file: the file output
7489*6777b538SAndroid Build Coastguard Worker * @buf: the buffer to dump
7490*6777b538SAndroid Build Coastguard Worker *
7491*6777b538SAndroid Build Coastguard Worker * Dumps an XML buffer to a FILE *.
7492*6777b538SAndroid Build Coastguard Worker * Returns the number of #xmlChar written
7493*6777b538SAndroid Build Coastguard Worker */
7494*6777b538SAndroid Build Coastguard Worker int
xmlBufferDump(FILE * file,xmlBufferPtr buf)7495*6777b538SAndroid Build Coastguard Worker xmlBufferDump(FILE *file, xmlBufferPtr buf) {
7496*6777b538SAndroid Build Coastguard Worker size_t ret;
7497*6777b538SAndroid Build Coastguard Worker
7498*6777b538SAndroid Build Coastguard Worker if (buf == NULL) {
7499*6777b538SAndroid Build Coastguard Worker return(0);
7500*6777b538SAndroid Build Coastguard Worker }
7501*6777b538SAndroid Build Coastguard Worker if (buf->content == NULL) {
7502*6777b538SAndroid Build Coastguard Worker return(0);
7503*6777b538SAndroid Build Coastguard Worker }
7504*6777b538SAndroid Build Coastguard Worker if (file == NULL)
7505*6777b538SAndroid Build Coastguard Worker file = stdout;
7506*6777b538SAndroid Build Coastguard Worker ret = fwrite(buf->content, 1, buf->use, file);
7507*6777b538SAndroid Build Coastguard Worker return(ret > INT_MAX ? INT_MAX : ret);
7508*6777b538SAndroid Build Coastguard Worker }
7509*6777b538SAndroid Build Coastguard Worker
7510*6777b538SAndroid Build Coastguard Worker /**
7511*6777b538SAndroid Build Coastguard Worker * xmlBufferContent:
7512*6777b538SAndroid Build Coastguard Worker * @buf: the buffer
7513*6777b538SAndroid Build Coastguard Worker *
7514*6777b538SAndroid Build Coastguard Worker * Function to extract the content of a buffer
7515*6777b538SAndroid Build Coastguard Worker *
7516*6777b538SAndroid Build Coastguard Worker * Returns the internal content
7517*6777b538SAndroid Build Coastguard Worker */
7518*6777b538SAndroid Build Coastguard Worker
7519*6777b538SAndroid Build Coastguard Worker const xmlChar *
xmlBufferContent(const xmlBuffer * buf)7520*6777b538SAndroid Build Coastguard Worker xmlBufferContent(const xmlBuffer *buf)
7521*6777b538SAndroid Build Coastguard Worker {
7522*6777b538SAndroid Build Coastguard Worker if(!buf)
7523*6777b538SAndroid Build Coastguard Worker return NULL;
7524*6777b538SAndroid Build Coastguard Worker
7525*6777b538SAndroid Build Coastguard Worker return buf->content;
7526*6777b538SAndroid Build Coastguard Worker }
7527*6777b538SAndroid Build Coastguard Worker
7528*6777b538SAndroid Build Coastguard Worker /**
7529*6777b538SAndroid Build Coastguard Worker * xmlBufferLength:
7530*6777b538SAndroid Build Coastguard Worker * @buf: the buffer
7531*6777b538SAndroid Build Coastguard Worker *
7532*6777b538SAndroid Build Coastguard Worker * Function to get the length of a buffer
7533*6777b538SAndroid Build Coastguard Worker *
7534*6777b538SAndroid Build Coastguard Worker * Returns the length of data in the internal content
7535*6777b538SAndroid Build Coastguard Worker */
7536*6777b538SAndroid Build Coastguard Worker
7537*6777b538SAndroid Build Coastguard Worker int
xmlBufferLength(const xmlBuffer * buf)7538*6777b538SAndroid Build Coastguard Worker xmlBufferLength(const xmlBuffer *buf)
7539*6777b538SAndroid Build Coastguard Worker {
7540*6777b538SAndroid Build Coastguard Worker if(!buf)
7541*6777b538SAndroid Build Coastguard Worker return 0;
7542*6777b538SAndroid Build Coastguard Worker
7543*6777b538SAndroid Build Coastguard Worker return buf->use;
7544*6777b538SAndroid Build Coastguard Worker }
7545*6777b538SAndroid Build Coastguard Worker
7546*6777b538SAndroid Build Coastguard Worker /**
7547*6777b538SAndroid Build Coastguard Worker * xmlBufferResize:
7548*6777b538SAndroid Build Coastguard Worker * @buf: the buffer to resize
7549*6777b538SAndroid Build Coastguard Worker * @size: the desired size
7550*6777b538SAndroid Build Coastguard Worker *
7551*6777b538SAndroid Build Coastguard Worker * Resize a buffer to accommodate minimum size of @size.
7552*6777b538SAndroid Build Coastguard Worker *
7553*6777b538SAndroid Build Coastguard Worker * Returns 0 in case of problems, 1 otherwise
7554*6777b538SAndroid Build Coastguard Worker */
7555*6777b538SAndroid Build Coastguard Worker int
xmlBufferResize(xmlBufferPtr buf,unsigned int size)7556*6777b538SAndroid Build Coastguard Worker xmlBufferResize(xmlBufferPtr buf, unsigned int size)
7557*6777b538SAndroid Build Coastguard Worker {
7558*6777b538SAndroid Build Coastguard Worker unsigned int newSize;
7559*6777b538SAndroid Build Coastguard Worker xmlChar* rebuf = NULL;
7560*6777b538SAndroid Build Coastguard Worker size_t start_buf;
7561*6777b538SAndroid Build Coastguard Worker
7562*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
7563*6777b538SAndroid Build Coastguard Worker return(0);
7564*6777b538SAndroid Build Coastguard Worker
7565*6777b538SAndroid Build Coastguard Worker /* Don't resize if we don't have to */
7566*6777b538SAndroid Build Coastguard Worker if (size < buf->size)
7567*6777b538SAndroid Build Coastguard Worker return 1;
7568*6777b538SAndroid Build Coastguard Worker
7569*6777b538SAndroid Build Coastguard Worker if (size > UINT_MAX - 10)
7570*6777b538SAndroid Build Coastguard Worker return 0;
7571*6777b538SAndroid Build Coastguard Worker
7572*6777b538SAndroid Build Coastguard Worker /* figure out new size */
7573*6777b538SAndroid Build Coastguard Worker switch (buf->alloc){
7574*6777b538SAndroid Build Coastguard Worker case XML_BUFFER_ALLOC_IO:
7575*6777b538SAndroid Build Coastguard Worker case XML_BUFFER_ALLOC_DOUBLEIT:
7576*6777b538SAndroid Build Coastguard Worker /*take care of empty case*/
7577*6777b538SAndroid Build Coastguard Worker if (buf->size == 0)
7578*6777b538SAndroid Build Coastguard Worker newSize = (size > UINT_MAX - 10 ? UINT_MAX : size + 10);
7579*6777b538SAndroid Build Coastguard Worker else
7580*6777b538SAndroid Build Coastguard Worker newSize = buf->size;
7581*6777b538SAndroid Build Coastguard Worker while (size > newSize) {
7582*6777b538SAndroid Build Coastguard Worker if (newSize > UINT_MAX / 2)
7583*6777b538SAndroid Build Coastguard Worker return 0;
7584*6777b538SAndroid Build Coastguard Worker newSize *= 2;
7585*6777b538SAndroid Build Coastguard Worker }
7586*6777b538SAndroid Build Coastguard Worker break;
7587*6777b538SAndroid Build Coastguard Worker case XML_BUFFER_ALLOC_EXACT:
7588*6777b538SAndroid Build Coastguard Worker newSize = (size > UINT_MAX - 10 ? UINT_MAX : size + 10);
7589*6777b538SAndroid Build Coastguard Worker break;
7590*6777b538SAndroid Build Coastguard Worker case XML_BUFFER_ALLOC_HYBRID:
7591*6777b538SAndroid Build Coastguard Worker if (buf->use < BASE_BUFFER_SIZE)
7592*6777b538SAndroid Build Coastguard Worker newSize = size;
7593*6777b538SAndroid Build Coastguard Worker else {
7594*6777b538SAndroid Build Coastguard Worker newSize = buf->size;
7595*6777b538SAndroid Build Coastguard Worker while (size > newSize) {
7596*6777b538SAndroid Build Coastguard Worker if (newSize > UINT_MAX / 2)
7597*6777b538SAndroid Build Coastguard Worker return 0;
7598*6777b538SAndroid Build Coastguard Worker newSize *= 2;
7599*6777b538SAndroid Build Coastguard Worker }
7600*6777b538SAndroid Build Coastguard Worker }
7601*6777b538SAndroid Build Coastguard Worker break;
7602*6777b538SAndroid Build Coastguard Worker
7603*6777b538SAndroid Build Coastguard Worker default:
7604*6777b538SAndroid Build Coastguard Worker newSize = (size > UINT_MAX - 10 ? UINT_MAX : size + 10);
7605*6777b538SAndroid Build Coastguard Worker break;
7606*6777b538SAndroid Build Coastguard Worker }
7607*6777b538SAndroid Build Coastguard Worker
7608*6777b538SAndroid Build Coastguard Worker if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
7609*6777b538SAndroid Build Coastguard Worker start_buf = buf->content - buf->contentIO;
7610*6777b538SAndroid Build Coastguard Worker
7611*6777b538SAndroid Build Coastguard Worker if (start_buf > newSize) {
7612*6777b538SAndroid Build Coastguard Worker /* move data back to start */
7613*6777b538SAndroid Build Coastguard Worker memmove(buf->contentIO, buf->content, buf->use);
7614*6777b538SAndroid Build Coastguard Worker buf->content = buf->contentIO;
7615*6777b538SAndroid Build Coastguard Worker buf->content[buf->use] = 0;
7616*6777b538SAndroid Build Coastguard Worker buf->size += start_buf;
7617*6777b538SAndroid Build Coastguard Worker } else {
7618*6777b538SAndroid Build Coastguard Worker rebuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + newSize);
7619*6777b538SAndroid Build Coastguard Worker if (rebuf == NULL)
7620*6777b538SAndroid Build Coastguard Worker return 0;
7621*6777b538SAndroid Build Coastguard Worker buf->contentIO = rebuf;
7622*6777b538SAndroid Build Coastguard Worker buf->content = rebuf + start_buf;
7623*6777b538SAndroid Build Coastguard Worker }
7624*6777b538SAndroid Build Coastguard Worker } else {
7625*6777b538SAndroid Build Coastguard Worker if (buf->content == NULL) {
7626*6777b538SAndroid Build Coastguard Worker rebuf = (xmlChar *) xmlMallocAtomic(newSize);
7627*6777b538SAndroid Build Coastguard Worker buf->use = 0;
7628*6777b538SAndroid Build Coastguard Worker rebuf[buf->use] = 0;
7629*6777b538SAndroid Build Coastguard Worker } else if (buf->size - buf->use < 100) {
7630*6777b538SAndroid Build Coastguard Worker rebuf = (xmlChar *) xmlRealloc(buf->content, newSize);
7631*6777b538SAndroid Build Coastguard Worker } else {
7632*6777b538SAndroid Build Coastguard Worker /*
7633*6777b538SAndroid Build Coastguard Worker * if we are reallocating a buffer far from being full, it's
7634*6777b538SAndroid Build Coastguard Worker * better to make a new allocation and copy only the used range
7635*6777b538SAndroid Build Coastguard Worker * and free the old one.
7636*6777b538SAndroid Build Coastguard Worker */
7637*6777b538SAndroid Build Coastguard Worker rebuf = (xmlChar *) xmlMallocAtomic(newSize);
7638*6777b538SAndroid Build Coastguard Worker if (rebuf != NULL) {
7639*6777b538SAndroid Build Coastguard Worker memcpy(rebuf, buf->content, buf->use);
7640*6777b538SAndroid Build Coastguard Worker xmlFree(buf->content);
7641*6777b538SAndroid Build Coastguard Worker rebuf[buf->use] = 0;
7642*6777b538SAndroid Build Coastguard Worker }
7643*6777b538SAndroid Build Coastguard Worker }
7644*6777b538SAndroid Build Coastguard Worker if (rebuf == NULL)
7645*6777b538SAndroid Build Coastguard Worker return 0;
7646*6777b538SAndroid Build Coastguard Worker buf->content = rebuf;
7647*6777b538SAndroid Build Coastguard Worker }
7648*6777b538SAndroid Build Coastguard Worker buf->size = newSize;
7649*6777b538SAndroid Build Coastguard Worker
7650*6777b538SAndroid Build Coastguard Worker return 1;
7651*6777b538SAndroid Build Coastguard Worker }
7652*6777b538SAndroid Build Coastguard Worker
7653*6777b538SAndroid Build Coastguard Worker /**
7654*6777b538SAndroid Build Coastguard Worker * xmlBufferAdd:
7655*6777b538SAndroid Build Coastguard Worker * @buf: the buffer to dump
7656*6777b538SAndroid Build Coastguard Worker * @str: the #xmlChar string
7657*6777b538SAndroid Build Coastguard Worker * @len: the number of #xmlChar to add
7658*6777b538SAndroid Build Coastguard Worker *
7659*6777b538SAndroid Build Coastguard Worker * Add a string range to an XML buffer. if len == -1, the length of
7660*6777b538SAndroid Build Coastguard Worker * str is recomputed.
7661*6777b538SAndroid Build Coastguard Worker *
7662*6777b538SAndroid Build Coastguard Worker * Returns 0 successful, a positive error code number otherwise
7663*6777b538SAndroid Build Coastguard Worker * and -1 in case of internal or API error.
7664*6777b538SAndroid Build Coastguard Worker */
7665*6777b538SAndroid Build Coastguard Worker int
xmlBufferAdd(xmlBufferPtr buf,const xmlChar * str,int len)7666*6777b538SAndroid Build Coastguard Worker xmlBufferAdd(xmlBufferPtr buf, const xmlChar *str, int len) {
7667*6777b538SAndroid Build Coastguard Worker unsigned int needSize;
7668*6777b538SAndroid Build Coastguard Worker
7669*6777b538SAndroid Build Coastguard Worker if ((str == NULL) || (buf == NULL)) {
7670*6777b538SAndroid Build Coastguard Worker return -1;
7671*6777b538SAndroid Build Coastguard Worker }
7672*6777b538SAndroid Build Coastguard Worker if (len < -1) {
7673*6777b538SAndroid Build Coastguard Worker return -1;
7674*6777b538SAndroid Build Coastguard Worker }
7675*6777b538SAndroid Build Coastguard Worker if (len == 0) return 0;
7676*6777b538SAndroid Build Coastguard Worker
7677*6777b538SAndroid Build Coastguard Worker if (len < 0)
7678*6777b538SAndroid Build Coastguard Worker len = xmlStrlen(str);
7679*6777b538SAndroid Build Coastguard Worker
7680*6777b538SAndroid Build Coastguard Worker if (len < 0) return -1;
7681*6777b538SAndroid Build Coastguard Worker if (len == 0) return 0;
7682*6777b538SAndroid Build Coastguard Worker
7683*6777b538SAndroid Build Coastguard Worker /* Note that both buf->size and buf->use can be zero here. */
7684*6777b538SAndroid Build Coastguard Worker if ((unsigned) len >= buf->size - buf->use) {
7685*6777b538SAndroid Build Coastguard Worker if ((unsigned) len >= UINT_MAX - buf->use)
7686*6777b538SAndroid Build Coastguard Worker return XML_ERR_NO_MEMORY;
7687*6777b538SAndroid Build Coastguard Worker needSize = buf->use + len + 1;
7688*6777b538SAndroid Build Coastguard Worker if (!xmlBufferResize(buf, needSize))
7689*6777b538SAndroid Build Coastguard Worker return XML_ERR_NO_MEMORY;
7690*6777b538SAndroid Build Coastguard Worker }
7691*6777b538SAndroid Build Coastguard Worker
7692*6777b538SAndroid Build Coastguard Worker memmove(&buf->content[buf->use], str, len);
7693*6777b538SAndroid Build Coastguard Worker buf->use += len;
7694*6777b538SAndroid Build Coastguard Worker buf->content[buf->use] = 0;
7695*6777b538SAndroid Build Coastguard Worker return 0;
7696*6777b538SAndroid Build Coastguard Worker }
7697*6777b538SAndroid Build Coastguard Worker
7698*6777b538SAndroid Build Coastguard Worker /**
7699*6777b538SAndroid Build Coastguard Worker * xmlBufferAddHead:
7700*6777b538SAndroid Build Coastguard Worker * @buf: the buffer
7701*6777b538SAndroid Build Coastguard Worker * @str: the #xmlChar string
7702*6777b538SAndroid Build Coastguard Worker * @len: the number of #xmlChar to add
7703*6777b538SAndroid Build Coastguard Worker *
7704*6777b538SAndroid Build Coastguard Worker * Add a string range to the beginning of an XML buffer.
7705*6777b538SAndroid Build Coastguard Worker * if len == -1, the length of @str is recomputed.
7706*6777b538SAndroid Build Coastguard Worker *
7707*6777b538SAndroid Build Coastguard Worker * Returns 0 successful, a positive error code number otherwise
7708*6777b538SAndroid Build Coastguard Worker * and -1 in case of internal or API error.
7709*6777b538SAndroid Build Coastguard Worker */
7710*6777b538SAndroid Build Coastguard Worker int
xmlBufferAddHead(xmlBufferPtr buf,const xmlChar * str,int len)7711*6777b538SAndroid Build Coastguard Worker xmlBufferAddHead(xmlBufferPtr buf, const xmlChar *str, int len) {
7712*6777b538SAndroid Build Coastguard Worker unsigned int needSize;
7713*6777b538SAndroid Build Coastguard Worker
7714*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
7715*6777b538SAndroid Build Coastguard Worker return(-1);
7716*6777b538SAndroid Build Coastguard Worker if (str == NULL) {
7717*6777b538SAndroid Build Coastguard Worker return -1;
7718*6777b538SAndroid Build Coastguard Worker }
7719*6777b538SAndroid Build Coastguard Worker if (len < -1) {
7720*6777b538SAndroid Build Coastguard Worker return -1;
7721*6777b538SAndroid Build Coastguard Worker }
7722*6777b538SAndroid Build Coastguard Worker if (len == 0) return 0;
7723*6777b538SAndroid Build Coastguard Worker
7724*6777b538SAndroid Build Coastguard Worker if (len < 0)
7725*6777b538SAndroid Build Coastguard Worker len = xmlStrlen(str);
7726*6777b538SAndroid Build Coastguard Worker
7727*6777b538SAndroid Build Coastguard Worker if (len <= 0) return -1;
7728*6777b538SAndroid Build Coastguard Worker
7729*6777b538SAndroid Build Coastguard Worker if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) {
7730*6777b538SAndroid Build Coastguard Worker size_t start_buf = buf->content - buf->contentIO;
7731*6777b538SAndroid Build Coastguard Worker
7732*6777b538SAndroid Build Coastguard Worker if (start_buf > (unsigned int) len) {
7733*6777b538SAndroid Build Coastguard Worker /*
7734*6777b538SAndroid Build Coastguard Worker * We can add it in the space previously shrunk
7735*6777b538SAndroid Build Coastguard Worker */
7736*6777b538SAndroid Build Coastguard Worker buf->content -= len;
7737*6777b538SAndroid Build Coastguard Worker memmove(&buf->content[0], str, len);
7738*6777b538SAndroid Build Coastguard Worker buf->use += len;
7739*6777b538SAndroid Build Coastguard Worker buf->size += len;
7740*6777b538SAndroid Build Coastguard Worker buf->content[buf->use] = 0;
7741*6777b538SAndroid Build Coastguard Worker return(0);
7742*6777b538SAndroid Build Coastguard Worker }
7743*6777b538SAndroid Build Coastguard Worker }
7744*6777b538SAndroid Build Coastguard Worker /* Note that both buf->size and buf->use can be zero here. */
7745*6777b538SAndroid Build Coastguard Worker if ((unsigned) len >= buf->size - buf->use) {
7746*6777b538SAndroid Build Coastguard Worker if ((unsigned) len >= UINT_MAX - buf->use)
7747*6777b538SAndroid Build Coastguard Worker return(-1);
7748*6777b538SAndroid Build Coastguard Worker needSize = buf->use + len + 1;
7749*6777b538SAndroid Build Coastguard Worker if (!xmlBufferResize(buf, needSize))
7750*6777b538SAndroid Build Coastguard Worker return(-1);
7751*6777b538SAndroid Build Coastguard Worker }
7752*6777b538SAndroid Build Coastguard Worker
7753*6777b538SAndroid Build Coastguard Worker memmove(&buf->content[len], &buf->content[0], buf->use);
7754*6777b538SAndroid Build Coastguard Worker memmove(&buf->content[0], str, len);
7755*6777b538SAndroid Build Coastguard Worker buf->use += len;
7756*6777b538SAndroid Build Coastguard Worker buf->content[buf->use] = 0;
7757*6777b538SAndroid Build Coastguard Worker return 0;
7758*6777b538SAndroid Build Coastguard Worker }
7759*6777b538SAndroid Build Coastguard Worker
7760*6777b538SAndroid Build Coastguard Worker /**
7761*6777b538SAndroid Build Coastguard Worker * xmlBufferCat:
7762*6777b538SAndroid Build Coastguard Worker * @buf: the buffer to add to
7763*6777b538SAndroid Build Coastguard Worker * @str: the #xmlChar string
7764*6777b538SAndroid Build Coastguard Worker *
7765*6777b538SAndroid Build Coastguard Worker * Append a zero terminated string to an XML buffer.
7766*6777b538SAndroid Build Coastguard Worker *
7767*6777b538SAndroid Build Coastguard Worker * Returns 0 successful, a positive error code number otherwise
7768*6777b538SAndroid Build Coastguard Worker * and -1 in case of internal or API error.
7769*6777b538SAndroid Build Coastguard Worker */
7770*6777b538SAndroid Build Coastguard Worker int
xmlBufferCat(xmlBufferPtr buf,const xmlChar * str)7771*6777b538SAndroid Build Coastguard Worker xmlBufferCat(xmlBufferPtr buf, const xmlChar *str) {
7772*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
7773*6777b538SAndroid Build Coastguard Worker return(-1);
7774*6777b538SAndroid Build Coastguard Worker if (str == NULL) return -1;
7775*6777b538SAndroid Build Coastguard Worker return xmlBufferAdd(buf, str, -1);
7776*6777b538SAndroid Build Coastguard Worker }
7777*6777b538SAndroid Build Coastguard Worker
7778*6777b538SAndroid Build Coastguard Worker /**
7779*6777b538SAndroid Build Coastguard Worker * xmlBufferCCat:
7780*6777b538SAndroid Build Coastguard Worker * @buf: the buffer to dump
7781*6777b538SAndroid Build Coastguard Worker * @str: the C char string
7782*6777b538SAndroid Build Coastguard Worker *
7783*6777b538SAndroid Build Coastguard Worker * Append a zero terminated C string to an XML buffer.
7784*6777b538SAndroid Build Coastguard Worker *
7785*6777b538SAndroid Build Coastguard Worker * Returns 0 successful, a positive error code number otherwise
7786*6777b538SAndroid Build Coastguard Worker * and -1 in case of internal or API error.
7787*6777b538SAndroid Build Coastguard Worker */
7788*6777b538SAndroid Build Coastguard Worker int
xmlBufferCCat(xmlBufferPtr buf,const char * str)7789*6777b538SAndroid Build Coastguard Worker xmlBufferCCat(xmlBufferPtr buf, const char *str) {
7790*6777b538SAndroid Build Coastguard Worker return xmlBufferCat(buf, (const xmlChar *) str);
7791*6777b538SAndroid Build Coastguard Worker }
7792*6777b538SAndroid Build Coastguard Worker
7793*6777b538SAndroid Build Coastguard Worker /**
7794*6777b538SAndroid Build Coastguard Worker * xmlBufferWriteCHAR:
7795*6777b538SAndroid Build Coastguard Worker * @buf: the XML buffer
7796*6777b538SAndroid Build Coastguard Worker * @string: the string to add
7797*6777b538SAndroid Build Coastguard Worker *
7798*6777b538SAndroid Build Coastguard Worker * routine which manages and grows an output buffer. This one adds
7799*6777b538SAndroid Build Coastguard Worker * xmlChars at the end of the buffer.
7800*6777b538SAndroid Build Coastguard Worker */
7801*6777b538SAndroid Build Coastguard Worker void
xmlBufferWriteCHAR(xmlBufferPtr buf,const xmlChar * string)7802*6777b538SAndroid Build Coastguard Worker xmlBufferWriteCHAR(xmlBufferPtr buf, const xmlChar *string) {
7803*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
7804*6777b538SAndroid Build Coastguard Worker return;
7805*6777b538SAndroid Build Coastguard Worker xmlBufferCat(buf, string);
7806*6777b538SAndroid Build Coastguard Worker }
7807*6777b538SAndroid Build Coastguard Worker
7808*6777b538SAndroid Build Coastguard Worker /**
7809*6777b538SAndroid Build Coastguard Worker * xmlBufferWriteChar:
7810*6777b538SAndroid Build Coastguard Worker * @buf: the XML buffer output
7811*6777b538SAndroid Build Coastguard Worker * @string: the string to add
7812*6777b538SAndroid Build Coastguard Worker *
7813*6777b538SAndroid Build Coastguard Worker * routine which manage and grows an output buffer. This one add
7814*6777b538SAndroid Build Coastguard Worker * C chars at the end of the array.
7815*6777b538SAndroid Build Coastguard Worker */
7816*6777b538SAndroid Build Coastguard Worker void
xmlBufferWriteChar(xmlBufferPtr buf,const char * string)7817*6777b538SAndroid Build Coastguard Worker xmlBufferWriteChar(xmlBufferPtr buf, const char *string) {
7818*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
7819*6777b538SAndroid Build Coastguard Worker return;
7820*6777b538SAndroid Build Coastguard Worker xmlBufferCCat(buf, string);
7821*6777b538SAndroid Build Coastguard Worker }
7822*6777b538SAndroid Build Coastguard Worker
7823*6777b538SAndroid Build Coastguard Worker
7824*6777b538SAndroid Build Coastguard Worker /**
7825*6777b538SAndroid Build Coastguard Worker * xmlBufferWriteQuotedString:
7826*6777b538SAndroid Build Coastguard Worker * @buf: the XML buffer output
7827*6777b538SAndroid Build Coastguard Worker * @string: the string to add
7828*6777b538SAndroid Build Coastguard Worker *
7829*6777b538SAndroid Build Coastguard Worker * routine which manage and grows an output buffer. This one writes
7830*6777b538SAndroid Build Coastguard Worker * a quoted or double quoted #xmlChar string, checking first if it holds
7831*6777b538SAndroid Build Coastguard Worker * quote or double-quotes internally
7832*6777b538SAndroid Build Coastguard Worker */
7833*6777b538SAndroid Build Coastguard Worker void
xmlBufferWriteQuotedString(xmlBufferPtr buf,const xmlChar * string)7834*6777b538SAndroid Build Coastguard Worker xmlBufferWriteQuotedString(xmlBufferPtr buf, const xmlChar *string) {
7835*6777b538SAndroid Build Coastguard Worker const xmlChar *cur, *base;
7836*6777b538SAndroid Build Coastguard Worker if (buf == NULL)
7837*6777b538SAndroid Build Coastguard Worker return;
7838*6777b538SAndroid Build Coastguard Worker if (xmlStrchr(string, '\"')) {
7839*6777b538SAndroid Build Coastguard Worker if (xmlStrchr(string, '\'')) {
7840*6777b538SAndroid Build Coastguard Worker xmlBufferCCat(buf, "\"");
7841*6777b538SAndroid Build Coastguard Worker base = cur = string;
7842*6777b538SAndroid Build Coastguard Worker while(*cur != 0){
7843*6777b538SAndroid Build Coastguard Worker if(*cur == '"'){
7844*6777b538SAndroid Build Coastguard Worker if (base != cur)
7845*6777b538SAndroid Build Coastguard Worker xmlBufferAdd(buf, base, cur - base);
7846*6777b538SAndroid Build Coastguard Worker xmlBufferAdd(buf, BAD_CAST """, 6);
7847*6777b538SAndroid Build Coastguard Worker cur++;
7848*6777b538SAndroid Build Coastguard Worker base = cur;
7849*6777b538SAndroid Build Coastguard Worker }
7850*6777b538SAndroid Build Coastguard Worker else {
7851*6777b538SAndroid Build Coastguard Worker cur++;
7852*6777b538SAndroid Build Coastguard Worker }
7853*6777b538SAndroid Build Coastguard Worker }
7854*6777b538SAndroid Build Coastguard Worker if (base != cur)
7855*6777b538SAndroid Build Coastguard Worker xmlBufferAdd(buf, base, cur - base);
7856*6777b538SAndroid Build Coastguard Worker xmlBufferCCat(buf, "\"");
7857*6777b538SAndroid Build Coastguard Worker }
7858*6777b538SAndroid Build Coastguard Worker else{
7859*6777b538SAndroid Build Coastguard Worker xmlBufferCCat(buf, "\'");
7860*6777b538SAndroid Build Coastguard Worker xmlBufferCat(buf, string);
7861*6777b538SAndroid Build Coastguard Worker xmlBufferCCat(buf, "\'");
7862*6777b538SAndroid Build Coastguard Worker }
7863*6777b538SAndroid Build Coastguard Worker } else {
7864*6777b538SAndroid Build Coastguard Worker xmlBufferCCat(buf, "\"");
7865*6777b538SAndroid Build Coastguard Worker xmlBufferCat(buf, string);
7866*6777b538SAndroid Build Coastguard Worker xmlBufferCCat(buf, "\"");
7867*6777b538SAndroid Build Coastguard Worker }
7868*6777b538SAndroid Build Coastguard Worker }
7869*6777b538SAndroid Build Coastguard Worker
7870*6777b538SAndroid Build Coastguard Worker
7871*6777b538SAndroid Build Coastguard Worker /**
7872*6777b538SAndroid Build Coastguard Worker * xmlGetDocCompressMode:
7873*6777b538SAndroid Build Coastguard Worker * @doc: the document
7874*6777b538SAndroid Build Coastguard Worker *
7875*6777b538SAndroid Build Coastguard Worker * get the compression ratio for a document, ZLIB based
7876*6777b538SAndroid Build Coastguard Worker * Returns 0 (uncompressed) to 9 (max compression)
7877*6777b538SAndroid Build Coastguard Worker */
7878*6777b538SAndroid Build Coastguard Worker int
xmlGetDocCompressMode(const xmlDoc * doc)7879*6777b538SAndroid Build Coastguard Worker xmlGetDocCompressMode (const xmlDoc *doc) {
7880*6777b538SAndroid Build Coastguard Worker if (doc == NULL) return(-1);
7881*6777b538SAndroid Build Coastguard Worker return(doc->compression);
7882*6777b538SAndroid Build Coastguard Worker }
7883*6777b538SAndroid Build Coastguard Worker
7884*6777b538SAndroid Build Coastguard Worker /**
7885*6777b538SAndroid Build Coastguard Worker * xmlSetDocCompressMode:
7886*6777b538SAndroid Build Coastguard Worker * @doc: the document
7887*6777b538SAndroid Build Coastguard Worker * @mode: the compression ratio
7888*6777b538SAndroid Build Coastguard Worker *
7889*6777b538SAndroid Build Coastguard Worker * set the compression ratio for a document, ZLIB based
7890*6777b538SAndroid Build Coastguard Worker * Correct values: 0 (uncompressed) to 9 (max compression)
7891*6777b538SAndroid Build Coastguard Worker */
7892*6777b538SAndroid Build Coastguard Worker void
xmlSetDocCompressMode(xmlDocPtr doc,int mode)7893*6777b538SAndroid Build Coastguard Worker xmlSetDocCompressMode (xmlDocPtr doc, int mode) {
7894*6777b538SAndroid Build Coastguard Worker if (doc == NULL) return;
7895*6777b538SAndroid Build Coastguard Worker if (mode < 0) doc->compression = 0;
7896*6777b538SAndroid Build Coastguard Worker else if (mode > 9) doc->compression = 9;
7897*6777b538SAndroid Build Coastguard Worker else doc->compression = mode;
7898*6777b538SAndroid Build Coastguard Worker }
7899*6777b538SAndroid Build Coastguard Worker
7900*6777b538SAndroid Build Coastguard Worker /**
7901*6777b538SAndroid Build Coastguard Worker * xmlGetCompressMode:
7902*6777b538SAndroid Build Coastguard Worker *
7903*6777b538SAndroid Build Coastguard Worker * get the default compression mode used, ZLIB based.
7904*6777b538SAndroid Build Coastguard Worker * Returns 0 (uncompressed) to 9 (max compression)
7905*6777b538SAndroid Build Coastguard Worker */
7906*6777b538SAndroid Build Coastguard Worker int
xmlGetCompressMode(void)7907*6777b538SAndroid Build Coastguard Worker xmlGetCompressMode(void)
7908*6777b538SAndroid Build Coastguard Worker {
7909*6777b538SAndroid Build Coastguard Worker return (xmlCompressMode);
7910*6777b538SAndroid Build Coastguard Worker }
7911*6777b538SAndroid Build Coastguard Worker
7912*6777b538SAndroid Build Coastguard Worker /**
7913*6777b538SAndroid Build Coastguard Worker * xmlSetCompressMode:
7914*6777b538SAndroid Build Coastguard Worker * @mode: the compression ratio
7915*6777b538SAndroid Build Coastguard Worker *
7916*6777b538SAndroid Build Coastguard Worker * set the default compression mode used, ZLIB based
7917*6777b538SAndroid Build Coastguard Worker * Correct values: 0 (uncompressed) to 9 (max compression)
7918*6777b538SAndroid Build Coastguard Worker */
7919*6777b538SAndroid Build Coastguard Worker void
xmlSetCompressMode(int mode)7920*6777b538SAndroid Build Coastguard Worker xmlSetCompressMode(int mode) {
7921*6777b538SAndroid Build Coastguard Worker if (mode < 0) xmlCompressMode = 0;
7922*6777b538SAndroid Build Coastguard Worker else if (mode > 9) xmlCompressMode = 9;
7923*6777b538SAndroid Build Coastguard Worker else xmlCompressMode = mode;
7924*6777b538SAndroid Build Coastguard Worker }
7925*6777b538SAndroid Build Coastguard Worker
7926*6777b538SAndroid Build Coastguard Worker #define XML_TREE_NSMAP_PARENT -1
7927*6777b538SAndroid Build Coastguard Worker #define XML_TREE_NSMAP_XML -2
7928*6777b538SAndroid Build Coastguard Worker #define XML_TREE_NSMAP_DOC -3
7929*6777b538SAndroid Build Coastguard Worker #define XML_TREE_NSMAP_CUSTOM -4
7930*6777b538SAndroid Build Coastguard Worker
7931*6777b538SAndroid Build Coastguard Worker typedef struct xmlNsMapItem *xmlNsMapItemPtr;
7932*6777b538SAndroid Build Coastguard Worker struct xmlNsMapItem {
7933*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr next;
7934*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr prev;
7935*6777b538SAndroid Build Coastguard Worker xmlNsPtr oldNs; /* old ns decl reference */
7936*6777b538SAndroid Build Coastguard Worker xmlNsPtr newNs; /* new ns decl reference */
7937*6777b538SAndroid Build Coastguard Worker int shadowDepth; /* Shadowed at this depth */
7938*6777b538SAndroid Build Coastguard Worker /*
7939*6777b538SAndroid Build Coastguard Worker * depth:
7940*6777b538SAndroid Build Coastguard Worker * >= 0 == @node's ns-decls
7941*6777b538SAndroid Build Coastguard Worker * -1 == @parent's ns-decls
7942*6777b538SAndroid Build Coastguard Worker * -2 == the doc->oldNs XML ns-decl
7943*6777b538SAndroid Build Coastguard Worker * -3 == the doc->oldNs storage ns-decls
7944*6777b538SAndroid Build Coastguard Worker * -4 == ns-decls provided via custom ns-handling
7945*6777b538SAndroid Build Coastguard Worker */
7946*6777b538SAndroid Build Coastguard Worker int depth;
7947*6777b538SAndroid Build Coastguard Worker };
7948*6777b538SAndroid Build Coastguard Worker
7949*6777b538SAndroid Build Coastguard Worker typedef struct xmlNsMap *xmlNsMapPtr;
7950*6777b538SAndroid Build Coastguard Worker struct xmlNsMap {
7951*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr first;
7952*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr last;
7953*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr pool;
7954*6777b538SAndroid Build Coastguard Worker };
7955*6777b538SAndroid Build Coastguard Worker
7956*6777b538SAndroid Build Coastguard Worker #define XML_NSMAP_NOTEMPTY(m) (((m) != NULL) && ((m)->first != NULL))
7957*6777b538SAndroid Build Coastguard Worker #define XML_NSMAP_FOREACH(m, i) for (i = (m)->first; i != NULL; i = (i)->next)
7958*6777b538SAndroid Build Coastguard Worker #define XML_NSMAP_POP(m, i) \
7959*6777b538SAndroid Build Coastguard Worker i = (m)->last; \
7960*6777b538SAndroid Build Coastguard Worker (m)->last = (i)->prev; \
7961*6777b538SAndroid Build Coastguard Worker if ((m)->last == NULL) \
7962*6777b538SAndroid Build Coastguard Worker (m)->first = NULL; \
7963*6777b538SAndroid Build Coastguard Worker else \
7964*6777b538SAndroid Build Coastguard Worker (m)->last->next = NULL; \
7965*6777b538SAndroid Build Coastguard Worker (i)->next = (m)->pool; \
7966*6777b538SAndroid Build Coastguard Worker (m)->pool = i;
7967*6777b538SAndroid Build Coastguard Worker
7968*6777b538SAndroid Build Coastguard Worker /*
7969*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapNsMapFree:
7970*6777b538SAndroid Build Coastguard Worker * @map: the ns-map
7971*6777b538SAndroid Build Coastguard Worker *
7972*6777b538SAndroid Build Coastguard Worker * Frees the ns-map
7973*6777b538SAndroid Build Coastguard Worker */
7974*6777b538SAndroid Build Coastguard Worker static void
xmlDOMWrapNsMapFree(xmlNsMapPtr nsmap)7975*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNsMapFree(xmlNsMapPtr nsmap)
7976*6777b538SAndroid Build Coastguard Worker {
7977*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr cur, tmp;
7978*6777b538SAndroid Build Coastguard Worker
7979*6777b538SAndroid Build Coastguard Worker if (nsmap == NULL)
7980*6777b538SAndroid Build Coastguard Worker return;
7981*6777b538SAndroid Build Coastguard Worker cur = nsmap->pool;
7982*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
7983*6777b538SAndroid Build Coastguard Worker tmp = cur;
7984*6777b538SAndroid Build Coastguard Worker cur = cur->next;
7985*6777b538SAndroid Build Coastguard Worker xmlFree(tmp);
7986*6777b538SAndroid Build Coastguard Worker }
7987*6777b538SAndroid Build Coastguard Worker cur = nsmap->first;
7988*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
7989*6777b538SAndroid Build Coastguard Worker tmp = cur;
7990*6777b538SAndroid Build Coastguard Worker cur = cur->next;
7991*6777b538SAndroid Build Coastguard Worker xmlFree(tmp);
7992*6777b538SAndroid Build Coastguard Worker }
7993*6777b538SAndroid Build Coastguard Worker xmlFree(nsmap);
7994*6777b538SAndroid Build Coastguard Worker }
7995*6777b538SAndroid Build Coastguard Worker
7996*6777b538SAndroid Build Coastguard Worker /*
7997*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapNsMapAddItem:
7998*6777b538SAndroid Build Coastguard Worker * @map: the ns-map
7999*6777b538SAndroid Build Coastguard Worker * @oldNs: the old ns-struct
8000*6777b538SAndroid Build Coastguard Worker * @newNs: the new ns-struct
8001*6777b538SAndroid Build Coastguard Worker * @depth: depth and ns-kind information
8002*6777b538SAndroid Build Coastguard Worker *
8003*6777b538SAndroid Build Coastguard Worker * Adds an ns-mapping item.
8004*6777b538SAndroid Build Coastguard Worker */
8005*6777b538SAndroid Build Coastguard Worker static xmlNsMapItemPtr
xmlDOMWrapNsMapAddItem(xmlNsMapPtr * nsmap,int position,xmlNsPtr oldNs,xmlNsPtr newNs,int depth)8006*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNsMapAddItem(xmlNsMapPtr *nsmap, int position,
8007*6777b538SAndroid Build Coastguard Worker xmlNsPtr oldNs, xmlNsPtr newNs, int depth)
8008*6777b538SAndroid Build Coastguard Worker {
8009*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr ret;
8010*6777b538SAndroid Build Coastguard Worker xmlNsMapPtr map;
8011*6777b538SAndroid Build Coastguard Worker
8012*6777b538SAndroid Build Coastguard Worker if (nsmap == NULL)
8013*6777b538SAndroid Build Coastguard Worker return(NULL);
8014*6777b538SAndroid Build Coastguard Worker if ((position != -1) && (position != 0))
8015*6777b538SAndroid Build Coastguard Worker return(NULL);
8016*6777b538SAndroid Build Coastguard Worker map = *nsmap;
8017*6777b538SAndroid Build Coastguard Worker
8018*6777b538SAndroid Build Coastguard Worker if (map == NULL) {
8019*6777b538SAndroid Build Coastguard Worker /*
8020*6777b538SAndroid Build Coastguard Worker * Create the ns-map.
8021*6777b538SAndroid Build Coastguard Worker */
8022*6777b538SAndroid Build Coastguard Worker map = (xmlNsMapPtr) xmlMalloc(sizeof(struct xmlNsMap));
8023*6777b538SAndroid Build Coastguard Worker if (map == NULL)
8024*6777b538SAndroid Build Coastguard Worker return(NULL);
8025*6777b538SAndroid Build Coastguard Worker memset(map, 0, sizeof(struct xmlNsMap));
8026*6777b538SAndroid Build Coastguard Worker *nsmap = map;
8027*6777b538SAndroid Build Coastguard Worker }
8028*6777b538SAndroid Build Coastguard Worker
8029*6777b538SAndroid Build Coastguard Worker if (map->pool != NULL) {
8030*6777b538SAndroid Build Coastguard Worker /*
8031*6777b538SAndroid Build Coastguard Worker * Reuse an item from the pool.
8032*6777b538SAndroid Build Coastguard Worker */
8033*6777b538SAndroid Build Coastguard Worker ret = map->pool;
8034*6777b538SAndroid Build Coastguard Worker map->pool = ret->next;
8035*6777b538SAndroid Build Coastguard Worker memset(ret, 0, sizeof(struct xmlNsMapItem));
8036*6777b538SAndroid Build Coastguard Worker } else {
8037*6777b538SAndroid Build Coastguard Worker /*
8038*6777b538SAndroid Build Coastguard Worker * Create a new item.
8039*6777b538SAndroid Build Coastguard Worker */
8040*6777b538SAndroid Build Coastguard Worker ret = (xmlNsMapItemPtr) xmlMalloc(sizeof(struct xmlNsMapItem));
8041*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
8042*6777b538SAndroid Build Coastguard Worker return(NULL);
8043*6777b538SAndroid Build Coastguard Worker memset(ret, 0, sizeof(struct xmlNsMapItem));
8044*6777b538SAndroid Build Coastguard Worker }
8045*6777b538SAndroid Build Coastguard Worker
8046*6777b538SAndroid Build Coastguard Worker if (map->first == NULL) {
8047*6777b538SAndroid Build Coastguard Worker /*
8048*6777b538SAndroid Build Coastguard Worker * First ever.
8049*6777b538SAndroid Build Coastguard Worker */
8050*6777b538SAndroid Build Coastguard Worker map->first = ret;
8051*6777b538SAndroid Build Coastguard Worker map->last = ret;
8052*6777b538SAndroid Build Coastguard Worker } else if (position == -1) {
8053*6777b538SAndroid Build Coastguard Worker /*
8054*6777b538SAndroid Build Coastguard Worker * Append.
8055*6777b538SAndroid Build Coastguard Worker */
8056*6777b538SAndroid Build Coastguard Worker ret->prev = map->last;
8057*6777b538SAndroid Build Coastguard Worker map->last->next = ret;
8058*6777b538SAndroid Build Coastguard Worker map->last = ret;
8059*6777b538SAndroid Build Coastguard Worker } else if (position == 0) {
8060*6777b538SAndroid Build Coastguard Worker /*
8061*6777b538SAndroid Build Coastguard Worker * Set on first position.
8062*6777b538SAndroid Build Coastguard Worker */
8063*6777b538SAndroid Build Coastguard Worker map->first->prev = ret;
8064*6777b538SAndroid Build Coastguard Worker ret->next = map->first;
8065*6777b538SAndroid Build Coastguard Worker map->first = ret;
8066*6777b538SAndroid Build Coastguard Worker }
8067*6777b538SAndroid Build Coastguard Worker
8068*6777b538SAndroid Build Coastguard Worker ret->oldNs = oldNs;
8069*6777b538SAndroid Build Coastguard Worker ret->newNs = newNs;
8070*6777b538SAndroid Build Coastguard Worker ret->shadowDepth = -1;
8071*6777b538SAndroid Build Coastguard Worker ret->depth = depth;
8072*6777b538SAndroid Build Coastguard Worker return (ret);
8073*6777b538SAndroid Build Coastguard Worker }
8074*6777b538SAndroid Build Coastguard Worker
8075*6777b538SAndroid Build Coastguard Worker /*
8076*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapStoreNs:
8077*6777b538SAndroid Build Coastguard Worker * @doc: the doc
8078*6777b538SAndroid Build Coastguard Worker * @nsName: the namespace name
8079*6777b538SAndroid Build Coastguard Worker * @prefix: the prefix
8080*6777b538SAndroid Build Coastguard Worker *
8081*6777b538SAndroid Build Coastguard Worker * Creates or reuses an xmlNs struct on doc->oldNs with
8082*6777b538SAndroid Build Coastguard Worker * the given prefix and namespace name.
8083*6777b538SAndroid Build Coastguard Worker *
8084*6777b538SAndroid Build Coastguard Worker * Returns the acquired ns struct or NULL in case of an API
8085*6777b538SAndroid Build Coastguard Worker * or internal error.
8086*6777b538SAndroid Build Coastguard Worker */
8087*6777b538SAndroid Build Coastguard Worker static xmlNsPtr
xmlDOMWrapStoreNs(xmlDocPtr doc,const xmlChar * nsName,const xmlChar * prefix)8088*6777b538SAndroid Build Coastguard Worker xmlDOMWrapStoreNs(xmlDocPtr doc,
8089*6777b538SAndroid Build Coastguard Worker const xmlChar *nsName,
8090*6777b538SAndroid Build Coastguard Worker const xmlChar *prefix)
8091*6777b538SAndroid Build Coastguard Worker {
8092*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
8093*6777b538SAndroid Build Coastguard Worker
8094*6777b538SAndroid Build Coastguard Worker if (doc == NULL)
8095*6777b538SAndroid Build Coastguard Worker return (NULL);
8096*6777b538SAndroid Build Coastguard Worker ns = xmlTreeEnsureXMLDecl(doc);
8097*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
8098*6777b538SAndroid Build Coastguard Worker return (NULL);
8099*6777b538SAndroid Build Coastguard Worker if (ns->next != NULL) {
8100*6777b538SAndroid Build Coastguard Worker /* Reuse. */
8101*6777b538SAndroid Build Coastguard Worker ns = ns->next;
8102*6777b538SAndroid Build Coastguard Worker while (ns != NULL) {
8103*6777b538SAndroid Build Coastguard Worker if (((ns->prefix == prefix) ||
8104*6777b538SAndroid Build Coastguard Worker xmlStrEqual(ns->prefix, prefix)) &&
8105*6777b538SAndroid Build Coastguard Worker xmlStrEqual(ns->href, nsName)) {
8106*6777b538SAndroid Build Coastguard Worker return (ns);
8107*6777b538SAndroid Build Coastguard Worker }
8108*6777b538SAndroid Build Coastguard Worker if (ns->next == NULL)
8109*6777b538SAndroid Build Coastguard Worker break;
8110*6777b538SAndroid Build Coastguard Worker ns = ns->next;
8111*6777b538SAndroid Build Coastguard Worker }
8112*6777b538SAndroid Build Coastguard Worker }
8113*6777b538SAndroid Build Coastguard Worker /* Create. */
8114*6777b538SAndroid Build Coastguard Worker if (ns != NULL) {
8115*6777b538SAndroid Build Coastguard Worker ns->next = xmlNewNs(NULL, nsName, prefix);
8116*6777b538SAndroid Build Coastguard Worker return (ns->next);
8117*6777b538SAndroid Build Coastguard Worker }
8118*6777b538SAndroid Build Coastguard Worker return(NULL);
8119*6777b538SAndroid Build Coastguard Worker }
8120*6777b538SAndroid Build Coastguard Worker
8121*6777b538SAndroid Build Coastguard Worker /*
8122*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapNewCtxt:
8123*6777b538SAndroid Build Coastguard Worker *
8124*6777b538SAndroid Build Coastguard Worker * Allocates and initializes a new DOM-wrapper context.
8125*6777b538SAndroid Build Coastguard Worker *
8126*6777b538SAndroid Build Coastguard Worker * Returns the xmlDOMWrapCtxtPtr or NULL in case of an internal error.
8127*6777b538SAndroid Build Coastguard Worker */
8128*6777b538SAndroid Build Coastguard Worker xmlDOMWrapCtxtPtr
xmlDOMWrapNewCtxt(void)8129*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNewCtxt(void)
8130*6777b538SAndroid Build Coastguard Worker {
8131*6777b538SAndroid Build Coastguard Worker xmlDOMWrapCtxtPtr ret;
8132*6777b538SAndroid Build Coastguard Worker
8133*6777b538SAndroid Build Coastguard Worker ret = xmlMalloc(sizeof(xmlDOMWrapCtxt));
8134*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
8135*6777b538SAndroid Build Coastguard Worker return (NULL);
8136*6777b538SAndroid Build Coastguard Worker memset(ret, 0, sizeof(xmlDOMWrapCtxt));
8137*6777b538SAndroid Build Coastguard Worker return (ret);
8138*6777b538SAndroid Build Coastguard Worker }
8139*6777b538SAndroid Build Coastguard Worker
8140*6777b538SAndroid Build Coastguard Worker /*
8141*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapFreeCtxt:
8142*6777b538SAndroid Build Coastguard Worker * @ctxt: the DOM-wrapper context
8143*6777b538SAndroid Build Coastguard Worker *
8144*6777b538SAndroid Build Coastguard Worker * Frees the DOM-wrapper context.
8145*6777b538SAndroid Build Coastguard Worker */
8146*6777b538SAndroid Build Coastguard Worker void
xmlDOMWrapFreeCtxt(xmlDOMWrapCtxtPtr ctxt)8147*6777b538SAndroid Build Coastguard Worker xmlDOMWrapFreeCtxt(xmlDOMWrapCtxtPtr ctxt)
8148*6777b538SAndroid Build Coastguard Worker {
8149*6777b538SAndroid Build Coastguard Worker if (ctxt == NULL)
8150*6777b538SAndroid Build Coastguard Worker return;
8151*6777b538SAndroid Build Coastguard Worker if (ctxt->namespaceMap != NULL)
8152*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNsMapFree((xmlNsMapPtr) ctxt->namespaceMap);
8153*6777b538SAndroid Build Coastguard Worker /*
8154*6777b538SAndroid Build Coastguard Worker * TODO: Store the namespace map in the context.
8155*6777b538SAndroid Build Coastguard Worker */
8156*6777b538SAndroid Build Coastguard Worker xmlFree(ctxt);
8157*6777b538SAndroid Build Coastguard Worker }
8158*6777b538SAndroid Build Coastguard Worker
8159*6777b538SAndroid Build Coastguard Worker /*
8160*6777b538SAndroid Build Coastguard Worker * xmlTreeLookupNsListByPrefix:
8161*6777b538SAndroid Build Coastguard Worker * @nsList: a list of ns-structs
8162*6777b538SAndroid Build Coastguard Worker * @prefix: the searched prefix
8163*6777b538SAndroid Build Coastguard Worker *
8164*6777b538SAndroid Build Coastguard Worker * Searches for a ns-decl with the given prefix in @nsList.
8165*6777b538SAndroid Build Coastguard Worker *
8166*6777b538SAndroid Build Coastguard Worker * Returns the ns-decl if found, NULL if not found and on
8167*6777b538SAndroid Build Coastguard Worker * API errors.
8168*6777b538SAndroid Build Coastguard Worker */
8169*6777b538SAndroid Build Coastguard Worker static xmlNsPtr
xmlTreeNSListLookupByPrefix(xmlNsPtr nsList,const xmlChar * prefix)8170*6777b538SAndroid Build Coastguard Worker xmlTreeNSListLookupByPrefix(xmlNsPtr nsList, const xmlChar *prefix)
8171*6777b538SAndroid Build Coastguard Worker {
8172*6777b538SAndroid Build Coastguard Worker if (nsList == NULL)
8173*6777b538SAndroid Build Coastguard Worker return (NULL);
8174*6777b538SAndroid Build Coastguard Worker {
8175*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
8176*6777b538SAndroid Build Coastguard Worker ns = nsList;
8177*6777b538SAndroid Build Coastguard Worker do {
8178*6777b538SAndroid Build Coastguard Worker if ((prefix == ns->prefix) ||
8179*6777b538SAndroid Build Coastguard Worker xmlStrEqual(prefix, ns->prefix)) {
8180*6777b538SAndroid Build Coastguard Worker return (ns);
8181*6777b538SAndroid Build Coastguard Worker }
8182*6777b538SAndroid Build Coastguard Worker ns = ns->next;
8183*6777b538SAndroid Build Coastguard Worker } while (ns != NULL);
8184*6777b538SAndroid Build Coastguard Worker }
8185*6777b538SAndroid Build Coastguard Worker return (NULL);
8186*6777b538SAndroid Build Coastguard Worker }
8187*6777b538SAndroid Build Coastguard Worker
8188*6777b538SAndroid Build Coastguard Worker /*
8189*6777b538SAndroid Build Coastguard Worker *
8190*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapNSNormGatherInScopeNs:
8191*6777b538SAndroid Build Coastguard Worker * @map: the namespace map
8192*6777b538SAndroid Build Coastguard Worker * @node: the node to start with
8193*6777b538SAndroid Build Coastguard Worker *
8194*6777b538SAndroid Build Coastguard Worker * Puts in-scope namespaces into the ns-map.
8195*6777b538SAndroid Build Coastguard Worker *
8196*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, -1 on API or internal errors.
8197*6777b538SAndroid Build Coastguard Worker */
8198*6777b538SAndroid Build Coastguard Worker static int
xmlDOMWrapNSNormGatherInScopeNs(xmlNsMapPtr * map,xmlNodePtr node)8199*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNSNormGatherInScopeNs(xmlNsMapPtr *map,
8200*6777b538SAndroid Build Coastguard Worker xmlNodePtr node)
8201*6777b538SAndroid Build Coastguard Worker {
8202*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
8203*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
8204*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr mi;
8205*6777b538SAndroid Build Coastguard Worker int shadowed;
8206*6777b538SAndroid Build Coastguard Worker
8207*6777b538SAndroid Build Coastguard Worker if ((map == NULL) || (*map != NULL))
8208*6777b538SAndroid Build Coastguard Worker return (-1);
8209*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type == XML_NAMESPACE_DECL))
8210*6777b538SAndroid Build Coastguard Worker return (-1);
8211*6777b538SAndroid Build Coastguard Worker /*
8212*6777b538SAndroid Build Coastguard Worker * Get in-scope ns-decls of @parent.
8213*6777b538SAndroid Build Coastguard Worker */
8214*6777b538SAndroid Build Coastguard Worker cur = node;
8215*6777b538SAndroid Build Coastguard Worker while ((cur != NULL) && (cur != (xmlNodePtr) cur->doc)) {
8216*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ELEMENT_NODE) {
8217*6777b538SAndroid Build Coastguard Worker if (cur->nsDef != NULL) {
8218*6777b538SAndroid Build Coastguard Worker ns = cur->nsDef;
8219*6777b538SAndroid Build Coastguard Worker do {
8220*6777b538SAndroid Build Coastguard Worker shadowed = 0;
8221*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(*map)) {
8222*6777b538SAndroid Build Coastguard Worker /*
8223*6777b538SAndroid Build Coastguard Worker * Skip shadowed prefixes.
8224*6777b538SAndroid Build Coastguard Worker */
8225*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(*map, mi) {
8226*6777b538SAndroid Build Coastguard Worker if ((ns->prefix == mi->newNs->prefix) ||
8227*6777b538SAndroid Build Coastguard Worker xmlStrEqual(ns->prefix, mi->newNs->prefix)) {
8228*6777b538SAndroid Build Coastguard Worker shadowed = 1;
8229*6777b538SAndroid Build Coastguard Worker break;
8230*6777b538SAndroid Build Coastguard Worker }
8231*6777b538SAndroid Build Coastguard Worker }
8232*6777b538SAndroid Build Coastguard Worker }
8233*6777b538SAndroid Build Coastguard Worker /*
8234*6777b538SAndroid Build Coastguard Worker * Insert mapping.
8235*6777b538SAndroid Build Coastguard Worker */
8236*6777b538SAndroid Build Coastguard Worker mi = xmlDOMWrapNsMapAddItem(map, 0, NULL,
8237*6777b538SAndroid Build Coastguard Worker ns, XML_TREE_NSMAP_PARENT);
8238*6777b538SAndroid Build Coastguard Worker if (mi == NULL)
8239*6777b538SAndroid Build Coastguard Worker return (-1);
8240*6777b538SAndroid Build Coastguard Worker if (shadowed)
8241*6777b538SAndroid Build Coastguard Worker mi->shadowDepth = 0;
8242*6777b538SAndroid Build Coastguard Worker ns = ns->next;
8243*6777b538SAndroid Build Coastguard Worker } while (ns != NULL);
8244*6777b538SAndroid Build Coastguard Worker }
8245*6777b538SAndroid Build Coastguard Worker }
8246*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
8247*6777b538SAndroid Build Coastguard Worker }
8248*6777b538SAndroid Build Coastguard Worker return (0);
8249*6777b538SAndroid Build Coastguard Worker }
8250*6777b538SAndroid Build Coastguard Worker
8251*6777b538SAndroid Build Coastguard Worker /*
8252*6777b538SAndroid Build Coastguard Worker * XML_TREE_ADOPT_STR: If we have a dest-dict, put @str in the dict;
8253*6777b538SAndroid Build Coastguard Worker * otherwise copy it, when it was in the source-dict.
8254*6777b538SAndroid Build Coastguard Worker */
8255*6777b538SAndroid Build Coastguard Worker #define XML_TREE_ADOPT_STR(str) \
8256*6777b538SAndroid Build Coastguard Worker if (adoptStr && (str != NULL)) { \
8257*6777b538SAndroid Build Coastguard Worker if (destDoc->dict) { \
8258*6777b538SAndroid Build Coastguard Worker const xmlChar *old = str; \
8259*6777b538SAndroid Build Coastguard Worker str = xmlDictLookup(destDoc->dict, str, -1); \
8260*6777b538SAndroid Build Coastguard Worker if ((sourceDoc == NULL) || (sourceDoc->dict == NULL) || \
8261*6777b538SAndroid Build Coastguard Worker (!xmlDictOwns(sourceDoc->dict, old))) \
8262*6777b538SAndroid Build Coastguard Worker xmlFree((char *)old); \
8263*6777b538SAndroid Build Coastguard Worker } else if ((sourceDoc) && (sourceDoc->dict) && \
8264*6777b538SAndroid Build Coastguard Worker xmlDictOwns(sourceDoc->dict, str)) { \
8265*6777b538SAndroid Build Coastguard Worker str = BAD_CAST xmlStrdup(str); \
8266*6777b538SAndroid Build Coastguard Worker } \
8267*6777b538SAndroid Build Coastguard Worker }
8268*6777b538SAndroid Build Coastguard Worker
8269*6777b538SAndroid Build Coastguard Worker /*
8270*6777b538SAndroid Build Coastguard Worker * XML_TREE_ADOPT_STR_2: If @str was in the source-dict, then
8271*6777b538SAndroid Build Coastguard Worker * put it in dest-dict or copy it.
8272*6777b538SAndroid Build Coastguard Worker */
8273*6777b538SAndroid Build Coastguard Worker #define XML_TREE_ADOPT_STR_2(str) \
8274*6777b538SAndroid Build Coastguard Worker if (adoptStr && (str != NULL) && (sourceDoc != NULL) && \
8275*6777b538SAndroid Build Coastguard Worker (sourceDoc->dict != NULL) && \
8276*6777b538SAndroid Build Coastguard Worker xmlDictOwns(sourceDoc->dict, cur->content)) { \
8277*6777b538SAndroid Build Coastguard Worker if (destDoc->dict) \
8278*6777b538SAndroid Build Coastguard Worker cur->content = (xmlChar *) \
8279*6777b538SAndroid Build Coastguard Worker xmlDictLookup(destDoc->dict, cur->content, -1); \
8280*6777b538SAndroid Build Coastguard Worker else \
8281*6777b538SAndroid Build Coastguard Worker cur->content = xmlStrdup(BAD_CAST cur->content); \
8282*6777b538SAndroid Build Coastguard Worker }
8283*6777b538SAndroid Build Coastguard Worker
8284*6777b538SAndroid Build Coastguard Worker /*
8285*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapNSNormAddNsMapItem2:
8286*6777b538SAndroid Build Coastguard Worker *
8287*6777b538SAndroid Build Coastguard Worker * For internal use. Adds a ns-decl mapping.
8288*6777b538SAndroid Build Coastguard Worker *
8289*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, -1 on internal errors.
8290*6777b538SAndroid Build Coastguard Worker */
8291*6777b538SAndroid Build Coastguard Worker static int
xmlDOMWrapNSNormAddNsMapItem2(xmlNsPtr ** list,int * size,int * number,xmlNsPtr oldNs,xmlNsPtr newNs)8292*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNSNormAddNsMapItem2(xmlNsPtr **list, int *size, int *number,
8293*6777b538SAndroid Build Coastguard Worker xmlNsPtr oldNs, xmlNsPtr newNs)
8294*6777b538SAndroid Build Coastguard Worker {
8295*6777b538SAndroid Build Coastguard Worker if (*list == NULL) {
8296*6777b538SAndroid Build Coastguard Worker *list = (xmlNsPtr *) xmlMalloc(6 * sizeof(xmlNsPtr));
8297*6777b538SAndroid Build Coastguard Worker if (*list == NULL)
8298*6777b538SAndroid Build Coastguard Worker return(-1);
8299*6777b538SAndroid Build Coastguard Worker *size = 3;
8300*6777b538SAndroid Build Coastguard Worker *number = 0;
8301*6777b538SAndroid Build Coastguard Worker } else if ((*number) >= (*size)) {
8302*6777b538SAndroid Build Coastguard Worker *size *= 2;
8303*6777b538SAndroid Build Coastguard Worker *list = (xmlNsPtr *) xmlRealloc(*list,
8304*6777b538SAndroid Build Coastguard Worker (*size) * 2 * sizeof(xmlNsPtr));
8305*6777b538SAndroid Build Coastguard Worker if (*list == NULL)
8306*6777b538SAndroid Build Coastguard Worker return(-1);
8307*6777b538SAndroid Build Coastguard Worker }
8308*6777b538SAndroid Build Coastguard Worker (*list)[2 * (*number)] = oldNs;
8309*6777b538SAndroid Build Coastguard Worker (*list)[2 * (*number) +1] = newNs;
8310*6777b538SAndroid Build Coastguard Worker (*number)++;
8311*6777b538SAndroid Build Coastguard Worker return (0);
8312*6777b538SAndroid Build Coastguard Worker }
8313*6777b538SAndroid Build Coastguard Worker
8314*6777b538SAndroid Build Coastguard Worker /*
8315*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapRemoveNode:
8316*6777b538SAndroid Build Coastguard Worker * @ctxt: a DOM wrapper context
8317*6777b538SAndroid Build Coastguard Worker * @doc: the doc
8318*6777b538SAndroid Build Coastguard Worker * @node: the node to be removed.
8319*6777b538SAndroid Build Coastguard Worker * @options: set of options, unused at the moment
8320*6777b538SAndroid Build Coastguard Worker *
8321*6777b538SAndroid Build Coastguard Worker * Unlinks the given node from its owner.
8322*6777b538SAndroid Build Coastguard Worker * This will substitute ns-references to node->nsDef for
8323*6777b538SAndroid Build Coastguard Worker * ns-references to doc->oldNs, thus ensuring the removed
8324*6777b538SAndroid Build Coastguard Worker * branch to be autark wrt ns-references.
8325*6777b538SAndroid Build Coastguard Worker *
8326*6777b538SAndroid Build Coastguard Worker * NOTE: This function was not intensively tested.
8327*6777b538SAndroid Build Coastguard Worker *
8328*6777b538SAndroid Build Coastguard Worker * Returns 0 on success, 1 if the node is not supported,
8329*6777b538SAndroid Build Coastguard Worker * -1 on API and internal errors.
8330*6777b538SAndroid Build Coastguard Worker */
8331*6777b538SAndroid Build Coastguard Worker int
xmlDOMWrapRemoveNode(xmlDOMWrapCtxtPtr ctxt,xmlDocPtr doc,xmlNodePtr node,int options ATTRIBUTE_UNUSED)8332*6777b538SAndroid Build Coastguard Worker xmlDOMWrapRemoveNode(xmlDOMWrapCtxtPtr ctxt, xmlDocPtr doc,
8333*6777b538SAndroid Build Coastguard Worker xmlNodePtr node, int options ATTRIBUTE_UNUSED)
8334*6777b538SAndroid Build Coastguard Worker {
8335*6777b538SAndroid Build Coastguard Worker xmlNsPtr *list = NULL;
8336*6777b538SAndroid Build Coastguard Worker int sizeList, nbList, i, j;
8337*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
8338*6777b538SAndroid Build Coastguard Worker
8339*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (doc == NULL) || (node->doc != doc))
8340*6777b538SAndroid Build Coastguard Worker return (-1);
8341*6777b538SAndroid Build Coastguard Worker
8342*6777b538SAndroid Build Coastguard Worker /* TODO: 0 or -1 ? */
8343*6777b538SAndroid Build Coastguard Worker if (node->parent == NULL)
8344*6777b538SAndroid Build Coastguard Worker return (0);
8345*6777b538SAndroid Build Coastguard Worker
8346*6777b538SAndroid Build Coastguard Worker switch (node->type) {
8347*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
8348*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
8349*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
8350*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
8351*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
8352*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(node);
8353*6777b538SAndroid Build Coastguard Worker return (0);
8354*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
8355*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
8356*6777b538SAndroid Build Coastguard Worker break;
8357*6777b538SAndroid Build Coastguard Worker default:
8358*6777b538SAndroid Build Coastguard Worker return (1);
8359*6777b538SAndroid Build Coastguard Worker }
8360*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(node);
8361*6777b538SAndroid Build Coastguard Worker /*
8362*6777b538SAndroid Build Coastguard Worker * Save out-of-scope ns-references in doc->oldNs.
8363*6777b538SAndroid Build Coastguard Worker */
8364*6777b538SAndroid Build Coastguard Worker do {
8365*6777b538SAndroid Build Coastguard Worker switch (node->type) {
8366*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
8367*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) && (node->nsDef != NULL)) {
8368*6777b538SAndroid Build Coastguard Worker ns = node->nsDef;
8369*6777b538SAndroid Build Coastguard Worker do {
8370*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormAddNsMapItem2(&list, &sizeList,
8371*6777b538SAndroid Build Coastguard Worker &nbList, ns, ns) == -1)
8372*6777b538SAndroid Build Coastguard Worker goto internal_error;
8373*6777b538SAndroid Build Coastguard Worker ns = ns->next;
8374*6777b538SAndroid Build Coastguard Worker } while (ns != NULL);
8375*6777b538SAndroid Build Coastguard Worker }
8376*6777b538SAndroid Build Coastguard Worker /* Falls through. */
8377*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
8378*6777b538SAndroid Build Coastguard Worker if (node->ns != NULL) {
8379*6777b538SAndroid Build Coastguard Worker /*
8380*6777b538SAndroid Build Coastguard Worker * Find a mapping.
8381*6777b538SAndroid Build Coastguard Worker */
8382*6777b538SAndroid Build Coastguard Worker if (list != NULL) {
8383*6777b538SAndroid Build Coastguard Worker for (i = 0, j = 0; i < nbList; i++, j += 2) {
8384*6777b538SAndroid Build Coastguard Worker if (node->ns == list[j]) {
8385*6777b538SAndroid Build Coastguard Worker node->ns = list[++j];
8386*6777b538SAndroid Build Coastguard Worker goto next_node;
8387*6777b538SAndroid Build Coastguard Worker }
8388*6777b538SAndroid Build Coastguard Worker }
8389*6777b538SAndroid Build Coastguard Worker }
8390*6777b538SAndroid Build Coastguard Worker ns = NULL;
8391*6777b538SAndroid Build Coastguard Worker if (ctxt != NULL) {
8392*6777b538SAndroid Build Coastguard Worker /*
8393*6777b538SAndroid Build Coastguard Worker * User defined.
8394*6777b538SAndroid Build Coastguard Worker */
8395*6777b538SAndroid Build Coastguard Worker } else {
8396*6777b538SAndroid Build Coastguard Worker /*
8397*6777b538SAndroid Build Coastguard Worker * Add to doc's oldNs.
8398*6777b538SAndroid Build Coastguard Worker */
8399*6777b538SAndroid Build Coastguard Worker ns = xmlDOMWrapStoreNs(doc, node->ns->href,
8400*6777b538SAndroid Build Coastguard Worker node->ns->prefix);
8401*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
8402*6777b538SAndroid Build Coastguard Worker goto internal_error;
8403*6777b538SAndroid Build Coastguard Worker }
8404*6777b538SAndroid Build Coastguard Worker if (ns != NULL) {
8405*6777b538SAndroid Build Coastguard Worker /*
8406*6777b538SAndroid Build Coastguard Worker * Add mapping.
8407*6777b538SAndroid Build Coastguard Worker */
8408*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormAddNsMapItem2(&list, &sizeList,
8409*6777b538SAndroid Build Coastguard Worker &nbList, node->ns, ns) == -1)
8410*6777b538SAndroid Build Coastguard Worker goto internal_error;
8411*6777b538SAndroid Build Coastguard Worker }
8412*6777b538SAndroid Build Coastguard Worker node->ns = ns;
8413*6777b538SAndroid Build Coastguard Worker }
8414*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_ELEMENT_NODE) &&
8415*6777b538SAndroid Build Coastguard Worker (node->properties != NULL)) {
8416*6777b538SAndroid Build Coastguard Worker node = (xmlNodePtr) node->properties;
8417*6777b538SAndroid Build Coastguard Worker continue;
8418*6777b538SAndroid Build Coastguard Worker }
8419*6777b538SAndroid Build Coastguard Worker break;
8420*6777b538SAndroid Build Coastguard Worker default:
8421*6777b538SAndroid Build Coastguard Worker goto next_sibling;
8422*6777b538SAndroid Build Coastguard Worker }
8423*6777b538SAndroid Build Coastguard Worker next_node:
8424*6777b538SAndroid Build Coastguard Worker if ((node->type == XML_ELEMENT_NODE) &&
8425*6777b538SAndroid Build Coastguard Worker (node->children != NULL)) {
8426*6777b538SAndroid Build Coastguard Worker node = node->children;
8427*6777b538SAndroid Build Coastguard Worker continue;
8428*6777b538SAndroid Build Coastguard Worker }
8429*6777b538SAndroid Build Coastguard Worker next_sibling:
8430*6777b538SAndroid Build Coastguard Worker if (node == NULL)
8431*6777b538SAndroid Build Coastguard Worker break;
8432*6777b538SAndroid Build Coastguard Worker if (node->next != NULL)
8433*6777b538SAndroid Build Coastguard Worker node = node->next;
8434*6777b538SAndroid Build Coastguard Worker else {
8435*6777b538SAndroid Build Coastguard Worker node = node->parent;
8436*6777b538SAndroid Build Coastguard Worker goto next_sibling;
8437*6777b538SAndroid Build Coastguard Worker }
8438*6777b538SAndroid Build Coastguard Worker } while (node != NULL);
8439*6777b538SAndroid Build Coastguard Worker
8440*6777b538SAndroid Build Coastguard Worker if (list != NULL)
8441*6777b538SAndroid Build Coastguard Worker xmlFree(list);
8442*6777b538SAndroid Build Coastguard Worker return (0);
8443*6777b538SAndroid Build Coastguard Worker
8444*6777b538SAndroid Build Coastguard Worker internal_error:
8445*6777b538SAndroid Build Coastguard Worker if (list != NULL)
8446*6777b538SAndroid Build Coastguard Worker xmlFree(list);
8447*6777b538SAndroid Build Coastguard Worker return (-1);
8448*6777b538SAndroid Build Coastguard Worker }
8449*6777b538SAndroid Build Coastguard Worker
8450*6777b538SAndroid Build Coastguard Worker /*
8451*6777b538SAndroid Build Coastguard Worker * xmlSearchNsByNamespaceStrict:
8452*6777b538SAndroid Build Coastguard Worker * @doc: the document
8453*6777b538SAndroid Build Coastguard Worker * @node: the start node
8454*6777b538SAndroid Build Coastguard Worker * @nsName: the searched namespace name
8455*6777b538SAndroid Build Coastguard Worker * @retNs: the resulting ns-decl
8456*6777b538SAndroid Build Coastguard Worker * @prefixed: if the found ns-decl must have a prefix (for attributes)
8457*6777b538SAndroid Build Coastguard Worker *
8458*6777b538SAndroid Build Coastguard Worker * Dynamically searches for a ns-declaration which matches
8459*6777b538SAndroid Build Coastguard Worker * the given @nsName in the ancestor-or-self axis of @node.
8460*6777b538SAndroid Build Coastguard Worker *
8461*6777b538SAndroid Build Coastguard Worker * Returns 1 if a ns-decl was found, 0 if not and -1 on API
8462*6777b538SAndroid Build Coastguard Worker * and internal errors.
8463*6777b538SAndroid Build Coastguard Worker */
8464*6777b538SAndroid Build Coastguard Worker static int
xmlSearchNsByNamespaceStrict(xmlDocPtr doc,xmlNodePtr node,const xmlChar * nsName,xmlNsPtr * retNs,int prefixed)8465*6777b538SAndroid Build Coastguard Worker xmlSearchNsByNamespaceStrict(xmlDocPtr doc, xmlNodePtr node,
8466*6777b538SAndroid Build Coastguard Worker const xmlChar* nsName,
8467*6777b538SAndroid Build Coastguard Worker xmlNsPtr *retNs, int prefixed)
8468*6777b538SAndroid Build Coastguard Worker {
8469*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur, prev = NULL, out = NULL;
8470*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns, prevns;
8471*6777b538SAndroid Build Coastguard Worker
8472*6777b538SAndroid Build Coastguard Worker if ((doc == NULL) || (nsName == NULL) || (retNs == NULL))
8473*6777b538SAndroid Build Coastguard Worker return (-1);
8474*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type == XML_NAMESPACE_DECL))
8475*6777b538SAndroid Build Coastguard Worker return(-1);
8476*6777b538SAndroid Build Coastguard Worker
8477*6777b538SAndroid Build Coastguard Worker *retNs = NULL;
8478*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(nsName, XML_XML_NAMESPACE)) {
8479*6777b538SAndroid Build Coastguard Worker *retNs = xmlTreeEnsureXMLDecl(doc);
8480*6777b538SAndroid Build Coastguard Worker if (*retNs == NULL)
8481*6777b538SAndroid Build Coastguard Worker return (-1);
8482*6777b538SAndroid Build Coastguard Worker return (1);
8483*6777b538SAndroid Build Coastguard Worker }
8484*6777b538SAndroid Build Coastguard Worker cur = node;
8485*6777b538SAndroid Build Coastguard Worker do {
8486*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ELEMENT_NODE) {
8487*6777b538SAndroid Build Coastguard Worker if (cur->nsDef != NULL) {
8488*6777b538SAndroid Build Coastguard Worker for (ns = cur->nsDef; ns != NULL; ns = ns->next) {
8489*6777b538SAndroid Build Coastguard Worker if (prefixed && (ns->prefix == NULL))
8490*6777b538SAndroid Build Coastguard Worker continue;
8491*6777b538SAndroid Build Coastguard Worker if (prev != NULL) {
8492*6777b538SAndroid Build Coastguard Worker /*
8493*6777b538SAndroid Build Coastguard Worker * Check the last level of ns-decls for a
8494*6777b538SAndroid Build Coastguard Worker * shadowing prefix.
8495*6777b538SAndroid Build Coastguard Worker */
8496*6777b538SAndroid Build Coastguard Worker prevns = prev->nsDef;
8497*6777b538SAndroid Build Coastguard Worker do {
8498*6777b538SAndroid Build Coastguard Worker if ((prevns->prefix == ns->prefix) ||
8499*6777b538SAndroid Build Coastguard Worker ((prevns->prefix != NULL) &&
8500*6777b538SAndroid Build Coastguard Worker (ns->prefix != NULL) &&
8501*6777b538SAndroid Build Coastguard Worker xmlStrEqual(prevns->prefix, ns->prefix))) {
8502*6777b538SAndroid Build Coastguard Worker /*
8503*6777b538SAndroid Build Coastguard Worker * Shadowed.
8504*6777b538SAndroid Build Coastguard Worker */
8505*6777b538SAndroid Build Coastguard Worker break;
8506*6777b538SAndroid Build Coastguard Worker }
8507*6777b538SAndroid Build Coastguard Worker prevns = prevns->next;
8508*6777b538SAndroid Build Coastguard Worker } while (prevns != NULL);
8509*6777b538SAndroid Build Coastguard Worker if (prevns != NULL)
8510*6777b538SAndroid Build Coastguard Worker continue;
8511*6777b538SAndroid Build Coastguard Worker }
8512*6777b538SAndroid Build Coastguard Worker /*
8513*6777b538SAndroid Build Coastguard Worker * Ns-name comparison.
8514*6777b538SAndroid Build Coastguard Worker */
8515*6777b538SAndroid Build Coastguard Worker if ((nsName == ns->href) ||
8516*6777b538SAndroid Build Coastguard Worker xmlStrEqual(nsName, ns->href)) {
8517*6777b538SAndroid Build Coastguard Worker /*
8518*6777b538SAndroid Build Coastguard Worker * At this point the prefix can only be shadowed,
8519*6777b538SAndroid Build Coastguard Worker * if we are the the (at least) 3rd level of
8520*6777b538SAndroid Build Coastguard Worker * ns-decls.
8521*6777b538SAndroid Build Coastguard Worker */
8522*6777b538SAndroid Build Coastguard Worker if (out) {
8523*6777b538SAndroid Build Coastguard Worker int ret;
8524*6777b538SAndroid Build Coastguard Worker
8525*6777b538SAndroid Build Coastguard Worker ret = xmlNsInScope(doc, node, prev, ns->prefix);
8526*6777b538SAndroid Build Coastguard Worker if (ret < 0)
8527*6777b538SAndroid Build Coastguard Worker return (-1);
8528*6777b538SAndroid Build Coastguard Worker /*
8529*6777b538SAndroid Build Coastguard Worker * TODO: Should we try to find a matching ns-name
8530*6777b538SAndroid Build Coastguard Worker * only once? This here keeps on searching.
8531*6777b538SAndroid Build Coastguard Worker * I think we should try further since, there might
8532*6777b538SAndroid Build Coastguard Worker * be an other matching ns-decl with an unshadowed
8533*6777b538SAndroid Build Coastguard Worker * prefix.
8534*6777b538SAndroid Build Coastguard Worker */
8535*6777b538SAndroid Build Coastguard Worker if (! ret)
8536*6777b538SAndroid Build Coastguard Worker continue;
8537*6777b538SAndroid Build Coastguard Worker }
8538*6777b538SAndroid Build Coastguard Worker *retNs = ns;
8539*6777b538SAndroid Build Coastguard Worker return (1);
8540*6777b538SAndroid Build Coastguard Worker }
8541*6777b538SAndroid Build Coastguard Worker }
8542*6777b538SAndroid Build Coastguard Worker out = prev;
8543*6777b538SAndroid Build Coastguard Worker prev = cur;
8544*6777b538SAndroid Build Coastguard Worker }
8545*6777b538SAndroid Build Coastguard Worker } else if ((cur->type == XML_ENTITY_NODE) ||
8546*6777b538SAndroid Build Coastguard Worker (cur->type == XML_ENTITY_DECL))
8547*6777b538SAndroid Build Coastguard Worker return (0);
8548*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
8549*6777b538SAndroid Build Coastguard Worker } while ((cur != NULL) && (cur->doc != (xmlDocPtr) cur));
8550*6777b538SAndroid Build Coastguard Worker return (0);
8551*6777b538SAndroid Build Coastguard Worker }
8552*6777b538SAndroid Build Coastguard Worker
8553*6777b538SAndroid Build Coastguard Worker /*
8554*6777b538SAndroid Build Coastguard Worker * xmlSearchNsByPrefixStrict:
8555*6777b538SAndroid Build Coastguard Worker * @doc: the document
8556*6777b538SAndroid Build Coastguard Worker * @node: the start node
8557*6777b538SAndroid Build Coastguard Worker * @prefix: the searched namespace prefix
8558*6777b538SAndroid Build Coastguard Worker * @retNs: the resulting ns-decl
8559*6777b538SAndroid Build Coastguard Worker *
8560*6777b538SAndroid Build Coastguard Worker * Dynamically searches for a ns-declaration which matches
8561*6777b538SAndroid Build Coastguard Worker * the given @nsName in the ancestor-or-self axis of @node.
8562*6777b538SAndroid Build Coastguard Worker *
8563*6777b538SAndroid Build Coastguard Worker * Returns 1 if a ns-decl was found, 0 if not and -1 on API
8564*6777b538SAndroid Build Coastguard Worker * and internal errors.
8565*6777b538SAndroid Build Coastguard Worker */
8566*6777b538SAndroid Build Coastguard Worker static int
xmlSearchNsByPrefixStrict(xmlDocPtr doc,xmlNodePtr node,const xmlChar * prefix,xmlNsPtr * retNs)8567*6777b538SAndroid Build Coastguard Worker xmlSearchNsByPrefixStrict(xmlDocPtr doc, xmlNodePtr node,
8568*6777b538SAndroid Build Coastguard Worker const xmlChar* prefix,
8569*6777b538SAndroid Build Coastguard Worker xmlNsPtr *retNs)
8570*6777b538SAndroid Build Coastguard Worker {
8571*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
8572*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
8573*6777b538SAndroid Build Coastguard Worker
8574*6777b538SAndroid Build Coastguard Worker if ((doc == NULL) || (node == NULL) || (node->type == XML_NAMESPACE_DECL))
8575*6777b538SAndroid Build Coastguard Worker return(-1);
8576*6777b538SAndroid Build Coastguard Worker
8577*6777b538SAndroid Build Coastguard Worker if (retNs)
8578*6777b538SAndroid Build Coastguard Worker *retNs = NULL;
8579*6777b538SAndroid Build Coastguard Worker if (IS_STR_XML(prefix)) {
8580*6777b538SAndroid Build Coastguard Worker if (retNs) {
8581*6777b538SAndroid Build Coastguard Worker *retNs = xmlTreeEnsureXMLDecl(doc);
8582*6777b538SAndroid Build Coastguard Worker if (*retNs == NULL)
8583*6777b538SAndroid Build Coastguard Worker return (-1);
8584*6777b538SAndroid Build Coastguard Worker }
8585*6777b538SAndroid Build Coastguard Worker return (1);
8586*6777b538SAndroid Build Coastguard Worker }
8587*6777b538SAndroid Build Coastguard Worker cur = node;
8588*6777b538SAndroid Build Coastguard Worker do {
8589*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ELEMENT_NODE) {
8590*6777b538SAndroid Build Coastguard Worker if (cur->nsDef != NULL) {
8591*6777b538SAndroid Build Coastguard Worker ns = cur->nsDef;
8592*6777b538SAndroid Build Coastguard Worker do {
8593*6777b538SAndroid Build Coastguard Worker if ((prefix == ns->prefix) ||
8594*6777b538SAndroid Build Coastguard Worker xmlStrEqual(prefix, ns->prefix))
8595*6777b538SAndroid Build Coastguard Worker {
8596*6777b538SAndroid Build Coastguard Worker /*
8597*6777b538SAndroid Build Coastguard Worker * Disabled namespaces, e.g. xmlns:abc="".
8598*6777b538SAndroid Build Coastguard Worker */
8599*6777b538SAndroid Build Coastguard Worker if (ns->href == NULL)
8600*6777b538SAndroid Build Coastguard Worker return(0);
8601*6777b538SAndroid Build Coastguard Worker if (retNs)
8602*6777b538SAndroid Build Coastguard Worker *retNs = ns;
8603*6777b538SAndroid Build Coastguard Worker return (1);
8604*6777b538SAndroid Build Coastguard Worker }
8605*6777b538SAndroid Build Coastguard Worker ns = ns->next;
8606*6777b538SAndroid Build Coastguard Worker } while (ns != NULL);
8607*6777b538SAndroid Build Coastguard Worker }
8608*6777b538SAndroid Build Coastguard Worker } else if ((cur->type == XML_ENTITY_NODE) ||
8609*6777b538SAndroid Build Coastguard Worker (cur->type == XML_ENTITY_DECL))
8610*6777b538SAndroid Build Coastguard Worker return (0);
8611*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
8612*6777b538SAndroid Build Coastguard Worker } while ((cur != NULL) && (cur->doc != (xmlDocPtr) cur));
8613*6777b538SAndroid Build Coastguard Worker return (0);
8614*6777b538SAndroid Build Coastguard Worker }
8615*6777b538SAndroid Build Coastguard Worker
8616*6777b538SAndroid Build Coastguard Worker /*
8617*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapNSNormDeclareNsForced:
8618*6777b538SAndroid Build Coastguard Worker * @doc: the doc
8619*6777b538SAndroid Build Coastguard Worker * @elem: the element-node to declare on
8620*6777b538SAndroid Build Coastguard Worker * @nsName: the namespace-name of the ns-decl
8621*6777b538SAndroid Build Coastguard Worker * @prefix: the preferred prefix of the ns-decl
8622*6777b538SAndroid Build Coastguard Worker * @checkShadow: ensure that the new ns-decl doesn't shadow ancestor ns-decls
8623*6777b538SAndroid Build Coastguard Worker *
8624*6777b538SAndroid Build Coastguard Worker * Declares a new namespace on @elem. It tries to use the
8625*6777b538SAndroid Build Coastguard Worker * given @prefix; if a ns-decl with the given prefix is already existent
8626*6777b538SAndroid Build Coastguard Worker * on @elem, it will generate an other prefix.
8627*6777b538SAndroid Build Coastguard Worker *
8628*6777b538SAndroid Build Coastguard Worker * Returns 1 if a ns-decl was found, 0 if not and -1 on API
8629*6777b538SAndroid Build Coastguard Worker * and internal errors.
8630*6777b538SAndroid Build Coastguard Worker */
8631*6777b538SAndroid Build Coastguard Worker static xmlNsPtr
xmlDOMWrapNSNormDeclareNsForced(xmlDocPtr doc,xmlNodePtr elem,const xmlChar * nsName,const xmlChar * prefix,int checkShadow)8632*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNSNormDeclareNsForced(xmlDocPtr doc,
8633*6777b538SAndroid Build Coastguard Worker xmlNodePtr elem,
8634*6777b538SAndroid Build Coastguard Worker const xmlChar *nsName,
8635*6777b538SAndroid Build Coastguard Worker const xmlChar *prefix,
8636*6777b538SAndroid Build Coastguard Worker int checkShadow)
8637*6777b538SAndroid Build Coastguard Worker {
8638*6777b538SAndroid Build Coastguard Worker
8639*6777b538SAndroid Build Coastguard Worker xmlNsPtr ret;
8640*6777b538SAndroid Build Coastguard Worker char buf[50];
8641*6777b538SAndroid Build Coastguard Worker const xmlChar *pref;
8642*6777b538SAndroid Build Coastguard Worker int counter = 0;
8643*6777b538SAndroid Build Coastguard Worker
8644*6777b538SAndroid Build Coastguard Worker if ((doc == NULL) || (elem == NULL) || (elem->type != XML_ELEMENT_NODE))
8645*6777b538SAndroid Build Coastguard Worker return(NULL);
8646*6777b538SAndroid Build Coastguard Worker /*
8647*6777b538SAndroid Build Coastguard Worker * Create a ns-decl on @anchor.
8648*6777b538SAndroid Build Coastguard Worker */
8649*6777b538SAndroid Build Coastguard Worker pref = prefix;
8650*6777b538SAndroid Build Coastguard Worker while (1) {
8651*6777b538SAndroid Build Coastguard Worker /*
8652*6777b538SAndroid Build Coastguard Worker * Lookup whether the prefix is unused in elem's ns-decls.
8653*6777b538SAndroid Build Coastguard Worker */
8654*6777b538SAndroid Build Coastguard Worker if ((elem->nsDef != NULL) &&
8655*6777b538SAndroid Build Coastguard Worker (xmlTreeNSListLookupByPrefix(elem->nsDef, pref) != NULL))
8656*6777b538SAndroid Build Coastguard Worker goto ns_next_prefix;
8657*6777b538SAndroid Build Coastguard Worker if (checkShadow && elem->parent &&
8658*6777b538SAndroid Build Coastguard Worker ((xmlNodePtr) elem->parent->doc != elem->parent)) {
8659*6777b538SAndroid Build Coastguard Worker /*
8660*6777b538SAndroid Build Coastguard Worker * Does it shadow ancestor ns-decls?
8661*6777b538SAndroid Build Coastguard Worker */
8662*6777b538SAndroid Build Coastguard Worker if (xmlSearchNsByPrefixStrict(doc, elem->parent, pref, NULL) == 1)
8663*6777b538SAndroid Build Coastguard Worker goto ns_next_prefix;
8664*6777b538SAndroid Build Coastguard Worker }
8665*6777b538SAndroid Build Coastguard Worker ret = xmlNewNs(NULL, nsName, pref);
8666*6777b538SAndroid Build Coastguard Worker if (ret == NULL)
8667*6777b538SAndroid Build Coastguard Worker return (NULL);
8668*6777b538SAndroid Build Coastguard Worker if (elem->nsDef == NULL)
8669*6777b538SAndroid Build Coastguard Worker elem->nsDef = ret;
8670*6777b538SAndroid Build Coastguard Worker else {
8671*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns2 = elem->nsDef;
8672*6777b538SAndroid Build Coastguard Worker while (ns2->next != NULL)
8673*6777b538SAndroid Build Coastguard Worker ns2 = ns2->next;
8674*6777b538SAndroid Build Coastguard Worker ns2->next = ret;
8675*6777b538SAndroid Build Coastguard Worker }
8676*6777b538SAndroid Build Coastguard Worker return (ret);
8677*6777b538SAndroid Build Coastguard Worker ns_next_prefix:
8678*6777b538SAndroid Build Coastguard Worker counter++;
8679*6777b538SAndroid Build Coastguard Worker if (counter > 1000)
8680*6777b538SAndroid Build Coastguard Worker return (NULL);
8681*6777b538SAndroid Build Coastguard Worker if (prefix == NULL) {
8682*6777b538SAndroid Build Coastguard Worker snprintf((char *) buf, sizeof(buf),
8683*6777b538SAndroid Build Coastguard Worker "ns_%d", counter);
8684*6777b538SAndroid Build Coastguard Worker } else
8685*6777b538SAndroid Build Coastguard Worker snprintf((char *) buf, sizeof(buf),
8686*6777b538SAndroid Build Coastguard Worker "%.30s_%d", (char *)prefix, counter);
8687*6777b538SAndroid Build Coastguard Worker pref = BAD_CAST buf;
8688*6777b538SAndroid Build Coastguard Worker }
8689*6777b538SAndroid Build Coastguard Worker }
8690*6777b538SAndroid Build Coastguard Worker
8691*6777b538SAndroid Build Coastguard Worker /*
8692*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapNSNormAcquireNormalizedNs:
8693*6777b538SAndroid Build Coastguard Worker * @doc: the doc
8694*6777b538SAndroid Build Coastguard Worker * @elem: the element-node to declare namespaces on
8695*6777b538SAndroid Build Coastguard Worker * @ns: the ns-struct to use for the search
8696*6777b538SAndroid Build Coastguard Worker * @retNs: the found/created ns-struct
8697*6777b538SAndroid Build Coastguard Worker * @nsMap: the ns-map
8698*6777b538SAndroid Build Coastguard Worker * @depth: the current tree depth
8699*6777b538SAndroid Build Coastguard Worker * @ancestorsOnly: search in ancestor ns-decls only
8700*6777b538SAndroid Build Coastguard Worker * @prefixed: if the searched ns-decl must have a prefix (for attributes)
8701*6777b538SAndroid Build Coastguard Worker *
8702*6777b538SAndroid Build Coastguard Worker * Searches for a matching ns-name in the ns-decls of @nsMap, if not
8703*6777b538SAndroid Build Coastguard Worker * found it will either declare it on @elem, or store it in doc->oldNs.
8704*6777b538SAndroid Build Coastguard Worker * If a new ns-decl needs to be declared on @elem, it tries to use the
8705*6777b538SAndroid Build Coastguard Worker * @ns->prefix for it, if this prefix is already in use on @elem, it will
8706*6777b538SAndroid Build Coastguard Worker * change the prefix or the new ns-decl.
8707*6777b538SAndroid Build Coastguard Worker *
8708*6777b538SAndroid Build Coastguard Worker * Returns 0 if succeeded, -1 otherwise and on API/internal errors.
8709*6777b538SAndroid Build Coastguard Worker */
8710*6777b538SAndroid Build Coastguard Worker static int
xmlDOMWrapNSNormAcquireNormalizedNs(xmlDocPtr doc,xmlNodePtr elem,xmlNsPtr ns,xmlNsPtr * retNs,xmlNsMapPtr * nsMap,int depth,int ancestorsOnly,int prefixed)8711*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNSNormAcquireNormalizedNs(xmlDocPtr doc,
8712*6777b538SAndroid Build Coastguard Worker xmlNodePtr elem,
8713*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns,
8714*6777b538SAndroid Build Coastguard Worker xmlNsPtr *retNs,
8715*6777b538SAndroid Build Coastguard Worker xmlNsMapPtr *nsMap,
8716*6777b538SAndroid Build Coastguard Worker
8717*6777b538SAndroid Build Coastguard Worker int depth,
8718*6777b538SAndroid Build Coastguard Worker int ancestorsOnly,
8719*6777b538SAndroid Build Coastguard Worker int prefixed)
8720*6777b538SAndroid Build Coastguard Worker {
8721*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr mi;
8722*6777b538SAndroid Build Coastguard Worker
8723*6777b538SAndroid Build Coastguard Worker if ((doc == NULL) || (ns == NULL) || (retNs == NULL) ||
8724*6777b538SAndroid Build Coastguard Worker (nsMap == NULL))
8725*6777b538SAndroid Build Coastguard Worker return (-1);
8726*6777b538SAndroid Build Coastguard Worker
8727*6777b538SAndroid Build Coastguard Worker *retNs = NULL;
8728*6777b538SAndroid Build Coastguard Worker /*
8729*6777b538SAndroid Build Coastguard Worker * Handle XML namespace.
8730*6777b538SAndroid Build Coastguard Worker */
8731*6777b538SAndroid Build Coastguard Worker if (IS_STR_XML(ns->prefix)) {
8732*6777b538SAndroid Build Coastguard Worker /*
8733*6777b538SAndroid Build Coastguard Worker * Insert XML namespace mapping.
8734*6777b538SAndroid Build Coastguard Worker */
8735*6777b538SAndroid Build Coastguard Worker *retNs = xmlTreeEnsureXMLDecl(doc);
8736*6777b538SAndroid Build Coastguard Worker if (*retNs == NULL)
8737*6777b538SAndroid Build Coastguard Worker return (-1);
8738*6777b538SAndroid Build Coastguard Worker return (0);
8739*6777b538SAndroid Build Coastguard Worker }
8740*6777b538SAndroid Build Coastguard Worker /*
8741*6777b538SAndroid Build Coastguard Worker * If the search should be done in ancestors only and no
8742*6777b538SAndroid Build Coastguard Worker * @elem (the first ancestor) was specified, then skip the search.
8743*6777b538SAndroid Build Coastguard Worker */
8744*6777b538SAndroid Build Coastguard Worker if ((XML_NSMAP_NOTEMPTY(*nsMap)) &&
8745*6777b538SAndroid Build Coastguard Worker (! (ancestorsOnly && (elem == NULL))))
8746*6777b538SAndroid Build Coastguard Worker {
8747*6777b538SAndroid Build Coastguard Worker /*
8748*6777b538SAndroid Build Coastguard Worker * Try to find an equal ns-name in in-scope ns-decls.
8749*6777b538SAndroid Build Coastguard Worker */
8750*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(*nsMap, mi) {
8751*6777b538SAndroid Build Coastguard Worker if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
8752*6777b538SAndroid Build Coastguard Worker /*
8753*6777b538SAndroid Build Coastguard Worker * ancestorsOnly: This should be turned on to gain speed,
8754*6777b538SAndroid Build Coastguard Worker * if one knows that the branch itself was already
8755*6777b538SAndroid Build Coastguard Worker * ns-wellformed and no stale references existed.
8756*6777b538SAndroid Build Coastguard Worker * I.e. it searches in the ancestor axis only.
8757*6777b538SAndroid Build Coastguard Worker */
8758*6777b538SAndroid Build Coastguard Worker ((! ancestorsOnly) || (mi->depth == XML_TREE_NSMAP_PARENT)) &&
8759*6777b538SAndroid Build Coastguard Worker /* Skip shadowed prefixes. */
8760*6777b538SAndroid Build Coastguard Worker (mi->shadowDepth == -1) &&
8761*6777b538SAndroid Build Coastguard Worker /* Skip xmlns="" or xmlns:foo="". */
8762*6777b538SAndroid Build Coastguard Worker ((mi->newNs->href != NULL) &&
8763*6777b538SAndroid Build Coastguard Worker (mi->newNs->href[0] != 0)) &&
8764*6777b538SAndroid Build Coastguard Worker /* Ensure a prefix if wanted. */
8765*6777b538SAndroid Build Coastguard Worker ((! prefixed) || (mi->newNs->prefix != NULL)) &&
8766*6777b538SAndroid Build Coastguard Worker /* Equal ns name */
8767*6777b538SAndroid Build Coastguard Worker ((mi->newNs->href == ns->href) ||
8768*6777b538SAndroid Build Coastguard Worker xmlStrEqual(mi->newNs->href, ns->href))) {
8769*6777b538SAndroid Build Coastguard Worker /* Set the mapping. */
8770*6777b538SAndroid Build Coastguard Worker mi->oldNs = ns;
8771*6777b538SAndroid Build Coastguard Worker *retNs = mi->newNs;
8772*6777b538SAndroid Build Coastguard Worker return (0);
8773*6777b538SAndroid Build Coastguard Worker }
8774*6777b538SAndroid Build Coastguard Worker }
8775*6777b538SAndroid Build Coastguard Worker }
8776*6777b538SAndroid Build Coastguard Worker /*
8777*6777b538SAndroid Build Coastguard Worker * No luck, the namespace is out of scope or shadowed.
8778*6777b538SAndroid Build Coastguard Worker */
8779*6777b538SAndroid Build Coastguard Worker if (elem == NULL) {
8780*6777b538SAndroid Build Coastguard Worker xmlNsPtr tmpns;
8781*6777b538SAndroid Build Coastguard Worker
8782*6777b538SAndroid Build Coastguard Worker /*
8783*6777b538SAndroid Build Coastguard Worker * Store ns-decls in "oldNs" of the document-node.
8784*6777b538SAndroid Build Coastguard Worker */
8785*6777b538SAndroid Build Coastguard Worker tmpns = xmlDOMWrapStoreNs(doc, ns->href, ns->prefix);
8786*6777b538SAndroid Build Coastguard Worker if (tmpns == NULL)
8787*6777b538SAndroid Build Coastguard Worker return (-1);
8788*6777b538SAndroid Build Coastguard Worker /*
8789*6777b538SAndroid Build Coastguard Worker * Insert mapping.
8790*6777b538SAndroid Build Coastguard Worker */
8791*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNsMapAddItem(nsMap, -1, ns,
8792*6777b538SAndroid Build Coastguard Worker tmpns, XML_TREE_NSMAP_DOC) == NULL) {
8793*6777b538SAndroid Build Coastguard Worker xmlFreeNs(tmpns);
8794*6777b538SAndroid Build Coastguard Worker return (-1);
8795*6777b538SAndroid Build Coastguard Worker }
8796*6777b538SAndroid Build Coastguard Worker *retNs = tmpns;
8797*6777b538SAndroid Build Coastguard Worker } else {
8798*6777b538SAndroid Build Coastguard Worker xmlNsPtr tmpns;
8799*6777b538SAndroid Build Coastguard Worker
8800*6777b538SAndroid Build Coastguard Worker tmpns = xmlDOMWrapNSNormDeclareNsForced(doc, elem, ns->href,
8801*6777b538SAndroid Build Coastguard Worker ns->prefix, 0);
8802*6777b538SAndroid Build Coastguard Worker if (tmpns == NULL)
8803*6777b538SAndroid Build Coastguard Worker return (-1);
8804*6777b538SAndroid Build Coastguard Worker
8805*6777b538SAndroid Build Coastguard Worker if (*nsMap != NULL) {
8806*6777b538SAndroid Build Coastguard Worker /*
8807*6777b538SAndroid Build Coastguard Worker * Does it shadow ancestor ns-decls?
8808*6777b538SAndroid Build Coastguard Worker */
8809*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(*nsMap, mi) {
8810*6777b538SAndroid Build Coastguard Worker if ((mi->depth < depth) &&
8811*6777b538SAndroid Build Coastguard Worker (mi->shadowDepth == -1) &&
8812*6777b538SAndroid Build Coastguard Worker ((ns->prefix == mi->newNs->prefix) ||
8813*6777b538SAndroid Build Coastguard Worker xmlStrEqual(ns->prefix, mi->newNs->prefix))) {
8814*6777b538SAndroid Build Coastguard Worker /*
8815*6777b538SAndroid Build Coastguard Worker * Shadows.
8816*6777b538SAndroid Build Coastguard Worker */
8817*6777b538SAndroid Build Coastguard Worker mi->shadowDepth = depth;
8818*6777b538SAndroid Build Coastguard Worker break;
8819*6777b538SAndroid Build Coastguard Worker }
8820*6777b538SAndroid Build Coastguard Worker }
8821*6777b538SAndroid Build Coastguard Worker }
8822*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNsMapAddItem(nsMap, -1, ns, tmpns, depth) == NULL) {
8823*6777b538SAndroid Build Coastguard Worker xmlFreeNs(tmpns);
8824*6777b538SAndroid Build Coastguard Worker return (-1);
8825*6777b538SAndroid Build Coastguard Worker }
8826*6777b538SAndroid Build Coastguard Worker *retNs = tmpns;
8827*6777b538SAndroid Build Coastguard Worker }
8828*6777b538SAndroid Build Coastguard Worker return (0);
8829*6777b538SAndroid Build Coastguard Worker }
8830*6777b538SAndroid Build Coastguard Worker
8831*6777b538SAndroid Build Coastguard Worker typedef enum {
8832*6777b538SAndroid Build Coastguard Worker XML_DOM_RECONNS_REMOVEREDUND = 1<<0
8833*6777b538SAndroid Build Coastguard Worker } xmlDOMReconcileNSOptions;
8834*6777b538SAndroid Build Coastguard Worker
8835*6777b538SAndroid Build Coastguard Worker /*
8836*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapReconcileNamespaces:
8837*6777b538SAndroid Build Coastguard Worker * @ctxt: DOM wrapper context, unused at the moment
8838*6777b538SAndroid Build Coastguard Worker * @elem: the element-node
8839*6777b538SAndroid Build Coastguard Worker * @options: option flags
8840*6777b538SAndroid Build Coastguard Worker *
8841*6777b538SAndroid Build Coastguard Worker * Ensures that ns-references point to ns-decls hold on element-nodes.
8842*6777b538SAndroid Build Coastguard Worker * Ensures that the tree is namespace wellformed by creating additional
8843*6777b538SAndroid Build Coastguard Worker * ns-decls where needed. Note that, since prefixes of already existent
8844*6777b538SAndroid Build Coastguard Worker * ns-decls can be shadowed by this process, it could break QNames in
8845*6777b538SAndroid Build Coastguard Worker * attribute values or element content.
8846*6777b538SAndroid Build Coastguard Worker *
8847*6777b538SAndroid Build Coastguard Worker * NOTE: This function was not intensively tested.
8848*6777b538SAndroid Build Coastguard Worker *
8849*6777b538SAndroid Build Coastguard Worker * Returns 0 if succeeded, -1 otherwise and on API/internal errors.
8850*6777b538SAndroid Build Coastguard Worker */
8851*6777b538SAndroid Build Coastguard Worker
8852*6777b538SAndroid Build Coastguard Worker int
xmlDOMWrapReconcileNamespaces(xmlDOMWrapCtxtPtr ctxt ATTRIBUTE_UNUSED,xmlNodePtr elem,int options)8853*6777b538SAndroid Build Coastguard Worker xmlDOMWrapReconcileNamespaces(xmlDOMWrapCtxtPtr ctxt ATTRIBUTE_UNUSED,
8854*6777b538SAndroid Build Coastguard Worker xmlNodePtr elem,
8855*6777b538SAndroid Build Coastguard Worker int options)
8856*6777b538SAndroid Build Coastguard Worker {
8857*6777b538SAndroid Build Coastguard Worker int depth = -1, adoptns = 0, parnsdone = 0;
8858*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns, prevns;
8859*6777b538SAndroid Build Coastguard Worker xmlDocPtr doc;
8860*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur, curElem = NULL;
8861*6777b538SAndroid Build Coastguard Worker xmlNsMapPtr nsMap = NULL;
8862*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr /* topmi = NULL, */ mi;
8863*6777b538SAndroid Build Coastguard Worker /* @ancestorsOnly should be set by an option flag. */
8864*6777b538SAndroid Build Coastguard Worker int ancestorsOnly = 0;
8865*6777b538SAndroid Build Coastguard Worker int optRemoveRedundantNS =
8866*6777b538SAndroid Build Coastguard Worker ((xmlDOMReconcileNSOptions) options & XML_DOM_RECONNS_REMOVEREDUND) ? 1 : 0;
8867*6777b538SAndroid Build Coastguard Worker xmlNsPtr *listRedund = NULL;
8868*6777b538SAndroid Build Coastguard Worker int sizeRedund = 0, nbRedund = 0, ret, i, j;
8869*6777b538SAndroid Build Coastguard Worker
8870*6777b538SAndroid Build Coastguard Worker if ((elem == NULL) || (elem->doc == NULL) ||
8871*6777b538SAndroid Build Coastguard Worker (elem->type != XML_ELEMENT_NODE))
8872*6777b538SAndroid Build Coastguard Worker return (-1);
8873*6777b538SAndroid Build Coastguard Worker
8874*6777b538SAndroid Build Coastguard Worker doc = elem->doc;
8875*6777b538SAndroid Build Coastguard Worker cur = elem;
8876*6777b538SAndroid Build Coastguard Worker do {
8877*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
8878*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
8879*6777b538SAndroid Build Coastguard Worker adoptns = 1;
8880*6777b538SAndroid Build Coastguard Worker curElem = cur;
8881*6777b538SAndroid Build Coastguard Worker depth++;
8882*6777b538SAndroid Build Coastguard Worker /*
8883*6777b538SAndroid Build Coastguard Worker * Namespace declarations.
8884*6777b538SAndroid Build Coastguard Worker */
8885*6777b538SAndroid Build Coastguard Worker if (cur->nsDef != NULL) {
8886*6777b538SAndroid Build Coastguard Worker prevns = NULL;
8887*6777b538SAndroid Build Coastguard Worker ns = cur->nsDef;
8888*6777b538SAndroid Build Coastguard Worker while (ns != NULL) {
8889*6777b538SAndroid Build Coastguard Worker if (! parnsdone) {
8890*6777b538SAndroid Build Coastguard Worker if ((elem->parent) &&
8891*6777b538SAndroid Build Coastguard Worker ((xmlNodePtr) elem->parent->doc != elem->parent)) {
8892*6777b538SAndroid Build Coastguard Worker /*
8893*6777b538SAndroid Build Coastguard Worker * Gather ancestor in-scope ns-decls.
8894*6777b538SAndroid Build Coastguard Worker */
8895*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
8896*6777b538SAndroid Build Coastguard Worker elem->parent) == -1)
8897*6777b538SAndroid Build Coastguard Worker goto internal_error;
8898*6777b538SAndroid Build Coastguard Worker }
8899*6777b538SAndroid Build Coastguard Worker parnsdone = 1;
8900*6777b538SAndroid Build Coastguard Worker }
8901*6777b538SAndroid Build Coastguard Worker
8902*6777b538SAndroid Build Coastguard Worker /*
8903*6777b538SAndroid Build Coastguard Worker * Lookup the ns ancestor-axis for equal ns-decls in scope.
8904*6777b538SAndroid Build Coastguard Worker */
8905*6777b538SAndroid Build Coastguard Worker if (optRemoveRedundantNS && XML_NSMAP_NOTEMPTY(nsMap)) {
8906*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
8907*6777b538SAndroid Build Coastguard Worker if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
8908*6777b538SAndroid Build Coastguard Worker (mi->shadowDepth == -1) &&
8909*6777b538SAndroid Build Coastguard Worker ((ns->prefix == mi->newNs->prefix) ||
8910*6777b538SAndroid Build Coastguard Worker xmlStrEqual(ns->prefix, mi->newNs->prefix)) &&
8911*6777b538SAndroid Build Coastguard Worker ((ns->href == mi->newNs->href) ||
8912*6777b538SAndroid Build Coastguard Worker xmlStrEqual(ns->href, mi->newNs->href)))
8913*6777b538SAndroid Build Coastguard Worker {
8914*6777b538SAndroid Build Coastguard Worker /*
8915*6777b538SAndroid Build Coastguard Worker * A redundant ns-decl was found.
8916*6777b538SAndroid Build Coastguard Worker * Add it to the list of redundant ns-decls.
8917*6777b538SAndroid Build Coastguard Worker */
8918*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormAddNsMapItem2(&listRedund,
8919*6777b538SAndroid Build Coastguard Worker &sizeRedund, &nbRedund, ns, mi->newNs) == -1)
8920*6777b538SAndroid Build Coastguard Worker goto internal_error;
8921*6777b538SAndroid Build Coastguard Worker /*
8922*6777b538SAndroid Build Coastguard Worker * Remove the ns-decl from the element-node.
8923*6777b538SAndroid Build Coastguard Worker */
8924*6777b538SAndroid Build Coastguard Worker if (prevns)
8925*6777b538SAndroid Build Coastguard Worker prevns->next = ns->next;
8926*6777b538SAndroid Build Coastguard Worker else
8927*6777b538SAndroid Build Coastguard Worker cur->nsDef = ns->next;
8928*6777b538SAndroid Build Coastguard Worker goto next_ns_decl;
8929*6777b538SAndroid Build Coastguard Worker }
8930*6777b538SAndroid Build Coastguard Worker }
8931*6777b538SAndroid Build Coastguard Worker }
8932*6777b538SAndroid Build Coastguard Worker
8933*6777b538SAndroid Build Coastguard Worker /*
8934*6777b538SAndroid Build Coastguard Worker * Skip ns-references handling if the referenced
8935*6777b538SAndroid Build Coastguard Worker * ns-decl is declared on the same element.
8936*6777b538SAndroid Build Coastguard Worker */
8937*6777b538SAndroid Build Coastguard Worker if ((cur->ns != NULL) && adoptns && (cur->ns == ns))
8938*6777b538SAndroid Build Coastguard Worker adoptns = 0;
8939*6777b538SAndroid Build Coastguard Worker /*
8940*6777b538SAndroid Build Coastguard Worker * Does it shadow any ns-decl?
8941*6777b538SAndroid Build Coastguard Worker */
8942*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(nsMap)) {
8943*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
8944*6777b538SAndroid Build Coastguard Worker if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
8945*6777b538SAndroid Build Coastguard Worker (mi->shadowDepth == -1) &&
8946*6777b538SAndroid Build Coastguard Worker ((ns->prefix == mi->newNs->prefix) ||
8947*6777b538SAndroid Build Coastguard Worker xmlStrEqual(ns->prefix, mi->newNs->prefix))) {
8948*6777b538SAndroid Build Coastguard Worker
8949*6777b538SAndroid Build Coastguard Worker mi->shadowDepth = depth;
8950*6777b538SAndroid Build Coastguard Worker }
8951*6777b538SAndroid Build Coastguard Worker }
8952*6777b538SAndroid Build Coastguard Worker }
8953*6777b538SAndroid Build Coastguard Worker /*
8954*6777b538SAndroid Build Coastguard Worker * Push mapping.
8955*6777b538SAndroid Build Coastguard Worker */
8956*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNsMapAddItem(&nsMap, -1, ns, ns,
8957*6777b538SAndroid Build Coastguard Worker depth) == NULL)
8958*6777b538SAndroid Build Coastguard Worker goto internal_error;
8959*6777b538SAndroid Build Coastguard Worker
8960*6777b538SAndroid Build Coastguard Worker prevns = ns;
8961*6777b538SAndroid Build Coastguard Worker next_ns_decl:
8962*6777b538SAndroid Build Coastguard Worker ns = ns->next;
8963*6777b538SAndroid Build Coastguard Worker }
8964*6777b538SAndroid Build Coastguard Worker }
8965*6777b538SAndroid Build Coastguard Worker if (! adoptns)
8966*6777b538SAndroid Build Coastguard Worker goto ns_end;
8967*6777b538SAndroid Build Coastguard Worker /* Falls through. */
8968*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
8969*6777b538SAndroid Build Coastguard Worker /* No ns, no fun. */
8970*6777b538SAndroid Build Coastguard Worker if (cur->ns == NULL)
8971*6777b538SAndroid Build Coastguard Worker goto ns_end;
8972*6777b538SAndroid Build Coastguard Worker
8973*6777b538SAndroid Build Coastguard Worker if (! parnsdone) {
8974*6777b538SAndroid Build Coastguard Worker if ((elem->parent) &&
8975*6777b538SAndroid Build Coastguard Worker ((xmlNodePtr) elem->parent->doc != elem->parent)) {
8976*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
8977*6777b538SAndroid Build Coastguard Worker elem->parent) == -1)
8978*6777b538SAndroid Build Coastguard Worker goto internal_error;
8979*6777b538SAndroid Build Coastguard Worker }
8980*6777b538SAndroid Build Coastguard Worker parnsdone = 1;
8981*6777b538SAndroid Build Coastguard Worker }
8982*6777b538SAndroid Build Coastguard Worker /*
8983*6777b538SAndroid Build Coastguard Worker * Adjust the reference if this was a redundant ns-decl.
8984*6777b538SAndroid Build Coastguard Worker */
8985*6777b538SAndroid Build Coastguard Worker if (listRedund) {
8986*6777b538SAndroid Build Coastguard Worker for (i = 0, j = 0; i < nbRedund; i++, j += 2) {
8987*6777b538SAndroid Build Coastguard Worker if (cur->ns == listRedund[j]) {
8988*6777b538SAndroid Build Coastguard Worker cur->ns = listRedund[++j];
8989*6777b538SAndroid Build Coastguard Worker break;
8990*6777b538SAndroid Build Coastguard Worker }
8991*6777b538SAndroid Build Coastguard Worker }
8992*6777b538SAndroid Build Coastguard Worker }
8993*6777b538SAndroid Build Coastguard Worker /*
8994*6777b538SAndroid Build Coastguard Worker * Adopt ns-references.
8995*6777b538SAndroid Build Coastguard Worker */
8996*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(nsMap)) {
8997*6777b538SAndroid Build Coastguard Worker /*
8998*6777b538SAndroid Build Coastguard Worker * Search for a mapping.
8999*6777b538SAndroid Build Coastguard Worker */
9000*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
9001*6777b538SAndroid Build Coastguard Worker if ((mi->shadowDepth == -1) &&
9002*6777b538SAndroid Build Coastguard Worker (cur->ns == mi->oldNs)) {
9003*6777b538SAndroid Build Coastguard Worker
9004*6777b538SAndroid Build Coastguard Worker cur->ns = mi->newNs;
9005*6777b538SAndroid Build Coastguard Worker goto ns_end;
9006*6777b538SAndroid Build Coastguard Worker }
9007*6777b538SAndroid Build Coastguard Worker }
9008*6777b538SAndroid Build Coastguard Worker }
9009*6777b538SAndroid Build Coastguard Worker /*
9010*6777b538SAndroid Build Coastguard Worker * Acquire a normalized ns-decl and add it to the map.
9011*6777b538SAndroid Build Coastguard Worker */
9012*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormAcquireNormalizedNs(doc, curElem,
9013*6777b538SAndroid Build Coastguard Worker cur->ns, &ns,
9014*6777b538SAndroid Build Coastguard Worker &nsMap, depth,
9015*6777b538SAndroid Build Coastguard Worker ancestorsOnly,
9016*6777b538SAndroid Build Coastguard Worker (cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1)
9017*6777b538SAndroid Build Coastguard Worker goto internal_error;
9018*6777b538SAndroid Build Coastguard Worker cur->ns = ns;
9019*6777b538SAndroid Build Coastguard Worker
9020*6777b538SAndroid Build Coastguard Worker ns_end:
9021*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_ELEMENT_NODE) &&
9022*6777b538SAndroid Build Coastguard Worker (cur->properties != NULL)) {
9023*6777b538SAndroid Build Coastguard Worker /*
9024*6777b538SAndroid Build Coastguard Worker * Process attributes.
9025*6777b538SAndroid Build Coastguard Worker */
9026*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) cur->properties;
9027*6777b538SAndroid Build Coastguard Worker continue;
9028*6777b538SAndroid Build Coastguard Worker }
9029*6777b538SAndroid Build Coastguard Worker break;
9030*6777b538SAndroid Build Coastguard Worker default:
9031*6777b538SAndroid Build Coastguard Worker goto next_sibling;
9032*6777b538SAndroid Build Coastguard Worker }
9033*6777b538SAndroid Build Coastguard Worker into_content:
9034*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_ELEMENT_NODE) &&
9035*6777b538SAndroid Build Coastguard Worker (cur->children != NULL)) {
9036*6777b538SAndroid Build Coastguard Worker /*
9037*6777b538SAndroid Build Coastguard Worker * Process content of element-nodes only.
9038*6777b538SAndroid Build Coastguard Worker */
9039*6777b538SAndroid Build Coastguard Worker cur = cur->children;
9040*6777b538SAndroid Build Coastguard Worker continue;
9041*6777b538SAndroid Build Coastguard Worker }
9042*6777b538SAndroid Build Coastguard Worker next_sibling:
9043*6777b538SAndroid Build Coastguard Worker if (cur == elem)
9044*6777b538SAndroid Build Coastguard Worker break;
9045*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ELEMENT_NODE) {
9046*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(nsMap)) {
9047*6777b538SAndroid Build Coastguard Worker /*
9048*6777b538SAndroid Build Coastguard Worker * Pop mappings.
9049*6777b538SAndroid Build Coastguard Worker */
9050*6777b538SAndroid Build Coastguard Worker while ((nsMap->last != NULL) &&
9051*6777b538SAndroid Build Coastguard Worker (nsMap->last->depth >= depth))
9052*6777b538SAndroid Build Coastguard Worker {
9053*6777b538SAndroid Build Coastguard Worker XML_NSMAP_POP(nsMap, mi)
9054*6777b538SAndroid Build Coastguard Worker }
9055*6777b538SAndroid Build Coastguard Worker /*
9056*6777b538SAndroid Build Coastguard Worker * Unshadow.
9057*6777b538SAndroid Build Coastguard Worker */
9058*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
9059*6777b538SAndroid Build Coastguard Worker if (mi->shadowDepth >= depth)
9060*6777b538SAndroid Build Coastguard Worker mi->shadowDepth = -1;
9061*6777b538SAndroid Build Coastguard Worker }
9062*6777b538SAndroid Build Coastguard Worker }
9063*6777b538SAndroid Build Coastguard Worker depth--;
9064*6777b538SAndroid Build Coastguard Worker }
9065*6777b538SAndroid Build Coastguard Worker if (cur->next != NULL)
9066*6777b538SAndroid Build Coastguard Worker cur = cur->next;
9067*6777b538SAndroid Build Coastguard Worker else {
9068*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ATTRIBUTE_NODE) {
9069*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
9070*6777b538SAndroid Build Coastguard Worker goto into_content;
9071*6777b538SAndroid Build Coastguard Worker }
9072*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
9073*6777b538SAndroid Build Coastguard Worker goto next_sibling;
9074*6777b538SAndroid Build Coastguard Worker }
9075*6777b538SAndroid Build Coastguard Worker } while (cur != NULL);
9076*6777b538SAndroid Build Coastguard Worker
9077*6777b538SAndroid Build Coastguard Worker ret = 0;
9078*6777b538SAndroid Build Coastguard Worker goto exit;
9079*6777b538SAndroid Build Coastguard Worker internal_error:
9080*6777b538SAndroid Build Coastguard Worker ret = -1;
9081*6777b538SAndroid Build Coastguard Worker exit:
9082*6777b538SAndroid Build Coastguard Worker if (listRedund) {
9083*6777b538SAndroid Build Coastguard Worker for (i = 0, j = 0; i < nbRedund; i++, j += 2) {
9084*6777b538SAndroid Build Coastguard Worker xmlFreeNs(listRedund[j]);
9085*6777b538SAndroid Build Coastguard Worker }
9086*6777b538SAndroid Build Coastguard Worker xmlFree(listRedund);
9087*6777b538SAndroid Build Coastguard Worker }
9088*6777b538SAndroid Build Coastguard Worker if (nsMap != NULL)
9089*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNsMapFree(nsMap);
9090*6777b538SAndroid Build Coastguard Worker return (ret);
9091*6777b538SAndroid Build Coastguard Worker }
9092*6777b538SAndroid Build Coastguard Worker
9093*6777b538SAndroid Build Coastguard Worker /*
9094*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapAdoptBranch:
9095*6777b538SAndroid Build Coastguard Worker * @ctxt: the optional context for custom processing
9096*6777b538SAndroid Build Coastguard Worker * @sourceDoc: the optional sourceDoc
9097*6777b538SAndroid Build Coastguard Worker * @node: the element-node to start with
9098*6777b538SAndroid Build Coastguard Worker * @destDoc: the destination doc for adoption
9099*6777b538SAndroid Build Coastguard Worker * @destParent: the optional new parent of @node in @destDoc
9100*6777b538SAndroid Build Coastguard Worker * @options: option flags
9101*6777b538SAndroid Build Coastguard Worker *
9102*6777b538SAndroid Build Coastguard Worker * Ensures that ns-references point to @destDoc: either to
9103*6777b538SAndroid Build Coastguard Worker * elements->nsDef entries if @destParent is given, or to
9104*6777b538SAndroid Build Coastguard Worker * @destDoc->oldNs otherwise.
9105*6777b538SAndroid Build Coastguard Worker * If @destParent is given, it ensures that the tree is namespace
9106*6777b538SAndroid Build Coastguard Worker * wellformed by creating additional ns-decls where needed.
9107*6777b538SAndroid Build Coastguard Worker * Note that, since prefixes of already existent ns-decls can be
9108*6777b538SAndroid Build Coastguard Worker * shadowed by this process, it could break QNames in attribute
9109*6777b538SAndroid Build Coastguard Worker * values or element content.
9110*6777b538SAndroid Build Coastguard Worker *
9111*6777b538SAndroid Build Coastguard Worker * NOTE: This function was not intensively tested.
9112*6777b538SAndroid Build Coastguard Worker *
9113*6777b538SAndroid Build Coastguard Worker * Returns 0 if succeeded, -1 otherwise and on API/internal errors.
9114*6777b538SAndroid Build Coastguard Worker */
9115*6777b538SAndroid Build Coastguard Worker static int
xmlDOMWrapAdoptBranch(xmlDOMWrapCtxtPtr ctxt,xmlDocPtr sourceDoc,xmlNodePtr node,xmlDocPtr destDoc,xmlNodePtr destParent,int options ATTRIBUTE_UNUSED)9116*6777b538SAndroid Build Coastguard Worker xmlDOMWrapAdoptBranch(xmlDOMWrapCtxtPtr ctxt,
9117*6777b538SAndroid Build Coastguard Worker xmlDocPtr sourceDoc,
9118*6777b538SAndroid Build Coastguard Worker xmlNodePtr node,
9119*6777b538SAndroid Build Coastguard Worker xmlDocPtr destDoc,
9120*6777b538SAndroid Build Coastguard Worker xmlNodePtr destParent,
9121*6777b538SAndroid Build Coastguard Worker int options ATTRIBUTE_UNUSED)
9122*6777b538SAndroid Build Coastguard Worker {
9123*6777b538SAndroid Build Coastguard Worker int ret = 0;
9124*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur, curElem = NULL;
9125*6777b538SAndroid Build Coastguard Worker xmlNsMapPtr nsMap = NULL;
9126*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr mi;
9127*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns = NULL;
9128*6777b538SAndroid Build Coastguard Worker int depth = -1, adoptStr = 1;
9129*6777b538SAndroid Build Coastguard Worker /* gather @parent's ns-decls. */
9130*6777b538SAndroid Build Coastguard Worker int parnsdone;
9131*6777b538SAndroid Build Coastguard Worker /* @ancestorsOnly should be set per option. */
9132*6777b538SAndroid Build Coastguard Worker int ancestorsOnly = 0;
9133*6777b538SAndroid Build Coastguard Worker
9134*6777b538SAndroid Build Coastguard Worker /*
9135*6777b538SAndroid Build Coastguard Worker * Optimize string adoption for equal or none dicts.
9136*6777b538SAndroid Build Coastguard Worker */
9137*6777b538SAndroid Build Coastguard Worker if ((sourceDoc != NULL) &&
9138*6777b538SAndroid Build Coastguard Worker (sourceDoc->dict == destDoc->dict))
9139*6777b538SAndroid Build Coastguard Worker adoptStr = 0;
9140*6777b538SAndroid Build Coastguard Worker else
9141*6777b538SAndroid Build Coastguard Worker adoptStr = 1;
9142*6777b538SAndroid Build Coastguard Worker
9143*6777b538SAndroid Build Coastguard Worker /*
9144*6777b538SAndroid Build Coastguard Worker * Get the ns-map from the context if available.
9145*6777b538SAndroid Build Coastguard Worker */
9146*6777b538SAndroid Build Coastguard Worker if (ctxt)
9147*6777b538SAndroid Build Coastguard Worker nsMap = (xmlNsMapPtr) ctxt->namespaceMap;
9148*6777b538SAndroid Build Coastguard Worker /*
9149*6777b538SAndroid Build Coastguard Worker * Disable search for ns-decls in the parent-axis of the
9150*6777b538SAndroid Build Coastguard Worker * destination element, if:
9151*6777b538SAndroid Build Coastguard Worker * 1) there's no destination parent
9152*6777b538SAndroid Build Coastguard Worker * 2) custom ns-reference handling is used
9153*6777b538SAndroid Build Coastguard Worker */
9154*6777b538SAndroid Build Coastguard Worker if ((destParent == NULL) ||
9155*6777b538SAndroid Build Coastguard Worker (ctxt && ctxt->getNsForNodeFunc))
9156*6777b538SAndroid Build Coastguard Worker {
9157*6777b538SAndroid Build Coastguard Worker parnsdone = 1;
9158*6777b538SAndroid Build Coastguard Worker } else
9159*6777b538SAndroid Build Coastguard Worker parnsdone = 0;
9160*6777b538SAndroid Build Coastguard Worker
9161*6777b538SAndroid Build Coastguard Worker cur = node;
9162*6777b538SAndroid Build Coastguard Worker if ((cur != NULL) && (cur->type == XML_NAMESPACE_DECL))
9163*6777b538SAndroid Build Coastguard Worker goto internal_error;
9164*6777b538SAndroid Build Coastguard Worker
9165*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
9166*6777b538SAndroid Build Coastguard Worker /*
9167*6777b538SAndroid Build Coastguard Worker * Paranoid source-doc sanity check.
9168*6777b538SAndroid Build Coastguard Worker */
9169*6777b538SAndroid Build Coastguard Worker if (cur->doc != sourceDoc) {
9170*6777b538SAndroid Build Coastguard Worker /*
9171*6777b538SAndroid Build Coastguard Worker * We'll assume XIncluded nodes if the doc differs.
9172*6777b538SAndroid Build Coastguard Worker * TODO: Do we need to reconciliate XIncluded nodes?
9173*6777b538SAndroid Build Coastguard Worker * This here skips XIncluded nodes and tries to handle
9174*6777b538SAndroid Build Coastguard Worker * broken sequences.
9175*6777b538SAndroid Build Coastguard Worker */
9176*6777b538SAndroid Build Coastguard Worker if (cur->next == NULL)
9177*6777b538SAndroid Build Coastguard Worker goto leave_node;
9178*6777b538SAndroid Build Coastguard Worker do {
9179*6777b538SAndroid Build Coastguard Worker cur = cur->next;
9180*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_XINCLUDE_END) ||
9181*6777b538SAndroid Build Coastguard Worker (cur->doc == node->doc))
9182*6777b538SAndroid Build Coastguard Worker break;
9183*6777b538SAndroid Build Coastguard Worker } while (cur->next != NULL);
9184*6777b538SAndroid Build Coastguard Worker
9185*6777b538SAndroid Build Coastguard Worker if (cur->doc != node->doc)
9186*6777b538SAndroid Build Coastguard Worker goto leave_node;
9187*6777b538SAndroid Build Coastguard Worker }
9188*6777b538SAndroid Build Coastguard Worker cur->doc = destDoc;
9189*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
9190*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
9191*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
9192*6777b538SAndroid Build Coastguard Worker /*
9193*6777b538SAndroid Build Coastguard Worker * TODO
9194*6777b538SAndroid Build Coastguard Worker */
9195*6777b538SAndroid Build Coastguard Worker return (-1);
9196*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
9197*6777b538SAndroid Build Coastguard Worker curElem = cur;
9198*6777b538SAndroid Build Coastguard Worker depth++;
9199*6777b538SAndroid Build Coastguard Worker /*
9200*6777b538SAndroid Build Coastguard Worker * Namespace declarations.
9201*6777b538SAndroid Build Coastguard Worker * - ns->href and ns->prefix are never in the dict, so
9202*6777b538SAndroid Build Coastguard Worker * we need not move the values over to the destination dict.
9203*6777b538SAndroid Build Coastguard Worker * - Note that for custom handling of ns-references,
9204*6777b538SAndroid Build Coastguard Worker * the ns-decls need not be stored in the ns-map,
9205*6777b538SAndroid Build Coastguard Worker * since they won't be referenced by node->ns.
9206*6777b538SAndroid Build Coastguard Worker */
9207*6777b538SAndroid Build Coastguard Worker if ((cur->nsDef) &&
9208*6777b538SAndroid Build Coastguard Worker ((ctxt == NULL) || (ctxt->getNsForNodeFunc == NULL)))
9209*6777b538SAndroid Build Coastguard Worker {
9210*6777b538SAndroid Build Coastguard Worker if (! parnsdone) {
9211*6777b538SAndroid Build Coastguard Worker /*
9212*6777b538SAndroid Build Coastguard Worker * Gather @parent's in-scope ns-decls.
9213*6777b538SAndroid Build Coastguard Worker */
9214*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
9215*6777b538SAndroid Build Coastguard Worker destParent) == -1)
9216*6777b538SAndroid Build Coastguard Worker goto internal_error;
9217*6777b538SAndroid Build Coastguard Worker parnsdone = 1;
9218*6777b538SAndroid Build Coastguard Worker }
9219*6777b538SAndroid Build Coastguard Worker for (ns = cur->nsDef; ns != NULL; ns = ns->next) {
9220*6777b538SAndroid Build Coastguard Worker /*
9221*6777b538SAndroid Build Coastguard Worker * NOTE: ns->prefix and ns->href are never in the dict.
9222*6777b538SAndroid Build Coastguard Worker * XML_TREE_ADOPT_STR(ns->prefix)
9223*6777b538SAndroid Build Coastguard Worker * XML_TREE_ADOPT_STR(ns->href)
9224*6777b538SAndroid Build Coastguard Worker */
9225*6777b538SAndroid Build Coastguard Worker /*
9226*6777b538SAndroid Build Coastguard Worker * Does it shadow any ns-decl?
9227*6777b538SAndroid Build Coastguard Worker */
9228*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(nsMap)) {
9229*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
9230*6777b538SAndroid Build Coastguard Worker if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
9231*6777b538SAndroid Build Coastguard Worker (mi->shadowDepth == -1) &&
9232*6777b538SAndroid Build Coastguard Worker ((ns->prefix == mi->newNs->prefix) ||
9233*6777b538SAndroid Build Coastguard Worker xmlStrEqual(ns->prefix,
9234*6777b538SAndroid Build Coastguard Worker mi->newNs->prefix))) {
9235*6777b538SAndroid Build Coastguard Worker
9236*6777b538SAndroid Build Coastguard Worker mi->shadowDepth = depth;
9237*6777b538SAndroid Build Coastguard Worker }
9238*6777b538SAndroid Build Coastguard Worker }
9239*6777b538SAndroid Build Coastguard Worker }
9240*6777b538SAndroid Build Coastguard Worker /*
9241*6777b538SAndroid Build Coastguard Worker * Push mapping.
9242*6777b538SAndroid Build Coastguard Worker */
9243*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNsMapAddItem(&nsMap, -1,
9244*6777b538SAndroid Build Coastguard Worker ns, ns, depth) == NULL)
9245*6777b538SAndroid Build Coastguard Worker goto internal_error;
9246*6777b538SAndroid Build Coastguard Worker }
9247*6777b538SAndroid Build Coastguard Worker }
9248*6777b538SAndroid Build Coastguard Worker /* Falls through. */
9249*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
9250*6777b538SAndroid Build Coastguard Worker /* No namespace, no fun. */
9251*6777b538SAndroid Build Coastguard Worker if (cur->ns == NULL)
9252*6777b538SAndroid Build Coastguard Worker goto ns_end;
9253*6777b538SAndroid Build Coastguard Worker
9254*6777b538SAndroid Build Coastguard Worker if (! parnsdone) {
9255*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
9256*6777b538SAndroid Build Coastguard Worker destParent) == -1)
9257*6777b538SAndroid Build Coastguard Worker goto internal_error;
9258*6777b538SAndroid Build Coastguard Worker parnsdone = 1;
9259*6777b538SAndroid Build Coastguard Worker }
9260*6777b538SAndroid Build Coastguard Worker /*
9261*6777b538SAndroid Build Coastguard Worker * Adopt ns-references.
9262*6777b538SAndroid Build Coastguard Worker */
9263*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(nsMap)) {
9264*6777b538SAndroid Build Coastguard Worker /*
9265*6777b538SAndroid Build Coastguard Worker * Search for a mapping.
9266*6777b538SAndroid Build Coastguard Worker */
9267*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
9268*6777b538SAndroid Build Coastguard Worker if ((mi->shadowDepth == -1) &&
9269*6777b538SAndroid Build Coastguard Worker (cur->ns == mi->oldNs)) {
9270*6777b538SAndroid Build Coastguard Worker
9271*6777b538SAndroid Build Coastguard Worker cur->ns = mi->newNs;
9272*6777b538SAndroid Build Coastguard Worker goto ns_end;
9273*6777b538SAndroid Build Coastguard Worker }
9274*6777b538SAndroid Build Coastguard Worker }
9275*6777b538SAndroid Build Coastguard Worker }
9276*6777b538SAndroid Build Coastguard Worker /*
9277*6777b538SAndroid Build Coastguard Worker * No matching namespace in scope. We need a new one.
9278*6777b538SAndroid Build Coastguard Worker */
9279*6777b538SAndroid Build Coastguard Worker if ((ctxt) && (ctxt->getNsForNodeFunc)) {
9280*6777b538SAndroid Build Coastguard Worker /*
9281*6777b538SAndroid Build Coastguard Worker * User-defined behaviour.
9282*6777b538SAndroid Build Coastguard Worker */
9283*6777b538SAndroid Build Coastguard Worker ns = ctxt->getNsForNodeFunc(ctxt, cur,
9284*6777b538SAndroid Build Coastguard Worker cur->ns->href, cur->ns->prefix);
9285*6777b538SAndroid Build Coastguard Worker /*
9286*6777b538SAndroid Build Coastguard Worker * Insert mapping if ns is available; it's the users fault
9287*6777b538SAndroid Build Coastguard Worker * if not.
9288*6777b538SAndroid Build Coastguard Worker */
9289*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNsMapAddItem(&nsMap, -1,
9290*6777b538SAndroid Build Coastguard Worker cur->ns, ns, XML_TREE_NSMAP_CUSTOM) == NULL)
9291*6777b538SAndroid Build Coastguard Worker goto internal_error;
9292*6777b538SAndroid Build Coastguard Worker cur->ns = ns;
9293*6777b538SAndroid Build Coastguard Worker } else {
9294*6777b538SAndroid Build Coastguard Worker /*
9295*6777b538SAndroid Build Coastguard Worker * Acquire a normalized ns-decl and add it to the map.
9296*6777b538SAndroid Build Coastguard Worker */
9297*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormAcquireNormalizedNs(destDoc,
9298*6777b538SAndroid Build Coastguard Worker /* ns-decls on curElem or on destDoc->oldNs */
9299*6777b538SAndroid Build Coastguard Worker destParent ? curElem : NULL,
9300*6777b538SAndroid Build Coastguard Worker cur->ns, &ns,
9301*6777b538SAndroid Build Coastguard Worker &nsMap, depth,
9302*6777b538SAndroid Build Coastguard Worker ancestorsOnly,
9303*6777b538SAndroid Build Coastguard Worker /* ns-decls must be prefixed for attributes. */
9304*6777b538SAndroid Build Coastguard Worker (cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1)
9305*6777b538SAndroid Build Coastguard Worker goto internal_error;
9306*6777b538SAndroid Build Coastguard Worker cur->ns = ns;
9307*6777b538SAndroid Build Coastguard Worker }
9308*6777b538SAndroid Build Coastguard Worker ns_end:
9309*6777b538SAndroid Build Coastguard Worker /*
9310*6777b538SAndroid Build Coastguard Worker * Further node properties.
9311*6777b538SAndroid Build Coastguard Worker * TODO: Is this all?
9312*6777b538SAndroid Build Coastguard Worker */
9313*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR(cur->name)
9314*6777b538SAndroid Build Coastguard Worker if (cur->type == XML_ELEMENT_NODE) {
9315*6777b538SAndroid Build Coastguard Worker cur->psvi = NULL;
9316*6777b538SAndroid Build Coastguard Worker cur->line = 0;
9317*6777b538SAndroid Build Coastguard Worker cur->extra = 0;
9318*6777b538SAndroid Build Coastguard Worker /*
9319*6777b538SAndroid Build Coastguard Worker * Walk attributes.
9320*6777b538SAndroid Build Coastguard Worker */
9321*6777b538SAndroid Build Coastguard Worker if (cur->properties != NULL) {
9322*6777b538SAndroid Build Coastguard Worker /*
9323*6777b538SAndroid Build Coastguard Worker * Process first attribute node.
9324*6777b538SAndroid Build Coastguard Worker */
9325*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) cur->properties;
9326*6777b538SAndroid Build Coastguard Worker continue;
9327*6777b538SAndroid Build Coastguard Worker }
9328*6777b538SAndroid Build Coastguard Worker } else {
9329*6777b538SAndroid Build Coastguard Worker /*
9330*6777b538SAndroid Build Coastguard Worker * Attributes.
9331*6777b538SAndroid Build Coastguard Worker */
9332*6777b538SAndroid Build Coastguard Worker if ((sourceDoc != NULL) &&
9333*6777b538SAndroid Build Coastguard Worker (((xmlAttrPtr) cur)->atype == XML_ATTRIBUTE_ID))
9334*6777b538SAndroid Build Coastguard Worker {
9335*6777b538SAndroid Build Coastguard Worker xmlRemoveID(sourceDoc, (xmlAttrPtr) cur);
9336*6777b538SAndroid Build Coastguard Worker }
9337*6777b538SAndroid Build Coastguard Worker ((xmlAttrPtr) cur)->atype = 0;
9338*6777b538SAndroid Build Coastguard Worker ((xmlAttrPtr) cur)->psvi = NULL;
9339*6777b538SAndroid Build Coastguard Worker }
9340*6777b538SAndroid Build Coastguard Worker break;
9341*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
9342*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
9343*6777b538SAndroid Build Coastguard Worker /*
9344*6777b538SAndroid Build Coastguard Worker * This puts the content in the dest dict, only if
9345*6777b538SAndroid Build Coastguard Worker * it was previously in the source dict.
9346*6777b538SAndroid Build Coastguard Worker */
9347*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR_2(cur->content)
9348*6777b538SAndroid Build Coastguard Worker goto leave_node;
9349*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
9350*6777b538SAndroid Build Coastguard Worker /*
9351*6777b538SAndroid Build Coastguard Worker * Remove reference to the entity-node.
9352*6777b538SAndroid Build Coastguard Worker */
9353*6777b538SAndroid Build Coastguard Worker cur->content = NULL;
9354*6777b538SAndroid Build Coastguard Worker cur->children = NULL;
9355*6777b538SAndroid Build Coastguard Worker cur->last = NULL;
9356*6777b538SAndroid Build Coastguard Worker if ((destDoc->intSubset) || (destDoc->extSubset)) {
9357*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
9358*6777b538SAndroid Build Coastguard Worker /*
9359*6777b538SAndroid Build Coastguard Worker * Assign new entity-node if available.
9360*6777b538SAndroid Build Coastguard Worker */
9361*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(destDoc, cur->name);
9362*6777b538SAndroid Build Coastguard Worker if (ent != NULL) {
9363*6777b538SAndroid Build Coastguard Worker cur->content = ent->content;
9364*6777b538SAndroid Build Coastguard Worker cur->children = (xmlNodePtr) ent;
9365*6777b538SAndroid Build Coastguard Worker cur->last = (xmlNodePtr) ent;
9366*6777b538SAndroid Build Coastguard Worker }
9367*6777b538SAndroid Build Coastguard Worker }
9368*6777b538SAndroid Build Coastguard Worker goto leave_node;
9369*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
9370*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR(cur->name)
9371*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR_2(cur->content)
9372*6777b538SAndroid Build Coastguard Worker break;
9373*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
9374*6777b538SAndroid Build Coastguard Worker break;
9375*6777b538SAndroid Build Coastguard Worker default:
9376*6777b538SAndroid Build Coastguard Worker goto internal_error;
9377*6777b538SAndroid Build Coastguard Worker }
9378*6777b538SAndroid Build Coastguard Worker /*
9379*6777b538SAndroid Build Coastguard Worker * Walk the tree.
9380*6777b538SAndroid Build Coastguard Worker */
9381*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL) {
9382*6777b538SAndroid Build Coastguard Worker cur = cur->children;
9383*6777b538SAndroid Build Coastguard Worker continue;
9384*6777b538SAndroid Build Coastguard Worker }
9385*6777b538SAndroid Build Coastguard Worker
9386*6777b538SAndroid Build Coastguard Worker leave_node:
9387*6777b538SAndroid Build Coastguard Worker if (cur == node)
9388*6777b538SAndroid Build Coastguard Worker break;
9389*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_ELEMENT_NODE) ||
9390*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_START) ||
9391*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_END))
9392*6777b538SAndroid Build Coastguard Worker {
9393*6777b538SAndroid Build Coastguard Worker /*
9394*6777b538SAndroid Build Coastguard Worker * TODO: Do we expect nsDefs on XML_XINCLUDE_START?
9395*6777b538SAndroid Build Coastguard Worker */
9396*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(nsMap)) {
9397*6777b538SAndroid Build Coastguard Worker /*
9398*6777b538SAndroid Build Coastguard Worker * Pop mappings.
9399*6777b538SAndroid Build Coastguard Worker */
9400*6777b538SAndroid Build Coastguard Worker while ((nsMap->last != NULL) &&
9401*6777b538SAndroid Build Coastguard Worker (nsMap->last->depth >= depth))
9402*6777b538SAndroid Build Coastguard Worker {
9403*6777b538SAndroid Build Coastguard Worker XML_NSMAP_POP(nsMap, mi)
9404*6777b538SAndroid Build Coastguard Worker }
9405*6777b538SAndroid Build Coastguard Worker /*
9406*6777b538SAndroid Build Coastguard Worker * Unshadow.
9407*6777b538SAndroid Build Coastguard Worker */
9408*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
9409*6777b538SAndroid Build Coastguard Worker if (mi->shadowDepth >= depth)
9410*6777b538SAndroid Build Coastguard Worker mi->shadowDepth = -1;
9411*6777b538SAndroid Build Coastguard Worker }
9412*6777b538SAndroid Build Coastguard Worker }
9413*6777b538SAndroid Build Coastguard Worker depth--;
9414*6777b538SAndroid Build Coastguard Worker }
9415*6777b538SAndroid Build Coastguard Worker if (cur->next != NULL)
9416*6777b538SAndroid Build Coastguard Worker cur = cur->next;
9417*6777b538SAndroid Build Coastguard Worker else if ((cur->type == XML_ATTRIBUTE_NODE) &&
9418*6777b538SAndroid Build Coastguard Worker (cur->parent->children != NULL))
9419*6777b538SAndroid Build Coastguard Worker {
9420*6777b538SAndroid Build Coastguard Worker cur = cur->parent->children;
9421*6777b538SAndroid Build Coastguard Worker } else {
9422*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
9423*6777b538SAndroid Build Coastguard Worker goto leave_node;
9424*6777b538SAndroid Build Coastguard Worker }
9425*6777b538SAndroid Build Coastguard Worker }
9426*6777b538SAndroid Build Coastguard Worker
9427*6777b538SAndroid Build Coastguard Worker goto exit;
9428*6777b538SAndroid Build Coastguard Worker
9429*6777b538SAndroid Build Coastguard Worker internal_error:
9430*6777b538SAndroid Build Coastguard Worker ret = -1;
9431*6777b538SAndroid Build Coastguard Worker
9432*6777b538SAndroid Build Coastguard Worker exit:
9433*6777b538SAndroid Build Coastguard Worker /*
9434*6777b538SAndroid Build Coastguard Worker * Cleanup.
9435*6777b538SAndroid Build Coastguard Worker */
9436*6777b538SAndroid Build Coastguard Worker if (nsMap != NULL) {
9437*6777b538SAndroid Build Coastguard Worker if ((ctxt) && (ctxt->namespaceMap == nsMap)) {
9438*6777b538SAndroid Build Coastguard Worker /*
9439*6777b538SAndroid Build Coastguard Worker * Just cleanup the map but don't free.
9440*6777b538SAndroid Build Coastguard Worker */
9441*6777b538SAndroid Build Coastguard Worker if (nsMap->first) {
9442*6777b538SAndroid Build Coastguard Worker if (nsMap->pool)
9443*6777b538SAndroid Build Coastguard Worker nsMap->last->next = nsMap->pool;
9444*6777b538SAndroid Build Coastguard Worker nsMap->pool = nsMap->first;
9445*6777b538SAndroid Build Coastguard Worker nsMap->first = NULL;
9446*6777b538SAndroid Build Coastguard Worker }
9447*6777b538SAndroid Build Coastguard Worker } else
9448*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNsMapFree(nsMap);
9449*6777b538SAndroid Build Coastguard Worker }
9450*6777b538SAndroid Build Coastguard Worker return(ret);
9451*6777b538SAndroid Build Coastguard Worker }
9452*6777b538SAndroid Build Coastguard Worker
9453*6777b538SAndroid Build Coastguard Worker /*
9454*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapCloneNode:
9455*6777b538SAndroid Build Coastguard Worker * @ctxt: the optional context for custom processing
9456*6777b538SAndroid Build Coastguard Worker * @sourceDoc: the optional sourceDoc
9457*6777b538SAndroid Build Coastguard Worker * @node: the node to start with
9458*6777b538SAndroid Build Coastguard Worker * @resNode: the clone of the given @node
9459*6777b538SAndroid Build Coastguard Worker * @destDoc: the destination doc
9460*6777b538SAndroid Build Coastguard Worker * @destParent: the optional new parent of @node in @destDoc
9461*6777b538SAndroid Build Coastguard Worker * @deep: descend into child if set
9462*6777b538SAndroid Build Coastguard Worker * @options: option flags
9463*6777b538SAndroid Build Coastguard Worker *
9464*6777b538SAndroid Build Coastguard Worker * References of out-of scope ns-decls are remapped to point to @destDoc:
9465*6777b538SAndroid Build Coastguard Worker * 1) If @destParent is given, then nsDef entries on element-nodes are used
9466*6777b538SAndroid Build Coastguard Worker * 2) If *no* @destParent is given, then @destDoc->oldNs entries are used.
9467*6777b538SAndroid Build Coastguard Worker * This is the case when you don't know already where the cloned branch
9468*6777b538SAndroid Build Coastguard Worker * will be added to.
9469*6777b538SAndroid Build Coastguard Worker *
9470*6777b538SAndroid Build Coastguard Worker * If @destParent is given, it ensures that the tree is namespace
9471*6777b538SAndroid Build Coastguard Worker * wellformed by creating additional ns-decls where needed.
9472*6777b538SAndroid Build Coastguard Worker * Note that, since prefixes of already existent ns-decls can be
9473*6777b538SAndroid Build Coastguard Worker * shadowed by this process, it could break QNames in attribute
9474*6777b538SAndroid Build Coastguard Worker * values or element content.
9475*6777b538SAndroid Build Coastguard Worker * TODO:
9476*6777b538SAndroid Build Coastguard Worker * 1) What to do with XInclude? Currently this returns an error for XInclude.
9477*6777b538SAndroid Build Coastguard Worker *
9478*6777b538SAndroid Build Coastguard Worker * Returns 0 if the operation succeeded,
9479*6777b538SAndroid Build Coastguard Worker * 1 if a node of unsupported (or not yet supported) type was given,
9480*6777b538SAndroid Build Coastguard Worker * -1 on API/internal errors.
9481*6777b538SAndroid Build Coastguard Worker */
9482*6777b538SAndroid Build Coastguard Worker
9483*6777b538SAndroid Build Coastguard Worker int
xmlDOMWrapCloneNode(xmlDOMWrapCtxtPtr ctxt,xmlDocPtr sourceDoc,xmlNodePtr node,xmlNodePtr * resNode,xmlDocPtr destDoc,xmlNodePtr destParent,int deep,int options ATTRIBUTE_UNUSED)9484*6777b538SAndroid Build Coastguard Worker xmlDOMWrapCloneNode(xmlDOMWrapCtxtPtr ctxt,
9485*6777b538SAndroid Build Coastguard Worker xmlDocPtr sourceDoc,
9486*6777b538SAndroid Build Coastguard Worker xmlNodePtr node,
9487*6777b538SAndroid Build Coastguard Worker xmlNodePtr *resNode,
9488*6777b538SAndroid Build Coastguard Worker xmlDocPtr destDoc,
9489*6777b538SAndroid Build Coastguard Worker xmlNodePtr destParent,
9490*6777b538SAndroid Build Coastguard Worker int deep,
9491*6777b538SAndroid Build Coastguard Worker int options ATTRIBUTE_UNUSED)
9492*6777b538SAndroid Build Coastguard Worker {
9493*6777b538SAndroid Build Coastguard Worker int ret = 0;
9494*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur, curElem = NULL;
9495*6777b538SAndroid Build Coastguard Worker xmlNsMapPtr nsMap = NULL;
9496*6777b538SAndroid Build Coastguard Worker xmlNsMapItemPtr mi;
9497*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns;
9498*6777b538SAndroid Build Coastguard Worker int depth = -1;
9499*6777b538SAndroid Build Coastguard Worker /* int adoptStr = 1; */
9500*6777b538SAndroid Build Coastguard Worker /* gather @parent's ns-decls. */
9501*6777b538SAndroid Build Coastguard Worker int parnsdone = 0;
9502*6777b538SAndroid Build Coastguard Worker /*
9503*6777b538SAndroid Build Coastguard Worker * @ancestorsOnly:
9504*6777b538SAndroid Build Coastguard Worker * TODO: @ancestorsOnly should be set per option.
9505*6777b538SAndroid Build Coastguard Worker *
9506*6777b538SAndroid Build Coastguard Worker */
9507*6777b538SAndroid Build Coastguard Worker int ancestorsOnly = 0;
9508*6777b538SAndroid Build Coastguard Worker xmlNodePtr resultClone = NULL, clone = NULL, parentClone = NULL, prevClone = NULL;
9509*6777b538SAndroid Build Coastguard Worker xmlNsPtr cloneNs = NULL, *cloneNsDefSlot = NULL;
9510*6777b538SAndroid Build Coastguard Worker xmlDictPtr dict; /* The destination dict */
9511*6777b538SAndroid Build Coastguard Worker
9512*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (resNode == NULL) || (destDoc == NULL))
9513*6777b538SAndroid Build Coastguard Worker return(-1);
9514*6777b538SAndroid Build Coastguard Worker /*
9515*6777b538SAndroid Build Coastguard Worker * TODO: Initially we support only element-nodes.
9516*6777b538SAndroid Build Coastguard Worker */
9517*6777b538SAndroid Build Coastguard Worker if (node->type != XML_ELEMENT_NODE)
9518*6777b538SAndroid Build Coastguard Worker return(1);
9519*6777b538SAndroid Build Coastguard Worker /*
9520*6777b538SAndroid Build Coastguard Worker * Check node->doc sanity.
9521*6777b538SAndroid Build Coastguard Worker */
9522*6777b538SAndroid Build Coastguard Worker if ((node->doc != NULL) && (sourceDoc != NULL) &&
9523*6777b538SAndroid Build Coastguard Worker (node->doc != sourceDoc)) {
9524*6777b538SAndroid Build Coastguard Worker /*
9525*6777b538SAndroid Build Coastguard Worker * Might be an XIncluded node.
9526*6777b538SAndroid Build Coastguard Worker */
9527*6777b538SAndroid Build Coastguard Worker return (-1);
9528*6777b538SAndroid Build Coastguard Worker }
9529*6777b538SAndroid Build Coastguard Worker if (sourceDoc == NULL)
9530*6777b538SAndroid Build Coastguard Worker sourceDoc = node->doc;
9531*6777b538SAndroid Build Coastguard Worker if (sourceDoc == NULL)
9532*6777b538SAndroid Build Coastguard Worker return (-1);
9533*6777b538SAndroid Build Coastguard Worker
9534*6777b538SAndroid Build Coastguard Worker dict = destDoc->dict;
9535*6777b538SAndroid Build Coastguard Worker /*
9536*6777b538SAndroid Build Coastguard Worker * Reuse the namespace map of the context.
9537*6777b538SAndroid Build Coastguard Worker */
9538*6777b538SAndroid Build Coastguard Worker if (ctxt)
9539*6777b538SAndroid Build Coastguard Worker nsMap = (xmlNsMapPtr) ctxt->namespaceMap;
9540*6777b538SAndroid Build Coastguard Worker
9541*6777b538SAndroid Build Coastguard Worker *resNode = NULL;
9542*6777b538SAndroid Build Coastguard Worker
9543*6777b538SAndroid Build Coastguard Worker cur = node;
9544*6777b538SAndroid Build Coastguard Worker if ((cur != NULL) && (cur->type == XML_NAMESPACE_DECL))
9545*6777b538SAndroid Build Coastguard Worker return(-1);
9546*6777b538SAndroid Build Coastguard Worker
9547*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
9548*6777b538SAndroid Build Coastguard Worker if (cur->doc != sourceDoc) {
9549*6777b538SAndroid Build Coastguard Worker /*
9550*6777b538SAndroid Build Coastguard Worker * We'll assume XIncluded nodes if the doc differs.
9551*6777b538SAndroid Build Coastguard Worker * TODO: Do we need to reconciliate XIncluded nodes?
9552*6777b538SAndroid Build Coastguard Worker * TODO: This here returns -1 in this case.
9553*6777b538SAndroid Build Coastguard Worker */
9554*6777b538SAndroid Build Coastguard Worker goto internal_error;
9555*6777b538SAndroid Build Coastguard Worker }
9556*6777b538SAndroid Build Coastguard Worker /*
9557*6777b538SAndroid Build Coastguard Worker * Create a new node.
9558*6777b538SAndroid Build Coastguard Worker */
9559*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
9560*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
9561*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
9562*6777b538SAndroid Build Coastguard Worker /*
9563*6777b538SAndroid Build Coastguard Worker * TODO: What to do with XInclude?
9564*6777b538SAndroid Build Coastguard Worker */
9565*6777b538SAndroid Build Coastguard Worker goto internal_error;
9566*6777b538SAndroid Build Coastguard Worker break;
9567*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
9568*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
9569*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
9570*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
9571*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
9572*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
9573*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
9574*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
9575*6777b538SAndroid Build Coastguard Worker /*
9576*6777b538SAndroid Build Coastguard Worker * Nodes of xmlNode structure.
9577*6777b538SAndroid Build Coastguard Worker */
9578*6777b538SAndroid Build Coastguard Worker clone = (xmlNodePtr) xmlMalloc(sizeof(xmlNode));
9579*6777b538SAndroid Build Coastguard Worker if (clone == NULL)
9580*6777b538SAndroid Build Coastguard Worker goto internal_error;
9581*6777b538SAndroid Build Coastguard Worker memset(clone, 0, sizeof(xmlNode));
9582*6777b538SAndroid Build Coastguard Worker /*
9583*6777b538SAndroid Build Coastguard Worker * Set hierarchical links.
9584*6777b538SAndroid Build Coastguard Worker */
9585*6777b538SAndroid Build Coastguard Worker if (resultClone != NULL) {
9586*6777b538SAndroid Build Coastguard Worker clone->parent = parentClone;
9587*6777b538SAndroid Build Coastguard Worker if (prevClone) {
9588*6777b538SAndroid Build Coastguard Worker prevClone->next = clone;
9589*6777b538SAndroid Build Coastguard Worker clone->prev = prevClone;
9590*6777b538SAndroid Build Coastguard Worker } else
9591*6777b538SAndroid Build Coastguard Worker parentClone->children = clone;
9592*6777b538SAndroid Build Coastguard Worker } else
9593*6777b538SAndroid Build Coastguard Worker resultClone = clone;
9594*6777b538SAndroid Build Coastguard Worker
9595*6777b538SAndroid Build Coastguard Worker break;
9596*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
9597*6777b538SAndroid Build Coastguard Worker /*
9598*6777b538SAndroid Build Coastguard Worker * Attributes (xmlAttr).
9599*6777b538SAndroid Build Coastguard Worker */
9600*6777b538SAndroid Build Coastguard Worker /* Use xmlRealloc to avoid -Warray-bounds warning */
9601*6777b538SAndroid Build Coastguard Worker clone = (xmlNodePtr) xmlRealloc(NULL, sizeof(xmlAttr));
9602*6777b538SAndroid Build Coastguard Worker if (clone == NULL)
9603*6777b538SAndroid Build Coastguard Worker goto internal_error;
9604*6777b538SAndroid Build Coastguard Worker memset(clone, 0, sizeof(xmlAttr));
9605*6777b538SAndroid Build Coastguard Worker /*
9606*6777b538SAndroid Build Coastguard Worker * Set hierarchical links.
9607*6777b538SAndroid Build Coastguard Worker * TODO: Change this to add to the end of attributes.
9608*6777b538SAndroid Build Coastguard Worker */
9609*6777b538SAndroid Build Coastguard Worker if (resultClone != NULL) {
9610*6777b538SAndroid Build Coastguard Worker clone->parent = parentClone;
9611*6777b538SAndroid Build Coastguard Worker if (prevClone) {
9612*6777b538SAndroid Build Coastguard Worker prevClone->next = clone;
9613*6777b538SAndroid Build Coastguard Worker clone->prev = prevClone;
9614*6777b538SAndroid Build Coastguard Worker } else
9615*6777b538SAndroid Build Coastguard Worker parentClone->properties = (xmlAttrPtr) clone;
9616*6777b538SAndroid Build Coastguard Worker } else
9617*6777b538SAndroid Build Coastguard Worker resultClone = clone;
9618*6777b538SAndroid Build Coastguard Worker break;
9619*6777b538SAndroid Build Coastguard Worker default:
9620*6777b538SAndroid Build Coastguard Worker /*
9621*6777b538SAndroid Build Coastguard Worker * TODO QUESTION: Any other nodes expected?
9622*6777b538SAndroid Build Coastguard Worker */
9623*6777b538SAndroid Build Coastguard Worker goto internal_error;
9624*6777b538SAndroid Build Coastguard Worker }
9625*6777b538SAndroid Build Coastguard Worker
9626*6777b538SAndroid Build Coastguard Worker clone->type = cur->type;
9627*6777b538SAndroid Build Coastguard Worker clone->doc = destDoc;
9628*6777b538SAndroid Build Coastguard Worker
9629*6777b538SAndroid Build Coastguard Worker /*
9630*6777b538SAndroid Build Coastguard Worker * Clone the name of the node if any.
9631*6777b538SAndroid Build Coastguard Worker */
9632*6777b538SAndroid Build Coastguard Worker if (cur->name == xmlStringText)
9633*6777b538SAndroid Build Coastguard Worker clone->name = xmlStringText;
9634*6777b538SAndroid Build Coastguard Worker else if (cur->name == xmlStringTextNoenc)
9635*6777b538SAndroid Build Coastguard Worker /*
9636*6777b538SAndroid Build Coastguard Worker * NOTE: Although xmlStringTextNoenc is never assigned to a node
9637*6777b538SAndroid Build Coastguard Worker * in tree.c, it might be set in Libxslt via
9638*6777b538SAndroid Build Coastguard Worker * "xsl:disable-output-escaping".
9639*6777b538SAndroid Build Coastguard Worker */
9640*6777b538SAndroid Build Coastguard Worker clone->name = xmlStringTextNoenc;
9641*6777b538SAndroid Build Coastguard Worker else if (cur->name == xmlStringComment)
9642*6777b538SAndroid Build Coastguard Worker clone->name = xmlStringComment;
9643*6777b538SAndroid Build Coastguard Worker else if (cur->name != NULL) {
9644*6777b538SAndroid Build Coastguard Worker DICT_CONST_COPY(cur->name, clone->name);
9645*6777b538SAndroid Build Coastguard Worker }
9646*6777b538SAndroid Build Coastguard Worker
9647*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
9648*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_START:
9649*6777b538SAndroid Build Coastguard Worker case XML_XINCLUDE_END:
9650*6777b538SAndroid Build Coastguard Worker /*
9651*6777b538SAndroid Build Coastguard Worker * TODO
9652*6777b538SAndroid Build Coastguard Worker */
9653*6777b538SAndroid Build Coastguard Worker return (-1);
9654*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
9655*6777b538SAndroid Build Coastguard Worker curElem = cur;
9656*6777b538SAndroid Build Coastguard Worker depth++;
9657*6777b538SAndroid Build Coastguard Worker /*
9658*6777b538SAndroid Build Coastguard Worker * Namespace declarations.
9659*6777b538SAndroid Build Coastguard Worker */
9660*6777b538SAndroid Build Coastguard Worker if (cur->nsDef != NULL) {
9661*6777b538SAndroid Build Coastguard Worker if (! parnsdone) {
9662*6777b538SAndroid Build Coastguard Worker if (destParent && (ctxt == NULL)) {
9663*6777b538SAndroid Build Coastguard Worker /*
9664*6777b538SAndroid Build Coastguard Worker * Gather @parent's in-scope ns-decls.
9665*6777b538SAndroid Build Coastguard Worker */
9666*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap,
9667*6777b538SAndroid Build Coastguard Worker destParent) == -1)
9668*6777b538SAndroid Build Coastguard Worker goto internal_error;
9669*6777b538SAndroid Build Coastguard Worker }
9670*6777b538SAndroid Build Coastguard Worker parnsdone = 1;
9671*6777b538SAndroid Build Coastguard Worker }
9672*6777b538SAndroid Build Coastguard Worker /*
9673*6777b538SAndroid Build Coastguard Worker * Clone namespace declarations.
9674*6777b538SAndroid Build Coastguard Worker */
9675*6777b538SAndroid Build Coastguard Worker cloneNsDefSlot = &(clone->nsDef);
9676*6777b538SAndroid Build Coastguard Worker for (ns = cur->nsDef; ns != NULL; ns = ns->next) {
9677*6777b538SAndroid Build Coastguard Worker /*
9678*6777b538SAndroid Build Coastguard Worker * Create a new xmlNs.
9679*6777b538SAndroid Build Coastguard Worker */
9680*6777b538SAndroid Build Coastguard Worker cloneNs = (xmlNsPtr) xmlMalloc(sizeof(xmlNs));
9681*6777b538SAndroid Build Coastguard Worker if (cloneNs == NULL)
9682*6777b538SAndroid Build Coastguard Worker return(-1);
9683*6777b538SAndroid Build Coastguard Worker memset(cloneNs, 0, sizeof(xmlNs));
9684*6777b538SAndroid Build Coastguard Worker cloneNs->type = XML_LOCAL_NAMESPACE;
9685*6777b538SAndroid Build Coastguard Worker
9686*6777b538SAndroid Build Coastguard Worker if (ns->href != NULL)
9687*6777b538SAndroid Build Coastguard Worker cloneNs->href = xmlStrdup(ns->href);
9688*6777b538SAndroid Build Coastguard Worker if (ns->prefix != NULL)
9689*6777b538SAndroid Build Coastguard Worker cloneNs->prefix = xmlStrdup(ns->prefix);
9690*6777b538SAndroid Build Coastguard Worker
9691*6777b538SAndroid Build Coastguard Worker *cloneNsDefSlot = cloneNs;
9692*6777b538SAndroid Build Coastguard Worker cloneNsDefSlot = &(cloneNs->next);
9693*6777b538SAndroid Build Coastguard Worker
9694*6777b538SAndroid Build Coastguard Worker /*
9695*6777b538SAndroid Build Coastguard Worker * Note that for custom handling of ns-references,
9696*6777b538SAndroid Build Coastguard Worker * the ns-decls need not be stored in the ns-map,
9697*6777b538SAndroid Build Coastguard Worker * since they won't be referenced by node->ns.
9698*6777b538SAndroid Build Coastguard Worker */
9699*6777b538SAndroid Build Coastguard Worker if ((ctxt == NULL) ||
9700*6777b538SAndroid Build Coastguard Worker (ctxt->getNsForNodeFunc == NULL))
9701*6777b538SAndroid Build Coastguard Worker {
9702*6777b538SAndroid Build Coastguard Worker /*
9703*6777b538SAndroid Build Coastguard Worker * Does it shadow any ns-decl?
9704*6777b538SAndroid Build Coastguard Worker */
9705*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(nsMap)) {
9706*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
9707*6777b538SAndroid Build Coastguard Worker if ((mi->depth >= XML_TREE_NSMAP_PARENT) &&
9708*6777b538SAndroid Build Coastguard Worker (mi->shadowDepth == -1) &&
9709*6777b538SAndroid Build Coastguard Worker ((ns->prefix == mi->newNs->prefix) ||
9710*6777b538SAndroid Build Coastguard Worker xmlStrEqual(ns->prefix,
9711*6777b538SAndroid Build Coastguard Worker mi->newNs->prefix))) {
9712*6777b538SAndroid Build Coastguard Worker /*
9713*6777b538SAndroid Build Coastguard Worker * Mark as shadowed at the current
9714*6777b538SAndroid Build Coastguard Worker * depth.
9715*6777b538SAndroid Build Coastguard Worker */
9716*6777b538SAndroid Build Coastguard Worker mi->shadowDepth = depth;
9717*6777b538SAndroid Build Coastguard Worker }
9718*6777b538SAndroid Build Coastguard Worker }
9719*6777b538SAndroid Build Coastguard Worker }
9720*6777b538SAndroid Build Coastguard Worker /*
9721*6777b538SAndroid Build Coastguard Worker * Push mapping.
9722*6777b538SAndroid Build Coastguard Worker */
9723*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNsMapAddItem(&nsMap, -1,
9724*6777b538SAndroid Build Coastguard Worker ns, cloneNs, depth) == NULL)
9725*6777b538SAndroid Build Coastguard Worker goto internal_error;
9726*6777b538SAndroid Build Coastguard Worker }
9727*6777b538SAndroid Build Coastguard Worker }
9728*6777b538SAndroid Build Coastguard Worker }
9729*6777b538SAndroid Build Coastguard Worker /* cur->ns will be processed further down. */
9730*6777b538SAndroid Build Coastguard Worker break;
9731*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
9732*6777b538SAndroid Build Coastguard Worker /* IDs will be processed further down. */
9733*6777b538SAndroid Build Coastguard Worker /* cur->ns will be processed further down. */
9734*6777b538SAndroid Build Coastguard Worker break;
9735*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
9736*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
9737*6777b538SAndroid Build Coastguard Worker /*
9738*6777b538SAndroid Build Coastguard Worker * Note that this will also cover the values of attributes.
9739*6777b538SAndroid Build Coastguard Worker */
9740*6777b538SAndroid Build Coastguard Worker DICT_COPY(cur->content, clone->content);
9741*6777b538SAndroid Build Coastguard Worker goto leave_node;
9742*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_NODE:
9743*6777b538SAndroid Build Coastguard Worker /* TODO: What to do here? */
9744*6777b538SAndroid Build Coastguard Worker goto leave_node;
9745*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
9746*6777b538SAndroid Build Coastguard Worker if (sourceDoc != destDoc) {
9747*6777b538SAndroid Build Coastguard Worker if ((destDoc->intSubset) || (destDoc->extSubset)) {
9748*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
9749*6777b538SAndroid Build Coastguard Worker /*
9750*6777b538SAndroid Build Coastguard Worker * Different doc: Assign new entity-node if available.
9751*6777b538SAndroid Build Coastguard Worker */
9752*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(destDoc, cur->name);
9753*6777b538SAndroid Build Coastguard Worker if (ent != NULL) {
9754*6777b538SAndroid Build Coastguard Worker clone->content = ent->content;
9755*6777b538SAndroid Build Coastguard Worker clone->children = (xmlNodePtr) ent;
9756*6777b538SAndroid Build Coastguard Worker clone->last = (xmlNodePtr) ent;
9757*6777b538SAndroid Build Coastguard Worker }
9758*6777b538SAndroid Build Coastguard Worker }
9759*6777b538SAndroid Build Coastguard Worker } else {
9760*6777b538SAndroid Build Coastguard Worker /*
9761*6777b538SAndroid Build Coastguard Worker * Same doc: Use the current node's entity declaration
9762*6777b538SAndroid Build Coastguard Worker * and value.
9763*6777b538SAndroid Build Coastguard Worker */
9764*6777b538SAndroid Build Coastguard Worker clone->content = cur->content;
9765*6777b538SAndroid Build Coastguard Worker clone->children = cur->children;
9766*6777b538SAndroid Build Coastguard Worker clone->last = cur->last;
9767*6777b538SAndroid Build Coastguard Worker }
9768*6777b538SAndroid Build Coastguard Worker goto leave_node;
9769*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
9770*6777b538SAndroid Build Coastguard Worker DICT_COPY(cur->content, clone->content);
9771*6777b538SAndroid Build Coastguard Worker goto leave_node;
9772*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
9773*6777b538SAndroid Build Coastguard Worker DICT_COPY(cur->content, clone->content);
9774*6777b538SAndroid Build Coastguard Worker goto leave_node;
9775*6777b538SAndroid Build Coastguard Worker default:
9776*6777b538SAndroid Build Coastguard Worker goto internal_error;
9777*6777b538SAndroid Build Coastguard Worker }
9778*6777b538SAndroid Build Coastguard Worker
9779*6777b538SAndroid Build Coastguard Worker if (cur->ns == NULL)
9780*6777b538SAndroid Build Coastguard Worker goto end_ns_reference;
9781*6777b538SAndroid Build Coastguard Worker
9782*6777b538SAndroid Build Coastguard Worker /* handle_ns_reference: */
9783*6777b538SAndroid Build Coastguard Worker /*
9784*6777b538SAndroid Build Coastguard Worker ** The following will take care of references to ns-decls ********
9785*6777b538SAndroid Build Coastguard Worker ** and is intended only for element- and attribute-nodes.
9786*6777b538SAndroid Build Coastguard Worker **
9787*6777b538SAndroid Build Coastguard Worker */
9788*6777b538SAndroid Build Coastguard Worker if (! parnsdone) {
9789*6777b538SAndroid Build Coastguard Worker if (destParent && (ctxt == NULL)) {
9790*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormGatherInScopeNs(&nsMap, destParent) == -1)
9791*6777b538SAndroid Build Coastguard Worker goto internal_error;
9792*6777b538SAndroid Build Coastguard Worker }
9793*6777b538SAndroid Build Coastguard Worker parnsdone = 1;
9794*6777b538SAndroid Build Coastguard Worker }
9795*6777b538SAndroid Build Coastguard Worker /*
9796*6777b538SAndroid Build Coastguard Worker * Adopt ns-references.
9797*6777b538SAndroid Build Coastguard Worker */
9798*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(nsMap)) {
9799*6777b538SAndroid Build Coastguard Worker /*
9800*6777b538SAndroid Build Coastguard Worker * Search for a mapping.
9801*6777b538SAndroid Build Coastguard Worker */
9802*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
9803*6777b538SAndroid Build Coastguard Worker if ((mi->shadowDepth == -1) &&
9804*6777b538SAndroid Build Coastguard Worker (cur->ns == mi->oldNs)) {
9805*6777b538SAndroid Build Coastguard Worker /*
9806*6777b538SAndroid Build Coastguard Worker * This is the nice case: a mapping was found.
9807*6777b538SAndroid Build Coastguard Worker */
9808*6777b538SAndroid Build Coastguard Worker clone->ns = mi->newNs;
9809*6777b538SAndroid Build Coastguard Worker goto end_ns_reference;
9810*6777b538SAndroid Build Coastguard Worker }
9811*6777b538SAndroid Build Coastguard Worker }
9812*6777b538SAndroid Build Coastguard Worker }
9813*6777b538SAndroid Build Coastguard Worker /*
9814*6777b538SAndroid Build Coastguard Worker * No matching namespace in scope. We need a new one.
9815*6777b538SAndroid Build Coastguard Worker */
9816*6777b538SAndroid Build Coastguard Worker if ((ctxt != NULL) && (ctxt->getNsForNodeFunc != NULL)) {
9817*6777b538SAndroid Build Coastguard Worker /*
9818*6777b538SAndroid Build Coastguard Worker * User-defined behaviour.
9819*6777b538SAndroid Build Coastguard Worker */
9820*6777b538SAndroid Build Coastguard Worker ns = ctxt->getNsForNodeFunc(ctxt, cur,
9821*6777b538SAndroid Build Coastguard Worker cur->ns->href, cur->ns->prefix);
9822*6777b538SAndroid Build Coastguard Worker /*
9823*6777b538SAndroid Build Coastguard Worker * Add user's mapping.
9824*6777b538SAndroid Build Coastguard Worker */
9825*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNsMapAddItem(&nsMap, -1,
9826*6777b538SAndroid Build Coastguard Worker cur->ns, ns, XML_TREE_NSMAP_CUSTOM) == NULL)
9827*6777b538SAndroid Build Coastguard Worker goto internal_error;
9828*6777b538SAndroid Build Coastguard Worker clone->ns = ns;
9829*6777b538SAndroid Build Coastguard Worker } else {
9830*6777b538SAndroid Build Coastguard Worker /*
9831*6777b538SAndroid Build Coastguard Worker * Acquire a normalized ns-decl and add it to the map.
9832*6777b538SAndroid Build Coastguard Worker */
9833*6777b538SAndroid Build Coastguard Worker if (xmlDOMWrapNSNormAcquireNormalizedNs(destDoc,
9834*6777b538SAndroid Build Coastguard Worker /* ns-decls on curElem or on destDoc->oldNs */
9835*6777b538SAndroid Build Coastguard Worker destParent ? curElem : NULL,
9836*6777b538SAndroid Build Coastguard Worker cur->ns, &ns,
9837*6777b538SAndroid Build Coastguard Worker &nsMap, depth,
9838*6777b538SAndroid Build Coastguard Worker /* if we need to search only in the ancestor-axis */
9839*6777b538SAndroid Build Coastguard Worker ancestorsOnly,
9840*6777b538SAndroid Build Coastguard Worker /* ns-decls must be prefixed for attributes. */
9841*6777b538SAndroid Build Coastguard Worker (cur->type == XML_ATTRIBUTE_NODE) ? 1 : 0) == -1)
9842*6777b538SAndroid Build Coastguard Worker goto internal_error;
9843*6777b538SAndroid Build Coastguard Worker clone->ns = ns;
9844*6777b538SAndroid Build Coastguard Worker }
9845*6777b538SAndroid Build Coastguard Worker
9846*6777b538SAndroid Build Coastguard Worker end_ns_reference:
9847*6777b538SAndroid Build Coastguard Worker
9848*6777b538SAndroid Build Coastguard Worker /*
9849*6777b538SAndroid Build Coastguard Worker * Some post-processing.
9850*6777b538SAndroid Build Coastguard Worker *
9851*6777b538SAndroid Build Coastguard Worker * Handle ID attributes.
9852*6777b538SAndroid Build Coastguard Worker */
9853*6777b538SAndroid Build Coastguard Worker if ((clone->type == XML_ATTRIBUTE_NODE) &&
9854*6777b538SAndroid Build Coastguard Worker (clone->parent != NULL))
9855*6777b538SAndroid Build Coastguard Worker {
9856*6777b538SAndroid Build Coastguard Worker if (xmlIsID(destDoc, clone->parent, (xmlAttrPtr) clone)) {
9857*6777b538SAndroid Build Coastguard Worker
9858*6777b538SAndroid Build Coastguard Worker xmlChar *idVal;
9859*6777b538SAndroid Build Coastguard Worker
9860*6777b538SAndroid Build Coastguard Worker idVal = xmlNodeListGetString(cur->doc, cur->children, 1);
9861*6777b538SAndroid Build Coastguard Worker if (idVal != NULL) {
9862*6777b538SAndroid Build Coastguard Worker if (xmlAddIDSafe(destDoc, idVal, (xmlAttrPtr) cur, 0,
9863*6777b538SAndroid Build Coastguard Worker NULL) < 0) {
9864*6777b538SAndroid Build Coastguard Worker /* TODO: error message. */
9865*6777b538SAndroid Build Coastguard Worker xmlFree(idVal);
9866*6777b538SAndroid Build Coastguard Worker goto internal_error;
9867*6777b538SAndroid Build Coastguard Worker }
9868*6777b538SAndroid Build Coastguard Worker xmlFree(idVal);
9869*6777b538SAndroid Build Coastguard Worker }
9870*6777b538SAndroid Build Coastguard Worker }
9871*6777b538SAndroid Build Coastguard Worker }
9872*6777b538SAndroid Build Coastguard Worker /*
9873*6777b538SAndroid Build Coastguard Worker **
9874*6777b538SAndroid Build Coastguard Worker ** The following will traverse the tree **************************
9875*6777b538SAndroid Build Coastguard Worker **
9876*6777b538SAndroid Build Coastguard Worker *
9877*6777b538SAndroid Build Coastguard Worker * Walk the element's attributes before descending into child-nodes.
9878*6777b538SAndroid Build Coastguard Worker */
9879*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_ELEMENT_NODE) && (cur->properties != NULL)) {
9880*6777b538SAndroid Build Coastguard Worker prevClone = NULL;
9881*6777b538SAndroid Build Coastguard Worker parentClone = clone;
9882*6777b538SAndroid Build Coastguard Worker cur = (xmlNodePtr) cur->properties;
9883*6777b538SAndroid Build Coastguard Worker continue;
9884*6777b538SAndroid Build Coastguard Worker }
9885*6777b538SAndroid Build Coastguard Worker into_content:
9886*6777b538SAndroid Build Coastguard Worker /*
9887*6777b538SAndroid Build Coastguard Worker * Descend into child-nodes.
9888*6777b538SAndroid Build Coastguard Worker */
9889*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL) {
9890*6777b538SAndroid Build Coastguard Worker if (deep || (cur->type == XML_ATTRIBUTE_NODE)) {
9891*6777b538SAndroid Build Coastguard Worker prevClone = NULL;
9892*6777b538SAndroid Build Coastguard Worker parentClone = clone;
9893*6777b538SAndroid Build Coastguard Worker cur = cur->children;
9894*6777b538SAndroid Build Coastguard Worker continue;
9895*6777b538SAndroid Build Coastguard Worker }
9896*6777b538SAndroid Build Coastguard Worker }
9897*6777b538SAndroid Build Coastguard Worker
9898*6777b538SAndroid Build Coastguard Worker leave_node:
9899*6777b538SAndroid Build Coastguard Worker /*
9900*6777b538SAndroid Build Coastguard Worker * At this point we are done with the node, its content
9901*6777b538SAndroid Build Coastguard Worker * and an element-nodes's attribute-nodes.
9902*6777b538SAndroid Build Coastguard Worker */
9903*6777b538SAndroid Build Coastguard Worker if (cur == node)
9904*6777b538SAndroid Build Coastguard Worker break;
9905*6777b538SAndroid Build Coastguard Worker if ((cur->type == XML_ELEMENT_NODE) ||
9906*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_START) ||
9907*6777b538SAndroid Build Coastguard Worker (cur->type == XML_XINCLUDE_END)) {
9908*6777b538SAndroid Build Coastguard Worker /*
9909*6777b538SAndroid Build Coastguard Worker * TODO: Do we expect nsDefs on XML_XINCLUDE_START?
9910*6777b538SAndroid Build Coastguard Worker */
9911*6777b538SAndroid Build Coastguard Worker if (XML_NSMAP_NOTEMPTY(nsMap)) {
9912*6777b538SAndroid Build Coastguard Worker /*
9913*6777b538SAndroid Build Coastguard Worker * Pop mappings.
9914*6777b538SAndroid Build Coastguard Worker */
9915*6777b538SAndroid Build Coastguard Worker while ((nsMap->last != NULL) &&
9916*6777b538SAndroid Build Coastguard Worker (nsMap->last->depth >= depth))
9917*6777b538SAndroid Build Coastguard Worker {
9918*6777b538SAndroid Build Coastguard Worker XML_NSMAP_POP(nsMap, mi)
9919*6777b538SAndroid Build Coastguard Worker }
9920*6777b538SAndroid Build Coastguard Worker /*
9921*6777b538SAndroid Build Coastguard Worker * Unshadow.
9922*6777b538SAndroid Build Coastguard Worker */
9923*6777b538SAndroid Build Coastguard Worker XML_NSMAP_FOREACH(nsMap, mi) {
9924*6777b538SAndroid Build Coastguard Worker if (mi->shadowDepth >= depth)
9925*6777b538SAndroid Build Coastguard Worker mi->shadowDepth = -1;
9926*6777b538SAndroid Build Coastguard Worker }
9927*6777b538SAndroid Build Coastguard Worker }
9928*6777b538SAndroid Build Coastguard Worker depth--;
9929*6777b538SAndroid Build Coastguard Worker }
9930*6777b538SAndroid Build Coastguard Worker if (cur->next != NULL) {
9931*6777b538SAndroid Build Coastguard Worker prevClone = clone;
9932*6777b538SAndroid Build Coastguard Worker cur = cur->next;
9933*6777b538SAndroid Build Coastguard Worker } else if (cur->type != XML_ATTRIBUTE_NODE) {
9934*6777b538SAndroid Build Coastguard Worker /*
9935*6777b538SAndroid Build Coastguard Worker * Set clone->last.
9936*6777b538SAndroid Build Coastguard Worker */
9937*6777b538SAndroid Build Coastguard Worker if (clone->parent != NULL)
9938*6777b538SAndroid Build Coastguard Worker clone->parent->last = clone;
9939*6777b538SAndroid Build Coastguard Worker clone = clone->parent;
9940*6777b538SAndroid Build Coastguard Worker if (clone != NULL)
9941*6777b538SAndroid Build Coastguard Worker parentClone = clone->parent;
9942*6777b538SAndroid Build Coastguard Worker /*
9943*6777b538SAndroid Build Coastguard Worker * Process parent --> next;
9944*6777b538SAndroid Build Coastguard Worker */
9945*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
9946*6777b538SAndroid Build Coastguard Worker goto leave_node;
9947*6777b538SAndroid Build Coastguard Worker } else {
9948*6777b538SAndroid Build Coastguard Worker /* This is for attributes only. */
9949*6777b538SAndroid Build Coastguard Worker clone = clone->parent;
9950*6777b538SAndroid Build Coastguard Worker parentClone = clone->parent;
9951*6777b538SAndroid Build Coastguard Worker /*
9952*6777b538SAndroid Build Coastguard Worker * Process parent-element --> children.
9953*6777b538SAndroid Build Coastguard Worker */
9954*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
9955*6777b538SAndroid Build Coastguard Worker goto into_content;
9956*6777b538SAndroid Build Coastguard Worker }
9957*6777b538SAndroid Build Coastguard Worker }
9958*6777b538SAndroid Build Coastguard Worker goto exit;
9959*6777b538SAndroid Build Coastguard Worker
9960*6777b538SAndroid Build Coastguard Worker internal_error:
9961*6777b538SAndroid Build Coastguard Worker ret = -1;
9962*6777b538SAndroid Build Coastguard Worker
9963*6777b538SAndroid Build Coastguard Worker exit:
9964*6777b538SAndroid Build Coastguard Worker /*
9965*6777b538SAndroid Build Coastguard Worker * Cleanup.
9966*6777b538SAndroid Build Coastguard Worker */
9967*6777b538SAndroid Build Coastguard Worker if (nsMap != NULL) {
9968*6777b538SAndroid Build Coastguard Worker if ((ctxt) && (ctxt->namespaceMap == nsMap)) {
9969*6777b538SAndroid Build Coastguard Worker /*
9970*6777b538SAndroid Build Coastguard Worker * Just cleanup the map but don't free.
9971*6777b538SAndroid Build Coastguard Worker */
9972*6777b538SAndroid Build Coastguard Worker if (nsMap->first) {
9973*6777b538SAndroid Build Coastguard Worker if (nsMap->pool)
9974*6777b538SAndroid Build Coastguard Worker nsMap->last->next = nsMap->pool;
9975*6777b538SAndroid Build Coastguard Worker nsMap->pool = nsMap->first;
9976*6777b538SAndroid Build Coastguard Worker nsMap->first = NULL;
9977*6777b538SAndroid Build Coastguard Worker }
9978*6777b538SAndroid Build Coastguard Worker } else
9979*6777b538SAndroid Build Coastguard Worker xmlDOMWrapNsMapFree(nsMap);
9980*6777b538SAndroid Build Coastguard Worker }
9981*6777b538SAndroid Build Coastguard Worker /*
9982*6777b538SAndroid Build Coastguard Worker * TODO: Should we try a cleanup of the cloned node in case of a
9983*6777b538SAndroid Build Coastguard Worker * fatal error?
9984*6777b538SAndroid Build Coastguard Worker */
9985*6777b538SAndroid Build Coastguard Worker *resNode = resultClone;
9986*6777b538SAndroid Build Coastguard Worker return (ret);
9987*6777b538SAndroid Build Coastguard Worker }
9988*6777b538SAndroid Build Coastguard Worker
9989*6777b538SAndroid Build Coastguard Worker /*
9990*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapAdoptAttr:
9991*6777b538SAndroid Build Coastguard Worker * @ctxt: the optional context for custom processing
9992*6777b538SAndroid Build Coastguard Worker * @sourceDoc: the optional source document of attr
9993*6777b538SAndroid Build Coastguard Worker * @attr: the attribute-node to be adopted
9994*6777b538SAndroid Build Coastguard Worker * @destDoc: the destination doc for adoption
9995*6777b538SAndroid Build Coastguard Worker * @destParent: the optional new parent of @attr in @destDoc
9996*6777b538SAndroid Build Coastguard Worker * @options: option flags
9997*6777b538SAndroid Build Coastguard Worker *
9998*6777b538SAndroid Build Coastguard Worker * @attr is adopted by @destDoc.
9999*6777b538SAndroid Build Coastguard Worker * Ensures that ns-references point to @destDoc: either to
10000*6777b538SAndroid Build Coastguard Worker * elements->nsDef entries if @destParent is given, or to
10001*6777b538SAndroid Build Coastguard Worker * @destDoc->oldNs otherwise.
10002*6777b538SAndroid Build Coastguard Worker *
10003*6777b538SAndroid Build Coastguard Worker * Returns 0 if succeeded, -1 otherwise and on API/internal errors.
10004*6777b538SAndroid Build Coastguard Worker */
10005*6777b538SAndroid Build Coastguard Worker static int
xmlDOMWrapAdoptAttr(xmlDOMWrapCtxtPtr ctxt,xmlDocPtr sourceDoc,xmlAttrPtr attr,xmlDocPtr destDoc,xmlNodePtr destParent,int options ATTRIBUTE_UNUSED)10006*6777b538SAndroid Build Coastguard Worker xmlDOMWrapAdoptAttr(xmlDOMWrapCtxtPtr ctxt,
10007*6777b538SAndroid Build Coastguard Worker xmlDocPtr sourceDoc,
10008*6777b538SAndroid Build Coastguard Worker xmlAttrPtr attr,
10009*6777b538SAndroid Build Coastguard Worker xmlDocPtr destDoc,
10010*6777b538SAndroid Build Coastguard Worker xmlNodePtr destParent,
10011*6777b538SAndroid Build Coastguard Worker int options ATTRIBUTE_UNUSED)
10012*6777b538SAndroid Build Coastguard Worker {
10013*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur;
10014*6777b538SAndroid Build Coastguard Worker int adoptStr = 1;
10015*6777b538SAndroid Build Coastguard Worker
10016*6777b538SAndroid Build Coastguard Worker if ((attr == NULL) || (destDoc == NULL))
10017*6777b538SAndroid Build Coastguard Worker return (-1);
10018*6777b538SAndroid Build Coastguard Worker
10019*6777b538SAndroid Build Coastguard Worker attr->doc = destDoc;
10020*6777b538SAndroid Build Coastguard Worker if (attr->ns != NULL) {
10021*6777b538SAndroid Build Coastguard Worker xmlNsPtr ns = NULL;
10022*6777b538SAndroid Build Coastguard Worker
10023*6777b538SAndroid Build Coastguard Worker if (ctxt != NULL) {
10024*6777b538SAndroid Build Coastguard Worker /* TODO: User defined. */
10025*6777b538SAndroid Build Coastguard Worker }
10026*6777b538SAndroid Build Coastguard Worker /* XML Namespace. */
10027*6777b538SAndroid Build Coastguard Worker if (IS_STR_XML(attr->ns->prefix)) {
10028*6777b538SAndroid Build Coastguard Worker ns = xmlTreeEnsureXMLDecl(destDoc);
10029*6777b538SAndroid Build Coastguard Worker } else if (destParent == NULL) {
10030*6777b538SAndroid Build Coastguard Worker /*
10031*6777b538SAndroid Build Coastguard Worker * Store in @destDoc->oldNs.
10032*6777b538SAndroid Build Coastguard Worker */
10033*6777b538SAndroid Build Coastguard Worker ns = xmlDOMWrapStoreNs(destDoc, attr->ns->href, attr->ns->prefix);
10034*6777b538SAndroid Build Coastguard Worker } else {
10035*6777b538SAndroid Build Coastguard Worker /*
10036*6777b538SAndroid Build Coastguard Worker * Declare on @destParent.
10037*6777b538SAndroid Build Coastguard Worker */
10038*6777b538SAndroid Build Coastguard Worker if (xmlSearchNsByNamespaceStrict(destDoc, destParent, attr->ns->href,
10039*6777b538SAndroid Build Coastguard Worker &ns, 1) == -1)
10040*6777b538SAndroid Build Coastguard Worker goto internal_error;
10041*6777b538SAndroid Build Coastguard Worker if (ns == NULL) {
10042*6777b538SAndroid Build Coastguard Worker ns = xmlDOMWrapNSNormDeclareNsForced(destDoc, destParent,
10043*6777b538SAndroid Build Coastguard Worker attr->ns->href, attr->ns->prefix, 1);
10044*6777b538SAndroid Build Coastguard Worker }
10045*6777b538SAndroid Build Coastguard Worker }
10046*6777b538SAndroid Build Coastguard Worker if (ns == NULL)
10047*6777b538SAndroid Build Coastguard Worker goto internal_error;
10048*6777b538SAndroid Build Coastguard Worker attr->ns = ns;
10049*6777b538SAndroid Build Coastguard Worker }
10050*6777b538SAndroid Build Coastguard Worker
10051*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR(attr->name);
10052*6777b538SAndroid Build Coastguard Worker attr->atype = 0;
10053*6777b538SAndroid Build Coastguard Worker attr->psvi = NULL;
10054*6777b538SAndroid Build Coastguard Worker /*
10055*6777b538SAndroid Build Coastguard Worker * Walk content.
10056*6777b538SAndroid Build Coastguard Worker */
10057*6777b538SAndroid Build Coastguard Worker if (attr->children == NULL)
10058*6777b538SAndroid Build Coastguard Worker return (0);
10059*6777b538SAndroid Build Coastguard Worker cur = attr->children;
10060*6777b538SAndroid Build Coastguard Worker if ((cur != NULL) && (cur->type == XML_NAMESPACE_DECL))
10061*6777b538SAndroid Build Coastguard Worker goto internal_error;
10062*6777b538SAndroid Build Coastguard Worker while (cur != NULL) {
10063*6777b538SAndroid Build Coastguard Worker cur->doc = destDoc;
10064*6777b538SAndroid Build Coastguard Worker switch (cur->type) {
10065*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
10066*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
10067*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR_2(cur->content)
10068*6777b538SAndroid Build Coastguard Worker break;
10069*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
10070*6777b538SAndroid Build Coastguard Worker /*
10071*6777b538SAndroid Build Coastguard Worker * Remove reference to the entity-node.
10072*6777b538SAndroid Build Coastguard Worker */
10073*6777b538SAndroid Build Coastguard Worker cur->content = NULL;
10074*6777b538SAndroid Build Coastguard Worker cur->children = NULL;
10075*6777b538SAndroid Build Coastguard Worker cur->last = NULL;
10076*6777b538SAndroid Build Coastguard Worker if ((destDoc->intSubset) || (destDoc->extSubset)) {
10077*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
10078*6777b538SAndroid Build Coastguard Worker /*
10079*6777b538SAndroid Build Coastguard Worker * Assign new entity-node if available.
10080*6777b538SAndroid Build Coastguard Worker */
10081*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(destDoc, cur->name);
10082*6777b538SAndroid Build Coastguard Worker if (ent != NULL) {
10083*6777b538SAndroid Build Coastguard Worker cur->content = ent->content;
10084*6777b538SAndroid Build Coastguard Worker cur->children = (xmlNodePtr) ent;
10085*6777b538SAndroid Build Coastguard Worker cur->last = (xmlNodePtr) ent;
10086*6777b538SAndroid Build Coastguard Worker }
10087*6777b538SAndroid Build Coastguard Worker }
10088*6777b538SAndroid Build Coastguard Worker break;
10089*6777b538SAndroid Build Coastguard Worker default:
10090*6777b538SAndroid Build Coastguard Worker break;
10091*6777b538SAndroid Build Coastguard Worker }
10092*6777b538SAndroid Build Coastguard Worker if (cur->children != NULL) {
10093*6777b538SAndroid Build Coastguard Worker cur = cur->children;
10094*6777b538SAndroid Build Coastguard Worker continue;
10095*6777b538SAndroid Build Coastguard Worker }
10096*6777b538SAndroid Build Coastguard Worker next_sibling:
10097*6777b538SAndroid Build Coastguard Worker if (cur == (xmlNodePtr) attr)
10098*6777b538SAndroid Build Coastguard Worker break;
10099*6777b538SAndroid Build Coastguard Worker if (cur->next != NULL)
10100*6777b538SAndroid Build Coastguard Worker cur = cur->next;
10101*6777b538SAndroid Build Coastguard Worker else {
10102*6777b538SAndroid Build Coastguard Worker cur = cur->parent;
10103*6777b538SAndroid Build Coastguard Worker goto next_sibling;
10104*6777b538SAndroid Build Coastguard Worker }
10105*6777b538SAndroid Build Coastguard Worker }
10106*6777b538SAndroid Build Coastguard Worker return (0);
10107*6777b538SAndroid Build Coastguard Worker internal_error:
10108*6777b538SAndroid Build Coastguard Worker return (-1);
10109*6777b538SAndroid Build Coastguard Worker }
10110*6777b538SAndroid Build Coastguard Worker
10111*6777b538SAndroid Build Coastguard Worker /*
10112*6777b538SAndroid Build Coastguard Worker * xmlDOMWrapAdoptNode:
10113*6777b538SAndroid Build Coastguard Worker * @ctxt: the optional context for custom processing
10114*6777b538SAndroid Build Coastguard Worker * @sourceDoc: the optional sourceDoc
10115*6777b538SAndroid Build Coastguard Worker * @node: the node to start with
10116*6777b538SAndroid Build Coastguard Worker * @destDoc: the destination doc
10117*6777b538SAndroid Build Coastguard Worker * @destParent: the optional new parent of @node in @destDoc
10118*6777b538SAndroid Build Coastguard Worker * @options: option flags
10119*6777b538SAndroid Build Coastguard Worker *
10120*6777b538SAndroid Build Coastguard Worker * References of out-of scope ns-decls are remapped to point to @destDoc:
10121*6777b538SAndroid Build Coastguard Worker * 1) If @destParent is given, then nsDef entries on element-nodes are used
10122*6777b538SAndroid Build Coastguard Worker * 2) If *no* @destParent is given, then @destDoc->oldNs entries are used
10123*6777b538SAndroid Build Coastguard Worker * This is the case when you have an unlinked node and just want to move it
10124*6777b538SAndroid Build Coastguard Worker * to the context of
10125*6777b538SAndroid Build Coastguard Worker *
10126*6777b538SAndroid Build Coastguard Worker * If @destParent is given, it ensures that the tree is namespace
10127*6777b538SAndroid Build Coastguard Worker * wellformed by creating additional ns-decls where needed.
10128*6777b538SAndroid Build Coastguard Worker * Note that, since prefixes of already existent ns-decls can be
10129*6777b538SAndroid Build Coastguard Worker * shadowed by this process, it could break QNames in attribute
10130*6777b538SAndroid Build Coastguard Worker * values or element content.
10131*6777b538SAndroid Build Coastguard Worker * NOTE: This function was not intensively tested.
10132*6777b538SAndroid Build Coastguard Worker *
10133*6777b538SAndroid Build Coastguard Worker * Returns 0 if the operation succeeded,
10134*6777b538SAndroid Build Coastguard Worker * 1 if a node of unsupported type was given,
10135*6777b538SAndroid Build Coastguard Worker * 2 if a node of not yet supported type was given and
10136*6777b538SAndroid Build Coastguard Worker * -1 on API/internal errors.
10137*6777b538SAndroid Build Coastguard Worker */
10138*6777b538SAndroid Build Coastguard Worker int
xmlDOMWrapAdoptNode(xmlDOMWrapCtxtPtr ctxt,xmlDocPtr sourceDoc,xmlNodePtr node,xmlDocPtr destDoc,xmlNodePtr destParent,int options)10139*6777b538SAndroid Build Coastguard Worker xmlDOMWrapAdoptNode(xmlDOMWrapCtxtPtr ctxt,
10140*6777b538SAndroid Build Coastguard Worker xmlDocPtr sourceDoc,
10141*6777b538SAndroid Build Coastguard Worker xmlNodePtr node,
10142*6777b538SAndroid Build Coastguard Worker xmlDocPtr destDoc,
10143*6777b538SAndroid Build Coastguard Worker xmlNodePtr destParent,
10144*6777b538SAndroid Build Coastguard Worker int options)
10145*6777b538SAndroid Build Coastguard Worker {
10146*6777b538SAndroid Build Coastguard Worker if ((node == NULL) || (node->type == XML_NAMESPACE_DECL) ||
10147*6777b538SAndroid Build Coastguard Worker (destDoc == NULL) ||
10148*6777b538SAndroid Build Coastguard Worker ((destParent != NULL) && (destParent->doc != destDoc)))
10149*6777b538SAndroid Build Coastguard Worker return(-1);
10150*6777b538SAndroid Build Coastguard Worker /*
10151*6777b538SAndroid Build Coastguard Worker * Check node->doc sanity.
10152*6777b538SAndroid Build Coastguard Worker */
10153*6777b538SAndroid Build Coastguard Worker if ((node->doc != NULL) && (sourceDoc != NULL) &&
10154*6777b538SAndroid Build Coastguard Worker (node->doc != sourceDoc)) {
10155*6777b538SAndroid Build Coastguard Worker /*
10156*6777b538SAndroid Build Coastguard Worker * Might be an XIncluded node.
10157*6777b538SAndroid Build Coastguard Worker */
10158*6777b538SAndroid Build Coastguard Worker return (-1);
10159*6777b538SAndroid Build Coastguard Worker }
10160*6777b538SAndroid Build Coastguard Worker if (sourceDoc == NULL)
10161*6777b538SAndroid Build Coastguard Worker sourceDoc = node->doc;
10162*6777b538SAndroid Build Coastguard Worker if (sourceDoc == destDoc)
10163*6777b538SAndroid Build Coastguard Worker return (-1);
10164*6777b538SAndroid Build Coastguard Worker switch (node->type) {
10165*6777b538SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
10166*6777b538SAndroid Build Coastguard Worker case XML_ATTRIBUTE_NODE:
10167*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
10168*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
10169*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
10170*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE:
10171*6777b538SAndroid Build Coastguard Worker case XML_COMMENT_NODE:
10172*6777b538SAndroid Build Coastguard Worker break;
10173*6777b538SAndroid Build Coastguard Worker case XML_DOCUMENT_FRAG_NODE:
10174*6777b538SAndroid Build Coastguard Worker /* TODO: Support document-fragment-nodes. */
10175*6777b538SAndroid Build Coastguard Worker return (2);
10176*6777b538SAndroid Build Coastguard Worker default:
10177*6777b538SAndroid Build Coastguard Worker return (1);
10178*6777b538SAndroid Build Coastguard Worker }
10179*6777b538SAndroid Build Coastguard Worker /*
10180*6777b538SAndroid Build Coastguard Worker * Unlink only if @node was not already added to @destParent.
10181*6777b538SAndroid Build Coastguard Worker */
10182*6777b538SAndroid Build Coastguard Worker if ((node->parent != NULL) && (destParent != node->parent))
10183*6777b538SAndroid Build Coastguard Worker xmlUnlinkNode(node);
10184*6777b538SAndroid Build Coastguard Worker
10185*6777b538SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE) {
10186*6777b538SAndroid Build Coastguard Worker return (xmlDOMWrapAdoptBranch(ctxt, sourceDoc, node,
10187*6777b538SAndroid Build Coastguard Worker destDoc, destParent, options));
10188*6777b538SAndroid Build Coastguard Worker } else if (node->type == XML_ATTRIBUTE_NODE) {
10189*6777b538SAndroid Build Coastguard Worker return (xmlDOMWrapAdoptAttr(ctxt, sourceDoc,
10190*6777b538SAndroid Build Coastguard Worker (xmlAttrPtr) node, destDoc, destParent, options));
10191*6777b538SAndroid Build Coastguard Worker } else {
10192*6777b538SAndroid Build Coastguard Worker xmlNodePtr cur = node;
10193*6777b538SAndroid Build Coastguard Worker int adoptStr = 1;
10194*6777b538SAndroid Build Coastguard Worker
10195*6777b538SAndroid Build Coastguard Worker cur->doc = destDoc;
10196*6777b538SAndroid Build Coastguard Worker /*
10197*6777b538SAndroid Build Coastguard Worker * Optimize string adoption.
10198*6777b538SAndroid Build Coastguard Worker */
10199*6777b538SAndroid Build Coastguard Worker if ((sourceDoc != NULL) &&
10200*6777b538SAndroid Build Coastguard Worker (sourceDoc->dict == destDoc->dict))
10201*6777b538SAndroid Build Coastguard Worker adoptStr = 0;
10202*6777b538SAndroid Build Coastguard Worker switch (node->type) {
10203*6777b538SAndroid Build Coastguard Worker case XML_TEXT_NODE:
10204*6777b538SAndroid Build Coastguard Worker case XML_CDATA_SECTION_NODE:
10205*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR_2(node->content)
10206*6777b538SAndroid Build Coastguard Worker break;
10207*6777b538SAndroid Build Coastguard Worker case XML_ENTITY_REF_NODE:
10208*6777b538SAndroid Build Coastguard Worker /*
10209*6777b538SAndroid Build Coastguard Worker * Remove reference to the entity-node.
10210*6777b538SAndroid Build Coastguard Worker */
10211*6777b538SAndroid Build Coastguard Worker node->content = NULL;
10212*6777b538SAndroid Build Coastguard Worker node->children = NULL;
10213*6777b538SAndroid Build Coastguard Worker node->last = NULL;
10214*6777b538SAndroid Build Coastguard Worker if ((destDoc->intSubset) || (destDoc->extSubset)) {
10215*6777b538SAndroid Build Coastguard Worker xmlEntityPtr ent;
10216*6777b538SAndroid Build Coastguard Worker /*
10217*6777b538SAndroid Build Coastguard Worker * Assign new entity-node if available.
10218*6777b538SAndroid Build Coastguard Worker */
10219*6777b538SAndroid Build Coastguard Worker ent = xmlGetDocEntity(destDoc, node->name);
10220*6777b538SAndroid Build Coastguard Worker if (ent != NULL) {
10221*6777b538SAndroid Build Coastguard Worker node->content = ent->content;
10222*6777b538SAndroid Build Coastguard Worker node->children = (xmlNodePtr) ent;
10223*6777b538SAndroid Build Coastguard Worker node->last = (xmlNodePtr) ent;
10224*6777b538SAndroid Build Coastguard Worker }
10225*6777b538SAndroid Build Coastguard Worker }
10226*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR(node->name)
10227*6777b538SAndroid Build Coastguard Worker break;
10228*6777b538SAndroid Build Coastguard Worker case XML_PI_NODE: {
10229*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR(node->name)
10230*6777b538SAndroid Build Coastguard Worker XML_TREE_ADOPT_STR_2(node->content)
10231*6777b538SAndroid Build Coastguard Worker break;
10232*6777b538SAndroid Build Coastguard Worker }
10233*6777b538SAndroid Build Coastguard Worker default:
10234*6777b538SAndroid Build Coastguard Worker break;
10235*6777b538SAndroid Build Coastguard Worker }
10236*6777b538SAndroid Build Coastguard Worker }
10237*6777b538SAndroid Build Coastguard Worker return (0);
10238*6777b538SAndroid Build Coastguard Worker }
10239*6777b538SAndroid Build Coastguard Worker
10240*6777b538SAndroid Build Coastguard Worker /************************************************************************
10241*6777b538SAndroid Build Coastguard Worker * *
10242*6777b538SAndroid Build Coastguard Worker * XHTML detection *
10243*6777b538SAndroid Build Coastguard Worker * *
10244*6777b538SAndroid Build Coastguard Worker ************************************************************************/
10245*6777b538SAndroid Build Coastguard Worker
10246*6777b538SAndroid Build Coastguard Worker #define XHTML_STRICT_PUBLIC_ID BAD_CAST \
10247*6777b538SAndroid Build Coastguard Worker "-//W3C//DTD XHTML 1.0 Strict//EN"
10248*6777b538SAndroid Build Coastguard Worker #define XHTML_STRICT_SYSTEM_ID BAD_CAST \
10249*6777b538SAndroid Build Coastguard Worker "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
10250*6777b538SAndroid Build Coastguard Worker #define XHTML_FRAME_PUBLIC_ID BAD_CAST \
10251*6777b538SAndroid Build Coastguard Worker "-//W3C//DTD XHTML 1.0 Frameset//EN"
10252*6777b538SAndroid Build Coastguard Worker #define XHTML_FRAME_SYSTEM_ID BAD_CAST \
10253*6777b538SAndroid Build Coastguard Worker "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"
10254*6777b538SAndroid Build Coastguard Worker #define XHTML_TRANS_PUBLIC_ID BAD_CAST \
10255*6777b538SAndroid Build Coastguard Worker "-//W3C//DTD XHTML 1.0 Transitional//EN"
10256*6777b538SAndroid Build Coastguard Worker #define XHTML_TRANS_SYSTEM_ID BAD_CAST \
10257*6777b538SAndroid Build Coastguard Worker "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
10258*6777b538SAndroid Build Coastguard Worker
10259*6777b538SAndroid Build Coastguard Worker /**
10260*6777b538SAndroid Build Coastguard Worker * xmlIsXHTML:
10261*6777b538SAndroid Build Coastguard Worker * @systemID: the system identifier
10262*6777b538SAndroid Build Coastguard Worker * @publicID: the public identifier
10263*6777b538SAndroid Build Coastguard Worker *
10264*6777b538SAndroid Build Coastguard Worker * Try to find if the document correspond to an XHTML DTD
10265*6777b538SAndroid Build Coastguard Worker *
10266*6777b538SAndroid Build Coastguard Worker * Returns 1 if true, 0 if not and -1 in case of error
10267*6777b538SAndroid Build Coastguard Worker */
10268*6777b538SAndroid Build Coastguard Worker int
xmlIsXHTML(const xmlChar * systemID,const xmlChar * publicID)10269*6777b538SAndroid Build Coastguard Worker xmlIsXHTML(const xmlChar *systemID, const xmlChar *publicID) {
10270*6777b538SAndroid Build Coastguard Worker if ((systemID == NULL) && (publicID == NULL))
10271*6777b538SAndroid Build Coastguard Worker return(-1);
10272*6777b538SAndroid Build Coastguard Worker if (publicID != NULL) {
10273*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(publicID, XHTML_STRICT_PUBLIC_ID)) return(1);
10274*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(publicID, XHTML_FRAME_PUBLIC_ID)) return(1);
10275*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(publicID, XHTML_TRANS_PUBLIC_ID)) return(1);
10276*6777b538SAndroid Build Coastguard Worker }
10277*6777b538SAndroid Build Coastguard Worker if (systemID != NULL) {
10278*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(systemID, XHTML_STRICT_SYSTEM_ID)) return(1);
10279*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(systemID, XHTML_FRAME_SYSTEM_ID)) return(1);
10280*6777b538SAndroid Build Coastguard Worker if (xmlStrEqual(systemID, XHTML_TRANS_SYSTEM_ID)) return(1);
10281*6777b538SAndroid Build Coastguard Worker }
10282*6777b538SAndroid Build Coastguard Worker return(0);
10283*6777b538SAndroid Build Coastguard Worker }
10284*6777b538SAndroid Build Coastguard Worker
10285*6777b538SAndroid Build Coastguard Worker /************************************************************************
10286*6777b538SAndroid Build Coastguard Worker * *
10287*6777b538SAndroid Build Coastguard Worker * Node callbacks *
10288*6777b538SAndroid Build Coastguard Worker * *
10289*6777b538SAndroid Build Coastguard Worker ************************************************************************/
10290*6777b538SAndroid Build Coastguard Worker
10291*6777b538SAndroid Build Coastguard Worker /**
10292*6777b538SAndroid Build Coastguard Worker * xmlRegisterNodeDefault:
10293*6777b538SAndroid Build Coastguard Worker * @func: function pointer to the new RegisterNodeFunc
10294*6777b538SAndroid Build Coastguard Worker *
10295*6777b538SAndroid Build Coastguard Worker * Registers a callback for node creation
10296*6777b538SAndroid Build Coastguard Worker *
10297*6777b538SAndroid Build Coastguard Worker * Returns the old value of the registration function
10298*6777b538SAndroid Build Coastguard Worker */
10299*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeFunc
xmlRegisterNodeDefault(xmlRegisterNodeFunc func)10300*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefault(xmlRegisterNodeFunc func)
10301*6777b538SAndroid Build Coastguard Worker {
10302*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeFunc old = xmlRegisterNodeDefaultValue;
10303*6777b538SAndroid Build Coastguard Worker
10304*6777b538SAndroid Build Coastguard Worker __xmlRegisterCallbacks = 1;
10305*6777b538SAndroid Build Coastguard Worker xmlRegisterNodeDefaultValue = func;
10306*6777b538SAndroid Build Coastguard Worker return(old);
10307*6777b538SAndroid Build Coastguard Worker }
10308*6777b538SAndroid Build Coastguard Worker
10309*6777b538SAndroid Build Coastguard Worker /**
10310*6777b538SAndroid Build Coastguard Worker * xmlDeregisterNodeDefault:
10311*6777b538SAndroid Build Coastguard Worker * @func: function pointer to the new DeregisterNodeFunc
10312*6777b538SAndroid Build Coastguard Worker *
10313*6777b538SAndroid Build Coastguard Worker * Registers a callback for node destruction
10314*6777b538SAndroid Build Coastguard Worker *
10315*6777b538SAndroid Build Coastguard Worker * Returns the previous value of the deregistration function
10316*6777b538SAndroid Build Coastguard Worker */
10317*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeFunc
xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func)10318*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func)
10319*6777b538SAndroid Build Coastguard Worker {
10320*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeFunc old = xmlDeregisterNodeDefaultValue;
10321*6777b538SAndroid Build Coastguard Worker
10322*6777b538SAndroid Build Coastguard Worker __xmlRegisterCallbacks = 1;
10323*6777b538SAndroid Build Coastguard Worker xmlDeregisterNodeDefaultValue = func;
10324*6777b538SAndroid Build Coastguard Worker return(old);
10325*6777b538SAndroid Build Coastguard Worker }
10326*6777b538SAndroid Build Coastguard Worker
10327