@helm2/poc_jenki_rce 0.0.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of @helm2/poc_jenki_rce might be problematic. Click here for more details.

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