xref: /aosp_15_r20/external/cronet/third_party/libxml/src/xmlwriter.c (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker 
2*6777b538SAndroid Build Coastguard Worker /*
3*6777b538SAndroid Build Coastguard Worker  * xmlwriter.c: XML text writer implementation
4*6777b538SAndroid Build Coastguard Worker  *
5*6777b538SAndroid Build Coastguard Worker  * For license and disclaimer see the license and disclaimer of
6*6777b538SAndroid Build Coastguard Worker  * libxml2.
7*6777b538SAndroid Build Coastguard Worker  *
8*6777b538SAndroid Build Coastguard Worker  * [email protected]
9*6777b538SAndroid Build Coastguard Worker  */
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #define IN_LIBXML
12*6777b538SAndroid Build Coastguard Worker #include "libxml.h"
13*6777b538SAndroid Build Coastguard Worker #include <string.h>
14*6777b538SAndroid Build Coastguard Worker #include <stdarg.h>
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
17*6777b538SAndroid Build Coastguard Worker #include <libxml/parser.h>
18*6777b538SAndroid Build Coastguard Worker #include <libxml/parserInternals.h>
19*6777b538SAndroid Build Coastguard Worker #include <libxml/uri.h>
20*6777b538SAndroid Build Coastguard Worker #include <libxml/HTMLtree.h>
21*6777b538SAndroid Build Coastguard Worker #include <libxml/SAX2.h>
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_WRITER_ENABLED
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker #include <libxml/xmlwriter.h>
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker #include "private/buf.h"
28*6777b538SAndroid Build Coastguard Worker #include "private/enc.h"
29*6777b538SAndroid Build Coastguard Worker #include "private/error.h"
30*6777b538SAndroid Build Coastguard Worker #include "private/save.h"
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker #define B64LINELEN 72
33*6777b538SAndroid Build Coastguard Worker #define B64CRLF "\r\n"
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker #ifndef va_copy
36*6777b538SAndroid Build Coastguard Worker   #ifdef __va_copy
37*6777b538SAndroid Build Coastguard Worker     #define va_copy(dest, src) __va_copy(dest, src)
38*6777b538SAndroid Build Coastguard Worker   #else
39*6777b538SAndroid Build Coastguard Worker     #define va_copy(dest, src) memcpy(dest, src, sizeof(va_list))
40*6777b538SAndroid Build Coastguard Worker   #endif
41*6777b538SAndroid Build Coastguard Worker #endif
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker /*
44*6777b538SAndroid Build Coastguard Worker  * Types are kept private
45*6777b538SAndroid Build Coastguard Worker  */
46*6777b538SAndroid Build Coastguard Worker typedef enum {
47*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_NONE = 0,
48*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_NAME,
49*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_ATTRIBUTE,
50*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_TEXT,
51*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_PI,
52*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_PI_TEXT,
53*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_CDATA,
54*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_DTD,
55*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_DTD_TEXT,
56*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_DTD_ELEM,
57*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_DTD_ELEM_TEXT,
58*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_DTD_ATTL,
59*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_DTD_ATTL_TEXT,
60*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_DTD_ENTY,    /* entity */
61*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_DTD_ENTY_TEXT,
62*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_DTD_PENT,    /* parameter entity */
63*6777b538SAndroid Build Coastguard Worker     XML_TEXTWRITER_COMMENT
64*6777b538SAndroid Build Coastguard Worker } xmlTextWriterState;
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker typedef struct _xmlTextWriterStackEntry xmlTextWriterStackEntry;
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker struct _xmlTextWriterStackEntry {
69*6777b538SAndroid Build Coastguard Worker     xmlChar *name;
70*6777b538SAndroid Build Coastguard Worker     xmlTextWriterState state;
71*6777b538SAndroid Build Coastguard Worker };
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker typedef struct _xmlTextWriterNsStackEntry xmlTextWriterNsStackEntry;
74*6777b538SAndroid Build Coastguard Worker struct _xmlTextWriterNsStackEntry {
75*6777b538SAndroid Build Coastguard Worker     xmlChar *prefix;
76*6777b538SAndroid Build Coastguard Worker     xmlChar *uri;
77*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr elem;
78*6777b538SAndroid Build Coastguard Worker };
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker struct _xmlTextWriter {
81*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr out;     /* output buffer */
82*6777b538SAndroid Build Coastguard Worker     xmlListPtr nodes;           /* element name stack */
83*6777b538SAndroid Build Coastguard Worker     xmlListPtr nsstack;         /* name spaces stack */
84*6777b538SAndroid Build Coastguard Worker     int level;
85*6777b538SAndroid Build Coastguard Worker     int indent;                 /* enable indent */
86*6777b538SAndroid Build Coastguard Worker     int doindent;               /* internal indent flag */
87*6777b538SAndroid Build Coastguard Worker     xmlChar *ichar;             /* indent character */
88*6777b538SAndroid Build Coastguard Worker     char qchar;                 /* character used for quoting attribute values */
89*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
90*6777b538SAndroid Build Coastguard Worker     int no_doc_free;
91*6777b538SAndroid Build Coastguard Worker     xmlDocPtr doc;
92*6777b538SAndroid Build Coastguard Worker };
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker static void xmlFreeTextWriterStackEntry(xmlLinkPtr lk);
95*6777b538SAndroid Build Coastguard Worker static int xmlCmpTextWriterStackEntry(const void *data0,
96*6777b538SAndroid Build Coastguard Worker                                       const void *data1);
97*6777b538SAndroid Build Coastguard Worker static int xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer);
98*6777b538SAndroid Build Coastguard Worker static void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk);
99*6777b538SAndroid Build Coastguard Worker static int xmlCmpTextWriterNsStackEntry(const void *data0,
100*6777b538SAndroid Build Coastguard Worker                                         const void *data1);
101*6777b538SAndroid Build Coastguard Worker static int xmlTextWriterWriteDocCallback(void *context,
102*6777b538SAndroid Build Coastguard Worker                                          const char *str, int len);
103*6777b538SAndroid Build Coastguard Worker static int xmlTextWriterCloseDocCallback(void *context);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker static xmlChar *xmlTextWriterVSprintf(const char *format, va_list argptr) LIBXML_ATTR_FORMAT(1,0);
106*6777b538SAndroid Build Coastguard Worker static int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
107*6777b538SAndroid Build Coastguard Worker                                       const unsigned char *data);
108*6777b538SAndroid Build Coastguard Worker static void xmlTextWriterStartDocumentCallback(void *ctx);
109*6777b538SAndroid Build Coastguard Worker static int xmlTextWriterWriteIndent(xmlTextWriterPtr writer);
110*6777b538SAndroid Build Coastguard Worker static int
111*6777b538SAndroid Build Coastguard Worker   xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
112*6777b538SAndroid Build Coastguard Worker                                        xmlTextWriterStackEntry * p);
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker /**
115*6777b538SAndroid Build Coastguard Worker  * xmlWriterErrMsg:
116*6777b538SAndroid Build Coastguard Worker  * @ctxt:  a writer context
117*6777b538SAndroid Build Coastguard Worker  * @error:  the error number
118*6777b538SAndroid Build Coastguard Worker  * @msg:  the error message
119*6777b538SAndroid Build Coastguard Worker  *
120*6777b538SAndroid Build Coastguard Worker  * Handle a writer error
121*6777b538SAndroid Build Coastguard Worker  */
122*6777b538SAndroid Build Coastguard Worker static void
xmlWriterErrMsg(xmlTextWriterPtr ctxt,xmlParserErrors error,const char * msg)123*6777b538SAndroid Build Coastguard Worker xmlWriterErrMsg(xmlTextWriterPtr ctxt, xmlParserErrors error,
124*6777b538SAndroid Build Coastguard Worker                const char *msg)
125*6777b538SAndroid Build Coastguard Worker {
126*6777b538SAndroid Build Coastguard Worker     if (ctxt != NULL) {
127*6777b538SAndroid Build Coastguard Worker 	__xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
128*6777b538SAndroid Build Coastguard Worker 	            NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
129*6777b538SAndroid Build Coastguard Worker 		    NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg);
130*6777b538SAndroid Build Coastguard Worker     } else {
131*6777b538SAndroid Build Coastguard Worker 	__xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
132*6777b538SAndroid Build Coastguard Worker                     XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg);
133*6777b538SAndroid Build Coastguard Worker     }
134*6777b538SAndroid Build Coastguard Worker }
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker /**
137*6777b538SAndroid Build Coastguard Worker  * xmlWriterErrMsgInt:
138*6777b538SAndroid Build Coastguard Worker  * @ctxt:  a writer context
139*6777b538SAndroid Build Coastguard Worker  * @error:  the error number
140*6777b538SAndroid Build Coastguard Worker  * @msg:  the error message
141*6777b538SAndroid Build Coastguard Worker  * @val:  an int
142*6777b538SAndroid Build Coastguard Worker  *
143*6777b538SAndroid Build Coastguard Worker  * Handle a writer error
144*6777b538SAndroid Build Coastguard Worker  */
145*6777b538SAndroid Build Coastguard Worker static void LIBXML_ATTR_FORMAT(3,0)
xmlWriterErrMsgInt(xmlTextWriterPtr ctxt,xmlParserErrors error,const char * msg,int val)146*6777b538SAndroid Build Coastguard Worker xmlWriterErrMsgInt(xmlTextWriterPtr ctxt, xmlParserErrors error,
147*6777b538SAndroid Build Coastguard Worker                const char *msg, int val)
148*6777b538SAndroid Build Coastguard Worker {
149*6777b538SAndroid Build Coastguard Worker     if (ctxt != NULL) {
150*6777b538SAndroid Build Coastguard Worker 	__xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
151*6777b538SAndroid Build Coastguard Worker 	            NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
152*6777b538SAndroid Build Coastguard Worker 		    NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
153*6777b538SAndroid Build Coastguard Worker     } else {
154*6777b538SAndroid Build Coastguard Worker 	__xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
155*6777b538SAndroid Build Coastguard Worker                     XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
156*6777b538SAndroid Build Coastguard Worker     }
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker /**
160*6777b538SAndroid Build Coastguard Worker  * xmlNewTextWriter:
161*6777b538SAndroid Build Coastguard Worker  * @out:  an xmlOutputBufferPtr
162*6777b538SAndroid Build Coastguard Worker  *
163*6777b538SAndroid Build Coastguard Worker  * Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr
164*6777b538SAndroid Build Coastguard Worker  * NOTE: the @out parameter will be deallocated when the writer is closed
165*6777b538SAndroid Build Coastguard Worker  *       (if the call succeed.)
166*6777b538SAndroid Build Coastguard Worker  *
167*6777b538SAndroid Build Coastguard Worker  * Returns the new xmlTextWriterPtr or NULL in case of error
168*6777b538SAndroid Build Coastguard Worker  */
169*6777b538SAndroid Build Coastguard Worker xmlTextWriterPtr
xmlNewTextWriter(xmlOutputBufferPtr out)170*6777b538SAndroid Build Coastguard Worker xmlNewTextWriter(xmlOutputBufferPtr out)
171*6777b538SAndroid Build Coastguard Worker {
172*6777b538SAndroid Build Coastguard Worker     xmlTextWriterPtr ret;
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker     ret = (xmlTextWriterPtr) xmlMalloc(sizeof(xmlTextWriter));
175*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
176*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
177*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriter : out of memory!\n");
178*6777b538SAndroid Build Coastguard Worker         return NULL;
179*6777b538SAndroid Build Coastguard Worker     }
180*6777b538SAndroid Build Coastguard Worker     memset(ret, 0, sizeof(xmlTextWriter));
181*6777b538SAndroid Build Coastguard Worker 
182*6777b538SAndroid Build Coastguard Worker     ret->nodes = xmlListCreate(xmlFreeTextWriterStackEntry,
183*6777b538SAndroid Build Coastguard Worker                                xmlCmpTextWriterStackEntry);
184*6777b538SAndroid Build Coastguard Worker     if (ret->nodes == NULL) {
185*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
186*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriter : out of memory!\n");
187*6777b538SAndroid Build Coastguard Worker         xmlFree(ret);
188*6777b538SAndroid Build Coastguard Worker         return NULL;
189*6777b538SAndroid Build Coastguard Worker     }
190*6777b538SAndroid Build Coastguard Worker 
191*6777b538SAndroid Build Coastguard Worker     ret->nsstack = xmlListCreate(xmlFreeTextWriterNsStackEntry,
192*6777b538SAndroid Build Coastguard Worker                                  xmlCmpTextWriterNsStackEntry);
193*6777b538SAndroid Build Coastguard Worker     if (ret->nsstack == NULL) {
194*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
195*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriter : out of memory!\n");
196*6777b538SAndroid Build Coastguard Worker         xmlListDelete(ret->nodes);
197*6777b538SAndroid Build Coastguard Worker         xmlFree(ret);
198*6777b538SAndroid Build Coastguard Worker         return NULL;
199*6777b538SAndroid Build Coastguard Worker     }
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker     ret->out = out;
202*6777b538SAndroid Build Coastguard Worker     ret->ichar = xmlStrdup(BAD_CAST " ");
203*6777b538SAndroid Build Coastguard Worker     ret->qchar = '"';
204*6777b538SAndroid Build Coastguard Worker 
205*6777b538SAndroid Build Coastguard Worker     if (!ret->ichar) {
206*6777b538SAndroid Build Coastguard Worker         xmlListDelete(ret->nodes);
207*6777b538SAndroid Build Coastguard Worker         xmlListDelete(ret->nsstack);
208*6777b538SAndroid Build Coastguard Worker         xmlFree(ret);
209*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
210*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriter : out of memory!\n");
211*6777b538SAndroid Build Coastguard Worker         return NULL;
212*6777b538SAndroid Build Coastguard Worker     }
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker     ret->doc = xmlNewDoc(NULL);
215*6777b538SAndroid Build Coastguard Worker 
216*6777b538SAndroid Build Coastguard Worker     ret->no_doc_free = 0;
217*6777b538SAndroid Build Coastguard Worker 
218*6777b538SAndroid Build Coastguard Worker     return ret;
219*6777b538SAndroid Build Coastguard Worker }
220*6777b538SAndroid Build Coastguard Worker 
221*6777b538SAndroid Build Coastguard Worker /**
222*6777b538SAndroid Build Coastguard Worker  * xmlNewTextWriterFilename:
223*6777b538SAndroid Build Coastguard Worker  * @uri:  the URI of the resource for the output
224*6777b538SAndroid Build Coastguard Worker  * @compression:  compress the output?
225*6777b538SAndroid Build Coastguard Worker  *
226*6777b538SAndroid Build Coastguard Worker  * Create a new xmlNewTextWriter structure with @uri as output
227*6777b538SAndroid Build Coastguard Worker  *
228*6777b538SAndroid Build Coastguard Worker  * Returns the new xmlTextWriterPtr or NULL in case of error
229*6777b538SAndroid Build Coastguard Worker  */
230*6777b538SAndroid Build Coastguard Worker xmlTextWriterPtr
xmlNewTextWriterFilename(const char * uri,int compression)231*6777b538SAndroid Build Coastguard Worker xmlNewTextWriterFilename(const char *uri, int compression)
232*6777b538SAndroid Build Coastguard Worker {
233*6777b538SAndroid Build Coastguard Worker     xmlTextWriterPtr ret;
234*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr out;
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker     out = xmlOutputBufferCreateFilename(uri, NULL, compression);
237*6777b538SAndroid Build Coastguard Worker     if (out == NULL) {
238*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_IO_EIO,
239*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterFilename : cannot open uri\n");
240*6777b538SAndroid Build Coastguard Worker         return NULL;
241*6777b538SAndroid Build Coastguard Worker     }
242*6777b538SAndroid Build Coastguard Worker 
243*6777b538SAndroid Build Coastguard Worker     ret = xmlNewTextWriter(out);
244*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
245*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
246*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterFilename : out of memory!\n");
247*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferClose(out);
248*6777b538SAndroid Build Coastguard Worker         return NULL;
249*6777b538SAndroid Build Coastguard Worker     }
250*6777b538SAndroid Build Coastguard Worker 
251*6777b538SAndroid Build Coastguard Worker     ret->indent = 0;
252*6777b538SAndroid Build Coastguard Worker     ret->doindent = 0;
253*6777b538SAndroid Build Coastguard Worker     return ret;
254*6777b538SAndroid Build Coastguard Worker }
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker /**
257*6777b538SAndroid Build Coastguard Worker  * xmlNewTextWriterMemory:
258*6777b538SAndroid Build Coastguard Worker  * @buf:  xmlBufferPtr
259*6777b538SAndroid Build Coastguard Worker  * @compression:  compress the output?
260*6777b538SAndroid Build Coastguard Worker  *
261*6777b538SAndroid Build Coastguard Worker  * Create a new xmlNewTextWriter structure with @buf as output
262*6777b538SAndroid Build Coastguard Worker  * TODO: handle compression
263*6777b538SAndroid Build Coastguard Worker  *
264*6777b538SAndroid Build Coastguard Worker  * Returns the new xmlTextWriterPtr or NULL in case of error
265*6777b538SAndroid Build Coastguard Worker  */
266*6777b538SAndroid Build Coastguard Worker xmlTextWriterPtr
xmlNewTextWriterMemory(xmlBufferPtr buf,int compression ATTRIBUTE_UNUSED)267*6777b538SAndroid Build Coastguard Worker xmlNewTextWriterMemory(xmlBufferPtr buf, int compression ATTRIBUTE_UNUSED)
268*6777b538SAndroid Build Coastguard Worker {
269*6777b538SAndroid Build Coastguard Worker     xmlTextWriterPtr ret;
270*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr out;
271*6777b538SAndroid Build Coastguard Worker 
272*6777b538SAndroid Build Coastguard Worker /*::todo handle compression */
273*6777b538SAndroid Build Coastguard Worker     out = xmlOutputBufferCreateBuffer(buf, NULL);
274*6777b538SAndroid Build Coastguard Worker 
275*6777b538SAndroid Build Coastguard Worker     if (out == NULL) {
276*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
277*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterMemory : out of memory!\n");
278*6777b538SAndroid Build Coastguard Worker         return NULL;
279*6777b538SAndroid Build Coastguard Worker     }
280*6777b538SAndroid Build Coastguard Worker 
281*6777b538SAndroid Build Coastguard Worker     ret = xmlNewTextWriter(out);
282*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
283*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
284*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterMemory : out of memory!\n");
285*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferClose(out);
286*6777b538SAndroid Build Coastguard Worker         return NULL;
287*6777b538SAndroid Build Coastguard Worker     }
288*6777b538SAndroid Build Coastguard Worker 
289*6777b538SAndroid Build Coastguard Worker     return ret;
290*6777b538SAndroid Build Coastguard Worker }
291*6777b538SAndroid Build Coastguard Worker 
292*6777b538SAndroid Build Coastguard Worker /**
293*6777b538SAndroid Build Coastguard Worker  * xmlNewTextWriterPushParser:
294*6777b538SAndroid Build Coastguard Worker  * @ctxt: xmlParserCtxtPtr to hold the new XML document tree
295*6777b538SAndroid Build Coastguard Worker  * @compression:  compress the output?
296*6777b538SAndroid Build Coastguard Worker  *
297*6777b538SAndroid Build Coastguard Worker  * Create a new xmlNewTextWriter structure with @ctxt as output
298*6777b538SAndroid Build Coastguard Worker  * NOTE: the @ctxt context will be freed with the resulting writer
299*6777b538SAndroid Build Coastguard Worker  *       (if the call succeeds).
300*6777b538SAndroid Build Coastguard Worker  * TODO: handle compression
301*6777b538SAndroid Build Coastguard Worker  *
302*6777b538SAndroid Build Coastguard Worker  * Returns the new xmlTextWriterPtr or NULL in case of error
303*6777b538SAndroid Build Coastguard Worker  */
304*6777b538SAndroid Build Coastguard Worker xmlTextWriterPtr
xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt,int compression ATTRIBUTE_UNUSED)305*6777b538SAndroid Build Coastguard Worker xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt,
306*6777b538SAndroid Build Coastguard Worker                            int compression ATTRIBUTE_UNUSED)
307*6777b538SAndroid Build Coastguard Worker {
308*6777b538SAndroid Build Coastguard Worker     xmlTextWriterPtr ret;
309*6777b538SAndroid Build Coastguard Worker     xmlOutputBufferPtr out;
310*6777b538SAndroid Build Coastguard Worker 
311*6777b538SAndroid Build Coastguard Worker     if (ctxt == NULL) {
312*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
313*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterPushParser : invalid context!\n");
314*6777b538SAndroid Build Coastguard Worker         return NULL;
315*6777b538SAndroid Build Coastguard Worker     }
316*6777b538SAndroid Build Coastguard Worker 
317*6777b538SAndroid Build Coastguard Worker     out = xmlOutputBufferCreateIO(xmlTextWriterWriteDocCallback,
318*6777b538SAndroid Build Coastguard Worker                                   xmlTextWriterCloseDocCallback,
319*6777b538SAndroid Build Coastguard Worker                                   (void *) ctxt, NULL);
320*6777b538SAndroid Build Coastguard Worker     if (out == NULL) {
321*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
322*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterPushParser : error at xmlOutputBufferCreateIO!\n");
323*6777b538SAndroid Build Coastguard Worker         return NULL;
324*6777b538SAndroid Build Coastguard Worker     }
325*6777b538SAndroid Build Coastguard Worker 
326*6777b538SAndroid Build Coastguard Worker     ret = xmlNewTextWriter(out);
327*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
328*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
329*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterPushParser : error at xmlNewTextWriter!\n");
330*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferClose(out);
331*6777b538SAndroid Build Coastguard Worker         return NULL;
332*6777b538SAndroid Build Coastguard Worker     }
333*6777b538SAndroid Build Coastguard Worker 
334*6777b538SAndroid Build Coastguard Worker     ret->ctxt = ctxt;
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker     return ret;
337*6777b538SAndroid Build Coastguard Worker }
338*6777b538SAndroid Build Coastguard Worker 
339*6777b538SAndroid Build Coastguard Worker /**
340*6777b538SAndroid Build Coastguard Worker  * xmlNewTextWriterDoc:
341*6777b538SAndroid Build Coastguard Worker  * @doc: address of a xmlDocPtr to hold the new XML document tree
342*6777b538SAndroid Build Coastguard Worker  * @compression:  compress the output?
343*6777b538SAndroid Build Coastguard Worker  *
344*6777b538SAndroid Build Coastguard Worker  * Create a new xmlNewTextWriter structure with @*doc as output
345*6777b538SAndroid Build Coastguard Worker  *
346*6777b538SAndroid Build Coastguard Worker  * Returns the new xmlTextWriterPtr or NULL in case of error
347*6777b538SAndroid Build Coastguard Worker  */
348*6777b538SAndroid Build Coastguard Worker xmlTextWriterPtr
xmlNewTextWriterDoc(xmlDocPtr * doc,int compression)349*6777b538SAndroid Build Coastguard Worker xmlNewTextWriterDoc(xmlDocPtr * doc, int compression)
350*6777b538SAndroid Build Coastguard Worker {
351*6777b538SAndroid Build Coastguard Worker     xmlTextWriterPtr ret;
352*6777b538SAndroid Build Coastguard Worker     xmlSAXHandler saxHandler;
353*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
354*6777b538SAndroid Build Coastguard Worker 
355*6777b538SAndroid Build Coastguard Worker     memset(&saxHandler, '\0', sizeof(saxHandler));
356*6777b538SAndroid Build Coastguard Worker     xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
357*6777b538SAndroid Build Coastguard Worker     saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
358*6777b538SAndroid Build Coastguard Worker     saxHandler.startElement = xmlSAX2StartElement;
359*6777b538SAndroid Build Coastguard Worker     saxHandler.endElement = xmlSAX2EndElement;
360*6777b538SAndroid Build Coastguard Worker 
361*6777b538SAndroid Build Coastguard Worker     ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
362*6777b538SAndroid Build Coastguard Worker     if (ctxt == NULL) {
363*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
364*6777b538SAndroid Build Coastguard Worker                 "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
365*6777b538SAndroid Build Coastguard Worker         return NULL;
366*6777b538SAndroid Build Coastguard Worker     }
367*6777b538SAndroid Build Coastguard Worker     /*
368*6777b538SAndroid Build Coastguard Worker      * For some reason this seems to completely break if node names
369*6777b538SAndroid Build Coastguard Worker      * are interned.
370*6777b538SAndroid Build Coastguard Worker      */
371*6777b538SAndroid Build Coastguard Worker     ctxt->dictNames = 0;
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker     ctxt->myDoc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
374*6777b538SAndroid Build Coastguard Worker     if (ctxt->myDoc == NULL) {
375*6777b538SAndroid Build Coastguard Worker         xmlFreeParserCtxt(ctxt);
376*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
377*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterDoc : error at xmlNewDoc!\n");
378*6777b538SAndroid Build Coastguard Worker         return NULL;
379*6777b538SAndroid Build Coastguard Worker     }
380*6777b538SAndroid Build Coastguard Worker 
381*6777b538SAndroid Build Coastguard Worker     ret = xmlNewTextWriterPushParser(ctxt, compression);
382*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
383*6777b538SAndroid Build Coastguard Worker         xmlFreeDoc(ctxt->myDoc);
384*6777b538SAndroid Build Coastguard Worker         xmlFreeParserCtxt(ctxt);
385*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
386*6777b538SAndroid Build Coastguard Worker                 "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
387*6777b538SAndroid Build Coastguard Worker         return NULL;
388*6777b538SAndroid Build Coastguard Worker     }
389*6777b538SAndroid Build Coastguard Worker 
390*6777b538SAndroid Build Coastguard Worker     xmlSetDocCompressMode(ctxt->myDoc, compression);
391*6777b538SAndroid Build Coastguard Worker 
392*6777b538SAndroid Build Coastguard Worker     if (doc != NULL) {
393*6777b538SAndroid Build Coastguard Worker         *doc = ctxt->myDoc;
394*6777b538SAndroid Build Coastguard Worker 	ret->no_doc_free = 1;
395*6777b538SAndroid Build Coastguard Worker     }
396*6777b538SAndroid Build Coastguard Worker 
397*6777b538SAndroid Build Coastguard Worker     return ret;
398*6777b538SAndroid Build Coastguard Worker }
399*6777b538SAndroid Build Coastguard Worker 
400*6777b538SAndroid Build Coastguard Worker /**
401*6777b538SAndroid Build Coastguard Worker  * xmlNewTextWriterTree:
402*6777b538SAndroid Build Coastguard Worker  * @doc: xmlDocPtr
403*6777b538SAndroid Build Coastguard Worker  * @node: xmlNodePtr or NULL for doc->children
404*6777b538SAndroid Build Coastguard Worker  * @compression:  compress the output?
405*6777b538SAndroid Build Coastguard Worker  *
406*6777b538SAndroid Build Coastguard Worker  * Create a new xmlNewTextWriter structure with @doc as output
407*6777b538SAndroid Build Coastguard Worker  * starting at @node
408*6777b538SAndroid Build Coastguard Worker  *
409*6777b538SAndroid Build Coastguard Worker  * Returns the new xmlTextWriterPtr or NULL in case of error
410*6777b538SAndroid Build Coastguard Worker  */
411*6777b538SAndroid Build Coastguard Worker xmlTextWriterPtr
xmlNewTextWriterTree(xmlDocPtr doc,xmlNodePtr node,int compression)412*6777b538SAndroid Build Coastguard Worker xmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression)
413*6777b538SAndroid Build Coastguard Worker {
414*6777b538SAndroid Build Coastguard Worker     xmlTextWriterPtr ret;
415*6777b538SAndroid Build Coastguard Worker     xmlSAXHandler saxHandler;
416*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt;
417*6777b538SAndroid Build Coastguard Worker 
418*6777b538SAndroid Build Coastguard Worker     if (doc == NULL) {
419*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
420*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterTree : invalid document tree!\n");
421*6777b538SAndroid Build Coastguard Worker         return NULL;
422*6777b538SAndroid Build Coastguard Worker     }
423*6777b538SAndroid Build Coastguard Worker 
424*6777b538SAndroid Build Coastguard Worker     memset(&saxHandler, '\0', sizeof(saxHandler));
425*6777b538SAndroid Build Coastguard Worker     xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
426*6777b538SAndroid Build Coastguard Worker     saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
427*6777b538SAndroid Build Coastguard Worker     saxHandler.startElement = xmlSAX2StartElement;
428*6777b538SAndroid Build Coastguard Worker     saxHandler.endElement = xmlSAX2EndElement;
429*6777b538SAndroid Build Coastguard Worker 
430*6777b538SAndroid Build Coastguard Worker     ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
431*6777b538SAndroid Build Coastguard Worker     if (ctxt == NULL) {
432*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
433*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
434*6777b538SAndroid Build Coastguard Worker         return NULL;
435*6777b538SAndroid Build Coastguard Worker     }
436*6777b538SAndroid Build Coastguard Worker     /*
437*6777b538SAndroid Build Coastguard Worker      * For some reason this seems to completely break if node names
438*6777b538SAndroid Build Coastguard Worker      * are interned.
439*6777b538SAndroid Build Coastguard Worker      */
440*6777b538SAndroid Build Coastguard Worker     ctxt->dictNames = 0;
441*6777b538SAndroid Build Coastguard Worker 
442*6777b538SAndroid Build Coastguard Worker     ret = xmlNewTextWriterPushParser(ctxt, compression);
443*6777b538SAndroid Build Coastguard Worker     if (ret == NULL) {
444*6777b538SAndroid Build Coastguard Worker         xmlFreeParserCtxt(ctxt);
445*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
446*6777b538SAndroid Build Coastguard Worker                         "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
447*6777b538SAndroid Build Coastguard Worker         return NULL;
448*6777b538SAndroid Build Coastguard Worker     }
449*6777b538SAndroid Build Coastguard Worker 
450*6777b538SAndroid Build Coastguard Worker     ctxt->myDoc = doc;
451*6777b538SAndroid Build Coastguard Worker     ctxt->node = node;
452*6777b538SAndroid Build Coastguard Worker     ret->no_doc_free = 1;
453*6777b538SAndroid Build Coastguard Worker 
454*6777b538SAndroid Build Coastguard Worker     xmlSetDocCompressMode(doc, compression);
455*6777b538SAndroid Build Coastguard Worker 
456*6777b538SAndroid Build Coastguard Worker     return ret;
457*6777b538SAndroid Build Coastguard Worker }
458*6777b538SAndroid Build Coastguard Worker 
459*6777b538SAndroid Build Coastguard Worker /**
460*6777b538SAndroid Build Coastguard Worker  * xmlFreeTextWriter:
461*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
462*6777b538SAndroid Build Coastguard Worker  *
463*6777b538SAndroid Build Coastguard Worker  * Deallocate all the resources associated to the writer
464*6777b538SAndroid Build Coastguard Worker  */
465*6777b538SAndroid Build Coastguard Worker void
xmlFreeTextWriter(xmlTextWriterPtr writer)466*6777b538SAndroid Build Coastguard Worker xmlFreeTextWriter(xmlTextWriterPtr writer)
467*6777b538SAndroid Build Coastguard Worker {
468*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
469*6777b538SAndroid Build Coastguard Worker         return;
470*6777b538SAndroid Build Coastguard Worker 
471*6777b538SAndroid Build Coastguard Worker     if (writer->out != NULL)
472*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferClose(writer->out);
473*6777b538SAndroid Build Coastguard Worker 
474*6777b538SAndroid Build Coastguard Worker     if (writer->nodes != NULL)
475*6777b538SAndroid Build Coastguard Worker         xmlListDelete(writer->nodes);
476*6777b538SAndroid Build Coastguard Worker 
477*6777b538SAndroid Build Coastguard Worker     if (writer->nsstack != NULL)
478*6777b538SAndroid Build Coastguard Worker         xmlListDelete(writer->nsstack);
479*6777b538SAndroid Build Coastguard Worker 
480*6777b538SAndroid Build Coastguard Worker     if (writer->ctxt != NULL) {
481*6777b538SAndroid Build Coastguard Worker         if ((writer->ctxt->myDoc != NULL) && (writer->no_doc_free == 0)) {
482*6777b538SAndroid Build Coastguard Worker 	    xmlFreeDoc(writer->ctxt->myDoc);
483*6777b538SAndroid Build Coastguard Worker 	    writer->ctxt->myDoc = NULL;
484*6777b538SAndroid Build Coastguard Worker 	}
485*6777b538SAndroid Build Coastguard Worker         xmlFreeParserCtxt(writer->ctxt);
486*6777b538SAndroid Build Coastguard Worker     }
487*6777b538SAndroid Build Coastguard Worker 
488*6777b538SAndroid Build Coastguard Worker     if (writer->doc != NULL)
489*6777b538SAndroid Build Coastguard Worker         xmlFreeDoc(writer->doc);
490*6777b538SAndroid Build Coastguard Worker 
491*6777b538SAndroid Build Coastguard Worker     if (writer->ichar != NULL)
492*6777b538SAndroid Build Coastguard Worker         xmlFree(writer->ichar);
493*6777b538SAndroid Build Coastguard Worker     xmlFree(writer);
494*6777b538SAndroid Build Coastguard Worker }
495*6777b538SAndroid Build Coastguard Worker 
496*6777b538SAndroid Build Coastguard Worker /**
497*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartDocument:
498*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
499*6777b538SAndroid Build Coastguard Worker  * @version:  the xml version ("1.0") or NULL for default ("1.0")
500*6777b538SAndroid Build Coastguard Worker  * @encoding:  the encoding or NULL for default
501*6777b538SAndroid Build Coastguard Worker  * @standalone: "yes" or "no" or NULL for default
502*6777b538SAndroid Build Coastguard Worker  *
503*6777b538SAndroid Build Coastguard Worker  * Start a new xml document
504*6777b538SAndroid Build Coastguard Worker  *
505*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
506*6777b538SAndroid Build Coastguard Worker  */
507*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartDocument(xmlTextWriterPtr writer,const char * version,const char * encoding,const char * standalone)508*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version,
509*6777b538SAndroid Build Coastguard Worker                            const char *encoding, const char *standalone)
510*6777b538SAndroid Build Coastguard Worker {
511*6777b538SAndroid Build Coastguard Worker     int count;
512*6777b538SAndroid Build Coastguard Worker     int sum;
513*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
514*6777b538SAndroid Build Coastguard Worker     xmlCharEncodingHandlerPtr encoder;
515*6777b538SAndroid Build Coastguard Worker 
516*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (writer->out == NULL)) {
517*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
518*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDocument : invalid writer!\n");
519*6777b538SAndroid Build Coastguard Worker         return -1;
520*6777b538SAndroid Build Coastguard Worker     }
521*6777b538SAndroid Build Coastguard Worker 
522*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
523*6777b538SAndroid Build Coastguard Worker     if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
524*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
525*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDocument : not allowed in this context!\n");
526*6777b538SAndroid Build Coastguard Worker         return -1;
527*6777b538SAndroid Build Coastguard Worker     }
528*6777b538SAndroid Build Coastguard Worker 
529*6777b538SAndroid Build Coastguard Worker     encoder = NULL;
530*6777b538SAndroid Build Coastguard Worker     if (encoding != NULL) {
531*6777b538SAndroid Build Coastguard Worker         encoder = xmlFindCharEncodingHandler(encoding);
532*6777b538SAndroid Build Coastguard Worker         if (encoder == NULL) {
533*6777b538SAndroid Build Coastguard Worker             xmlWriterErrMsg(writer, XML_ERR_UNSUPPORTED_ENCODING,
534*6777b538SAndroid Build Coastguard Worker                             "xmlTextWriterStartDocument : unsupported encoding\n");
535*6777b538SAndroid Build Coastguard Worker             return -1;
536*6777b538SAndroid Build Coastguard Worker         }
537*6777b538SAndroid Build Coastguard Worker     }
538*6777b538SAndroid Build Coastguard Worker 
539*6777b538SAndroid Build Coastguard Worker     writer->out->encoder = encoder;
540*6777b538SAndroid Build Coastguard Worker     if (encoder != NULL) {
541*6777b538SAndroid Build Coastguard Worker 	if (writer->out->conv == NULL) {
542*6777b538SAndroid Build Coastguard Worker 	    writer->out->conv = xmlBufCreateSize(4000);
543*6777b538SAndroid Build Coastguard Worker 	}
544*6777b538SAndroid Build Coastguard Worker         xmlCharEncOutput(writer->out, 1);
545*6777b538SAndroid Build Coastguard Worker         if ((writer->doc != NULL) && (writer->doc->encoding == NULL))
546*6777b538SAndroid Build Coastguard Worker             writer->doc->encoding = xmlStrdup((xmlChar *)writer->out->encoder->name);
547*6777b538SAndroid Build Coastguard Worker     } else
548*6777b538SAndroid Build Coastguard Worker         writer->out->conv = NULL;
549*6777b538SAndroid Build Coastguard Worker 
550*6777b538SAndroid Build Coastguard Worker     sum = 0;
551*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<?xml version=");
552*6777b538SAndroid Build Coastguard Worker     if (count < 0)
553*6777b538SAndroid Build Coastguard Worker         return -1;
554*6777b538SAndroid Build Coastguard Worker     sum += count;
555*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
556*6777b538SAndroid Build Coastguard Worker     if (count < 0)
557*6777b538SAndroid Build Coastguard Worker         return -1;
558*6777b538SAndroid Build Coastguard Worker     sum += count;
559*6777b538SAndroid Build Coastguard Worker     if (version != 0)
560*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, version);
561*6777b538SAndroid Build Coastguard Worker     else
562*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "1.0");
563*6777b538SAndroid Build Coastguard Worker     if (count < 0)
564*6777b538SAndroid Build Coastguard Worker         return -1;
565*6777b538SAndroid Build Coastguard Worker     sum += count;
566*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
567*6777b538SAndroid Build Coastguard Worker     if (count < 0)
568*6777b538SAndroid Build Coastguard Worker         return -1;
569*6777b538SAndroid Build Coastguard Worker     sum += count;
570*6777b538SAndroid Build Coastguard Worker     if (writer->out->encoder != 0) {
571*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, " encoding=");
572*6777b538SAndroid Build Coastguard Worker         if (count < 0)
573*6777b538SAndroid Build Coastguard Worker             return -1;
574*6777b538SAndroid Build Coastguard Worker         sum += count;
575*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
576*6777b538SAndroid Build Coastguard Worker         if (count < 0)
577*6777b538SAndroid Build Coastguard Worker             return -1;
578*6777b538SAndroid Build Coastguard Worker         sum += count;
579*6777b538SAndroid Build Coastguard Worker         count =
580*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWriteString(writer->out,
581*6777b538SAndroid Build Coastguard Worker                                        writer->out->encoder->name);
582*6777b538SAndroid Build Coastguard Worker         if (count < 0)
583*6777b538SAndroid Build Coastguard Worker             return -1;
584*6777b538SAndroid Build Coastguard Worker         sum += count;
585*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
586*6777b538SAndroid Build Coastguard Worker         if (count < 0)
587*6777b538SAndroid Build Coastguard Worker             return -1;
588*6777b538SAndroid Build Coastguard Worker         sum += count;
589*6777b538SAndroid Build Coastguard Worker     }
590*6777b538SAndroid Build Coastguard Worker 
591*6777b538SAndroid Build Coastguard Worker     if (standalone != 0) {
592*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, " standalone=");
593*6777b538SAndroid Build Coastguard Worker         if (count < 0)
594*6777b538SAndroid Build Coastguard Worker             return -1;
595*6777b538SAndroid Build Coastguard Worker         sum += count;
596*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
597*6777b538SAndroid Build Coastguard Worker         if (count < 0)
598*6777b538SAndroid Build Coastguard Worker             return -1;
599*6777b538SAndroid Build Coastguard Worker         sum += count;
600*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, standalone);
601*6777b538SAndroid Build Coastguard Worker         if (count < 0)
602*6777b538SAndroid Build Coastguard Worker             return -1;
603*6777b538SAndroid Build Coastguard Worker         sum += count;
604*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
605*6777b538SAndroid Build Coastguard Worker         if (count < 0)
606*6777b538SAndroid Build Coastguard Worker             return -1;
607*6777b538SAndroid Build Coastguard Worker         sum += count;
608*6777b538SAndroid Build Coastguard Worker     }
609*6777b538SAndroid Build Coastguard Worker 
610*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "?>\n");
611*6777b538SAndroid Build Coastguard Worker     if (count < 0)
612*6777b538SAndroid Build Coastguard Worker         return -1;
613*6777b538SAndroid Build Coastguard Worker     sum += count;
614*6777b538SAndroid Build Coastguard Worker 
615*6777b538SAndroid Build Coastguard Worker     return sum;
616*6777b538SAndroid Build Coastguard Worker }
617*6777b538SAndroid Build Coastguard Worker 
618*6777b538SAndroid Build Coastguard Worker /**
619*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndDocument:
620*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
621*6777b538SAndroid Build Coastguard Worker  *
622*6777b538SAndroid Build Coastguard Worker  * End an xml document. All open elements are closed, and
623*6777b538SAndroid Build Coastguard Worker  * the content is flushed to the output.
624*6777b538SAndroid Build Coastguard Worker  *
625*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written or -1 in case of error
626*6777b538SAndroid Build Coastguard Worker  */
627*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndDocument(xmlTextWriterPtr writer)628*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndDocument(xmlTextWriterPtr writer)
629*6777b538SAndroid Build Coastguard Worker {
630*6777b538SAndroid Build Coastguard Worker     int count;
631*6777b538SAndroid Build Coastguard Worker     int sum;
632*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
633*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
634*6777b538SAndroid Build Coastguard Worker 
635*6777b538SAndroid Build Coastguard Worker     if (writer == NULL) {
636*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
637*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterEndDocument : invalid writer!\n");
638*6777b538SAndroid Build Coastguard Worker         return -1;
639*6777b538SAndroid Build Coastguard Worker     }
640*6777b538SAndroid Build Coastguard Worker 
641*6777b538SAndroid Build Coastguard Worker     sum = 0;
642*6777b538SAndroid Build Coastguard Worker     while ((lk = xmlListFront(writer->nodes)) != NULL) {
643*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
644*6777b538SAndroid Build Coastguard Worker         if (p == 0)
645*6777b538SAndroid Build Coastguard Worker             break;
646*6777b538SAndroid Build Coastguard Worker         switch (p->state) {
647*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_NAME:
648*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_ATTRIBUTE:
649*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_TEXT:
650*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterEndElement(writer);
651*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
652*6777b538SAndroid Build Coastguard Worker                     return -1;
653*6777b538SAndroid Build Coastguard Worker                 sum += count;
654*6777b538SAndroid Build Coastguard Worker                 break;
655*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_PI:
656*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_PI_TEXT:
657*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterEndPI(writer);
658*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
659*6777b538SAndroid Build Coastguard Worker                     return -1;
660*6777b538SAndroid Build Coastguard Worker                 sum += count;
661*6777b538SAndroid Build Coastguard Worker                 break;
662*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_CDATA:
663*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterEndCDATA(writer);
664*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
665*6777b538SAndroid Build Coastguard Worker                     return -1;
666*6777b538SAndroid Build Coastguard Worker                 sum += count;
667*6777b538SAndroid Build Coastguard Worker                 break;
668*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD:
669*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_TEXT:
670*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ELEM:
671*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ELEM_TEXT:
672*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ATTL:
673*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ATTL_TEXT:
674*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ENTY:
675*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ENTY_TEXT:
676*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_PENT:
677*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterEndDTD(writer);
678*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
679*6777b538SAndroid Build Coastguard Worker                     return -1;
680*6777b538SAndroid Build Coastguard Worker                 sum += count;
681*6777b538SAndroid Build Coastguard Worker                 break;
682*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_COMMENT:
683*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterEndComment(writer);
684*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
685*6777b538SAndroid Build Coastguard Worker                     return -1;
686*6777b538SAndroid Build Coastguard Worker                 sum += count;
687*6777b538SAndroid Build Coastguard Worker                 break;
688*6777b538SAndroid Build Coastguard Worker             default:
689*6777b538SAndroid Build Coastguard Worker                 break;
690*6777b538SAndroid Build Coastguard Worker         }
691*6777b538SAndroid Build Coastguard Worker     }
692*6777b538SAndroid Build Coastguard Worker 
693*6777b538SAndroid Build Coastguard Worker     if (!writer->indent) {
694*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "\n");
695*6777b538SAndroid Build Coastguard Worker         if (count < 0)
696*6777b538SAndroid Build Coastguard Worker             return -1;
697*6777b538SAndroid Build Coastguard Worker         sum += count;
698*6777b538SAndroid Build Coastguard Worker     }
699*6777b538SAndroid Build Coastguard Worker 
700*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterFlush(writer);
701*6777b538SAndroid Build Coastguard Worker     if (count < 0)
702*6777b538SAndroid Build Coastguard Worker         return -1;
703*6777b538SAndroid Build Coastguard Worker     sum += count;
704*6777b538SAndroid Build Coastguard Worker 
705*6777b538SAndroid Build Coastguard Worker 
706*6777b538SAndroid Build Coastguard Worker     return sum;
707*6777b538SAndroid Build Coastguard Worker }
708*6777b538SAndroid Build Coastguard Worker 
709*6777b538SAndroid Build Coastguard Worker /**
710*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartComment:
711*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
712*6777b538SAndroid Build Coastguard Worker  *
713*6777b538SAndroid Build Coastguard Worker  * Start an xml comment.
714*6777b538SAndroid Build Coastguard Worker  *
715*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
716*6777b538SAndroid Build Coastguard Worker  */
717*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartComment(xmlTextWriterPtr writer)718*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartComment(xmlTextWriterPtr writer)
719*6777b538SAndroid Build Coastguard Worker {
720*6777b538SAndroid Build Coastguard Worker     int count;
721*6777b538SAndroid Build Coastguard Worker     int sum;
722*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
723*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
724*6777b538SAndroid Build Coastguard Worker 
725*6777b538SAndroid Build Coastguard Worker     if (writer == NULL) {
726*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
727*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartComment : invalid writer!\n");
728*6777b538SAndroid Build Coastguard Worker         return -1;
729*6777b538SAndroid Build Coastguard Worker     }
730*6777b538SAndroid Build Coastguard Worker 
731*6777b538SAndroid Build Coastguard Worker     sum = 0;
732*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
733*6777b538SAndroid Build Coastguard Worker     if (lk != 0) {
734*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
735*6777b538SAndroid Build Coastguard Worker         if (p != 0) {
736*6777b538SAndroid Build Coastguard Worker             switch (p->state) {
737*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_TEXT:
738*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NONE:
739*6777b538SAndroid Build Coastguard Worker                     break;
740*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NAME:
741*6777b538SAndroid Build Coastguard Worker                     /* Output namespace declarations */
742*6777b538SAndroid Build Coastguard Worker                     count = xmlTextWriterOutputNSDecl(writer);
743*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
744*6777b538SAndroid Build Coastguard Worker                         return -1;
745*6777b538SAndroid Build Coastguard Worker                     sum += count;
746*6777b538SAndroid Build Coastguard Worker                     count = xmlOutputBufferWriteString(writer->out, ">");
747*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
748*6777b538SAndroid Build Coastguard Worker                         return -1;
749*6777b538SAndroid Build Coastguard Worker                     sum += count;
750*6777b538SAndroid Build Coastguard Worker                     if (writer->indent) {
751*6777b538SAndroid Build Coastguard Worker                         count =
752*6777b538SAndroid Build Coastguard Worker                             xmlOutputBufferWriteString(writer->out, "\n");
753*6777b538SAndroid Build Coastguard Worker                         if (count < 0)
754*6777b538SAndroid Build Coastguard Worker                             return -1;
755*6777b538SAndroid Build Coastguard Worker                         sum += count;
756*6777b538SAndroid Build Coastguard Worker                     }
757*6777b538SAndroid Build Coastguard Worker                     p->state = XML_TEXTWRITER_TEXT;
758*6777b538SAndroid Build Coastguard Worker                     break;
759*6777b538SAndroid Build Coastguard Worker                 default:
760*6777b538SAndroid Build Coastguard Worker                     return -1;
761*6777b538SAndroid Build Coastguard Worker             }
762*6777b538SAndroid Build Coastguard Worker         }
763*6777b538SAndroid Build Coastguard Worker     }
764*6777b538SAndroid Build Coastguard Worker 
765*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *)
766*6777b538SAndroid Build Coastguard Worker         xmlMalloc(sizeof(xmlTextWriterStackEntry));
767*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
768*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
769*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartElement : out of memory!\n");
770*6777b538SAndroid Build Coastguard Worker         return -1;
771*6777b538SAndroid Build Coastguard Worker     }
772*6777b538SAndroid Build Coastguard Worker 
773*6777b538SAndroid Build Coastguard Worker     p->name = NULL;
774*6777b538SAndroid Build Coastguard Worker     p->state = XML_TEXTWRITER_COMMENT;
775*6777b538SAndroid Build Coastguard Worker 
776*6777b538SAndroid Build Coastguard Worker     xmlListPushFront(writer->nodes, p);
777*6777b538SAndroid Build Coastguard Worker 
778*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
779*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteIndent(writer);
780*6777b538SAndroid Build Coastguard Worker         if (count < 0)
781*6777b538SAndroid Build Coastguard Worker             return -1;
782*6777b538SAndroid Build Coastguard Worker         sum += count;
783*6777b538SAndroid Build Coastguard Worker     }
784*6777b538SAndroid Build Coastguard Worker 
785*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<!--");
786*6777b538SAndroid Build Coastguard Worker     if (count < 0)
787*6777b538SAndroid Build Coastguard Worker         return -1;
788*6777b538SAndroid Build Coastguard Worker     sum += count;
789*6777b538SAndroid Build Coastguard Worker 
790*6777b538SAndroid Build Coastguard Worker     return sum;
791*6777b538SAndroid Build Coastguard Worker }
792*6777b538SAndroid Build Coastguard Worker 
793*6777b538SAndroid Build Coastguard Worker /**
794*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndComment:
795*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
796*6777b538SAndroid Build Coastguard Worker  *
797*6777b538SAndroid Build Coastguard Worker  * End the current xml comment.
798*6777b538SAndroid Build Coastguard Worker  *
799*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
800*6777b538SAndroid Build Coastguard Worker  */
801*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndComment(xmlTextWriterPtr writer)802*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndComment(xmlTextWriterPtr writer)
803*6777b538SAndroid Build Coastguard Worker {
804*6777b538SAndroid Build Coastguard Worker     int count;
805*6777b538SAndroid Build Coastguard Worker     int sum;
806*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
807*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
808*6777b538SAndroid Build Coastguard Worker 
809*6777b538SAndroid Build Coastguard Worker     if (writer == NULL) {
810*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
811*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterEndComment : invalid writer!\n");
812*6777b538SAndroid Build Coastguard Worker         return -1;
813*6777b538SAndroid Build Coastguard Worker     }
814*6777b538SAndroid Build Coastguard Worker 
815*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
816*6777b538SAndroid Build Coastguard Worker     if (lk == 0) {
817*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
818*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterEndComment : not allowed in this context!\n");
819*6777b538SAndroid Build Coastguard Worker         return -1;
820*6777b538SAndroid Build Coastguard Worker     }
821*6777b538SAndroid Build Coastguard Worker 
822*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
823*6777b538SAndroid Build Coastguard Worker     if (p == 0)
824*6777b538SAndroid Build Coastguard Worker         return -1;
825*6777b538SAndroid Build Coastguard Worker 
826*6777b538SAndroid Build Coastguard Worker     sum = 0;
827*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
828*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_COMMENT:
829*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, "-->");
830*6777b538SAndroid Build Coastguard Worker             if (count < 0)
831*6777b538SAndroid Build Coastguard Worker                 return -1;
832*6777b538SAndroid Build Coastguard Worker             sum += count;
833*6777b538SAndroid Build Coastguard Worker             break;
834*6777b538SAndroid Build Coastguard Worker         default:
835*6777b538SAndroid Build Coastguard Worker             return -1;
836*6777b538SAndroid Build Coastguard Worker     }
837*6777b538SAndroid Build Coastguard Worker 
838*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
839*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "\n");
840*6777b538SAndroid Build Coastguard Worker         if (count < 0)
841*6777b538SAndroid Build Coastguard Worker             return -1;
842*6777b538SAndroid Build Coastguard Worker         sum += count;
843*6777b538SAndroid Build Coastguard Worker     }
844*6777b538SAndroid Build Coastguard Worker 
845*6777b538SAndroid Build Coastguard Worker     xmlListPopFront(writer->nodes);
846*6777b538SAndroid Build Coastguard Worker     return sum;
847*6777b538SAndroid Build Coastguard Worker }
848*6777b538SAndroid Build Coastguard Worker 
849*6777b538SAndroid Build Coastguard Worker /**
850*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatComment:
851*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
852*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
853*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
854*6777b538SAndroid Build Coastguard Worker  *
855*6777b538SAndroid Build Coastguard Worker  * Write an xml comment.
856*6777b538SAndroid Build Coastguard Worker  *
857*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
858*6777b538SAndroid Build Coastguard Worker  */
859*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer,const char * format,...)860*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer,
861*6777b538SAndroid Build Coastguard Worker                                 const char *format, ...)
862*6777b538SAndroid Build Coastguard Worker {
863*6777b538SAndroid Build Coastguard Worker     int rc;
864*6777b538SAndroid Build Coastguard Worker     va_list ap;
865*6777b538SAndroid Build Coastguard Worker 
866*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
867*6777b538SAndroid Build Coastguard Worker 
868*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatComment(writer, format, ap);
869*6777b538SAndroid Build Coastguard Worker 
870*6777b538SAndroid Build Coastguard Worker     va_end(ap);
871*6777b538SAndroid Build Coastguard Worker     return rc;
872*6777b538SAndroid Build Coastguard Worker }
873*6777b538SAndroid Build Coastguard Worker 
874*6777b538SAndroid Build Coastguard Worker /**
875*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatComment:
876*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
877*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
878*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
879*6777b538SAndroid Build Coastguard Worker  *
880*6777b538SAndroid Build Coastguard Worker  * Write an xml comment.
881*6777b538SAndroid Build Coastguard Worker  *
882*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
883*6777b538SAndroid Build Coastguard Worker  */
884*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer,const char * format,va_list argptr)885*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer,
886*6777b538SAndroid Build Coastguard Worker                                  const char *format, va_list argptr)
887*6777b538SAndroid Build Coastguard Worker {
888*6777b538SAndroid Build Coastguard Worker     int rc;
889*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
890*6777b538SAndroid Build Coastguard Worker 
891*6777b538SAndroid Build Coastguard Worker     if (writer == NULL) {
892*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
893*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterWriteVFormatComment : invalid writer!\n");
894*6777b538SAndroid Build Coastguard Worker         return -1;
895*6777b538SAndroid Build Coastguard Worker     }
896*6777b538SAndroid Build Coastguard Worker 
897*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
898*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
899*6777b538SAndroid Build Coastguard Worker         return -1;
900*6777b538SAndroid Build Coastguard Worker 
901*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteComment(writer, buf);
902*6777b538SAndroid Build Coastguard Worker 
903*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
904*6777b538SAndroid Build Coastguard Worker     return rc;
905*6777b538SAndroid Build Coastguard Worker }
906*6777b538SAndroid Build Coastguard Worker 
907*6777b538SAndroid Build Coastguard Worker /**
908*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteComment:
909*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
910*6777b538SAndroid Build Coastguard Worker  * @content:  comment string
911*6777b538SAndroid Build Coastguard Worker  *
912*6777b538SAndroid Build Coastguard Worker  * Write an xml comment.
913*6777b538SAndroid Build Coastguard Worker  *
914*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
915*6777b538SAndroid Build Coastguard Worker  */
916*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteComment(xmlTextWriterPtr writer,const xmlChar * content)917*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content)
918*6777b538SAndroid Build Coastguard Worker {
919*6777b538SAndroid Build Coastguard Worker     int count;
920*6777b538SAndroid Build Coastguard Worker     int sum;
921*6777b538SAndroid Build Coastguard Worker 
922*6777b538SAndroid Build Coastguard Worker     sum = 0;
923*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartComment(writer);
924*6777b538SAndroid Build Coastguard Worker     if (count < 0)
925*6777b538SAndroid Build Coastguard Worker         return -1;
926*6777b538SAndroid Build Coastguard Worker     sum += count;
927*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterWriteString(writer, content);
928*6777b538SAndroid Build Coastguard Worker     if (count < 0)
929*6777b538SAndroid Build Coastguard Worker         return -1;
930*6777b538SAndroid Build Coastguard Worker     sum += count;
931*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndComment(writer);
932*6777b538SAndroid Build Coastguard Worker     if (count < 0)
933*6777b538SAndroid Build Coastguard Worker         return -1;
934*6777b538SAndroid Build Coastguard Worker     sum += count;
935*6777b538SAndroid Build Coastguard Worker 
936*6777b538SAndroid Build Coastguard Worker     return sum;
937*6777b538SAndroid Build Coastguard Worker }
938*6777b538SAndroid Build Coastguard Worker 
939*6777b538SAndroid Build Coastguard Worker /**
940*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartElement:
941*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
942*6777b538SAndroid Build Coastguard Worker  * @name:  element name
943*6777b538SAndroid Build Coastguard Worker  *
944*6777b538SAndroid Build Coastguard Worker  * Start an xml element.
945*6777b538SAndroid Build Coastguard Worker  *
946*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
947*6777b538SAndroid Build Coastguard Worker  */
948*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartElement(xmlTextWriterPtr writer,const xmlChar * name)949*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name)
950*6777b538SAndroid Build Coastguard Worker {
951*6777b538SAndroid Build Coastguard Worker     int count;
952*6777b538SAndroid Build Coastguard Worker     int sum;
953*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
954*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
955*6777b538SAndroid Build Coastguard Worker 
956*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (name == NULL) || (*name == '\0'))
957*6777b538SAndroid Build Coastguard Worker         return -1;
958*6777b538SAndroid Build Coastguard Worker 
959*6777b538SAndroid Build Coastguard Worker     sum = 0;
960*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
961*6777b538SAndroid Build Coastguard Worker     if (lk != 0) {
962*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
963*6777b538SAndroid Build Coastguard Worker         if (p != 0) {
964*6777b538SAndroid Build Coastguard Worker             switch (p->state) {
965*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_PI:
966*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_PI_TEXT:
967*6777b538SAndroid Build Coastguard Worker                     return -1;
968*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NONE:
969*6777b538SAndroid Build Coastguard Worker                     break;
970*6777b538SAndroid Build Coastguard Worker 				case XML_TEXTWRITER_ATTRIBUTE:
971*6777b538SAndroid Build Coastguard Worker 					count = xmlTextWriterEndAttribute(writer);
972*6777b538SAndroid Build Coastguard Worker 					if (count < 0)
973*6777b538SAndroid Build Coastguard Worker 						return -1;
974*6777b538SAndroid Build Coastguard Worker 					sum += count;
975*6777b538SAndroid Build Coastguard Worker 					/* fallthrough */
976*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NAME:
977*6777b538SAndroid Build Coastguard Worker                     /* Output namespace declarations */
978*6777b538SAndroid Build Coastguard Worker                     count = xmlTextWriterOutputNSDecl(writer);
979*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
980*6777b538SAndroid Build Coastguard Worker                         return -1;
981*6777b538SAndroid Build Coastguard Worker                     sum += count;
982*6777b538SAndroid Build Coastguard Worker                     count = xmlOutputBufferWriteString(writer->out, ">");
983*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
984*6777b538SAndroid Build Coastguard Worker                         return -1;
985*6777b538SAndroid Build Coastguard Worker                     sum += count;
986*6777b538SAndroid Build Coastguard Worker                     if (writer->indent)
987*6777b538SAndroid Build Coastguard Worker                         count =
988*6777b538SAndroid Build Coastguard Worker                             xmlOutputBufferWriteString(writer->out, "\n");
989*6777b538SAndroid Build Coastguard Worker                     p->state = XML_TEXTWRITER_TEXT;
990*6777b538SAndroid Build Coastguard Worker                     break;
991*6777b538SAndroid Build Coastguard Worker                 default:
992*6777b538SAndroid Build Coastguard Worker                     break;
993*6777b538SAndroid Build Coastguard Worker             }
994*6777b538SAndroid Build Coastguard Worker         }
995*6777b538SAndroid Build Coastguard Worker     }
996*6777b538SAndroid Build Coastguard Worker 
997*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *)
998*6777b538SAndroid Build Coastguard Worker         xmlMalloc(sizeof(xmlTextWriterStackEntry));
999*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
1000*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1001*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartElement : out of memory!\n");
1002*6777b538SAndroid Build Coastguard Worker         return -1;
1003*6777b538SAndroid Build Coastguard Worker     }
1004*6777b538SAndroid Build Coastguard Worker 
1005*6777b538SAndroid Build Coastguard Worker     p->name = xmlStrdup(name);
1006*6777b538SAndroid Build Coastguard Worker     if (p->name == 0) {
1007*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1008*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartElement : out of memory!\n");
1009*6777b538SAndroid Build Coastguard Worker         xmlFree(p);
1010*6777b538SAndroid Build Coastguard Worker         return -1;
1011*6777b538SAndroid Build Coastguard Worker     }
1012*6777b538SAndroid Build Coastguard Worker     p->state = XML_TEXTWRITER_NAME;
1013*6777b538SAndroid Build Coastguard Worker 
1014*6777b538SAndroid Build Coastguard Worker     xmlListPushFront(writer->nodes, p);
1015*6777b538SAndroid Build Coastguard Worker 
1016*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
1017*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteIndent(writer);
1018*6777b538SAndroid Build Coastguard Worker         sum += count;
1019*6777b538SAndroid Build Coastguard Worker     }
1020*6777b538SAndroid Build Coastguard Worker 
1021*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<");
1022*6777b538SAndroid Build Coastguard Worker     if (count < 0)
1023*6777b538SAndroid Build Coastguard Worker         return -1;
1024*6777b538SAndroid Build Coastguard Worker     sum += count;
1025*6777b538SAndroid Build Coastguard Worker     count =
1026*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferWriteString(writer->out, (const char *) p->name);
1027*6777b538SAndroid Build Coastguard Worker     if (count < 0)
1028*6777b538SAndroid Build Coastguard Worker         return -1;
1029*6777b538SAndroid Build Coastguard Worker     sum += count;
1030*6777b538SAndroid Build Coastguard Worker 
1031*6777b538SAndroid Build Coastguard Worker     return sum;
1032*6777b538SAndroid Build Coastguard Worker }
1033*6777b538SAndroid Build Coastguard Worker 
1034*6777b538SAndroid Build Coastguard Worker /**
1035*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartElementNS:
1036*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1037*6777b538SAndroid Build Coastguard Worker  * @prefix:  namespace prefix or NULL
1038*6777b538SAndroid Build Coastguard Worker  * @name:  element local name
1039*6777b538SAndroid Build Coastguard Worker  * @namespaceURI:  namespace URI or NULL
1040*6777b538SAndroid Build Coastguard Worker  *
1041*6777b538SAndroid Build Coastguard Worker  * Start an xml element with namespace support.
1042*6777b538SAndroid Build Coastguard Worker  *
1043*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1044*6777b538SAndroid Build Coastguard Worker  */
1045*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartElementNS(xmlTextWriterPtr writer,const xmlChar * prefix,const xmlChar * name,const xmlChar * namespaceURI)1046*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartElementNS(xmlTextWriterPtr writer,
1047*6777b538SAndroid Build Coastguard Worker                             const xmlChar * prefix, const xmlChar * name,
1048*6777b538SAndroid Build Coastguard Worker                             const xmlChar * namespaceURI)
1049*6777b538SAndroid Build Coastguard Worker {
1050*6777b538SAndroid Build Coastguard Worker     int count;
1051*6777b538SAndroid Build Coastguard Worker     int sum;
1052*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
1053*6777b538SAndroid Build Coastguard Worker 
1054*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (name == NULL) || (*name == '\0'))
1055*6777b538SAndroid Build Coastguard Worker         return -1;
1056*6777b538SAndroid Build Coastguard Worker 
1057*6777b538SAndroid Build Coastguard Worker     buf = NULL;
1058*6777b538SAndroid Build Coastguard Worker     if (prefix != 0) {
1059*6777b538SAndroid Build Coastguard Worker         buf = xmlStrdup(prefix);
1060*6777b538SAndroid Build Coastguard Worker         buf = xmlStrcat(buf, BAD_CAST ":");
1061*6777b538SAndroid Build Coastguard Worker     }
1062*6777b538SAndroid Build Coastguard Worker     buf = xmlStrcat(buf, name);
1063*6777b538SAndroid Build Coastguard Worker 
1064*6777b538SAndroid Build Coastguard Worker     sum = 0;
1065*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartElement(writer, buf);
1066*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
1067*6777b538SAndroid Build Coastguard Worker     if (count < 0)
1068*6777b538SAndroid Build Coastguard Worker         return -1;
1069*6777b538SAndroid Build Coastguard Worker     sum += count;
1070*6777b538SAndroid Build Coastguard Worker 
1071*6777b538SAndroid Build Coastguard Worker     if (namespaceURI != 0) {
1072*6777b538SAndroid Build Coastguard Worker         xmlTextWriterNsStackEntry *p = (xmlTextWriterNsStackEntry *)
1073*6777b538SAndroid Build Coastguard Worker         xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
1074*6777b538SAndroid Build Coastguard Worker         if (p == 0) {
1075*6777b538SAndroid Build Coastguard Worker             xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1076*6777b538SAndroid Build Coastguard Worker                             "xmlTextWriterStartElementNS : out of memory!\n");
1077*6777b538SAndroid Build Coastguard Worker             return -1;
1078*6777b538SAndroid Build Coastguard Worker         }
1079*6777b538SAndroid Build Coastguard Worker 
1080*6777b538SAndroid Build Coastguard Worker         buf = xmlStrdup(BAD_CAST "xmlns");
1081*6777b538SAndroid Build Coastguard Worker         if (prefix != 0) {
1082*6777b538SAndroid Build Coastguard Worker             buf = xmlStrcat(buf, BAD_CAST ":");
1083*6777b538SAndroid Build Coastguard Worker             buf = xmlStrcat(buf, prefix);
1084*6777b538SAndroid Build Coastguard Worker         }
1085*6777b538SAndroid Build Coastguard Worker 
1086*6777b538SAndroid Build Coastguard Worker         p->prefix = buf;
1087*6777b538SAndroid Build Coastguard Worker         p->uri = xmlStrdup(namespaceURI);
1088*6777b538SAndroid Build Coastguard Worker         if (p->uri == 0) {
1089*6777b538SAndroid Build Coastguard Worker             xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1090*6777b538SAndroid Build Coastguard Worker                             "xmlTextWriterStartElementNS : out of memory!\n");
1091*6777b538SAndroid Build Coastguard Worker             xmlFree(p);
1092*6777b538SAndroid Build Coastguard Worker             return -1;
1093*6777b538SAndroid Build Coastguard Worker         }
1094*6777b538SAndroid Build Coastguard Worker         p->elem = xmlListFront(writer->nodes);
1095*6777b538SAndroid Build Coastguard Worker 
1096*6777b538SAndroid Build Coastguard Worker         xmlListPushFront(writer->nsstack, p);
1097*6777b538SAndroid Build Coastguard Worker     }
1098*6777b538SAndroid Build Coastguard Worker 
1099*6777b538SAndroid Build Coastguard Worker     return sum;
1100*6777b538SAndroid Build Coastguard Worker }
1101*6777b538SAndroid Build Coastguard Worker 
1102*6777b538SAndroid Build Coastguard Worker /**
1103*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndElement:
1104*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1105*6777b538SAndroid Build Coastguard Worker  *
1106*6777b538SAndroid Build Coastguard Worker  * End the current xml element.
1107*6777b538SAndroid Build Coastguard Worker  *
1108*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1109*6777b538SAndroid Build Coastguard Worker  */
1110*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndElement(xmlTextWriterPtr writer)1111*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndElement(xmlTextWriterPtr writer)
1112*6777b538SAndroid Build Coastguard Worker {
1113*6777b538SAndroid Build Coastguard Worker     int count;
1114*6777b538SAndroid Build Coastguard Worker     int sum;
1115*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
1116*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
1117*6777b538SAndroid Build Coastguard Worker 
1118*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
1119*6777b538SAndroid Build Coastguard Worker         return -1;
1120*6777b538SAndroid Build Coastguard Worker 
1121*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
1122*6777b538SAndroid Build Coastguard Worker     if (lk == 0) {
1123*6777b538SAndroid Build Coastguard Worker         xmlListDelete(writer->nsstack);
1124*6777b538SAndroid Build Coastguard Worker         writer->nsstack = NULL;
1125*6777b538SAndroid Build Coastguard Worker         return -1;
1126*6777b538SAndroid Build Coastguard Worker     }
1127*6777b538SAndroid Build Coastguard Worker 
1128*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1129*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
1130*6777b538SAndroid Build Coastguard Worker         xmlListDelete(writer->nsstack);
1131*6777b538SAndroid Build Coastguard Worker         writer->nsstack = NULL;
1132*6777b538SAndroid Build Coastguard Worker         return -1;
1133*6777b538SAndroid Build Coastguard Worker     }
1134*6777b538SAndroid Build Coastguard Worker 
1135*6777b538SAndroid Build Coastguard Worker     sum = 0;
1136*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
1137*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_ATTRIBUTE:
1138*6777b538SAndroid Build Coastguard Worker             count = xmlTextWriterEndAttribute(writer);
1139*6777b538SAndroid Build Coastguard Worker             if (count < 0) {
1140*6777b538SAndroid Build Coastguard Worker                 xmlListDelete(writer->nsstack);
1141*6777b538SAndroid Build Coastguard Worker                 writer->nsstack = NULL;
1142*6777b538SAndroid Build Coastguard Worker                 return -1;
1143*6777b538SAndroid Build Coastguard Worker             }
1144*6777b538SAndroid Build Coastguard Worker             sum += count;
1145*6777b538SAndroid Build Coastguard Worker             /* fallthrough */
1146*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_NAME:
1147*6777b538SAndroid Build Coastguard Worker             /* Output namespace declarations */
1148*6777b538SAndroid Build Coastguard Worker             count = xmlTextWriterOutputNSDecl(writer);
1149*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1150*6777b538SAndroid Build Coastguard Worker                 return -1;
1151*6777b538SAndroid Build Coastguard Worker             sum += count;
1152*6777b538SAndroid Build Coastguard Worker 
1153*6777b538SAndroid Build Coastguard Worker             if (writer->indent) /* next element needs indent */
1154*6777b538SAndroid Build Coastguard Worker                 writer->doindent = 1;
1155*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, "/>");
1156*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1157*6777b538SAndroid Build Coastguard Worker                 return -1;
1158*6777b538SAndroid Build Coastguard Worker             sum += count;
1159*6777b538SAndroid Build Coastguard Worker             break;
1160*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_TEXT:
1161*6777b538SAndroid Build Coastguard Worker             if ((writer->indent) && (writer->doindent)) {
1162*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterWriteIndent(writer);
1163*6777b538SAndroid Build Coastguard Worker                 sum += count;
1164*6777b538SAndroid Build Coastguard Worker                 writer->doindent = 1;
1165*6777b538SAndroid Build Coastguard Worker             } else
1166*6777b538SAndroid Build Coastguard Worker                 writer->doindent = 1;
1167*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, "</");
1168*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1169*6777b538SAndroid Build Coastguard Worker                 return -1;
1170*6777b538SAndroid Build Coastguard Worker             sum += count;
1171*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out,
1172*6777b538SAndroid Build Coastguard Worker                                                (const char *) p->name);
1173*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1174*6777b538SAndroid Build Coastguard Worker                 return -1;
1175*6777b538SAndroid Build Coastguard Worker             sum += count;
1176*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, ">");
1177*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1178*6777b538SAndroid Build Coastguard Worker                 return -1;
1179*6777b538SAndroid Build Coastguard Worker             sum += count;
1180*6777b538SAndroid Build Coastguard Worker             break;
1181*6777b538SAndroid Build Coastguard Worker         default:
1182*6777b538SAndroid Build Coastguard Worker             return -1;
1183*6777b538SAndroid Build Coastguard Worker     }
1184*6777b538SAndroid Build Coastguard Worker 
1185*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
1186*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "\n");
1187*6777b538SAndroid Build Coastguard Worker         sum += count;
1188*6777b538SAndroid Build Coastguard Worker     }
1189*6777b538SAndroid Build Coastguard Worker 
1190*6777b538SAndroid Build Coastguard Worker     xmlListPopFront(writer->nodes);
1191*6777b538SAndroid Build Coastguard Worker     return sum;
1192*6777b538SAndroid Build Coastguard Worker }
1193*6777b538SAndroid Build Coastguard Worker 
1194*6777b538SAndroid Build Coastguard Worker /**
1195*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterFullEndElement:
1196*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1197*6777b538SAndroid Build Coastguard Worker  *
1198*6777b538SAndroid Build Coastguard Worker  * End the current xml element. Writes an end tag even if the element is empty
1199*6777b538SAndroid Build Coastguard Worker  *
1200*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1201*6777b538SAndroid Build Coastguard Worker  */
1202*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterFullEndElement(xmlTextWriterPtr writer)1203*6777b538SAndroid Build Coastguard Worker xmlTextWriterFullEndElement(xmlTextWriterPtr writer)
1204*6777b538SAndroid Build Coastguard Worker {
1205*6777b538SAndroid Build Coastguard Worker     int count;
1206*6777b538SAndroid Build Coastguard Worker     int sum;
1207*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
1208*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
1209*6777b538SAndroid Build Coastguard Worker 
1210*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
1211*6777b538SAndroid Build Coastguard Worker         return -1;
1212*6777b538SAndroid Build Coastguard Worker 
1213*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
1214*6777b538SAndroid Build Coastguard Worker     if (lk == 0)
1215*6777b538SAndroid Build Coastguard Worker         return -1;
1216*6777b538SAndroid Build Coastguard Worker 
1217*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1218*6777b538SAndroid Build Coastguard Worker     if (p == 0)
1219*6777b538SAndroid Build Coastguard Worker         return -1;
1220*6777b538SAndroid Build Coastguard Worker 
1221*6777b538SAndroid Build Coastguard Worker     sum = 0;
1222*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
1223*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_ATTRIBUTE:
1224*6777b538SAndroid Build Coastguard Worker             count = xmlTextWriterEndAttribute(writer);
1225*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1226*6777b538SAndroid Build Coastguard Worker                 return -1;
1227*6777b538SAndroid Build Coastguard Worker             sum += count;
1228*6777b538SAndroid Build Coastguard Worker             /* fallthrough */
1229*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_NAME:
1230*6777b538SAndroid Build Coastguard Worker             /* Output namespace declarations */
1231*6777b538SAndroid Build Coastguard Worker             count = xmlTextWriterOutputNSDecl(writer);
1232*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1233*6777b538SAndroid Build Coastguard Worker                 return -1;
1234*6777b538SAndroid Build Coastguard Worker             sum += count;
1235*6777b538SAndroid Build Coastguard Worker 
1236*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, ">");
1237*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1238*6777b538SAndroid Build Coastguard Worker                 return -1;
1239*6777b538SAndroid Build Coastguard Worker             sum += count;
1240*6777b538SAndroid Build Coastguard Worker             if (writer->indent)
1241*6777b538SAndroid Build Coastguard Worker                 writer->doindent = 0;
1242*6777b538SAndroid Build Coastguard Worker             /* fallthrough */
1243*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_TEXT:
1244*6777b538SAndroid Build Coastguard Worker             if ((writer->indent) && (writer->doindent)) {
1245*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterWriteIndent(writer);
1246*6777b538SAndroid Build Coastguard Worker                 sum += count;
1247*6777b538SAndroid Build Coastguard Worker                 writer->doindent = 1;
1248*6777b538SAndroid Build Coastguard Worker             } else
1249*6777b538SAndroid Build Coastguard Worker                 writer->doindent = 1;
1250*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, "</");
1251*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1252*6777b538SAndroid Build Coastguard Worker                 return -1;
1253*6777b538SAndroid Build Coastguard Worker             sum += count;
1254*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out,
1255*6777b538SAndroid Build Coastguard Worker                                                (const char *) p->name);
1256*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1257*6777b538SAndroid Build Coastguard Worker                 return -1;
1258*6777b538SAndroid Build Coastguard Worker             sum += count;
1259*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, ">");
1260*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1261*6777b538SAndroid Build Coastguard Worker                 return -1;
1262*6777b538SAndroid Build Coastguard Worker             sum += count;
1263*6777b538SAndroid Build Coastguard Worker             break;
1264*6777b538SAndroid Build Coastguard Worker         default:
1265*6777b538SAndroid Build Coastguard Worker             return -1;
1266*6777b538SAndroid Build Coastguard Worker     }
1267*6777b538SAndroid Build Coastguard Worker 
1268*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
1269*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "\n");
1270*6777b538SAndroid Build Coastguard Worker         sum += count;
1271*6777b538SAndroid Build Coastguard Worker     }
1272*6777b538SAndroid Build Coastguard Worker 
1273*6777b538SAndroid Build Coastguard Worker     xmlListPopFront(writer->nodes);
1274*6777b538SAndroid Build Coastguard Worker     return sum;
1275*6777b538SAndroid Build Coastguard Worker }
1276*6777b538SAndroid Build Coastguard Worker 
1277*6777b538SAndroid Build Coastguard Worker /**
1278*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatRaw:
1279*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1280*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
1281*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
1282*6777b538SAndroid Build Coastguard Worker  *
1283*6777b538SAndroid Build Coastguard Worker  * Write a formatted raw xml text.
1284*6777b538SAndroid Build Coastguard Worker  *
1285*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1286*6777b538SAndroid Build Coastguard Worker  */
1287*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer,const char * format,...)1288*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format,
1289*6777b538SAndroid Build Coastguard Worker                             ...)
1290*6777b538SAndroid Build Coastguard Worker {
1291*6777b538SAndroid Build Coastguard Worker     int rc;
1292*6777b538SAndroid Build Coastguard Worker     va_list ap;
1293*6777b538SAndroid Build Coastguard Worker 
1294*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
1295*6777b538SAndroid Build Coastguard Worker 
1296*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatRaw(writer, format, ap);
1297*6777b538SAndroid Build Coastguard Worker 
1298*6777b538SAndroid Build Coastguard Worker     va_end(ap);
1299*6777b538SAndroid Build Coastguard Worker     return rc;
1300*6777b538SAndroid Build Coastguard Worker }
1301*6777b538SAndroid Build Coastguard Worker 
1302*6777b538SAndroid Build Coastguard Worker /**
1303*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatRaw:
1304*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1305*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
1306*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
1307*6777b538SAndroid Build Coastguard Worker  *
1308*6777b538SAndroid Build Coastguard Worker  * Write a formatted raw xml text.
1309*6777b538SAndroid Build Coastguard Worker  *
1310*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1311*6777b538SAndroid Build Coastguard Worker  */
1312*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer,const char * format,va_list argptr)1313*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format,
1314*6777b538SAndroid Build Coastguard Worker                              va_list argptr)
1315*6777b538SAndroid Build Coastguard Worker {
1316*6777b538SAndroid Build Coastguard Worker     int rc;
1317*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
1318*6777b538SAndroid Build Coastguard Worker 
1319*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
1320*6777b538SAndroid Build Coastguard Worker         return -1;
1321*6777b538SAndroid Build Coastguard Worker 
1322*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
1323*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
1324*6777b538SAndroid Build Coastguard Worker         return -1;
1325*6777b538SAndroid Build Coastguard Worker 
1326*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteRaw(writer, buf);
1327*6777b538SAndroid Build Coastguard Worker 
1328*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
1329*6777b538SAndroid Build Coastguard Worker     return rc;
1330*6777b538SAndroid Build Coastguard Worker }
1331*6777b538SAndroid Build Coastguard Worker 
1332*6777b538SAndroid Build Coastguard Worker /**
1333*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteRawLen:
1334*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1335*6777b538SAndroid Build Coastguard Worker  * @content:  text string
1336*6777b538SAndroid Build Coastguard Worker  * @len:  length of the text string
1337*6777b538SAndroid Build Coastguard Worker  *
1338*6777b538SAndroid Build Coastguard Worker  * Write an xml text.
1339*6777b538SAndroid Build Coastguard Worker  * TODO: what about entities and special chars??
1340*6777b538SAndroid Build Coastguard Worker  *
1341*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1342*6777b538SAndroid Build Coastguard Worker  */
1343*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteRawLen(xmlTextWriterPtr writer,const xmlChar * content,int len)1344*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content,
1345*6777b538SAndroid Build Coastguard Worker                          int len)
1346*6777b538SAndroid Build Coastguard Worker {
1347*6777b538SAndroid Build Coastguard Worker     int count;
1348*6777b538SAndroid Build Coastguard Worker     int sum;
1349*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
1350*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
1351*6777b538SAndroid Build Coastguard Worker 
1352*6777b538SAndroid Build Coastguard Worker     if (writer == NULL) {
1353*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
1354*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterWriteRawLen : invalid writer!\n");
1355*6777b538SAndroid Build Coastguard Worker         return -1;
1356*6777b538SAndroid Build Coastguard Worker     }
1357*6777b538SAndroid Build Coastguard Worker 
1358*6777b538SAndroid Build Coastguard Worker     if ((content == NULL) || (len < 0)) {
1359*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
1360*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterWriteRawLen : invalid content!\n");
1361*6777b538SAndroid Build Coastguard Worker         return -1;
1362*6777b538SAndroid Build Coastguard Worker     }
1363*6777b538SAndroid Build Coastguard Worker 
1364*6777b538SAndroid Build Coastguard Worker     sum = 0;
1365*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
1366*6777b538SAndroid Build Coastguard Worker     if (lk != 0) {
1367*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1368*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterHandleStateDependencies(writer, p);
1369*6777b538SAndroid Build Coastguard Worker         if (count < 0)
1370*6777b538SAndroid Build Coastguard Worker             return -1;
1371*6777b538SAndroid Build Coastguard Worker         sum += count;
1372*6777b538SAndroid Build Coastguard Worker     }
1373*6777b538SAndroid Build Coastguard Worker 
1374*6777b538SAndroid Build Coastguard Worker     if (writer->indent)
1375*6777b538SAndroid Build Coastguard Worker         writer->doindent = 0;
1376*6777b538SAndroid Build Coastguard Worker 
1377*6777b538SAndroid Build Coastguard Worker     if (content != NULL) {
1378*6777b538SAndroid Build Coastguard Worker         count =
1379*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWrite(writer->out, len, (const char *) content);
1380*6777b538SAndroid Build Coastguard Worker         if (count < 0)
1381*6777b538SAndroid Build Coastguard Worker             return -1;
1382*6777b538SAndroid Build Coastguard Worker         sum += count;
1383*6777b538SAndroid Build Coastguard Worker     }
1384*6777b538SAndroid Build Coastguard Worker 
1385*6777b538SAndroid Build Coastguard Worker     return sum;
1386*6777b538SAndroid Build Coastguard Worker }
1387*6777b538SAndroid Build Coastguard Worker 
1388*6777b538SAndroid Build Coastguard Worker /**
1389*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteRaw:
1390*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1391*6777b538SAndroid Build Coastguard Worker  * @content:  text string
1392*6777b538SAndroid Build Coastguard Worker  *
1393*6777b538SAndroid Build Coastguard Worker  * Write a raw xml text.
1394*6777b538SAndroid Build Coastguard Worker  *
1395*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1396*6777b538SAndroid Build Coastguard Worker  */
1397*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteRaw(xmlTextWriterPtr writer,const xmlChar * content)1398*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content)
1399*6777b538SAndroid Build Coastguard Worker {
1400*6777b538SAndroid Build Coastguard Worker     return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content));
1401*6777b538SAndroid Build Coastguard Worker }
1402*6777b538SAndroid Build Coastguard Worker 
1403*6777b538SAndroid Build Coastguard Worker /**
1404*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatString:
1405*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1406*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
1407*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
1408*6777b538SAndroid Build Coastguard Worker  *
1409*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml text.
1410*6777b538SAndroid Build Coastguard Worker  *
1411*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1412*6777b538SAndroid Build Coastguard Worker  */
1413*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatString(xmlTextWriterPtr writer,const char * format,...)1414*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format,
1415*6777b538SAndroid Build Coastguard Worker                                ...)
1416*6777b538SAndroid Build Coastguard Worker {
1417*6777b538SAndroid Build Coastguard Worker     int rc;
1418*6777b538SAndroid Build Coastguard Worker     va_list ap;
1419*6777b538SAndroid Build Coastguard Worker 
1420*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (format == NULL))
1421*6777b538SAndroid Build Coastguard Worker         return -1;
1422*6777b538SAndroid Build Coastguard Worker 
1423*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
1424*6777b538SAndroid Build Coastguard Worker 
1425*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatString(writer, format, ap);
1426*6777b538SAndroid Build Coastguard Worker 
1427*6777b538SAndroid Build Coastguard Worker     va_end(ap);
1428*6777b538SAndroid Build Coastguard Worker     return rc;
1429*6777b538SAndroid Build Coastguard Worker }
1430*6777b538SAndroid Build Coastguard Worker 
1431*6777b538SAndroid Build Coastguard Worker /**
1432*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatString:
1433*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1434*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
1435*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
1436*6777b538SAndroid Build Coastguard Worker  *
1437*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml text.
1438*6777b538SAndroid Build Coastguard Worker  *
1439*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1440*6777b538SAndroid Build Coastguard Worker  */
1441*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatString(xmlTextWriterPtr writer,const char * format,va_list argptr)1442*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatString(xmlTextWriterPtr writer,
1443*6777b538SAndroid Build Coastguard Worker                                 const char *format, va_list argptr)
1444*6777b538SAndroid Build Coastguard Worker {
1445*6777b538SAndroid Build Coastguard Worker     int rc;
1446*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
1447*6777b538SAndroid Build Coastguard Worker 
1448*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (format == NULL))
1449*6777b538SAndroid Build Coastguard Worker         return -1;
1450*6777b538SAndroid Build Coastguard Worker 
1451*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
1452*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
1453*6777b538SAndroid Build Coastguard Worker         return -1;
1454*6777b538SAndroid Build Coastguard Worker 
1455*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteString(writer, buf);
1456*6777b538SAndroid Build Coastguard Worker 
1457*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
1458*6777b538SAndroid Build Coastguard Worker     return rc;
1459*6777b538SAndroid Build Coastguard Worker }
1460*6777b538SAndroid Build Coastguard Worker 
1461*6777b538SAndroid Build Coastguard Worker /**
1462*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteString:
1463*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1464*6777b538SAndroid Build Coastguard Worker  * @content:  text string
1465*6777b538SAndroid Build Coastguard Worker  *
1466*6777b538SAndroid Build Coastguard Worker  * Write an xml text.
1467*6777b538SAndroid Build Coastguard Worker  *
1468*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1469*6777b538SAndroid Build Coastguard Worker  */
1470*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteString(xmlTextWriterPtr writer,const xmlChar * content)1471*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content)
1472*6777b538SAndroid Build Coastguard Worker {
1473*6777b538SAndroid Build Coastguard Worker     int count;
1474*6777b538SAndroid Build Coastguard Worker     int sum;
1475*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
1476*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
1477*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
1478*6777b538SAndroid Build Coastguard Worker 
1479*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (content == NULL))
1480*6777b538SAndroid Build Coastguard Worker         return -1;
1481*6777b538SAndroid Build Coastguard Worker 
1482*6777b538SAndroid Build Coastguard Worker     sum = 0;
1483*6777b538SAndroid Build Coastguard Worker     buf = (xmlChar *) content;
1484*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
1485*6777b538SAndroid Build Coastguard Worker     if (lk != 0) {
1486*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1487*6777b538SAndroid Build Coastguard Worker         if (p != 0) {
1488*6777b538SAndroid Build Coastguard Worker             switch (p->state) {
1489*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NAME:
1490*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_TEXT:
1491*6777b538SAndroid Build Coastguard Worker #if 0
1492*6777b538SAndroid Build Coastguard Worker                     buf = NULL;
1493*6777b538SAndroid Build Coastguard Worker 		    xmlOutputBufferWriteEscape(writer->out, content, NULL);
1494*6777b538SAndroid Build Coastguard Worker #endif
1495*6777b538SAndroid Build Coastguard Worker                     buf = xmlEncodeSpecialChars(NULL, content);
1496*6777b538SAndroid Build Coastguard Worker                     break;
1497*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_ATTRIBUTE:
1498*6777b538SAndroid Build Coastguard Worker                     buf = NULL;
1499*6777b538SAndroid Build Coastguard Worker                     xmlBufAttrSerializeTxtContent(writer->out->buffer,
1500*6777b538SAndroid Build Coastguard Worker                                                   writer->doc, NULL, content);
1501*6777b538SAndroid Build Coastguard Worker                     break;
1502*6777b538SAndroid Build Coastguard Worker 		default:
1503*6777b538SAndroid Build Coastguard Worker 		    break;
1504*6777b538SAndroid Build Coastguard Worker             }
1505*6777b538SAndroid Build Coastguard Worker         }
1506*6777b538SAndroid Build Coastguard Worker     }
1507*6777b538SAndroid Build Coastguard Worker 
1508*6777b538SAndroid Build Coastguard Worker     if (buf != NULL) {
1509*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteRaw(writer, buf);
1510*6777b538SAndroid Build Coastguard Worker 
1511*6777b538SAndroid Build Coastguard Worker         if (buf != content)     /* buf was allocated by us, so free it */
1512*6777b538SAndroid Build Coastguard Worker             xmlFree(buf);
1513*6777b538SAndroid Build Coastguard Worker 
1514*6777b538SAndroid Build Coastguard Worker         if (count < 0)
1515*6777b538SAndroid Build Coastguard Worker             return -1;
1516*6777b538SAndroid Build Coastguard Worker         sum += count;
1517*6777b538SAndroid Build Coastguard Worker     }
1518*6777b538SAndroid Build Coastguard Worker 
1519*6777b538SAndroid Build Coastguard Worker     return sum;
1520*6777b538SAndroid Build Coastguard Worker }
1521*6777b538SAndroid Build Coastguard Worker 
1522*6777b538SAndroid Build Coastguard Worker /**
1523*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferWriteBase64:
1524*6777b538SAndroid Build Coastguard Worker  * @out: the xmlOutputBufferPtr
1525*6777b538SAndroid Build Coastguard Worker  * @data:   binary data
1526*6777b538SAndroid Build Coastguard Worker  * @len:  the number of bytes to encode
1527*6777b538SAndroid Build Coastguard Worker  *
1528*6777b538SAndroid Build Coastguard Worker  * Write base64 encoded data to an xmlOutputBuffer.
1529*6777b538SAndroid Build Coastguard Worker  * Adapted from John Walker's base64.c (http://www.fourmilab.ch/).
1530*6777b538SAndroid Build Coastguard Worker  *
1531*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1532*6777b538SAndroid Build Coastguard Worker  */
1533*6777b538SAndroid Build Coastguard Worker static int
xmlOutputBufferWriteBase64(xmlOutputBufferPtr out,int len,const unsigned char * data)1534*6777b538SAndroid Build Coastguard Worker xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
1535*6777b538SAndroid Build Coastguard Worker                            const unsigned char *data)
1536*6777b538SAndroid Build Coastguard Worker {
1537*6777b538SAndroid Build Coastguard Worker     static const unsigned char dtable[64] =
1538*6777b538SAndroid Build Coastguard Worker             {'A','B','C','D','E','F','G','H','I','J','K','L','M',
1539*6777b538SAndroid Build Coastguard Worker 	     'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
1540*6777b538SAndroid Build Coastguard Worker 	     'a','b','c','d','e','f','g','h','i','j','k','l','m',
1541*6777b538SAndroid Build Coastguard Worker 	     'n','o','p','q','r','s','t','u','v','w','x','y','z',
1542*6777b538SAndroid Build Coastguard Worker 	     '0','1','2','3','4','5','6','7','8','9','+','/'};
1543*6777b538SAndroid Build Coastguard Worker 
1544*6777b538SAndroid Build Coastguard Worker     int i;
1545*6777b538SAndroid Build Coastguard Worker     int linelen;
1546*6777b538SAndroid Build Coastguard Worker     int count;
1547*6777b538SAndroid Build Coastguard Worker     int sum;
1548*6777b538SAndroid Build Coastguard Worker 
1549*6777b538SAndroid Build Coastguard Worker     if ((out == NULL) || (len < 0) || (data == NULL))
1550*6777b538SAndroid Build Coastguard Worker         return(-1);
1551*6777b538SAndroid Build Coastguard Worker 
1552*6777b538SAndroid Build Coastguard Worker     linelen = 0;
1553*6777b538SAndroid Build Coastguard Worker     sum = 0;
1554*6777b538SAndroid Build Coastguard Worker 
1555*6777b538SAndroid Build Coastguard Worker     i = 0;
1556*6777b538SAndroid Build Coastguard Worker     while (1) {
1557*6777b538SAndroid Build Coastguard Worker         unsigned char igroup[3];
1558*6777b538SAndroid Build Coastguard Worker         unsigned char ogroup[4];
1559*6777b538SAndroid Build Coastguard Worker         int c;
1560*6777b538SAndroid Build Coastguard Worker         int n;
1561*6777b538SAndroid Build Coastguard Worker 
1562*6777b538SAndroid Build Coastguard Worker         igroup[0] = igroup[1] = igroup[2] = 0;
1563*6777b538SAndroid Build Coastguard Worker         for (n = 0; n < 3 && i < len; n++, i++) {
1564*6777b538SAndroid Build Coastguard Worker             c = data[i];
1565*6777b538SAndroid Build Coastguard Worker             igroup[n] = (unsigned char) c;
1566*6777b538SAndroid Build Coastguard Worker         }
1567*6777b538SAndroid Build Coastguard Worker 
1568*6777b538SAndroid Build Coastguard Worker         if (n > 0) {
1569*6777b538SAndroid Build Coastguard Worker             ogroup[0] = dtable[igroup[0] >> 2];
1570*6777b538SAndroid Build Coastguard Worker             ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
1571*6777b538SAndroid Build Coastguard Worker             ogroup[2] =
1572*6777b538SAndroid Build Coastguard Worker                 dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
1573*6777b538SAndroid Build Coastguard Worker             ogroup[3] = dtable[igroup[2] & 0x3F];
1574*6777b538SAndroid Build Coastguard Worker 
1575*6777b538SAndroid Build Coastguard Worker             if (n < 3) {
1576*6777b538SAndroid Build Coastguard Worker                 ogroup[3] = '=';
1577*6777b538SAndroid Build Coastguard Worker                 if (n < 2) {
1578*6777b538SAndroid Build Coastguard Worker                     ogroup[2] = '=';
1579*6777b538SAndroid Build Coastguard Worker                 }
1580*6777b538SAndroid Build Coastguard Worker             }
1581*6777b538SAndroid Build Coastguard Worker 
1582*6777b538SAndroid Build Coastguard Worker             if (linelen >= B64LINELEN) {
1583*6777b538SAndroid Build Coastguard Worker                 count = xmlOutputBufferWrite(out, 2, B64CRLF);
1584*6777b538SAndroid Build Coastguard Worker                 if (count == -1)
1585*6777b538SAndroid Build Coastguard Worker                     return -1;
1586*6777b538SAndroid Build Coastguard Worker                 sum += count;
1587*6777b538SAndroid Build Coastguard Worker                 linelen = 0;
1588*6777b538SAndroid Build Coastguard Worker             }
1589*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWrite(out, 4, (const char *) ogroup);
1590*6777b538SAndroid Build Coastguard Worker             if (count == -1)
1591*6777b538SAndroid Build Coastguard Worker                 return -1;
1592*6777b538SAndroid Build Coastguard Worker             sum += count;
1593*6777b538SAndroid Build Coastguard Worker 
1594*6777b538SAndroid Build Coastguard Worker             linelen += 4;
1595*6777b538SAndroid Build Coastguard Worker         }
1596*6777b538SAndroid Build Coastguard Worker 
1597*6777b538SAndroid Build Coastguard Worker         if (i >= len)
1598*6777b538SAndroid Build Coastguard Worker             break;
1599*6777b538SAndroid Build Coastguard Worker     }
1600*6777b538SAndroid Build Coastguard Worker 
1601*6777b538SAndroid Build Coastguard Worker     return sum;
1602*6777b538SAndroid Build Coastguard Worker }
1603*6777b538SAndroid Build Coastguard Worker 
1604*6777b538SAndroid Build Coastguard Worker /**
1605*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteBase64:
1606*6777b538SAndroid Build Coastguard Worker  * @writer: the xmlTextWriterPtr
1607*6777b538SAndroid Build Coastguard Worker  * @data:   binary data
1608*6777b538SAndroid Build Coastguard Worker  * @start:  the position within the data of the first byte to encode
1609*6777b538SAndroid Build Coastguard Worker  * @len:  the number of bytes to encode
1610*6777b538SAndroid Build Coastguard Worker  *
1611*6777b538SAndroid Build Coastguard Worker  * Write an base64 encoded xml text.
1612*6777b538SAndroid Build Coastguard Worker  *
1613*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1614*6777b538SAndroid Build Coastguard Worker  */
1615*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteBase64(xmlTextWriterPtr writer,const char * data,int start,int len)1616*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data,
1617*6777b538SAndroid Build Coastguard Worker                          int start, int len)
1618*6777b538SAndroid Build Coastguard Worker {
1619*6777b538SAndroid Build Coastguard Worker     int count;
1620*6777b538SAndroid Build Coastguard Worker     int sum;
1621*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
1622*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
1623*6777b538SAndroid Build Coastguard Worker 
1624*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
1625*6777b538SAndroid Build Coastguard Worker         return -1;
1626*6777b538SAndroid Build Coastguard Worker 
1627*6777b538SAndroid Build Coastguard Worker     sum = 0;
1628*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
1629*6777b538SAndroid Build Coastguard Worker     if (lk != 0) {
1630*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1631*6777b538SAndroid Build Coastguard Worker         if (p != 0) {
1632*6777b538SAndroid Build Coastguard Worker             count = xmlTextWriterHandleStateDependencies(writer, p);
1633*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1634*6777b538SAndroid Build Coastguard Worker                 return -1;
1635*6777b538SAndroid Build Coastguard Worker             sum += count;
1636*6777b538SAndroid Build Coastguard Worker         }
1637*6777b538SAndroid Build Coastguard Worker     }
1638*6777b538SAndroid Build Coastguard Worker 
1639*6777b538SAndroid Build Coastguard Worker     if (writer->indent)
1640*6777b538SAndroid Build Coastguard Worker         writer->doindent = 0;
1641*6777b538SAndroid Build Coastguard Worker 
1642*6777b538SAndroid Build Coastguard Worker     count =
1643*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferWriteBase64(writer->out, len,
1644*6777b538SAndroid Build Coastguard Worker                                    (unsigned char *) data + start);
1645*6777b538SAndroid Build Coastguard Worker     if (count < 0)
1646*6777b538SAndroid Build Coastguard Worker         return -1;
1647*6777b538SAndroid Build Coastguard Worker     sum += count;
1648*6777b538SAndroid Build Coastguard Worker 
1649*6777b538SAndroid Build Coastguard Worker     return sum;
1650*6777b538SAndroid Build Coastguard Worker }
1651*6777b538SAndroid Build Coastguard Worker 
1652*6777b538SAndroid Build Coastguard Worker /**
1653*6777b538SAndroid Build Coastguard Worker  * xmlOutputBufferWriteBinHex:
1654*6777b538SAndroid Build Coastguard Worker  * @out: the xmlOutputBufferPtr
1655*6777b538SAndroid Build Coastguard Worker  * @data:   binary data
1656*6777b538SAndroid Build Coastguard Worker  * @len:  the number of bytes to encode
1657*6777b538SAndroid Build Coastguard Worker  *
1658*6777b538SAndroid Build Coastguard Worker  * Write hqx encoded data to an xmlOutputBuffer.
1659*6777b538SAndroid Build Coastguard Worker  * ::todo
1660*6777b538SAndroid Build Coastguard Worker  *
1661*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering)
1662*6777b538SAndroid Build Coastguard Worker  * or -1 in case of error
1663*6777b538SAndroid Build Coastguard Worker  */
1664*6777b538SAndroid Build Coastguard Worker static int
xmlOutputBufferWriteBinHex(xmlOutputBufferPtr out,int len,const unsigned char * data)1665*6777b538SAndroid Build Coastguard Worker xmlOutputBufferWriteBinHex(xmlOutputBufferPtr out,
1666*6777b538SAndroid Build Coastguard Worker                            int len, const unsigned char *data)
1667*6777b538SAndroid Build Coastguard Worker {
1668*6777b538SAndroid Build Coastguard Worker     int count;
1669*6777b538SAndroid Build Coastguard Worker     int sum;
1670*6777b538SAndroid Build Coastguard Worker     static const char hex[16] =
1671*6777b538SAndroid Build Coastguard Worker 	{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
1672*6777b538SAndroid Build Coastguard Worker     int i;
1673*6777b538SAndroid Build Coastguard Worker 
1674*6777b538SAndroid Build Coastguard Worker     if ((out == NULL) || (data == NULL) || (len < 0)) {
1675*6777b538SAndroid Build Coastguard Worker         return -1;
1676*6777b538SAndroid Build Coastguard Worker     }
1677*6777b538SAndroid Build Coastguard Worker 
1678*6777b538SAndroid Build Coastguard Worker     sum = 0;
1679*6777b538SAndroid Build Coastguard Worker     for (i = 0; i < len; i++) {
1680*6777b538SAndroid Build Coastguard Worker         count =
1681*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWrite(out, 1,
1682*6777b538SAndroid Build Coastguard Worker                                  (const char *) &hex[data[i] >> 4]);
1683*6777b538SAndroid Build Coastguard Worker         if (count == -1)
1684*6777b538SAndroid Build Coastguard Worker             return -1;
1685*6777b538SAndroid Build Coastguard Worker         sum += count;
1686*6777b538SAndroid Build Coastguard Worker         count =
1687*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWrite(out, 1,
1688*6777b538SAndroid Build Coastguard Worker                                  (const char *) &hex[data[i] & 0xF]);
1689*6777b538SAndroid Build Coastguard Worker         if (count == -1)
1690*6777b538SAndroid Build Coastguard Worker             return -1;
1691*6777b538SAndroid Build Coastguard Worker         sum += count;
1692*6777b538SAndroid Build Coastguard Worker     }
1693*6777b538SAndroid Build Coastguard Worker 
1694*6777b538SAndroid Build Coastguard Worker     return sum;
1695*6777b538SAndroid Build Coastguard Worker }
1696*6777b538SAndroid Build Coastguard Worker 
1697*6777b538SAndroid Build Coastguard Worker /**
1698*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteBinHex:
1699*6777b538SAndroid Build Coastguard Worker  * @writer: the xmlTextWriterPtr
1700*6777b538SAndroid Build Coastguard Worker  * @data:   binary data
1701*6777b538SAndroid Build Coastguard Worker  * @start:  the position within the data of the first byte to encode
1702*6777b538SAndroid Build Coastguard Worker  * @len:  the number of bytes to encode
1703*6777b538SAndroid Build Coastguard Worker  *
1704*6777b538SAndroid Build Coastguard Worker  * Write a BinHex encoded xml text.
1705*6777b538SAndroid Build Coastguard Worker  *
1706*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1707*6777b538SAndroid Build Coastguard Worker  */
1708*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteBinHex(xmlTextWriterPtr writer,const char * data,int start,int len)1709*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data,
1710*6777b538SAndroid Build Coastguard Worker                          int start, int len)
1711*6777b538SAndroid Build Coastguard Worker {
1712*6777b538SAndroid Build Coastguard Worker     int count;
1713*6777b538SAndroid Build Coastguard Worker     int sum;
1714*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
1715*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
1716*6777b538SAndroid Build Coastguard Worker 
1717*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
1718*6777b538SAndroid Build Coastguard Worker         return -1;
1719*6777b538SAndroid Build Coastguard Worker 
1720*6777b538SAndroid Build Coastguard Worker     sum = 0;
1721*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
1722*6777b538SAndroid Build Coastguard Worker     if (lk != 0) {
1723*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1724*6777b538SAndroid Build Coastguard Worker         if (p != 0) {
1725*6777b538SAndroid Build Coastguard Worker             count = xmlTextWriterHandleStateDependencies(writer, p);
1726*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1727*6777b538SAndroid Build Coastguard Worker                 return -1;
1728*6777b538SAndroid Build Coastguard Worker             sum += count;
1729*6777b538SAndroid Build Coastguard Worker         }
1730*6777b538SAndroid Build Coastguard Worker     }
1731*6777b538SAndroid Build Coastguard Worker 
1732*6777b538SAndroid Build Coastguard Worker     if (writer->indent)
1733*6777b538SAndroid Build Coastguard Worker         writer->doindent = 0;
1734*6777b538SAndroid Build Coastguard Worker 
1735*6777b538SAndroid Build Coastguard Worker     count =
1736*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferWriteBinHex(writer->out, len,
1737*6777b538SAndroid Build Coastguard Worker                                    (unsigned char *) data + start);
1738*6777b538SAndroid Build Coastguard Worker     if (count < 0)
1739*6777b538SAndroid Build Coastguard Worker         return -1;
1740*6777b538SAndroid Build Coastguard Worker     sum += count;
1741*6777b538SAndroid Build Coastguard Worker 
1742*6777b538SAndroid Build Coastguard Worker     return sum;
1743*6777b538SAndroid Build Coastguard Worker }
1744*6777b538SAndroid Build Coastguard Worker 
1745*6777b538SAndroid Build Coastguard Worker /**
1746*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartAttribute:
1747*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1748*6777b538SAndroid Build Coastguard Worker  * @name:  element name
1749*6777b538SAndroid Build Coastguard Worker  *
1750*6777b538SAndroid Build Coastguard Worker  * Start an xml attribute.
1751*6777b538SAndroid Build Coastguard Worker  *
1752*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1753*6777b538SAndroid Build Coastguard Worker  */
1754*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartAttribute(xmlTextWriterPtr writer,const xmlChar * name)1755*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name)
1756*6777b538SAndroid Build Coastguard Worker {
1757*6777b538SAndroid Build Coastguard Worker     int count;
1758*6777b538SAndroid Build Coastguard Worker     int sum;
1759*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
1760*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
1761*6777b538SAndroid Build Coastguard Worker 
1762*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (name == NULL) || (*name == '\0'))
1763*6777b538SAndroid Build Coastguard Worker         return -1;
1764*6777b538SAndroid Build Coastguard Worker 
1765*6777b538SAndroid Build Coastguard Worker     sum = 0;
1766*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
1767*6777b538SAndroid Build Coastguard Worker     if (lk == 0)
1768*6777b538SAndroid Build Coastguard Worker         return -1;
1769*6777b538SAndroid Build Coastguard Worker 
1770*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1771*6777b538SAndroid Build Coastguard Worker     if (p == 0)
1772*6777b538SAndroid Build Coastguard Worker         return -1;
1773*6777b538SAndroid Build Coastguard Worker 
1774*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
1775*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_ATTRIBUTE:
1776*6777b538SAndroid Build Coastguard Worker             count = xmlTextWriterEndAttribute(writer);
1777*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1778*6777b538SAndroid Build Coastguard Worker                 return -1;
1779*6777b538SAndroid Build Coastguard Worker             sum += count;
1780*6777b538SAndroid Build Coastguard Worker             /* fallthrough */
1781*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_NAME:
1782*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, " ");
1783*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1784*6777b538SAndroid Build Coastguard Worker                 return -1;
1785*6777b538SAndroid Build Coastguard Worker             sum += count;
1786*6777b538SAndroid Build Coastguard Worker             count =
1787*6777b538SAndroid Build Coastguard Worker                 xmlOutputBufferWriteString(writer->out,
1788*6777b538SAndroid Build Coastguard Worker                                            (const char *) name);
1789*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1790*6777b538SAndroid Build Coastguard Worker                 return -1;
1791*6777b538SAndroid Build Coastguard Worker             sum += count;
1792*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, "=");
1793*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1794*6777b538SAndroid Build Coastguard Worker                 return -1;
1795*6777b538SAndroid Build Coastguard Worker             sum += count;
1796*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
1797*6777b538SAndroid Build Coastguard Worker             if (count < 0)
1798*6777b538SAndroid Build Coastguard Worker                 return -1;
1799*6777b538SAndroid Build Coastguard Worker             sum += count;
1800*6777b538SAndroid Build Coastguard Worker             p->state = XML_TEXTWRITER_ATTRIBUTE;
1801*6777b538SAndroid Build Coastguard Worker             break;
1802*6777b538SAndroid Build Coastguard Worker         default:
1803*6777b538SAndroid Build Coastguard Worker             return -1;
1804*6777b538SAndroid Build Coastguard Worker     }
1805*6777b538SAndroid Build Coastguard Worker 
1806*6777b538SAndroid Build Coastguard Worker     return sum;
1807*6777b538SAndroid Build Coastguard Worker }
1808*6777b538SAndroid Build Coastguard Worker 
1809*6777b538SAndroid Build Coastguard Worker /**
1810*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartAttributeNS:
1811*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1812*6777b538SAndroid Build Coastguard Worker  * @prefix:  namespace prefix or NULL
1813*6777b538SAndroid Build Coastguard Worker  * @name:  element local name
1814*6777b538SAndroid Build Coastguard Worker  * @namespaceURI:  namespace URI or NULL
1815*6777b538SAndroid Build Coastguard Worker  *
1816*6777b538SAndroid Build Coastguard Worker  * Start an xml attribute with namespace support.
1817*6777b538SAndroid Build Coastguard Worker  *
1818*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1819*6777b538SAndroid Build Coastguard Worker  */
1820*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartAttributeNS(xmlTextWriterPtr writer,const xmlChar * prefix,const xmlChar * name,const xmlChar * namespaceURI)1821*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartAttributeNS(xmlTextWriterPtr writer,
1822*6777b538SAndroid Build Coastguard Worker                               const xmlChar * prefix, const xmlChar * name,
1823*6777b538SAndroid Build Coastguard Worker                               const xmlChar * namespaceURI)
1824*6777b538SAndroid Build Coastguard Worker {
1825*6777b538SAndroid Build Coastguard Worker     int count;
1826*6777b538SAndroid Build Coastguard Worker     int sum;
1827*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
1828*6777b538SAndroid Build Coastguard Worker     xmlTextWriterNsStackEntry *p;
1829*6777b538SAndroid Build Coastguard Worker 
1830*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (name == NULL) || (*name == '\0'))
1831*6777b538SAndroid Build Coastguard Worker         return -1;
1832*6777b538SAndroid Build Coastguard Worker 
1833*6777b538SAndroid Build Coastguard Worker     /* Handle namespace first in case of error */
1834*6777b538SAndroid Build Coastguard Worker     if (namespaceURI != 0) {
1835*6777b538SAndroid Build Coastguard Worker         xmlTextWriterNsStackEntry nsentry, *curns;
1836*6777b538SAndroid Build Coastguard Worker 
1837*6777b538SAndroid Build Coastguard Worker         buf = xmlStrdup(BAD_CAST "xmlns");
1838*6777b538SAndroid Build Coastguard Worker         if (prefix != 0) {
1839*6777b538SAndroid Build Coastguard Worker             buf = xmlStrcat(buf, BAD_CAST ":");
1840*6777b538SAndroid Build Coastguard Worker             buf = xmlStrcat(buf, prefix);
1841*6777b538SAndroid Build Coastguard Worker         }
1842*6777b538SAndroid Build Coastguard Worker 
1843*6777b538SAndroid Build Coastguard Worker         nsentry.prefix = buf;
1844*6777b538SAndroid Build Coastguard Worker         nsentry.uri = (xmlChar *)namespaceURI;
1845*6777b538SAndroid Build Coastguard Worker         nsentry.elem = xmlListFront(writer->nodes);
1846*6777b538SAndroid Build Coastguard Worker 
1847*6777b538SAndroid Build Coastguard Worker         curns = (xmlTextWriterNsStackEntry *)xmlListSearch(writer->nsstack,
1848*6777b538SAndroid Build Coastguard Worker                                                            (void *)&nsentry);
1849*6777b538SAndroid Build Coastguard Worker         if ((curns != NULL)) {
1850*6777b538SAndroid Build Coastguard Worker             xmlFree(buf);
1851*6777b538SAndroid Build Coastguard Worker             if (xmlStrcmp(curns->uri, namespaceURI) == 0) {
1852*6777b538SAndroid Build Coastguard Worker                 /* Namespace already defined on element skip */
1853*6777b538SAndroid Build Coastguard Worker                 buf = NULL;
1854*6777b538SAndroid Build Coastguard Worker             } else {
1855*6777b538SAndroid Build Coastguard Worker                 /* Prefix mismatch so error out */
1856*6777b538SAndroid Build Coastguard Worker                 return -1;
1857*6777b538SAndroid Build Coastguard Worker             }
1858*6777b538SAndroid Build Coastguard Worker         }
1859*6777b538SAndroid Build Coastguard Worker 
1860*6777b538SAndroid Build Coastguard Worker         /* Do not add namespace decl to list - it is already there */
1861*6777b538SAndroid Build Coastguard Worker         if (buf != NULL) {
1862*6777b538SAndroid Build Coastguard Worker             p = (xmlTextWriterNsStackEntry *)
1863*6777b538SAndroid Build Coastguard Worker                 xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
1864*6777b538SAndroid Build Coastguard Worker             if (p == 0) {
1865*6777b538SAndroid Build Coastguard Worker                 xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1866*6777b538SAndroid Build Coastguard Worker 								        "xmlTextWriterStartAttributeNS : out of memory!\n");
1867*6777b538SAndroid Build Coastguard Worker                 return -1;
1868*6777b538SAndroid Build Coastguard Worker             }
1869*6777b538SAndroid Build Coastguard Worker 
1870*6777b538SAndroid Build Coastguard Worker             p->prefix = buf;
1871*6777b538SAndroid Build Coastguard Worker             p->uri = xmlStrdup(namespaceURI);
1872*6777b538SAndroid Build Coastguard Worker             if (p->uri == 0) {
1873*6777b538SAndroid Build Coastguard Worker                 xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1874*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartAttributeNS : out of memory!\n");
1875*6777b538SAndroid Build Coastguard Worker                 xmlFree(p);
1876*6777b538SAndroid Build Coastguard Worker                 return -1;
1877*6777b538SAndroid Build Coastguard Worker             }
1878*6777b538SAndroid Build Coastguard Worker             p->elem = xmlListFront(writer->nodes);
1879*6777b538SAndroid Build Coastguard Worker 
1880*6777b538SAndroid Build Coastguard Worker             xmlListPushFront(writer->nsstack, p);
1881*6777b538SAndroid Build Coastguard Worker         }
1882*6777b538SAndroid Build Coastguard Worker     }
1883*6777b538SAndroid Build Coastguard Worker 
1884*6777b538SAndroid Build Coastguard Worker     buf = NULL;
1885*6777b538SAndroid Build Coastguard Worker     if (prefix != 0) {
1886*6777b538SAndroid Build Coastguard Worker         buf = xmlStrdup(prefix);
1887*6777b538SAndroid Build Coastguard Worker         buf = xmlStrcat(buf, BAD_CAST ":");
1888*6777b538SAndroid Build Coastguard Worker     }
1889*6777b538SAndroid Build Coastguard Worker     buf = xmlStrcat(buf, name);
1890*6777b538SAndroid Build Coastguard Worker 
1891*6777b538SAndroid Build Coastguard Worker     sum = 0;
1892*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartAttribute(writer, buf);
1893*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
1894*6777b538SAndroid Build Coastguard Worker     if (count < 0)
1895*6777b538SAndroid Build Coastguard Worker         return -1;
1896*6777b538SAndroid Build Coastguard Worker     sum += count;
1897*6777b538SAndroid Build Coastguard Worker 
1898*6777b538SAndroid Build Coastguard Worker     return sum;
1899*6777b538SAndroid Build Coastguard Worker }
1900*6777b538SAndroid Build Coastguard Worker 
1901*6777b538SAndroid Build Coastguard Worker /**
1902*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndAttribute:
1903*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1904*6777b538SAndroid Build Coastguard Worker  *
1905*6777b538SAndroid Build Coastguard Worker  * End the current xml element.
1906*6777b538SAndroid Build Coastguard Worker  *
1907*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1908*6777b538SAndroid Build Coastguard Worker  */
1909*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndAttribute(xmlTextWriterPtr writer)1910*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndAttribute(xmlTextWriterPtr writer)
1911*6777b538SAndroid Build Coastguard Worker {
1912*6777b538SAndroid Build Coastguard Worker     int count;
1913*6777b538SAndroid Build Coastguard Worker     int sum;
1914*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
1915*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
1916*6777b538SAndroid Build Coastguard Worker 
1917*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
1918*6777b538SAndroid Build Coastguard Worker         return -1;
1919*6777b538SAndroid Build Coastguard Worker 
1920*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
1921*6777b538SAndroid Build Coastguard Worker     if (lk == 0) {
1922*6777b538SAndroid Build Coastguard Worker         return -1;
1923*6777b538SAndroid Build Coastguard Worker     }
1924*6777b538SAndroid Build Coastguard Worker 
1925*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1926*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
1927*6777b538SAndroid Build Coastguard Worker         return -1;
1928*6777b538SAndroid Build Coastguard Worker     }
1929*6777b538SAndroid Build Coastguard Worker 
1930*6777b538SAndroid Build Coastguard Worker     sum = 0;
1931*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
1932*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_ATTRIBUTE:
1933*6777b538SAndroid Build Coastguard Worker             p->state = XML_TEXTWRITER_NAME;
1934*6777b538SAndroid Build Coastguard Worker 
1935*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
1936*6777b538SAndroid Build Coastguard Worker             if (count < 0) {
1937*6777b538SAndroid Build Coastguard Worker                 return -1;
1938*6777b538SAndroid Build Coastguard Worker             }
1939*6777b538SAndroid Build Coastguard Worker             sum += count;
1940*6777b538SAndroid Build Coastguard Worker             break;
1941*6777b538SAndroid Build Coastguard Worker         default:
1942*6777b538SAndroid Build Coastguard Worker             return -1;
1943*6777b538SAndroid Build Coastguard Worker     }
1944*6777b538SAndroid Build Coastguard Worker 
1945*6777b538SAndroid Build Coastguard Worker     return sum;
1946*6777b538SAndroid Build Coastguard Worker }
1947*6777b538SAndroid Build Coastguard Worker 
1948*6777b538SAndroid Build Coastguard Worker /**
1949*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatAttribute:
1950*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1951*6777b538SAndroid Build Coastguard Worker  * @name:  attribute name
1952*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
1953*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
1954*6777b538SAndroid Build Coastguard Worker  *
1955*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml attribute.
1956*6777b538SAndroid Build Coastguard Worker  *
1957*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1958*6777b538SAndroid Build Coastguard Worker  */
1959*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer,const xmlChar * name,const char * format,...)1960*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer,
1961*6777b538SAndroid Build Coastguard Worker                                   const xmlChar * name, const char *format,
1962*6777b538SAndroid Build Coastguard Worker                                   ...)
1963*6777b538SAndroid Build Coastguard Worker {
1964*6777b538SAndroid Build Coastguard Worker     int rc;
1965*6777b538SAndroid Build Coastguard Worker     va_list ap;
1966*6777b538SAndroid Build Coastguard Worker 
1967*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
1968*6777b538SAndroid Build Coastguard Worker 
1969*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap);
1970*6777b538SAndroid Build Coastguard Worker 
1971*6777b538SAndroid Build Coastguard Worker     va_end(ap);
1972*6777b538SAndroid Build Coastguard Worker     return rc;
1973*6777b538SAndroid Build Coastguard Worker }
1974*6777b538SAndroid Build Coastguard Worker 
1975*6777b538SAndroid Build Coastguard Worker /**
1976*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatAttribute:
1977*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
1978*6777b538SAndroid Build Coastguard Worker  * @name:  attribute name
1979*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
1980*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
1981*6777b538SAndroid Build Coastguard Worker  *
1982*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml attribute.
1983*6777b538SAndroid Build Coastguard Worker  *
1984*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
1985*6777b538SAndroid Build Coastguard Worker  */
1986*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer,const xmlChar * name,const char * format,va_list argptr)1987*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer,
1988*6777b538SAndroid Build Coastguard Worker                                    const xmlChar * name,
1989*6777b538SAndroid Build Coastguard Worker                                    const char *format, va_list argptr)
1990*6777b538SAndroid Build Coastguard Worker {
1991*6777b538SAndroid Build Coastguard Worker     int rc;
1992*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
1993*6777b538SAndroid Build Coastguard Worker 
1994*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
1995*6777b538SAndroid Build Coastguard Worker         return -1;
1996*6777b538SAndroid Build Coastguard Worker 
1997*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
1998*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
1999*6777b538SAndroid Build Coastguard Worker         return -1;
2000*6777b538SAndroid Build Coastguard Worker 
2001*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteAttribute(writer, name, buf);
2002*6777b538SAndroid Build Coastguard Worker 
2003*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
2004*6777b538SAndroid Build Coastguard Worker     return rc;
2005*6777b538SAndroid Build Coastguard Worker }
2006*6777b538SAndroid Build Coastguard Worker 
2007*6777b538SAndroid Build Coastguard Worker /**
2008*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteAttribute:
2009*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2010*6777b538SAndroid Build Coastguard Worker  * @name:  attribute name
2011*6777b538SAndroid Build Coastguard Worker  * @content:  attribute content
2012*6777b538SAndroid Build Coastguard Worker  *
2013*6777b538SAndroid Build Coastguard Worker  * Write an xml attribute.
2014*6777b538SAndroid Build Coastguard Worker  *
2015*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2016*6777b538SAndroid Build Coastguard Worker  */
2017*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteAttribute(xmlTextWriterPtr writer,const xmlChar * name,const xmlChar * content)2018*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name,
2019*6777b538SAndroid Build Coastguard Worker                             const xmlChar * content)
2020*6777b538SAndroid Build Coastguard Worker {
2021*6777b538SAndroid Build Coastguard Worker     int count;
2022*6777b538SAndroid Build Coastguard Worker     int sum;
2023*6777b538SAndroid Build Coastguard Worker 
2024*6777b538SAndroid Build Coastguard Worker     sum = 0;
2025*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartAttribute(writer, name);
2026*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2027*6777b538SAndroid Build Coastguard Worker         return -1;
2028*6777b538SAndroid Build Coastguard Worker     sum += count;
2029*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterWriteString(writer, content);
2030*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2031*6777b538SAndroid Build Coastguard Worker         return -1;
2032*6777b538SAndroid Build Coastguard Worker     sum += count;
2033*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndAttribute(writer);
2034*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2035*6777b538SAndroid Build Coastguard Worker         return -1;
2036*6777b538SAndroid Build Coastguard Worker     sum += count;
2037*6777b538SAndroid Build Coastguard Worker 
2038*6777b538SAndroid Build Coastguard Worker     return sum;
2039*6777b538SAndroid Build Coastguard Worker }
2040*6777b538SAndroid Build Coastguard Worker 
2041*6777b538SAndroid Build Coastguard Worker /**
2042*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatAttributeNS:
2043*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2044*6777b538SAndroid Build Coastguard Worker  * @prefix:  namespace prefix
2045*6777b538SAndroid Build Coastguard Worker  * @name:  attribute local name
2046*6777b538SAndroid Build Coastguard Worker  * @namespaceURI:  namespace URI
2047*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2048*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
2049*6777b538SAndroid Build Coastguard Worker  *
2050*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml attribute.with namespace support
2051*6777b538SAndroid Build Coastguard Worker  *
2052*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2053*6777b538SAndroid Build Coastguard Worker  */
2054*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer,const xmlChar * prefix,const xmlChar * name,const xmlChar * namespaceURI,const char * format,...)2055*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer,
2056*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * prefix,
2057*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * name,
2058*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * namespaceURI,
2059*6777b538SAndroid Build Coastguard Worker                                     const char *format, ...)
2060*6777b538SAndroid Build Coastguard Worker {
2061*6777b538SAndroid Build Coastguard Worker     int rc;
2062*6777b538SAndroid Build Coastguard Worker     va_list ap;
2063*6777b538SAndroid Build Coastguard Worker 
2064*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
2065*6777b538SAndroid Build Coastguard Worker 
2066*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatAttributeNS(writer, prefix, name,
2067*6777b538SAndroid Build Coastguard Worker                                               namespaceURI, format, ap);
2068*6777b538SAndroid Build Coastguard Worker 
2069*6777b538SAndroid Build Coastguard Worker     va_end(ap);
2070*6777b538SAndroid Build Coastguard Worker     return rc;
2071*6777b538SAndroid Build Coastguard Worker }
2072*6777b538SAndroid Build Coastguard Worker 
2073*6777b538SAndroid Build Coastguard Worker /**
2074*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatAttributeNS:
2075*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2076*6777b538SAndroid Build Coastguard Worker  * @prefix:  namespace prefix
2077*6777b538SAndroid Build Coastguard Worker  * @name:  attribute local name
2078*6777b538SAndroid Build Coastguard Worker  * @namespaceURI:  namespace URI
2079*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2080*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
2081*6777b538SAndroid Build Coastguard Worker  *
2082*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml attribute.with namespace support
2083*6777b538SAndroid Build Coastguard Worker  *
2084*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2085*6777b538SAndroid Build Coastguard Worker  */
2086*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer,const xmlChar * prefix,const xmlChar * name,const xmlChar * namespaceURI,const char * format,va_list argptr)2087*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer,
2088*6777b538SAndroid Build Coastguard Worker                                      const xmlChar * prefix,
2089*6777b538SAndroid Build Coastguard Worker                                      const xmlChar * name,
2090*6777b538SAndroid Build Coastguard Worker                                      const xmlChar * namespaceURI,
2091*6777b538SAndroid Build Coastguard Worker                                      const char *format, va_list argptr)
2092*6777b538SAndroid Build Coastguard Worker {
2093*6777b538SAndroid Build Coastguard Worker     int rc;
2094*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
2095*6777b538SAndroid Build Coastguard Worker 
2096*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
2097*6777b538SAndroid Build Coastguard Worker         return -1;
2098*6777b538SAndroid Build Coastguard Worker 
2099*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
2100*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
2101*6777b538SAndroid Build Coastguard Worker         return -1;
2102*6777b538SAndroid Build Coastguard Worker 
2103*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteAttributeNS(writer, prefix, name, namespaceURI,
2104*6777b538SAndroid Build Coastguard Worker                                        buf);
2105*6777b538SAndroid Build Coastguard Worker 
2106*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
2107*6777b538SAndroid Build Coastguard Worker     return rc;
2108*6777b538SAndroid Build Coastguard Worker }
2109*6777b538SAndroid Build Coastguard Worker 
2110*6777b538SAndroid Build Coastguard Worker /**
2111*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteAttributeNS:
2112*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2113*6777b538SAndroid Build Coastguard Worker  * @prefix:  namespace prefix
2114*6777b538SAndroid Build Coastguard Worker  * @name:  attribute local name
2115*6777b538SAndroid Build Coastguard Worker  * @namespaceURI:  namespace URI
2116*6777b538SAndroid Build Coastguard Worker  * @content:  attribute content
2117*6777b538SAndroid Build Coastguard Worker  *
2118*6777b538SAndroid Build Coastguard Worker  * Write an xml attribute.
2119*6777b538SAndroid Build Coastguard Worker  *
2120*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2121*6777b538SAndroid Build Coastguard Worker  */
2122*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer,const xmlChar * prefix,const xmlChar * name,const xmlChar * namespaceURI,const xmlChar * content)2123*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer,
2124*6777b538SAndroid Build Coastguard Worker                               const xmlChar * prefix, const xmlChar * name,
2125*6777b538SAndroid Build Coastguard Worker                               const xmlChar * namespaceURI,
2126*6777b538SAndroid Build Coastguard Worker                               const xmlChar * content)
2127*6777b538SAndroid Build Coastguard Worker {
2128*6777b538SAndroid Build Coastguard Worker     int count;
2129*6777b538SAndroid Build Coastguard Worker     int sum;
2130*6777b538SAndroid Build Coastguard Worker 
2131*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (name == NULL) || (*name == '\0'))
2132*6777b538SAndroid Build Coastguard Worker         return -1;
2133*6777b538SAndroid Build Coastguard Worker 
2134*6777b538SAndroid Build Coastguard Worker     sum = 0;
2135*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartAttributeNS(writer, prefix, name, namespaceURI);
2136*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2137*6777b538SAndroid Build Coastguard Worker         return -1;
2138*6777b538SAndroid Build Coastguard Worker     sum += count;
2139*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterWriteString(writer, content);
2140*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2141*6777b538SAndroid Build Coastguard Worker         return -1;
2142*6777b538SAndroid Build Coastguard Worker     sum += count;
2143*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndAttribute(writer);
2144*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2145*6777b538SAndroid Build Coastguard Worker         return -1;
2146*6777b538SAndroid Build Coastguard Worker     sum += count;
2147*6777b538SAndroid Build Coastguard Worker 
2148*6777b538SAndroid Build Coastguard Worker     return sum;
2149*6777b538SAndroid Build Coastguard Worker }
2150*6777b538SAndroid Build Coastguard Worker 
2151*6777b538SAndroid Build Coastguard Worker /**
2152*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatElement:
2153*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2154*6777b538SAndroid Build Coastguard Worker  * @name:  element name
2155*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2156*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
2157*6777b538SAndroid Build Coastguard Worker  *
2158*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml element.
2159*6777b538SAndroid Build Coastguard Worker  *
2160*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2161*6777b538SAndroid Build Coastguard Worker  */
2162*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer,const xmlChar * name,const char * format,...)2163*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer,
2164*6777b538SAndroid Build Coastguard Worker                                 const xmlChar * name, const char *format,
2165*6777b538SAndroid Build Coastguard Worker                                 ...)
2166*6777b538SAndroid Build Coastguard Worker {
2167*6777b538SAndroid Build Coastguard Worker     int rc;
2168*6777b538SAndroid Build Coastguard Worker     va_list ap;
2169*6777b538SAndroid Build Coastguard Worker 
2170*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
2171*6777b538SAndroid Build Coastguard Worker 
2172*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatElement(writer, name, format, ap);
2173*6777b538SAndroid Build Coastguard Worker 
2174*6777b538SAndroid Build Coastguard Worker     va_end(ap);
2175*6777b538SAndroid Build Coastguard Worker     return rc;
2176*6777b538SAndroid Build Coastguard Worker }
2177*6777b538SAndroid Build Coastguard Worker 
2178*6777b538SAndroid Build Coastguard Worker /**
2179*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatElement:
2180*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2181*6777b538SAndroid Build Coastguard Worker  * @name:  element name
2182*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2183*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
2184*6777b538SAndroid Build Coastguard Worker  *
2185*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml element.
2186*6777b538SAndroid Build Coastguard Worker  *
2187*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2188*6777b538SAndroid Build Coastguard Worker  */
2189*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer,const xmlChar * name,const char * format,va_list argptr)2190*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer,
2191*6777b538SAndroid Build Coastguard Worker                                  const xmlChar * name, const char *format,
2192*6777b538SAndroid Build Coastguard Worker                                  va_list argptr)
2193*6777b538SAndroid Build Coastguard Worker {
2194*6777b538SAndroid Build Coastguard Worker     int rc;
2195*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
2196*6777b538SAndroid Build Coastguard Worker 
2197*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
2198*6777b538SAndroid Build Coastguard Worker         return -1;
2199*6777b538SAndroid Build Coastguard Worker 
2200*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
2201*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
2202*6777b538SAndroid Build Coastguard Worker         return -1;
2203*6777b538SAndroid Build Coastguard Worker 
2204*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteElement(writer, name, buf);
2205*6777b538SAndroid Build Coastguard Worker 
2206*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
2207*6777b538SAndroid Build Coastguard Worker     return rc;
2208*6777b538SAndroid Build Coastguard Worker }
2209*6777b538SAndroid Build Coastguard Worker 
2210*6777b538SAndroid Build Coastguard Worker /**
2211*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteElement:
2212*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2213*6777b538SAndroid Build Coastguard Worker  * @name:  element name
2214*6777b538SAndroid Build Coastguard Worker  * @content:  element content
2215*6777b538SAndroid Build Coastguard Worker  *
2216*6777b538SAndroid Build Coastguard Worker  * Write an xml element.
2217*6777b538SAndroid Build Coastguard Worker  *
2218*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2219*6777b538SAndroid Build Coastguard Worker  */
2220*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteElement(xmlTextWriterPtr writer,const xmlChar * name,const xmlChar * content)2221*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name,
2222*6777b538SAndroid Build Coastguard Worker                           const xmlChar * content)
2223*6777b538SAndroid Build Coastguard Worker {
2224*6777b538SAndroid Build Coastguard Worker     int count;
2225*6777b538SAndroid Build Coastguard Worker     int sum;
2226*6777b538SAndroid Build Coastguard Worker 
2227*6777b538SAndroid Build Coastguard Worker     sum = 0;
2228*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartElement(writer, name);
2229*6777b538SAndroid Build Coastguard Worker     if (count == -1)
2230*6777b538SAndroid Build Coastguard Worker         return -1;
2231*6777b538SAndroid Build Coastguard Worker     sum += count;
2232*6777b538SAndroid Build Coastguard Worker     if (content != NULL) {
2233*6777b538SAndroid Build Coastguard Worker 	count = xmlTextWriterWriteString(writer, content);
2234*6777b538SAndroid Build Coastguard Worker 	if (count == -1)
2235*6777b538SAndroid Build Coastguard Worker 	    return -1;
2236*6777b538SAndroid Build Coastguard Worker 	sum += count;
2237*6777b538SAndroid Build Coastguard Worker     }
2238*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndElement(writer);
2239*6777b538SAndroid Build Coastguard Worker     if (count == -1)
2240*6777b538SAndroid Build Coastguard Worker         return -1;
2241*6777b538SAndroid Build Coastguard Worker     sum += count;
2242*6777b538SAndroid Build Coastguard Worker 
2243*6777b538SAndroid Build Coastguard Worker     return sum;
2244*6777b538SAndroid Build Coastguard Worker }
2245*6777b538SAndroid Build Coastguard Worker 
2246*6777b538SAndroid Build Coastguard Worker /**
2247*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatElementNS:
2248*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2249*6777b538SAndroid Build Coastguard Worker  * @prefix:  namespace prefix
2250*6777b538SAndroid Build Coastguard Worker  * @name:  element local name
2251*6777b538SAndroid Build Coastguard Worker  * @namespaceURI:  namespace URI
2252*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2253*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
2254*6777b538SAndroid Build Coastguard Worker  *
2255*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml element with namespace support.
2256*6777b538SAndroid Build Coastguard Worker  *
2257*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2258*6777b538SAndroid Build Coastguard Worker  */
2259*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer,const xmlChar * prefix,const xmlChar * name,const xmlChar * namespaceURI,const char * format,...)2260*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer,
2261*6777b538SAndroid Build Coastguard Worker                                   const xmlChar * prefix,
2262*6777b538SAndroid Build Coastguard Worker                                   const xmlChar * name,
2263*6777b538SAndroid Build Coastguard Worker                                   const xmlChar * namespaceURI,
2264*6777b538SAndroid Build Coastguard Worker                                   const char *format, ...)
2265*6777b538SAndroid Build Coastguard Worker {
2266*6777b538SAndroid Build Coastguard Worker     int rc;
2267*6777b538SAndroid Build Coastguard Worker     va_list ap;
2268*6777b538SAndroid Build Coastguard Worker 
2269*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
2270*6777b538SAndroid Build Coastguard Worker 
2271*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatElementNS(writer, prefix, name,
2272*6777b538SAndroid Build Coastguard Worker                                             namespaceURI, format, ap);
2273*6777b538SAndroid Build Coastguard Worker 
2274*6777b538SAndroid Build Coastguard Worker     va_end(ap);
2275*6777b538SAndroid Build Coastguard Worker     return rc;
2276*6777b538SAndroid Build Coastguard Worker }
2277*6777b538SAndroid Build Coastguard Worker 
2278*6777b538SAndroid Build Coastguard Worker /**
2279*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatElementNS:
2280*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2281*6777b538SAndroid Build Coastguard Worker  * @prefix:  namespace prefix
2282*6777b538SAndroid Build Coastguard Worker  * @name:  element local name
2283*6777b538SAndroid Build Coastguard Worker  * @namespaceURI:  namespace URI
2284*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2285*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
2286*6777b538SAndroid Build Coastguard Worker  *
2287*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml element with namespace support.
2288*6777b538SAndroid Build Coastguard Worker  *
2289*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2290*6777b538SAndroid Build Coastguard Worker  */
2291*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer,const xmlChar * prefix,const xmlChar * name,const xmlChar * namespaceURI,const char * format,va_list argptr)2292*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer,
2293*6777b538SAndroid Build Coastguard Worker                                    const xmlChar * prefix,
2294*6777b538SAndroid Build Coastguard Worker                                    const xmlChar * name,
2295*6777b538SAndroid Build Coastguard Worker                                    const xmlChar * namespaceURI,
2296*6777b538SAndroid Build Coastguard Worker                                    const char *format, va_list argptr)
2297*6777b538SAndroid Build Coastguard Worker {
2298*6777b538SAndroid Build Coastguard Worker     int rc;
2299*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
2300*6777b538SAndroid Build Coastguard Worker 
2301*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
2302*6777b538SAndroid Build Coastguard Worker         return -1;
2303*6777b538SAndroid Build Coastguard Worker 
2304*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
2305*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
2306*6777b538SAndroid Build Coastguard Worker         return -1;
2307*6777b538SAndroid Build Coastguard Worker 
2308*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteElementNS(writer, prefix, name, namespaceURI,
2309*6777b538SAndroid Build Coastguard Worker                                      buf);
2310*6777b538SAndroid Build Coastguard Worker 
2311*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
2312*6777b538SAndroid Build Coastguard Worker     return rc;
2313*6777b538SAndroid Build Coastguard Worker }
2314*6777b538SAndroid Build Coastguard Worker 
2315*6777b538SAndroid Build Coastguard Worker /**
2316*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteElementNS:
2317*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2318*6777b538SAndroid Build Coastguard Worker  * @prefix:  namespace prefix
2319*6777b538SAndroid Build Coastguard Worker  * @name:  element local name
2320*6777b538SAndroid Build Coastguard Worker  * @namespaceURI:  namespace URI
2321*6777b538SAndroid Build Coastguard Worker  * @content:  element content
2322*6777b538SAndroid Build Coastguard Worker  *
2323*6777b538SAndroid Build Coastguard Worker  * Write an xml element with namespace support.
2324*6777b538SAndroid Build Coastguard Worker  *
2325*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2326*6777b538SAndroid Build Coastguard Worker  */
2327*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteElementNS(xmlTextWriterPtr writer,const xmlChar * prefix,const xmlChar * name,const xmlChar * namespaceURI,const xmlChar * content)2328*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteElementNS(xmlTextWriterPtr writer,
2329*6777b538SAndroid Build Coastguard Worker                             const xmlChar * prefix, const xmlChar * name,
2330*6777b538SAndroid Build Coastguard Worker                             const xmlChar * namespaceURI,
2331*6777b538SAndroid Build Coastguard Worker                             const xmlChar * content)
2332*6777b538SAndroid Build Coastguard Worker {
2333*6777b538SAndroid Build Coastguard Worker     int count;
2334*6777b538SAndroid Build Coastguard Worker     int sum;
2335*6777b538SAndroid Build Coastguard Worker 
2336*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (name == NULL) || (*name == '\0'))
2337*6777b538SAndroid Build Coastguard Worker         return -1;
2338*6777b538SAndroid Build Coastguard Worker 
2339*6777b538SAndroid Build Coastguard Worker     sum = 0;
2340*6777b538SAndroid Build Coastguard Worker     count =
2341*6777b538SAndroid Build Coastguard Worker         xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI);
2342*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2343*6777b538SAndroid Build Coastguard Worker         return -1;
2344*6777b538SAndroid Build Coastguard Worker     sum += count;
2345*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterWriteString(writer, content);
2346*6777b538SAndroid Build Coastguard Worker     if (count == -1)
2347*6777b538SAndroid Build Coastguard Worker         return -1;
2348*6777b538SAndroid Build Coastguard Worker     sum += count;
2349*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndElement(writer);
2350*6777b538SAndroid Build Coastguard Worker     if (count == -1)
2351*6777b538SAndroid Build Coastguard Worker         return -1;
2352*6777b538SAndroid Build Coastguard Worker     sum += count;
2353*6777b538SAndroid Build Coastguard Worker 
2354*6777b538SAndroid Build Coastguard Worker     return sum;
2355*6777b538SAndroid Build Coastguard Worker }
2356*6777b538SAndroid Build Coastguard Worker 
2357*6777b538SAndroid Build Coastguard Worker /**
2358*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartPI:
2359*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2360*6777b538SAndroid Build Coastguard Worker  * @target:  PI target
2361*6777b538SAndroid Build Coastguard Worker  *
2362*6777b538SAndroid Build Coastguard Worker  * Start an xml PI.
2363*6777b538SAndroid Build Coastguard Worker  *
2364*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2365*6777b538SAndroid Build Coastguard Worker  */
2366*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartPI(xmlTextWriterPtr writer,const xmlChar * target)2367*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target)
2368*6777b538SAndroid Build Coastguard Worker {
2369*6777b538SAndroid Build Coastguard Worker     int count;
2370*6777b538SAndroid Build Coastguard Worker     int sum;
2371*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
2372*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
2373*6777b538SAndroid Build Coastguard Worker 
2374*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (target == NULL) || (*target == '\0'))
2375*6777b538SAndroid Build Coastguard Worker         return -1;
2376*6777b538SAndroid Build Coastguard Worker 
2377*6777b538SAndroid Build Coastguard Worker     if (xmlStrcasecmp(target, (const xmlChar *) "xml") == 0) {
2378*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
2379*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartPI : target name [Xx][Mm][Ll] is reserved for xml standardization!\n");
2380*6777b538SAndroid Build Coastguard Worker         return -1;
2381*6777b538SAndroid Build Coastguard Worker     }
2382*6777b538SAndroid Build Coastguard Worker 
2383*6777b538SAndroid Build Coastguard Worker     sum = 0;
2384*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
2385*6777b538SAndroid Build Coastguard Worker     if (lk != 0) {
2386*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
2387*6777b538SAndroid Build Coastguard Worker         if (p != 0) {
2388*6777b538SAndroid Build Coastguard Worker             switch (p->state) {
2389*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_ATTRIBUTE:
2390*6777b538SAndroid Build Coastguard Worker                     count = xmlTextWriterEndAttribute(writer);
2391*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
2392*6777b538SAndroid Build Coastguard Worker                         return -1;
2393*6777b538SAndroid Build Coastguard Worker                     sum += count;
2394*6777b538SAndroid Build Coastguard Worker                     /* fallthrough */
2395*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NAME:
2396*6777b538SAndroid Build Coastguard Worker                     /* Output namespace declarations */
2397*6777b538SAndroid Build Coastguard Worker                     count = xmlTextWriterOutputNSDecl(writer);
2398*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
2399*6777b538SAndroid Build Coastguard Worker                         return -1;
2400*6777b538SAndroid Build Coastguard Worker                     sum += count;
2401*6777b538SAndroid Build Coastguard Worker                     count = xmlOutputBufferWriteString(writer->out, ">");
2402*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
2403*6777b538SAndroid Build Coastguard Worker                         return -1;
2404*6777b538SAndroid Build Coastguard Worker                     sum += count;
2405*6777b538SAndroid Build Coastguard Worker                     p->state = XML_TEXTWRITER_TEXT;
2406*6777b538SAndroid Build Coastguard Worker                     break;
2407*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NONE:
2408*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_TEXT:
2409*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_DTD:
2410*6777b538SAndroid Build Coastguard Worker                     break;
2411*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_PI:
2412*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_PI_TEXT:
2413*6777b538SAndroid Build Coastguard Worker                     xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
2414*6777b538SAndroid Build Coastguard Worker                                     "xmlTextWriterStartPI : nested PI!\n");
2415*6777b538SAndroid Build Coastguard Worker                     return -1;
2416*6777b538SAndroid Build Coastguard Worker                 default:
2417*6777b538SAndroid Build Coastguard Worker                     return -1;
2418*6777b538SAndroid Build Coastguard Worker             }
2419*6777b538SAndroid Build Coastguard Worker         }
2420*6777b538SAndroid Build Coastguard Worker     }
2421*6777b538SAndroid Build Coastguard Worker 
2422*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *)
2423*6777b538SAndroid Build Coastguard Worker         xmlMalloc(sizeof(xmlTextWriterStackEntry));
2424*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
2425*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
2426*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartPI : out of memory!\n");
2427*6777b538SAndroid Build Coastguard Worker         return -1;
2428*6777b538SAndroid Build Coastguard Worker     }
2429*6777b538SAndroid Build Coastguard Worker 
2430*6777b538SAndroid Build Coastguard Worker     p->name = xmlStrdup(target);
2431*6777b538SAndroid Build Coastguard Worker     if (p->name == 0) {
2432*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
2433*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartPI : out of memory!\n");
2434*6777b538SAndroid Build Coastguard Worker         xmlFree(p);
2435*6777b538SAndroid Build Coastguard Worker         return -1;
2436*6777b538SAndroid Build Coastguard Worker     }
2437*6777b538SAndroid Build Coastguard Worker     p->state = XML_TEXTWRITER_PI;
2438*6777b538SAndroid Build Coastguard Worker 
2439*6777b538SAndroid Build Coastguard Worker     xmlListPushFront(writer->nodes, p);
2440*6777b538SAndroid Build Coastguard Worker 
2441*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<?");
2442*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2443*6777b538SAndroid Build Coastguard Worker         return -1;
2444*6777b538SAndroid Build Coastguard Worker     sum += count;
2445*6777b538SAndroid Build Coastguard Worker     count =
2446*6777b538SAndroid Build Coastguard Worker         xmlOutputBufferWriteString(writer->out, (const char *) p->name);
2447*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2448*6777b538SAndroid Build Coastguard Worker         return -1;
2449*6777b538SAndroid Build Coastguard Worker     sum += count;
2450*6777b538SAndroid Build Coastguard Worker 
2451*6777b538SAndroid Build Coastguard Worker     return sum;
2452*6777b538SAndroid Build Coastguard Worker }
2453*6777b538SAndroid Build Coastguard Worker 
2454*6777b538SAndroid Build Coastguard Worker /**
2455*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndPI:
2456*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2457*6777b538SAndroid Build Coastguard Worker  *
2458*6777b538SAndroid Build Coastguard Worker  * End the current xml PI.
2459*6777b538SAndroid Build Coastguard Worker  *
2460*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2461*6777b538SAndroid Build Coastguard Worker  */
2462*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndPI(xmlTextWriterPtr writer)2463*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndPI(xmlTextWriterPtr writer)
2464*6777b538SAndroid Build Coastguard Worker {
2465*6777b538SAndroid Build Coastguard Worker     int count;
2466*6777b538SAndroid Build Coastguard Worker     int sum;
2467*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
2468*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
2469*6777b538SAndroid Build Coastguard Worker 
2470*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
2471*6777b538SAndroid Build Coastguard Worker         return -1;
2472*6777b538SAndroid Build Coastguard Worker 
2473*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
2474*6777b538SAndroid Build Coastguard Worker     if (lk == 0)
2475*6777b538SAndroid Build Coastguard Worker         return 0;
2476*6777b538SAndroid Build Coastguard Worker 
2477*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
2478*6777b538SAndroid Build Coastguard Worker     if (p == 0)
2479*6777b538SAndroid Build Coastguard Worker         return 0;
2480*6777b538SAndroid Build Coastguard Worker 
2481*6777b538SAndroid Build Coastguard Worker     sum = 0;
2482*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
2483*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_PI:
2484*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_PI_TEXT:
2485*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, "?>");
2486*6777b538SAndroid Build Coastguard Worker             if (count < 0)
2487*6777b538SAndroid Build Coastguard Worker                 return -1;
2488*6777b538SAndroid Build Coastguard Worker             sum += count;
2489*6777b538SAndroid Build Coastguard Worker             break;
2490*6777b538SAndroid Build Coastguard Worker         default:
2491*6777b538SAndroid Build Coastguard Worker             return -1;
2492*6777b538SAndroid Build Coastguard Worker     }
2493*6777b538SAndroid Build Coastguard Worker 
2494*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
2495*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "\n");
2496*6777b538SAndroid Build Coastguard Worker 	if (count < 0)
2497*6777b538SAndroid Build Coastguard Worker 	return -1;
2498*6777b538SAndroid Build Coastguard Worker         sum += count;
2499*6777b538SAndroid Build Coastguard Worker     }
2500*6777b538SAndroid Build Coastguard Worker 
2501*6777b538SAndroid Build Coastguard Worker     xmlListPopFront(writer->nodes);
2502*6777b538SAndroid Build Coastguard Worker     return sum;
2503*6777b538SAndroid Build Coastguard Worker }
2504*6777b538SAndroid Build Coastguard Worker 
2505*6777b538SAndroid Build Coastguard Worker /**
2506*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatPI:
2507*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2508*6777b538SAndroid Build Coastguard Worker  * @target:  PI target
2509*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2510*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
2511*6777b538SAndroid Build Coastguard Worker  *
2512*6777b538SAndroid Build Coastguard Worker  * Write a formatted PI.
2513*6777b538SAndroid Build Coastguard Worker  *
2514*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2515*6777b538SAndroid Build Coastguard Worker  */
2516*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer,const xmlChar * target,const char * format,...)2517*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target,
2518*6777b538SAndroid Build Coastguard Worker                            const char *format, ...)
2519*6777b538SAndroid Build Coastguard Worker {
2520*6777b538SAndroid Build Coastguard Worker     int rc;
2521*6777b538SAndroid Build Coastguard Worker     va_list ap;
2522*6777b538SAndroid Build Coastguard Worker 
2523*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
2524*6777b538SAndroid Build Coastguard Worker 
2525*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatPI(writer, target, format, ap);
2526*6777b538SAndroid Build Coastguard Worker 
2527*6777b538SAndroid Build Coastguard Worker     va_end(ap);
2528*6777b538SAndroid Build Coastguard Worker     return rc;
2529*6777b538SAndroid Build Coastguard Worker }
2530*6777b538SAndroid Build Coastguard Worker 
2531*6777b538SAndroid Build Coastguard Worker /**
2532*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatPI:
2533*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2534*6777b538SAndroid Build Coastguard Worker  * @target:  PI target
2535*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2536*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
2537*6777b538SAndroid Build Coastguard Worker  *
2538*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml PI.
2539*6777b538SAndroid Build Coastguard Worker  *
2540*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2541*6777b538SAndroid Build Coastguard Worker  */
2542*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer,const xmlChar * target,const char * format,va_list argptr)2543*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer,
2544*6777b538SAndroid Build Coastguard Worker                             const xmlChar * target, const char *format,
2545*6777b538SAndroid Build Coastguard Worker                             va_list argptr)
2546*6777b538SAndroid Build Coastguard Worker {
2547*6777b538SAndroid Build Coastguard Worker     int rc;
2548*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
2549*6777b538SAndroid Build Coastguard Worker 
2550*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
2551*6777b538SAndroid Build Coastguard Worker         return -1;
2552*6777b538SAndroid Build Coastguard Worker 
2553*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
2554*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
2555*6777b538SAndroid Build Coastguard Worker         return -1;
2556*6777b538SAndroid Build Coastguard Worker 
2557*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWritePI(writer, target, buf);
2558*6777b538SAndroid Build Coastguard Worker 
2559*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
2560*6777b538SAndroid Build Coastguard Worker     return rc;
2561*6777b538SAndroid Build Coastguard Worker }
2562*6777b538SAndroid Build Coastguard Worker 
2563*6777b538SAndroid Build Coastguard Worker /**
2564*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWritePI:
2565*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2566*6777b538SAndroid Build Coastguard Worker  * @target:  PI target
2567*6777b538SAndroid Build Coastguard Worker  * @content:  PI content
2568*6777b538SAndroid Build Coastguard Worker  *
2569*6777b538SAndroid Build Coastguard Worker  * Write an xml PI.
2570*6777b538SAndroid Build Coastguard Worker  *
2571*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2572*6777b538SAndroid Build Coastguard Worker  */
2573*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWritePI(xmlTextWriterPtr writer,const xmlChar * target,const xmlChar * content)2574*6777b538SAndroid Build Coastguard Worker xmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target,
2575*6777b538SAndroid Build Coastguard Worker                      const xmlChar * content)
2576*6777b538SAndroid Build Coastguard Worker {
2577*6777b538SAndroid Build Coastguard Worker     int count;
2578*6777b538SAndroid Build Coastguard Worker     int sum;
2579*6777b538SAndroid Build Coastguard Worker 
2580*6777b538SAndroid Build Coastguard Worker     sum = 0;
2581*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartPI(writer, target);
2582*6777b538SAndroid Build Coastguard Worker     if (count == -1)
2583*6777b538SAndroid Build Coastguard Worker         return -1;
2584*6777b538SAndroid Build Coastguard Worker     sum += count;
2585*6777b538SAndroid Build Coastguard Worker     if (content != 0) {
2586*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteString(writer, content);
2587*6777b538SAndroid Build Coastguard Worker         if (count == -1)
2588*6777b538SAndroid Build Coastguard Worker             return -1;
2589*6777b538SAndroid Build Coastguard Worker         sum += count;
2590*6777b538SAndroid Build Coastguard Worker     }
2591*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndPI(writer);
2592*6777b538SAndroid Build Coastguard Worker     if (count == -1)
2593*6777b538SAndroid Build Coastguard Worker         return -1;
2594*6777b538SAndroid Build Coastguard Worker     sum += count;
2595*6777b538SAndroid Build Coastguard Worker 
2596*6777b538SAndroid Build Coastguard Worker     return sum;
2597*6777b538SAndroid Build Coastguard Worker }
2598*6777b538SAndroid Build Coastguard Worker 
2599*6777b538SAndroid Build Coastguard Worker /**
2600*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartCDATA:
2601*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2602*6777b538SAndroid Build Coastguard Worker  *
2603*6777b538SAndroid Build Coastguard Worker  * Start an xml CDATA section.
2604*6777b538SAndroid Build Coastguard Worker  *
2605*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2606*6777b538SAndroid Build Coastguard Worker  */
2607*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartCDATA(xmlTextWriterPtr writer)2608*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartCDATA(xmlTextWriterPtr writer)
2609*6777b538SAndroid Build Coastguard Worker {
2610*6777b538SAndroid Build Coastguard Worker     int count;
2611*6777b538SAndroid Build Coastguard Worker     int sum;
2612*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
2613*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
2614*6777b538SAndroid Build Coastguard Worker 
2615*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
2616*6777b538SAndroid Build Coastguard Worker         return -1;
2617*6777b538SAndroid Build Coastguard Worker 
2618*6777b538SAndroid Build Coastguard Worker     sum = 0;
2619*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
2620*6777b538SAndroid Build Coastguard Worker     if (lk != 0) {
2621*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
2622*6777b538SAndroid Build Coastguard Worker         if (p != 0) {
2623*6777b538SAndroid Build Coastguard Worker             switch (p->state) {
2624*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NONE:
2625*6777b538SAndroid Build Coastguard Worker 		case XML_TEXTWRITER_TEXT:
2626*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_PI:
2627*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_PI_TEXT:
2628*6777b538SAndroid Build Coastguard Worker                     break;
2629*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_ATTRIBUTE:
2630*6777b538SAndroid Build Coastguard Worker                     count = xmlTextWriterEndAttribute(writer);
2631*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
2632*6777b538SAndroid Build Coastguard Worker                         return -1;
2633*6777b538SAndroid Build Coastguard Worker                     sum += count;
2634*6777b538SAndroid Build Coastguard Worker                     /* fallthrough */
2635*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NAME:
2636*6777b538SAndroid Build Coastguard Worker                     /* Output namespace declarations */
2637*6777b538SAndroid Build Coastguard Worker                     count = xmlTextWriterOutputNSDecl(writer);
2638*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
2639*6777b538SAndroid Build Coastguard Worker                         return -1;
2640*6777b538SAndroid Build Coastguard Worker                     sum += count;
2641*6777b538SAndroid Build Coastguard Worker                     count = xmlOutputBufferWriteString(writer->out, ">");
2642*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
2643*6777b538SAndroid Build Coastguard Worker                         return -1;
2644*6777b538SAndroid Build Coastguard Worker                     sum += count;
2645*6777b538SAndroid Build Coastguard Worker                     p->state = XML_TEXTWRITER_TEXT;
2646*6777b538SAndroid Build Coastguard Worker                     break;
2647*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_CDATA:
2648*6777b538SAndroid Build Coastguard Worker                     xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
2649*6777b538SAndroid Build Coastguard Worker                                     "xmlTextWriterStartCDATA : CDATA not allowed in this context!\n");
2650*6777b538SAndroid Build Coastguard Worker                     return -1;
2651*6777b538SAndroid Build Coastguard Worker                 default:
2652*6777b538SAndroid Build Coastguard Worker                     return -1;
2653*6777b538SAndroid Build Coastguard Worker             }
2654*6777b538SAndroid Build Coastguard Worker         }
2655*6777b538SAndroid Build Coastguard Worker     }
2656*6777b538SAndroid Build Coastguard Worker 
2657*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *)
2658*6777b538SAndroid Build Coastguard Worker         xmlMalloc(sizeof(xmlTextWriterStackEntry));
2659*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
2660*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
2661*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartCDATA : out of memory!\n");
2662*6777b538SAndroid Build Coastguard Worker         return -1;
2663*6777b538SAndroid Build Coastguard Worker     }
2664*6777b538SAndroid Build Coastguard Worker 
2665*6777b538SAndroid Build Coastguard Worker     p->name = NULL;
2666*6777b538SAndroid Build Coastguard Worker     p->state = XML_TEXTWRITER_CDATA;
2667*6777b538SAndroid Build Coastguard Worker 
2668*6777b538SAndroid Build Coastguard Worker     xmlListPushFront(writer->nodes, p);
2669*6777b538SAndroid Build Coastguard Worker 
2670*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<![CDATA[");
2671*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2672*6777b538SAndroid Build Coastguard Worker         return -1;
2673*6777b538SAndroid Build Coastguard Worker     sum += count;
2674*6777b538SAndroid Build Coastguard Worker 
2675*6777b538SAndroid Build Coastguard Worker     return sum;
2676*6777b538SAndroid Build Coastguard Worker }
2677*6777b538SAndroid Build Coastguard Worker 
2678*6777b538SAndroid Build Coastguard Worker /**
2679*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndCDATA:
2680*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2681*6777b538SAndroid Build Coastguard Worker  *
2682*6777b538SAndroid Build Coastguard Worker  * End an xml CDATA section.
2683*6777b538SAndroid Build Coastguard Worker  *
2684*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2685*6777b538SAndroid Build Coastguard Worker  */
2686*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndCDATA(xmlTextWriterPtr writer)2687*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndCDATA(xmlTextWriterPtr writer)
2688*6777b538SAndroid Build Coastguard Worker {
2689*6777b538SAndroid Build Coastguard Worker     int count;
2690*6777b538SAndroid Build Coastguard Worker     int sum;
2691*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
2692*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
2693*6777b538SAndroid Build Coastguard Worker 
2694*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
2695*6777b538SAndroid Build Coastguard Worker         return -1;
2696*6777b538SAndroid Build Coastguard Worker 
2697*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
2698*6777b538SAndroid Build Coastguard Worker     if (lk == 0)
2699*6777b538SAndroid Build Coastguard Worker         return -1;
2700*6777b538SAndroid Build Coastguard Worker 
2701*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
2702*6777b538SAndroid Build Coastguard Worker     if (p == 0)
2703*6777b538SAndroid Build Coastguard Worker         return -1;
2704*6777b538SAndroid Build Coastguard Worker 
2705*6777b538SAndroid Build Coastguard Worker     sum = 0;
2706*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
2707*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_CDATA:
2708*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, "]]>");
2709*6777b538SAndroid Build Coastguard Worker             if (count < 0)
2710*6777b538SAndroid Build Coastguard Worker                 return -1;
2711*6777b538SAndroid Build Coastguard Worker             sum += count;
2712*6777b538SAndroid Build Coastguard Worker             break;
2713*6777b538SAndroid Build Coastguard Worker         default:
2714*6777b538SAndroid Build Coastguard Worker             return -1;
2715*6777b538SAndroid Build Coastguard Worker     }
2716*6777b538SAndroid Build Coastguard Worker 
2717*6777b538SAndroid Build Coastguard Worker     xmlListPopFront(writer->nodes);
2718*6777b538SAndroid Build Coastguard Worker     return sum;
2719*6777b538SAndroid Build Coastguard Worker }
2720*6777b538SAndroid Build Coastguard Worker 
2721*6777b538SAndroid Build Coastguard Worker /**
2722*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatCDATA:
2723*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2724*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2725*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
2726*6777b538SAndroid Build Coastguard Worker  *
2727*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml CDATA.
2728*6777b538SAndroid Build Coastguard Worker  *
2729*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2730*6777b538SAndroid Build Coastguard Worker  */
2731*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer,const char * format,...)2732*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format,
2733*6777b538SAndroid Build Coastguard Worker                               ...)
2734*6777b538SAndroid Build Coastguard Worker {
2735*6777b538SAndroid Build Coastguard Worker     int rc;
2736*6777b538SAndroid Build Coastguard Worker     va_list ap;
2737*6777b538SAndroid Build Coastguard Worker 
2738*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
2739*6777b538SAndroid Build Coastguard Worker 
2740*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatCDATA(writer, format, ap);
2741*6777b538SAndroid Build Coastguard Worker 
2742*6777b538SAndroid Build Coastguard Worker     va_end(ap);
2743*6777b538SAndroid Build Coastguard Worker     return rc;
2744*6777b538SAndroid Build Coastguard Worker }
2745*6777b538SAndroid Build Coastguard Worker 
2746*6777b538SAndroid Build Coastguard Worker /**
2747*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatCDATA:
2748*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2749*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
2750*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
2751*6777b538SAndroid Build Coastguard Worker  *
2752*6777b538SAndroid Build Coastguard Worker  * Write a formatted xml CDATA.
2753*6777b538SAndroid Build Coastguard Worker  *
2754*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2755*6777b538SAndroid Build Coastguard Worker  */
2756*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer,const char * format,va_list argptr)2757*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format,
2758*6777b538SAndroid Build Coastguard Worker                                va_list argptr)
2759*6777b538SAndroid Build Coastguard Worker {
2760*6777b538SAndroid Build Coastguard Worker     int rc;
2761*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
2762*6777b538SAndroid Build Coastguard Worker 
2763*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
2764*6777b538SAndroid Build Coastguard Worker         return -1;
2765*6777b538SAndroid Build Coastguard Worker 
2766*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
2767*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
2768*6777b538SAndroid Build Coastguard Worker         return -1;
2769*6777b538SAndroid Build Coastguard Worker 
2770*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteCDATA(writer, buf);
2771*6777b538SAndroid Build Coastguard Worker 
2772*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
2773*6777b538SAndroid Build Coastguard Worker     return rc;
2774*6777b538SAndroid Build Coastguard Worker }
2775*6777b538SAndroid Build Coastguard Worker 
2776*6777b538SAndroid Build Coastguard Worker /**
2777*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteCDATA:
2778*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2779*6777b538SAndroid Build Coastguard Worker  * @content:  CDATA content
2780*6777b538SAndroid Build Coastguard Worker  *
2781*6777b538SAndroid Build Coastguard Worker  * Write an xml CDATA.
2782*6777b538SAndroid Build Coastguard Worker  *
2783*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2784*6777b538SAndroid Build Coastguard Worker  */
2785*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteCDATA(xmlTextWriterPtr writer,const xmlChar * content)2786*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content)
2787*6777b538SAndroid Build Coastguard Worker {
2788*6777b538SAndroid Build Coastguard Worker     int count;
2789*6777b538SAndroid Build Coastguard Worker     int sum;
2790*6777b538SAndroid Build Coastguard Worker 
2791*6777b538SAndroid Build Coastguard Worker     sum = 0;
2792*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartCDATA(writer);
2793*6777b538SAndroid Build Coastguard Worker     if (count == -1)
2794*6777b538SAndroid Build Coastguard Worker         return -1;
2795*6777b538SAndroid Build Coastguard Worker     sum += count;
2796*6777b538SAndroid Build Coastguard Worker     if (content != 0) {
2797*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteString(writer, content);
2798*6777b538SAndroid Build Coastguard Worker         if (count == -1)
2799*6777b538SAndroid Build Coastguard Worker             return -1;
2800*6777b538SAndroid Build Coastguard Worker         sum += count;
2801*6777b538SAndroid Build Coastguard Worker     }
2802*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndCDATA(writer);
2803*6777b538SAndroid Build Coastguard Worker     if (count == -1)
2804*6777b538SAndroid Build Coastguard Worker         return -1;
2805*6777b538SAndroid Build Coastguard Worker     sum += count;
2806*6777b538SAndroid Build Coastguard Worker 
2807*6777b538SAndroid Build Coastguard Worker     return sum;
2808*6777b538SAndroid Build Coastguard Worker }
2809*6777b538SAndroid Build Coastguard Worker 
2810*6777b538SAndroid Build Coastguard Worker /**
2811*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartDTD:
2812*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2813*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD
2814*6777b538SAndroid Build Coastguard Worker  * @pubid:  the public identifier, which is an alternative to the system identifier
2815*6777b538SAndroid Build Coastguard Worker  * @sysid:  the system identifier, which is the URI of the DTD
2816*6777b538SAndroid Build Coastguard Worker  *
2817*6777b538SAndroid Build Coastguard Worker  * Start an xml DTD.
2818*6777b538SAndroid Build Coastguard Worker  *
2819*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2820*6777b538SAndroid Build Coastguard Worker  */
2821*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartDTD(xmlTextWriterPtr writer,const xmlChar * name,const xmlChar * pubid,const xmlChar * sysid)2822*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartDTD(xmlTextWriterPtr writer,
2823*6777b538SAndroid Build Coastguard Worker                       const xmlChar * name,
2824*6777b538SAndroid Build Coastguard Worker                       const xmlChar * pubid, const xmlChar * sysid)
2825*6777b538SAndroid Build Coastguard Worker {
2826*6777b538SAndroid Build Coastguard Worker     int count;
2827*6777b538SAndroid Build Coastguard Worker     int sum;
2828*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
2829*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
2830*6777b538SAndroid Build Coastguard Worker 
2831*6777b538SAndroid Build Coastguard Worker     if (writer == NULL || name == NULL || *name == '\0')
2832*6777b538SAndroid Build Coastguard Worker         return -1;
2833*6777b538SAndroid Build Coastguard Worker 
2834*6777b538SAndroid Build Coastguard Worker     sum = 0;
2835*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
2836*6777b538SAndroid Build Coastguard Worker     if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
2837*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
2838*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDTD : DTD allowed only in prolog!\n");
2839*6777b538SAndroid Build Coastguard Worker         return -1;
2840*6777b538SAndroid Build Coastguard Worker     }
2841*6777b538SAndroid Build Coastguard Worker 
2842*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *)
2843*6777b538SAndroid Build Coastguard Worker         xmlMalloc(sizeof(xmlTextWriterStackEntry));
2844*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
2845*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
2846*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDTD : out of memory!\n");
2847*6777b538SAndroid Build Coastguard Worker         return -1;
2848*6777b538SAndroid Build Coastguard Worker     }
2849*6777b538SAndroid Build Coastguard Worker 
2850*6777b538SAndroid Build Coastguard Worker     p->name = xmlStrdup(name);
2851*6777b538SAndroid Build Coastguard Worker     if (p->name == 0) {
2852*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
2853*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDTD : out of memory!\n");
2854*6777b538SAndroid Build Coastguard Worker         xmlFree(p);
2855*6777b538SAndroid Build Coastguard Worker         return -1;
2856*6777b538SAndroid Build Coastguard Worker     }
2857*6777b538SAndroid Build Coastguard Worker     p->state = XML_TEXTWRITER_DTD;
2858*6777b538SAndroid Build Coastguard Worker 
2859*6777b538SAndroid Build Coastguard Worker     xmlListPushFront(writer->nodes, p);
2860*6777b538SAndroid Build Coastguard Worker 
2861*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<!DOCTYPE ");
2862*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2863*6777b538SAndroid Build Coastguard Worker         return -1;
2864*6777b538SAndroid Build Coastguard Worker     sum += count;
2865*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, (const char *) name);
2866*6777b538SAndroid Build Coastguard Worker     if (count < 0)
2867*6777b538SAndroid Build Coastguard Worker         return -1;
2868*6777b538SAndroid Build Coastguard Worker     sum += count;
2869*6777b538SAndroid Build Coastguard Worker 
2870*6777b538SAndroid Build Coastguard Worker     if (pubid != 0) {
2871*6777b538SAndroid Build Coastguard Worker         if (sysid == 0) {
2872*6777b538SAndroid Build Coastguard Worker             xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
2873*6777b538SAndroid Build Coastguard Worker                             "xmlTextWriterStartDTD : system identifier needed!\n");
2874*6777b538SAndroid Build Coastguard Worker             return -1;
2875*6777b538SAndroid Build Coastguard Worker         }
2876*6777b538SAndroid Build Coastguard Worker 
2877*6777b538SAndroid Build Coastguard Worker         if (writer->indent)
2878*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWrite(writer->out, 1, "\n");
2879*6777b538SAndroid Build Coastguard Worker         else
2880*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWrite(writer->out, 1, " ");
2881*6777b538SAndroid Build Coastguard Worker         if (count < 0)
2882*6777b538SAndroid Build Coastguard Worker             return -1;
2883*6777b538SAndroid Build Coastguard Worker         sum += count;
2884*6777b538SAndroid Build Coastguard Worker 
2885*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "PUBLIC ");
2886*6777b538SAndroid Build Coastguard Worker         if (count < 0)
2887*6777b538SAndroid Build Coastguard Worker             return -1;
2888*6777b538SAndroid Build Coastguard Worker         sum += count;
2889*6777b538SAndroid Build Coastguard Worker 
2890*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
2891*6777b538SAndroid Build Coastguard Worker         if (count < 0)
2892*6777b538SAndroid Build Coastguard Worker             return -1;
2893*6777b538SAndroid Build Coastguard Worker         sum += count;
2894*6777b538SAndroid Build Coastguard Worker 
2895*6777b538SAndroid Build Coastguard Worker         count =
2896*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWriteString(writer->out, (const char *) pubid);
2897*6777b538SAndroid Build Coastguard Worker         if (count < 0)
2898*6777b538SAndroid Build Coastguard Worker             return -1;
2899*6777b538SAndroid Build Coastguard Worker         sum += count;
2900*6777b538SAndroid Build Coastguard Worker 
2901*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
2902*6777b538SAndroid Build Coastguard Worker         if (count < 0)
2903*6777b538SAndroid Build Coastguard Worker             return -1;
2904*6777b538SAndroid Build Coastguard Worker         sum += count;
2905*6777b538SAndroid Build Coastguard Worker     }
2906*6777b538SAndroid Build Coastguard Worker 
2907*6777b538SAndroid Build Coastguard Worker     if (sysid != 0) {
2908*6777b538SAndroid Build Coastguard Worker         if (pubid == 0) {
2909*6777b538SAndroid Build Coastguard Worker             if (writer->indent)
2910*6777b538SAndroid Build Coastguard Worker                 count = xmlOutputBufferWrite(writer->out, 1, "\n");
2911*6777b538SAndroid Build Coastguard Worker             else
2912*6777b538SAndroid Build Coastguard Worker                 count = xmlOutputBufferWrite(writer->out, 1, " ");
2913*6777b538SAndroid Build Coastguard Worker             if (count < 0)
2914*6777b538SAndroid Build Coastguard Worker                 return -1;
2915*6777b538SAndroid Build Coastguard Worker             sum += count;
2916*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, "SYSTEM ");
2917*6777b538SAndroid Build Coastguard Worker             if (count < 0)
2918*6777b538SAndroid Build Coastguard Worker                 return -1;
2919*6777b538SAndroid Build Coastguard Worker             sum += count;
2920*6777b538SAndroid Build Coastguard Worker         } else {
2921*6777b538SAndroid Build Coastguard Worker 			if (writer->indent)
2922*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, "\n       ");
2923*6777b538SAndroid Build Coastguard Worker             else
2924*6777b538SAndroid Build Coastguard Worker                 count = xmlOutputBufferWrite(writer->out, 1, " ");
2925*6777b538SAndroid Build Coastguard Worker             if (count < 0)
2926*6777b538SAndroid Build Coastguard Worker                 return -1;
2927*6777b538SAndroid Build Coastguard Worker             sum += count;
2928*6777b538SAndroid Build Coastguard Worker         }
2929*6777b538SAndroid Build Coastguard Worker 
2930*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
2931*6777b538SAndroid Build Coastguard Worker         if (count < 0)
2932*6777b538SAndroid Build Coastguard Worker             return -1;
2933*6777b538SAndroid Build Coastguard Worker         sum += count;
2934*6777b538SAndroid Build Coastguard Worker 
2935*6777b538SAndroid Build Coastguard Worker         count =
2936*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWriteString(writer->out, (const char *) sysid);
2937*6777b538SAndroid Build Coastguard Worker         if (count < 0)
2938*6777b538SAndroid Build Coastguard Worker             return -1;
2939*6777b538SAndroid Build Coastguard Worker         sum += count;
2940*6777b538SAndroid Build Coastguard Worker 
2941*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
2942*6777b538SAndroid Build Coastguard Worker         if (count < 0)
2943*6777b538SAndroid Build Coastguard Worker             return -1;
2944*6777b538SAndroid Build Coastguard Worker         sum += count;
2945*6777b538SAndroid Build Coastguard Worker     }
2946*6777b538SAndroid Build Coastguard Worker 
2947*6777b538SAndroid Build Coastguard Worker     return sum;
2948*6777b538SAndroid Build Coastguard Worker }
2949*6777b538SAndroid Build Coastguard Worker 
2950*6777b538SAndroid Build Coastguard Worker /**
2951*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndDTD:
2952*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
2953*6777b538SAndroid Build Coastguard Worker  *
2954*6777b538SAndroid Build Coastguard Worker  * End an xml DTD.
2955*6777b538SAndroid Build Coastguard Worker  *
2956*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
2957*6777b538SAndroid Build Coastguard Worker  */
2958*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndDTD(xmlTextWriterPtr writer)2959*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndDTD(xmlTextWriterPtr writer)
2960*6777b538SAndroid Build Coastguard Worker {
2961*6777b538SAndroid Build Coastguard Worker     int loop;
2962*6777b538SAndroid Build Coastguard Worker     int count;
2963*6777b538SAndroid Build Coastguard Worker     int sum;
2964*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
2965*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
2966*6777b538SAndroid Build Coastguard Worker 
2967*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
2968*6777b538SAndroid Build Coastguard Worker         return -1;
2969*6777b538SAndroid Build Coastguard Worker 
2970*6777b538SAndroid Build Coastguard Worker     sum = 0;
2971*6777b538SAndroid Build Coastguard Worker     loop = 1;
2972*6777b538SAndroid Build Coastguard Worker     while (loop) {
2973*6777b538SAndroid Build Coastguard Worker         lk = xmlListFront(writer->nodes);
2974*6777b538SAndroid Build Coastguard Worker         if (lk == NULL)
2975*6777b538SAndroid Build Coastguard Worker             break;
2976*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
2977*6777b538SAndroid Build Coastguard Worker         if (p == 0)
2978*6777b538SAndroid Build Coastguard Worker             break;
2979*6777b538SAndroid Build Coastguard Worker         switch (p->state) {
2980*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_TEXT:
2981*6777b538SAndroid Build Coastguard Worker                 count = xmlOutputBufferWriteString(writer->out, "]");
2982*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
2983*6777b538SAndroid Build Coastguard Worker                     return -1;
2984*6777b538SAndroid Build Coastguard Worker                 sum += count;
2985*6777b538SAndroid Build Coastguard Worker                 /* fallthrough */
2986*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD:
2987*6777b538SAndroid Build Coastguard Worker                 count = xmlOutputBufferWriteString(writer->out, ">");
2988*6777b538SAndroid Build Coastguard Worker 
2989*6777b538SAndroid Build Coastguard Worker                 if (writer->indent) {
2990*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
2991*6777b538SAndroid Build Coastguard Worker                         return -1;
2992*6777b538SAndroid Build Coastguard Worker                     sum += count;
2993*6777b538SAndroid Build Coastguard Worker                     count = xmlOutputBufferWriteString(writer->out, "\n");
2994*6777b538SAndroid Build Coastguard Worker                 }
2995*6777b538SAndroid Build Coastguard Worker 
2996*6777b538SAndroid Build Coastguard Worker                 xmlListPopFront(writer->nodes);
2997*6777b538SAndroid Build Coastguard Worker                 break;
2998*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ELEM:
2999*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ELEM_TEXT:
3000*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterEndDTDElement(writer);
3001*6777b538SAndroid Build Coastguard Worker                 break;
3002*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ATTL:
3003*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ATTL_TEXT:
3004*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterEndDTDAttlist(writer);
3005*6777b538SAndroid Build Coastguard Worker                 break;
3006*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ENTY:
3007*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_PENT:
3008*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ENTY_TEXT:
3009*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterEndDTDEntity(writer);
3010*6777b538SAndroid Build Coastguard Worker                 break;
3011*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_COMMENT:
3012*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterEndComment(writer);
3013*6777b538SAndroid Build Coastguard Worker                 break;
3014*6777b538SAndroid Build Coastguard Worker             default:
3015*6777b538SAndroid Build Coastguard Worker                 loop = 0;
3016*6777b538SAndroid Build Coastguard Worker                 continue;
3017*6777b538SAndroid Build Coastguard Worker         }
3018*6777b538SAndroid Build Coastguard Worker 
3019*6777b538SAndroid Build Coastguard Worker         if (count < 0)
3020*6777b538SAndroid Build Coastguard Worker             return -1;
3021*6777b538SAndroid Build Coastguard Worker         sum += count;
3022*6777b538SAndroid Build Coastguard Worker     }
3023*6777b538SAndroid Build Coastguard Worker 
3024*6777b538SAndroid Build Coastguard Worker     return sum;
3025*6777b538SAndroid Build Coastguard Worker }
3026*6777b538SAndroid Build Coastguard Worker 
3027*6777b538SAndroid Build Coastguard Worker /**
3028*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatDTD:
3029*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3030*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD
3031*6777b538SAndroid Build Coastguard Worker  * @pubid:  the public identifier, which is an alternative to the system identifier
3032*6777b538SAndroid Build Coastguard Worker  * @sysid:  the system identifier, which is the URI of the DTD
3033*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
3034*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
3035*6777b538SAndroid Build Coastguard Worker  *
3036*6777b538SAndroid Build Coastguard Worker  * Write a DTD with a formatted markup declarations part.
3037*6777b538SAndroid Build Coastguard Worker  *
3038*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3039*6777b538SAndroid Build Coastguard Worker  */
3040*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer,const xmlChar * name,const xmlChar * pubid,const xmlChar * sysid,const char * format,...)3041*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer,
3042*6777b538SAndroid Build Coastguard Worker                             const xmlChar * name,
3043*6777b538SAndroid Build Coastguard Worker                             const xmlChar * pubid,
3044*6777b538SAndroid Build Coastguard Worker                             const xmlChar * sysid, const char *format, ...)
3045*6777b538SAndroid Build Coastguard Worker {
3046*6777b538SAndroid Build Coastguard Worker     int rc;
3047*6777b538SAndroid Build Coastguard Worker     va_list ap;
3048*6777b538SAndroid Build Coastguard Worker 
3049*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
3050*6777b538SAndroid Build Coastguard Worker 
3051*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatDTD(writer, name, pubid, sysid, format,
3052*6777b538SAndroid Build Coastguard Worker                                       ap);
3053*6777b538SAndroid Build Coastguard Worker 
3054*6777b538SAndroid Build Coastguard Worker     va_end(ap);
3055*6777b538SAndroid Build Coastguard Worker     return rc;
3056*6777b538SAndroid Build Coastguard Worker }
3057*6777b538SAndroid Build Coastguard Worker 
3058*6777b538SAndroid Build Coastguard Worker /**
3059*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatDTD:
3060*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3061*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD
3062*6777b538SAndroid Build Coastguard Worker  * @pubid:  the public identifier, which is an alternative to the system identifier
3063*6777b538SAndroid Build Coastguard Worker  * @sysid:  the system identifier, which is the URI of the DTD
3064*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
3065*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
3066*6777b538SAndroid Build Coastguard Worker  *
3067*6777b538SAndroid Build Coastguard Worker  * Write a DTD with a formatted markup declarations part.
3068*6777b538SAndroid Build Coastguard Worker  *
3069*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3070*6777b538SAndroid Build Coastguard Worker  */
3071*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer,const xmlChar * name,const xmlChar * pubid,const xmlChar * sysid,const char * format,va_list argptr)3072*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer,
3073*6777b538SAndroid Build Coastguard Worker                              const xmlChar * name,
3074*6777b538SAndroid Build Coastguard Worker                              const xmlChar * pubid,
3075*6777b538SAndroid Build Coastguard Worker                              const xmlChar * sysid,
3076*6777b538SAndroid Build Coastguard Worker                              const char *format, va_list argptr)
3077*6777b538SAndroid Build Coastguard Worker {
3078*6777b538SAndroid Build Coastguard Worker     int rc;
3079*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
3080*6777b538SAndroid Build Coastguard Worker 
3081*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
3082*6777b538SAndroid Build Coastguard Worker         return -1;
3083*6777b538SAndroid Build Coastguard Worker 
3084*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
3085*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
3086*6777b538SAndroid Build Coastguard Worker         return -1;
3087*6777b538SAndroid Build Coastguard Worker 
3088*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteDTD(writer, name, pubid, sysid, buf);
3089*6777b538SAndroid Build Coastguard Worker 
3090*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
3091*6777b538SAndroid Build Coastguard Worker     return rc;
3092*6777b538SAndroid Build Coastguard Worker }
3093*6777b538SAndroid Build Coastguard Worker 
3094*6777b538SAndroid Build Coastguard Worker /**
3095*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteDTD:
3096*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3097*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD
3098*6777b538SAndroid Build Coastguard Worker  * @pubid:  the public identifier, which is an alternative to the system identifier
3099*6777b538SAndroid Build Coastguard Worker  * @sysid:  the system identifier, which is the URI of the DTD
3100*6777b538SAndroid Build Coastguard Worker  * @subset:  string content of the DTD
3101*6777b538SAndroid Build Coastguard Worker  *
3102*6777b538SAndroid Build Coastguard Worker  * Write a DTD.
3103*6777b538SAndroid Build Coastguard Worker  *
3104*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3105*6777b538SAndroid Build Coastguard Worker  */
3106*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteDTD(xmlTextWriterPtr writer,const xmlChar * name,const xmlChar * pubid,const xmlChar * sysid,const xmlChar * subset)3107*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteDTD(xmlTextWriterPtr writer,
3108*6777b538SAndroid Build Coastguard Worker                       const xmlChar * name,
3109*6777b538SAndroid Build Coastguard Worker                       const xmlChar * pubid,
3110*6777b538SAndroid Build Coastguard Worker                       const xmlChar * sysid, const xmlChar * subset)
3111*6777b538SAndroid Build Coastguard Worker {
3112*6777b538SAndroid Build Coastguard Worker     int count;
3113*6777b538SAndroid Build Coastguard Worker     int sum;
3114*6777b538SAndroid Build Coastguard Worker 
3115*6777b538SAndroid Build Coastguard Worker     sum = 0;
3116*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartDTD(writer, name, pubid, sysid);
3117*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3118*6777b538SAndroid Build Coastguard Worker         return -1;
3119*6777b538SAndroid Build Coastguard Worker     sum += count;
3120*6777b538SAndroid Build Coastguard Worker     if (subset != 0) {
3121*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteString(writer, subset);
3122*6777b538SAndroid Build Coastguard Worker         if (count == -1)
3123*6777b538SAndroid Build Coastguard Worker             return -1;
3124*6777b538SAndroid Build Coastguard Worker         sum += count;
3125*6777b538SAndroid Build Coastguard Worker     }
3126*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndDTD(writer);
3127*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3128*6777b538SAndroid Build Coastguard Worker         return -1;
3129*6777b538SAndroid Build Coastguard Worker     sum += count;
3130*6777b538SAndroid Build Coastguard Worker 
3131*6777b538SAndroid Build Coastguard Worker     return sum;
3132*6777b538SAndroid Build Coastguard Worker }
3133*6777b538SAndroid Build Coastguard Worker 
3134*6777b538SAndroid Build Coastguard Worker /**
3135*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartDTDElement:
3136*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3137*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD element
3138*6777b538SAndroid Build Coastguard Worker  *
3139*6777b538SAndroid Build Coastguard Worker  * Start an xml DTD element.
3140*6777b538SAndroid Build Coastguard Worker  *
3141*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3142*6777b538SAndroid Build Coastguard Worker  */
3143*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartDTDElement(xmlTextWriterPtr writer,const xmlChar * name)3144*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name)
3145*6777b538SAndroid Build Coastguard Worker {
3146*6777b538SAndroid Build Coastguard Worker     int count;
3147*6777b538SAndroid Build Coastguard Worker     int sum;
3148*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
3149*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
3150*6777b538SAndroid Build Coastguard Worker 
3151*6777b538SAndroid Build Coastguard Worker     if (writer == NULL || name == NULL || *name == '\0')
3152*6777b538SAndroid Build Coastguard Worker         return -1;
3153*6777b538SAndroid Build Coastguard Worker 
3154*6777b538SAndroid Build Coastguard Worker     sum = 0;
3155*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
3156*6777b538SAndroid Build Coastguard Worker     if (lk == 0) {
3157*6777b538SAndroid Build Coastguard Worker         return -1;
3158*6777b538SAndroid Build Coastguard Worker     }
3159*6777b538SAndroid Build Coastguard Worker 
3160*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3161*6777b538SAndroid Build Coastguard Worker     if (p != 0) {
3162*6777b538SAndroid Build Coastguard Worker         switch (p->state) {
3163*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD:
3164*6777b538SAndroid Build Coastguard Worker                 count = xmlOutputBufferWriteString(writer->out, " [");
3165*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
3166*6777b538SAndroid Build Coastguard Worker                     return -1;
3167*6777b538SAndroid Build Coastguard Worker                 sum += count;
3168*6777b538SAndroid Build Coastguard Worker                 if (writer->indent) {
3169*6777b538SAndroid Build Coastguard Worker                     count = xmlOutputBufferWriteString(writer->out, "\n");
3170*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
3171*6777b538SAndroid Build Coastguard Worker                         return -1;
3172*6777b538SAndroid Build Coastguard Worker                     sum += count;
3173*6777b538SAndroid Build Coastguard Worker                 }
3174*6777b538SAndroid Build Coastguard Worker                 p->state = XML_TEXTWRITER_DTD_TEXT;
3175*6777b538SAndroid Build Coastguard Worker                 /* fallthrough */
3176*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_TEXT:
3177*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_NONE:
3178*6777b538SAndroid Build Coastguard Worker                 break;
3179*6777b538SAndroid Build Coastguard Worker             default:
3180*6777b538SAndroid Build Coastguard Worker                 return -1;
3181*6777b538SAndroid Build Coastguard Worker         }
3182*6777b538SAndroid Build Coastguard Worker     }
3183*6777b538SAndroid Build Coastguard Worker 
3184*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *)
3185*6777b538SAndroid Build Coastguard Worker         xmlMalloc(sizeof(xmlTextWriterStackEntry));
3186*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
3187*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
3188*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDTDElement : out of memory!\n");
3189*6777b538SAndroid Build Coastguard Worker         return -1;
3190*6777b538SAndroid Build Coastguard Worker     }
3191*6777b538SAndroid Build Coastguard Worker 
3192*6777b538SAndroid Build Coastguard Worker     p->name = xmlStrdup(name);
3193*6777b538SAndroid Build Coastguard Worker     if (p->name == 0) {
3194*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
3195*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDTDElement : out of memory!\n");
3196*6777b538SAndroid Build Coastguard Worker         xmlFree(p);
3197*6777b538SAndroid Build Coastguard Worker         return -1;
3198*6777b538SAndroid Build Coastguard Worker     }
3199*6777b538SAndroid Build Coastguard Worker     p->state = XML_TEXTWRITER_DTD_ELEM;
3200*6777b538SAndroid Build Coastguard Worker 
3201*6777b538SAndroid Build Coastguard Worker     xmlListPushFront(writer->nodes, p);
3202*6777b538SAndroid Build Coastguard Worker 
3203*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
3204*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteIndent(writer);
3205*6777b538SAndroid Build Coastguard Worker         if (count < 0)
3206*6777b538SAndroid Build Coastguard Worker             return -1;
3207*6777b538SAndroid Build Coastguard Worker         sum += count;
3208*6777b538SAndroid Build Coastguard Worker     }
3209*6777b538SAndroid Build Coastguard Worker 
3210*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<!ELEMENT ");
3211*6777b538SAndroid Build Coastguard Worker     if (count < 0)
3212*6777b538SAndroid Build Coastguard Worker         return -1;
3213*6777b538SAndroid Build Coastguard Worker     sum += count;
3214*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, (const char *) name);
3215*6777b538SAndroid Build Coastguard Worker     if (count < 0)
3216*6777b538SAndroid Build Coastguard Worker         return -1;
3217*6777b538SAndroid Build Coastguard Worker     sum += count;
3218*6777b538SAndroid Build Coastguard Worker 
3219*6777b538SAndroid Build Coastguard Worker     return sum;
3220*6777b538SAndroid Build Coastguard Worker }
3221*6777b538SAndroid Build Coastguard Worker 
3222*6777b538SAndroid Build Coastguard Worker /**
3223*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndDTDElement:
3224*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3225*6777b538SAndroid Build Coastguard Worker  *
3226*6777b538SAndroid Build Coastguard Worker  * End an xml DTD element.
3227*6777b538SAndroid Build Coastguard Worker  *
3228*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3229*6777b538SAndroid Build Coastguard Worker  */
3230*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndDTDElement(xmlTextWriterPtr writer)3231*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndDTDElement(xmlTextWriterPtr writer)
3232*6777b538SAndroid Build Coastguard Worker {
3233*6777b538SAndroid Build Coastguard Worker     int count;
3234*6777b538SAndroid Build Coastguard Worker     int sum;
3235*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
3236*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
3237*6777b538SAndroid Build Coastguard Worker 
3238*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
3239*6777b538SAndroid Build Coastguard Worker         return -1;
3240*6777b538SAndroid Build Coastguard Worker 
3241*6777b538SAndroid Build Coastguard Worker     sum = 0;
3242*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
3243*6777b538SAndroid Build Coastguard Worker     if (lk == 0)
3244*6777b538SAndroid Build Coastguard Worker         return -1;
3245*6777b538SAndroid Build Coastguard Worker 
3246*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3247*6777b538SAndroid Build Coastguard Worker     if (p == 0)
3248*6777b538SAndroid Build Coastguard Worker         return -1;
3249*6777b538SAndroid Build Coastguard Worker 
3250*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
3251*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_DTD_ELEM:
3252*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_DTD_ELEM_TEXT:
3253*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, ">");
3254*6777b538SAndroid Build Coastguard Worker             if (count < 0)
3255*6777b538SAndroid Build Coastguard Worker                 return -1;
3256*6777b538SAndroid Build Coastguard Worker             sum += count;
3257*6777b538SAndroid Build Coastguard Worker             break;
3258*6777b538SAndroid Build Coastguard Worker         default:
3259*6777b538SAndroid Build Coastguard Worker             return -1;
3260*6777b538SAndroid Build Coastguard Worker     }
3261*6777b538SAndroid Build Coastguard Worker 
3262*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
3263*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "\n");
3264*6777b538SAndroid Build Coastguard Worker         if (count < 0)
3265*6777b538SAndroid Build Coastguard Worker             return -1;
3266*6777b538SAndroid Build Coastguard Worker         sum += count;
3267*6777b538SAndroid Build Coastguard Worker     }
3268*6777b538SAndroid Build Coastguard Worker 
3269*6777b538SAndroid Build Coastguard Worker     xmlListPopFront(writer->nodes);
3270*6777b538SAndroid Build Coastguard Worker     return sum;
3271*6777b538SAndroid Build Coastguard Worker }
3272*6777b538SAndroid Build Coastguard Worker 
3273*6777b538SAndroid Build Coastguard Worker /**
3274*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatDTDElement:
3275*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3276*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD element
3277*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
3278*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
3279*6777b538SAndroid Build Coastguard Worker  *
3280*6777b538SAndroid Build Coastguard Worker  * Write a formatted DTD element.
3281*6777b538SAndroid Build Coastguard Worker  *
3282*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3283*6777b538SAndroid Build Coastguard Worker  */
3284*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer,const xmlChar * name,const char * format,...)3285*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer,
3286*6777b538SAndroid Build Coastguard Worker                                    const xmlChar * name,
3287*6777b538SAndroid Build Coastguard Worker                                    const char *format, ...)
3288*6777b538SAndroid Build Coastguard Worker {
3289*6777b538SAndroid Build Coastguard Worker     int rc;
3290*6777b538SAndroid Build Coastguard Worker     va_list ap;
3291*6777b538SAndroid Build Coastguard Worker 
3292*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
3293*6777b538SAndroid Build Coastguard Worker 
3294*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatDTDElement(writer, name, format, ap);
3295*6777b538SAndroid Build Coastguard Worker 
3296*6777b538SAndroid Build Coastguard Worker     va_end(ap);
3297*6777b538SAndroid Build Coastguard Worker     return rc;
3298*6777b538SAndroid Build Coastguard Worker }
3299*6777b538SAndroid Build Coastguard Worker 
3300*6777b538SAndroid Build Coastguard Worker /**
3301*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatDTDElement:
3302*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3303*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD element
3304*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
3305*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
3306*6777b538SAndroid Build Coastguard Worker  *
3307*6777b538SAndroid Build Coastguard Worker  * Write a formatted DTD element.
3308*6777b538SAndroid Build Coastguard Worker  *
3309*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3310*6777b538SAndroid Build Coastguard Worker  */
3311*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer,const xmlChar * name,const char * format,va_list argptr)3312*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer,
3313*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * name,
3314*6777b538SAndroid Build Coastguard Worker                                     const char *format, va_list argptr)
3315*6777b538SAndroid Build Coastguard Worker {
3316*6777b538SAndroid Build Coastguard Worker     int rc;
3317*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
3318*6777b538SAndroid Build Coastguard Worker 
3319*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
3320*6777b538SAndroid Build Coastguard Worker         return -1;
3321*6777b538SAndroid Build Coastguard Worker 
3322*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
3323*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
3324*6777b538SAndroid Build Coastguard Worker         return -1;
3325*6777b538SAndroid Build Coastguard Worker 
3326*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteDTDElement(writer, name, buf);
3327*6777b538SAndroid Build Coastguard Worker 
3328*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
3329*6777b538SAndroid Build Coastguard Worker     return rc;
3330*6777b538SAndroid Build Coastguard Worker }
3331*6777b538SAndroid Build Coastguard Worker 
3332*6777b538SAndroid Build Coastguard Worker /**
3333*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteDTDElement:
3334*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3335*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD element
3336*6777b538SAndroid Build Coastguard Worker  * @content:  content of the element
3337*6777b538SAndroid Build Coastguard Worker  *
3338*6777b538SAndroid Build Coastguard Worker  * Write a DTD element.
3339*6777b538SAndroid Build Coastguard Worker  *
3340*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3341*6777b538SAndroid Build Coastguard Worker  */
3342*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteDTDElement(xmlTextWriterPtr writer,const xmlChar * name,const xmlChar * content)3343*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteDTDElement(xmlTextWriterPtr writer,
3344*6777b538SAndroid Build Coastguard Worker                              const xmlChar * name, const xmlChar * content)
3345*6777b538SAndroid Build Coastguard Worker {
3346*6777b538SAndroid Build Coastguard Worker     int count;
3347*6777b538SAndroid Build Coastguard Worker     int sum;
3348*6777b538SAndroid Build Coastguard Worker 
3349*6777b538SAndroid Build Coastguard Worker     if (content == NULL)
3350*6777b538SAndroid Build Coastguard Worker         return -1;
3351*6777b538SAndroid Build Coastguard Worker 
3352*6777b538SAndroid Build Coastguard Worker     sum = 0;
3353*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartDTDElement(writer, name);
3354*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3355*6777b538SAndroid Build Coastguard Worker         return -1;
3356*6777b538SAndroid Build Coastguard Worker     sum += count;
3357*6777b538SAndroid Build Coastguard Worker 
3358*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterWriteString(writer, content);
3359*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3360*6777b538SAndroid Build Coastguard Worker         return -1;
3361*6777b538SAndroid Build Coastguard Worker     sum += count;
3362*6777b538SAndroid Build Coastguard Worker 
3363*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndDTDElement(writer);
3364*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3365*6777b538SAndroid Build Coastguard Worker         return -1;
3366*6777b538SAndroid Build Coastguard Worker     sum += count;
3367*6777b538SAndroid Build Coastguard Worker 
3368*6777b538SAndroid Build Coastguard Worker     return sum;
3369*6777b538SAndroid Build Coastguard Worker }
3370*6777b538SAndroid Build Coastguard Worker 
3371*6777b538SAndroid Build Coastguard Worker /**
3372*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartDTDAttlist:
3373*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3374*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD ATTLIST
3375*6777b538SAndroid Build Coastguard Worker  *
3376*6777b538SAndroid Build Coastguard Worker  * Start an xml DTD ATTLIST.
3377*6777b538SAndroid Build Coastguard Worker  *
3378*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3379*6777b538SAndroid Build Coastguard Worker  */
3380*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer,const xmlChar * name)3381*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name)
3382*6777b538SAndroid Build Coastguard Worker {
3383*6777b538SAndroid Build Coastguard Worker     int count;
3384*6777b538SAndroid Build Coastguard Worker     int sum;
3385*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
3386*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
3387*6777b538SAndroid Build Coastguard Worker 
3388*6777b538SAndroid Build Coastguard Worker     if (writer == NULL || name == NULL || *name == '\0')
3389*6777b538SAndroid Build Coastguard Worker         return -1;
3390*6777b538SAndroid Build Coastguard Worker 
3391*6777b538SAndroid Build Coastguard Worker     sum = 0;
3392*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
3393*6777b538SAndroid Build Coastguard Worker     if (lk == 0) {
3394*6777b538SAndroid Build Coastguard Worker         return -1;
3395*6777b538SAndroid Build Coastguard Worker     }
3396*6777b538SAndroid Build Coastguard Worker 
3397*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3398*6777b538SAndroid Build Coastguard Worker     if (p != 0) {
3399*6777b538SAndroid Build Coastguard Worker         switch (p->state) {
3400*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD:
3401*6777b538SAndroid Build Coastguard Worker                 count = xmlOutputBufferWriteString(writer->out, " [");
3402*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
3403*6777b538SAndroid Build Coastguard Worker                     return -1;
3404*6777b538SAndroid Build Coastguard Worker                 sum += count;
3405*6777b538SAndroid Build Coastguard Worker                 if (writer->indent) {
3406*6777b538SAndroid Build Coastguard Worker                     count = xmlOutputBufferWriteString(writer->out, "\n");
3407*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
3408*6777b538SAndroid Build Coastguard Worker                         return -1;
3409*6777b538SAndroid Build Coastguard Worker                     sum += count;
3410*6777b538SAndroid Build Coastguard Worker                 }
3411*6777b538SAndroid Build Coastguard Worker                 p->state = XML_TEXTWRITER_DTD_TEXT;
3412*6777b538SAndroid Build Coastguard Worker                 /* fallthrough */
3413*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_TEXT:
3414*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_NONE:
3415*6777b538SAndroid Build Coastguard Worker                 break;
3416*6777b538SAndroid Build Coastguard Worker             default:
3417*6777b538SAndroid Build Coastguard Worker                 return -1;
3418*6777b538SAndroid Build Coastguard Worker         }
3419*6777b538SAndroid Build Coastguard Worker     }
3420*6777b538SAndroid Build Coastguard Worker 
3421*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *)
3422*6777b538SAndroid Build Coastguard Worker         xmlMalloc(sizeof(xmlTextWriterStackEntry));
3423*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
3424*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
3425*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDTDAttlist : out of memory!\n");
3426*6777b538SAndroid Build Coastguard Worker         return -1;
3427*6777b538SAndroid Build Coastguard Worker     }
3428*6777b538SAndroid Build Coastguard Worker 
3429*6777b538SAndroid Build Coastguard Worker     p->name = xmlStrdup(name);
3430*6777b538SAndroid Build Coastguard Worker     if (p->name == 0) {
3431*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
3432*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDTDAttlist : out of memory!\n");
3433*6777b538SAndroid Build Coastguard Worker         xmlFree(p);
3434*6777b538SAndroid Build Coastguard Worker         return -1;
3435*6777b538SAndroid Build Coastguard Worker     }
3436*6777b538SAndroid Build Coastguard Worker     p->state = XML_TEXTWRITER_DTD_ATTL;
3437*6777b538SAndroid Build Coastguard Worker 
3438*6777b538SAndroid Build Coastguard Worker     xmlListPushFront(writer->nodes, p);
3439*6777b538SAndroid Build Coastguard Worker 
3440*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
3441*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteIndent(writer);
3442*6777b538SAndroid Build Coastguard Worker         if (count < 0)
3443*6777b538SAndroid Build Coastguard Worker             return -1;
3444*6777b538SAndroid Build Coastguard Worker         sum += count;
3445*6777b538SAndroid Build Coastguard Worker     }
3446*6777b538SAndroid Build Coastguard Worker 
3447*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<!ATTLIST ");
3448*6777b538SAndroid Build Coastguard Worker     if (count < 0)
3449*6777b538SAndroid Build Coastguard Worker         return -1;
3450*6777b538SAndroid Build Coastguard Worker     sum += count;
3451*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, (const char *) name);
3452*6777b538SAndroid Build Coastguard Worker     if (count < 0)
3453*6777b538SAndroid Build Coastguard Worker         return -1;
3454*6777b538SAndroid Build Coastguard Worker     sum += count;
3455*6777b538SAndroid Build Coastguard Worker 
3456*6777b538SAndroid Build Coastguard Worker     return sum;
3457*6777b538SAndroid Build Coastguard Worker }
3458*6777b538SAndroid Build Coastguard Worker 
3459*6777b538SAndroid Build Coastguard Worker /**
3460*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndDTDAttlist:
3461*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3462*6777b538SAndroid Build Coastguard Worker  *
3463*6777b538SAndroid Build Coastguard Worker  * End an xml DTD attribute list.
3464*6777b538SAndroid Build Coastguard Worker  *
3465*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3466*6777b538SAndroid Build Coastguard Worker  */
3467*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer)3468*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer)
3469*6777b538SAndroid Build Coastguard Worker {
3470*6777b538SAndroid Build Coastguard Worker     int count;
3471*6777b538SAndroid Build Coastguard Worker     int sum;
3472*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
3473*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
3474*6777b538SAndroid Build Coastguard Worker 
3475*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
3476*6777b538SAndroid Build Coastguard Worker         return -1;
3477*6777b538SAndroid Build Coastguard Worker 
3478*6777b538SAndroid Build Coastguard Worker     sum = 0;
3479*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
3480*6777b538SAndroid Build Coastguard Worker     if (lk == 0)
3481*6777b538SAndroid Build Coastguard Worker         return -1;
3482*6777b538SAndroid Build Coastguard Worker 
3483*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3484*6777b538SAndroid Build Coastguard Worker     if (p == 0)
3485*6777b538SAndroid Build Coastguard Worker         return -1;
3486*6777b538SAndroid Build Coastguard Worker 
3487*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
3488*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_DTD_ATTL:
3489*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_DTD_ATTL_TEXT:
3490*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, ">");
3491*6777b538SAndroid Build Coastguard Worker             if (count < 0)
3492*6777b538SAndroid Build Coastguard Worker                 return -1;
3493*6777b538SAndroid Build Coastguard Worker             sum += count;
3494*6777b538SAndroid Build Coastguard Worker             break;
3495*6777b538SAndroid Build Coastguard Worker         default:
3496*6777b538SAndroid Build Coastguard Worker             return -1;
3497*6777b538SAndroid Build Coastguard Worker     }
3498*6777b538SAndroid Build Coastguard Worker 
3499*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
3500*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "\n");
3501*6777b538SAndroid Build Coastguard Worker         if (count < 0)
3502*6777b538SAndroid Build Coastguard Worker             return -1;
3503*6777b538SAndroid Build Coastguard Worker         sum += count;
3504*6777b538SAndroid Build Coastguard Worker     }
3505*6777b538SAndroid Build Coastguard Worker 
3506*6777b538SAndroid Build Coastguard Worker     xmlListPopFront(writer->nodes);
3507*6777b538SAndroid Build Coastguard Worker     return sum;
3508*6777b538SAndroid Build Coastguard Worker }
3509*6777b538SAndroid Build Coastguard Worker 
3510*6777b538SAndroid Build Coastguard Worker /**
3511*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatDTDAttlist:
3512*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3513*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD ATTLIST
3514*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
3515*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
3516*6777b538SAndroid Build Coastguard Worker  *
3517*6777b538SAndroid Build Coastguard Worker  * Write a formatted DTD ATTLIST.
3518*6777b538SAndroid Build Coastguard Worker  *
3519*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3520*6777b538SAndroid Build Coastguard Worker  */
3521*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer,const xmlChar * name,const char * format,...)3522*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer,
3523*6777b538SAndroid Build Coastguard Worker                                    const xmlChar * name,
3524*6777b538SAndroid Build Coastguard Worker                                    const char *format, ...)
3525*6777b538SAndroid Build Coastguard Worker {
3526*6777b538SAndroid Build Coastguard Worker     int rc;
3527*6777b538SAndroid Build Coastguard Worker     va_list ap;
3528*6777b538SAndroid Build Coastguard Worker 
3529*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
3530*6777b538SAndroid Build Coastguard Worker 
3531*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatDTDAttlist(writer, name, format, ap);
3532*6777b538SAndroid Build Coastguard Worker 
3533*6777b538SAndroid Build Coastguard Worker     va_end(ap);
3534*6777b538SAndroid Build Coastguard Worker     return rc;
3535*6777b538SAndroid Build Coastguard Worker }
3536*6777b538SAndroid Build Coastguard Worker 
3537*6777b538SAndroid Build Coastguard Worker /**
3538*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatDTDAttlist:
3539*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3540*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD ATTLIST
3541*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
3542*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
3543*6777b538SAndroid Build Coastguard Worker  *
3544*6777b538SAndroid Build Coastguard Worker  * Write a formatted DTD ATTLIST.
3545*6777b538SAndroid Build Coastguard Worker  *
3546*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3547*6777b538SAndroid Build Coastguard Worker  */
3548*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer,const xmlChar * name,const char * format,va_list argptr)3549*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer,
3550*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * name,
3551*6777b538SAndroid Build Coastguard Worker                                     const char *format, va_list argptr)
3552*6777b538SAndroid Build Coastguard Worker {
3553*6777b538SAndroid Build Coastguard Worker     int rc;
3554*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
3555*6777b538SAndroid Build Coastguard Worker 
3556*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
3557*6777b538SAndroid Build Coastguard Worker         return -1;
3558*6777b538SAndroid Build Coastguard Worker 
3559*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
3560*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
3561*6777b538SAndroid Build Coastguard Worker         return -1;
3562*6777b538SAndroid Build Coastguard Worker 
3563*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteDTDAttlist(writer, name, buf);
3564*6777b538SAndroid Build Coastguard Worker 
3565*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
3566*6777b538SAndroid Build Coastguard Worker     return rc;
3567*6777b538SAndroid Build Coastguard Worker }
3568*6777b538SAndroid Build Coastguard Worker 
3569*6777b538SAndroid Build Coastguard Worker /**
3570*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteDTDAttlist:
3571*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3572*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD ATTLIST
3573*6777b538SAndroid Build Coastguard Worker  * @content:  content of the ATTLIST
3574*6777b538SAndroid Build Coastguard Worker  *
3575*6777b538SAndroid Build Coastguard Worker  * Write a DTD ATTLIST.
3576*6777b538SAndroid Build Coastguard Worker  *
3577*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3578*6777b538SAndroid Build Coastguard Worker  */
3579*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer,const xmlChar * name,const xmlChar * content)3580*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer,
3581*6777b538SAndroid Build Coastguard Worker                              const xmlChar * name, const xmlChar * content)
3582*6777b538SAndroid Build Coastguard Worker {
3583*6777b538SAndroid Build Coastguard Worker     int count;
3584*6777b538SAndroid Build Coastguard Worker     int sum;
3585*6777b538SAndroid Build Coastguard Worker 
3586*6777b538SAndroid Build Coastguard Worker     if (content == NULL)
3587*6777b538SAndroid Build Coastguard Worker         return -1;
3588*6777b538SAndroid Build Coastguard Worker 
3589*6777b538SAndroid Build Coastguard Worker     sum = 0;
3590*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartDTDAttlist(writer, name);
3591*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3592*6777b538SAndroid Build Coastguard Worker         return -1;
3593*6777b538SAndroid Build Coastguard Worker     sum += count;
3594*6777b538SAndroid Build Coastguard Worker 
3595*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterWriteString(writer, content);
3596*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3597*6777b538SAndroid Build Coastguard Worker         return -1;
3598*6777b538SAndroid Build Coastguard Worker     sum += count;
3599*6777b538SAndroid Build Coastguard Worker 
3600*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndDTDAttlist(writer);
3601*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3602*6777b538SAndroid Build Coastguard Worker         return -1;
3603*6777b538SAndroid Build Coastguard Worker     sum += count;
3604*6777b538SAndroid Build Coastguard Worker 
3605*6777b538SAndroid Build Coastguard Worker     return sum;
3606*6777b538SAndroid Build Coastguard Worker }
3607*6777b538SAndroid Build Coastguard Worker 
3608*6777b538SAndroid Build Coastguard Worker /**
3609*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartDTDEntity:
3610*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3611*6777b538SAndroid Build Coastguard Worker  * @pe:  TRUE if this is a parameter entity, FALSE if not
3612*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD ATTLIST
3613*6777b538SAndroid Build Coastguard Worker  *
3614*6777b538SAndroid Build Coastguard Worker  * Start an xml DTD ATTLIST.
3615*6777b538SAndroid Build Coastguard Worker  *
3616*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3617*6777b538SAndroid Build Coastguard Worker  */
3618*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer,int pe,const xmlChar * name)3619*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer,
3620*6777b538SAndroid Build Coastguard Worker                             int pe, const xmlChar * name)
3621*6777b538SAndroid Build Coastguard Worker {
3622*6777b538SAndroid Build Coastguard Worker     int count;
3623*6777b538SAndroid Build Coastguard Worker     int sum;
3624*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
3625*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
3626*6777b538SAndroid Build Coastguard Worker 
3627*6777b538SAndroid Build Coastguard Worker     if (writer == NULL || name == NULL || *name == '\0')
3628*6777b538SAndroid Build Coastguard Worker         return -1;
3629*6777b538SAndroid Build Coastguard Worker 
3630*6777b538SAndroid Build Coastguard Worker     sum = 0;
3631*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
3632*6777b538SAndroid Build Coastguard Worker     if (lk != 0) {
3633*6777b538SAndroid Build Coastguard Worker 
3634*6777b538SAndroid Build Coastguard Worker         p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3635*6777b538SAndroid Build Coastguard Worker         if (p != 0) {
3636*6777b538SAndroid Build Coastguard Worker             switch (p->state) {
3637*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_DTD:
3638*6777b538SAndroid Build Coastguard Worker                     count = xmlOutputBufferWriteString(writer->out, " [");
3639*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
3640*6777b538SAndroid Build Coastguard Worker                         return -1;
3641*6777b538SAndroid Build Coastguard Worker                     sum += count;
3642*6777b538SAndroid Build Coastguard Worker                     if (writer->indent) {
3643*6777b538SAndroid Build Coastguard Worker                         count =
3644*6777b538SAndroid Build Coastguard Worker                             xmlOutputBufferWriteString(writer->out, "\n");
3645*6777b538SAndroid Build Coastguard Worker                         if (count < 0)
3646*6777b538SAndroid Build Coastguard Worker                             return -1;
3647*6777b538SAndroid Build Coastguard Worker                         sum += count;
3648*6777b538SAndroid Build Coastguard Worker                     }
3649*6777b538SAndroid Build Coastguard Worker                     p->state = XML_TEXTWRITER_DTD_TEXT;
3650*6777b538SAndroid Build Coastguard Worker                     /* fallthrough */
3651*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_DTD_TEXT:
3652*6777b538SAndroid Build Coastguard Worker                 case XML_TEXTWRITER_NONE:
3653*6777b538SAndroid Build Coastguard Worker                     break;
3654*6777b538SAndroid Build Coastguard Worker                 default:
3655*6777b538SAndroid Build Coastguard Worker                     return -1;
3656*6777b538SAndroid Build Coastguard Worker             }
3657*6777b538SAndroid Build Coastguard Worker         }
3658*6777b538SAndroid Build Coastguard Worker     }
3659*6777b538SAndroid Build Coastguard Worker 
3660*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *)
3661*6777b538SAndroid Build Coastguard Worker         xmlMalloc(sizeof(xmlTextWriterStackEntry));
3662*6777b538SAndroid Build Coastguard Worker     if (p == 0) {
3663*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
3664*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDTDElement : out of memory!\n");
3665*6777b538SAndroid Build Coastguard Worker         return -1;
3666*6777b538SAndroid Build Coastguard Worker     }
3667*6777b538SAndroid Build Coastguard Worker 
3668*6777b538SAndroid Build Coastguard Worker     p->name = xmlStrdup(name);
3669*6777b538SAndroid Build Coastguard Worker     if (p->name == 0) {
3670*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
3671*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterStartDTDElement : out of memory!\n");
3672*6777b538SAndroid Build Coastguard Worker         xmlFree(p);
3673*6777b538SAndroid Build Coastguard Worker         return -1;
3674*6777b538SAndroid Build Coastguard Worker     }
3675*6777b538SAndroid Build Coastguard Worker 
3676*6777b538SAndroid Build Coastguard Worker     if (pe != 0)
3677*6777b538SAndroid Build Coastguard Worker         p->state = XML_TEXTWRITER_DTD_PENT;
3678*6777b538SAndroid Build Coastguard Worker     else
3679*6777b538SAndroid Build Coastguard Worker         p->state = XML_TEXTWRITER_DTD_ENTY;
3680*6777b538SAndroid Build Coastguard Worker 
3681*6777b538SAndroid Build Coastguard Worker     xmlListPushFront(writer->nodes, p);
3682*6777b538SAndroid Build Coastguard Worker 
3683*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
3684*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteIndent(writer);
3685*6777b538SAndroid Build Coastguard Worker         if (count < 0)
3686*6777b538SAndroid Build Coastguard Worker             return -1;
3687*6777b538SAndroid Build Coastguard Worker         sum += count;
3688*6777b538SAndroid Build Coastguard Worker     }
3689*6777b538SAndroid Build Coastguard Worker 
3690*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<!ENTITY ");
3691*6777b538SAndroid Build Coastguard Worker     if (count < 0)
3692*6777b538SAndroid Build Coastguard Worker         return -1;
3693*6777b538SAndroid Build Coastguard Worker     sum += count;
3694*6777b538SAndroid Build Coastguard Worker 
3695*6777b538SAndroid Build Coastguard Worker     if (pe != 0) {
3696*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "% ");
3697*6777b538SAndroid Build Coastguard Worker         if (count < 0)
3698*6777b538SAndroid Build Coastguard Worker             return -1;
3699*6777b538SAndroid Build Coastguard Worker         sum += count;
3700*6777b538SAndroid Build Coastguard Worker     }
3701*6777b538SAndroid Build Coastguard Worker 
3702*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, (const char *) name);
3703*6777b538SAndroid Build Coastguard Worker     if (count < 0)
3704*6777b538SAndroid Build Coastguard Worker         return -1;
3705*6777b538SAndroid Build Coastguard Worker     sum += count;
3706*6777b538SAndroid Build Coastguard Worker 
3707*6777b538SAndroid Build Coastguard Worker     return sum;
3708*6777b538SAndroid Build Coastguard Worker }
3709*6777b538SAndroid Build Coastguard Worker 
3710*6777b538SAndroid Build Coastguard Worker /**
3711*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterEndDTDEntity:
3712*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3713*6777b538SAndroid Build Coastguard Worker  *
3714*6777b538SAndroid Build Coastguard Worker  * End an xml DTD entity.
3715*6777b538SAndroid Build Coastguard Worker  *
3716*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3717*6777b538SAndroid Build Coastguard Worker  */
3718*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterEndDTDEntity(xmlTextWriterPtr writer)3719*6777b538SAndroid Build Coastguard Worker xmlTextWriterEndDTDEntity(xmlTextWriterPtr writer)
3720*6777b538SAndroid Build Coastguard Worker {
3721*6777b538SAndroid Build Coastguard Worker     int count;
3722*6777b538SAndroid Build Coastguard Worker     int sum;
3723*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
3724*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
3725*6777b538SAndroid Build Coastguard Worker 
3726*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
3727*6777b538SAndroid Build Coastguard Worker         return -1;
3728*6777b538SAndroid Build Coastguard Worker 
3729*6777b538SAndroid Build Coastguard Worker     sum = 0;
3730*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
3731*6777b538SAndroid Build Coastguard Worker     if (lk == 0)
3732*6777b538SAndroid Build Coastguard Worker         return -1;
3733*6777b538SAndroid Build Coastguard Worker 
3734*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3735*6777b538SAndroid Build Coastguard Worker     if (p == 0)
3736*6777b538SAndroid Build Coastguard Worker         return -1;
3737*6777b538SAndroid Build Coastguard Worker 
3738*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
3739*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_DTD_ENTY_TEXT:
3740*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
3741*6777b538SAndroid Build Coastguard Worker             if (count < 0)
3742*6777b538SAndroid Build Coastguard Worker                 return -1;
3743*6777b538SAndroid Build Coastguard Worker             sum += count;
3744*6777b538SAndroid Build Coastguard Worker             /* Falls through. */
3745*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_DTD_ENTY:
3746*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_DTD_PENT:
3747*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, ">");
3748*6777b538SAndroid Build Coastguard Worker             if (count < 0)
3749*6777b538SAndroid Build Coastguard Worker                 return -1;
3750*6777b538SAndroid Build Coastguard Worker             sum += count;
3751*6777b538SAndroid Build Coastguard Worker             break;
3752*6777b538SAndroid Build Coastguard Worker         default:
3753*6777b538SAndroid Build Coastguard Worker             return -1;
3754*6777b538SAndroid Build Coastguard Worker     }
3755*6777b538SAndroid Build Coastguard Worker 
3756*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
3757*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, "\n");
3758*6777b538SAndroid Build Coastguard Worker         if (count < 0)
3759*6777b538SAndroid Build Coastguard Worker             return -1;
3760*6777b538SAndroid Build Coastguard Worker         sum += count;
3761*6777b538SAndroid Build Coastguard Worker     }
3762*6777b538SAndroid Build Coastguard Worker 
3763*6777b538SAndroid Build Coastguard Worker     xmlListPopFront(writer->nodes);
3764*6777b538SAndroid Build Coastguard Worker     return sum;
3765*6777b538SAndroid Build Coastguard Worker }
3766*6777b538SAndroid Build Coastguard Worker 
3767*6777b538SAndroid Build Coastguard Worker /**
3768*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteFormatDTDInternalEntity:
3769*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3770*6777b538SAndroid Build Coastguard Worker  * @pe:  TRUE if this is a parameter entity, FALSE if not
3771*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD entity
3772*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
3773*6777b538SAndroid Build Coastguard Worker  * @...:  extra parameters for the format
3774*6777b538SAndroid Build Coastguard Worker  *
3775*6777b538SAndroid Build Coastguard Worker  * Write a formatted DTD internal entity.
3776*6777b538SAndroid Build Coastguard Worker  *
3777*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3778*6777b538SAndroid Build Coastguard Worker  */
3779*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer,int pe,const xmlChar * name,const char * format,...)3780*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer,
3781*6777b538SAndroid Build Coastguard Worker                                           int pe,
3782*6777b538SAndroid Build Coastguard Worker                                           const xmlChar * name,
3783*6777b538SAndroid Build Coastguard Worker                                           const char *format, ...)
3784*6777b538SAndroid Build Coastguard Worker {
3785*6777b538SAndroid Build Coastguard Worker     int rc;
3786*6777b538SAndroid Build Coastguard Worker     va_list ap;
3787*6777b538SAndroid Build Coastguard Worker 
3788*6777b538SAndroid Build Coastguard Worker     va_start(ap, format);
3789*6777b538SAndroid Build Coastguard Worker 
3790*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteVFormatDTDInternalEntity(writer, pe, name,
3791*6777b538SAndroid Build Coastguard Worker                                                     format, ap);
3792*6777b538SAndroid Build Coastguard Worker 
3793*6777b538SAndroid Build Coastguard Worker     va_end(ap);
3794*6777b538SAndroid Build Coastguard Worker     return rc;
3795*6777b538SAndroid Build Coastguard Worker }
3796*6777b538SAndroid Build Coastguard Worker 
3797*6777b538SAndroid Build Coastguard Worker /**
3798*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteVFormatDTDInternalEntity:
3799*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3800*6777b538SAndroid Build Coastguard Worker  * @pe:  TRUE if this is a parameter entity, FALSE if not
3801*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD entity
3802*6777b538SAndroid Build Coastguard Worker  * @format:  format string (see printf)
3803*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
3804*6777b538SAndroid Build Coastguard Worker  *
3805*6777b538SAndroid Build Coastguard Worker  * Write a formatted DTD internal entity.
3806*6777b538SAndroid Build Coastguard Worker  *
3807*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3808*6777b538SAndroid Build Coastguard Worker  */
3809*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer,int pe,const xmlChar * name,const char * format,va_list argptr)3810*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer,
3811*6777b538SAndroid Build Coastguard Worker                                            int pe,
3812*6777b538SAndroid Build Coastguard Worker                                            const xmlChar * name,
3813*6777b538SAndroid Build Coastguard Worker                                            const char *format,
3814*6777b538SAndroid Build Coastguard Worker                                            va_list argptr)
3815*6777b538SAndroid Build Coastguard Worker {
3816*6777b538SAndroid Build Coastguard Worker     int rc;
3817*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
3818*6777b538SAndroid Build Coastguard Worker 
3819*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
3820*6777b538SAndroid Build Coastguard Worker         return -1;
3821*6777b538SAndroid Build Coastguard Worker 
3822*6777b538SAndroid Build Coastguard Worker     buf = xmlTextWriterVSprintf(format, argptr);
3823*6777b538SAndroid Build Coastguard Worker     if (buf == NULL)
3824*6777b538SAndroid Build Coastguard Worker         return -1;
3825*6777b538SAndroid Build Coastguard Worker 
3826*6777b538SAndroid Build Coastguard Worker     rc = xmlTextWriterWriteDTDInternalEntity(writer, pe, name, buf);
3827*6777b538SAndroid Build Coastguard Worker 
3828*6777b538SAndroid Build Coastguard Worker     xmlFree(buf);
3829*6777b538SAndroid Build Coastguard Worker     return rc;
3830*6777b538SAndroid Build Coastguard Worker }
3831*6777b538SAndroid Build Coastguard Worker 
3832*6777b538SAndroid Build Coastguard Worker /**
3833*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteDTDEntity:
3834*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3835*6777b538SAndroid Build Coastguard Worker  * @pe:  TRUE if this is a parameter entity, FALSE if not
3836*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD entity
3837*6777b538SAndroid Build Coastguard Worker  * @pubid:  the public identifier, which is an alternative to the system identifier
3838*6777b538SAndroid Build Coastguard Worker  * @sysid:  the system identifier, which is the URI of the DTD
3839*6777b538SAndroid Build Coastguard Worker  * @ndataid:  the xml notation name.
3840*6777b538SAndroid Build Coastguard Worker  * @content:  content of the entity
3841*6777b538SAndroid Build Coastguard Worker  *
3842*6777b538SAndroid Build Coastguard Worker  * Write a DTD entity.
3843*6777b538SAndroid Build Coastguard Worker  *
3844*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3845*6777b538SAndroid Build Coastguard Worker  */
3846*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer,int pe,const xmlChar * name,const xmlChar * pubid,const xmlChar * sysid,const xmlChar * ndataid,const xmlChar * content)3847*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer,
3848*6777b538SAndroid Build Coastguard Worker                             int pe,
3849*6777b538SAndroid Build Coastguard Worker                             const xmlChar * name,
3850*6777b538SAndroid Build Coastguard Worker                             const xmlChar * pubid,
3851*6777b538SAndroid Build Coastguard Worker                             const xmlChar * sysid,
3852*6777b538SAndroid Build Coastguard Worker                             const xmlChar * ndataid,
3853*6777b538SAndroid Build Coastguard Worker                             const xmlChar * content)
3854*6777b538SAndroid Build Coastguard Worker {
3855*6777b538SAndroid Build Coastguard Worker     if ((content == NULL) && (pubid == NULL) && (sysid == NULL))
3856*6777b538SAndroid Build Coastguard Worker         return -1;
3857*6777b538SAndroid Build Coastguard Worker     if ((pe != 0) && (ndataid != NULL))
3858*6777b538SAndroid Build Coastguard Worker         return -1;
3859*6777b538SAndroid Build Coastguard Worker 
3860*6777b538SAndroid Build Coastguard Worker     if ((pubid == NULL) && (sysid == NULL))
3861*6777b538SAndroid Build Coastguard Worker         return xmlTextWriterWriteDTDInternalEntity(writer, pe, name,
3862*6777b538SAndroid Build Coastguard Worker                                                    content);
3863*6777b538SAndroid Build Coastguard Worker 
3864*6777b538SAndroid Build Coastguard Worker     return xmlTextWriterWriteDTDExternalEntity(writer, pe, name, pubid,
3865*6777b538SAndroid Build Coastguard Worker                                                sysid, ndataid);
3866*6777b538SAndroid Build Coastguard Worker }
3867*6777b538SAndroid Build Coastguard Worker 
3868*6777b538SAndroid Build Coastguard Worker /**
3869*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteDTDInternalEntity:
3870*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3871*6777b538SAndroid Build Coastguard Worker  * @pe:  TRUE if this is a parameter entity, FALSE if not
3872*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD entity
3873*6777b538SAndroid Build Coastguard Worker  * @content:  content of the entity
3874*6777b538SAndroid Build Coastguard Worker  *
3875*6777b538SAndroid Build Coastguard Worker  * Write a DTD internal entity.
3876*6777b538SAndroid Build Coastguard Worker  *
3877*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3878*6777b538SAndroid Build Coastguard Worker  */
3879*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer,int pe,const xmlChar * name,const xmlChar * content)3880*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer,
3881*6777b538SAndroid Build Coastguard Worker                                     int pe,
3882*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * name,
3883*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * content)
3884*6777b538SAndroid Build Coastguard Worker {
3885*6777b538SAndroid Build Coastguard Worker     int count;
3886*6777b538SAndroid Build Coastguard Worker     int sum;
3887*6777b538SAndroid Build Coastguard Worker 
3888*6777b538SAndroid Build Coastguard Worker     if ((name == NULL) || (*name == '\0') || (content == NULL))
3889*6777b538SAndroid Build Coastguard Worker         return -1;
3890*6777b538SAndroid Build Coastguard Worker 
3891*6777b538SAndroid Build Coastguard Worker     sum = 0;
3892*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartDTDEntity(writer, pe, name);
3893*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3894*6777b538SAndroid Build Coastguard Worker         return -1;
3895*6777b538SAndroid Build Coastguard Worker     sum += count;
3896*6777b538SAndroid Build Coastguard Worker 
3897*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterWriteString(writer, content);
3898*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3899*6777b538SAndroid Build Coastguard Worker         return -1;
3900*6777b538SAndroid Build Coastguard Worker     sum += count;
3901*6777b538SAndroid Build Coastguard Worker 
3902*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndDTDEntity(writer);
3903*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3904*6777b538SAndroid Build Coastguard Worker         return -1;
3905*6777b538SAndroid Build Coastguard Worker     sum += count;
3906*6777b538SAndroid Build Coastguard Worker 
3907*6777b538SAndroid Build Coastguard Worker     return sum;
3908*6777b538SAndroid Build Coastguard Worker }
3909*6777b538SAndroid Build Coastguard Worker 
3910*6777b538SAndroid Build Coastguard Worker /**
3911*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteDTDExternalEntity:
3912*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3913*6777b538SAndroid Build Coastguard Worker  * @pe:  TRUE if this is a parameter entity, FALSE if not
3914*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the DTD entity
3915*6777b538SAndroid Build Coastguard Worker  * @pubid:  the public identifier, which is an alternative to the system identifier
3916*6777b538SAndroid Build Coastguard Worker  * @sysid:  the system identifier, which is the URI of the DTD
3917*6777b538SAndroid Build Coastguard Worker  * @ndataid:  the xml notation name.
3918*6777b538SAndroid Build Coastguard Worker  *
3919*6777b538SAndroid Build Coastguard Worker  * Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity
3920*6777b538SAndroid Build Coastguard Worker  *
3921*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3922*6777b538SAndroid Build Coastguard Worker  */
3923*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer,int pe,const xmlChar * name,const xmlChar * pubid,const xmlChar * sysid,const xmlChar * ndataid)3924*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer,
3925*6777b538SAndroid Build Coastguard Worker                                     int pe,
3926*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * name,
3927*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * pubid,
3928*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * sysid,
3929*6777b538SAndroid Build Coastguard Worker                                     const xmlChar * ndataid)
3930*6777b538SAndroid Build Coastguard Worker {
3931*6777b538SAndroid Build Coastguard Worker     int count;
3932*6777b538SAndroid Build Coastguard Worker     int sum;
3933*6777b538SAndroid Build Coastguard Worker 
3934*6777b538SAndroid Build Coastguard Worker     if (((pubid == NULL) && (sysid == NULL)))
3935*6777b538SAndroid Build Coastguard Worker         return -1;
3936*6777b538SAndroid Build Coastguard Worker     if ((pe != 0) && (ndataid != NULL))
3937*6777b538SAndroid Build Coastguard Worker         return -1;
3938*6777b538SAndroid Build Coastguard Worker 
3939*6777b538SAndroid Build Coastguard Worker     sum = 0;
3940*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterStartDTDEntity(writer, pe, name);
3941*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3942*6777b538SAndroid Build Coastguard Worker         return -1;
3943*6777b538SAndroid Build Coastguard Worker     sum += count;
3944*6777b538SAndroid Build Coastguard Worker 
3945*6777b538SAndroid Build Coastguard Worker     count =
3946*6777b538SAndroid Build Coastguard Worker         xmlTextWriterWriteDTDExternalEntityContents(writer, pubid, sysid,
3947*6777b538SAndroid Build Coastguard Worker                                                     ndataid);
3948*6777b538SAndroid Build Coastguard Worker     if (count < 0)
3949*6777b538SAndroid Build Coastguard Worker         return -1;
3950*6777b538SAndroid Build Coastguard Worker     sum += count;
3951*6777b538SAndroid Build Coastguard Worker 
3952*6777b538SAndroid Build Coastguard Worker     count = xmlTextWriterEndDTDEntity(writer);
3953*6777b538SAndroid Build Coastguard Worker     if (count == -1)
3954*6777b538SAndroid Build Coastguard Worker         return -1;
3955*6777b538SAndroid Build Coastguard Worker     sum += count;
3956*6777b538SAndroid Build Coastguard Worker 
3957*6777b538SAndroid Build Coastguard Worker     return sum;
3958*6777b538SAndroid Build Coastguard Worker }
3959*6777b538SAndroid Build Coastguard Worker 
3960*6777b538SAndroid Build Coastguard Worker /**
3961*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteDTDExternalEntityContents:
3962*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
3963*6777b538SAndroid Build Coastguard Worker  * @pubid:  the public identifier, which is an alternative to the system identifier
3964*6777b538SAndroid Build Coastguard Worker  * @sysid:  the system identifier, which is the URI of the DTD
3965*6777b538SAndroid Build Coastguard Worker  * @ndataid:  the xml notation name.
3966*6777b538SAndroid Build Coastguard Worker  *
3967*6777b538SAndroid Build Coastguard Worker  * Write the contents of a DTD external entity.
3968*6777b538SAndroid Build Coastguard Worker  *
3969*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3970*6777b538SAndroid Build Coastguard Worker  */
3971*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer,const xmlChar * pubid,const xmlChar * sysid,const xmlChar * ndataid)3972*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer,
3973*6777b538SAndroid Build Coastguard Worker                                             const xmlChar * pubid,
3974*6777b538SAndroid Build Coastguard Worker                                             const xmlChar * sysid,
3975*6777b538SAndroid Build Coastguard Worker                                             const xmlChar * ndataid)
3976*6777b538SAndroid Build Coastguard Worker {
3977*6777b538SAndroid Build Coastguard Worker     int count;
3978*6777b538SAndroid Build Coastguard Worker     int sum;
3979*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
3980*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
3981*6777b538SAndroid Build Coastguard Worker 
3982*6777b538SAndroid Build Coastguard Worker     if (writer == NULL) {
3983*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3984*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterWriteDTDExternalEntityContents: xmlTextWriterPtr invalid!\n");
3985*6777b538SAndroid Build Coastguard Worker         return -1;
3986*6777b538SAndroid Build Coastguard Worker     }
3987*6777b538SAndroid Build Coastguard Worker 
3988*6777b538SAndroid Build Coastguard Worker     sum = 0;
3989*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
3990*6777b538SAndroid Build Coastguard Worker     if (lk == 0) {
3991*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3992*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
3993*6777b538SAndroid Build Coastguard Worker         return -1;
3994*6777b538SAndroid Build Coastguard Worker     }
3995*6777b538SAndroid Build Coastguard Worker 
3996*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3997*6777b538SAndroid Build Coastguard Worker     if (p == 0)
3998*6777b538SAndroid Build Coastguard Worker         return -1;
3999*6777b538SAndroid Build Coastguard Worker 
4000*6777b538SAndroid Build Coastguard Worker     switch (p->state) {
4001*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_DTD_ENTY:
4002*6777b538SAndroid Build Coastguard Worker             break;
4003*6777b538SAndroid Build Coastguard Worker         case XML_TEXTWRITER_DTD_PENT:
4004*6777b538SAndroid Build Coastguard Worker             if (ndataid != NULL) {
4005*6777b538SAndroid Build Coastguard Worker                 xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
4006*6777b538SAndroid Build Coastguard Worker                                 "xmlTextWriterWriteDTDExternalEntityContents: notation not allowed with parameter entities!\n");
4007*6777b538SAndroid Build Coastguard Worker                 return -1;
4008*6777b538SAndroid Build Coastguard Worker             }
4009*6777b538SAndroid Build Coastguard Worker             break;
4010*6777b538SAndroid Build Coastguard Worker         default:
4011*6777b538SAndroid Build Coastguard Worker             xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
4012*6777b538SAndroid Build Coastguard Worker                             "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
4013*6777b538SAndroid Build Coastguard Worker             return -1;
4014*6777b538SAndroid Build Coastguard Worker     }
4015*6777b538SAndroid Build Coastguard Worker 
4016*6777b538SAndroid Build Coastguard Worker     if (pubid != 0) {
4017*6777b538SAndroid Build Coastguard Worker         if (sysid == 0) {
4018*6777b538SAndroid Build Coastguard Worker             xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
4019*6777b538SAndroid Build Coastguard Worker                             "xmlTextWriterWriteDTDExternalEntityContents: system identifier needed!\n");
4020*6777b538SAndroid Build Coastguard Worker             return -1;
4021*6777b538SAndroid Build Coastguard Worker         }
4022*6777b538SAndroid Build Coastguard Worker 
4023*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
4024*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4025*6777b538SAndroid Build Coastguard Worker             return -1;
4026*6777b538SAndroid Build Coastguard Worker         sum += count;
4027*6777b538SAndroid Build Coastguard Worker 
4028*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4029*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4030*6777b538SAndroid Build Coastguard Worker             return -1;
4031*6777b538SAndroid Build Coastguard Worker         sum += count;
4032*6777b538SAndroid Build Coastguard Worker 
4033*6777b538SAndroid Build Coastguard Worker         count =
4034*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWriteString(writer->out, (const char *) pubid);
4035*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4036*6777b538SAndroid Build Coastguard Worker             return -1;
4037*6777b538SAndroid Build Coastguard Worker         sum += count;
4038*6777b538SAndroid Build Coastguard Worker 
4039*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4040*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4041*6777b538SAndroid Build Coastguard Worker             return -1;
4042*6777b538SAndroid Build Coastguard Worker         sum += count;
4043*6777b538SAndroid Build Coastguard Worker     }
4044*6777b538SAndroid Build Coastguard Worker 
4045*6777b538SAndroid Build Coastguard Worker     if (sysid != 0) {
4046*6777b538SAndroid Build Coastguard Worker         if (pubid == 0) {
4047*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
4048*6777b538SAndroid Build Coastguard Worker             if (count < 0)
4049*6777b538SAndroid Build Coastguard Worker                 return -1;
4050*6777b538SAndroid Build Coastguard Worker             sum += count;
4051*6777b538SAndroid Build Coastguard Worker         }
4052*6777b538SAndroid Build Coastguard Worker 
4053*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, " ");
4054*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4055*6777b538SAndroid Build Coastguard Worker             return -1;
4056*6777b538SAndroid Build Coastguard Worker         sum += count;
4057*6777b538SAndroid Build Coastguard Worker 
4058*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4059*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4060*6777b538SAndroid Build Coastguard Worker             return -1;
4061*6777b538SAndroid Build Coastguard Worker         sum += count;
4062*6777b538SAndroid Build Coastguard Worker 
4063*6777b538SAndroid Build Coastguard Worker         count =
4064*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWriteString(writer->out, (const char *) sysid);
4065*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4066*6777b538SAndroid Build Coastguard Worker             return -1;
4067*6777b538SAndroid Build Coastguard Worker         sum += count;
4068*6777b538SAndroid Build Coastguard Worker 
4069*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4070*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4071*6777b538SAndroid Build Coastguard Worker             return -1;
4072*6777b538SAndroid Build Coastguard Worker         sum += count;
4073*6777b538SAndroid Build Coastguard Worker     }
4074*6777b538SAndroid Build Coastguard Worker 
4075*6777b538SAndroid Build Coastguard Worker     if (ndataid != NULL) {
4076*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, " NDATA ");
4077*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4078*6777b538SAndroid Build Coastguard Worker             return -1;
4079*6777b538SAndroid Build Coastguard Worker         sum += count;
4080*6777b538SAndroid Build Coastguard Worker 
4081*6777b538SAndroid Build Coastguard Worker         count =
4082*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWriteString(writer->out,
4083*6777b538SAndroid Build Coastguard Worker                                        (const char *) ndataid);
4084*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4085*6777b538SAndroid Build Coastguard Worker             return -1;
4086*6777b538SAndroid Build Coastguard Worker         sum += count;
4087*6777b538SAndroid Build Coastguard Worker     }
4088*6777b538SAndroid Build Coastguard Worker 
4089*6777b538SAndroid Build Coastguard Worker     return sum;
4090*6777b538SAndroid Build Coastguard Worker }
4091*6777b538SAndroid Build Coastguard Worker 
4092*6777b538SAndroid Build Coastguard Worker /**
4093*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteDTDNotation:
4094*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
4095*6777b538SAndroid Build Coastguard Worker  * @name:  the name of the xml notation
4096*6777b538SAndroid Build Coastguard Worker  * @pubid:  the public identifier, which is an alternative to the system identifier
4097*6777b538SAndroid Build Coastguard Worker  * @sysid:  the system identifier, which is the URI of the DTD
4098*6777b538SAndroid Build Coastguard Worker  *
4099*6777b538SAndroid Build Coastguard Worker  * Write a DTD entity.
4100*6777b538SAndroid Build Coastguard Worker  *
4101*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
4102*6777b538SAndroid Build Coastguard Worker  */
4103*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer,const xmlChar * name,const xmlChar * pubid,const xmlChar * sysid)4104*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer,
4105*6777b538SAndroid Build Coastguard Worker                               const xmlChar * name,
4106*6777b538SAndroid Build Coastguard Worker                               const xmlChar * pubid, const xmlChar * sysid)
4107*6777b538SAndroid Build Coastguard Worker {
4108*6777b538SAndroid Build Coastguard Worker     int count;
4109*6777b538SAndroid Build Coastguard Worker     int sum;
4110*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
4111*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
4112*6777b538SAndroid Build Coastguard Worker 
4113*6777b538SAndroid Build Coastguard Worker     if (writer == NULL || name == NULL || *name == '\0')
4114*6777b538SAndroid Build Coastguard Worker         return -1;
4115*6777b538SAndroid Build Coastguard Worker 
4116*6777b538SAndroid Build Coastguard Worker     sum = 0;
4117*6777b538SAndroid Build Coastguard Worker     lk = xmlListFront(writer->nodes);
4118*6777b538SAndroid Build Coastguard Worker     if (lk == 0) {
4119*6777b538SAndroid Build Coastguard Worker         return -1;
4120*6777b538SAndroid Build Coastguard Worker     }
4121*6777b538SAndroid Build Coastguard Worker 
4122*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
4123*6777b538SAndroid Build Coastguard Worker     if (p != 0) {
4124*6777b538SAndroid Build Coastguard Worker         switch (p->state) {
4125*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD:
4126*6777b538SAndroid Build Coastguard Worker                 count = xmlOutputBufferWriteString(writer->out, " [");
4127*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
4128*6777b538SAndroid Build Coastguard Worker                     return -1;
4129*6777b538SAndroid Build Coastguard Worker                 sum += count;
4130*6777b538SAndroid Build Coastguard Worker                 if (writer->indent) {
4131*6777b538SAndroid Build Coastguard Worker                     count = xmlOutputBufferWriteString(writer->out, "\n");
4132*6777b538SAndroid Build Coastguard Worker                     if (count < 0)
4133*6777b538SAndroid Build Coastguard Worker                         return -1;
4134*6777b538SAndroid Build Coastguard Worker                     sum += count;
4135*6777b538SAndroid Build Coastguard Worker                 }
4136*6777b538SAndroid Build Coastguard Worker                 p->state = XML_TEXTWRITER_DTD_TEXT;
4137*6777b538SAndroid Build Coastguard Worker                 /* fallthrough */
4138*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_TEXT:
4139*6777b538SAndroid Build Coastguard Worker                 break;
4140*6777b538SAndroid Build Coastguard Worker             default:
4141*6777b538SAndroid Build Coastguard Worker                 return -1;
4142*6777b538SAndroid Build Coastguard Worker         }
4143*6777b538SAndroid Build Coastguard Worker     }
4144*6777b538SAndroid Build Coastguard Worker 
4145*6777b538SAndroid Build Coastguard Worker     if (writer->indent) {
4146*6777b538SAndroid Build Coastguard Worker         count = xmlTextWriterWriteIndent(writer);
4147*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4148*6777b538SAndroid Build Coastguard Worker             return -1;
4149*6777b538SAndroid Build Coastguard Worker         sum += count;
4150*6777b538SAndroid Build Coastguard Worker     }
4151*6777b538SAndroid Build Coastguard Worker 
4152*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, "<!NOTATION ");
4153*6777b538SAndroid Build Coastguard Worker     if (count < 0)
4154*6777b538SAndroid Build Coastguard Worker         return -1;
4155*6777b538SAndroid Build Coastguard Worker     sum += count;
4156*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, (const char *) name);
4157*6777b538SAndroid Build Coastguard Worker     if (count < 0)
4158*6777b538SAndroid Build Coastguard Worker         return -1;
4159*6777b538SAndroid Build Coastguard Worker     sum += count;
4160*6777b538SAndroid Build Coastguard Worker 
4161*6777b538SAndroid Build Coastguard Worker     if (pubid != 0) {
4162*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
4163*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4164*6777b538SAndroid Build Coastguard Worker             return -1;
4165*6777b538SAndroid Build Coastguard Worker         sum += count;
4166*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4167*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4168*6777b538SAndroid Build Coastguard Worker             return -1;
4169*6777b538SAndroid Build Coastguard Worker         sum += count;
4170*6777b538SAndroid Build Coastguard Worker         count =
4171*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWriteString(writer->out, (const char *) pubid);
4172*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4173*6777b538SAndroid Build Coastguard Worker             return -1;
4174*6777b538SAndroid Build Coastguard Worker         sum += count;
4175*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4176*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4177*6777b538SAndroid Build Coastguard Worker             return -1;
4178*6777b538SAndroid Build Coastguard Worker         sum += count;
4179*6777b538SAndroid Build Coastguard Worker     }
4180*6777b538SAndroid Build Coastguard Worker 
4181*6777b538SAndroid Build Coastguard Worker     if (sysid != 0) {
4182*6777b538SAndroid Build Coastguard Worker         if (pubid == 0) {
4183*6777b538SAndroid Build Coastguard Worker             count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
4184*6777b538SAndroid Build Coastguard Worker             if (count < 0)
4185*6777b538SAndroid Build Coastguard Worker                 return -1;
4186*6777b538SAndroid Build Coastguard Worker             sum += count;
4187*6777b538SAndroid Build Coastguard Worker         }
4188*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, " ");
4189*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4190*6777b538SAndroid Build Coastguard Worker             return -1;
4191*6777b538SAndroid Build Coastguard Worker         sum += count;
4192*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4193*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4194*6777b538SAndroid Build Coastguard Worker             return -1;
4195*6777b538SAndroid Build Coastguard Worker         sum += count;
4196*6777b538SAndroid Build Coastguard Worker         count =
4197*6777b538SAndroid Build Coastguard Worker             xmlOutputBufferWriteString(writer->out, (const char *) sysid);
4198*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4199*6777b538SAndroid Build Coastguard Worker             return -1;
4200*6777b538SAndroid Build Coastguard Worker         sum += count;
4201*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4202*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4203*6777b538SAndroid Build Coastguard Worker             return -1;
4204*6777b538SAndroid Build Coastguard Worker         sum += count;
4205*6777b538SAndroid Build Coastguard Worker     }
4206*6777b538SAndroid Build Coastguard Worker 
4207*6777b538SAndroid Build Coastguard Worker     count = xmlOutputBufferWriteString(writer->out, ">");
4208*6777b538SAndroid Build Coastguard Worker     if (count < 0)
4209*6777b538SAndroid Build Coastguard Worker         return -1;
4210*6777b538SAndroid Build Coastguard Worker     sum += count;
4211*6777b538SAndroid Build Coastguard Worker 
4212*6777b538SAndroid Build Coastguard Worker     return sum;
4213*6777b538SAndroid Build Coastguard Worker }
4214*6777b538SAndroid Build Coastguard Worker 
4215*6777b538SAndroid Build Coastguard Worker /**
4216*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterFlush:
4217*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
4218*6777b538SAndroid Build Coastguard Worker  *
4219*6777b538SAndroid Build Coastguard Worker  * Flush the output buffer.
4220*6777b538SAndroid Build Coastguard Worker  *
4221*6777b538SAndroid Build Coastguard Worker  * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
4222*6777b538SAndroid Build Coastguard Worker  */
4223*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterFlush(xmlTextWriterPtr writer)4224*6777b538SAndroid Build Coastguard Worker xmlTextWriterFlush(xmlTextWriterPtr writer)
4225*6777b538SAndroid Build Coastguard Worker {
4226*6777b538SAndroid Build Coastguard Worker     int count;
4227*6777b538SAndroid Build Coastguard Worker 
4228*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
4229*6777b538SAndroid Build Coastguard Worker         return -1;
4230*6777b538SAndroid Build Coastguard Worker 
4231*6777b538SAndroid Build Coastguard Worker     if (writer->out == NULL)
4232*6777b538SAndroid Build Coastguard Worker         count = 0;
4233*6777b538SAndroid Build Coastguard Worker     else
4234*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferFlush(writer->out);
4235*6777b538SAndroid Build Coastguard Worker 
4236*6777b538SAndroid Build Coastguard Worker     return count;
4237*6777b538SAndroid Build Coastguard Worker }
4238*6777b538SAndroid Build Coastguard Worker 
4239*6777b538SAndroid Build Coastguard Worker /**
4240*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterClose:
4241*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
4242*6777b538SAndroid Build Coastguard Worker  *
4243*6777b538SAndroid Build Coastguard Worker  * Flushes and closes the output buffer.
4244*6777b538SAndroid Build Coastguard Worker  *
4245*6777b538SAndroid Build Coastguard Worker  * Available since 2.13.0.
4246*6777b538SAndroid Build Coastguard Worker  *
4247*6777b538SAndroid Build Coastguard Worker  * Returns an xmlParserErrors code.
4248*6777b538SAndroid Build Coastguard Worker  */
4249*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterClose(xmlTextWriterPtr writer)4250*6777b538SAndroid Build Coastguard Worker xmlTextWriterClose(xmlTextWriterPtr writer)
4251*6777b538SAndroid Build Coastguard Worker {
4252*6777b538SAndroid Build Coastguard Worker     int result;
4253*6777b538SAndroid Build Coastguard Worker 
4254*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (writer->out == NULL))
4255*6777b538SAndroid Build Coastguard Worker         return XML_ERR_ARGUMENT;
4256*6777b538SAndroid Build Coastguard Worker 
4257*6777b538SAndroid Build Coastguard Worker     result = xmlOutputBufferClose(writer->out);
4258*6777b538SAndroid Build Coastguard Worker     writer->out = NULL;
4259*6777b538SAndroid Build Coastguard Worker 
4260*6777b538SAndroid Build Coastguard Worker     if (result >= 0)
4261*6777b538SAndroid Build Coastguard Worker         result = XML_ERR_OK;
4262*6777b538SAndroid Build Coastguard Worker     else
4263*6777b538SAndroid Build Coastguard Worker         result = -result;
4264*6777b538SAndroid Build Coastguard Worker 
4265*6777b538SAndroid Build Coastguard Worker     return result;
4266*6777b538SAndroid Build Coastguard Worker }
4267*6777b538SAndroid Build Coastguard Worker 
4268*6777b538SAndroid Build Coastguard Worker /**
4269*6777b538SAndroid Build Coastguard Worker  * misc
4270*6777b538SAndroid Build Coastguard Worker  */
4271*6777b538SAndroid Build Coastguard Worker 
4272*6777b538SAndroid Build Coastguard Worker /**
4273*6777b538SAndroid Build Coastguard Worker  * xmlFreeTextWriterStackEntry:
4274*6777b538SAndroid Build Coastguard Worker  * @lk:  the xmlLinkPtr
4275*6777b538SAndroid Build Coastguard Worker  *
4276*6777b538SAndroid Build Coastguard Worker  * Free callback for the xmlList.
4277*6777b538SAndroid Build Coastguard Worker  */
4278*6777b538SAndroid Build Coastguard Worker static void
xmlFreeTextWriterStackEntry(xmlLinkPtr lk)4279*6777b538SAndroid Build Coastguard Worker xmlFreeTextWriterStackEntry(xmlLinkPtr lk)
4280*6777b538SAndroid Build Coastguard Worker {
4281*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p;
4282*6777b538SAndroid Build Coastguard Worker 
4283*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
4284*6777b538SAndroid Build Coastguard Worker     if (p == 0)
4285*6777b538SAndroid Build Coastguard Worker         return;
4286*6777b538SAndroid Build Coastguard Worker 
4287*6777b538SAndroid Build Coastguard Worker     if (p->name != 0)
4288*6777b538SAndroid Build Coastguard Worker         xmlFree(p->name);
4289*6777b538SAndroid Build Coastguard Worker     xmlFree(p);
4290*6777b538SAndroid Build Coastguard Worker }
4291*6777b538SAndroid Build Coastguard Worker 
4292*6777b538SAndroid Build Coastguard Worker /**
4293*6777b538SAndroid Build Coastguard Worker  * xmlCmpTextWriterStackEntry:
4294*6777b538SAndroid Build Coastguard Worker  * @data0:  the first data
4295*6777b538SAndroid Build Coastguard Worker  * @data1:  the second data
4296*6777b538SAndroid Build Coastguard Worker  *
4297*6777b538SAndroid Build Coastguard Worker  * Compare callback for the xmlList.
4298*6777b538SAndroid Build Coastguard Worker  *
4299*6777b538SAndroid Build Coastguard Worker  * Returns -1, 0, 1
4300*6777b538SAndroid Build Coastguard Worker  */
4301*6777b538SAndroid Build Coastguard Worker static int
xmlCmpTextWriterStackEntry(const void * data0,const void * data1)4302*6777b538SAndroid Build Coastguard Worker xmlCmpTextWriterStackEntry(const void *data0, const void *data1)
4303*6777b538SAndroid Build Coastguard Worker {
4304*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p0;
4305*6777b538SAndroid Build Coastguard Worker     xmlTextWriterStackEntry *p1;
4306*6777b538SAndroid Build Coastguard Worker 
4307*6777b538SAndroid Build Coastguard Worker     if (data0 == data1)
4308*6777b538SAndroid Build Coastguard Worker         return 0;
4309*6777b538SAndroid Build Coastguard Worker 
4310*6777b538SAndroid Build Coastguard Worker     if (data0 == 0)
4311*6777b538SAndroid Build Coastguard Worker         return -1;
4312*6777b538SAndroid Build Coastguard Worker 
4313*6777b538SAndroid Build Coastguard Worker     if (data1 == 0)
4314*6777b538SAndroid Build Coastguard Worker         return 1;
4315*6777b538SAndroid Build Coastguard Worker 
4316*6777b538SAndroid Build Coastguard Worker     p0 = (xmlTextWriterStackEntry *) data0;
4317*6777b538SAndroid Build Coastguard Worker     p1 = (xmlTextWriterStackEntry *) data1;
4318*6777b538SAndroid Build Coastguard Worker 
4319*6777b538SAndroid Build Coastguard Worker     return xmlStrcmp(p0->name, p1->name);
4320*6777b538SAndroid Build Coastguard Worker }
4321*6777b538SAndroid Build Coastguard Worker 
4322*6777b538SAndroid Build Coastguard Worker /**
4323*6777b538SAndroid Build Coastguard Worker  * misc
4324*6777b538SAndroid Build Coastguard Worker  */
4325*6777b538SAndroid Build Coastguard Worker 
4326*6777b538SAndroid Build Coastguard Worker /**
4327*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterOutputNSDecl:
4328*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
4329*6777b538SAndroid Build Coastguard Worker  *
4330*6777b538SAndroid Build Coastguard Worker  * Output the current namespace declarations.
4331*6777b538SAndroid Build Coastguard Worker  */
4332*6777b538SAndroid Build Coastguard Worker static int
xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer)4333*6777b538SAndroid Build Coastguard Worker xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer)
4334*6777b538SAndroid Build Coastguard Worker {
4335*6777b538SAndroid Build Coastguard Worker     xmlLinkPtr lk;
4336*6777b538SAndroid Build Coastguard Worker     xmlTextWriterNsStackEntry *np;
4337*6777b538SAndroid Build Coastguard Worker     int count;
4338*6777b538SAndroid Build Coastguard Worker     int sum;
4339*6777b538SAndroid Build Coastguard Worker 
4340*6777b538SAndroid Build Coastguard Worker     sum = 0;
4341*6777b538SAndroid Build Coastguard Worker     while (!xmlListEmpty(writer->nsstack)) {
4342*6777b538SAndroid Build Coastguard Worker         xmlChar *namespaceURI = NULL;
4343*6777b538SAndroid Build Coastguard Worker         xmlChar *prefix = NULL;
4344*6777b538SAndroid Build Coastguard Worker 
4345*6777b538SAndroid Build Coastguard Worker         lk = xmlListFront(writer->nsstack);
4346*6777b538SAndroid Build Coastguard Worker         np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
4347*6777b538SAndroid Build Coastguard Worker 
4348*6777b538SAndroid Build Coastguard Worker         if (np != 0) {
4349*6777b538SAndroid Build Coastguard Worker             namespaceURI = xmlStrdup(np->uri);
4350*6777b538SAndroid Build Coastguard Worker             prefix = xmlStrdup(np->prefix);
4351*6777b538SAndroid Build Coastguard Worker         }
4352*6777b538SAndroid Build Coastguard Worker 
4353*6777b538SAndroid Build Coastguard Worker         xmlListPopFront(writer->nsstack);
4354*6777b538SAndroid Build Coastguard Worker 
4355*6777b538SAndroid Build Coastguard Worker         if (np != 0) {
4356*6777b538SAndroid Build Coastguard Worker             count = xmlTextWriterWriteAttribute(writer, prefix, namespaceURI);
4357*6777b538SAndroid Build Coastguard Worker             xmlFree(namespaceURI);
4358*6777b538SAndroid Build Coastguard Worker             xmlFree(prefix);
4359*6777b538SAndroid Build Coastguard Worker 
4360*6777b538SAndroid Build Coastguard Worker             if (count < 0) {
4361*6777b538SAndroid Build Coastguard Worker                 xmlListDelete(writer->nsstack);
4362*6777b538SAndroid Build Coastguard Worker                 writer->nsstack = NULL;
4363*6777b538SAndroid Build Coastguard Worker                 return -1;
4364*6777b538SAndroid Build Coastguard Worker             }
4365*6777b538SAndroid Build Coastguard Worker             sum += count;
4366*6777b538SAndroid Build Coastguard Worker         }
4367*6777b538SAndroid Build Coastguard Worker     }
4368*6777b538SAndroid Build Coastguard Worker     return sum;
4369*6777b538SAndroid Build Coastguard Worker }
4370*6777b538SAndroid Build Coastguard Worker 
4371*6777b538SAndroid Build Coastguard Worker /**
4372*6777b538SAndroid Build Coastguard Worker  * xmlFreeTextWriterNsStackEntry:
4373*6777b538SAndroid Build Coastguard Worker  * @lk:  the xmlLinkPtr
4374*6777b538SAndroid Build Coastguard Worker  *
4375*6777b538SAndroid Build Coastguard Worker  * Free callback for the xmlList.
4376*6777b538SAndroid Build Coastguard Worker  */
4377*6777b538SAndroid Build Coastguard Worker static void
xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk)4378*6777b538SAndroid Build Coastguard Worker xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk)
4379*6777b538SAndroid Build Coastguard Worker {
4380*6777b538SAndroid Build Coastguard Worker     xmlTextWriterNsStackEntry *p;
4381*6777b538SAndroid Build Coastguard Worker 
4382*6777b538SAndroid Build Coastguard Worker     p = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
4383*6777b538SAndroid Build Coastguard Worker     if (p == 0)
4384*6777b538SAndroid Build Coastguard Worker         return;
4385*6777b538SAndroid Build Coastguard Worker 
4386*6777b538SAndroid Build Coastguard Worker     if (p->prefix != 0)
4387*6777b538SAndroid Build Coastguard Worker         xmlFree(p->prefix);
4388*6777b538SAndroid Build Coastguard Worker     if (p->uri != 0)
4389*6777b538SAndroid Build Coastguard Worker         xmlFree(p->uri);
4390*6777b538SAndroid Build Coastguard Worker 
4391*6777b538SAndroid Build Coastguard Worker     xmlFree(p);
4392*6777b538SAndroid Build Coastguard Worker }
4393*6777b538SAndroid Build Coastguard Worker 
4394*6777b538SAndroid Build Coastguard Worker /**
4395*6777b538SAndroid Build Coastguard Worker  * xmlCmpTextWriterNsStackEntry:
4396*6777b538SAndroid Build Coastguard Worker  * @data0:  the first data
4397*6777b538SAndroid Build Coastguard Worker  * @data1:  the second data
4398*6777b538SAndroid Build Coastguard Worker  *
4399*6777b538SAndroid Build Coastguard Worker  * Compare callback for the xmlList.
4400*6777b538SAndroid Build Coastguard Worker  *
4401*6777b538SAndroid Build Coastguard Worker  * Returns -1, 0, 1
4402*6777b538SAndroid Build Coastguard Worker  */
4403*6777b538SAndroid Build Coastguard Worker static int
xmlCmpTextWriterNsStackEntry(const void * data0,const void * data1)4404*6777b538SAndroid Build Coastguard Worker xmlCmpTextWriterNsStackEntry(const void *data0, const void *data1)
4405*6777b538SAndroid Build Coastguard Worker {
4406*6777b538SAndroid Build Coastguard Worker     xmlTextWriterNsStackEntry *p0;
4407*6777b538SAndroid Build Coastguard Worker     xmlTextWriterNsStackEntry *p1;
4408*6777b538SAndroid Build Coastguard Worker     int rc;
4409*6777b538SAndroid Build Coastguard Worker 
4410*6777b538SAndroid Build Coastguard Worker     if (data0 == data1)
4411*6777b538SAndroid Build Coastguard Worker         return 0;
4412*6777b538SAndroid Build Coastguard Worker 
4413*6777b538SAndroid Build Coastguard Worker     if (data0 == 0)
4414*6777b538SAndroid Build Coastguard Worker         return -1;
4415*6777b538SAndroid Build Coastguard Worker 
4416*6777b538SAndroid Build Coastguard Worker     if (data1 == 0)
4417*6777b538SAndroid Build Coastguard Worker         return 1;
4418*6777b538SAndroid Build Coastguard Worker 
4419*6777b538SAndroid Build Coastguard Worker     p0 = (xmlTextWriterNsStackEntry *) data0;
4420*6777b538SAndroid Build Coastguard Worker     p1 = (xmlTextWriterNsStackEntry *) data1;
4421*6777b538SAndroid Build Coastguard Worker 
4422*6777b538SAndroid Build Coastguard Worker     rc = xmlStrcmp(p0->prefix, p1->prefix);
4423*6777b538SAndroid Build Coastguard Worker 
4424*6777b538SAndroid Build Coastguard Worker     if ((rc != 0) || (p0->elem != p1->elem))
4425*6777b538SAndroid Build Coastguard Worker         rc = -1;
4426*6777b538SAndroid Build Coastguard Worker 
4427*6777b538SAndroid Build Coastguard Worker     return rc;
4428*6777b538SAndroid Build Coastguard Worker }
4429*6777b538SAndroid Build Coastguard Worker 
4430*6777b538SAndroid Build Coastguard Worker /**
4431*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteDocCallback:
4432*6777b538SAndroid Build Coastguard Worker  * @context:  the xmlBufferPtr
4433*6777b538SAndroid Build Coastguard Worker  * @str:  the data to write
4434*6777b538SAndroid Build Coastguard Worker  * @len:  the length of the data
4435*6777b538SAndroid Build Coastguard Worker  *
4436*6777b538SAndroid Build Coastguard Worker  * Write callback for the xmlOutputBuffer with target xmlBuffer
4437*6777b538SAndroid Build Coastguard Worker  *
4438*6777b538SAndroid Build Coastguard Worker  * Returns -1, 0, 1
4439*6777b538SAndroid Build Coastguard Worker  */
4440*6777b538SAndroid Build Coastguard Worker static int
xmlTextWriterWriteDocCallback(void * context,const char * str,int len)4441*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteDocCallback(void *context, const char *str, int len)
4442*6777b538SAndroid Build Coastguard Worker {
4443*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
4444*6777b538SAndroid Build Coastguard Worker     int rc;
4445*6777b538SAndroid Build Coastguard Worker 
4446*6777b538SAndroid Build Coastguard Worker     if ((rc = xmlParseChunk(ctxt, str, len, 0)) != 0) {
4447*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
4448*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterWriteDocCallback : XML error %d !\n",
4449*6777b538SAndroid Build Coastguard Worker                         rc);
4450*6777b538SAndroid Build Coastguard Worker         return -1;
4451*6777b538SAndroid Build Coastguard Worker     }
4452*6777b538SAndroid Build Coastguard Worker 
4453*6777b538SAndroid Build Coastguard Worker     return len;
4454*6777b538SAndroid Build Coastguard Worker }
4455*6777b538SAndroid Build Coastguard Worker 
4456*6777b538SAndroid Build Coastguard Worker /**
4457*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterCloseDocCallback:
4458*6777b538SAndroid Build Coastguard Worker  * @context:  the xmlBufferPtr
4459*6777b538SAndroid Build Coastguard Worker  *
4460*6777b538SAndroid Build Coastguard Worker  * Close callback for the xmlOutputBuffer with target xmlBuffer
4461*6777b538SAndroid Build Coastguard Worker  *
4462*6777b538SAndroid Build Coastguard Worker  * Returns -1, 0, 1
4463*6777b538SAndroid Build Coastguard Worker  */
4464*6777b538SAndroid Build Coastguard Worker static int
xmlTextWriterCloseDocCallback(void * context)4465*6777b538SAndroid Build Coastguard Worker xmlTextWriterCloseDocCallback(void *context)
4466*6777b538SAndroid Build Coastguard Worker {
4467*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
4468*6777b538SAndroid Build Coastguard Worker     int rc;
4469*6777b538SAndroid Build Coastguard Worker 
4470*6777b538SAndroid Build Coastguard Worker     if ((rc = xmlParseChunk(ctxt, NULL, 0, 1)) != 0) {
4471*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
4472*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterCloseDocCallback : XML error %d !\n",
4473*6777b538SAndroid Build Coastguard Worker                         rc);
4474*6777b538SAndroid Build Coastguard Worker         return -1;
4475*6777b538SAndroid Build Coastguard Worker     }
4476*6777b538SAndroid Build Coastguard Worker 
4477*6777b538SAndroid Build Coastguard Worker     return 0;
4478*6777b538SAndroid Build Coastguard Worker }
4479*6777b538SAndroid Build Coastguard Worker 
4480*6777b538SAndroid Build Coastguard Worker /**
4481*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterVSprintf:
4482*6777b538SAndroid Build Coastguard Worker  * @format:  see printf
4483*6777b538SAndroid Build Coastguard Worker  * @argptr:  pointer to the first member of the variable argument list.
4484*6777b538SAndroid Build Coastguard Worker  *
4485*6777b538SAndroid Build Coastguard Worker  * Utility function for formatted output
4486*6777b538SAndroid Build Coastguard Worker  *
4487*6777b538SAndroid Build Coastguard Worker  * Returns a new xmlChar buffer with the data or NULL on error. This buffer must be freed.
4488*6777b538SAndroid Build Coastguard Worker  */
4489*6777b538SAndroid Build Coastguard Worker static xmlChar *
xmlTextWriterVSprintf(const char * format,va_list argptr)4490*6777b538SAndroid Build Coastguard Worker xmlTextWriterVSprintf(const char *format, va_list argptr)
4491*6777b538SAndroid Build Coastguard Worker {
4492*6777b538SAndroid Build Coastguard Worker     int size;
4493*6777b538SAndroid Build Coastguard Worker     int count;
4494*6777b538SAndroid Build Coastguard Worker     xmlChar *buf;
4495*6777b538SAndroid Build Coastguard Worker     va_list locarg;
4496*6777b538SAndroid Build Coastguard Worker 
4497*6777b538SAndroid Build Coastguard Worker     size = BUFSIZ;
4498*6777b538SAndroid Build Coastguard Worker     buf = (xmlChar *) xmlMalloc(size);
4499*6777b538SAndroid Build Coastguard Worker     if (buf == NULL) {
4500*6777b538SAndroid Build Coastguard Worker         xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
4501*6777b538SAndroid Build Coastguard Worker                         "xmlTextWriterVSprintf : out of memory!\n");
4502*6777b538SAndroid Build Coastguard Worker         return NULL;
4503*6777b538SAndroid Build Coastguard Worker     }
4504*6777b538SAndroid Build Coastguard Worker 
4505*6777b538SAndroid Build Coastguard Worker     va_copy(locarg, argptr);
4506*6777b538SAndroid Build Coastguard Worker     while (((count = vsnprintf((char *) buf, size, format, locarg)) < 0)
4507*6777b538SAndroid Build Coastguard Worker            || (count == size - 1) || (count == size) || (count > size)) {
4508*6777b538SAndroid Build Coastguard Worker 	va_end(locarg);
4509*6777b538SAndroid Build Coastguard Worker         xmlFree(buf);
4510*6777b538SAndroid Build Coastguard Worker         size += BUFSIZ;
4511*6777b538SAndroid Build Coastguard Worker         buf = (xmlChar *) xmlMalloc(size);
4512*6777b538SAndroid Build Coastguard Worker         if (buf == NULL) {
4513*6777b538SAndroid Build Coastguard Worker             xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
4514*6777b538SAndroid Build Coastguard Worker                             "xmlTextWriterVSprintf : out of memory!\n");
4515*6777b538SAndroid Build Coastguard Worker             return NULL;
4516*6777b538SAndroid Build Coastguard Worker         }
4517*6777b538SAndroid Build Coastguard Worker 	va_copy(locarg, argptr);
4518*6777b538SAndroid Build Coastguard Worker     }
4519*6777b538SAndroid Build Coastguard Worker     va_end(locarg);
4520*6777b538SAndroid Build Coastguard Worker 
4521*6777b538SAndroid Build Coastguard Worker     return buf;
4522*6777b538SAndroid Build Coastguard Worker }
4523*6777b538SAndroid Build Coastguard Worker 
4524*6777b538SAndroid Build Coastguard Worker /**
4525*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterStartDocumentCallback:
4526*6777b538SAndroid Build Coastguard Worker  * @ctx: the user data (XML parser context)
4527*6777b538SAndroid Build Coastguard Worker  *
4528*6777b538SAndroid Build Coastguard Worker  * called at the start of document processing.
4529*6777b538SAndroid Build Coastguard Worker  */
4530*6777b538SAndroid Build Coastguard Worker static void
xmlTextWriterStartDocumentCallback(void * ctx)4531*6777b538SAndroid Build Coastguard Worker xmlTextWriterStartDocumentCallback(void *ctx)
4532*6777b538SAndroid Build Coastguard Worker {
4533*6777b538SAndroid Build Coastguard Worker     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
4534*6777b538SAndroid Build Coastguard Worker     xmlDocPtr doc;
4535*6777b538SAndroid Build Coastguard Worker 
4536*6777b538SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
4537*6777b538SAndroid Build Coastguard Worker     if (ctxt->html) {
4538*6777b538SAndroid Build Coastguard Worker         if (ctxt->myDoc == NULL)
4539*6777b538SAndroid Build Coastguard Worker             ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
4540*6777b538SAndroid Build Coastguard Worker         if (ctxt->myDoc == NULL) {
4541*6777b538SAndroid Build Coastguard Worker             xmlCtxtErrMemory(ctxt);
4542*6777b538SAndroid Build Coastguard Worker             return;
4543*6777b538SAndroid Build Coastguard Worker         }
4544*6777b538SAndroid Build Coastguard Worker     } else
4545*6777b538SAndroid Build Coastguard Worker #endif
4546*6777b538SAndroid Build Coastguard Worker     {
4547*6777b538SAndroid Build Coastguard Worker         doc = ctxt->myDoc;
4548*6777b538SAndroid Build Coastguard Worker         if (doc == NULL)
4549*6777b538SAndroid Build Coastguard Worker             doc = ctxt->myDoc = xmlNewDoc(ctxt->version);
4550*6777b538SAndroid Build Coastguard Worker         if (doc != NULL) {
4551*6777b538SAndroid Build Coastguard Worker             if (doc->children == NULL) {
4552*6777b538SAndroid Build Coastguard Worker                 if (ctxt->encoding != NULL)
4553*6777b538SAndroid Build Coastguard Worker                     doc->encoding = xmlStrdup(ctxt->encoding);
4554*6777b538SAndroid Build Coastguard Worker                 else
4555*6777b538SAndroid Build Coastguard Worker                     doc->encoding = NULL;
4556*6777b538SAndroid Build Coastguard Worker                 doc->standalone = ctxt->standalone;
4557*6777b538SAndroid Build Coastguard Worker             }
4558*6777b538SAndroid Build Coastguard Worker         } else {
4559*6777b538SAndroid Build Coastguard Worker             xmlCtxtErrMemory(ctxt);
4560*6777b538SAndroid Build Coastguard Worker             return;
4561*6777b538SAndroid Build Coastguard Worker         }
4562*6777b538SAndroid Build Coastguard Worker     }
4563*6777b538SAndroid Build Coastguard Worker     if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) &&
4564*6777b538SAndroid Build Coastguard Worker         (ctxt->input != NULL) && (ctxt->input->filename != NULL)) {
4565*6777b538SAndroid Build Coastguard Worker         ctxt->myDoc->URL =
4566*6777b538SAndroid Build Coastguard Worker             xmlCanonicPath((const xmlChar *) ctxt->input->filename);
4567*6777b538SAndroid Build Coastguard Worker         if (ctxt->myDoc->URL == NULL)
4568*6777b538SAndroid Build Coastguard Worker             ctxt->myDoc->URL =
4569*6777b538SAndroid Build Coastguard Worker                 xmlStrdup((const xmlChar *) ctxt->input->filename);
4570*6777b538SAndroid Build Coastguard Worker     }
4571*6777b538SAndroid Build Coastguard Worker }
4572*6777b538SAndroid Build Coastguard Worker 
4573*6777b538SAndroid Build Coastguard Worker /**
4574*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterSetIndent:
4575*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
4576*6777b538SAndroid Build Coastguard Worker  * @indent:  do indentation?
4577*6777b538SAndroid Build Coastguard Worker  *
4578*6777b538SAndroid Build Coastguard Worker  * Set indentation output. indent = 0 do not indentation. indent > 0 do indentation.
4579*6777b538SAndroid Build Coastguard Worker  *
4580*6777b538SAndroid Build Coastguard Worker  * Returns -1 on error or 0 otherwise.
4581*6777b538SAndroid Build Coastguard Worker  */
4582*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterSetIndent(xmlTextWriterPtr writer,int indent)4583*6777b538SAndroid Build Coastguard Worker xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent)
4584*6777b538SAndroid Build Coastguard Worker {
4585*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (indent < 0))
4586*6777b538SAndroid Build Coastguard Worker         return -1;
4587*6777b538SAndroid Build Coastguard Worker 
4588*6777b538SAndroid Build Coastguard Worker     writer->indent = indent;
4589*6777b538SAndroid Build Coastguard Worker     writer->doindent = 1;
4590*6777b538SAndroid Build Coastguard Worker 
4591*6777b538SAndroid Build Coastguard Worker     return 0;
4592*6777b538SAndroid Build Coastguard Worker }
4593*6777b538SAndroid Build Coastguard Worker 
4594*6777b538SAndroid Build Coastguard Worker /**
4595*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterSetIndentString:
4596*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
4597*6777b538SAndroid Build Coastguard Worker  * @str:  the xmlChar string
4598*6777b538SAndroid Build Coastguard Worker  *
4599*6777b538SAndroid Build Coastguard Worker  * Set string indentation.
4600*6777b538SAndroid Build Coastguard Worker  *
4601*6777b538SAndroid Build Coastguard Worker  * Returns -1 on error or 0 otherwise.
4602*6777b538SAndroid Build Coastguard Worker  */
4603*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterSetIndentString(xmlTextWriterPtr writer,const xmlChar * str)4604*6777b538SAndroid Build Coastguard Worker xmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str)
4605*6777b538SAndroid Build Coastguard Worker {
4606*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || (!str))
4607*6777b538SAndroid Build Coastguard Worker         return -1;
4608*6777b538SAndroid Build Coastguard Worker 
4609*6777b538SAndroid Build Coastguard Worker     if (writer->ichar != NULL)
4610*6777b538SAndroid Build Coastguard Worker         xmlFree(writer->ichar);
4611*6777b538SAndroid Build Coastguard Worker     writer->ichar = xmlStrdup(str);
4612*6777b538SAndroid Build Coastguard Worker 
4613*6777b538SAndroid Build Coastguard Worker     if (!writer->ichar)
4614*6777b538SAndroid Build Coastguard Worker         return -1;
4615*6777b538SAndroid Build Coastguard Worker     else
4616*6777b538SAndroid Build Coastguard Worker         return 0;
4617*6777b538SAndroid Build Coastguard Worker }
4618*6777b538SAndroid Build Coastguard Worker 
4619*6777b538SAndroid Build Coastguard Worker /**
4620*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterSetQuoteChar:
4621*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
4622*6777b538SAndroid Build Coastguard Worker  * @quotechar:  the quote character
4623*6777b538SAndroid Build Coastguard Worker  *
4624*6777b538SAndroid Build Coastguard Worker  * Set the character used for quoting attributes.
4625*6777b538SAndroid Build Coastguard Worker  *
4626*6777b538SAndroid Build Coastguard Worker  * Returns -1 on error or 0 otherwise.
4627*6777b538SAndroid Build Coastguard Worker  */
4628*6777b538SAndroid Build Coastguard Worker int
xmlTextWriterSetQuoteChar(xmlTextWriterPtr writer,xmlChar quotechar)4629*6777b538SAndroid Build Coastguard Worker xmlTextWriterSetQuoteChar(xmlTextWriterPtr writer, xmlChar quotechar)
4630*6777b538SAndroid Build Coastguard Worker {
4631*6777b538SAndroid Build Coastguard Worker     if ((writer == NULL) || ((quotechar != '\'') && (quotechar != '"')))
4632*6777b538SAndroid Build Coastguard Worker         return -1;
4633*6777b538SAndroid Build Coastguard Worker 
4634*6777b538SAndroid Build Coastguard Worker     writer->qchar = quotechar;
4635*6777b538SAndroid Build Coastguard Worker 
4636*6777b538SAndroid Build Coastguard Worker     return 0;
4637*6777b538SAndroid Build Coastguard Worker }
4638*6777b538SAndroid Build Coastguard Worker 
4639*6777b538SAndroid Build Coastguard Worker /**
4640*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterWriteIndent:
4641*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
4642*6777b538SAndroid Build Coastguard Worker  *
4643*6777b538SAndroid Build Coastguard Worker  * Write indent string.
4644*6777b538SAndroid Build Coastguard Worker  *
4645*6777b538SAndroid Build Coastguard Worker  * Returns -1 on error or the number of strings written.
4646*6777b538SAndroid Build Coastguard Worker  */
4647*6777b538SAndroid Build Coastguard Worker static int
xmlTextWriterWriteIndent(xmlTextWriterPtr writer)4648*6777b538SAndroid Build Coastguard Worker xmlTextWriterWriteIndent(xmlTextWriterPtr writer)
4649*6777b538SAndroid Build Coastguard Worker {
4650*6777b538SAndroid Build Coastguard Worker     int lksize;
4651*6777b538SAndroid Build Coastguard Worker     int i;
4652*6777b538SAndroid Build Coastguard Worker     int ret;
4653*6777b538SAndroid Build Coastguard Worker 
4654*6777b538SAndroid Build Coastguard Worker     lksize = xmlListSize(writer->nodes);
4655*6777b538SAndroid Build Coastguard Worker     if (lksize < 1)
4656*6777b538SAndroid Build Coastguard Worker         return (-1);            /* list is empty */
4657*6777b538SAndroid Build Coastguard Worker     for (i = 0; i < (lksize - 1); i++) {
4658*6777b538SAndroid Build Coastguard Worker         ret = xmlOutputBufferWriteString(writer->out,
4659*6777b538SAndroid Build Coastguard Worker                                          (const char *) writer->ichar);
4660*6777b538SAndroid Build Coastguard Worker         if (ret == -1)
4661*6777b538SAndroid Build Coastguard Worker             return (-1);
4662*6777b538SAndroid Build Coastguard Worker     }
4663*6777b538SAndroid Build Coastguard Worker 
4664*6777b538SAndroid Build Coastguard Worker     return (lksize - 1);
4665*6777b538SAndroid Build Coastguard Worker }
4666*6777b538SAndroid Build Coastguard Worker 
4667*6777b538SAndroid Build Coastguard Worker /**
4668*6777b538SAndroid Build Coastguard Worker  * xmlTextWriterHandleStateDependencies:
4669*6777b538SAndroid Build Coastguard Worker  * @writer:  the xmlTextWriterPtr
4670*6777b538SAndroid Build Coastguard Worker  * @p:  the xmlTextWriterStackEntry
4671*6777b538SAndroid Build Coastguard Worker  *
4672*6777b538SAndroid Build Coastguard Worker  * Write state dependent strings.
4673*6777b538SAndroid Build Coastguard Worker  *
4674*6777b538SAndroid Build Coastguard Worker  * Returns -1 on error or the number of characters written.
4675*6777b538SAndroid Build Coastguard Worker  */
4676*6777b538SAndroid Build Coastguard Worker static int
xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,xmlTextWriterStackEntry * p)4677*6777b538SAndroid Build Coastguard Worker xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
4678*6777b538SAndroid Build Coastguard Worker                                      xmlTextWriterStackEntry * p)
4679*6777b538SAndroid Build Coastguard Worker {
4680*6777b538SAndroid Build Coastguard Worker     int count;
4681*6777b538SAndroid Build Coastguard Worker     int sum;
4682*6777b538SAndroid Build Coastguard Worker     char extra[3];
4683*6777b538SAndroid Build Coastguard Worker 
4684*6777b538SAndroid Build Coastguard Worker     if (writer == NULL)
4685*6777b538SAndroid Build Coastguard Worker         return -1;
4686*6777b538SAndroid Build Coastguard Worker 
4687*6777b538SAndroid Build Coastguard Worker     if (p == NULL)
4688*6777b538SAndroid Build Coastguard Worker         return 0;
4689*6777b538SAndroid Build Coastguard Worker 
4690*6777b538SAndroid Build Coastguard Worker     sum = 0;
4691*6777b538SAndroid Build Coastguard Worker     extra[0] = extra[1] = extra[2] = '\0';
4692*6777b538SAndroid Build Coastguard Worker     if (p != 0) {
4693*6777b538SAndroid Build Coastguard Worker         sum = 0;
4694*6777b538SAndroid Build Coastguard Worker         switch (p->state) {
4695*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_NAME:
4696*6777b538SAndroid Build Coastguard Worker                 /* Output namespace declarations */
4697*6777b538SAndroid Build Coastguard Worker                 count = xmlTextWriterOutputNSDecl(writer);
4698*6777b538SAndroid Build Coastguard Worker                 if (count < 0)
4699*6777b538SAndroid Build Coastguard Worker                     return -1;
4700*6777b538SAndroid Build Coastguard Worker                 sum += count;
4701*6777b538SAndroid Build Coastguard Worker                 extra[0] = '>';
4702*6777b538SAndroid Build Coastguard Worker                 p->state = XML_TEXTWRITER_TEXT;
4703*6777b538SAndroid Build Coastguard Worker                 break;
4704*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_PI:
4705*6777b538SAndroid Build Coastguard Worker                 extra[0] = ' ';
4706*6777b538SAndroid Build Coastguard Worker                 p->state = XML_TEXTWRITER_PI_TEXT;
4707*6777b538SAndroid Build Coastguard Worker                 break;
4708*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD:
4709*6777b538SAndroid Build Coastguard Worker                 extra[0] = ' ';
4710*6777b538SAndroid Build Coastguard Worker                 extra[1] = '[';
4711*6777b538SAndroid Build Coastguard Worker                 p->state = XML_TEXTWRITER_DTD_TEXT;
4712*6777b538SAndroid Build Coastguard Worker                 break;
4713*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ELEM:
4714*6777b538SAndroid Build Coastguard Worker                 extra[0] = ' ';
4715*6777b538SAndroid Build Coastguard Worker                 p->state = XML_TEXTWRITER_DTD_ELEM_TEXT;
4716*6777b538SAndroid Build Coastguard Worker                 break;
4717*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ATTL:
4718*6777b538SAndroid Build Coastguard Worker                 extra[0] = ' ';
4719*6777b538SAndroid Build Coastguard Worker                 p->state = XML_TEXTWRITER_DTD_ATTL_TEXT;
4720*6777b538SAndroid Build Coastguard Worker                 break;
4721*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_ENTY:
4722*6777b538SAndroid Build Coastguard Worker             case XML_TEXTWRITER_DTD_PENT:
4723*6777b538SAndroid Build Coastguard Worker                 extra[0] = ' ';
4724*6777b538SAndroid Build Coastguard Worker                 extra[1] = writer->qchar;
4725*6777b538SAndroid Build Coastguard Worker                 p->state = XML_TEXTWRITER_DTD_ENTY_TEXT;
4726*6777b538SAndroid Build Coastguard Worker                 break;
4727*6777b538SAndroid Build Coastguard Worker             default:
4728*6777b538SAndroid Build Coastguard Worker                 break;
4729*6777b538SAndroid Build Coastguard Worker         }
4730*6777b538SAndroid Build Coastguard Worker     }
4731*6777b538SAndroid Build Coastguard Worker 
4732*6777b538SAndroid Build Coastguard Worker     if (*extra != '\0') {
4733*6777b538SAndroid Build Coastguard Worker         count = xmlOutputBufferWriteString(writer->out, extra);
4734*6777b538SAndroid Build Coastguard Worker         if (count < 0)
4735*6777b538SAndroid Build Coastguard Worker             return -1;
4736*6777b538SAndroid Build Coastguard Worker         sum += count;
4737*6777b538SAndroid Build Coastguard Worker     }
4738*6777b538SAndroid Build Coastguard Worker 
4739*6777b538SAndroid Build Coastguard Worker     return sum;
4740*6777b538SAndroid Build Coastguard Worker }
4741*6777b538SAndroid Build Coastguard Worker 
4742*6777b538SAndroid Build Coastguard Worker #endif
4743