xmlwriter.c revision f8e3db0445a1bc8cfe3f77326b07ec161482caa2
15841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
21d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/*
31d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlwriter.c: XML text writer implementation
41d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
51d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * For license and disclaimer see the license and disclaimer of
61d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * libxml2.
71d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
81d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * alfred@mickautsch.de
91d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11b23de5ad89fbcd0a0a6dcab2053cb8e25fc7aa0fIgor Zlatkovic#define IN_LIBXML
12c1099be5eb3e78ae6cef1b2c39b21e7b36a59035William M. Brack#include "libxml.h"
131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#include <string.h>
141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#include <libxml/xmlmemory.h>
161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#include <libxml/parser.h>
175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#include <libxml/uri.h>
185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#include <libxml/HTMLtree.h>
191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#ifdef LIBXML_WRITER_ENABLED
211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#include <libxml/xmlwriter.h>
231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24dbf5411b21cbf5f0f72283a3ff4d4df38afa9990Daniel Veillard#include "buf.h"
25dbf5411b21cbf5f0f72283a3ff4d4df38afa9990Daniel Veillard#include "enc.h"
26dbf5411b21cbf5f0f72283a3ff4d4df38afa9990Daniel Veillard#include "save.h"
27dbf5411b21cbf5f0f72283a3ff4d4df38afa9990Daniel Veillard
281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#define B64LINELEN 72
291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#define B64CRLF "\r\n"
301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/*
32f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * The following VA_COPY was coded following an example in
33f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * the Samba project.  It may not be sufficient for some
34f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * esoteric implementations of va_list (i.e. it may need
35f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * something involving a memcpy) but (hopefully) will be
36f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * sufficient for libxml2.
37f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack */
38f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack#ifndef VA_COPY
39f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack  #ifdef HAVE_VA_COPY
40f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    #define VA_COPY(dest, src) va_copy(dest, src)
41f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack  #else
42f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    #ifdef HAVE___VA_COPY
43f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack      #define VA_COPY(dest,src) __va_copy(dest, src)
44f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    #else
45f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack      #define VA_COPY(dest,src) (dest) = (src)
46f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    #endif
47f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack  #endif
48f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack#endif
49f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack
50f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack/*
511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Types are kept private
521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef enum {
541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_NONE = 0,
551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_NAME,
561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_ATTRIBUTE,
571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_TEXT,
581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_PI,
591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_PI_TEXT,
601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_CDATA,
611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD,
621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_TEXT,
631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_ELEM,
64500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ELEM_TEXT,
651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_ATTL,
66500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ATTL_TEXT,
67500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ENTY,    /* entity */
68500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ENTY_TEXT,
69500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_PENT,    /* parameter entity */
7087640d5f14e7ce8b9844b886c765af0c56de5ca5William M. Brack    XML_TEXTWRITER_COMMENT
711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard} xmlTextWriterState;
721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef struct _xmlTextWriterStackEntry xmlTextWriterStackEntry;
741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriterStackEntry {
761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *name;
771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterState state;
781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef struct _xmlTextWriterNsStackEntry xmlTextWriterNsStackEntry;
811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriterNsStackEntry {
821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *prefix;
831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *uri;
841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr elem;
851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriter {
88ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlOutputBufferPtr out;     /* output buffer */
89ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPtr nodes;           /* element name stack */
90ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPtr nsstack;         /* name spaces stack */
911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int level;
92ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int indent;                 /* enable indent */
93ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int doindent;               /* internal indent flag */
94ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlChar *ichar;             /* indent character */
95ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    char qchar;                 /* character used for quoting attribute values */
9620c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard    xmlParserCtxtPtr ctxt;
97a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    int no_doc_free;
989db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards    xmlDocPtr doc;
991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
1001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void xmlFreeTextWriterStackEntry(xmlLinkPtr lk);
1021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlCmpTextWriterStackEntry(const void *data0,
1031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      const void *data1);
104b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richardsstatic int xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer);
1051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk);
1061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlCmpTextWriterNsStackEntry(const void *data0,
1071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                        const void *data1);
1085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int xmlTextWriterWriteDocCallback(void *context,
1095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                         const xmlChar * str, int len);
1105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int xmlTextWriterCloseDocCallback(void *context);
1115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
1121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic xmlChar *xmlTextWriterVSprintf(const char *format, va_list argptr);
1131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
1141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      const unsigned char *data);
1155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic void xmlTextWriterStartDocumentCallback(void *ctx);
116ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillardstatic int xmlTextWriterWriteIndent(xmlTextWriterPtr writer);
117500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardstatic int
118500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard  xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
119500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                       xmlTextWriterStackEntry * p);
1201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
122dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * xmlWriterErrMsg:
123dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @ctxt:  a writer context
124dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @error:  the error number
125dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @msg:  the error message
126dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard *
127dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * Handle a writer error
128dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard */
129dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillardstatic void
130dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel VeillardxmlWriterErrMsg(xmlTextWriterPtr ctxt, xmlParserErrors error,
131dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard               const char *msg)
132dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard{
133dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    if (ctxt != NULL) {
134dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
135dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	            NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
136bccae2d21038967f5d83109f27b925bcd4795602Daniel Veillard		    NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg);
137dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    } else {
138dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
139bccae2d21038967f5d83109f27b925bcd4795602Daniel Veillard                    XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg);
140dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    }
141dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard}
142dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard
143dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard/**
144dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * xmlWriterErrMsgInt:
145dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @ctxt:  a writer context
146dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @error:  the error number
147dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @msg:  the error message
148dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @val:  an int
149dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard *
150dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * Handle a writer error
151dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard */
152dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillardstatic void
153dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel VeillardxmlWriterErrMsgInt(xmlTextWriterPtr ctxt, xmlParserErrors error,
154dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard               const char *msg, int val)
155dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard{
156dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    if (ctxt != NULL) {
157dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
158dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	            NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
159dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard		    NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
160dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    } else {
161dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
162dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
163dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    }
164dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard}
165dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard
166dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard/**
1671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriter:
1681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out:  an xmlOutputBufferPtr
1691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr
171d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard * NOTE: the @out parameter will be deallocated when the writer is closed
172d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard *       (if the call succeed.)
1731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
1751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1761d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
1771d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriter(xmlOutputBufferPtr out)
1781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
1801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = (xmlTextWriterPtr) xmlMalloc(sizeof(xmlTextWriter));
1821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
183dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
1841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
1851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    memset(ret, 0, (size_t) sizeof(xmlTextWriter));
1881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->nodes = xmlListCreate((xmlListDeallocator)
1901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               xmlFreeTextWriterStackEntry,
1911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               (xmlListDataCompare)
1921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               xmlCmpTextWriterStackEntry);
1931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret->nodes == NULL) {
194dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
1951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
1961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(ret);
1971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->nsstack = xmlListCreate((xmlListDeallocator)
2011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 xmlFreeTextWriterNsStackEntry,
2021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 (xmlListDataCompare)
2031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 xmlCmpTextWriterNsStackEntry);
2041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret->nsstack == NULL) {
205dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
207500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlListDelete(ret->nodes);
2081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(ret);
2091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->out = out;
213ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    ret->ichar = xmlStrdup(BAD_CAST " ");
2141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->qchar = '"';
2151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
216500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (!ret->ichar) {
217500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlListDelete(ret->nodes);
218500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlListDelete(ret->nsstack);
219500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlFree(ret);
220dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
221500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
222ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return NULL;
223500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
2249db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards
2259db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards    ret->doc = xmlNewDoc(NULL);
2269db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards
227a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    ret->no_doc_free = 0;
228ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
2291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
2301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
2311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
2331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriterFilename:
2341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @uri:  the URI of the resource for the output
2351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @compression:  compress the output?
2361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure with @uri as output
2381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
2401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2411d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
2421d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriterFilename(const char *uri, int compression)
2431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
2441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
2451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlOutputBufferPtr out;
2461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    out = xmlOutputBufferCreateFilename(uri, NULL, compression);
2481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (out == NULL) {
249798743a4983d3a2c94d6af1608bce9696aa181e7Rob Richards        xmlWriterErrMsg(NULL, XML_IO_EIO,
250798743a4983d3a2c94d6af1608bce9696aa181e7Rob Richards                        "xmlNewTextWriterFilename : cannot open uri\n");
2511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = xmlNewTextWriter(out);
2551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
256dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterFilename : out of memory!\n");
2581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(out);
2591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2622cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    ret->indent = 0;
2632cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    ret->doindent = 0;
2641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
2651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
2661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
2681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriterMemory:
2691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @buf:  xmlBufferPtr
2701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @compression:  compress the output?
2711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure with @buf as output
2731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * TODO: handle compression
2741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
2761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2771d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
2781d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriterMemory(xmlBufferPtr buf, int compression ATTRIBUTE_UNUSED)
2791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
2801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
2811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlOutputBufferPtr out;
2821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/*::todo handle compression */
284a44f234d3a0c94879136c5fa4b24f386148716adRob Richards    out = xmlOutputBufferCreateBuffer(buf, NULL);
285a44f234d3a0c94879136c5fa4b24f386148716adRob Richards
2861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (out == NULL) {
287dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterMemory : out of memory!\n");
2891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = xmlNewTextWriter(out);
2931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
294dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterMemory : out of memory!\n");
2961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(out);
2971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
3011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
3021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
3045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterPushParser:
3055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ctxt: xmlParserCtxtPtr to hold the new XML document tree
3065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
3075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @ctxt as output
309d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard * NOTE: the @ctxt context will be freed with the resulting writer
310d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard *       (if the call succeeds).
3115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * TODO: handle compression
3125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
3145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
3161d913863130a17a638db69c2c50f89e5b0d4aae4Daniel VeillardxmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt,
3171d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard                           int compression ATTRIBUTE_UNUSED)
3185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
3195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
3205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlOutputBufferPtr out;
3215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
322500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (ctxt == NULL) {
323dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
324500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlNewTextWriterPushParser : invalid context!\n");
325500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return NULL;
326500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
327500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    out = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
3295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  xmlTextWriterWriteDocCallback,
3305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  (xmlOutputCloseCallback)
3315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  xmlTextWriterCloseDocCallback,
3325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  (void *) ctxt, NULL);
3335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (out == NULL) {
334dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterPushParser : error at xmlOutputBufferCreateIO!\n");
3365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriter(out);
3405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
341dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterPushParser : error at xmlNewTextWriter!\n");
3435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferClose(out);
3445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
34720c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard    ret->ctxt = ctxt;
34820c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard
3495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
3505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
3515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterDoc:
3545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @doc: address of a xmlDocPtr to hold the new XML document tree
3555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
3565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @*doc as output
3585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
3605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
3625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlNewTextWriterDoc(xmlDocPtr * doc, int compression)
3635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
3645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
3655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAXHandler saxHandler;
3665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt;
3675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    memset(&saxHandler, '\0', sizeof(saxHandler));
3695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
3705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
3715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startElement = xmlSAX2StartElement;
3725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.endElement = xmlSAX2EndElement;
3735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
3755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt == NULL) {
376dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
377eb0a0b2e31b6de7df2b7c354a914708c033f6f8fDaniel Veillard                "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
3785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
38003a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    /*
38103a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * For some reason this seems to completely break if node names
38203a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * are interned.
38303a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     */
38403a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    ctxt->dictNames = 0;
3855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3861d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard    ctxt->myDoc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
3875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt->myDoc == NULL) {
3885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlFreeParserCtxt(ctxt);
389dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewDoc!\n");
3915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriterPushParser(ctxt, compression);
3955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
396eb0a0b2e31b6de7df2b7c354a914708c033f6f8fDaniel Veillard        xmlFreeDoc(ctxt->myDoc);
397eb0a0b2e31b6de7df2b7c354a914708c033f6f8fDaniel Veillard        xmlFreeParserCtxt(ctxt);
398dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
399eb0a0b2e31b6de7df2b7c354a914708c033f6f8fDaniel Veillard                "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
4005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
4025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
403500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlSetDocCompressMode(ctxt->myDoc, compression);
404500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
405a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    if (doc != NULL) {
406500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        *doc = ctxt->myDoc;
407a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	ret->no_doc_free = 1;
408a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    }
4095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
4115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
4125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
4145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterTree:
4155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @doc: xmlDocPtr
4165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @node: xmlNodePtr or NULL for doc->children
4175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
4185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
4195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @doc as output
4205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * starting at @node
4215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
4225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
4235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
4245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
4255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression)
4265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
4275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
4285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAXHandler saxHandler;
4295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt;
4305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (doc == NULL) {
432dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
433500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlNewTextWriterTree : invalid document tree!\n");
4345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
4365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    memset(&saxHandler, '\0', sizeof(saxHandler));
4385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
4395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
4405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startElement = xmlSAX2StartElement;
4415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.endElement = xmlSAX2EndElement;
4425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
4445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt == NULL) {
445dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
4465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
4475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
44903a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    /*
45003a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * For some reason this seems to completely break if node names
45103a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * are interned.
45203a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     */
45303a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    ctxt->dictNames = 0;
4545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriterPushParser(ctxt, compression);
4565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
457500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlFreeParserCtxt(ctxt);
458dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
4595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
4605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
4625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
463500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    ctxt->myDoc = doc;
464500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    ctxt->node = node;
465a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    ret->no_doc_free = 1;
466500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSetDocCompressMode(doc, compression);
4685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
4705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
4715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
4731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriter:
4741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
4751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
4761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Deallocate all the resources associated to the writer
4771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
4781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardvoid
4791d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriter(xmlTextWriterPtr writer)
4801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
4811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
4821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
4831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out != NULL)
4851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(writer->out);
4861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->nodes != NULL)
4881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nodes);
4891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->nsstack != NULL)
4911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nsstack);
4921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
493a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    if (writer->ctxt != NULL) {
494a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard        if ((writer->ctxt->myDoc != NULL) && (writer->no_doc_free == 0)) {
495a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	    xmlFreeDoc(writer->ctxt->myDoc);
496a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	    writer->ctxt->myDoc = NULL;
497a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	}
49820c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard        xmlFreeParserCtxt(writer->ctxt);
499a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    }
50020c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard
5019db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards    if (writer->doc != NULL)
5029db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards        xmlFreeDoc(writer->doc);
5039db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards
5044773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard    if (writer->ichar != NULL)
5054773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard        xmlFree(writer->ichar);
5061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(writer);
5071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
5081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
5101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartDocument:
5111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
5121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @version:  the xml version ("1.0") or NULL for default ("1.0")
5131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @encoding:  the encoding or NULL for default
5141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @standalone: "yes" or "no" or NULL for default
5151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start a new xml document
5171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
5191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
5201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
5211d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version,
5221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const char *encoding, const char *standalone)
5231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
5241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
5251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
5261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
5271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlCharEncodingHandlerPtr encoder;
5281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
529500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if ((writer == NULL) || (writer->out == NULL)) {
530dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
531500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterStartDocument : invalid writer!\n");
5321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
533500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
5341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
5361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
537dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
538500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterStartDocument : not allowed in this context!\n");
5391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    encoder = NULL;
5431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (encoding != NULL) {
5441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        encoder = xmlFindCharEncodingHandler(encoding);
5451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (encoder == NULL) {
546dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
5471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartDocument : out of memory!\n");
5481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
5501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    writer->out->encoder = encoder;
5531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (encoder != NULL) {
554caa1951d59833b4516c008829f9e5ce96fd37b03Daniel Veillard	if (writer->out->conv == NULL) {
555dbf5411b21cbf5f0f72283a3ff4d4df38afa9990Daniel Veillard	    writer->out->conv = xmlBufCreateSize(4000);
556caa1951d59833b4516c008829f9e5ce96fd37b03Daniel Veillard	}
557dbf5411b21cbf5f0f72283a3ff4d4df38afa9990Daniel Veillard        xmlCharEncOutput(writer->out, 1);
5589db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards        if ((writer->doc != NULL) && (writer->doc->encoding == NULL))
5599db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards            writer->doc->encoding = xmlStrdup((xmlChar *)writer->out->encoder->name);
5601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    } else
5611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        writer->out->conv = NULL;
5621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
5641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<?xml version=");
5651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (version != 0)
5731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, version);
5741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    else
5751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "1.0");
5761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out->encoder != 0) {
5841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " encoding=");
5851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count =
5931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlOutputBufferWriteString(writer->out,
5941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                       writer->out->encoder->name);
5951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
6001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
6011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
6021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
6031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (standalone != 0) {
6051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " standalone=");
6061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
6071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
6081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
6091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
6101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
6111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
6121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
6131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, standalone);
6141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
6151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
6161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
6171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
6181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
6191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
6201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
6211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
6221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "?>\n");
6241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
6251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
6261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
6271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
6291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
6301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
6321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndDocument:
6331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
6341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
6353ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard * End an xml document. All open elements are closed, and
6363ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard * the content is flushed to the output.
6371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
6383ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard * Returns the bytes written or -1 in case of error
6391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
6401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
6411d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndDocument(xmlTextWriterPtr writer)
6421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
6431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
6441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
6451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
6461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
6471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
648500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
649dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
650500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterEndDocument : invalid writer!\n");
6511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
652500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
6531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
6551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while ((lk = xmlListFront(writer->nodes)) != NULL) {
6561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
6571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p == 0)
6581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
6591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        switch (p->state) {
6601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_NAME:
6611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_ATTRIBUTE:
6621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_TEXT:
6631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndElement(writer);
6641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
6681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_PI:
6691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_PI_TEXT:
6701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndPI(writer);
6711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
6751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_CDATA:
6761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndCDATA(writer);
6771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
6811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_DTD:
682500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
683500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM:
684500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM_TEXT:
685500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL:
686500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL_TEXT:
687500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY:
688500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY_TEXT:
689500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_PENT:
6901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndDTD(writer);
6911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
695ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            case XML_TEXTWRITER_COMMENT:
696ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                count = xmlTextWriterEndComment(writer);
697ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                if (count < 0)
698ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    return -1;
699ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                sum += count;
700ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                break;
7011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            default:
702ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                break;
7031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
7041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
7051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7062cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (!writer->indent) {
707ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
708ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count < 0)
709ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
710ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
711ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
7123ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard
7133ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard    sum += xmlTextWriterFlush(writer);
7143ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard
715ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return sum;
716ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard}
717ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
718ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard/**
719ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * xmlTextWriterStartComment:
720ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * @writer:  the xmlTextWriterPtr
721ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
722ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * Start an xml comment.
723ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
724ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
725ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard */
726ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillardint
727ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterStartComment(xmlTextWriterPtr writer)
728ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard{
729ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int count;
730ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int sum;
731ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlLinkPtr lk;
732ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlTextWriterStackEntry *p;
733ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
734500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
735dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
736500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterStartComment : invalid writer!\n");
737ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
738500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
739ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
740ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    sum = 0;
741ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    lk = xmlListFront(writer->nodes);
742ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (lk != 0) {
743ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
744ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (p != 0) {
745ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            switch (p->state) {
746ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_TEXT:
747ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_NONE:
748ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
749ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_NAME:
750b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    /* Output namespace declarations */
751b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    count = xmlTextWriterOutputNSDecl(writer);
752b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    if (count < 0)
753b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        return -1;
754b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    sum += count;
755ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
756ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    if (count < 0)
757ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                        return -1;
758ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    sum += count;
759500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (writer->indent) {
760500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        count =
761500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            xmlOutputBufferWriteString(writer->out, "\n");
762500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        if (count < 0)
763500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            return -1;
764500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        sum += count;
765500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    }
766ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
767ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
768ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                default:
769ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    return -1;
770ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            }
771ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        }
772ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
773ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
774ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p = (xmlTextWriterStackEntry *)
775ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
776ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (p == 0) {
777dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
778ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
779ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
780ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
781ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
78275e389d4e0ccd998d288387051e66a8f0b2af1b0Daniel Veillard    p->name = NULL;
783ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p->state = XML_TEXTWRITER_COMMENT;
784ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
785ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPushFront(writer->nodes, p);
786ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
787ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent) {
788ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
789ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count < 0)
790ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
791ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
792ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
793ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
794ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!--");
795ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (count < 0)
7965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
7975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    sum += count;
798ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
799ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return sum;
800ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard}
801ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
802ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard/**
803ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * xmlTextWriterEndComment:
804ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * @writer:  the xmlTextWriterPtr
805ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
806ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * End the current xml coment.
807ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
808ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
809ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard */
810ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillardint
811ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterEndComment(xmlTextWriterPtr writer)
812ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard{
813ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int count;
814ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int sum;
815ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlLinkPtr lk;
816ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlTextWriterStackEntry *p;
817ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
818500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
819dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
820500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterEndComment : invalid writer!\n");
821ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
822500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
823ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
824ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    lk = xmlListFront(writer->nodes);
825500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0) {
826dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
827500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterEndComment : not allowed in this context!\n");
828ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
829500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
830ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
831ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
832ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (p == 0)
833ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
834ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
835ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    sum = 0;
836ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    switch (p->state) {
837ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        case XML_TEXTWRITER_COMMENT:
838ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "-->");
839ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            if (count < 0)
840ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                return -1;
841ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            sum += count;
842ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            break;
843ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        default:
844ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
845ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
846ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
847ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent) {
848ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
849ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count < 0)
850ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
851ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
8522cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
853ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
854ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPopFront(writer->nodes);
8551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
8561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
8571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
8591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatComment:
8601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
8611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
8621d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
8631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
8651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
8671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
868ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
8691d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatComment(xmlTextWriterPtr writer,
8701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const char *format, ...)
8711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
8721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
8731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
8741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
8761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatComment(writer, format, ap);
8781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
8801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
8811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
8821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
8841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatComment:
8851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
8861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
8871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
8881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
8901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
8921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
8931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
8941d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer,
8951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 const char *format, va_list argptr)
8961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
8971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
8981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
8991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
900500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
901dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
902500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteVFormatComment : invalid writer!\n");
9031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
904500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
9051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
907cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
908cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
9091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteComment(writer, buf);
9111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
9131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
9141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
9151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
9171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteComment:
9181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
9191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  comment string
9201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
9221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
9241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
9251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
9261d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content)
9271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
9281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
9291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
9301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
932ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlTextWriterStartComment(writer);
9331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
9341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
936ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
9371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
9381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
940ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlTextWriterEndComment(writer);
9411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
9421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
9441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
9461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
9471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
9491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartElement:
9501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
9511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
9521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml element.
9541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
9561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
9571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
9581d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name)
9591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
9601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
9611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
9621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
9631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
9641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
9661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
9691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
9701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
9711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
9721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
9731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
9741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
9751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
9761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
9771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NONE:
9781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
979614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard				case XML_TEXTWRITER_ATTRIBUTE:
980614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard					count = xmlTextWriterEndAttribute(writer);
981614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard					if (count < 0)
982614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard						return -1;
983614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard					sum += count;
984614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard					/* fallthrough */
9851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
986b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    /* Output namespace declarations */
987b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    count = xmlTextWriterOutputNSDecl(writer);
988b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    if (count < 0)
989b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        return -1;
990b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    sum += count;
9911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
9921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
9931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
9941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
995ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    if (writer->indent)
996ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                        count =
997ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                            xmlOutputBufferWriteString(writer->out, "\n");
9981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
9991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
1000ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                default:
1001ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
10021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
10031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
10041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
10071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
10081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
1009dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
10101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
10111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
10151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
1016dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
10171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
10181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
10191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_NAME;
10221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
10241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1025ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent) {
1026ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
1027ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
10282cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
10292cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
10301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<");
10311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
10321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
10345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count =
10355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferWriteString(writer->out, (const char *) p->name);
10361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
10371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
10391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
10411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
10421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
10441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartElementNS:
10451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
10461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix or NULL
10471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
10481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI or NULL
10491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml element with namespace support.
10511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
10531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
10541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
10551d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartElementNS(xmlTextWriterPtr writer,
10561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * prefix, const xmlChar * name,
10571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * namespaceURI)
10581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
10591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
10601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
10611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
10621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
10641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
106675e389d4e0ccd998d288387051e66a8f0b2af1b0Daniel Veillard    buf = NULL;
10671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != 0) {
10681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
10691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
10701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
10721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
10741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartElement(writer, buf);
10751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
10761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
10771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
10791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (namespaceURI != 0) {
1081f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        xmlTextWriterNsStackEntry *p = (xmlTextWriterNsStackEntry *)
1082b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
1083b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (p == 0) {
1084f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1085b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                            "xmlTextWriterStartElementNS : out of memory!\n");
1086b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            return -1;
1087b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1088b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
10891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(BAD_CAST "xmlns");
10901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (prefix != 0) {
10911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, BAD_CAST ":");
10921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, prefix);
10931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
10941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1095b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        p->prefix = buf;
1096b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        p->uri = xmlStrdup(namespaceURI);
1097b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (p->uri == 0) {
1098b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1099b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                            "xmlTextWriterStartElementNS : out of memory!\n");
1100b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlFree(p);
11011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
1102b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1103b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        p->elem = xmlListFront(writer->nodes);
1104b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1105b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlListPushFront(writer->nsstack, p);
11061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
11071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
11091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
11101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
11121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndElement:
11131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
11141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element.
11161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
11181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
11191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
11201d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndElement(xmlTextWriterPtr writer)
11211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
11221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
11231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
11241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
11251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
11261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
11281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
11291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
1131b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (lk == 0) {
1132b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlListDelete(writer->nsstack);
1133b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        writer->nsstack = NULL;
11341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
1135b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    }
11361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1138b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (p == 0) {
1139b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlListDelete(writer->nsstack);
1140b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        writer->nsstack = NULL;
11411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
1142b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    }
11431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
11451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
11461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
11471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
1148b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (count < 0) {
1149b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlListDelete(writer->nsstack);
1150b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                writer->nsstack = NULL;
11511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
1152b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
11531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
11551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
1156b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            /* Output namespace declarations */
1157b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            count = xmlTextWriterOutputNSDecl(writer);
1158b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (count < 0)
1159b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1160b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            sum += count;
1161b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1162ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            if (writer->indent) /* next element needs indent */
1163ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                writer->doindent = 1;
11641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "/>");
11651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
11691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_TEXT:
1170ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            if ((writer->indent) && (writer->doindent)) {
1171ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                count = xmlTextWriterWriteIndent(writer);
1172ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                sum += count;
1173ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                writer->doindent = 1;
1174ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            } else
1175ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                writer->doindent = 1;
11761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "</");
11771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out,
1181ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                               (const char *) p->name);
11821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
11861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
11901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
11911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
11921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
11931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11942cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (writer->indent) {
1195ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
1196ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
11972cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
11982cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
11991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
12001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
12011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
12021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
12041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterFullEndElement:
12051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
12061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element. Writes an end tag even if the element is empty
12081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
12101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
12111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
12121d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterFullEndElement(xmlTextWriterPtr writer)
12131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
12141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
12151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
12161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
12171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
12181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
12201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
12211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
12231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
12241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
12251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
12271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
12281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
12291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
12311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
12321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
12331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
12341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
12381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
1239b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            /* Output namespace declarations */
1240b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            count = xmlTextWriterOutputNSDecl(writer);
1241b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (count < 0)
1242b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1243b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            sum += count;
1244b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
12451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
12461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12495a7d8bdf712ed1d0c429e292808c2b35d628acfaRob Richards            if (writer->indent)
12505a7d8bdf712ed1d0c429e292808c2b35d628acfaRob Richards                writer->doindent = 0;
12511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
12521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_TEXT:
12535a7d8bdf712ed1d0c429e292808c2b35d628acfaRob Richards            if ((writer->indent) && (writer->doindent)) {
12545a7d8bdf712ed1d0c429e292808c2b35d628acfaRob Richards                count = xmlTextWriterWriteIndent(writer);
12555a7d8bdf712ed1d0c429e292808c2b35d628acfaRob Richards                sum += count;
12565a7d8bdf712ed1d0c429e292808c2b35d628acfaRob Richards                writer->doindent = 1;
12575a7d8bdf712ed1d0c429e292808c2b35d628acfaRob Richards            } else
12585a7d8bdf712ed1d0c429e292808c2b35d628acfaRob Richards                writer->doindent = 1;
12591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "</");
12601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out,
1264ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                               (const char *) p->name);
12651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
12691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
12731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
12741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
12751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
12761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12777e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard    if (writer->indent) {
12787e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
12797e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard        sum += count;
12807e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard    }
12817e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard
12821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
12831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
12841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
12851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
12871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatRaw:
12881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
12891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
12901d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
12911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted raw xml text.
12931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
12951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1296ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
12971d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format,
12981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            ...)
12991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
13011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
13021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
13041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatRaw(writer, format, ap);
13061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
13081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
13091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatRaw:
13131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
13141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
13151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
13161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted raw xml text.
13181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
13201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
13211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
13221d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format,
13231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             va_list argptr)
13241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
13261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
13271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
13291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
13301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
1332cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
1333cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
13341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteRaw(writer, buf);
13361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
13381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
13391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13421e90661bb817402f85103c3b9d3ce6ebab570f38Daniel Veillard * xmlTextWriterWriteRawLen:
13431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
13441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
13451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  length of the text string
13461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml text.
13481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * TODO: what about entities and special chars??
13491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
13511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
13521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
13531d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content,
13541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int len)
13551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
13571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
13581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
13591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
13601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1361500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
1362dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
1363500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteRawLen : invalid writer!\n");
13641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
1365500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
13661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1367e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((content == NULL) || (len < 0)) {
1368dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
1369500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteRawLen : invalid content!\n");
1370500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
1371500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
13721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1374500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1375500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1376500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1377500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterHandleStateDependencies(writer, p);
1378500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
13791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
1380500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
13811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
13821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1383500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent)
1384500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        writer->doindent = 0;
1385500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
1386500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (content != NULL) {
1387500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count =
1388500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            xmlOutputBufferWrite(writer->out, len, (const char *) content);
1389500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
1390500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
1391500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
1392500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
13931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
13951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteRaw:
13991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
14001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
14011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a raw xml text.
14031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
14061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
14071d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content)
14081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
14091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content));
14101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
14111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
14131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatString:
14141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
14151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
14161d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
14171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml text.
14191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1422ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
14231d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format,
14241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               ...)
14251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
14261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
14271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
14281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1429e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (format == NULL))
1430e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard        return -1;
1431e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard
14321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
14331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatString(writer, format, ap);
14351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
14371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
14381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
14391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
14411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatString:
14421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
14431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
14441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
14451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml text.
14471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
14501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
14511d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatString(xmlTextWriterPtr writer,
14521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const char *format, va_list argptr)
14531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
14541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
14551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
14561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1457e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (format == NULL))
14581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
14591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
1461cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
1462cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
14631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteString(writer, buf);
14651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
14671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
14681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
14691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
14711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteString:
14721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
14731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
14741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml text.
14761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
14791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
14801d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content)
14811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1482500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
14831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
14841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
14851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
1486500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlChar *buf;
14871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1488e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (content == NULL))
14891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
14901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1492500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    buf = (xmlChar *) content;
1493500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1494500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1495500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1496500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
1497500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            switch (p->state) {
1498500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_NAME:
1499500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_TEXT:
150062040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard#if 0
150162040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard                    buf = NULL;
150262040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard		    xmlOutputBufferWriteEscape(writer->out, content, NULL);
150362040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard#endif
1504500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    buf = xmlEncodeSpecialChars(NULL, content);
1505500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    break;
1506500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
1507500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    buf = NULL;
1508dbf5411b21cbf5f0f72283a3ff4d4df38afa9990Daniel Veillard                    xmlBufAttrSerializeTxtContent(writer->out->buffer,
1509dbf5411b21cbf5f0f72283a3ff4d4df38afa9990Daniel Veillard                                                  writer->doc, NULL, content);
1510500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    break;
151187640d5f14e7ce8b9844b886c765af0c56de5ca5William M. Brack		default:
151287640d5f14e7ce8b9844b886c765af0c56de5ca5William M. Brack		    break;
1513500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            }
1514500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
15151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
15161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1517500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (buf != NULL) {
1518500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteRaw(writer, buf);
1519751c9ec657e784bd941802d722632f19f17f17aeDaniel Veillard
1520500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (buf != content)     /* buf was allocated by us, so free it */
1521500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            xmlFree(buf);
1522eb0a0b2e31b6de7df2b7c354a914708c033f6f8fDaniel Veillard
1523eb0a0b2e31b6de7df2b7c354a914708c033f6f8fDaniel Veillard        if (count < 0)
1524eb0a0b2e31b6de7df2b7c354a914708c033f6f8fDaniel Veillard            return -1;
1525eb0a0b2e31b6de7df2b7c354a914708c033f6f8fDaniel Veillard        sum += count;
1526a9c612c3ee115278fb8dc0cac1b2f2e362f0c052William M. Brack    }
15271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
15291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
15301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
15321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlOutputBufferWriteBase64:
15331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out: the xmlOutputBufferPtr
15341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
15351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
15361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
15371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write base64 encoded data to an xmlOutputBuffer.
15381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Adapted from John Walker's base64.c (http://www.fourmilab.ch/).
15391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
15401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
15411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
15421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
15431d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
15441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const unsigned char *data)
15451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
15461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    static unsigned char dtable[64] =
154747a318840053e03e60acb437f41e63366f44852cWilliam M. Brack            {'A','B','C','D','E','F','G','H','I','J','K','L','M',
154847a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
154947a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     'a','b','c','d','e','f','g','h','i','j','k','l','m',
155047a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     'n','o','p','q','r','s','t','u','v','w','x','y','z',
155147a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     '0','1','2','3','4','5','6','7','8','9','+','/'};
155247a318840053e03e60acb437f41e63366f44852cWilliam M. Brack
15531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int i;
15541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int linelen;
15551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
15561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
15571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1558e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((out == NULL) || (len < 0) || (data == NULL))
1559e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard        return(-1);
1560e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard
15611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    linelen = 0;
15621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
15631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    i = 0;
15651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while (1) {
15661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        unsigned char igroup[3];
15671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        unsigned char ogroup[4];
15681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        int c;
15691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        int n;
15701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        igroup[0] = igroup[1] = igroup[2] = 0;
15721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        for (n = 0; n < 3 && i < len; n++, i++) {
15731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            c = data[i];
15741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            igroup[n] = (unsigned char) c;
15751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
15761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (n > 0) {
15781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[0] = dtable[igroup[0] >> 2];
15791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
15801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[2] =
15811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
15821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[3] = dtable[igroup[2] & 0x3F];
15831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (n < 3) {
15851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                ogroup[3] = '=';
15861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (n < 2) {
15871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    ogroup[2] = '=';
15881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                }
15891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
15901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (linelen >= B64LINELEN) {
15921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlOutputBufferWrite(out, 2, B64CRLF);
15931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count == -1)
15941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
15951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
15961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                linelen = 0;
15971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
15981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(out, 4, (const char *) ogroup);
15991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count == -1)
16001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
16011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
16021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            linelen += 4;
16041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
1605929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard
1606929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard        if (i >= len)
1607929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard            break;
16081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
16091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
16111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
16121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
16141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteBase64:
16151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer: the xmlTextWriterPtr
16161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
16171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @start:  the position within the data of the first byte to encode
16181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
16191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an base64 encoded xml text.
16211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
16231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
16241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
1625ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data,
16261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int start, int len)
16271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
16281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
16291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
16301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
16311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
16321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1633e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
16341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1637500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1638500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1639500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1640500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
1641500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlTextWriterHandleStateDependencies(writer, p);
16421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
16431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
16441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
1645500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
16461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
16471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1648ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent)
1649ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        writer->doindent = 0;
1650ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
16511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
16521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferWriteBase64(writer->out, len,
16531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   (unsigned char *) data + start);
16541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
16551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
16571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
16591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
16601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
16621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlOutputBufferWriteBinHex:
16631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out: the xmlOutputBufferPtr
16641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
16651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
16661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write hqx encoded data to an xmlOutputBuffer.
16681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * ::todo
16691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1670f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Returns the bytes written (may be 0 because of buffering)
167147a318840053e03e60acb437f41e63366f44852cWilliam M. Brack * or -1 in case of error
16721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
16731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
1674ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlOutputBufferWriteBinHex(xmlOutputBufferPtr out,
1675ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                           int len, const unsigned char *data)
16761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1677ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int count;
1678ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int sum;
1679f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    static char hex[16] =
1680f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
1681ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int i;
1682ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
1683e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((out == NULL) || (data == NULL) || (len < 0)) {
1684ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
1685ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
1686ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
1687ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    sum = 0;
1688ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    for (i = 0; i < len; i++) {
1689ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count =
1690ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            xmlOutputBufferWrite(out, 1,
1691ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                 (const char *) &hex[data[i] >> 4]);
1692ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count == -1)
1693ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
1694ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
1695ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count =
1696ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            xmlOutputBufferWrite(out, 1,
1697ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                 (const char *) &hex[data[i] & 0xF]);
1698ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count == -1)
1699ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
1700ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
1701ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
1702ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
1703ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return sum;
17041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
17051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
17071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteBinHex:
17081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer: the xmlTextWriterPtr
17091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
17101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @start:  the position within the data of the first byte to encode
17111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
17121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a BinHex encoded xml text.
17141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
1718ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data,
17191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int start, int len)
17201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
17211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
17221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
17231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
17241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
17251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1726e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
17271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1730500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1731500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1732500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1733500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
1734500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlTextWriterHandleStateDependencies(writer, p);
17351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
1738500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
17391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
17401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1741ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent)
1742ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        writer->doindent = 0;
1743ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
17441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
17451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferWriteBinHex(writer->out, len,
17461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   (unsigned char *) data + start);
17471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
17481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
17501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
17521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
17531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
17551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartAttribute:
17561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
17571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
17581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml attribute.
17601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
17641d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name)
17651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
17661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
17671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
17681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
17691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
17701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
17721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
17751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
17761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
17771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
17801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
17811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
17841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
17851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
17861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
17901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
17911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " ");
17921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            count =
17965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                xmlOutputBufferWriteString(writer->out,
17975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                           (const char *) name);
17981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
18001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
18011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "=");
18021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
18031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
18041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
18051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
18061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
18071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
18081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
18091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_ATTRIBUTE;
18101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
18111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
18121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
18131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
18141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
18161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
18171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
18191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartAttributeNS:
18201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
18211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix or NULL
18221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
18231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI or NULL
18241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml attribute with namespace support.
18261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
18281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
18291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
18301d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartAttributeNS(xmlTextWriterPtr writer,
18311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * prefix, const xmlChar * name,
18321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * namespaceURI)
18331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
18341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
18351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
18361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
18371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p;
18381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
18401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
18411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1842b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    /* Handle namespace first in case of error */
1843b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (namespaceURI != 0) {
1844b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlTextWriterNsStackEntry nsentry, *curns;
1845b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1846b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        buf = xmlStrdup(BAD_CAST "xmlns");
1847b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (prefix != 0) {
1848b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            buf = xmlStrcat(buf, BAD_CAST ":");
1849b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            buf = xmlStrcat(buf, prefix);
1850b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1851b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1852b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        nsentry.prefix = buf;
1853b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        nsentry.uri = (xmlChar *)namespaceURI;
1854b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        nsentry.elem = xmlListFront(writer->nodes);
1855b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1856f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        curns = (xmlTextWriterNsStackEntry *)xmlListSearch(writer->nsstack,
1857b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                                                           (void *)&nsentry);
1858b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if ((curns != NULL)) {
1859b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlFree(buf);
1860b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (xmlStrcmp(curns->uri, namespaceURI) == 0) {
1861b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                /* Namespace already defined on element skip */
1862b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                buf = NULL;
1863b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            } else {
1864b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                /* Prefix mismatch so error out */
1865b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1866b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
1867b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1868b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1869b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        /* Do not add namespace decl to list - it is already there */
1870b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (buf != NULL) {
1871b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            p = (xmlTextWriterNsStackEntry *)
1872b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
1873b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (p == 0) {
1874b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1875b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards								        "xmlTextWriterStartAttributeNS : out of memory!\n");
1876b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1877b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
1878b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1879b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            p->prefix = buf;
1880b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            p->uri = xmlStrdup(namespaceURI);
1881b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (p->uri == 0) {
1882b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1883b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        "xmlTextWriterStartAttributeNS : out of memory!\n");
1884b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlFree(p);
1885b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1886b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
1887b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            p->elem = xmlListFront(writer->nodes);
1888b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1889b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlListPushFront(writer->nsstack, p);
1890b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1891b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    }
1892b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
189375e389d4e0ccd998d288387051e66a8f0b2af1b0Daniel Veillard    buf = NULL;
18941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != 0) {
18951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
18961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
18971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
18981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
18991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
19011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartAttribute(writer, buf);
19021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
19031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
19041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
19061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
19081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndAttribute:
19121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element.
19151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19191d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndAttribute(xmlTextWriterPtr writer)
19201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
19221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
19231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
19241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
19251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
19271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
19301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
19311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
19331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
19351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
19361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
19381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
19401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
19411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
19421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_NAME;
19431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
19451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0) {
19461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
19471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
19481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
19491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
19501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
19511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
19521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
19531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
19551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatAttribute:
19591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
19611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
19621d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
19631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.
19651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1968ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
19691d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer,
19701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * name, const char *format,
19711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  ...)
19721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
19741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
19751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
19771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap);
19791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
19811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
19821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatAttribute:
19861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
19881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
19891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
19901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.
19921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19961d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer,
19971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
19981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, va_list argptr)
19991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
20011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
20021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
20041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
2007cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
2008cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
20091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteAttribute(writer, name, buf);
20111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
20131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
20141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteAttribute:
20181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
20201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  attribute content
20211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml attribute.
20231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
20261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20271d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name,
20281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
20291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
20311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
20321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
20341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartAttribute(writer, name);
20351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
20361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
20381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
20391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
20401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
20421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndAttribute(writer);
20431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
20441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
20461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
20481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatAttributeNS:
20521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
20541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
20551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
20561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
20571d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
20581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.with namespace support
20601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2063ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
20641d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer,
20651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * prefix,
20661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
20671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * namespaceURI,
20681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, ...)
20691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
20711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
20721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
20741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatAttributeNS(writer, prefix, name,
20761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                              namespaceURI, format, ap);
20771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
20791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
20801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatAttributeNS:
20841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
20861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
20871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
20881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
20891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
20901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.with namespace support
20921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
20951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20961d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer,
20971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * prefix,
20981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * name,
20991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * namespaceURI,
21001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const char *format, va_list argptr)
21011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
21031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
21041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
21061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
2109cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
2110cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
21111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteAttributeNS(writer, prefix, name, namespaceURI,
21131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                       buf);
21141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
21161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
21171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteAttributeNS:
21211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
21231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
21241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
21251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  attribute content
21261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml attribute.
21281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
21301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
21311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
21321d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer,
21331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * prefix, const xmlChar * name,
21341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * namespaceURI,
21351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * content)
21361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
21381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
21391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
21411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
2144b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    count = xmlTextWriterStartAttributeNS(writer, prefix, name, namespaceURI);
2145b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (count < 0)
2146b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        return -1;
2147b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    sum += count;
2148b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    count = xmlTextWriterWriteString(writer, content);
2149b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (count < 0)
2150b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        return -1;
2151b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    sum += count;
2152b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    count = xmlTextWriterEndAttribute(writer);
21531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
21541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
21561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
21581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatElement:
21621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
21641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
21651d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
21661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element.
21681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
21701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2171ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
21721d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatElement(xmlTextWriterPtr writer,
21731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const xmlChar * name, const char *format,
21741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                ...)
21751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
21771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
21781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
21801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatElement(writer, name, format, ap);
21821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
21841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
21851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatElement:
21891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
21911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
21921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
21931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element.
21951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
21971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
21981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
21991d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer,
22001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 const xmlChar * name, const char *format,
22011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 va_list argptr)
22021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
22041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
22051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
22071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
2210cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
2211cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
22121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteElement(writer, name, buf);
22141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
22161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
22171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteElement:
22211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
22231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  element content
22241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml element.
22261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22301d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name,
22311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                          const xmlChar * content)
22321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
22341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
22351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
22371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartElement(writer, name);
22381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
22391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
22411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
22421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
22431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
22451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndElement(writer);
22461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
22471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
22491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
22511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatElementNS:
22551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
22571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
22581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
22591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
22601d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
22611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element with namespace support.
22631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2266ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
22671d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer,
22681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * prefix,
22691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * name,
22701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * namespaceURI,
22711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const char *format, ...)
22721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
22741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
22751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
22771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatElementNS(writer, prefix, name,
22791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                            namespaceURI, format, ap);
22801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
22821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
22831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatElementNS:
22871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
22891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
22901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
22911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
22921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
22931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element with namespace support.
22951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22991d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer,
23001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * prefix,
23011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
23021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * namespaceURI,
23031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, va_list argptr)
23041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
23051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
23061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
23071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
23091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
2312cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
2313cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
23141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteElementNS(writer, prefix, name, namespaceURI,
23161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     buf);
23171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
23191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
23201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
23211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
23231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteElementNS:
23241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
23251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
23261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
23271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
23281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  element content
23291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml element with namespace support.
23311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
23331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
23341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
23351d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteElementNS(xmlTextWriterPtr writer,
23361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * prefix, const xmlChar * name,
23371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * namespaceURI,
23381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
23391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
23401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
23411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
23421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
23441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
23471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
23481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI);
23491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
23501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
23531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
23541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndElement(writer);
23571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
23581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
23621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
23631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
23651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartPI:
23661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
23671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
23681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml PI.
23701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
23721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
23731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
23741d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target)
23751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
23761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
23771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
23781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
23791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
23801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (target == NULL) || (*target == '\0'))
23821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (xmlStrcasecmp(target, (const xmlChar *) "xml") == 0) {
2385dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
23861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : target name [Xx][Mm][Ll] is reserved for xml standardization!\n");
23871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
23891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
23911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
23921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
23931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
23941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
23951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
23961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
23971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlTextWriterEndAttribute(writer);
23981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
23991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
24001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
24011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    /* fallthrough */
24021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
2403b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    /* Output namespace declarations */
2404b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    count = xmlTextWriterOutputNSDecl(writer);
2405b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    if (count < 0)
2406b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        return -1;
2407b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    sum += count;
24081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
24091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
24101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
24111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
24121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
24131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
2414ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_NONE:
2415ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_TEXT:
2416ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_DTD:
2417ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
24181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
24191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
2420dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
24211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    "xmlTextWriterStartPI : nested PI!\n");
24221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
24231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                default:
24241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
24251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
24261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
24271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
24301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
24311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
2432dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
24331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : out of memory!\n");
24341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(target);
24381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
2439dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
24401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : out of memory!\n");
24411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
24421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_PI;
24451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
24471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<?");
24491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
24501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
24525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count =
24535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferWriteString(writer->out, (const char *) p->name);
24541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
24551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
24571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
24591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
24601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
24621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndPI:
24631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
24641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml PI.
24661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
24681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
24691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
24701d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndPI(xmlTextWriterPtr writer)
24711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
24721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
24731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
24741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
24751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
24761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
24781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
24811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
24821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
24831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
24851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
24861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
24871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
24891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
24901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI:
24911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI_TEXT:
24921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "?>");
24931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
24941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
24951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
24961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
24971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
24981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
24991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
250102c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard    if (writer->indent) {
250202c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
2503f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	if (count < 0)
2504f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	return -1;
250502c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard        sum += count;
250602c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard    }
250702c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard
25081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
25091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
25101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatPI:
25141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
25161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
25171d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
25181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted PI.
25201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2523ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
25241d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target,
25251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const char *format, ...)
25261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
25281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
25291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
25311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatPI(writer, target, format, ap);
25331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
25351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
25361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatPI:
25401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
25421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
25435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
25441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml PI.
25461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
25491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
25501d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer,
25511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * target, const char *format,
25521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            va_list argptr)
25531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
25551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
25561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
25581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
2561cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
2562cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
25631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWritePI(writer, target, buf);
25651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
25671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
25681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWritePI:
25721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
25741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  PI content
25751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml PI.
25771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
25801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
25811d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target,
25821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                     const xmlChar * content)
25831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
25851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
25861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
25881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartPI(writer, target);
25891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
25901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
25921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content != 0) {
25931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, content);
25941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
25951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
25961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
25971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndPI(writer);
25991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
26001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
26021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
26041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
26051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
26071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartCDATA:
26081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
26091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml CDATA section.
26111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
26131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
26141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
26151d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartCDATA(xmlTextWriterPtr writer)
26161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
26171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
26181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
26191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
26201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
26211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
26231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
26261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
26271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
26281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
26291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
26301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
26311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NONE:
2632ccc476f177312548342c0a8cc921445024ebc7d2Daniel Veillard		case XML_TEXTWRITER_TEXT:
26331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
26341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
26351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
26361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
26371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlTextWriterEndAttribute(writer);
26381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
26391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
26401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
26411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    /* fallthrough */
26421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
2643b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    /* Output namespace declarations */
2644b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    count = xmlTextWriterOutputNSDecl(writer);
2645b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    if (count < 0)
2646b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        return -1;
2647b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    sum += count;
26481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
26491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
26501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
26511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
26521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
26531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
26541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_CDATA:
2655dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
26561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    "xmlTextWriterStartCDATA : CDATA not allowed in this context!\n");
26571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
26581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                default:
26591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
26601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
26611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
26621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
26631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
26651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
26661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
2667dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
26681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartCDATA : out of memory!\n");
26691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
26711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
267275e389d4e0ccd998d288387051e66a8f0b2af1b0Daniel Veillard    p->name = NULL;
26731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_CDATA;
26741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
26761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<![CDATA[");
26781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
26791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
26811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
26831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
26841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
26861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndCDATA:
26871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
26881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml CDATA section.
26901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
26921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
26931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
26941d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndCDATA(xmlTextWriterPtr writer)
26951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
26961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
26971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
26981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
26991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
27001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
27021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
27051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
27061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
27091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
27101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
27131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
27141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_CDATA:
27151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "]]>");
27161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
27171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
27181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
27191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
27201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
27211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
27221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
27231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
27251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
27261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatCDATA:
27301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
27321d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
27331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml CDATA.
27351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2738ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
27391d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format,
27401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              ...)
27411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
27431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
27441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
27461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatCDATA(writer, format, ap);
27481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
27501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
27511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatCDATA:
27551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
27575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
27581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml CDATA.
27601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
27631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
27641d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format,
27651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               va_list argptr)
27661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
27681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
27691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
27711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
2774cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
2775cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
27761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteCDATA(writer, buf);
27781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
27801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
27811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteCDATA:
27851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  CDATA content
27871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml CDATA.
27891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
27921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
27931d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content)
27941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
27961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
27971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
27991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartCDATA(writer);
28001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
28011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content != 0) {
28041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, content);
28051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
28061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndCDATA(writer);
28101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
28111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
28151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
28161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
28181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartDTD:
28191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
28201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
28211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
28221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
28231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
28241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml DTD.
28251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
28261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
28271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
28281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
28291d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTD(xmlTextWriterPtr writer,
28301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * name,
28311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * pubid, const xmlChar * sysid)
28321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
28331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
28341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
28351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
28361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
28371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
28391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
28421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
2843ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
2844dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
28451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : DTD allowed only in prolog!\n");
28461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
28501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
28511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
2852dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
28531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : out of memory!\n");
28541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
28581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
2859dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
28601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : out of memory!\n");
28611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
28621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD;
28651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
28671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!DOCTYPE ");
28691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
28701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
28731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
28741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
28781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (sysid == 0) {
2879dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
28801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartDTD : system identifier needed!\n");
28811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
28831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2884500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (writer->indent)
2885500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, "\n");
2886500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        else
2887500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, " ");
2888500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
2889500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
2890500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
2891500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
2892500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "PUBLIC ");
2893500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
2894500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
2895500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
2896500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
2897500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
28981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
28991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
29001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
29011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
29035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
29041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
29051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
29061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
29071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2908500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
29091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
29101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
29111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
29121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
29131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
29151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
2916500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (writer->indent)
2917500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWrite(writer->out, 1, "\n");
2918500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            else
2919500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWrite(writer->out, 1, " ");
2920500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
2921500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
2922500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
2923500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "SYSTEM ");
2924500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
2925500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
2926500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
2927ffe47feb2725849a6eb47299af87548fa0f52d4fRob Richards        } else {
2928ffe47feb2725849a6eb47299af87548fa0f52d4fRob Richards			if (writer->indent)
2929500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "\n       ");
2930ffe47feb2725849a6eb47299af87548fa0f52d4fRob Richards            else
2931ffe47feb2725849a6eb47299af87548fa0f52d4fRob Richards                count = xmlOutputBufferWrite(writer->out, 1, " ");
29321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
29331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
29341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
29351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
29361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2937500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
29381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
29391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
29401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
29411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
29435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
29441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
29451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
29461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
29471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2948500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
29491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
29501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
29511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
29521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
29531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
29551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
29561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
29581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndDTD:
29591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
29601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
29611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml DTD.
29621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
29631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
29641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
29651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
29661d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndDTD(xmlTextWriterPtr writer)
29671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
2968500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int loop;
29691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
29701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
29711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
29721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
29731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
29751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
29761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
2978500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    loop = 1;
2979500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    while (loop) {
2980500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        lk = xmlListFront(writer->nodes);
2981500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (lk == NULL)
2982500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
2983500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
2984500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p == 0)
2985500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
2986500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
2987500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
2988500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, "]");
2989500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
2990500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
2991500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
2992500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
2993500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
2994500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, ">");
29951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2996500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
2997500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
2998500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
2999500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3000500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
3001500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
30021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3003500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                xmlListPopFront(writer->nodes);
3004500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3005500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM:
3006500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM_TEXT:
3007500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndDTDElement(writer);
3008500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3009500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL:
3010500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL_TEXT:
3011500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndDTDAttlist(writer);
3012500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3013500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY:
3014500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_PENT:
3015500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY_TEXT:
3016500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndDTDEntity(writer);
3017500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3018500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_COMMENT:
3019500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndComment(writer);
3020500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3021500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
3022500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                loop = 0;
3023500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                continue;
3024500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
3025500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3026500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
30271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
3028500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
30291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
30321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
30331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
30351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatDTD:
30361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
30371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
30381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
30391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
30401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
30411d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
30421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD with a formatted markup declarations part.
30441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
30461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
3047ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
30481d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer,
30491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * name,
30501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * pubid,
30511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * sysid, const char *format, ...)
30521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
30531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
30541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
30551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
30571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTD(writer, name, pubid, sysid, format,
30591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      ap);
30601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
30621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
30631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
30641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
30661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatDTD:
30671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
30681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
30691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
30701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
30711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
30725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
30731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD with a formatted markup declarations part.
30751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
30771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
30781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
30791d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer,
30801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name,
30811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * pubid,
30821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * sysid,
30831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const char *format, va_list argptr)
30841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
30851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
30861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
30871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
30891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
3092cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
3093cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
30941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTD(writer, name, pubid, sysid, buf);
30961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
30981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
30991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
31001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
31021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteDTD:
31031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
31041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
31051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
31061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
3107b1d531659b2bee47492ca1c319180116eaaf566eWilliam M. Brack * @subset:  string content of the DTD
31081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
31091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD.
31101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
31111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
31121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
31131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
31141d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTD(xmlTextWriterPtr writer,
31151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * name,
31161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * pubid,
31171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * sysid, const xmlChar * subset)
31181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
31191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
31201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
31211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
31231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTD(writer, name, pubid, sysid);
31241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
31251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (subset != 0) {
31281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, subset);
31291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
31301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
31311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
31321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTD(writer);
31341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
31351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
31391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
31401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
31425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDElement:
31435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
31445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
31455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD element.
31475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
31495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
31501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
31511d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name)
31521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
31531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
31541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
31551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
31561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
31571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
31591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
31621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
31631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
31641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3168500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
3169500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
3170500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
3171500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, " [");
3172500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
3173500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
3174500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
3175500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
3176500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
3177500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
3178500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
3179500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3180500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
3181500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
3182500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
3183500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
3184500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_NONE:
3185500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3186500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
31871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
3188500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
31891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
31921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
31931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
3194dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
31951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
31961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
32001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
3201dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
32021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
32031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
32041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
32061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD_ELEM;
32071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
32091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3210500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3211500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
3212500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3213500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3214500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3215500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3216500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
32171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ELEMENT ");
32181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
32191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
32211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
32221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
32231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
32251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
32271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
32281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3230500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterEndDTDElement:
3231500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3232500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3233500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * End an xml DTD element.
3234500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3235500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3236500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3237500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3238500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterEndDTDElement(xmlTextWriterPtr writer)
3239500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3240500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3241500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3242500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3243500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3244500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3245500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
3246500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3247500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3248500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3249500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3250500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0)
3251500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3252500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3253500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3254500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3255500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3256500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3257500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3258500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM:
3259500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM_TEXT:
3260500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
3261500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3262500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3263500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3264500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3265500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3266500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3267500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3268500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3269500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3270500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
3271500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3272500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3273500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3274500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3275500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3276500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlListPopFront(writer->nodes);
3277500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3278500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3279500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3280500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
32815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDElement:
32825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
32835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
32845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
32851d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
32865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD element.
32885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
32905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3291ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
32921d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer,
32931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
32941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, ...)
32951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
32961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
32971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
32981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
33001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDElement(writer, name, format, ap);
33021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
33041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
33051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
33061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
33085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDElement:
33095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
33105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
33115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
33125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
33135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD element.
33155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
33175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
33181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
33191d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer,
33201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
33211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, va_list argptr)
33221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
33231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
33241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
33251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
33271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
3330cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
3331cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
33321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDElement(writer, name, buf);
33341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
33361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
33371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
33381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
33405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDElement:
33415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
33425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
33435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the element
33445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD element.
33465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
33485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
33491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
33501d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDElement(xmlTextWriterPtr writer,
33511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name, const xmlChar * content)
33521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
33531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
33541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
33551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content == NULL)
33571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
33601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDElement(writer, name);
33611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
33621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
33641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
33661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
33671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
33691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDElement(writer);
33711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
33721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
33741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
33761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
33771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
33795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDAttlist:
33805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
33815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
33825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD ATTLIST.
33845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
33865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
33871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
33881d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name)
33891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
33901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
33911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
33921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
33931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
33941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
33961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
33991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
34001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
34011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
34031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3405500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
3406500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
3407500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
3408500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, " [");
3409500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
3410500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
3411500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
3412500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
3413500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
3414500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
3415500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
3416500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3417500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
3418500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
3419500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
3420500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
3421500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_NONE:
3422500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3423500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
34241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
3425500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
34261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
34271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
34291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
34301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
3431dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
34321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDAttlist : out of memory!\n");
34331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
34351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
34371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
3438dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
34391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDAttlist : out of memory!\n");
34401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
34411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
34431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD_ATTL;
34441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
34461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3447500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3448500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
3449500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3450500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3451500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3452500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3453500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
34541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ATTLIST ");
34551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
34561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
3458ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
34591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
34601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
34641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
34651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3467500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterEndDTDAttlist:
3468500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3469500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3470500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * End an xml DTD attribute list.
3471500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3472500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3473500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3474500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3475500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer)
3476500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3477500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3478500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3479500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3480500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3481500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3482500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
3483500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3484500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3485500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3486500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3487500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0)
3488500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3489500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3490500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3491500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3492500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3493500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3494500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3495500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL:
3496500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL_TEXT:
3497500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
3498500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3499500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3500500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3501500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3502500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3503500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3504500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3505500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3506500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3507500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
3508500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3509500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3510500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3511500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3512500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3513500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlListPopFront(writer->nodes);
3514500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3515500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3516500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3517500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
35185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDAttlist:
35195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
35205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
35215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
35221d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
35235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD ATTLIST.
35255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
35275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3528ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
35291d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer,
35301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
35311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, ...)
35321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
35331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
35341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
35351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
35371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDAttlist(writer, name, format, ap);
35391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
35411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
35421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
35431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
35455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDAttlist:
35465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
35475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
35485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
35495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
35505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD ATTLIST.
35525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
35545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
35551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
35561d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer,
35571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
35581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, va_list argptr)
35591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
35601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
35611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
35621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
35641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
3567cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
3568cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
35691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDAttlist(writer, name, buf);
35711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
35731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
35741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
35751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
35775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDAttlist:
35785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
35795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
35805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the ATTLIST
35815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD ATTLIST.
35835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
35855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
35861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
35871d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer,
35881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name, const xmlChar * content)
35891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
35901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
35911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
35921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content == NULL)
35941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
35971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDAttlist(writer, name);
35981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
35991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
36011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
36031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
36041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
36061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDAttlist(writer);
36081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
36091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
36111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
36131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
36141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
36165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDEntity:
36175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
36185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
36195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
36205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
36215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD ATTLIST.
36225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
36235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
36245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
36251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
36261d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDEntity(xmlTextWriterPtr writer,
36271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            int pe, const xmlChar * name)
36281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
36291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
36301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
36311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
36321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
36331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
36351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
36381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
3639500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
36401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3641500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3642500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
3643500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            switch (p->state) {
3644500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_DTD:
3645500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, " [");
3646500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
3647500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
3648500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3649500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (writer->indent) {
3650500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        count =
3651500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            xmlOutputBufferWriteString(writer->out, "\n");
3652500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        if (count < 0)
3653500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            return -1;
3654500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        sum += count;
3655500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    }
3656500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    p->state = XML_TEXTWRITER_DTD_TEXT;
3657500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    /* fallthrough */
3658500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_DTD_TEXT:
3659500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_NONE:
3660500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    break;
3661500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                default:
3662500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
3663500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            }
3664500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
36651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
36661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
36681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
36691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
3670dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
36711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
36721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
36741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
36761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
3677dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
36781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
36791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
36801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
3682500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3683500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (pe != 0)
3684500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p->state = XML_TEXTWRITER_DTD_PENT;
3685500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    else
3686500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p->state = XML_TEXTWRITER_DTD_ENTY;
36871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
36891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3690500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3691500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
3692500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3693500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3694500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3695500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3696500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
36971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ENTITY ");
36981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
36991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
37001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
37011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pe != 0) {
3703500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "% ");
37041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
37051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
37061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
37071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
37081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3709ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
37101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
37111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
37121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
37131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
37151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
37161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3718500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterEndDTDEntity:
3719500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3720500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3721500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * End an xml DTD entity.
3722500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3723500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3724500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3725500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3726500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterEndDTDEntity(xmlTextWriterPtr writer)
3727500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3728500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3729500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3730500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3731500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3732500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3733500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
3734500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3735500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3736500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3737500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3738500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0)
3739500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3740500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3741500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3742500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3743500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3744500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3745500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3746500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY_TEXT:
3747500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
3748500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3749500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3750500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3751500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY:
3752500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_PENT:
3753500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
3754500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3755500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3756500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3757500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3758500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3759500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3760500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3761500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3762500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3763500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
3764500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3765500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3766500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3767500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3768500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3769500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlListPopFront(writer->nodes);
3770500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3771500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3772500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3773500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
37745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDInternalEntity:
37755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
37765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
37775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
37785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
37791d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
37805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD internal entity.
37825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
37845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3785ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
37861d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer,
37871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          int pe,
37881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          const xmlChar * name,
37891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          const char *format, ...)
37901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
37911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
37921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
37931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
37951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDInternalEntity(writer, pe, name,
37971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                    format, ap);
37981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
38001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
38011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
38045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDInternalEntity:
38055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
38065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
38075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
38085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
38095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
38105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD internal entity.
38125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
38145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
38151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
38161d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer,
38171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           int pe,
38181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           const xmlChar * name,
38191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           const char *format,
38201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           va_list argptr)
38211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
38221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
38231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
38241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
38261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
3829cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard    if (buf == NULL)
3830cb0ae19174e7b26f9dbc1633e8aca3280db45a32Daniel Veillard        return -1;
38311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDInternalEntity(writer, pe, name, buf);
38331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
38351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
38361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
38395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDEntity:
38405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
38415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
38425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
38435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
38445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
38455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ndataid:  the xml notation name.
38465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the entity
38475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD entity.
38495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
38515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
38521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
38531d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer,
38541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            int pe,
38551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * name,
38561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * pubid,
38571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * sysid,
38581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * ndataid,
38591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
38601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
3861500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if ((content == NULL) && (pubid == NULL) && (sysid == NULL))
38621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((pe != 0) && (ndataid != NULL))
38641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3866500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if ((pubid == NULL) && (sysid == NULL))
38671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return xmlTextWriterWriteDTDInternalEntity(writer, pe, name,
38681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                   content);
38691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlTextWriterWriteDTDExternalEntity(writer, pe, name, pubid,
38711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                               sysid, ndataid);
38721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
38755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDInternalEntity:
38765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
38775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
38785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
38795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the entity
38805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD internal entity.
38825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
38845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
38851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
38861d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer,
38871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    int pe,
38881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
38891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * content)
38901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
38911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
38921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
38931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((name == NULL) || (*name == '\0') || (content == NULL))
38951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
38981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDEntity(writer, pe, name);
38991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
39001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
39011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
39021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
39041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
39051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
39061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
39071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDEntity(writer);
39091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
39101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
39111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
39121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
39141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
39151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
39175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDExternalEntity:
39185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
39195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
39205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
39215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
39225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
39235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ndataid:  the xml notation name.
39245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3925500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity
39265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
39275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
39285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
39291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
39301d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer,
39311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    int pe,
39321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
39331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * pubid,
39341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * sysid,
39351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * ndataid)
39361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
39371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
39381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
39391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3940500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (((pubid == NULL) && (sysid == NULL)))
39411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
39421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((pe != 0) && (ndataid != NULL))
39431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
39441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
39461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDEntity(writer, pe, name);
39471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
39481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
39491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
39501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3951500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    count =
3952500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlTextWriterWriteDTDExternalEntityContents(writer, pubid, sysid,
3953500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                                    ndataid);
3954500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (count < 0)
3955500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3956500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum += count;
3957500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3958500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    count = xmlTextWriterEndDTDEntity(writer);
3959500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (count == -1)
3960500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3961500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum += count;
3962500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3963500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3964500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3965500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3966500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
3967500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterWriteDTDExternalEntityContents:
3968500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3969500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
3970500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
3971500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @ndataid:  the xml notation name.
3972500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3973500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Write the contents of a DTD external entity.
3974500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3975500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3976500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3977500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3978500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer,
3979500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                            const xmlChar * pubid,
3980500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                            const xmlChar * sysid,
3981500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                            const xmlChar * ndataid)
3982500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3983500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3984500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3985500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3986500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3987500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3988500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
3989dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3990500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteDTDExternalEntityContents: xmlTextWriterPtr invalid!\n");
3991500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3992500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3993500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3994500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3995500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3996500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0) {
3997dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3998500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
3999500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
4000500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4001500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4002500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
4003500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
4004500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
4005500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4006500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
4007500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY:
4008500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
4009500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_PENT:
4010500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (ndataid != NULL) {
4011dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
4012500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                "xmlTextWriterWriteDTDExternalEntityContents: notation not allowed with parameter entities!\n");
4013500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
4014500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            }
4015500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
4016500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
4017dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
4018500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
4019500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
4020500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4021500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
40221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
40231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (sysid == 0) {
4024dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
4025500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            "xmlTextWriterWriteDTDExternalEntityContents: system identifier needed!\n");
40261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
40281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
40301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
40405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
40411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
40501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
40521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
40531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
40541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
40551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
40561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
40571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
40581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " ");
40601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
40705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
40711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
40801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ndataid != NULL) {
40821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " NDATA ");
40831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
40885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out,
40895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                       (const char *) ndataid);
40901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
40941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
40961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
40971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
40995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDNotation:
41005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
41015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the xml notation
41025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
41035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
41045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
41055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD entity.
41065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
41075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
41085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
41091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
41101d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer,
41111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * name,
41121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * pubid, const xmlChar * sysid)
41131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
41141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
41151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
41161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
41171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
41181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
41201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
41231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
41241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
41251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
41271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
4129500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
4130500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
4131500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
4132500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, " [");
4133500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
4134500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
4135500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
4136500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
4137500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
4138500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
4139500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
4140500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
4141500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
4142500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
4143500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
4144500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
4145500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4146500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
41471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
4148500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
4149500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4150500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4151500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
4152500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
4153500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
41541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4155500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
41561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
41571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!NOTATION ");
41591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
41601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
41621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
41631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
41641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
41661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
41681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
41691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
41731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
41775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
41781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
41821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
41861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
41881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
41891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
41901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
41911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
41921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
41931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
41941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " ");
41951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
41991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
42001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
42011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
42025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
42035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
42041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
42051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
42061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
42071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
42081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
42091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
42101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
42111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
42121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, ">");
42141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
42151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
42161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
42171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
42191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterFlush:
42231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
42241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Flush the output buffer.
42261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
42281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
42301d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterFlush(xmlTextWriterPtr writer)
42311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
42331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
42351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
42361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out == NULL)
42381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = 0;
42391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    else
42401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferFlush(writer->out);
42411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return count;
42431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * misc
42471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriterStackEntry:
42511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @lk:  the xmlLinkPtr
42521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Free callback for the xmlList.
42541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void
42561d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriterStackEntry(xmlLinkPtr lk)
42571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
42591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
42611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
42621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
42631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name != 0)
42651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->name);
42661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(p);
42671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlCmpTextWriterStackEntry:
42711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data0:  the first data
42721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data1:  the second data
42731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Compare callback for the xmlList.
42751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
42771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
42791d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlCmpTextWriterStackEntry(const void *data0, const void *data1)
42801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p0;
42821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p1;
42831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == data1)
42851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
42861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == 0)
42881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
42891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data1 == 0)
42911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 1;
42921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p0 = (xmlTextWriterStackEntry *) data0;
42941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p1 = (xmlTextWriterStackEntry *) data1;
42951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlStrcmp(p0->name, p1->name);
42971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
43001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * misc
43011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
43021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
4304b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards * xmlTextWriterOutputNSDecl:
4305b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards * @writer:  the xmlTextWriterPtr
4306b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards *
4307b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards * Output the current namespace declarations.
4308b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards */
4309b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richardsstatic int
4310b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob RichardsxmlTextWriterOutputNSDecl(xmlTextWriterPtr writer)
4311b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards{
4312b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    xmlLinkPtr lk;
4313b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    xmlTextWriterNsStackEntry *np;
4314b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    int count;
4315b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    int sum;
4316b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4317b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    sum = 0;
4318b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    while (!xmlListEmpty(writer->nsstack)) {
4319b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlChar *namespaceURI = NULL;
4320b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlChar *prefix = NULL;
4321b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4322b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        lk = xmlListFront(writer->nsstack);
4323b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
4324b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4325b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (np != 0) {
4326b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            namespaceURI = xmlStrdup(np->uri);
4327b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            prefix = xmlStrdup(np->prefix);
4328b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
4329b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4330b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlListPopFront(writer->nsstack);
4331b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4332b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (np != 0) {
4333b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            count = xmlTextWriterWriteAttribute(writer, prefix, namespaceURI);
4334b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlFree(namespaceURI);
4335b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlFree(prefix);
4336b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4337b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (count < 0) {
4338b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlListDelete(writer->nsstack);
4339b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                writer->nsstack = NULL;
4340b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
4341b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
4342b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            sum += count;
4343b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
4344b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    }
4345b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    return sum;
4346b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards}
4347b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4348b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards/**
43491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriterNsStackEntry:
43501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @lk:  the xmlLinkPtr
43511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
43521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Free callback for the xmlList.
43531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
43541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void
43551d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriterNsStackEntry(xmlLinkPtr lk)
43561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
43571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p;
43581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
43601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
43611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
43621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->prefix != 0)
43641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->prefix);
43651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->uri != 0)
43661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->uri);
43671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(p);
43691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
43701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
43721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlCmpTextWriterNsStackEntry:
43731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data0:  the first data
43741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data1:  the second data
43751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
43761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Compare callback for the xmlList.
43771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
43781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
43791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
43801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
43811d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlCmpTextWriterNsStackEntry(const void *data0, const void *data1)
43821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
43831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p0;
43841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p1;
43851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
43861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == data1)
43881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
43891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == 0)
43911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
43921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data1 == 0)
43941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 1;
43951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p0 = (xmlTextWriterNsStackEntry *) data0;
43971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p1 = (xmlTextWriterNsStackEntry *) data1;
43981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlStrcmp(p0->prefix, p1->prefix);
44001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4401b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if ((rc != 0) || (p0->elem != p1->elem))
4402b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        rc = -1;
44031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
44041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
44051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
44061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
44071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
44085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDocCallback:
44095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @context:  the xmlBufferPtr
44105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @str:  the data to write
44115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @len:  the length of the data
44125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
44135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write callback for the xmlOutputBuffer with target xmlBuffer
44145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
44155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns -1, 0, 1
44165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
44175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int
44185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterWriteDocCallback(void *context, const xmlChar * str, int len)
44195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
44205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
44215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    int rc;
44225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44231d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard    if ((rc = xmlParseChunk(ctxt, (const char *) str, len, 0)) != 0) {
4424dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
44255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlTextWriterWriteDocCallback : XML error %d !\n",
44265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        rc);
44275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
44285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
44295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return len;
44315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
44325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
44345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterCloseDocCallback:
44355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @context:  the xmlBufferPtr
44365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
44375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Close callback for the xmlOutputBuffer with target xmlBuffer
44385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
44395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns -1, 0, 1
44405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
44415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int
44425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterCloseDocCallback(void *context)
44435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
44445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
44455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    int rc;
44465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if ((rc = xmlParseChunk(ctxt, NULL, 0, 1)) != 0) {
4448dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
44495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlTextWriterWriteDocCallback : XML error %d !\n",
44505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        rc);
44515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
44525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
44535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return 0;
44555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
44565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
44581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterVSprintf:
44591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  see printf
44601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
44611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
44621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Utility function for formatted output
44631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
44641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns a new xmlChar buffer with the data or NULL on error. This buffer must be freed.
44651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
44661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic xmlChar *
44671d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterVSprintf(const char *format, va_list argptr)
44681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
44691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int size;
44701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
44711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
4472f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    va_list locarg;
44731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
44741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    size = BUFSIZ;
44751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = (xmlChar *) xmlMalloc(size);
44761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == NULL) {
4477dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
44781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterVSprintf : out of memory!\n");
44791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
44801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
44811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4482f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    VA_COPY(locarg, argptr);
4483f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    while (((count = vsnprintf((char *) buf, size, format, locarg)) < 0)
44841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard           || (count == size - 1) || (count == size) || (count > size)) {
4485f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack	va_end(locarg);
44861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(buf);
44871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        size += BUFSIZ;
44881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = (xmlChar *) xmlMalloc(size);
44891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (buf == NULL) {
4490dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
44911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterVSprintf : out of memory!\n");
44921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return NULL;
44931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
4494f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack	VA_COPY(locarg, argptr);
44951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
4496f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    va_end(locarg);
44971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
44981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return buf;
44991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
45001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
45015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
45025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDocumentCallback:
45035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ctx: the user data (XML parser context)
45045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
45055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * called at the start of document processing.
45065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
45075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic void
45085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterStartDocumentCallback(void *ctx)
45095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
45105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
45115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlDocPtr doc;
45125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
45135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt->html) {
45145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#ifdef LIBXML_HTML_ENABLED
45155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc == NULL)
45165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
45175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc == NULL) {
45185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
45195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                ctxt->sax->error(ctxt->userData,
45205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                 "SAX.startDocument(): out of memory\n");
45215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->errNo = XML_ERR_NO_MEMORY;
45225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->instate = XML_PARSER_EOF;
45235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->disableSAX = 1;
45245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            return;
45255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        }
45265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#else
4527d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
45285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "libxml2 built without HTML support\n");
45295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->errNo = XML_ERR_INTERNAL_ERROR;
45305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->instate = XML_PARSER_EOF;
45315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->disableSAX = 1;
45325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return;
45335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#endif
45345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    } else {
45355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        doc = ctxt->myDoc;
45365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (doc == NULL)
45375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            doc = ctxt->myDoc = xmlNewDoc(ctxt->version);
45385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (doc != NULL) {
45395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if (doc->children == NULL) {
45405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                if (ctxt->encoding != NULL)
45415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                    doc->encoding = xmlStrdup(ctxt->encoding);
45425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                else
45435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                    doc->encoding = NULL;
45445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                doc->standalone = ctxt->standalone;
45455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            }
45465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        } else {
45475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
45485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                ctxt->sax->error(ctxt->userData,
45495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                 "SAX.startDocument(): out of memory\n");
45505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->errNo = XML_ERR_NO_MEMORY;
45515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->instate = XML_PARSER_EOF;
45525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->disableSAX = 1;
45535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            return;
45545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        }
45555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
45565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) &&
45575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        (ctxt->input != NULL) && (ctxt->input->filename != NULL)) {
45585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->myDoc->URL =
45595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlCanonicPath((const xmlChar *) ctxt->input->filename);
45605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc->URL == NULL)
45615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->myDoc->URL =
45625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                xmlStrdup((const xmlChar *) ctxt->input->filename);
45635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
45645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
45655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
45662cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
45672cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterSetIndent:
45682cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
45692cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @indent:  do indentation?
45702cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
45712cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Set indentation output. indent = 0 do not indentation. indent > 0 do indentation.
45722cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
45732cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or 0 otherwise.
45742cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard */
45752cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardint
4576ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent)
45772cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard{
4578e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (indent < 0))
4579ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
45802cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4581ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    writer->indent = indent;
4582ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    writer->doindent = 1;
45832cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4584ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return 0;
45852cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
45862cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
45872cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
45882cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterSetIndentString:
45892cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
45902cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @str:  the xmlChar string
45912cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
45922cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Set string indentation.
45932cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
45942cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or 0 otherwise.
45952cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard */
45962cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardint
4597ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str)
45982cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard{
4599e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (!str))
4600ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
46012cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4602ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->ichar != NULL)
4603ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        xmlFree(writer->ichar);
4604ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    writer->ichar = xmlStrdup(str);
4605ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
4606ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (!writer->ichar)
4607ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
4608ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    else
4609ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return 0;
46102cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
46112cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
46122cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
4613429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly * xmlTextWriterSetQuoteChar:
4614429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly * @writer:  the xmlTextWriterPtr
4615429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly * @quotechar:  the quote character
4616429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly *
4617429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly * Set the character used for quoting attributes.
4618429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly *
4619429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly * Returns -1 on error or 0 otherwise.
4620429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly */
4621429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Radulyint
4622429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba RadulyxmlTextWriterSetQuoteChar(xmlTextWriterPtr writer, xmlChar quotechar)
4623429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly{
4624429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly    if ((writer == NULL) || ((quotechar != '\'') && (quotechar != '"')))
4625429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly        return -1;
4626429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly
4627429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly    writer->qchar = quotechar;
4628429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly
4629429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly    return 0;
4630429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly}
4631429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly
4632429d3a0aae2eda7ba9451f9c9f8523c61cc0368bCsaba Raduly/**
46332cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterWriteIndent:
46342cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
46352cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
46362cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Write indent string.
46372cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
46382cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or the number of strings written.
4639ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard */
46402cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardstatic int
4641ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterWriteIndent(xmlTextWriterPtr writer)
4642ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard{
4643ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int lksize;
4644ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int i;
4645ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int ret;
4646ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
4647ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    lksize = xmlListSize(writer->nodes);
4648ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (lksize < 1)
4649ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return (-1);            /* list is empty */
4650ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    for (i = 0; i < (lksize - 1); i++) {
4651ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        ret = xmlOutputBufferWriteString(writer->out,
4652ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                         (const char *) writer->ichar);
4653ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (ret == -1)
4654ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return (-1);
4655ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
4656ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
4657ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return (lksize - 1);
46582cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
46592cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4660500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
4661500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterHandleStateDependencies:
4662500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
4663500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @p:  the xmlTextWriterStackEntry
4664500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
4665500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Write state dependent strings.
4666500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
4667500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns -1 on error or the number of characters written.
4668500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
4669500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardstatic int
4670500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
4671500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                     xmlTextWriterStackEntry * p)
4672500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
4673500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
4674500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
4675500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    char extra[3];
4676500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4677500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
4678500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
4679500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4680500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == NULL)
4681500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return 0;
4682500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4683500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
4684500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    extra[0] = extra[1] = extra[2] = '\0';
4685500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
4686500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum = 0;
4687500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
4688500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_NAME:
4689b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                /* Output namespace declarations */
4690b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                count = xmlTextWriterOutputNSDecl(writer);
4691b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                if (count < 0)
4692b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    return -1;
4693b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                sum += count;
4694500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = '>';
4695500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_TEXT;
4696500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4697500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_PI:
4698500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4699500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_PI_TEXT;
4700500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4701500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
4702500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4703500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[1] = '[';
4704500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
4705500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4706500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM:
4707500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4708500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_ELEM_TEXT;
4709500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4710500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL:
4711500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4712500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_ATTL_TEXT;
4713500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4714500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY:
4715500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_PENT:
4716500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4717500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[1] = writer->qchar;
4718500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_ENTY_TEXT;
4719500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4720500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
4721500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4722500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
4723500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4724500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4725500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (*extra != '\0') {
4726500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, extra);
4727500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
4728500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
4729500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
4730500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4731500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4732500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
4733500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
4734500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
47355d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlwriter
47365d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
47371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#endif
4738