xmlwriter.c revision 3ff24115d2d95342ae1adc387560907d63f99ec7
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
241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#define B64LINELEN 72
251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#define B64CRLF "\r\n"
261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/*
28f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * The following VA_COPY was coded following an example in
29f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * the Samba project.  It may not be sufficient for some
30f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * esoteric implementations of va_list (i.e. it may need
31f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * something involving a memcpy) but (hopefully) will be
32f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack * sufficient for libxml2.
33f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack */
34f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack#ifndef VA_COPY
35f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack  #ifdef HAVE_VA_COPY
36f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    #define VA_COPY(dest, src) va_copy(dest, src)
37f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack  #else
38f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    #ifdef HAVE___VA_COPY
39f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack      #define VA_COPY(dest,src) __va_copy(dest, src)
40f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    #else
41f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack      #define VA_COPY(dest,src) (dest) = (src)
42f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    #endif
43f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack  #endif
44f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack#endif
45f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack
46f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack/*
471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Types are kept private
481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef enum {
501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_NONE = 0,
511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_NAME,
521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_ATTRIBUTE,
531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_TEXT,
541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_PI,
551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_PI_TEXT,
561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_CDATA,
571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD,
581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_TEXT,
591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_ELEM,
60500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ELEM_TEXT,
611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_ATTL,
62500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ATTL_TEXT,
63500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ENTY,    /* entity */
64500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ENTY_TEXT,
65500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_PENT,    /* parameter entity */
6687640d5f14e7ce8b9844b886c765af0c56de5ca5William M. Brack    XML_TEXTWRITER_COMMENT
671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard} xmlTextWriterState;
681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef struct _xmlTextWriterStackEntry xmlTextWriterStackEntry;
701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriterStackEntry {
721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *name;
731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterState state;
741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef struct _xmlTextWriterNsStackEntry xmlTextWriterNsStackEntry;
771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriterNsStackEntry {
781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *prefix;
791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *uri;
801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr elem;
811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriter {
84ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlOutputBufferPtr out;     /* output buffer */
85ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPtr nodes;           /* element name stack */
86ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPtr nsstack;         /* name spaces stack */
871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int level;
88ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int indent;                 /* enable indent */
89ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int doindent;               /* internal indent flag */
90ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlChar *ichar;             /* indent character */
91ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    char qchar;                 /* character used for quoting attribute values */
9220c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard    xmlParserCtxtPtr ctxt;
93a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    int no_doc_free;
949db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards    xmlDocPtr doc;
951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void xmlFreeTextWriterStackEntry(xmlLinkPtr lk);
981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlCmpTextWriterStackEntry(const void *data0,
991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      const void *data1);
100b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richardsstatic int xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer);
1011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk);
1021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlCmpTextWriterNsStackEntry(const void *data0,
1031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                        const void *data1);
1045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int xmlTextWriterWriteDocCallback(void *context,
1055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                         const xmlChar * str, int len);
1065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int xmlTextWriterCloseDocCallback(void *context);
1075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
1081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic xmlChar *xmlTextWriterVSprintf(const char *format, va_list argptr);
1091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
1101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      const unsigned char *data);
1115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic void xmlTextWriterStartDocumentCallback(void *ctx);
112ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillardstatic int xmlTextWriterWriteIndent(xmlTextWriterPtr writer);
113500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardstatic int
114500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard  xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
115500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                       xmlTextWriterStackEntry * p);
1161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
118dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * xmlWriterErrMsg:
119dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @ctxt:  a writer context
120dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @error:  the error number
121dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @msg:  the error message
122dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard *
123dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * Handle a writer error
124dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard */
125dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillardstatic void
126dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel VeillardxmlWriterErrMsg(xmlTextWriterPtr ctxt, xmlParserErrors error,
127dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard               const char *msg)
128dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard{
129dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    if (ctxt != NULL) {
130dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
131dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	            NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
132dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard		    NULL, 0, NULL, NULL, NULL, 0, 0, msg);
133dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    } else {
134dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
135dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, msg);
136dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    }
137dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard}
138dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard
139dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard/**
140dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * xmlWriterErrMsgInt:
141dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @ctxt:  a writer context
142dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @error:  the error number
143dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @msg:  the error message
144dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @val:  an int
145dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard *
146dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * Handle a writer error
147dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard */
148dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillardstatic void
149dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel VeillardxmlWriterErrMsgInt(xmlTextWriterPtr ctxt, xmlParserErrors error,
150dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard               const char *msg, int val)
151dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard{
152dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    if (ctxt != NULL) {
153dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
154dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	            NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
155dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard		    NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
156dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    } else {
157dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
158dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
159dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    }
160dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard}
161dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard
162dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard/**
1631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriter:
1641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out:  an xmlOutputBufferPtr
1651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr
167d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard * NOTE: the @out parameter will be deallocated when the writer is closed
168d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard *       (if the call succeed.)
1691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
1711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1721d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
1731d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriter(xmlOutputBufferPtr out)
1741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
1761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = (xmlTextWriterPtr) xmlMalloc(sizeof(xmlTextWriter));
1781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
179dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
1801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
1811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    memset(ret, 0, (size_t) sizeof(xmlTextWriter));
1841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->nodes = xmlListCreate((xmlListDeallocator)
1861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               xmlFreeTextWriterStackEntry,
1871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               (xmlListDataCompare)
1881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               xmlCmpTextWriterStackEntry);
1891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret->nodes == NULL) {
190dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
1911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
1921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(ret);
1931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->nsstack = xmlListCreate((xmlListDeallocator)
1971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 xmlFreeTextWriterNsStackEntry,
1981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 (xmlListDataCompare)
1991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 xmlCmpTextWriterNsStackEntry);
2001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret->nsstack == NULL) {
201dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
203500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlListDelete(ret->nodes);
2041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(ret);
2051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->out = out;
209ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    ret->ichar = xmlStrdup(BAD_CAST " ");
2101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->qchar = '"';
2111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
212500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (!ret->ichar) {
213500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlListDelete(ret->nodes);
214500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlListDelete(ret->nsstack);
215500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlFree(ret);
216dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
217500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
218ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return NULL;
219500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
2209db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards
2219db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards    ret->doc = xmlNewDoc(NULL);
2229db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards
223a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    ret->no_doc_free = 0;
224ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
2251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
2261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
2271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
2291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriterFilename:
2301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @uri:  the URI of the resource for the output
2311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @compression:  compress the output?
2321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure with @uri as output
2341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
2361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2371d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
2381d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriterFilename(const char *uri, int compression)
2391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
2401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
2411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlOutputBufferPtr out;
2421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    out = xmlOutputBufferCreateFilename(uri, NULL, compression);
2441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (out == NULL) {
245dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterFilename : out of memory!\n");
2471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = xmlNewTextWriter(out);
2511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
252dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterFilename : out of memory!\n");
2541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(out);
2551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2582cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    ret->indent = 0;
2592cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    ret->doindent = 0;
2601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
2611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
2621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
2641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriterMemory:
2651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @buf:  xmlBufferPtr
2661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @compression:  compress the output?
2671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure with @buf as output
2691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * TODO: handle compression
2701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
2721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2731d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
2741d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriterMemory(xmlBufferPtr buf, int compression ATTRIBUTE_UNUSED)
2751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
2761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
2771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlOutputBufferPtr out;
2781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/*::todo handle compression */
280a44f234d3a0c94879136c5fa4b24f386148716adRob Richards    out = xmlOutputBufferCreateBuffer(buf, NULL);
281a44f234d3a0c94879136c5fa4b24f386148716adRob Richards
2821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (out == NULL) {
283dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterMemory : out of memory!\n");
2851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = xmlNewTextWriter(out);
2891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
290dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterMemory : out of memory!\n");
2921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(out);
2931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
2971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
2981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
3005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterPushParser:
3015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ctxt: xmlParserCtxtPtr to hold the new XML document tree
3025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
3035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @ctxt as output
305d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard * NOTE: the @ctxt context will be freed with the resulting writer
306d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard *       (if the call succeeds).
3075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * TODO: handle compression
3085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
3105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
3121d913863130a17a638db69c2c50f89e5b0d4aae4Daniel VeillardxmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt,
3131d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard                           int compression ATTRIBUTE_UNUSED)
3145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
3155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
3165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlOutputBufferPtr out;
3175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
318500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (ctxt == NULL) {
319dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
320500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlNewTextWriterPushParser : invalid context!\n");
321500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return NULL;
322500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
323500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    out = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
3255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  xmlTextWriterWriteDocCallback,
3265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  (xmlOutputCloseCallback)
3275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  xmlTextWriterCloseDocCallback,
3285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  (void *) ctxt, NULL);
3295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (out == NULL) {
330dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterPushParser : error at xmlOutputBufferCreateIO!\n");
3325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriter(out);
3365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
337dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterPushParser : error at xmlNewTextWriter!\n");
3395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferClose(out);
3405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
34320c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard    ret->ctxt = ctxt;
34420c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard
3455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
3465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
3475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterDoc:
3505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @doc: address of a xmlDocPtr to hold the new XML document tree
3515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
3525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @*doc as output
3545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
3565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
3585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlNewTextWriterDoc(xmlDocPtr * doc, int compression)
3595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
3605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
3615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAXHandler saxHandler;
3625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt;
3635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    memset(&saxHandler, '\0', sizeof(saxHandler));
3655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
3665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
3675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startElement = xmlSAX2StartElement;
3685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.endElement = xmlSAX2EndElement;
3695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
3715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt == NULL) {
372dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
3745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
37603a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    /*
37703a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * For some reason this seems to completely break if node names
37803a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * are interned.
37903a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     */
38003a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    ctxt->dictNames = 0;
3815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3821d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard    ctxt->myDoc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
3835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt->myDoc == NULL) {
3845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlFreeParserCtxt(ctxt);
385dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewDoc!\n");
3875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriterPushParser(ctxt, compression);
3915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
392dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
3945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
397500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlSetDocCompressMode(ctxt->myDoc, compression);
398500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
399a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    if (doc != NULL) {
400500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        *doc = ctxt->myDoc;
401a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	ret->no_doc_free = 1;
402a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    }
4035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
4055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
4065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
4085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterTree:
4095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @doc: xmlDocPtr
4105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @node: xmlNodePtr or NULL for doc->children
4115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
4125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
4135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @doc as output
4145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * starting at @node
4155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
4165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
4175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
4185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
4195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression)
4205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
4215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
4225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAXHandler saxHandler;
4235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt;
4245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (doc == NULL) {
426dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
427500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlNewTextWriterTree : invalid document tree!\n");
4285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
4305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    memset(&saxHandler, '\0', sizeof(saxHandler));
4325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
4335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
4345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startElement = xmlSAX2StartElement;
4355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.endElement = xmlSAX2EndElement;
4365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
4385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt == NULL) {
439dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
4405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
4415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
44303a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    /*
44403a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * For some reason this seems to completely break if node names
44503a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * are interned.
44603a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     */
44703a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    ctxt->dictNames = 0;
4485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriterPushParser(ctxt, compression);
4505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
451500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlFreeParserCtxt(ctxt);
452dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
4535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
4545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
4565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
457500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    ctxt->myDoc = doc;
458500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    ctxt->node = node;
459a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    ret->no_doc_free = 1;
460500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSetDocCompressMode(doc, compression);
4625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
4645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
4655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
4671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriter:
4681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
4691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
4701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Deallocate all the resources associated to the writer
4711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
4721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardvoid
4731d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriter(xmlTextWriterPtr writer)
4741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
4751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
4761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
4771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out != NULL)
4791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(writer->out);
4801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->nodes != NULL)
4821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nodes);
4831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->nsstack != NULL)
4851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nsstack);
4861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
487a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    if (writer->ctxt != NULL) {
488a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard        if ((writer->ctxt->myDoc != NULL) && (writer->no_doc_free == 0)) {
489a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	    xmlFreeDoc(writer->ctxt->myDoc);
490a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	    writer->ctxt->myDoc = NULL;
491a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	}
49220c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard        xmlFreeParserCtxt(writer->ctxt);
493a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    }
49420c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard
4959db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards    if (writer->doc != NULL)
4969db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards        xmlFreeDoc(writer->doc);
4979db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards
4984773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard    if (writer->ichar != NULL)
4994773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard        xmlFree(writer->ichar);
5001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(writer);
5011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
5021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
5041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartDocument:
5051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
5061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @version:  the xml version ("1.0") or NULL for default ("1.0")
5071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @encoding:  the encoding or NULL for default
5081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @standalone: "yes" or "no" or NULL for default
5091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start a new xml document
5111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
5131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
5141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
5151d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version,
5161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const char *encoding, const char *standalone)
5171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
5181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
5191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
5201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
5211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlCharEncodingHandlerPtr encoder;
5221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
523500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if ((writer == NULL) || (writer->out == NULL)) {
524dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
525500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterStartDocument : invalid writer!\n");
5261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
527500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
5281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
5301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
531dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
532500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterStartDocument : not allowed in this context!\n");
5331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    encoder = NULL;
5371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (encoding != NULL) {
5381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        encoder = xmlFindCharEncodingHandler(encoding);
5391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (encoder == NULL) {
540dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
5411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartDocument : out of memory!\n");
5421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
5441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    writer->out->encoder = encoder;
5471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (encoder != NULL) {
548caa1951d59833b4516c008829f9e5ce96fd37b03Daniel Veillard	if (writer->out->conv == NULL) {
549caa1951d59833b4516c008829f9e5ce96fd37b03Daniel Veillard	    writer->out->conv = xmlBufferCreateSize(4000);
550caa1951d59833b4516c008829f9e5ce96fd37b03Daniel Veillard	}
5511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlCharEncOutFunc(encoder, writer->out->conv, NULL);
5529db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards        if ((writer->doc != NULL) && (writer->doc->encoding == NULL))
5539db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards            writer->doc->encoding = xmlStrdup((xmlChar *)writer->out->encoder->name);
5541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    } else
5551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        writer->out->conv = NULL;
5561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
5581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<?xml version=");
5591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (version != 0)
5671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, version);
5681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    else
5691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "1.0");
5701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out->encoder != 0) {
5781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " encoding=");
5791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count =
5871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlOutputBufferWriteString(writer->out,
5881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                       writer->out->encoder->name);
5891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (standalone != 0) {
5991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " standalone=");
6001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
6011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
6021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
6031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
6041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
6051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
6061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
6071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, standalone);
6081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
6091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
6101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
6111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
6121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
6131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
6141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
6151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
6161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "?>\n");
6181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
6191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
6201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
6211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
6231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
6241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
6261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndDocument:
6271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
6281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
6293ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard * End an xml document. All open elements are closed, and
6303ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard * the content is flushed to the output.
6311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
6323ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard * Returns the bytes written or -1 in case of error
6331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
6341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
6351d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndDocument(xmlTextWriterPtr writer)
6361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
6371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
6381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
6391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
6401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
6411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
642500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
643dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
644500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterEndDocument : invalid writer!\n");
6451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
646500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
6471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
6491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while ((lk = xmlListFront(writer->nodes)) != NULL) {
6501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
6511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p == 0)
6521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
6531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        switch (p->state) {
6541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_NAME:
6551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_ATTRIBUTE:
6561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_TEXT:
6571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndElement(writer);
6581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
6621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_PI:
6631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_PI_TEXT:
6641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndPI(writer);
6651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
6691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_CDATA:
6701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndCDATA(writer);
6711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
6751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_DTD:
676500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
677500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM:
678500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM_TEXT:
679500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL:
680500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL_TEXT:
681500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY:
682500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY_TEXT:
683500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_PENT:
6841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndDTD(writer);
6851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
689ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            case XML_TEXTWRITER_COMMENT:
690ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                count = xmlTextWriterEndComment(writer);
691ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                if (count < 0)
692ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    return -1;
693ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                sum += count;
694ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                break;
6951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            default:
696ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                break;
6971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
6981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
6991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7002cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (!writer->indent) {
701ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
702ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count < 0)
703ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
704ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
705ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
7063ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard
7073ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard    sum += xmlTextWriterFlush(writer);
7083ff24115d2d95342ae1adc387560907d63f99ec7Daniel Veillard
709ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return sum;
710ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard}
711ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
712ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard/**
713ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * xmlTextWriterStartComment:
714ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * @writer:  the xmlTextWriterPtr
715ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
716ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * Start an xml comment.
717ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
718ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
719ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard */
720ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillardint
721ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterStartComment(xmlTextWriterPtr writer)
722ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard{
723ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int count;
724ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int sum;
725ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlLinkPtr lk;
726ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlTextWriterStackEntry *p;
727ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
728500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
729dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
730500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterStartComment : invalid writer!\n");
731ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
732500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
733ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
734ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    sum = 0;
735ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    lk = xmlListFront(writer->nodes);
736ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (lk != 0) {
737ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
738ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (p != 0) {
739ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            switch (p->state) {
740ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_TEXT:
741ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_NONE:
742ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
743ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_NAME:
744b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    /* Output namespace declarations */
745b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    count = xmlTextWriterOutputNSDecl(writer);
746b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    if (count < 0)
747b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        return -1;
748b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    sum += count;
749ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
750ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    if (count < 0)
751ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                        return -1;
752ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    sum += count;
753500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (writer->indent) {
754500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        count =
755500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            xmlOutputBufferWriteString(writer->out, "\n");
756500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        if (count < 0)
757500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            return -1;
758500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        sum += count;
759500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    }
760ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
761ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
762ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                default:
763ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    return -1;
764ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            }
765ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        }
766ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
767ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
768ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p = (xmlTextWriterStackEntry *)
769ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
770ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (p == 0) {
771dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
772ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
773ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
774ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
775ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
77675e389d4e0ccd998d288387051e66a8f0b2af1b0Daniel Veillard    p->name = NULL;
777ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p->state = XML_TEXTWRITER_COMMENT;
778ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
779ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPushFront(writer->nodes, p);
780ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
781ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent) {
782ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
783ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count < 0)
784ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
785ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
786ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
787ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
788ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!--");
789ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (count < 0)
7905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
7915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    sum += count;
792ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
793ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return sum;
794ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard}
795ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
796ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard/**
797ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * xmlTextWriterEndComment:
798ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * @writer:  the xmlTextWriterPtr
799ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
800ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * End the current xml coment.
801ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
802ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
803ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard */
804ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillardint
805ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterEndComment(xmlTextWriterPtr writer)
806ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard{
807ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int count;
808ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int sum;
809ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlLinkPtr lk;
810ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlTextWriterStackEntry *p;
811ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
812500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
813dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
814500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterEndComment : invalid writer!\n");
815ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
816500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
817ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
818ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    lk = xmlListFront(writer->nodes);
819500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0) {
820dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
821500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterEndComment : not allowed in this context!\n");
822ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
823500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
824ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
825ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
826ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (p == 0)
827ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
828ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
829ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    sum = 0;
830ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    switch (p->state) {
831ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        case XML_TEXTWRITER_COMMENT:
832ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "-->");
833ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            if (count < 0)
834ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                return -1;
835ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            sum += count;
836ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            break;
837ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        default:
838ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
839ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
840ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
841ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent) {
842ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
843ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count < 0)
844ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
845ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
8462cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
847ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
848ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPopFront(writer->nodes);
8491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
8501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
8511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
8531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatComment:
8541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
8551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
8561d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
8571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
8591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
8611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
862ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
8631d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatComment(xmlTextWriterPtr writer,
8641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const char *format, ...)
8651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
8661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
8671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
8681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
8701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatComment(writer, format, ap);
8721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
8741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
8751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
8761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
8781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatComment:
8791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
8801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
8811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
8821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
8841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
8861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
8871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
8881d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer,
8891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 const char *format, va_list argptr)
8901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
8911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
8921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
8931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
894500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
895dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
896500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteVFormatComment : invalid writer!\n");
8971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
898500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
8991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
9011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
9021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
9031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteComment(writer, buf);
9051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
9071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
9081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
9091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
9111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteComment:
9121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
9131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  comment string
9141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
9161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
9181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
9191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
9201d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content)
9211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
9221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
9231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
9241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
926ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlTextWriterStartComment(writer);
9271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
9281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
930ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
9311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
9321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
934ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlTextWriterEndComment(writer);
9351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
9361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
9381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
9401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
9411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
9431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartElement:
9441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
9451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
9461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml element.
9481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
9501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
9511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
9521d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name)
9531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
9541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
9551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
9561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
9571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
9581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
9601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
9631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
9641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
9651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
9661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
9671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
9681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
9691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
9701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
9711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NONE:
9721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
973614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard				case XML_TEXTWRITER_ATTRIBUTE:
974614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard					count = xmlTextWriterEndAttribute(writer);
975614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard					if (count < 0)
976614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard						return -1;
977614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard					sum += count;
978614fdc13b7d073b6732fff5bb2baf16ef2ade18dDaniel Veillard					/* fallthrough */
9791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
980b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    /* Output namespace declarations */
981b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    count = xmlTextWriterOutputNSDecl(writer);
982b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    if (count < 0)
983b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        return -1;
984b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    sum += count;
9851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
9861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
9871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
9881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
989ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    if (writer->indent)
990ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                        count =
991ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                            xmlOutputBufferWriteString(writer->out, "\n");
9921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
9931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
994ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                default:
995ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
9961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
9971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
9981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
9991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
10011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
10021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
1003dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
10041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
10051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
10091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
1010dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
10111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
10121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
10131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_NAME;
10161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
10181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1019ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent) {
1020ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
1021ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
10222cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
10232cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
10241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<");
10251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
10261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
10285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count =
10295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferWriteString(writer->out, (const char *) p->name);
10301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
10311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
10331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
10351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
10361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
10381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartElementNS:
10391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
10401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix or NULL
10411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
10421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI or NULL
10431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml element with namespace support.
10451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
10471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
10481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
10491d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartElementNS(xmlTextWriterPtr writer,
10501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * prefix, const xmlChar * name,
10511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * namespaceURI)
10521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
10531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
10541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
10551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
10561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
10581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
106075e389d4e0ccd998d288387051e66a8f0b2af1b0Daniel Veillard    buf = NULL;
10611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != 0) {
10621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
10631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
10641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
10661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
10681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartElement(writer, buf);
10691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
10701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
10711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
10731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (namespaceURI != 0) {
1075b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlTextWriterNsStackEntry *p = (xmlTextWriterNsStackEntry *)
1076b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
1077b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (p == 0) {
1078b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1079b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                            "xmlTextWriterStartElementNS : out of memory!\n");
1080b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            return -1;
1081b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1082b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
10831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(BAD_CAST "xmlns");
10841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (prefix != 0) {
10851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, BAD_CAST ":");
10861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, prefix);
10871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
10881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1089b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        p->prefix = buf;
1090b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        p->uri = xmlStrdup(namespaceURI);
1091b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (p->uri == 0) {
1092b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1093b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                            "xmlTextWriterStartElementNS : out of memory!\n");
1094b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlFree(p);
10951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
1096b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1097b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        p->elem = xmlListFront(writer->nodes);
1098b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1099b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlListPushFront(writer->nsstack, p);
11001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
11011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
11031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
11041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
11061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndElement:
11071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
11081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element.
11101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
11121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
11131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
11141d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndElement(xmlTextWriterPtr writer)
11151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
11161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
11171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
11181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
11191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
11201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
11221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
11231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
1125b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (lk == 0) {
1126b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlListDelete(writer->nsstack);
1127b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        writer->nsstack = NULL;
11281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
1129b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    }
11301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1132b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (p == 0) {
1133b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlListDelete(writer->nsstack);
1134b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        writer->nsstack = NULL;
11351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
1136b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    }
11371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
11391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
11401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
11411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
1142b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (count < 0) {
1143b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlListDelete(writer->nsstack);
1144b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                writer->nsstack = NULL;
11451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
1146b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
11471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
11491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
1150b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            /* Output namespace declarations */
1151b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            count = xmlTextWriterOutputNSDecl(writer);
1152b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (count < 0)
1153b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1154b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            sum += count;
1155b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1156ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            if (writer->indent) /* next element needs indent */
1157ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                writer->doindent = 1;
11581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "/>");
11591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
11631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_TEXT:
1164ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            if ((writer->indent) && (writer->doindent)) {
1165ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                count = xmlTextWriterWriteIndent(writer);
1166ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                sum += count;
1167ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                writer->doindent = 1;
1168ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            } else
1169ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                writer->doindent = 1;
11701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "</");
11711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out,
1175ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                               (const char *) p->name);
11761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
11801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
11841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
11851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
11861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
11871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11882cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (writer->indent) {
1189ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
1190ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
11912cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
11922cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
11931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
11941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
11951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
11961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
11981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterFullEndElement:
11991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
12001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element. Writes an end tag even if the element is empty
12021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
12041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
12051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
12061d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterFullEndElement(xmlTextWriterPtr writer)
12071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
12081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
12091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
12101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
12111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
12121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
12141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
12151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
12171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
12181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
12191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
12211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
12221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
12231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
12251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
12261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
12271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
12281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
12321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
1233b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            /* Output namespace declarations */
1234b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            count = xmlTextWriterOutputNSDecl(writer);
1235b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (count < 0)
1236b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1237b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            sum += count;
1238b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
12391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
12401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
12441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_TEXT:
12451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "</");
12461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out,
1250ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                               (const char *) p->name);
12511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
12551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
12591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
12601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
12611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
12621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12637e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard    if (writer->indent) {
12647e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
12657e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard        sum += count;
12667e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard    }
12677e26fb4b109b50ecf6752fe3d6f74d349432fac7Daniel Veillard
12681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
12691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
12701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
12711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
12731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatRaw:
12741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
12751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
12761d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
12771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted raw xml text.
12791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
12811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1282ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
12831d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format,
12841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            ...)
12851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
12861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
12871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
12881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
12901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatRaw(writer, format, ap);
12921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
12941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
12951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
12961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
12981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatRaw:
12991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
13001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
13011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
13021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted raw xml text.
13041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
13061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
13071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
13081d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format,
13091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             va_list argptr)
13101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
13121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
13131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
13151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
13161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
13181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
13191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
13201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteRaw(writer, buf);
13221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
13241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
13251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13281e90661bb817402f85103c3b9d3ce6ebab570f38Daniel Veillard * xmlTextWriterWriteRawLen:
13291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
13301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
13311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  length of the text string
13321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml text.
13341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * TODO: what about entities and special chars??
13351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
13371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
13381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
13391d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content,
13401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int len)
13411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
13431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
13441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
13451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
13461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1347500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
1348dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
1349500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteRawLen : invalid writer!\n");
13501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
1351500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
13521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1353e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((content == NULL) || (len < 0)) {
1354dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
1355500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteRawLen : invalid content!\n");
1356500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
1357500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
13581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1360500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1361500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1362500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1363500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterHandleStateDependencies(writer, p);
1364500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
13651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
1366500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
13671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
13681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1369500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent)
1370500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        writer->doindent = 0;
1371500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
1372500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (content != NULL) {
1373500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count =
1374500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            xmlOutputBufferWrite(writer->out, len, (const char *) content);
1375500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
1376500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
1377500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
1378500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
13791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
13811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteRaw:
13851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
13861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
13871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a raw xml text.
13891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
13911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
13921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
13931d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content)
13941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content));
13961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatString:
14001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
14011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
14021d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
14031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml text.
14051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1408ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
14091d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format,
14101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               ...)
14111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
14121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
14131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
14141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1415e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (format == NULL))
1416e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard        return -1;
1417e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard
14181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
14191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatString(writer, format, ap);
14211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
14231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
14241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
14251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
14271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatString:
14281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
14291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
14301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
14311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml text.
14331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
14361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
14371d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatString(xmlTextWriterPtr writer,
14381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const char *format, va_list argptr)
14391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
14401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
14411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
14421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1443e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (format == NULL))
14441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
14451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
14471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
14481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
14491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteString(writer, buf);
14511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
14531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
14541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
14551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
14571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteString:
14581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
14591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
14601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml text.
14621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
14651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
14661d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content)
14671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1468500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
14691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
14701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
14711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
1472500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlChar *buf;
14731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1474e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (content == NULL))
14751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
14761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1478500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    buf = (xmlChar *) content;
1479500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1480500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1481500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1482500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
1483500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            switch (p->state) {
1484500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_NAME:
1485500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_TEXT:
148662040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard#if 0
148762040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard                    buf = NULL;
148862040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard		    xmlOutputBufferWriteEscape(writer->out, content, NULL);
148962040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard#endif
1490500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    buf = xmlEncodeSpecialChars(NULL, content);
1491500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    break;
1492500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
1493500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    buf = NULL;
14949db68f0c14cb0509cd262749aa6ea2d15fbd6207Rob Richards                    xmlAttrSerializeTxtContent(writer->out->buffer, writer->doc,
1495500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                               NULL, content);
1496500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    break;
149787640d5f14e7ce8b9844b886c765af0c56de5ca5William M. Brack		default:
149887640d5f14e7ce8b9844b886c765af0c56de5ca5William M. Brack		    break;
1499500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            }
1500500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
15011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
15021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1503500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (buf != NULL) {
1504500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteRaw(writer, buf);
1505500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
1506500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
1507500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
1508751c9ec657e784bd941802d722632f19f17f17aeDaniel Veillard
1509500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (buf != content)     /* buf was allocated by us, so free it */
1510500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            xmlFree(buf);
1511a9c612c3ee115278fb8dc0cac1b2f2e362f0c052William M. Brack    }
15121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
15141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
15151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
15171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlOutputBufferWriteBase64:
15181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out: the xmlOutputBufferPtr
15191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
15201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
15211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
15221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write base64 encoded data to an xmlOutputBuffer.
15231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Adapted from John Walker's base64.c (http://www.fourmilab.ch/).
15241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
15251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
15261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
15271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
15281d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
15291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const unsigned char *data)
15301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
15311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    static unsigned char dtable[64] =
153247a318840053e03e60acb437f41e63366f44852cWilliam M. Brack            {'A','B','C','D','E','F','G','H','I','J','K','L','M',
153347a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
153447a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     'a','b','c','d','e','f','g','h','i','j','k','l','m',
153547a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     'n','o','p','q','r','s','t','u','v','w','x','y','z',
153647a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     '0','1','2','3','4','5','6','7','8','9','+','/'};
153747a318840053e03e60acb437f41e63366f44852cWilliam M. Brack
15381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int i;
15391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int linelen;
15401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
15411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
15421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1543e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((out == NULL) || (len < 0) || (data == NULL))
1544e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard        return(-1);
1545e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard
15461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    linelen = 0;
15471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
15481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    i = 0;
15501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while (1) {
15511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        unsigned char igroup[3];
15521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        unsigned char ogroup[4];
15531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        int c;
15541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        int n;
15551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        igroup[0] = igroup[1] = igroup[2] = 0;
15571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        for (n = 0; n < 3 && i < len; n++, i++) {
15581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            c = data[i];
15591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            igroup[n] = (unsigned char) c;
15601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
15611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (n > 0) {
15631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[0] = dtable[igroup[0] >> 2];
15641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
15651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[2] =
15661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
15671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[3] = dtable[igroup[2] & 0x3F];
15681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (n < 3) {
15701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                ogroup[3] = '=';
15711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (n < 2) {
15721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    ogroup[2] = '=';
15731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                }
15741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
15751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (linelen >= B64LINELEN) {
15771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlOutputBufferWrite(out, 2, B64CRLF);
15781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count == -1)
15791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
15801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
15811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                linelen = 0;
15821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
15831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(out, 4, (const char *) ogroup);
15841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count == -1)
15851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
15861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
15871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            linelen += 4;
15891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
1590929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard
1591929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard        if (i >= len)
1592929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard            break;
15931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
15941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
15961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
15971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
15991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteBase64:
16001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer: the xmlTextWriterPtr
16011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
16021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @start:  the position within the data of the first byte to encode
16031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
16041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an base64 encoded xml text.
16061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
16081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
16091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
1610ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data,
16111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int start, int len)
16121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
16131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
16141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
16151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
16161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
16171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1618e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
16191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1622500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1623500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1624500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1625500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
1626500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlTextWriterHandleStateDependencies(writer, p);
16271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
16281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
16291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
1630500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
16311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
16321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1633ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent)
1634ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        writer->doindent = 0;
1635ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
16361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
16371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferWriteBase64(writer->out, len,
16381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   (unsigned char *) data + start);
16391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
16401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
16421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
16441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
16451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
16471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlOutputBufferWriteBinHex:
16481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out: the xmlOutputBufferPtr
16491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
16501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
16511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write hqx encoded data to an xmlOutputBuffer.
16531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * ::todo
16541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
165547a318840053e03e60acb437f41e63366f44852cWilliam M. Brack * Returns the bytes written (may be 0 because of buffering)
165647a318840053e03e60acb437f41e63366f44852cWilliam M. Brack * or -1 in case of error
16571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
16581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
1659ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlOutputBufferWriteBinHex(xmlOutputBufferPtr out,
1660ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                           int len, const unsigned char *data)
16611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1662ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int count;
1663ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int sum;
166447a318840053e03e60acb437f41e63366f44852cWilliam M. Brack    static char hex[16] =
166547a318840053e03e60acb437f41e63366f44852cWilliam M. Brack    	{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
1666ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int i;
1667ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
1668e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((out == NULL) || (data == NULL) || (len < 0)) {
1669ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
1670ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
1671ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
1672ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    sum = 0;
1673ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    for (i = 0; i < len; i++) {
1674ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count =
1675ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            xmlOutputBufferWrite(out, 1,
1676ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                 (const char *) &hex[data[i] >> 4]);
1677ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count == -1)
1678ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
1679ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
1680ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count =
1681ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            xmlOutputBufferWrite(out, 1,
1682ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                 (const char *) &hex[data[i] & 0xF]);
1683ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count == -1)
1684ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
1685ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
1686ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
1687ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
1688ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return sum;
16891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
16901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
16921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteBinHex:
16931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer: the xmlTextWriterPtr
16941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
16951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @start:  the position within the data of the first byte to encode
16961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
16971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a BinHex encoded xml text.
16991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
1703ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data,
17041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int start, int len)
17051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
17061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
17071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
17081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
17091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
17101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1711e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
17121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1715500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1716500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1717500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1718500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
1719500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlTextWriterHandleStateDependencies(writer, p);
17201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
1723500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
17241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
17251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1726ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent)
1727ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        writer->doindent = 0;
1728ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
17291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
17301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferWriteBinHex(writer->out, len,
17311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   (unsigned char *) data + start);
17321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
17331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
17351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
17371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
17381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
17401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartAttribute:
17411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
17421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
17431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml attribute.
17451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
17491d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name)
17501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
17511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
17521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
17531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
17541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
17551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
17571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
17601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
17611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
17621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
17651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
17661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
17691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
17701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
17711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
17751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
17761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " ");
17771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            count =
17815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                xmlOutputBufferWriteString(writer->out,
17825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                           (const char *) name);
17831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "=");
17871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
17911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_ATTRIBUTE;
17951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
17961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
17971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
17981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
17991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
18011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
18021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
18041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartAttributeNS:
18051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
18061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix or NULL
18071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
18081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI or NULL
18091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml attribute with namespace support.
18111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
18131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
18141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
18151d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartAttributeNS(xmlTextWriterPtr writer,
18161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * prefix, const xmlChar * name,
18171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * namespaceURI)
18181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
18191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
18201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
18211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
18221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p;
18231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
18251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
18261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1827b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    /* Handle namespace first in case of error */
1828b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (namespaceURI != 0) {
1829b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlTextWriterNsStackEntry nsentry, *curns;
1830b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1831b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        buf = xmlStrdup(BAD_CAST "xmlns");
1832b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (prefix != 0) {
1833b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            buf = xmlStrcat(buf, BAD_CAST ":");
1834b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            buf = xmlStrcat(buf, prefix);
1835b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1836b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1837b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        nsentry.prefix = buf;
1838b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        nsentry.uri = (xmlChar *)namespaceURI;
1839b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        nsentry.elem = xmlListFront(writer->nodes);
1840b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1841b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        curns = (xmlTextWriterNsStackEntry *)xmlListSearch(writer->nsstack,
1842b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                                                           (void *)&nsentry);
1843b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if ((curns != NULL)) {
1844b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlFree(buf);
1845b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (xmlStrcmp(curns->uri, namespaceURI) == 0) {
1846b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                /* Namespace already defined on element skip */
1847b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                buf = NULL;
1848b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            } else {
1849b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                /* Prefix mismatch so error out */
1850b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1851b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
1852b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1853b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1854b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        /* Do not add namespace decl to list - it is already there */
1855b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (buf != NULL) {
1856b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            p = (xmlTextWriterNsStackEntry *)
1857b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
1858b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (p == 0) {
1859b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1860b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards								        "xmlTextWriterStartAttributeNS : out of memory!\n");
1861b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1862b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
1863b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1864b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            p->prefix = buf;
1865b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            p->uri = xmlStrdup(namespaceURI);
1866b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (p->uri == 0) {
1867b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
1868b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        "xmlTextWriterStartAttributeNS : out of memory!\n");
1869b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlFree(p);
1870b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
1871b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
1872b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            p->elem = xmlListFront(writer->nodes);
1873b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
1874b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlListPushFront(writer->nsstack, p);
1875b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
1876b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    }
1877b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
187875e389d4e0ccd998d288387051e66a8f0b2af1b0Daniel Veillard    buf = NULL;
18791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != 0) {
18801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
18811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
18821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
18831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
18841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
18861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartAttribute(writer, buf);
18871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
18881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
18891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
18901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
18911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
18931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
18941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
18961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndAttribute:
18971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
18981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element.
19001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19041d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndAttribute(xmlTextWriterPtr writer)
19051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
19071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
19081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
19091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
19101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
19121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
19151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
19161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
19181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
19201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
19211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
19231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
19251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
19261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
19271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_NAME;
19281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
19301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0) {
19311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
19321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
19331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
19341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
19351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
19361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
19371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
19381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
19401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatAttribute:
19441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
19461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
19471d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
19481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.
19501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1953ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
19541d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer,
19551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * name, const char *format,
19561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  ...)
19571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
19591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
19601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
19621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap);
19641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
19661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
19671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatAttribute:
19711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
19731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
19741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
19751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.
19771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19811d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer,
19821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
19831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, va_list argptr)
19841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
19861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
19871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
19891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
19921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
19931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
19941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteAttribute(writer, name, buf);
19961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
19981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
19991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteAttribute:
20031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
20051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  attribute content
20061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml attribute.
20081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
20111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20121d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name,
20131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
20141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
20161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
20171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
20191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartAttribute(writer, name);
20201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
20211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
20231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
20241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
20251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
20271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndAttribute(writer);
20281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
20291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
20311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
20331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatAttributeNS:
20371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
20391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
20401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
20411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
20421d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
20431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.with namespace support
20451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2048ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
20491d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer,
20501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * prefix,
20511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
20521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * namespaceURI,
20531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, ...)
20541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
20561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
20571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
20591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatAttributeNS(writer, prefix, name,
20611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                              namespaceURI, format, ap);
20621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
20641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
20651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatAttributeNS:
20691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
20711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
20721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
20731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
20741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
20751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.with namespace support
20771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
20801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20811d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer,
20821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * prefix,
20831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * name,
20841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * namespaceURI,
20851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const char *format, va_list argptr)
20861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
20881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
20891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
20911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
20941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
20951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
20961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteAttributeNS(writer, prefix, name, namespaceURI,
20981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                       buf);
20991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
21011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
21021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteAttributeNS:
21061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
21081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
21091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
21101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  attribute content
21111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml attribute.
21131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
21151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
21161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
21171d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer,
21181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * prefix, const xmlChar * name,
21191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * namespaceURI,
21201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * content)
21211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
21231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
21241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
21261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
2129b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    count = xmlTextWriterStartAttributeNS(writer, prefix, name, namespaceURI);
2130b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (count < 0)
2131b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        return -1;
2132b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    sum += count;
2133b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    count = xmlTextWriterWriteString(writer, content);
2134b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if (count < 0)
2135b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        return -1;
2136b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    sum += count;
2137b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    count = xmlTextWriterEndAttribute(writer);
21381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
21391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
21411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
21431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatElement:
21471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
21491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
21501d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
21511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element.
21531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
21551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2156ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
21571d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatElement(xmlTextWriterPtr writer,
21581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const xmlChar * name, const char *format,
21591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                ...)
21601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
21621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
21631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
21651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatElement(writer, name, format, ap);
21671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
21691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
21701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatElement:
21741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
21761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
21771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
21781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element.
21801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
21821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
21831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
21841d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer,
21851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 const xmlChar * name, const char *format,
21861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 va_list argptr)
21871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
21891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
21901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
21921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
21951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
21961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
21971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteElement(writer, name, buf);
21991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
22011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
22021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteElement:
22061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
22081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  element content
22091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml element.
22111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22151d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name,
22161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                          const xmlChar * content)
22171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
22191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
22201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
22221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartElement(writer, name);
22231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
22241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
22261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
22271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
22281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
22301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndElement(writer);
22311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
22321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
22341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
22361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatElementNS:
22401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
22421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
22431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
22441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
22451d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
22461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element with namespace support.
22481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2251ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
22521d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer,
22531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * prefix,
22541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * name,
22551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * namespaceURI,
22561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const char *format, ...)
22571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
22591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
22601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
22621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatElementNS(writer, prefix, name,
22641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                            namespaceURI, format, ap);
22651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
22671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
22681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatElementNS:
22721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
22741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
22751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
22761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
22771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
22781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element with namespace support.
22801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22841d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer,
22851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * prefix,
22861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
22871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * namespaceURI,
22881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, va_list argptr)
22891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
22911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
22921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
22941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
22971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
22981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
22991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteElementNS(writer, prefix, name, namespaceURI,
23011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     buf);
23021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
23041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
23051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
23061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
23081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteElementNS:
23091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
23101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
23111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
23121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
23131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  element content
23141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml element with namespace support.
23161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
23181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
23191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
23201d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteElementNS(xmlTextWriterPtr writer,
23211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * prefix, const xmlChar * name,
23221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * namespaceURI,
23231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
23241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
23251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
23261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
23271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
23291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
23321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
23331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI);
23341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
23351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
23381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
23391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndElement(writer);
23421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
23431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
23471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
23481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
23501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartPI:
23511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
23521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
23531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml PI.
23551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
23571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
23581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
23591d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target)
23601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
23611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
23621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
23631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
23641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
23651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (target == NULL) || (*target == '\0'))
23671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (xmlStrcasecmp(target, (const xmlChar *) "xml") == 0) {
2370dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
23711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : target name [Xx][Mm][Ll] is reserved for xml standardization!\n");
23721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
23741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
23761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
23771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
23781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
23791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
23801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
23811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
23821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlTextWriterEndAttribute(writer);
23831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
23841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
23851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
23861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    /* fallthrough */
23871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
2388b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    /* Output namespace declarations */
2389b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    count = xmlTextWriterOutputNSDecl(writer);
2390b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    if (count < 0)
2391b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        return -1;
2392b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    sum += count;
23931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
23941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
23951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
23961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
23971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
23981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
2399ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_NONE:
2400ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_TEXT:
2401ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_DTD:
2402ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
24031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
24041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
2405dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
24061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    "xmlTextWriterStartPI : nested PI!\n");
24071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
24081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                default:
24091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
24101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
24111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
24121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
24151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
24161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
2417dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
24181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : out of memory!\n");
24191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(target);
24231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
2424dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
24251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : out of memory!\n");
24261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
24271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_PI;
24301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
24321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<?");
24341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
24351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
24375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count =
24385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferWriteString(writer->out, (const char *) p->name);
24391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
24401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
24421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
24441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
24451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
24471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndPI:
24481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
24491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml PI.
24511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
24531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
24541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
24551d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndPI(xmlTextWriterPtr writer)
24561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
24571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
24581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
24591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
24601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
24611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
24631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
24661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
24671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
24681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
24701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
24711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
24721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
24741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
24751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI:
24761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI_TEXT:
24771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "?>");
24781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
24791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
24801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
24811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
24821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
24831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
24841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
248602c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard    if (writer->indent) {
248702c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
248802c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard      	if (count < 0)
248902c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard       	return -1;
249002c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard        sum += count;
249102c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard    }
249202c1f23297ad794a9c83e408e477167b32b71e30Daniel Veillard
24931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
24941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
24951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
24961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
24981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatPI:
24991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
25011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
25021d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
25031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted PI.
25051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2508ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
25091d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target,
25101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const char *format, ...)
25111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
25131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
25141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
25161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatPI(writer, target, format, ap);
25181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
25201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
25211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatPI:
25251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
25271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
25285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
25291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml PI.
25311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
25341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
25351d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer,
25361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * target, const char *format,
25371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            va_list argptr)
25381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
25401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
25411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
25431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
25461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
25471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
25481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWritePI(writer, target, buf);
25501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
25521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
25531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWritePI:
25571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
25591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  PI content
25601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml PI.
25621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
25651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
25661d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target,
25671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                     const xmlChar * content)
25681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
25701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
25711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
25731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartPI(writer, target);
25741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
25751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
25771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content != 0) {
25781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, content);
25791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
25801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
25811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
25821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndPI(writer);
25841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
25851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
25871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
25891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartCDATA:
25931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml CDATA section.
25961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
25991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
26001d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartCDATA(xmlTextWriterPtr writer)
26011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
26021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
26031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
26041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
26051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
26061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
26081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
26111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
26121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
26131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
26141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
26151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
26161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NONE:
26171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
26181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
26191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
26201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
26211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlTextWriterEndAttribute(writer);
26221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
26231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
26241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
26251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    /* fallthrough */
26261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
2627b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    /* Output namespace declarations */
2628b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    count = xmlTextWriterOutputNSDecl(writer);
2629b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    if (count < 0)
2630b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                        return -1;
2631b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    sum += count;
26321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
26331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
26341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
26351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
26361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
26371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
26381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_CDATA:
2639dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
26401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    "xmlTextWriterStartCDATA : CDATA not allowed in this context!\n");
26411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
26421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                default:
26431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
26441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
26451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
26461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
26471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
26491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
26501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
2651dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
26521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartCDATA : out of memory!\n");
26531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
26551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
265675e389d4e0ccd998d288387051e66a8f0b2af1b0Daniel Veillard    p->name = NULL;
26571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_CDATA;
26581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
26601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<![CDATA[");
26621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
26631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
26651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
26671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
26681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
26701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndCDATA:
26711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
26721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml CDATA section.
26741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
26761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
26771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
26781d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndCDATA(xmlTextWriterPtr writer)
26791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
26801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
26811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
26821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
26831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
26841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
26861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
26891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
26901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
26931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
26941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
26971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
26981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_CDATA:
26991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "]]>");
27001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
27011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
27021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
27031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
27041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
27051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
27061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
27071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
27091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
27101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatCDATA:
27141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
27161d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
27171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml CDATA.
27191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2722ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
27231d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format,
27241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              ...)
27251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
27271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
27281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
27301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatCDATA(writer, format, ap);
27321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
27341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
27351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatCDATA:
27391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
27415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
27421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml CDATA.
27441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
27471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
27481d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format,
27491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               va_list argptr)
27501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
27521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
27531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
27551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
27581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
27591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
27601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteCDATA(writer, buf);
27621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
27641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
27651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteCDATA:
27691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  CDATA content
27711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml CDATA.
27731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
27761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
27771d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content)
27781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
27801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
27811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
27831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartCDATA(writer);
27841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
27851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
27871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content != 0) {
27881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, content);
27891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
27901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
27911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
27921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
27931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndCDATA(writer);
27941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
27951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
27971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
27991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
28001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
28021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartDTD:
28031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
28041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
28051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
28061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
28071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
28081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml DTD.
28091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
28101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
28111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
28121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
28131d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTD(xmlTextWriterPtr writer,
28141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * name,
28151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * pubid, const xmlChar * sysid)
28161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
28171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
28181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
28191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
28201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
28211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
28231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
28261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
2827ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
2828dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
28291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : DTD allowed only in prolog!\n");
28301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
28341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
28351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
2836dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
28371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : out of memory!\n");
28381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
28421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
2843dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
28441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : out of memory!\n");
28451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
28461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD;
28491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
28511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!DOCTYPE ");
28531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
28541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
28571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
28581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
28621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (sysid == 0) {
2863dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
28641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartDTD : system identifier needed!\n");
28651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
28671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2868500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (writer->indent)
2869500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, "\n");
2870500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        else
2871500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, " ");
2872500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
2873500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
2874500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
2875500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
2876500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "PUBLIC ");
2877500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
2878500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
2879500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
2880500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
2881500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
28821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
28831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
28875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
28881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
28891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2892500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
28931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
28941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
28991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
2900500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (writer->indent)
2901500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWrite(writer->out, 1, "\n");
2902500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            else
2903500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWrite(writer->out, 1, " ");
2904500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
2905500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
2906500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
2907500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "SYSTEM ");
2908500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
2909500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
2910500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
2911ffe47feb2725849a6eb47299af87548fa0f52d4fRob Richards        } else {
2912ffe47feb2725849a6eb47299af87548fa0f52d4fRob Richards			if (writer->indent)
2913500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "\n       ");
2914ffe47feb2725849a6eb47299af87548fa0f52d4fRob Richards            else
2915ffe47feb2725849a6eb47299af87548fa0f52d4fRob Richards                count = xmlOutputBufferWrite(writer->out, 1, " ");
29161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
29171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
29181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
29191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
29201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2921500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
29221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
29231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
29241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
29251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
29275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
29281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
29291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
29301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
29311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2932500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
29331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
29341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
29351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
29361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
29371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
29391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
29401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
29421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndDTD:
29431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
29441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
29451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml DTD.
29461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
29471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
29481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
29491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
29501d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndDTD(xmlTextWriterPtr writer)
29511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
2952500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int loop;
29531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
29541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
29551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
29561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
29571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
29591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
29601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
2962500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    loop = 1;
2963500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    while (loop) {
2964500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        lk = xmlListFront(writer->nodes);
2965500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (lk == NULL)
2966500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
2967500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
2968500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p == 0)
2969500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
2970500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
2971500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
2972500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, "]");
2973500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
2974500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
2975500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
2976500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
2977500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
2978500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, ">");
29791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2980500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
2981500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
2982500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
2983500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
2984500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
2985500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
29861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2987500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                xmlListPopFront(writer->nodes);
2988500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
2989500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM:
2990500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM_TEXT:
2991500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndDTDElement(writer);
2992500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
2993500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL:
2994500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL_TEXT:
2995500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndDTDAttlist(writer);
2996500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
2997500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY:
2998500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_PENT:
2999500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY_TEXT:
3000500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndDTDEntity(writer);
3001500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3002500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_COMMENT:
3003500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndComment(writer);
3004500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3005500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
3006500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                loop = 0;
3007500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                continue;
3008500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
3009500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3010500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
30111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
3012500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
30131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
30161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
30171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
30191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatDTD:
30201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
30211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
30221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
30231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
30241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
30251d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
30261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD with a formatted markup declarations part.
30281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
30301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
3031ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
30321d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer,
30331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * name,
30341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * pubid,
30351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * sysid, const char *format, ...)
30361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
30371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
30381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
30391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
30411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTD(writer, name, pubid, sysid, format,
30431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      ap);
30441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
30461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
30471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
30481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
30501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatDTD:
30511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
30521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
30531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
30541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
30551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
30565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
30571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD with a formatted markup declarations part.
30591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
30611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
30621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
30631d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer,
30641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name,
30651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * pubid,
30661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * sysid,
30671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const char *format, va_list argptr)
30681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
30691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
30701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
30711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
30731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
30761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
30771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
30781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTD(writer, name, pubid, sysid, buf);
30801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
30821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
30831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
30841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
30861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteDTD:
30871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
30881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
30891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
30901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
3091b1d531659b2bee47492ca1c319180116eaaf566eWilliam M. Brack * @subset:  string content of the DTD
30921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD.
30941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
30961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
30971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
30981d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTD(xmlTextWriterPtr writer,
30991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * name,
31001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * pubid,
31011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * sysid, const xmlChar * subset)
31021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
31031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
31041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
31051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
31071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTD(writer, name, pubid, sysid);
31081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
31091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (subset != 0) {
31121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, subset);
31131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
31141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
31151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
31161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTD(writer);
31181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
31191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
31231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
31241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
31265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDElement:
31275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
31285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
31295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD element.
31315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
31335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
31341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
31351d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name)
31361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
31371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
31381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
31391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
31401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
31411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
31431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
31461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
31471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
31481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3152500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
3153500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
3154500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
3155500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, " [");
3156500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
3157500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
3158500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
3159500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
3160500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
3161500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
3162500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
3163500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3164500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
3165500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
3166500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
3167500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
3168500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_NONE:
3169500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3170500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
31711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
3172500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
31731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
31761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
31771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
3178dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
31791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
31801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
31841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
3185dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
31861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
31871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
31881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD_ELEM;
31911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
31931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3194500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3195500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
3196500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3197500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3198500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3199500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3200500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
32011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ELEMENT ");
32021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
32031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
32051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
32061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
32071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
32091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
32111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
32121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3214500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterEndDTDElement:
3215500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3216500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3217500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * End an xml DTD element.
3218500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3219500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3220500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3221500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3222500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterEndDTDElement(xmlTextWriterPtr writer)
3223500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3224500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3225500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3226500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3227500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3228500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3229500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
3230500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3231500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3232500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3233500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3234500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0)
3235500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3236500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3237500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3238500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3239500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3240500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3241500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3242500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM:
3243500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM_TEXT:
3244500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
3245500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3246500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3247500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3248500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3249500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3250500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3251500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3252500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3253500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3254500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
3255500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3256500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3257500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3258500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3259500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3260500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlListPopFront(writer->nodes);
3261500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3262500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3263500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3264500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
32655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDElement:
32665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
32675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
32685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
32691d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
32705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD element.
32725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
32745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3275ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
32761d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer,
32771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
32781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, ...)
32791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
32801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
32811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
32821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
32841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDElement(writer, name, format, ap);
32861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
32881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
32891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
32901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
32925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDElement:
32935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
32945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
32955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
32965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
32975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD element.
32995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
33015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
33021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
33031d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer,
33041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
33051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, va_list argptr)
33061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
33071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
33081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
33091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
33111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
33141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
33151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
33161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDElement(writer, name, buf);
33181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
33201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
33211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
33221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
33245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDElement:
33255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
33265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
33275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the element
33285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD element.
33305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
33325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
33331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
33341d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDElement(xmlTextWriterPtr writer,
33351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name, const xmlChar * content)
33361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
33371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
33381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
33391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content == NULL)
33411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
33441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDElement(writer, name);
33451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
33461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
33481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
33501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
33511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
33531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDElement(writer);
33551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
33561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
33581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
33601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
33611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
33635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDAttlist:
33645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
33655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
33665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD ATTLIST.
33685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
33705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
33711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
33721d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name)
33731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
33741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
33751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
33761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
33771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
33781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
33801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
33831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
33841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
33851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
33871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3389500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
3390500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
3391500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
3392500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, " [");
3393500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
3394500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
3395500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
3396500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
3397500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
3398500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
3399500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
3400500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3401500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
3402500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
3403500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
3404500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
3405500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_NONE:
3406500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3407500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
34081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
3409500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
34101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
34111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
34131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
34141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
3415dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
34161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDAttlist : out of memory!\n");
34171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
34191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
34211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
3422dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
34231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDAttlist : out of memory!\n");
34241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
34251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
34271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD_ATTL;
34281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
34301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3431500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3432500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
3433500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3434500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3435500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3436500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3437500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
34381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ATTLIST ");
34391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
34401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
3442ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
34431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
34441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
34481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
34491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3451500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterEndDTDAttlist:
3452500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3453500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3454500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * End an xml DTD attribute list.
3455500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3456500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3457500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3458500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3459500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer)
3460500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3461500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3462500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3463500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3464500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3465500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3466500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
3467500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3468500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3469500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3470500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3471500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0)
3472500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3473500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3474500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3475500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3476500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3477500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3478500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3479500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL:
3480500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL_TEXT:
3481500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
3482500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3483500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3484500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3485500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3486500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3487500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3488500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3489500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3490500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3491500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
3492500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3493500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3494500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3495500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3496500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3497500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlListPopFront(writer->nodes);
3498500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3499500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3500500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3501500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
35025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDAttlist:
35035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
35045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
35055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
35061d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
35075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD ATTLIST.
35095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
35115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3512ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
35131d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer,
35141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
35151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, ...)
35161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
35171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
35181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
35191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
35211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDAttlist(writer, name, format, ap);
35231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
35251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
35261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
35271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
35295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDAttlist:
35305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
35315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
35325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
35335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
35345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD ATTLIST.
35365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
35385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
35391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
35401d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer,
35411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
35421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, va_list argptr)
35431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
35441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
35451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
35461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
35481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
35511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
35521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
35531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDAttlist(writer, name, buf);
35551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
35571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
35581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
35591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
35615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDAttlist:
35625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
35635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
35645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the ATTLIST
35655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD ATTLIST.
35675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
35695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
35701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
35711d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer,
35721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name, const xmlChar * content)
35731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
35741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
35751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
35761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content == NULL)
35781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
35811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDAttlist(writer, name);
35821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
35831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
35851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
35871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
35881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
35901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDAttlist(writer);
35921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
35931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
35951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
35971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
35981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
36005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDEntity:
36015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
36025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
36035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
36045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
36055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD ATTLIST.
36065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
36075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
36085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
36091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
36101d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDEntity(xmlTextWriterPtr writer,
36111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            int pe, const xmlChar * name)
36121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
36131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
36141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
36151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
36161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
36171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
36191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
36221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
3623500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
36241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3625500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3626500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
3627500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            switch (p->state) {
3628500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_DTD:
3629500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, " [");
3630500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
3631500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
3632500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3633500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (writer->indent) {
3634500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        count =
3635500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            xmlOutputBufferWriteString(writer->out, "\n");
3636500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        if (count < 0)
3637500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            return -1;
3638500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        sum += count;
3639500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    }
3640500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    p->state = XML_TEXTWRITER_DTD_TEXT;
3641500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    /* fallthrough */
3642500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_DTD_TEXT:
3643500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_NONE:
3644500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    break;
3645500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                default:
3646500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
3647500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            }
3648500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
36491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
36501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
36521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
36531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
3654dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
36551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
36561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
36581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
36601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
3661dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
36621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
36631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
36641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
3666500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3667500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (pe != 0)
3668500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p->state = XML_TEXTWRITER_DTD_PENT;
3669500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    else
3670500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p->state = XML_TEXTWRITER_DTD_ENTY;
36711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
36731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3674500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3675500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
3676500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3677500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3678500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3679500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3680500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
36811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ENTITY ");
36821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
36831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
36851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pe != 0) {
3687500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "% ");
36881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
36921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3693ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
36941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
36951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
36971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
36991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
37001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3702500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterEndDTDEntity:
3703500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3704500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3705500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * End an xml DTD entity.
3706500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3707500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3708500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3709500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3710500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterEndDTDEntity(xmlTextWriterPtr writer)
3711500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3712500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3713500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3714500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3715500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3716500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3717500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
3718500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3719500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3720500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3721500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3722500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0)
3723500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3724500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3725500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3726500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3727500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3728500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3729500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3730500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY_TEXT:
3731500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
3732500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3733500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3734500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3735500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY:
3736500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_PENT:
3737500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
3738500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3739500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3740500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3741500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3742500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3743500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3744500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3745500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3746500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3747500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
3748500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3749500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3750500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3751500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3752500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3753500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlListPopFront(writer->nodes);
3754500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3755500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3756500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3757500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
37585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDInternalEntity:
37595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
37605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
37615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
37625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
37631d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
37645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD internal entity.
37665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
37685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3769ffa3c74933baa45bef5e0d7f15473c38a4c3f9e8Daniel Veillardint XMLCDECL
37701d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer,
37711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          int pe,
37721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          const xmlChar * name,
37731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          const char *format, ...)
37741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
37751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
37761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
37771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
37791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDInternalEntity(writer, pe, name,
37811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                    format, ap);
37821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
37841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
37851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
37861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
37885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDInternalEntity:
37895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
37905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
37915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
37925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
37935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
37945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD internal entity.
37965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
37985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
37991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
38001d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer,
38011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           int pe,
38021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           const xmlChar * name,
38031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           const char *format,
38041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           va_list argptr)
38051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
38061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
38071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
38081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
38101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
38131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
38141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
38151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDInternalEntity(writer, pe, name, buf);
38171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
38191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
38201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
38235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDEntity:
38245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
38255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
38265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
38275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
38285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
38295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ndataid:  the xml notation name.
38305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the entity
38315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD entity.
38335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
38355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
38361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
38371d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer,
38381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            int pe,
38391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * name,
38401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * pubid,
38411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * sysid,
38421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * ndataid,
38431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
38441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
3845500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if ((content == NULL) && (pubid == NULL) && (sysid == NULL))
38461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((pe != 0) && (ndataid != NULL))
38481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3850500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if ((pubid == NULL) && (sysid == NULL))
38511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return xmlTextWriterWriteDTDInternalEntity(writer, pe, name,
38521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                   content);
38531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlTextWriterWriteDTDExternalEntity(writer, pe, name, pubid,
38551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                               sysid, ndataid);
38561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
38595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDInternalEntity:
38605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
38615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
38625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
38635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the entity
38645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD internal entity.
38665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
38685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
38691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
38701d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer,
38711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    int pe,
38721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
38731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * content)
38741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
38751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
38761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
38771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((name == NULL) || (*name == '\0') || (content == NULL))
38791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
38821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDEntity(writer, pe, name);
38831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
38841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
38861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
38881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
38891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
38911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDEntity(writer);
38931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
38941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
38961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
38981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
39015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDExternalEntity:
39025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
39035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
39045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
39055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
39065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
39075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ndataid:  the xml notation name.
39085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3909500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity
39105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
39115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
39125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
39131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
39141d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer,
39151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    int pe,
39161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
39171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * pubid,
39181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * sysid,
39191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * ndataid)
39201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
39211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
39221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
39231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3924500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (((pubid == NULL) && (sysid == NULL)))
39251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
39261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((pe != 0) && (ndataid != NULL))
39271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
39281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
39301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDEntity(writer, pe, name);
39311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
39321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
39331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
39341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3935500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    count =
3936500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlTextWriterWriteDTDExternalEntityContents(writer, pubid, sysid,
3937500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                                    ndataid);
3938500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (count < 0)
3939500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3940500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum += count;
3941500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3942500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    count = xmlTextWriterEndDTDEntity(writer);
3943500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (count == -1)
3944500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3945500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum += count;
3946500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3947500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3948500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3949500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3950500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
3951500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterWriteDTDExternalEntityContents:
3952500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3953500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
3954500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
3955500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @ndataid:  the xml notation name.
3956500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3957500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Write the contents of a DTD external entity.
3958500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3959500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3960500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3961500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3962500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer,
3963500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                            const xmlChar * pubid,
3964500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                            const xmlChar * sysid,
3965500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                            const xmlChar * ndataid)
3966500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3967500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3968500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3969500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3970500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3971500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3972500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
3973dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3974500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteDTDExternalEntityContents: xmlTextWriterPtr invalid!\n");
3975500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3976500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3977500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3978500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3979500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3980500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0) {
3981dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3982500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
3983500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3984500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3985500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3986500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3987500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3988500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3989500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3990500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3991500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY:
3992500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3993500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_PENT:
3994500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (ndataid != NULL) {
3995dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3996500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                "xmlTextWriterWriteDTDExternalEntityContents: notation not allowed with parameter entities!\n");
3997500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3998500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            }
3999500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
4000500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
4001dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
4002500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
4003500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
4004500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4005500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
40061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
40071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (sysid == 0) {
4008dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
4009500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            "xmlTextWriterWriteDTDExternalEntityContents: system identifier needed!\n");
40101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
40121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
40141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
40245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
40251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
40341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
40361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
40371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
40381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
40391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
40401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
40411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
40421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " ");
40441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
40545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
40551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
40641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ndataid != NULL) {
40661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " NDATA ");
40671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
40725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out,
40735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                       (const char *) ndataid);
40741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
40781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
40801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
40811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
40835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDNotation:
40845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
40855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the xml notation
40865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
40875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
40885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
40895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD entity.
40905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
40915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
40925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
40931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
40941d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer,
40951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * name,
40961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * pubid, const xmlChar * sysid)
40971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
40981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
40991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
41001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
41011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
41021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
41041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
41071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
41081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
41091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
41111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
4113500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
4114500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
4115500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
4116500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, " [");
4117500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
4118500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
4119500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
4120500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
4121500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
4122500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
4123500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
4124500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
4125500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
4126500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
4127500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
4128500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
4129500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4130500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
41311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
4132500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
4133500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4134500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4135500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
4136500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
4137500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
41381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4139500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
41401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
41411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!NOTATION ");
41431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
41441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
41461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
41471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
41481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
41501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
41521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
41531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
41571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
41615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
41621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
41661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
41701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
41721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
41731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
41741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
41751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
41761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
41771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
41781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " ");
41791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
41831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
41875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
41881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
41921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
41961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, ">");
41981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
41991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
42001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
42011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
42031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterFlush:
42071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
42081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Flush the output buffer.
42101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
42121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
42141d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterFlush(xmlTextWriterPtr writer)
42151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
42171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
42191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
42201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out == NULL)
42221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = 0;
42231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    else
42241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferFlush(writer->out);
42251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return count;
42271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * misc
42311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriterStackEntry:
42351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @lk:  the xmlLinkPtr
42361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Free callback for the xmlList.
42381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void
42401d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriterStackEntry(xmlLinkPtr lk)
42411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
42431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
42451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
42461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
42471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name != 0)
42491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->name);
42501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(p);
42511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlCmpTextWriterStackEntry:
42551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data0:  the first data
42561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data1:  the second data
42571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Compare callback for the xmlList.
42591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
42611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
42631d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlCmpTextWriterStackEntry(const void *data0, const void *data1)
42641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p0;
42661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p1;
42671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == data1)
42691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
42701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == 0)
42721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
42731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data1 == 0)
42751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 1;
42761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p0 = (xmlTextWriterStackEntry *) data0;
42781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p1 = (xmlTextWriterStackEntry *) data1;
42791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlStrcmp(p0->name, p1->name);
42811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * misc
42851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
4288b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards * xmlTextWriterOutputNSDecl:
4289b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards * @writer:  the xmlTextWriterPtr
4290b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards *
4291b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards * Output the current namespace declarations.
4292b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards */
4293b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richardsstatic int
4294b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob RichardsxmlTextWriterOutputNSDecl(xmlTextWriterPtr writer)
4295b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards{
4296b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    xmlLinkPtr lk;
4297b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    xmlTextWriterNsStackEntry *np;
4298b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    int count;
4299b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    int sum;
4300b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4301b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    sum = 0;
4302b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    while (!xmlListEmpty(writer->nsstack)) {
4303b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlChar *namespaceURI = NULL;
4304b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlChar *prefix = NULL;
4305b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4306b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        lk = xmlListFront(writer->nsstack);
4307b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
4308b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4309b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (np != 0) {
4310b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            namespaceURI = xmlStrdup(np->uri);
4311b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            prefix = xmlStrdup(np->prefix);
4312b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
4313b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4314b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        xmlListPopFront(writer->nsstack);
4315b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4316b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        if (np != 0) {
4317b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            count = xmlTextWriterWriteAttribute(writer, prefix, namespaceURI);
4318b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlFree(namespaceURI);
4319b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            xmlFree(prefix);
4320b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4321b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            if (count < 0) {
4322b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                xmlListDelete(writer->nsstack);
4323b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                writer->nsstack = NULL;
4324b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                return -1;
4325b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            }
4326b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards            sum += count;
4327b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        }
4328b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    }
4329b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    return sum;
4330b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards}
4331b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards
4332b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards/**
43331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriterNsStackEntry:
43341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @lk:  the xmlLinkPtr
43351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
43361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Free callback for the xmlList.
43371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
43381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void
43391d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriterNsStackEntry(xmlLinkPtr lk)
43401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
43411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p;
43421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
43441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
43451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
43461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->prefix != 0)
43481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->prefix);
43491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->uri != 0)
43501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->uri);
43511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(p);
43531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
43541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
43561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlCmpTextWriterNsStackEntry:
43571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data0:  the first data
43581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data1:  the second data
43591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
43601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Compare callback for the xmlList.
43611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
43621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
43631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
43641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
43651d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlCmpTextWriterNsStackEntry(const void *data0, const void *data1)
43661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
43671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p0;
43681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p1;
43691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
43701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == data1)
43721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
43731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == 0)
43751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
43761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data1 == 0)
43781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 1;
43791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p0 = (xmlTextWriterNsStackEntry *) data0;
43811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p1 = (xmlTextWriterNsStackEntry *) data1;
43821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlStrcmp(p0->prefix, p1->prefix);
43841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4385b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards    if ((rc != 0) || (p0->elem != p1->elem))
4386b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards        rc = -1;
43871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
43891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
43901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
43925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDocCallback:
43935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @context:  the xmlBufferPtr
43945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @str:  the data to write
43955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @len:  the length of the data
43965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
43975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write callback for the xmlOutputBuffer with target xmlBuffer
43985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
43995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns -1, 0, 1
44005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
44015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int
44025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterWriteDocCallback(void *context, const xmlChar * str, int len)
44035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
44045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
44055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    int rc;
44065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44071d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard    if ((rc = xmlParseChunk(ctxt, (const char *) str, len, 0)) != 0) {
4408dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
44095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlTextWriterWriteDocCallback : XML error %d !\n",
44105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        rc);
44115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
44125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
44135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return len;
44155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
44165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
44185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterCloseDocCallback:
44195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @context:  the xmlBufferPtr
44205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
44215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Close callback for the xmlOutputBuffer with target xmlBuffer
44225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
44235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns -1, 0, 1
44245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
44255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int
44265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterCloseDocCallback(void *context)
44275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
44285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
44295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    int rc;
44305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if ((rc = xmlParseChunk(ctxt, NULL, 0, 1)) != 0) {
4432dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
44335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlTextWriterWriteDocCallback : XML error %d !\n",
44345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        rc);
44355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
44365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
44375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return 0;
44395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
44405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
44421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterVSprintf:
44431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  see printf
44441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
44451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
44461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Utility function for formatted output
44471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
44481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns a new xmlChar buffer with the data or NULL on error. This buffer must be freed.
44491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
44501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic xmlChar *
44511d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterVSprintf(const char *format, va_list argptr)
44521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
44531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int size;
44541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
44551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
4456f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    va_list locarg;
44571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
44581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    size = BUFSIZ;
44591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = (xmlChar *) xmlMalloc(size);
44601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == NULL) {
4461dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
44621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterVSprintf : out of memory!\n");
44631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
44641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
44651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4466f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    VA_COPY(locarg, argptr);
4467f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    while (((count = vsnprintf((char *) buf, size, format, locarg)) < 0)
44681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard           || (count == size - 1) || (count == size) || (count > size)) {
4469f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack	va_end(locarg);
44701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(buf);
44711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        size += BUFSIZ;
44721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = (xmlChar *) xmlMalloc(size);
44731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (buf == NULL) {
4474dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
44751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterVSprintf : out of memory!\n");
44761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return NULL;
44771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
4478f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack	VA_COPY(locarg, argptr);
44791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
4480f4caa5e698007f195d1c99b0ef1e06add0c852f4William M. Brack    va_end(locarg);
44811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
44821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return buf;
44831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
44841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
44855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
44865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDocumentCallback:
44875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ctx: the user data (XML parser context)
44885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
44895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * called at the start of document processing.
44905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
44915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic void
44925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterStartDocumentCallback(void *ctx)
44935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
44945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
44955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlDocPtr doc;
44965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt->html) {
44985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#ifdef LIBXML_HTML_ENABLED
44995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc == NULL)
45005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
45015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc == NULL) {
45025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
45035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                ctxt->sax->error(ctxt->userData,
45045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                 "SAX.startDocument(): out of memory\n");
45055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->errNo = XML_ERR_NO_MEMORY;
45065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->instate = XML_PARSER_EOF;
45075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->disableSAX = 1;
45085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            return;
45095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        }
45105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#else
4511d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
45125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "libxml2 built without HTML support\n");
45135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->errNo = XML_ERR_INTERNAL_ERROR;
45145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->instate = XML_PARSER_EOF;
45155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->disableSAX = 1;
45165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return;
45175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#endif
45185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    } else {
45195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        doc = ctxt->myDoc;
45205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (doc == NULL)
45215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            doc = ctxt->myDoc = xmlNewDoc(ctxt->version);
45225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (doc != NULL) {
45235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if (doc->children == NULL) {
45245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                if (ctxt->encoding != NULL)
45255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                    doc->encoding = xmlStrdup(ctxt->encoding);
45265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                else
45275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                    doc->encoding = NULL;
45285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                doc->standalone = ctxt->standalone;
45295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            }
45305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        } else {
45315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
45325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                ctxt->sax->error(ctxt->userData,
45335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                 "SAX.startDocument(): out of memory\n");
45345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->errNo = XML_ERR_NO_MEMORY;
45355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->instate = XML_PARSER_EOF;
45365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->disableSAX = 1;
45375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            return;
45385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        }
45395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
45405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) &&
45415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        (ctxt->input != NULL) && (ctxt->input->filename != NULL)) {
45425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->myDoc->URL =
45435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlCanonicPath((const xmlChar *) ctxt->input->filename);
45445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc->URL == NULL)
45455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->myDoc->URL =
45465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                xmlStrdup((const xmlChar *) ctxt->input->filename);
45475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
45485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
45495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
45502cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
45512cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterSetIndent:
45522cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
45532cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @indent:  do indentation?
45542cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
45552cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Set indentation output. indent = 0 do not indentation. indent > 0 do indentation.
45562cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
45572cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or 0 otherwise.
45582cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard */
45592cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardint
4560ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent)
45612cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard{
4562e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (indent < 0))
4563ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
45642cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4565ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    writer->indent = indent;
4566ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    writer->doindent = 1;
45672cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4568ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return 0;
45692cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
45702cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
45712cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
45722cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterSetIndentString:
45732cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
45742cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @str:  the xmlChar string
45752cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
45762cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Set string indentation.
45772cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
45782cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or 0 otherwise.
45792cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard */
45802cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardint
4581ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str)
45822cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard{
4583e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (!str))
4584ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
45852cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4586ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->ichar != NULL)
4587ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        xmlFree(writer->ichar);
4588ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    writer->ichar = xmlStrdup(str);
4589ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
4590ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (!writer->ichar)
4591ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
4592ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    else
4593ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return 0;
45942cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
45952cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
45962cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
45972cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterWriteIndent:
45982cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
45992cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
46002cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Write indent string.
46012cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
46022cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or the number of strings written.
4603ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard */
46042cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardstatic int
4605ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterWriteIndent(xmlTextWriterPtr writer)
4606ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard{
4607ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int lksize;
4608ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int i;
4609ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int ret;
4610ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
4611ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    lksize = xmlListSize(writer->nodes);
4612ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (lksize < 1)
4613ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return (-1);            /* list is empty */
4614ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    for (i = 0; i < (lksize - 1); i++) {
4615ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        ret = xmlOutputBufferWriteString(writer->out,
4616ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                         (const char *) writer->ichar);
4617ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (ret == -1)
4618ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return (-1);
4619ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
4620ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
4621ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return (lksize - 1);
46222cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
46232cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4624500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
4625500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterHandleStateDependencies:
4626500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
4627500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @p:  the xmlTextWriterStackEntry
4628500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
4629500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Write state dependent strings.
4630500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
4631500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns -1 on error or the number of characters written.
4632500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
4633500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardstatic int
4634500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
4635500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                     xmlTextWriterStackEntry * p)
4636500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
4637500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
4638500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
4639500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    char extra[3];
4640500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4641500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
4642500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
4643500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4644500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == NULL)
4645500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return 0;
4646500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4647500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
4648500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    extra[0] = extra[1] = extra[2] = '\0';
4649500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
4650500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum = 0;
4651500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
4652500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_NAME:
4653b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                /* Output namespace declarations */
4654b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                count = xmlTextWriterOutputNSDecl(writer);
4655b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                if (count < 0)
4656b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                    return -1;
4657b8769d6f249617cd7ceae6bfd7a20027b1bd1fcfRob Richards                sum += count;
4658500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = '>';
4659500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_TEXT;
4660500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4661500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_PI:
4662500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4663500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_PI_TEXT;
4664500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4665500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
4666500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4667500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[1] = '[';
4668500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
4669500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4670500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM:
4671500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4672500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_ELEM_TEXT;
4673500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4674500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL:
4675500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4676500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_ATTL_TEXT;
4677500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4678500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY:
4679500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_PENT:
4680500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4681500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[1] = writer->qchar;
4682500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_ENTY_TEXT;
4683500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4684500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
4685500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4686500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
4687500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4688500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4689500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (*extra != '\0') {
4690500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, extra);
4691500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
4692500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
4693500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
4694500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4695500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4696500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
4697500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
4698500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
46995d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlwriter
47005d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
47011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#endif
4702