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