xmlwriter.c revision a521d287516f2dc93a8fe540c5883ffc39cb5024
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
121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#include <string.h>
131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#include "libxml.h"
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/*
281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Types are kept private
291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef enum {
311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_NONE = 0,
321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_NAME,
331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_ATTRIBUTE,
341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_TEXT,
351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_PI,
361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_PI_TEXT,
371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_CDATA,
381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD,
391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_TEXT,
401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_ELEM,
41500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ELEM_TEXT,
421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_ATTL,
43500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ATTL_TEXT,
44500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ENTY,    /* entity */
45500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_ENTY_TEXT,
46500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    XML_TEXTWRITER_DTD_PENT,    /* parameter entity */
4787640d5f14e7ce8b9844b886c765af0c56de5ca5William M. Brack    XML_TEXTWRITER_COMMENT
481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard} xmlTextWriterState;
491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef struct _xmlTextWriterStackEntry xmlTextWriterStackEntry;
511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriterStackEntry {
531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *name;
541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterState state;
551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef struct _xmlTextWriterNsStackEntry xmlTextWriterNsStackEntry;
581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriterNsStackEntry {
591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *prefix;
601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *uri;
611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr elem;
621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriter {
65ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlOutputBufferPtr out;     /* output buffer */
66ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPtr nodes;           /* element name stack */
67ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPtr nsstack;         /* name spaces stack */
681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int level;
69ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int indent;                 /* enable indent */
70ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int doindent;               /* internal indent flag */
71ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlChar *ichar;             /* indent character */
72ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    char qchar;                 /* character used for quoting attribute values */
7320c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard    xmlParserCtxtPtr ctxt;
74a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    int no_doc_free;
751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void xmlFreeTextWriterStackEntry(xmlLinkPtr lk);
781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlCmpTextWriterStackEntry(const void *data0,
791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      const void *data1);
801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk);
811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlCmpTextWriterNsStackEntry(const void *data0,
821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                        const void *data1);
831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlTextWriterWriteMemCallback(void *context,
841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                         const xmlChar * str, int len);
851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlTextWriterCloseMemCallback(void *context);
865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int xmlTextWriterWriteDocCallback(void *context,
875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                         const xmlChar * str, int len);
885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int xmlTextWriterCloseDocCallback(void *context);
895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic xmlChar *xmlTextWriterVSprintf(const char *format, va_list argptr);
911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      const unsigned char *data);
935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic void xmlTextWriterStartDocumentCallback(void *ctx);
94ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillardstatic int xmlTextWriterWriteIndent(xmlTextWriterPtr writer);
95500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardstatic int
96500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard  xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
97500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                       xmlTextWriterStackEntry * p);
981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
100dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * xmlWriterErrMsg:
101dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @ctxt:  a writer context
102dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @error:  the error number
103dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @msg:  the error message
104dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard *
105dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * Handle a writer error
106dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard */
107dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillardstatic void
108dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel VeillardxmlWriterErrMsg(xmlTextWriterPtr ctxt, xmlParserErrors error,
109dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard               const char *msg)
110dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard{
111dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    if (ctxt != NULL) {
112dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
113dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	            NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
114dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard		    NULL, 0, NULL, NULL, NULL, 0, 0, msg);
115dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    } else {
116dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
117dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, msg);
118dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    }
119dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard}
120dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard
121dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard/**
122dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * xmlWriterErrMsgInt:
123dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @ctxt:  a writer context
124dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @error:  the error number
125dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @msg:  the error message
126dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * @val:  an int
127dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard *
128dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard * Handle a writer error
129dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard */
130dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillardstatic void
131dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel VeillardxmlWriterErrMsgInt(xmlTextWriterPtr ctxt, xmlParserErrors error,
132dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard               const char *msg, int val)
133dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard{
134dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    if (ctxt != NULL) {
135dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
136dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	            NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
137dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard		    NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
138dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    } else {
139dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard	__xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
140dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
141dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard    }
142dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard}
143dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard
144dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard/**
1451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriter:
1461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out:  an xmlOutputBufferPtr
1471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr
149d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard * NOTE: the @out parameter will be deallocated when the writer is closed
150d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard *       (if the call succeed.)
1511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
1531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1541d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
1551d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriter(xmlOutputBufferPtr out)
1561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
1581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = (xmlTextWriterPtr) xmlMalloc(sizeof(xmlTextWriter));
1601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
161dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
1621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
1631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    memset(ret, 0, (size_t) sizeof(xmlTextWriter));
1661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->nodes = xmlListCreate((xmlListDeallocator)
1681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               xmlFreeTextWriterStackEntry,
1691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               (xmlListDataCompare)
1701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               xmlCmpTextWriterStackEntry);
1711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret->nodes == NULL) {
172dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
1731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
1741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(ret);
1751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->nsstack = xmlListCreate((xmlListDeallocator)
1791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 xmlFreeTextWriterNsStackEntry,
1801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 (xmlListDataCompare)
1811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 xmlCmpTextWriterNsStackEntry);
1821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret->nsstack == NULL) {
183dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
1841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
185500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlListDelete(ret->nodes);
1861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(ret);
1871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->out = out;
191ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    ret->ichar = xmlStrdup(BAD_CAST " ");
1921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->qchar = '"';
1931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
194500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (!ret->ichar) {
195500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlListDelete(ret->nodes);
196500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlListDelete(ret->nsstack);
197500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlFree(ret);
198dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
199500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
200ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return NULL;
201500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
202a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    ret->no_doc_free = 0;
203ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
2041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
2051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
2061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
2081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriterFilename:
2091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @uri:  the URI of the resource for the output
2101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @compression:  compress the output?
2111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure with @uri as output
2131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
2151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2161d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
2171d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriterFilename(const char *uri, int compression)
2181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
2191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
2201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlOutputBufferPtr out;
2211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    out = xmlOutputBufferCreateFilename(uri, NULL, compression);
2231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (out == NULL) {
224dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterFilename : out of memory!\n");
2261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = xmlNewTextWriter(out);
2301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
231dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterFilename : out of memory!\n");
2331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(out);
2341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2372cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    ret->indent = 0;
2382cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    ret->doindent = 0;
2391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
2401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
2411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
2431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriterMemory:
2441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @buf:  xmlBufferPtr
2451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @compression:  compress the output?
2461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure with @buf as output
2481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * TODO: handle compression
2491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
2501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
2511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
2521d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
2531d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriterMemory(xmlBufferPtr buf, int compression ATTRIBUTE_UNUSED)
2541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
2551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
2561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlOutputBufferPtr out;
2571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/*::todo handle compression */
2591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    out = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
2601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  xmlTextWriterWriteMemCallback,
2611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  (xmlOutputCloseCallback)
2621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  xmlTextWriterCloseMemCallback,
2631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  (void *) buf, NULL);
2641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (out == NULL) {
265dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterMemory : out of memory!\n");
2671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = xmlNewTextWriter(out);
2711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
272dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
2731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterMemory : out of memory!\n");
2741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(out);
2751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
2791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
2801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
2825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterPushParser:
2835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ctxt: xmlParserCtxtPtr to hold the new XML document tree
2845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
2855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
2865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @ctxt as output
287d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard * NOTE: the @ctxt context will be freed with the resulting writer
288d5cc0f7f5185532120f6b8351e12ed7e81d4a28cDaniel Veillard *       (if the call succeeds).
2895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * TODO: handle compression
2905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
2915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
2925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
2935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
2941d913863130a17a638db69c2c50f89e5b0d4aae4Daniel VeillardxmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt,
2951d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard                           int compression ATTRIBUTE_UNUSED)
2965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
2975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
2985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlOutputBufferPtr out;
2995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
300500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (ctxt == NULL) {
301dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
302500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlNewTextWriterPushParser : invalid context!\n");
303500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return NULL;
304500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
305500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    out = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
3075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  xmlTextWriterWriteDocCallback,
3085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  (xmlOutputCloseCallback)
3095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  xmlTextWriterCloseDocCallback,
3105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  (void *) ctxt, NULL);
3115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (out == NULL) {
312dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterPushParser : error at xmlOutputBufferCreateIO!\n");
3145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriter(out);
3185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
319dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterPushParser : error at xmlNewTextWriter!\n");
3215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferClose(out);
3225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
32520c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard    ret->ctxt = ctxt;
32620c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard
3275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
3285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
3295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterDoc:
3325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @doc: address of a xmlDocPtr to hold the new XML document tree
3335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
3345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @*doc as output
3365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
3385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
3405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlNewTextWriterDoc(xmlDocPtr * doc, int compression)
3415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
3425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
3435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAXHandler saxHandler;
3445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt;
3455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    memset(&saxHandler, '\0', sizeof(saxHandler));
3475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
3485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
3495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startElement = xmlSAX2StartElement;
3505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.endElement = xmlSAX2EndElement;
3515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
3535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt == NULL) {
354dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
3565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
35803a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    /*
35903a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * For some reason this seems to completely break if node names
36003a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * are interned.
36103a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     */
36203a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    ctxt->dictNames = 0;
3635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3641d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard    ctxt->myDoc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
3655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt->myDoc == NULL) {
3665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlFreeParserCtxt(ctxt);
367dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewDoc!\n");
3695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriterPushParser(ctxt, compression);
3735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
374dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
3755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
3765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
379500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlSetDocCompressMode(ctxt->myDoc, compression);
380500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
381a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    if (doc != NULL) {
382500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        *doc = ctxt->myDoc;
383a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	ret->no_doc_free = 1;
384a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    }
3855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
3875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
3885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterTree:
3915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @doc: xmlDocPtr
3925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @node: xmlNodePtr or NULL for doc->children
3935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
3945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @doc as output
3965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * starting at @node
3975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
3995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
4005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
4015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression)
4025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
4035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
4045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAXHandler saxHandler;
4055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt;
4065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (doc == NULL) {
408dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
409500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlNewTextWriterTree : invalid document tree!\n");
4105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
4125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    memset(&saxHandler, '\0', sizeof(saxHandler));
4145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
4155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
4165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startElement = xmlSAX2StartElement;
4175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.endElement = xmlSAX2EndElement;
4185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
4205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt == NULL) {
421dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
4225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
4235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
42503a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    /*
42603a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * For some reason this seems to completely break if node names
42703a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     * are interned.
42803a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard     */
42903a53c34db279cbe4a305d58969beb1f26ff3d19Daniel Veillard    ctxt->dictNames = 0;
4305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriterPushParser(ctxt, compression);
4325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
433500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlFreeParserCtxt(ctxt);
434dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
4355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
4365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
4375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
4385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
439500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    ctxt->myDoc = doc;
440500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    ctxt->node = node;
441a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    ret->no_doc_free = 1;
442500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSetDocCompressMode(doc, compression);
4445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
4465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
4475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
4485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
4491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriter:
4501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
4511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
4521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Deallocate all the resources associated to the writer
4531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
4541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardvoid
4551d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriter(xmlTextWriterPtr writer)
4561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
4571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
4581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
4591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out != NULL)
4611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(writer->out);
4621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->nodes != NULL)
4641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nodes);
4651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->nsstack != NULL)
4671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nsstack);
4681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
469a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    if (writer->ctxt != NULL) {
470a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard        if ((writer->ctxt->myDoc != NULL) && (writer->no_doc_free == 0)) {
471a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	    xmlFreeDoc(writer->ctxt->myDoc);
472a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	    writer->ctxt->myDoc = NULL;
473a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard	}
47420c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard        xmlFreeParserCtxt(writer->ctxt);
475a521d287516f2dc93a8fe540c5883ffc39cb5024Daniel Veillard    }
47620c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard
4774773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard    if (writer->ichar != NULL)
4784773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard        xmlFree(writer->ichar);
4791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(writer);
4801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
4811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
4831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartDocument:
4841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
4851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @version:  the xml version ("1.0") or NULL for default ("1.0")
4861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @encoding:  the encoding or NULL for default
4871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @standalone: "yes" or "no" or NULL for default
4881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
4891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start a new xml document
4901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
4911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
4921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
4931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
4941d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version,
4951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const char *encoding, const char *standalone)
4961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
4971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
4981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
4991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
5001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlCharEncodingHandlerPtr encoder;
5011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
502500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if ((writer == NULL) || (writer->out == NULL)) {
503dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
504500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterStartDocument : invalid writer!\n");
5051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
506500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
5071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
5091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
510dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
511500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterStartDocument : not allowed in this context!\n");
5121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    encoder = NULL;
5161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (encoding != NULL) {
5171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        encoder = xmlFindCharEncodingHandler(encoding);
5181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (encoder == NULL) {
519dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
5201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartDocument : out of memory!\n");
5211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
5231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    writer->out->encoder = encoder;
5261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (encoder != NULL) {
5271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        writer->out->conv = xmlBufferCreateSize(4000);
5281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlCharEncOutFunc(encoder, writer->out->conv, NULL);
5291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    } else
5301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        writer->out->conv = NULL;
5311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
5331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<?xml version=");
5341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (version != 0)
5421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, version);
5431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    else
5441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "1.0");
5451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out->encoder != 0) {
5531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " encoding=");
5541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count =
5621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlOutputBufferWriteString(writer->out,
5631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                       writer->out->encoder->name);
5641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (standalone != 0) {
5741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " standalone=");
5751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, standalone);
5831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
5871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
5881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
5891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
5901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "?>\n");
5931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
5941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
5961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
5981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
5991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
6011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndDocument:
6021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
6031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
6041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml document. All open elements are closed
6051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
6061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
6071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
6081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
6091d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndDocument(xmlTextWriterPtr writer)
6101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
6111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
6121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
6131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
6141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
6151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
616500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
617dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
618500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterEndDocument : invalid writer!\n");
6191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
620500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
6211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
6231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while ((lk = xmlListFront(writer->nodes)) != NULL) {
6241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
6251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p == 0)
6261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
6271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        switch (p->state) {
6281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_NAME:
6291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_ATTRIBUTE:
6301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_TEXT:
6311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndElement(writer);
6321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
6361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_PI:
6371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_PI_TEXT:
6381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndPI(writer);
6391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
6431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_CDATA:
6441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndCDATA(writer);
6451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
6491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_DTD:
650500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
651500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM:
652500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM_TEXT:
653500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL:
654500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL_TEXT:
655500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY:
656500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY_TEXT:
657500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_PENT:
6581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndDTD(writer);
6591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
6601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
6621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
663ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            case XML_TEXTWRITER_COMMENT:
664ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                count = xmlTextWriterEndComment(writer);
665ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                if (count < 0)
666ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    return -1;
667ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                sum += count;
668ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                break;
6691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            default:
670ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                break;
6711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
6721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
6731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6742cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (!writer->indent) {
675ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
676ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count < 0)
677ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
678ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
679ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
680ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return sum;
681ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard}
682ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
683ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard/**
684ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * xmlTextWriterStartComment:
685ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * @writer:  the xmlTextWriterPtr
686ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
687ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * Start an xml comment.
688ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
689ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
690ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard */
691ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillardint
692ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterStartComment(xmlTextWriterPtr writer)
693ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard{
694ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int count;
695ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int sum;
696ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlLinkPtr lk;
697ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlTextWriterStackEntry *p;
698ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
699500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
700dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
701500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterStartComment : invalid writer!\n");
702ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
703500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
704ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
705ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    sum = 0;
706ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    lk = xmlListFront(writer->nodes);
707ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (lk != 0) {
708ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
709ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (p != 0) {
710ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            switch (p->state) {
711ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_TEXT:
712ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_NONE:
713ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
714ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_NAME:
715ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
716ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    if (count < 0)
717ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                        return -1;
718ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    sum += count;
719500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (writer->indent) {
720500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        count =
721500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            xmlOutputBufferWriteString(writer->out, "\n");
722500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        if (count < 0)
723500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            return -1;
724500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        sum += count;
725500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    }
726ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
727ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
728ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                default:
729ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    return -1;
730ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            }
731ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        }
732ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
733ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
734ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p = (xmlTextWriterStackEntry *)
735ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
736ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (p == 0) {
737dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
738ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
739ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
740ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
741ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
742ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p->name = 0;
743ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p->state = XML_TEXTWRITER_COMMENT;
744ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
745ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPushFront(writer->nodes, p);
746ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
747ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent) {
748ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
749ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count < 0)
750ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
751ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
752ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
753ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
754ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!--");
755ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (count < 0)
7565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
7575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    sum += count;
758ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
759ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return sum;
760ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard}
761ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
762ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard/**
763ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * xmlTextWriterEndComment:
764ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * @writer:  the xmlTextWriterPtr
765ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
766ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * End the current xml coment.
767ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard *
768ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
769ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard */
770ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillardint
771ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterEndComment(xmlTextWriterPtr writer)
772ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard{
773ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int count;
774ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int sum;
775ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlLinkPtr lk;
776ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlTextWriterStackEntry *p;
777ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
778500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
779dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
780500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterEndComment : invalid writer!\n");
781ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
782500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
783ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
784ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    lk = xmlListFront(writer->nodes);
785500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0) {
786dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
787500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterEndComment : not allowed in this context!\n");
788ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
789500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
790ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
791ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
792ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (p == 0)
793ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
794ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
795ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    sum = 0;
796ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    switch (p->state) {
797ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        case XML_TEXTWRITER_COMMENT:
798ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "-->");
799ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            if (count < 0)
800ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                return -1;
801ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            sum += count;
802ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            break;
803ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        default:
804ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
805ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
806ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
807ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent) {
808ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
809ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count < 0)
810ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
811ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
8122cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
813ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
814ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    xmlListPopFront(writer->nodes);
8151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
8161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
8171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
8191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatComment:
8201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
8211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
8221d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
8231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
8251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
8271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
8281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
8291d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatComment(xmlTextWriterPtr writer,
8301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const char *format, ...)
8311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
8321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
8331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
8341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
8361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatComment(writer, format, ap);
8381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
8401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
8411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
8421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
8441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatComment:
8451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
8461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
8471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
8481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
8501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
8521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
8531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
8541d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer,
8551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 const char *format, va_list argptr)
8561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
8571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
8581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
8591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
860500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
861dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
862500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteVFormatComment : invalid writer!\n");
8631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
864500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
8651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
8671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
8681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
8691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteComment(writer, buf);
8711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
8731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
8741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
8751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
8771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteComment:
8781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
8791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  comment string
8801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
8821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
8841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
8851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
8861d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content)
8871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
8881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
8891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
8901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
892ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlTextWriterStartComment(writer);
8931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
8941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
8951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
896ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
8971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
8981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
8991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
900ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlTextWriterEndComment(writer);
9011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
9021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
9041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
9061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
9071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
9091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartElement:
9101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
9111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
9121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml element.
9141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
9161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
9171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
9181d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name)
9191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
9201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
9211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
9221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
9231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
9241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
9261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
9291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
9301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
9311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
9321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
9331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
9341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
9351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
9361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
9371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NONE:
9381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
9391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
9401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
9411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
9421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
9431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
944ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    if (writer->indent)
945ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                        count =
946ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                            xmlOutputBufferWriteString(writer->out, "\n");
9471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
9481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
949ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                default:
950ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
9511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
9521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
9531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
9541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
9561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
9571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
958dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
9591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
9601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
9621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
9641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
965dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
9661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
9671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
9681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
9701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_NAME;
9711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
9731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
974ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent) {
975ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
976ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
9772cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
9782cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
9791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<");
9801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
9811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
9835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count =
9845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferWriteString(writer->out, (const char *) p->name);
9851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
9861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
9881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
9901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
9911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
9931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartElementNS:
9941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
9951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix or NULL
9961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
9971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI or NULL
9981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml element with namespace support.
10001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
10021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
10031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
10041d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartElementNS(xmlTextWriterPtr writer,
10051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * prefix, const xmlChar * name,
10061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * namespaceURI)
10071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
10081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
10091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
10101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
10111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
10131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = 0;
10161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != 0) {
10171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
10181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
10191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
10211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
10231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartElement(writer, buf);
10241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
10251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
10261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
10281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (namespaceURI != 0) {
10301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(BAD_CAST "xmlns");
10311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (prefix != 0) {
10321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, BAD_CAST ":");
10331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, prefix);
10341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
10351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteAttribute(writer, buf, namespaceURI);
10371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(buf);
10381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
10391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
10401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
10411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
10441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
10451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
10471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndElement:
10481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
10491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element.
10511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
10531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
10541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
10551d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndElement(xmlTextWriterPtr writer)
10561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
10571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
10581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
10591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
10601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
10611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
10631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
10661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
10671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
10701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
10711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
10741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
10751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
10761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
10771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
10781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
10791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
10801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
10811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
1082ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            if (writer->indent) /* next element needs indent */
1083ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                writer->doindent = 1;
10841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "/>");
10851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
10861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
10871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
10881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
10891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_TEXT:
1090ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            if ((writer->indent) && (writer->doindent)) {
1091ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                count = xmlTextWriterWriteIndent(writer);
1092ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                sum += count;
1093ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                writer->doindent = 1;
1094ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            } else
1095ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                writer->doindent = 1;
10961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "</");
10971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
10981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
10991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out,
1101ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                               (const char *) p->name);
11021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
11061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
11101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
11111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
11121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
11131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11142cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (writer->indent) {
1115ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
1116ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
11172cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
11182cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
11191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
11201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
11211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
11221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
11241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterFullEndElement:
11251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
11261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element. Writes an end tag even if the element is empty
11281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
11301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
11311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
11321d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterFullEndElement(xmlTextWriterPtr writer)
11331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
11341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
11351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
11361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
11371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
11381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
11401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
11411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
11431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
11441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
11451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
11471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
11481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
11491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
11511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
11521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
11531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
11541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
11581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
11591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
11601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
11641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_TEXT:
11651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "</");
11661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out,
1170ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                               (const char *) p->name);
11711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
11751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
11761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
11771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
11781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
11791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
11801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
11811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
11821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
11841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
11851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
11861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
11881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatRaw:
11891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
11901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
11911d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
11921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted raw xml text.
11941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
11961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
11971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
11981d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format,
11991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            ...)
12001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
12011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
12021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
12031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
12051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatRaw(writer, format, ap);
12071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
12091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
12101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
12111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
12131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatRaw:
12141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
12151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
12161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
12171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted raw xml text.
12191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
12211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
12221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
12231d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format,
12241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             va_list argptr)
12251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
12261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
12271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
12281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
12301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
12311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
12331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
12341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
12351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteRaw(writer, buf);
12371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
12391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
12401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
12411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
12431e90661bb817402f85103c3b9d3ce6ebab570f38Daniel Veillard * xmlTextWriterWriteRawLen:
12441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
12451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
12461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  length of the text string
12471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml text.
12491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * TODO: what about entities and special chars??
12501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
12521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
12531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
12541d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content,
12551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int len)
12561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
12571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
12581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
12591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
12601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
12611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1262500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
1263dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
1264500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteRawLen : invalid writer!\n");
12651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
1266500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
12671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1268e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((content == NULL) || (len < 0)) {
1269dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
1270500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteRawLen : invalid content!\n");
1271500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
1272500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
12731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1275500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1276500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1277500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1278500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterHandleStateDependencies(writer, p);
1279500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
12801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
1281500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
12821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
12831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1284500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent)
1285500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        writer->doindent = 0;
1286500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
1287500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (content != NULL) {
1288500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count =
1289500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            xmlOutputBufferWrite(writer->out, len, (const char *) content);
1290500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
1291500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
1292500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
1293500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
12941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
12961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
12971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
12991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteRaw:
13001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
13011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
13021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a 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 VeillardxmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content)
13091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content));
13111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatString:
13151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
13161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
13171d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
13181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml text.
13201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
13221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
13231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
13241d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format,
13251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               ...)
13261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
13281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
13291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1330e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (format == NULL))
1331e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard        return -1;
1332e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard
13331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
13341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatString(writer, format, ap);
13361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
13381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
13391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatString:
13431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
13441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
13451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
13461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml text.
13481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
13501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
13511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
13521d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatString(xmlTextWriterPtr writer,
13531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const char *format, va_list argptr)
13541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
13561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
13571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1358e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (format == NULL))
13591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
13601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
13621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
13631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
13641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteString(writer, buf);
13661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
13681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
13691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteString:
13731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
13741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
13751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml text.
13771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
13791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
13801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
13811d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content)
13821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1383500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
13841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
13851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
13861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
1387500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlChar *buf;
13881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1389e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (content == NULL))
13901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
13911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1393500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    buf = (xmlChar *) content;
1394500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1395500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1396500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1397500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
1398500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            switch (p->state) {
1399500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_NAME:
1400500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_TEXT:
140162040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard#if 0
140262040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard                    buf = NULL;
140362040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard		    xmlOutputBufferWriteEscape(writer->out, content, NULL);
140462040be3602d66ce983dcb22017af4ccc5d8276dDaniel Veillard#endif
1405500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    buf = xmlEncodeSpecialChars(NULL, content);
1406500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    break;
1407500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
1408500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    buf = NULL;
1409500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    xmlAttrSerializeTxtContent(writer->out->buffer, NULL,
1410500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                               NULL, content);
1411500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    break;
141287640d5f14e7ce8b9844b886c765af0c56de5ca5William M. Brack		default:
141387640d5f14e7ce8b9844b886c765af0c56de5ca5William M. Brack		    break;
1414500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            }
1415500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
14161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
14171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1418500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (buf != NULL) {
1419500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteRaw(writer, buf);
1420500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
1421500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
1422500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
1423751c9ec657e784bd941802d722632f19f17f17aeDaniel Veillard
1424500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (buf != content)     /* buf was allocated by us, so free it */
1425500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            xmlFree(buf);
1426a9c612c3ee115278fb8dc0cac1b2f2e362f0c052William M. Brack    }
14271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
14291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
14301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
14321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlOutputBufferWriteBase64:
14331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out: the xmlOutputBufferPtr
14341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
14351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
14361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write base64 encoded data to an xmlOutputBuffer.
14381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Adapted from John Walker's base64.c (http://www.fourmilab.ch/).
14391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
14421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
14431d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
14441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const unsigned char *data)
14451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
14461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    static unsigned char dtable[64] =
144747a318840053e03e60acb437f41e63366f44852cWilliam M. Brack            {'A','B','C','D','E','F','G','H','I','J','K','L','M',
144847a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
144947a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     'a','b','c','d','e','f','g','h','i','j','k','l','m',
145047a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     'n','o','p','q','r','s','t','u','v','w','x','y','z',
145147a318840053e03e60acb437f41e63366f44852cWilliam M. Brack	     '0','1','2','3','4','5','6','7','8','9','+','/'};
145247a318840053e03e60acb437f41e63366f44852cWilliam M. Brack
14531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int i;
14541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int linelen;
14551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
14561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
14571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1458e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((out == NULL) || (len < 0) || (data == NULL))
1459e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard        return(-1);
1460e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard
14611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    linelen = 0;
14621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
14631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    i = 0;
14651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while (1) {
14661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        unsigned char igroup[3];
14671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        unsigned char ogroup[4];
14681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        int c;
14691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        int n;
14701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        igroup[0] = igroup[1] = igroup[2] = 0;
14721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        for (n = 0; n < 3 && i < len; n++, i++) {
14731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            c = data[i];
14741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            igroup[n] = (unsigned char) c;
14751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
14761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (n > 0) {
14781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[0] = dtable[igroup[0] >> 2];
14791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
14801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[2] =
14811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
14821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[3] = dtable[igroup[2] & 0x3F];
14831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (n < 3) {
14851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                ogroup[3] = '=';
14861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (n < 2) {
14871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    ogroup[2] = '=';
14881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                }
14891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
14901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (linelen >= B64LINELEN) {
14921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlOutputBufferWrite(out, 2, B64CRLF);
14931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count == -1)
14941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
14951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
14961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                linelen = 0;
14971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
14981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(out, 4, (const char *) ogroup);
14991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count == -1)
15001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
15011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
15021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            linelen += 4;
15041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
1505929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard
1506929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard        if (i >= len)
1507929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard            break;
15081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
15091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
15111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
15121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
15141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteBase64:
15151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer: the xmlTextWriterPtr
15161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
15171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @start:  the position within the data of the first byte to encode
15181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
15191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
15201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an base64 encoded xml text.
15211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
15221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
15231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
15241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
1525ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data,
15261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int start, int len)
15271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
15281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
15291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
15301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
15311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
15321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1533e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
15341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
15351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1537500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1538500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1539500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1540500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
1541500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlTextWriterHandleStateDependencies(writer, p);
15421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
15431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
15441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
1545500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
15461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
15471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1548ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent)
1549ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        writer->doindent = 0;
1550ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
15511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
15521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferWriteBase64(writer->out, len,
15531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   (unsigned char *) data + start);
15541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
15551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
15561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
15571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
15591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
15601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
15621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlOutputBufferWriteBinHex:
15631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out: the xmlOutputBufferPtr
15641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
15651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
15661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
15671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write hqx encoded data to an xmlOutputBuffer.
15681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * ::todo
15691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
157047a318840053e03e60acb437f41e63366f44852cWilliam M. Brack * Returns the bytes written (may be 0 because of buffering)
157147a318840053e03e60acb437f41e63366f44852cWilliam M. Brack * or -1 in case of error
15721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
15731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
1574ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlOutputBufferWriteBinHex(xmlOutputBufferPtr out,
1575ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                           int len, const unsigned char *data)
15761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1577ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int count;
1578ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int sum;
157947a318840053e03e60acb437f41e63366f44852cWilliam M. Brack    static char hex[16] =
158047a318840053e03e60acb437f41e63366f44852cWilliam M. Brack    	{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
1581ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int i;
1582ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
1583e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((out == NULL) || (data == NULL) || (len < 0)) {
1584ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
1585ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
1586ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
1587ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    sum = 0;
1588ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    for (i = 0; i < len; i++) {
1589ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count =
1590ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            xmlOutputBufferWrite(out, 1,
1591ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                 (const char *) &hex[data[i] >> 4]);
1592ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count == -1)
1593ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
1594ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
1595ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        count =
1596ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            xmlOutputBufferWrite(out, 1,
1597ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                 (const char *) &hex[data[i] & 0xF]);
1598ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (count == -1)
1599ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return -1;
1600ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        sum += count;
1601ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
1602ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
1603ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return sum;
16041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
16051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
16071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteBinHex:
16081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer: the xmlTextWriterPtr
16091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
16101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @start:  the position within the data of the first byte to encode
16111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
16121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a BinHex encoded xml text.
16141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
16161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
16171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
1618ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data,
16191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int start, int len)
16201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
16211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
16221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
16231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
16241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
16251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1626e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
16271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
1630500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
1631500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
1632500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
1633500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
1634500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlTextWriterHandleStateDependencies(writer, p);
16351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
16361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
16371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
1638500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
16391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
16401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1641ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->indent)
1642ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        writer->doindent = 0;
1643ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
16441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
16451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferWriteBinHex(writer->out, len,
16461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   (unsigned char *) data + start);
16471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
16481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
16501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
16521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
16531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
16551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartAttribute:
16561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
16571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
16581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml attribute.
16601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
16621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
16631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
16641d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name)
16651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
16661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
16671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
16681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
16691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
16701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
16721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
16751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
16761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
16771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
16801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
16811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
16841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
16851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
16861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
16871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
16881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
16891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
16901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
16911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " ");
16921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
16931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
16941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
16955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            count =
16965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                xmlOutputBufferWriteString(writer->out,
16975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                           (const char *) name);
16981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
16991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "=");
17021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
17061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
17071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
17081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
17091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_ATTRIBUTE;
17101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
17111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
17121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
17131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
17141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
17161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
17171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
17191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartAttributeNS:
17201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
17211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix or NULL
17221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
17231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI or NULL
17241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml attribute with namespace support.
17261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
17301d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartAttributeNS(xmlTextWriterPtr writer,
17311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * prefix, const xmlChar * name,
17321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * namespaceURI)
17331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
17341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
17351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
17361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
17371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p;
17381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
17401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = 0;
17431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != 0) {
17441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
17451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
17461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
17471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
17481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
17501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartAttribute(writer, buf);
17511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
17521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
17531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
17551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (namespaceURI != 0) {
17571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(BAD_CAST "xmlns");
17581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (prefix != 0) {
17591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, BAD_CAST ":");
17601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, prefix);
17611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
17621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterNsStackEntry *)
17641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
17651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p == 0) {
1766dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
17671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartAttributeNS : out of memory!\n");
17681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
17691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
17701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p->prefix = buf;
17721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p->uri = xmlStrdup(namespaceURI);
17731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p->uri == 0) {
1774dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
17751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartAttributeNS : out of memory!\n");
17761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlFree(p);
17771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
17781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
17791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p->elem = xmlListFront(writer->nodes);
17801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListPushFront(writer->nsstack, p);
17821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
17831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
17851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
17861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
17881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndAttribute:
17891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
17901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element.
17921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
17961d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndAttribute(xmlTextWriterPtr writer)
17971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
17981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
17991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
18001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
18011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
18021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *np;
18031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
18051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
18061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
18081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
18091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nsstack);
1810e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard	writer->nsstack = NULL;
18111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
18121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
18131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
18151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
18161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nsstack);
1817e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard	writer->nsstack = NULL;
18181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
18191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
18201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
18221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
18231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
18241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_NAME;
18251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
18271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0) {
18281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                xmlListDelete(writer->nsstack);
1829e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard		writer->nsstack = NULL;
18301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
18311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
18321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
18331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            while (!xmlListEmpty(writer->nsstack)) {
18351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                lk = xmlListFront(writer->nsstack);
18361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
18371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (np != 0) {
18381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count =
18391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        xmlTextWriterWriteAttribute(writer, np->prefix,
18401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                    np->uri);
18411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0) {
18421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        xmlListDelete(writer->nsstack);
1843e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard			writer->nsstack = NULL;
18441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
18451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    }
18461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
18471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                }
18481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                xmlListPopFront(writer->nsstack);
18501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
18511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
18521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
18541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlListClear(writer->nsstack);
18551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
18561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
18571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
18591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
18601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
18621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatAttribute:
18631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
18641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
18651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
18661d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
18671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.
18691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
18711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
18721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
18731d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer,
18741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * name, const char *format,
18751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  ...)
18761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
18771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
18781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
18791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
18811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap);
18831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
18851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
18861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
18871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
18891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatAttribute:
18901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
18911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
18921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
18931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
18941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.
18961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
18981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
18991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19001d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer,
19011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
19021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, va_list argptr)
19031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
19051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
19061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
19081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
19111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
19121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
19131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteAttribute(writer, name, buf);
19151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
19171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
19181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteAttribute:
19221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
19241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  attribute content
19251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml attribute.
19271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19311d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name,
19321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
19331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
19351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
19361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
19381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartAttribute(writer, name);
19391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
19401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
19421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
19431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
19441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
19461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndAttribute(writer);
19471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
19481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
19501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
19521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatAttributeNS:
19561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
19581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
19591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
19601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
19611d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
19621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.with namespace support
19641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19681d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer,
19691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * prefix,
19701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
19711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * namespaceURI,
19721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, ...)
19731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
19751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
19761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
19781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatAttributeNS(writer, prefix, name,
19801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                              namespaceURI, format, ap);
19811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
19831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
19841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatAttributeNS:
19881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
19901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
19911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
19921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
19931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
19941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.with namespace support
19961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20001d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer,
20011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * prefix,
20021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * name,
20031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * namespaceURI,
20041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const char *format, va_list argptr)
20051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
20071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
20081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
20101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
20131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
20141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
20151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteAttributeNS(writer, prefix, name, namespaceURI,
20171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                       buf);
20181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
20201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
20211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteAttributeNS:
20251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
20271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
20281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
20291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  attribute content
20301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml attribute.
20321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
20351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20361d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer,
20371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * prefix, const xmlChar * name,
20381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * namespaceURI,
20391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * content)
20401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
20421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
20431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
20441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
20461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = 0;
20491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != NULL) {
20501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
20511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
20521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
20531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
20541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
20561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteAttribute(writer, buf, content);
20571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
20581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
20591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
20611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (namespaceURI != NULL) {
20631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = 0;
20641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(BAD_CAST "xmlns");
20651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (prefix != NULL) {
20661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, BAD_CAST ":");
20671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, prefix);
20681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
20691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteAttribute(writer, buf, namespaceURI);
20701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(buf);
20711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
20721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
20731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
20741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
20751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
20761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatElement:
20801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
20821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
20831d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
20841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element.
20861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
20891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20901d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatElement(xmlTextWriterPtr writer,
20911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const xmlChar * name, const char *format,
20921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                ...)
20931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
20951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
20961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
20981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatElement(writer, name, format, ap);
21001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
21021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
21031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatElement:
21071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
21091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
21101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
21111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element.
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 VeillardxmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer,
21181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 const xmlChar * name, const char *format,
21191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 va_list argptr)
21201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
21221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
21231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
21251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
21281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
21291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
21301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteElement(writer, name, buf);
21321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
21341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
21351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteElement:
21391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
21411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  element content
21421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml element.
21441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
21461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
21471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
21481d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name,
21491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                          const xmlChar * content)
21501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
21521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
21531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
21551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartElement(writer, name);
21561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
21571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
21591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
21601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
21611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
21631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndElement(writer);
21641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
21651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
21671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
21691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatElementNS:
21731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
21751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
21761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
21771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
21781d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
21791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element with namespace support.
21811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
21831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
21841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
21851d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer,
21861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * prefix,
21871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * name,
21881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * namespaceURI,
21891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const char *format, ...)
21901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
21921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
21931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
21951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatElementNS(writer, prefix, name,
21971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                            namespaceURI, format, ap);
21981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
22001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
22011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatElementNS:
22051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
22071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
22081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
22091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
22101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
22111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element with namespace support.
22131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22171d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer,
22181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * prefix,
22191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
22201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * namespaceURI,
22211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, va_list argptr)
22221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
22241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
22251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
22271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
22301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
22311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
22321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteElementNS(writer, prefix, name, namespaceURI,
22341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     buf);
22351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
22371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
22381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteElementNS:
22421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
22441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
22451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
22461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  element content
22471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml element with namespace support.
22491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22531d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteElementNS(xmlTextWriterPtr writer,
22541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * prefix, const xmlChar * name,
22551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * namespaceURI,
22561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
22571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
22591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
22601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
22621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
22651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
22661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI);
22671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
22681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
22701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
22711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
22721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
22741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndElement(writer);
22751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
22761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
22781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
22801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartPI:
22841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
22861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml PI.
22881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22921d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target)
22931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
22951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
22961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
22971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
22981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (target == NULL) || (*target == '\0'))
23001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (xmlStrcasecmp(target, (const xmlChar *) "xml") == 0) {
2303dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
23041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : target name [Xx][Mm][Ll] is reserved for xml standardization!\n");
23051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
23071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
23091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
23101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
23111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
23121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
23131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
23141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
23151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlTextWriterEndAttribute(writer);
23161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
23171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
23181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
23191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    /* fallthrough */
23201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
23211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
23221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
23231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
23241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
23251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
23261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
2327ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_NONE:
2328ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_TEXT:
2329ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                case XML_TEXTWRITER_DTD:
2330ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                    break;
23311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
23321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
2333dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
23341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    "xmlTextWriterStartPI : nested PI!\n");
23351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
23361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                default:
23371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
23381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
23391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
23401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
23411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
23431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
23441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
2345dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
23461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : out of memory!\n");
23471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
23491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(target);
23511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
2352dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
23531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : out of memory!\n");
23541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
23551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
23571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_PI;
23581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
23601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<?");
23621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
23631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count =
23665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferWriteString(writer->out, (const char *) p->name);
23671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
23681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
23721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
23731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
23751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndPI:
23761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
23771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml PI.
23791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
23811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
23821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
23831d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndPI(xmlTextWriterPtr writer)
23841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
23851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
23861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
23871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
23881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
23891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
23911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
23941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
23951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
23961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
23981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
23991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
24001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
24021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
24031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI:
24041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI_TEXT:
24051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "?>");
24061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
24071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
24081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
24091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
24101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
24111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
24121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
24151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
24161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
24171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
24191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatPI:
24201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
24211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
24221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
24231d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
24241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted PI.
24261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
24281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
24291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
24301d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target,
24311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const char *format, ...)
24321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
24331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
24341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
24351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
24371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatPI(writer, target, format, ap);
24391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
24411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
24421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
24431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
24451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatPI:
24461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
24471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
24481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
24495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
24501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml PI.
24521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
24541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
24551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
24561d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer,
24571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * target, const char *format,
24581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            va_list argptr)
24591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
24601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
24611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
24621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
24641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
24671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
24681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
24691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWritePI(writer, target, buf);
24711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
24731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
24741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
24751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
24771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWritePI:
24781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
24791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
24801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  PI content
24811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml PI.
24831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
24851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
24861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
24871d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target,
24881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                     const xmlChar * content)
24891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
24901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
24911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
24921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
24941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartPI(writer, target);
24951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
24961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
24981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content != 0) {
24991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, content);
25001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
25011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
25021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
25031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndPI(writer);
25051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
25061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
25081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
25101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartCDATA:
25141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml CDATA section.
25171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
25201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
25211d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartCDATA(xmlTextWriterPtr writer)
25221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
25241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
25251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
25261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
25271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
25291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
25321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
25331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
25341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
25351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
25361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
25371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NONE:
25381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
25391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
25401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
25411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
25421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlTextWriterEndAttribute(writer);
25431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
25441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
25451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
25461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    /* fallthrough */
25471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
25481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
25491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
25501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
25511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
25521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
25531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
25541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_CDATA:
2555dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                    xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
25561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    "xmlTextWriterStartCDATA : CDATA not allowed in this context!\n");
25571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
25581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                default:
25591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
25601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
25611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
25621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
25651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
25661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
2567dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
25681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartCDATA : out of memory!\n");
25691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = 0;
25731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_CDATA;
25741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
25761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<![CDATA[");
25781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
25791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
25811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
25831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndCDATA:
25871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml CDATA section.
25901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
25931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
25941d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndCDATA(xmlTextWriterPtr writer)
25951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
25971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
25981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
25991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
26001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
26021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
26051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
26061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
26091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
26101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
26131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
26141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_CDATA:
26151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "]]>");
26161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
26171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
26181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
26191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
26201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
26211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
26221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
26231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
26251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
26261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
26271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
26291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatCDATA:
26301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
26311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
26321d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
26331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml CDATA.
26351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
26371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
26381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
26391d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format,
26401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              ...)
26411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
26421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
26431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
26441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
26461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatCDATA(writer, format, ap);
26481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
26501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
26511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
26521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
26541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatCDATA:
26551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
26561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
26575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
26581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml CDATA.
26601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
26621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
26631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
26641d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format,
26651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               va_list argptr)
26661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
26671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
26681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
26691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
26711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
26741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
26751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
26761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteCDATA(writer, buf);
26781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
26801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
26811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
26821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
26841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteCDATA:
26851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
26861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  CDATA content
26871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml CDATA.
26891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
26911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
26921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
26931d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content)
26941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
26951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
26961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
26971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
26991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartCDATA(writer);
27001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
27011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
27031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content != 0) {
27041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, content);
27051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
27061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
27071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
27081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
27091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndCDATA(writer);
27101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
27111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
27131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
27151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartDTD:
27191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
27211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
27221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
27231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml DTD.
27251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
27281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
27291d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTD(xmlTextWriterPtr writer,
27301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * name,
27311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * pubid, const xmlChar * sysid)
27321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
27341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
27351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
27361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
27371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
27391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
27421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
2743ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
2744dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
27451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : DTD allowed only in prolog!\n");
27461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
27481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
27501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
27511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
2752dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
27531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : out of memory!\n");
27541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
27561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
27581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
2759dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
27601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : out of memory!\n");
27611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
27621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
27641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD;
27651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
27671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!DOCTYPE ");
27691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
27701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
27721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
27731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
27741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
27761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
27781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (sysid == 0) {
2779dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
27801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartDTD : system identifier needed!\n");
27811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
27821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
27831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2784500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (writer->indent)
2785500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, "\n");
2786500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        else
2787500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, " ");
2788500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
2789500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
2790500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
2791500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
2792500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "PUBLIC ");
2793500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
2794500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
2795500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
2796500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
2797500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
27981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
27991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
28035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
28041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
28051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2808500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
28091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
28101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
28151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
2816500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (writer->indent)
2817500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWrite(writer->out, 1, "\n");
2818500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            else
2819500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWrite(writer->out, 1, " ");
2820500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
2821500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
2822500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
2823500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "SYSTEM ");
2824500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
2825500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
2826500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
2827500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        } else if (writer->indent) {
2828500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "\n       ");
28291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
28301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
28311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
28321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
28331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2834500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
28351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
28361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
28405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
28411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
28421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2845500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
28461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
28471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
28521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
28531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
28551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndDTD:
28561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
28571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
28581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml DTD.
28591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
28601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
28611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
28621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
28631d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndDTD(xmlTextWriterPtr writer)
28641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
2865500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int loop;
28661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
28671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
28681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
28691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
28701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
28721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
2875500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    loop = 1;
2876500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    while (loop) {
2877500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        lk = xmlListFront(writer->nodes);
2878500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (lk == NULL)
2879500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
2880500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
2881500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p == 0)
2882500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
2883500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
2884500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
2885500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, "]");
2886500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
2887500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
2888500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
2889500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
2890500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
2891500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, ">");
28921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2893500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
2894500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
2895500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
2896500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
2897500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
2898500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
28991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2900500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                xmlListPopFront(writer->nodes);
2901500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
2902500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM:
2903500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM_TEXT:
2904500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndDTDElement(writer);
2905500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
2906500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL:
2907500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL_TEXT:
2908500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndDTDAttlist(writer);
2909500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
2910500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY:
2911500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_PENT:
2912500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY_TEXT:
2913500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndDTDEntity(writer);
2914500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
2915500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_COMMENT:
2916500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlTextWriterEndComment(writer);
2917500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
2918500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
2919500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                loop = 0;
2920500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                continue;
2921500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
2922500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
2923500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
29241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
2925500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
29261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
29271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
29291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
29301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
29321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatDTD:
29331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
29341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
29351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
29361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
29371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
29381d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
29391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
29401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD with a formatted markup declarations part.
29411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
29421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
29431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
29441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
29451d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer,
29461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * name,
29471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * pubid,
29481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * sysid, const char *format, ...)
29491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
29501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
29511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
29521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
29541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTD(writer, name, pubid, sysid, format,
29561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      ap);
29571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
29591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
29601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
29611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
29631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatDTD:
29641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
29651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
29661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
29671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
29681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
29695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
29701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
29711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD with a formatted markup declarations part.
29721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
29731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
29741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
29751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
29761d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer,
29771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name,
29781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * pubid,
29791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * sysid,
29801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const char *format, va_list argptr)
29811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
29821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
29831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
29841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
29861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
29871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
29891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
29901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
29911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTD(writer, name, pubid, sysid, buf);
29931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
29951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
29961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
29971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
29991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteDTD:
30001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
30011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
30021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
30031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
3004b1d531659b2bee47492ca1c319180116eaaf566eWilliam M. Brack * @subset:  string content of the DTD
30051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD.
30071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
30081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
30091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
30101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
30111d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTD(xmlTextWriterPtr writer,
30121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * name,
30131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * pubid,
30141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * sysid, const xmlChar * subset)
30151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
30161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
30171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
30181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
30201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTD(writer, name, pubid, sysid);
30211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
30221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
30241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (subset != 0) {
30251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, subset);
30261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
30271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
30281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
30291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTD(writer);
30311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
30321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
30341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
30361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
30371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
30395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDElement:
30405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
30415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
30425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
30435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD element.
30445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
30455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
30465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
30471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
30481d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name)
30491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
30501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
30511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
30521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
30531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
30541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
30561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
30591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
30601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
30611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3065500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
3066500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
3067500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
3068500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, " [");
3069500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
3070500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
3071500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
3072500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
3073500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
3074500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
3075500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
3076500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3077500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
3078500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
3079500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
3080500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
3081500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_NONE:
3082500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3083500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
30841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
3085500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
30861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
30891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
30901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
3091dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
30921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
30931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
30971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
3098dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
30991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
31001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
31011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
31031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD_ELEM;
31041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
31061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3107500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3108500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
3109500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3110500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3111500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3112500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3113500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
31141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ELEMENT ");
31151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
31161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
31191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
31201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
31241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
31251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3127500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterEndDTDElement:
3128500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3129500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3130500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * End an xml DTD element.
3131500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3132500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3133500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3134500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3135500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterEndDTDElement(xmlTextWriterPtr writer)
3136500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3137500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3138500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3139500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3140500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3141500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3142500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
3143500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3144500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3145500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3146500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3147500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0)
3148500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3149500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3150500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3151500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3152500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3153500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3154500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3155500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM:
3156500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM_TEXT:
3157500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
3158500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3159500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3160500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3161500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3162500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3163500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3164500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3165500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3166500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3167500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
3168500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3169500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3170500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3171500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3172500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3173500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlListPopFront(writer->nodes);
3174500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3175500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3176500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3177500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
31785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDElement:
31795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
31805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
31815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
31821d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
31835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD element.
31855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
31875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
31881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
31891d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer,
31901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
31911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, ...)
31921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
31931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
31941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
31951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
31971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDElement(writer, name, format, ap);
31991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
32011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
32021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
32031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
32055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDElement:
32065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
32075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
32085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
32095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
32105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD element.
32125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
32145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
32151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
32161d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer,
32171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
32181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, va_list argptr)
32191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
32201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
32211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
32221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
32241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
32271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
32281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
32291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDElement(writer, name, buf);
32311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
32331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
32341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
32351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
32375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDElement:
32385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
32395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
32405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the element
32415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD element.
32435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
32455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
32461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
32471d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDElement(xmlTextWriterPtr writer,
32481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name, const xmlChar * content)
32491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
32501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
32511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
32521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content == NULL)
32541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
32571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDElement(writer, name);
32581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
32591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
32611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
32631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
32641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
32661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDElement(writer);
32681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
32691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
32711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
32731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
32741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
32765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDAttlist:
32775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
32785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
32795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD ATTLIST.
32815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
32835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
32841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
32851d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name)
32861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
32871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
32881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
32891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
32901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
32911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
32931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
32961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
32971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
32981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
33001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3302500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
3303500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
3304500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
3305500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, " [");
3306500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
3307500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
3308500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
3309500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
3310500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
3311500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
3312500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
3313500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3314500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
3315500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
3316500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
3317500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
3318500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_NONE:
3319500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
3320500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
33211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
3322500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
33231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
33241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
33261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
33271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
3328dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
33291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDAttlist : out of memory!\n");
33301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
33321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
33341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
3335dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
33361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDAttlist : out of memory!\n");
33371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
33381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
33401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD_ATTL;
33411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
33431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3344500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3345500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
3346500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3347500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3348500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3349500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3350500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
33511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ATTLIST ");
33521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
33531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
3355ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
33561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
33571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
33591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
33611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
33621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3364500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterEndDTDAttlist:
3365500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3366500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3367500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * End an xml DTD attribute list.
3368500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3369500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3370500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3371500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3372500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer)
3373500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3374500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3375500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3376500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3377500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3378500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3379500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
3380500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3381500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3382500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3383500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3384500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0)
3385500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3386500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3387500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3388500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3389500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3390500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3391500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3392500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL:
3393500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL_TEXT:
3394500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
3395500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3396500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3397500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3398500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3399500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3400500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3401500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3402500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3403500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3404500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
3405500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3406500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3407500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3408500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3409500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3410500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlListPopFront(writer->nodes);
3411500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3412500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3413500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3414500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
34155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDAttlist:
34165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
34175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
34185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
34191d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
34205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
34215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD ATTLIST.
34225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
34235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
34245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
34251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
34261d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer,
34271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
34281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, ...)
34291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
34301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
34311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
34321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
34341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDAttlist(writer, name, format, ap);
34361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
34381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
34391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
34401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
34425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDAttlist:
34435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
34445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
34455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
34465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
34475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
34485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD ATTLIST.
34495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
34505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
34515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
34521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
34531d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer,
34541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
34551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, va_list argptr)
34561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
34571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
34581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
34591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
34611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
34641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
34651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
34661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDAttlist(writer, name, buf);
34681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
34701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
34711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
34721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
34745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDAttlist:
34755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
34765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
34775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the ATTLIST
34785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
34795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD ATTLIST.
34805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
34815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
34825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
34831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
34841d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer,
34851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name, const xmlChar * content)
34861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
34871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
34881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
34891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content == NULL)
34911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
34941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDAttlist(writer, name);
34951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
34961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
35001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
35011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
35031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDAttlist(writer);
35051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
35061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
35081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
35101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
35111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
35135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDEntity:
35145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
35155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
35165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
35175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD ATTLIST.
35195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
35215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
35221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
35231d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDEntity(xmlTextWriterPtr writer,
35241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            int pe, const xmlChar * name)
35251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
35261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
35271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
35281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
35291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
35301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
35321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
35351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
3536500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk != 0) {
35371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3538500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3539500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (p != 0) {
3540500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            switch (p->state) {
3541500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_DTD:
3542500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, " [");
3543500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
3544500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
3545500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
3546500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (writer->indent) {
3547500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        count =
3548500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            xmlOutputBufferWriteString(writer->out, "\n");
3549500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        if (count < 0)
3550500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            return -1;
3551500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        sum += count;
3552500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    }
3553500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    p->state = XML_TEXTWRITER_DTD_TEXT;
3554500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    /* fallthrough */
3555500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_DTD_TEXT:
3556500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                case XML_TEXTWRITER_NONE:
3557500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    break;
3558500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                default:
3559500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
3560500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            }
3561500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
35621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
35631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
35651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
35661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
3567dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
35681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
35691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
35711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
35731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
3574dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
35751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
35761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
35771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
3579500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3580500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (pe != 0)
3581500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p->state = XML_TEXTWRITER_DTD_PENT;
3582500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    else
3583500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        p->state = XML_TEXTWRITER_DTD_ENTY;
35841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
35861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3587500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3588500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
3589500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3590500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3591500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3592500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3593500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
35941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ENTITY ");
35951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
35961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
35981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pe != 0) {
3600500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "% ");
36011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
36051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3606ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
36071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
36081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
36101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
36121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
36131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3615500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterEndDTDEntity:
3616500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3617500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3618500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * End an xml DTD entity.
3619500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3620500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3621500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3622500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3623500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterEndDTDEntity(xmlTextWriterPtr writer)
3624500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3625500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3626500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3627500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3628500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3629500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3630500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
3631500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3632500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3633500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3634500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3635500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0)
3636500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3637500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3638500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3639500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3640500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3641500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3642500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3643500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY_TEXT:
3644500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
3645500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3646500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3647500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3648500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY:
3649500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_PENT:
3650500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
3651500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (count < 0)
3652500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3653500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            sum += count;
3654500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3655500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3656500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3657500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3658500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3659500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
3660500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\n");
3661500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
3662500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3663500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
3664500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3665500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3666500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlListPopFront(writer->nodes);
3667500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3668500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3669500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3670500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
36715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDInternalEntity:
36725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
36735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
36745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
36755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
36761d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
36775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
36785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD internal entity.
36795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
36805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
36815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
36821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
36831d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer,
36841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          int pe,
36851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          const xmlChar * name,
36861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          const char *format, ...)
36871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
36881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
36891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
36901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
36921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDInternalEntity(writer, pe, name,
36941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                    format, ap);
36951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
36971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
36981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
36991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
37015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDInternalEntity:
37025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
37035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
37045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
37055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
37065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
37075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD internal entity.
37095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
37115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
37121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
37131d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer,
37141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           int pe,
37151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           const xmlChar * name,
37161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           const char *format,
37171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           va_list argptr)
37181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
37191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
37201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
37211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
37231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
37241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
37261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
37271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
37281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDInternalEntity(writer, pe, name, buf);
37301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
37321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
37331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
37341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
37365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDEntity:
37375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
37385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
37395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
37405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
37415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
37425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ndataid:  the xml notation name.
37435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the entity
37445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD entity.
37465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
37485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
37491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
37501d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer,
37511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            int pe,
37521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * name,
37531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * pubid,
37541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * sysid,
37551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * ndataid,
37561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
37571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
3758500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if ((content == NULL) && (pubid == NULL) && (sysid == NULL))
37591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
37601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((pe != 0) && (ndataid != NULL))
37611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
37621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3763500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if ((pubid == NULL) && (sysid == NULL))
37641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return xmlTextWriterWriteDTDInternalEntity(writer, pe, name,
37651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                   content);
37661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlTextWriterWriteDTDExternalEntity(writer, pe, name, pubid,
37681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                               sysid, ndataid);
37691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
37701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
37725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDInternalEntity:
37735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
37745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
37755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
37765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the entity
37775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD internal entity.
37795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
37805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
37815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
37821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
37831d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer,
37841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    int pe,
37851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
37861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * content)
37871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
37881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
37891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
37901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((name == NULL) || (*name == '\0') || (content == NULL))
37921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
37931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
37951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDEntity(writer, pe, name);
37961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
37971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
37981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
37991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
38011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
38021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
38041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDEntity(writer);
38061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
38071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
38091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
38111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
38145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDExternalEntity:
38155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
38165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
38175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
38185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
38195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
38205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ndataid:  the xml notation name.
38215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3822500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity
38235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
38255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
38261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
38271d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer,
38281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    int pe,
38291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
38301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * pubid,
38311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * sysid,
38321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * ndataid)
38331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
38341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
38351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
38361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3837500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (((pubid == NULL) && (sysid == NULL)))
38381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((pe != 0) && (ndataid != NULL))
38401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
38431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDEntity(writer, pe, name);
38441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
38451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
38461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
38471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3848500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    count =
3849500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        xmlTextWriterWriteDTDExternalEntityContents(writer, pubid, sysid,
3850500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                                    ndataid);
3851500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (count < 0)
3852500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3853500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum += count;
3854500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3855500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    count = xmlTextWriterEndDTDEntity(writer);
3856500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (count == -1)
3857500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3858500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum += count;
3859500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3860500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
3861500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
3862500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3863500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
3864500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterWriteDTDExternalEntityContents:
3865500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
3866500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
3867500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
3868500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @ndataid:  the xml notation name.
3869500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3870500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Write the contents of a DTD external entity.
3871500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
3872500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3873500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
3874500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardint
3875500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer,
3876500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                            const xmlChar * pubid,
3877500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                            const xmlChar * sysid,
3878500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                            const xmlChar * ndataid)
3879500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
3880500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
3881500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
3882500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlLinkPtr lk;
3883500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    xmlTextWriterStackEntry *p;
3884500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3885500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL) {
3886dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3887500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteDTDExternalEntityContents: xmlTextWriterPtr invalid!\n");
3888500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3889500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3890500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3891500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
3892500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    lk = xmlListFront(writer->nodes);
3893500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (lk == 0) {
3894dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3895500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
3896500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3897500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3898500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3899500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
3900500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == 0)
3901500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
3902500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
3903500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    switch (p->state) {
3904500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY:
3905500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3906500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        case XML_TEXTWRITER_DTD_PENT:
3907500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            if (ndataid != NULL) {
3908dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard                xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3909500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                "xmlTextWriterWriteDTDExternalEntityContents: notation not allowed with parameter entities!\n");
3910500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                return -1;
3911500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            }
3912500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            break;
3913500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        default:
3914dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3915500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
3916500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
3917500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
3918500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
39191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
39201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (sysid == 0) {
3921dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
3922500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                            "xmlTextWriterWriteDTDExternalEntityContents: system identifier needed!\n");
39231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
39251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
39271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
39321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
39375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
39381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
39431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
39471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
39491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
39501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
39511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
39521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
39531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
39541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
39551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " ");
39571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
39621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
39675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
39681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
39731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
39771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ndataid != NULL) {
39791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " NDATA ");
39801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
39855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out,
39865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                       (const char *) ndataid);
39871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
39881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
39891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
39901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
39911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
39931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
39941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
39965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDNotation:
39975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
39985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the xml notation
39995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
40005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
40015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
40025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD entity.
40035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
40045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
40055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
40061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
40071d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer,
40081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * name,
40091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * pubid, const xmlChar * sysid)
40101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
40111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
40121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
40131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
40141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
40151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
40171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
40181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
40201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
40211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
40221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
40231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
40241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
4026500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
4027500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
4028500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
4029500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                count = xmlOutputBufferWriteString(writer->out, " [");
4030500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (count < 0)
4031500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    return -1;
4032500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                sum += count;
4033500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                if (writer->indent) {
4034500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, "\n");
4035500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    if (count < 0)
4036500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                        return -1;
4037500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                    sum += count;
4038500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                }
4039500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
4040500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                /* fallthrough */
4041500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_TEXT:
4042500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4043500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
40441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
4045500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
4046500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4047500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4048500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer->indent) {
4049500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlTextWriterWriteIndent(writer);
4050500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
40511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4052500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
40531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
40541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!NOTATION ");
40561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
40571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
40581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
40591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
40601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
40611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
40621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
40631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
40651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
40661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
40745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
40751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
40831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
40841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
40851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
40861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
40871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
40881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
40891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
40901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
40911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " ");
40921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
40961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
40971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
40981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
40995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
41005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
41011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
41051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
41061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
41071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
41081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
41091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, ">");
41111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
41121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
41141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
41161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
41171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
41191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterFlush:
41201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
41211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
41221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Flush the output buffer.
41231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
41241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
41251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
41261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
41271d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterFlush(xmlTextWriterPtr writer)
41281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
41291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
41301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
41321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out == NULL)
41351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = 0;
41361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    else
41371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferFlush(writer->out);
41381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return count;
41401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
41411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
41431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * misc
41441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
41451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
41471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriterStackEntry:
41481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @lk:  the xmlLinkPtr
41491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
41501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Free callback for the xmlList.
41511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
41521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void
41531d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriterStackEntry(xmlLinkPtr lk)
41541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
41551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
41561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
41581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
41591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
41601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name != 0)
41621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->name);
41631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(p);
41641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
41651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
41671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlCmpTextWriterStackEntry:
41681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data0:  the first data
41691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data1:  the second data
41701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
41711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Compare callback for the xmlList.
41721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
41731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
41741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
41751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
41761d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlCmpTextWriterStackEntry(const void *data0, const void *data1)
41771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
41781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p0;
41791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p1;
41801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == data1)
41821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
41831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == 0)
41851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
41861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data1 == 0)
41881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 1;
41891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p0 = (xmlTextWriterStackEntry *) data0;
41911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p1 = (xmlTextWriterStackEntry *) data1;
41921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlStrcmp(p0->name, p1->name);
41941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
41951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
41961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
41971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * misc
41981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
41991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriterNsStackEntry:
42021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @lk:  the xmlLinkPtr
42031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Free callback for the xmlList.
42051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void
42071d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriterNsStackEntry(xmlLinkPtr lk)
42081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p;
42101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
42121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
42131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
42141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->prefix != 0)
42161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->prefix);
42171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->uri != 0)
42181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->uri);
42191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(p);
42211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlCmpTextWriterNsStackEntry:
42251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data0:  the first data
42261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data1:  the second data
42271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Compare callback for the xmlList.
42291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
42311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
42331d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlCmpTextWriterNsStackEntry(const void *data0, const void *data1)
42341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p0;
42361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p1;
42371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
42381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == data1)
42401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
42411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == 0)
42431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
42441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data1 == 0)
42461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 1;
42471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p0 = (xmlTextWriterNsStackEntry *) data0;
42491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p1 = (xmlTextWriterNsStackEntry *) data1;
42501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlStrcmp(p0->prefix, p1->prefix);
42521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (rc == 0)
42541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        rc = p0->elem == p1->elem;
42551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
42571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteMemCallback:
42611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @context:  the xmlBufferPtr
42621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @str:  the data to write
42631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the length of the data
42641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write callback for the xmlOutputBuffer with target xmlBuffer
42661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
42681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
42701d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteMemCallback(void *context, const xmlChar * str, int len)
42711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlBufferPtr buf = (xmlBufferPtr) context;
42731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlBufferAdd(buf, str, len);
42751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return len;
42771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterCloseMemCallback:
42811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @context:  the xmlBufferPtr
42821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Close callback for the xmlOutputBuffer with target xmlBuffer
42841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
42851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
42861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
42871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
42881d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterCloseMemCallback(void *context ATTRIBUTE_UNUSED)
42891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
42901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return 0;
42911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
42921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
42931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
42945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDocCallback:
42955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @context:  the xmlBufferPtr
42965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @str:  the data to write
42975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @len:  the length of the data
42985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
42995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write callback for the xmlOutputBuffer with target xmlBuffer
43005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
43015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns -1, 0, 1
43025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
43035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int
43045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterWriteDocCallback(void *context, const xmlChar * str, int len)
43055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
43065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
43075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    int rc;
43085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
43091d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard    if ((rc = xmlParseChunk(ctxt, (const char *) str, len, 0)) != 0) {
4310dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
43115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlTextWriterWriteDocCallback : XML error %d !\n",
43125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        rc);
43135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
43145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
43155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
43165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return len;
43175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
43185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
43195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
43205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterCloseDocCallback:
43215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @context:  the xmlBufferPtr
43225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
43235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Close callback for the xmlOutputBuffer with target xmlBuffer
43245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
43255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns -1, 0, 1
43265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
43275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int
43285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterCloseDocCallback(void *context)
43295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
43305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
43315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    int rc;
43325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
43335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if ((rc = xmlParseChunk(ctxt, NULL, 0, 1)) != 0) {
4334dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
43355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlTextWriterWriteDocCallback : XML error %d !\n",
43365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        rc);
43375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
43385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
43395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
43405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return 0;
43415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
43425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
43435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
43441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterVSprintf:
43451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  see printf
43461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
43471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
43481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Utility function for formatted output
43491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
43501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns a new xmlChar buffer with the data or NULL on error. This buffer must be freed.
43511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
43521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic xmlChar *
43531d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterVSprintf(const char *format, va_list argptr)
43541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
43551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int size;
43561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
43571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
43581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    size = BUFSIZ;
43601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = (xmlChar *) xmlMalloc(size);
43611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == NULL) {
4362dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
43631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterVSprintf : out of memory!\n");
43641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
43651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
43661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while (((count = vsnprintf((char *) buf, size, format, argptr)) < 0)
43681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard           || (count == size - 1) || (count == size) || (count > size)) {
43691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(buf);
43701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        size += BUFSIZ;
43711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = (xmlChar *) xmlMalloc(size);
43721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (buf == NULL) {
4373dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard            xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
43741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterVSprintf : out of memory!\n");
43751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return NULL;
43761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
43771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
43781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return buf;
43801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
43811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
43825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
43835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDocumentCallback:
43845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ctx: the user data (XML parser context)
43855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
43865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * called at the start of document processing.
43875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
43885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic void
43895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterStartDocumentCallback(void *ctx)
43905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
43915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
43925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlDocPtr doc;
43935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
43945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt->html) {
43955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#ifdef LIBXML_HTML_ENABLED
43965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc == NULL)
43975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
43985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc == NULL) {
43995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
44005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                ctxt->sax->error(ctxt->userData,
44015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                 "SAX.startDocument(): out of memory\n");
44025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->errNo = XML_ERR_NO_MEMORY;
44035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->instate = XML_PARSER_EOF;
44045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->disableSAX = 1;
44055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            return;
44065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        }
44075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#else
4408dd6d300896cfeacbacf7c5bceb5bec2f36790efeDaniel Veillard        xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
44095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "libxml2 built without HTML support\n");
44105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->errNo = XML_ERR_INTERNAL_ERROR;
44115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->instate = XML_PARSER_EOF;
44125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->disableSAX = 1;
44135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return;
44145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#endif
44155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    } else {
44165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        doc = ctxt->myDoc;
44175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (doc == NULL)
44185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            doc = ctxt->myDoc = xmlNewDoc(ctxt->version);
44195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (doc != NULL) {
44205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if (doc->children == NULL) {
44215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                if (ctxt->encoding != NULL)
44225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                    doc->encoding = xmlStrdup(ctxt->encoding);
44235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                else
44245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                    doc->encoding = NULL;
44255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                doc->standalone = ctxt->standalone;
44265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            }
44275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        } else {
44285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
44295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                ctxt->sax->error(ctxt->userData,
44305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                 "SAX.startDocument(): out of memory\n");
44315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->errNo = XML_ERR_NO_MEMORY;
44325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->instate = XML_PARSER_EOF;
44335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->disableSAX = 1;
44345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            return;
44355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        }
44365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
44375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) &&
44385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        (ctxt->input != NULL) && (ctxt->input->filename != NULL)) {
44395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->myDoc->URL =
44405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlCanonicPath((const xmlChar *) ctxt->input->filename);
44415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc->URL == NULL)
44425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->myDoc->URL =
44435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                xmlStrdup((const xmlChar *) ctxt->input->filename);
44445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
44455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
44465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
44472cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
44482cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterSetIndent:
44492cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
44502cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @indent:  do indentation?
44512cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
44522cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Set indentation output. indent = 0 do not indentation. indent > 0 do indentation.
44532cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
44542cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or 0 otherwise.
44552cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard */
44562cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardint
4457ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent)
44582cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard{
4459e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (indent < 0))
4460ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
44612cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4462ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    writer->indent = indent;
4463ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    writer->doindent = 1;
44642cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4465ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return 0;
44662cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
44672cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
44682cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
44692cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterSetIndentString:
44702cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
44712cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @str:  the xmlChar string
44722cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
44732cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Set string indentation.
44742cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
44752cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or 0 otherwise.
44762cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard */
44772cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardint
4478ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str)
44792cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard{
4480e43cc574e49cd8173e157d8c31973f709a4cb7ecDaniel Veillard    if ((writer == NULL) || (!str))
4481ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
44822cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4483ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (writer->ichar != NULL)
4484ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        xmlFree(writer->ichar);
4485ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    writer->ichar = xmlStrdup(str);
4486ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
4487ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (!writer->ichar)
4488ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return -1;
4489ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    else
4490ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return 0;
44912cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
44922cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
44932cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
44942cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterWriteIndent:
44952cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
44962cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
44972cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Write indent string.
44982cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
44992cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or the number of strings written.
4500ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard */
45012cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardstatic int
4502ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel VeillardxmlTextWriterWriteIndent(xmlTextWriterPtr writer)
4503ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard{
4504ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int lksize;
4505ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int i;
4506ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    int ret;
4507ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
4508ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    lksize = xmlListSize(writer->nodes);
4509ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    if (lksize < 1)
4510ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        return (-1);            /* list is empty */
4511ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    for (i = 0; i < (lksize - 1); i++) {
4512ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        ret = xmlOutputBufferWriteString(writer->out,
4513ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard                                         (const char *) writer->ichar);
4514ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard        if (ret == -1)
4515ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard            return (-1);
4516ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    }
4517ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard
4518ab69f366d0a9178749f2f0a888f6167605bf78f2Daniel Veillard    return (lksize - 1);
45192cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
45202cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
4521500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard/**
4522500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * xmlTextWriterHandleStateDependencies:
4523500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @writer:  the xmlTextWriterPtr
4524500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * @p:  the xmlTextWriterStackEntry
4525500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
4526500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Write state dependent strings.
4527500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard *
4528500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard * Returns -1 on error or the number of characters written.
4529500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard */
4530500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillardstatic int
4531500a1de533e2ea03f452844f537bb247b7e43af2Daniel VeillardxmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
4532500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                                     xmlTextWriterStackEntry * p)
4533500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard{
4534500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int count;
4535500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    int sum;
4536500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    char extra[3];
4537500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4538500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (writer == NULL)
4539500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return -1;
4540500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4541500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p == NULL)
4542500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        return 0;
4543500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4544500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    sum = 0;
4545500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    extra[0] = extra[1] = extra[2] = '\0';
4546500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (p != 0) {
4547500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum = 0;
4548500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        switch (p->state) {
4549500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_NAME:
4550500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = '>';
4551500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_TEXT;
4552500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4553500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_PI:
4554500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4555500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_PI_TEXT;
4556500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4557500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD:
4558500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4559500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[1] = '[';
4560500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_TEXT;
4561500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4562500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ELEM:
4563500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4564500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_ELEM_TEXT;
4565500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4566500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ATTL:
4567500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4568500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_ATTL_TEXT;
4569500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4570500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_ENTY:
4571500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            case XML_TEXTWRITER_DTD_PENT:
4572500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[0] = ' ';
4573500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                extra[1] = writer->qchar;
4574500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                p->state = XML_TEXTWRITER_DTD_ENTY_TEXT;
4575500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4576500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            default:
4577500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard                break;
4578500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        }
4579500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4580500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4581500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    if (*extra != '\0') {
4582500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, extra);
4583500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        if (count < 0)
4584500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard            return -1;
4585500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard        sum += count;
4586500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    }
4587500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
4588500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard    return sum;
4589500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard}
4590500a1de533e2ea03f452844f537bb247b7e43af2Daniel Veillard
45911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#endif
4592