xmlwriter.c revision 20c5e7878d462bfd93aa4eede7f1f5faabd377fe
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,
411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_ATTL,
421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    XML_TEXTWRITER_DTD_ENTY
431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard} xmlTextWriterState;
441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef struct _xmlTextWriterStackEntry xmlTextWriterStackEntry;
461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriterStackEntry {
481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *name;
491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterState state;
501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardtypedef struct _xmlTextWriterNsStackEntry xmlTextWriterNsStackEntry;
531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriterNsStackEntry {
541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *prefix;
551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *uri;
561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr elem;
571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstruct _xmlTextWriter {
601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlOutputBufferPtr out; /* output buffer */
611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPtr nodes;       /* element name stack */
621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPtr nsstack;     /* name spaces stack */
631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int level;
642cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    int indent;             /* enable indent */
652cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    int doindent;	    /* internal indent flag */
662cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    xmlChar *ichar;            /* indent character */
671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    char qchar;             /* character used for quoting attribute values */
6820c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard    xmlParserCtxtPtr ctxt;
691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard};
701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void xmlFreeTextWriterStackEntry(xmlLinkPtr lk);
721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlCmpTextWriterStackEntry(const void *data0,
731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      const void *data1);
741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk);
751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlCmpTextWriterNsStackEntry(const void *data0,
761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                        const void *data1);
771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlTextWriterWriteMemCallback(void *context,
781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                         const xmlChar * str, int len);
791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlTextWriterCloseMemCallback(void *context);
805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int xmlTextWriterWriteDocCallback(void *context,
815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                         const xmlChar * str, int len);
825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int xmlTextWriterCloseDocCallback(void *context);
835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic xmlChar *xmlTextWriterVSprintf(const char *format, va_list argptr);
851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      const unsigned char *data);
875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic void xmlTextWriterStartDocumentCallback(void *ctx);
882cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardstatic int xmlTextWriterWriteIndent (xmlTextWriterPtr writer);
891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriter:
921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out:  an xmlOutputBufferPtr
931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr
951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
981d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
991d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriter(xmlOutputBufferPtr out)
1001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
1021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = (xmlTextWriterPtr) xmlMalloc(sizeof(xmlTextWriter));
1041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
1051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
1061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
1071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    memset(ret, 0, (size_t) sizeof(xmlTextWriter));
1101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->nodes = xmlListCreate((xmlListDeallocator)
1121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               xmlFreeTextWriterStackEntry,
1131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               (xmlListDataCompare)
1141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               xmlCmpTextWriterStackEntry);
1151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret->nodes == NULL) {
1161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
1171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
1181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(ret);
1191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->nsstack = xmlListCreate((xmlListDeallocator)
1231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 xmlFreeTextWriterNsStackEntry,
1241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 (xmlListDataCompare)
1251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 xmlCmpTextWriterNsStackEntry);
1261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret->nsstack == NULL) {
1271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
1281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriter : out of memory!\n");
1291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(ret->nodes);
1301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(ret);
1311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->out = out;
1352cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    ret->ichar = xmlStrdup (BAD_CAST " ");
1361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret->qchar = '"';
1371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1382cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (!ret->ichar) return NULL;
1392cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
1401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
1411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
1421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
1441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriterFilename:
1451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @uri:  the URI of the resource for the output
1461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @compression:  compress the output?
1471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure with @uri as output
1491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
1511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1521d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
1531d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriterFilename(const char *uri, int compression)
1541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
1561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlOutputBufferPtr out;
1571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    out = xmlOutputBufferCreateFilename(uri, NULL, compression);
1591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (out == NULL) {
1601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
1611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterFilename : out of memory!\n");
1621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = xmlNewTextWriter(out);
1661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
1671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
1681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterFilename : out of memory!\n");
1691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(out);
1701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
1711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
1721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1732cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    ret->indent = 0;
1742cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    ret->doindent = 0;
1751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
1761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
1771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
1791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlNewTextWriterMemory:
1801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @buf:  xmlBufferPtr
1811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @compression:  compress the output?
1821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Create a new xmlNewTextWriter structure with @buf as output
1841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * TODO: handle compression
1851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
1861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
1871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
1881d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterPtr
1891d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlNewTextWriterMemory(xmlBufferPtr buf, int compression ATTRIBUTE_UNUSED)
1901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
1911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterPtr ret;
1921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlOutputBufferPtr out;
1931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/*::todo handle compression */
1951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    out = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
1961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  xmlTextWriterWriteMemCallback,
1971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  (xmlOutputCloseCallback)
1981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  xmlTextWriterCloseMemCallback,
1991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  (void *) buf, NULL);
2001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (out == NULL) {
2011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
2021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterMemory : out of memory!\n");
2031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    ret = xmlNewTextWriter(out);
2071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ret == NULL) {
2081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
2091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlNewTextWriterMemory : out of memory!\n");
2101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(out);
2111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
2121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
2131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return ret;
2151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
2161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
2171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
2185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterPushParser:
2195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ctxt: xmlParserCtxtPtr to hold the new XML document tree
2205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
2215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
2225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @ctxt as output
2235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * TODO: handle compression
2245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
2255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
2265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
2275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
2281d913863130a17a638db69c2c50f89e5b0d4aae4Daniel VeillardxmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt,
2291d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard                           int compression ATTRIBUTE_UNUSED)
2305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
2315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
2325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlOutputBufferPtr out;
2335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
2345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    out = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
2355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  xmlTextWriterWriteDocCallback,
2365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  (xmlOutputCloseCallback)
2375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  xmlTextWriterCloseDocCallback,
2385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                  (void *) ctxt, NULL);
2395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (out == NULL) {
2405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
2415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterPushParser : error at xmlOutputBufferCreateIO!\n");
2425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
2435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
2445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
2455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriter(out);
2465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
2475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
2485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterPushParser : error at xmlNewTextWriter!\n");
2495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferClose(out);
2505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
2515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
2525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
25320c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard    ret->ctxt = ctxt;
25420c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard
2555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
2565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
2575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
2585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
2595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterDoc:
2605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @doc: address of a xmlDocPtr to hold the new XML document tree
2615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
2625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
2635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @*doc as output
2645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
2655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
2665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
2675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
2685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlNewTextWriterDoc(xmlDocPtr * doc, int compression)
2695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
2705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
2715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAXHandler saxHandler;
2725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt;
2735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
2745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    memset(&saxHandler, '\0', sizeof(saxHandler));
2755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
2765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
2775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startElement = xmlSAX2StartElement;
2785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.endElement = xmlSAX2EndElement;
2795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
2805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
2815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt == NULL) {
2825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
2835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
2845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
2855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
2865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
2871d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard    ctxt->myDoc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
2885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt->myDoc == NULL) {
2895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlFreeParserCtxt(ctxt);
2905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
2915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewDoc!\n");
2925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
2935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
2945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
2955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriterPushParser(ctxt, compression);
2965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
2975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
2985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
2995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    *doc = ctxt->myDoc;
3035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSetDocCompressMode(*doc, compression);
3045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
3065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
3075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlNewTextWriterTree:
3105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @doc: xmlDocPtr
3115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @node: xmlNodePtr or NULL for doc->children
3125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @compression:  compress the output?
3135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Create a new xmlNewTextWriter structure with @doc as output
3155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * starting at @node
3165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
3175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the new xmlTextWriterPtr or NULL in case of error
3185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
3195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterPtr
3205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression)
3215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
3225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlTextWriterPtr ret;
3235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAXHandler saxHandler;
3245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt;
3255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (doc == NULL) {
3275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    memset(&saxHandler, '\0', sizeof(saxHandler));
3315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
3325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
3335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.startElement = xmlSAX2StartElement;
3345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    saxHandler.endElement = xmlSAX2EndElement;
3355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
3375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt == NULL) {
3385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
3395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
3405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt->myDoc = doc;
3445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ctxt->node = node;
3455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    ret = xmlNewTextWriterPushParser(ctxt, compression);
3475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ret == NULL) {
3485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
3495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
3505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return NULL;
3515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
3525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlSetDocCompressMode(doc, compression);
3545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return ret;
3565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
3575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
3585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
3591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriter:
3601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
3611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
3621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Deallocate all the resources associated to the writer
3631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
3641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardvoid
3651d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriter(xmlTextWriterPtr writer)
3661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
3671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
3681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
3691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out != NULL)
3711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferClose(writer->out);
3721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->nodes != NULL)
3741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nodes);
3751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->nsstack != NULL)
3771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nsstack);
3781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37920c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard    if (writer->ctxt != NULL)
38020c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard        xmlFreeParserCtxt(writer->ctxt);
38120c5e7878d462bfd93aa4eede7f1f5faabd377feDaniel Veillard
3821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(writer);
3831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
3841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
3851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
3861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartDocument:
3871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
3881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @version:  the xml version ("1.0") or NULL for default ("1.0")
3891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @encoding:  the encoding or NULL for default
3901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @standalone: "yes" or "no" or NULL for default
3911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
3921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start a new xml document
3931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
3941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
3951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
3961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
3971d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version,
3981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const char *encoding, const char *standalone)
3991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
4001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
4011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
4021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
4031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlCharEncodingHandlerPtr encoder;
4041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (writer->out == NULL))
4061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
4071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
4091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
4101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
4111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDocument : only one prolog allowed in an XML document!\n");
4121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
4131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
4141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    encoder = NULL;
4161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (encoding != NULL) {
4171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        encoder = xmlFindCharEncodingHandler(encoding);
4181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (encoder == NULL) {
4191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlGenericError(xmlGenericErrorContext,
4201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartDocument : out of memory!\n");
4211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
4231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
4241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    writer->out->encoder = encoder;
4261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (encoder != NULL) {
4271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        writer->out->conv = xmlBufferCreateSize(4000);
4281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlCharEncOutFunc(encoder, writer->out->conv, NULL);
4291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    } else
4301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        writer->out->conv = NULL;
4311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
4331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<?xml version=");
4341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
4351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
4361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
4371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
4391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
4401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
4411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (version != 0)
4421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, version);
4431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    else
4441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "1.0");
4451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
4461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
4471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
4481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
4501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
4511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
4521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out->encoder != 0) {
4531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " encoding=");
4541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
4551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
4571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
4591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
4611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count =
4621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlOutputBufferWriteString(writer->out,
4631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                       writer->out->encoder->name);
4641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
4651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
4671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
4691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
4711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
4721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (standalone != 0) {
4741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " standalone=");
4751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
4761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
4781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
4801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
4821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, standalone);
4831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
4841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
4861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
4871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
4881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
4891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
4901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
4911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "?>\n");
4931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
4941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
4951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
4961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
4971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
4981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
4991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
5011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndDocument:
5021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
5031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml document. All open elements are closed
5051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
5071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
5081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
5091d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndDocument(xmlTextWriterPtr writer)
5101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
5111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
5121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
5131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
5141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
5151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
5171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
5181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
5201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while ((lk = xmlListFront(writer->nodes)) != NULL) {
5211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
5221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p == 0)
5231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
5241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        switch (p->state) {
5251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_NAME:
5261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_ATTRIBUTE:
5271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_TEXT:
5281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndElement(writer);
5291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
5301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
5311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
5321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
5331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_PI:
5341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_PI_TEXT:
5351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndPI(writer);
5361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
5371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
5381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
5391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
5401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_CDATA:
5411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndCDATA(writer);
5421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
5431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
5441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
5451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
5461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            case XML_TEXTWRITER_DTD:
5471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlTextWriterEndDTD(writer);
5481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count < 0)
5491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
5501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
5511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                break;
5521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            default:
5531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard		break;
5541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
5551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
5561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5572cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (!writer->indent) {
5585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "\n");
5595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if(count < 0)
5605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
5615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    sum += count;
5622cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
5631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
5641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
5651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
5671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatComment:
5681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
5691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
5701d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
5711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
5731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
5751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
5761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
5771d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatComment(xmlTextWriterPtr writer,
5781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const char *format, ...)
5791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
5801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
5811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
5821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
5841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatComment(writer, format, ap);
5861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
5881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
5891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
5901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
5911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
5921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatComment:
5931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
5941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
5951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
5961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
5981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
5991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
6001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
6011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
6021d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer,
6031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 const char *format, va_list argptr)
6041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
6051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
6061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
6071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
6091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
6101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
6121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
6131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
6141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteComment(writer, buf);
6161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
6181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
6191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
6201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
6221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteComment:
6231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
6241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  comment string
6251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
6261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml comment.
6271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
6281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
6291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
6301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
6311d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content)
6321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
6331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
6341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
6351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
6361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
6371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (writer->out == NULL))
6391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
6401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content == NULL)
6421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
6431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
6451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
6461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
6471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
6481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
6491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
6501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
6511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
6521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
6531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NONE:
6541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_TEXT:
6551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
6561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
6571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
6581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
6591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
6601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
6611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
6621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
6631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard		default:
6641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard		    break;
6651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
6661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
6671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
6681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6692cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (writer->indent) {
6702cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard      count = xmlOutputBufferWriteString (writer->out, "\n");
6712cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard      sum += count;
6722cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
6732cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
6741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!--");
6751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
6761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
6771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
6785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count = xmlOutputBufferWriteString(writer->out,
6795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                       (const char *) content);
6801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
6811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
6821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
6831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "-->");
6841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
6851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
6861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
6871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6882cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (writer->indent) {
6892cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard      count = xmlOutputBufferWriteString (writer->out, "\n");
6902cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard      sum += count;
6912cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
6922cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
6931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
6941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
6951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
6961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
6971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartElement:
6981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
6991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
7001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
7011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml element.
7021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
7031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
7041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
7051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
7061d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name)
7071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
7081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
7091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
7101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
7111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
7121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
7141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
7151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
7171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
7181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
7191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
7201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
7211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
7221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
7231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
7241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
7251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NONE:
7261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
7271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
7281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
7291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
7301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
7311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
7322cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard		    if (writer->indent)
7332cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard		      count = xmlOutputBufferWriteString (writer->out, "\n");
7341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
7351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
7361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard		default:
7371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard		    break;
7381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
7391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
7401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
7411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
7431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
7441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
7451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
7461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
7471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
7481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
7491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
7511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
7521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
7531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartElement : out of memory!\n");
7541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
7551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
7561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
7571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_NAME;
7581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
7601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7612cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (writer->indent) {
7622cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard      count = xmlTextWriterWriteIndent (writer);
7632cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard      sum += count;
7642cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
7652cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
7661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<");
7671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
7681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
7691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
7705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count =
7715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferWriteString(writer->out, (const char *) p->name);
7721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
7731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
7741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
7751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
7771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
7781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
7801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartElementNS:
7811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
7821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix or NULL
7831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
7841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI or NULL
7851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
7861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml element with namespace support.
7871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
7881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
7891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
7901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
7911d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartElementNS(xmlTextWriterPtr writer,
7921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * prefix, const xmlChar * name,
7931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * namespaceURI)
7941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
7951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
7961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
7971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
7981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
7991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
8001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
8011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = 0;
8031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != 0) {
8041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
8051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
8061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
8071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
8081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
8101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartElement(writer, buf);
8111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
8121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
8131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
8141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
8151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (namespaceURI != 0) {
8171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(BAD_CAST "xmlns");
8181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (prefix != 0) {
8191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, BAD_CAST ":");
8201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, prefix);
8211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
8221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteAttribute(writer, buf, namespaceURI);
8241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(buf);
8251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
8261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
8271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
8281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
8291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
8311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
8321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
8341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndElement:
8351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
8361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element.
8381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
8391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
8401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
8411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
8421d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndElement(xmlTextWriterPtr writer)
8431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
8441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
8451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
8461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
8471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
8481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
8501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
8511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
8531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
8541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
8551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
8571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
8581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
8591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
8611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
8621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
8631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
8641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
8651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
8661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
8671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
8681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
8691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "/>");
8701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
8711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
8721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
8731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
8741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_TEXT:
8752cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard	    if ((writer->indent) && (writer->doindent)) {
8762cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard	      count = xmlTextWriterWriteIndent (writer);
8772cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard	      sum += count;
8782cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard	      writer->doindent = 1;
8792cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard	    } else writer->doindent = 1;
8801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "</");
8811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
8821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
8831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
8841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out,
8851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard	                                       (const char *)p->name);
8861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
8871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
8881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
8891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
8901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
8911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
8921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
8931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
8941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
8951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
8961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
8971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
8982cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (writer->indent) {
8992cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard      count = xmlOutputBufferWriteString (writer->out, "\n");
9002cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard      sum += count;
9012cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    }
9022cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
9031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
9041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
9051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
9061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
9081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterFullEndElement:
9091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
9101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element. Writes an end tag even if the element is empty
9121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
9141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
9151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
9161d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterFullEndElement(xmlTextWriterPtr writer)
9171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
9181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
9191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
9201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
9211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
9221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
9241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
9271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
9281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
9311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
9321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
9331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
9351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
9361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
9371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
9381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
9391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
9401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
9411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
9421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
9431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
9441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
9451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
9461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
9471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
9481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_TEXT:
9491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "</");
9501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
9511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
9521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
9531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out,
9541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard	                                       (const char *) p->name);
9551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
9561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
9571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
9581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
9591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
9601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
9611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
9621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
9631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
9641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
9651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
9661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
9681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
9691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
9701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
9721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatRaw:
9731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
9741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
9751d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
9761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted raw xml text.
9781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
9791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
9801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
9811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
9821d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format,
9831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            ...)
9841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
9851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
9861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
9871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
9891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatRaw(writer, format, ap);
9911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
9931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
9941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
9951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
9961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
9971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatRaw:
9981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
9991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
10001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
10011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted raw xml text.
10031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
10051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
10061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
10071d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format,
10081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             va_list argptr)
10091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
10101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
10111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
10121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
10141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
10171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
10181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
10191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteRaw(writer, buf);
10211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
10231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
10241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
10251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
10271e90661bb817402f85103c3b9d3ce6ebab570f38Daniel Veillard * xmlTextWriterWriteRawLen:
10281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
10291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
10301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  length of the text string
10311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml text.
10331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * TODO: what about entities and special chars??
10341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
10361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
10371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
10381d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content,
10391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int len)
10401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
10411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
10421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
10431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
10441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
10451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
10471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
10501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
10511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
10521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
10541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
10551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
10561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
10581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
10591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NONE:
10601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
10611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
10621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
10631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
10641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
10651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
10661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_TEXT;
10671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
10681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI:
10691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " ");
10701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
10711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
10721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
10731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_PI_TEXT;
10741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
10751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD:
10761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " [");
10771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
10781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
10791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
10801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_DTD_TEXT;
10811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
10821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
10831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
10841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
10851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, len, (const char *) content);
10871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
10881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
10891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
10901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
10921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
10931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
10941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
10951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteRaw:
10961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
10971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
10981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
10991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a raw xml text.
11001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
11021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
11031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
11041d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content)
11051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
11061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content));
11071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
11081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
11101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatString:
11111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
11121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
11131d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
11141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml text.
11161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
11181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
11191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
11201d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format,
11211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               ...)
11221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
11231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
11241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
11251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
11271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatString(writer, format, ap);
11291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
11311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
11321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
11331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
11351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatString:
11361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
11371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
11381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
11391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml text.
11411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
11431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
11441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
11451d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatString(xmlTextWriterPtr writer,
11461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const char *format, va_list argptr)
11471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
11481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
11491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
11501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
11521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
11531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
11551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
11561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
11571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteString(writer, buf);
11591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
11611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
11621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
11631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
11651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteString:
11661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
11671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  text string
11681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml text.
11701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
11711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
11721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
11731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
11741d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content)
11751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
11761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
11771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
11781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
11791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
11801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf = NULL;
11811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
11831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
11841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
11861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
11871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
11881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
11901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
11911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
11921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
11931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
11941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
11951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NONE:
11961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
11971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
11981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
11991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_TEXT;
12031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            goto encode;
12041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI:
12051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " ");
12061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_PI_TEXT;
12101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
12111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI_TEXT:
12121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_TEXT:
12131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
12141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard          encode:
12155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            buf = xmlEncodeSpecialChars(NULL, content);
12161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
12171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD:
12181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " [");
12191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
12201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
12211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
12221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_DTD_TEXT;
12231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
12241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_TEXT:
12251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM:
12261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_CDATA:
12271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrdup(content);
12281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
12291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard	default:
12301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard	    break;
12311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
12321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
1233751c9ec657e784bd941802d722632f19f17f17aeDaniel Veillard    if (writer->indent)
1234751c9ec657e784bd941802d722632f19f17f17aeDaniel Veillard      writer->doindent = 0;
1235751c9ec657e784bd941802d722632f19f17f17aeDaniel Veillard
12361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf != 0) {
12375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
12385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) buf);
12391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(buf);
12401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    } else
12411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = -1;
12421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
12431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
12441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
12451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
12471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
12481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
12501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlOutputBufferWriteBase64:
12511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out: the xmlOutputBufferPtr
12521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
12531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
12541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write base64 encoded data to an xmlOutputBuffer.
12561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Adapted from John Walker's base64.c (http://www.fourmilab.ch/).
12571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
12581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
12591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
12601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
12611d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
12621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const unsigned char *data)
12631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
12641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    static unsigned char dtable[64] =
12651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
12661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int i;
12671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int linelen;
12681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
12691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
12701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    linelen = 0;
12721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
12731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    i = 0;
12751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while (1) {
12761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        unsigned char igroup[3];
12771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        unsigned char ogroup[4];
12781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        int c;
12791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        int n;
12801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        igroup[0] = igroup[1] = igroup[2] = 0;
12821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        for (n = 0; n < 3 && i < len; n++, i++) {
12831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            c = data[i];
12841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            igroup[n] = (unsigned char) c;
12851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
12861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (n > 0) {
12881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[0] = dtable[igroup[0] >> 2];
12891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
12901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[2] =
12911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
12921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            ogroup[3] = dtable[igroup[2] & 0x3F];
12931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
12941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (n < 3) {
12951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                ogroup[3] = '=';
12961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (n < 2) {
12971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    ogroup[2] = '=';
12981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                }
12991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
13001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (linelen >= B64LINELEN) {
13021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                count = xmlOutputBufferWrite(out, 2, B64CRLF);
13031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (count == -1)
13041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
13051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                sum += count;
13061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                linelen = 0;
13071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
13081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(out, 4, (const char *) ogroup);
13091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count == -1)
13101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
13111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
13121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            linelen += 4;
13141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
1315929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard
1316929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard        if (i >= len)
1317929714b707a2d793cd78b033bfacb56fbaea3e36Daniel Veillard            break;
13181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
13191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(out, 2, B64CRLF);
13211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
13221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
13231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
13241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
13261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteBase64:
13301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer: the xmlTextWriterPtr
13311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
13321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @start:  the position within the data of the first byte to encode
13331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
13341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an base64 encoded xml text.
13361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
13371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
13381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
13391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
13401d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char * data,
13411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int start, int len)
13421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
13431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
13441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
13451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
13461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
13471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
13491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
13501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
13521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
13531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
13541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
13561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
13571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
13581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
13601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
13611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NONE:
13621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
13631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
13641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
13651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
13661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
13671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
13681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_TEXT;
13691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
13701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI:
13711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " ");
13721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
13731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
13741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
13751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_PI_TEXT;
13761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
13771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD:
13781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " [");
13791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
13801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
13811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
13821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_DTD_TEXT;
13831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
13841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
13851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
13861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
13871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
13891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferWriteBase64(writer->out, len,
13901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   (unsigned char *) data + start);
13911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
13921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
13931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
13941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
13961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
13971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
13981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
13991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlOutputBufferWriteBinHex:
14001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @out: the xmlOutputBufferPtr
14011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
14021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
14031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write hqx encoded data to an xmlOutputBuffer.
14051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * ::todo
14061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
14091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
14101d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlOutputBufferWriteBinHex(xmlOutputBufferPtr out ATTRIBUTE_UNUSED,
14111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           int len ATTRIBUTE_UNUSED,
14121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const unsigned char *data ATTRIBUTE_UNUSED)
14131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
14141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return -1;
14151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
14161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
14181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteBinHex:
14191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer: the xmlTextWriterPtr
14201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data:   binary data
14211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @start:  the position within the data of the first byte to encode
14221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the number of bytes to encode
14231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a BinHex encoded xml text.
14251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
14281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
14291d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char * data,
14301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                         int start, int len)
14311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
14321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
14331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
14341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
14351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
14361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
14381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
14391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
14411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
14421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
14431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
14451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
14461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
14471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
14491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
14501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NONE:
14511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
14521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
14531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
14541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
14551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
14561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
14571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_TEXT;
14581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
14591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI:
14601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " ");
14611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
14621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
14631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
14641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_PI_TEXT;
14651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
14661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD:
14671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " [");
14681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
14691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
14701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
14711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_DTD_TEXT;
14721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
14731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
14741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
14751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
14761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
14781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlOutputBufferWriteBinHex(writer->out, len,
14791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   (unsigned char *) data + start);
14801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
14811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
14821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
14831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
14851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
14861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
14871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
14881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartAttribute:
14891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
14901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
14911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml attribute.
14931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
14941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
14951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
14961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
14971d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name)
14981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
14991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
15001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
15011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
15021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
15031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
15051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
15061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
15081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
15091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
15101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
15111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
15131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
15141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
15151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
15171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
15181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndAttribute(writer);
15191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
15201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
15211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
15221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
15231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_NAME:
15241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " ");
15251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
15261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
15271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
15285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            count =
15295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                xmlOutputBufferWriteString(writer->out,
15305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                           (const char *) name);
15311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
15321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
15331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
15341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "=");
15351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
15361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
15371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
15381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
15391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
15401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
15411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
15421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_ATTRIBUTE;
15431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
15441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
15451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
15461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
15471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
15491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
15501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
15521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartAttributeNS:
15531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
15541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix or NULL
15551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
15561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI or NULL
15571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
15581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml attribute with namespace support.
15591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
15601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
15611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
15621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
15631d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartAttributeNS(xmlTextWriterPtr writer,
15641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * prefix, const xmlChar * name,
15651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * namespaceURI)
15661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
15671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
15681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
15691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
15701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p;
15711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
15731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
15741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = 0;
15761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != 0) {
15771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
15781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
15791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
15801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
15811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
15831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartAttribute(writer, buf);
15841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
15851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
15861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
15871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
15881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (namespaceURI != 0) {
15901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(BAD_CAST "xmlns");
15911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (prefix != 0) {
15921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, BAD_CAST ":");
15931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, prefix);
15941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
15951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
15961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterNsStackEntry *)
15971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
15981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p == 0) {
15991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlGenericError(xmlGenericErrorContext,
16001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartAttributeNS : out of memory!\n");
16011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
16021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
16031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p->prefix = buf;
16051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p->uri = xmlStrdup(namespaceURI);
16061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p->uri == 0) {
16071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlGenericError(xmlGenericErrorContext,
16081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartAttributeNS : out of memory!\n");
16091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlFree(p);
16101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
16111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
16121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p->elem = xmlListFront(writer->nodes);
16131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListPushFront(writer->nsstack, p);
16151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
16161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
16181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
16191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
16211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndAttribute:
16221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
16231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml element.
16251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
16271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
16281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
16291d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndAttribute(xmlTextWriterPtr writer)
16301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
16311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
16321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
16331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
16341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
16351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *np;
16361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
16381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
16411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
16421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nsstack);
16431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
16451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
16471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
16481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlListDelete(writer->nsstack);
16491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
16501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
16511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
16531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
16541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_ATTRIBUTE:
16551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_NAME;
16561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
16581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0) {
16591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                xmlListDelete(writer->nsstack);
16601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
16611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
16621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
16631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            while (!xmlListEmpty(writer->nsstack)) {
16651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                lk = xmlListFront(writer->nsstack);
16661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
16671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                if (np != 0) {
16681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count =
16691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        xmlTextWriterWriteAttribute(writer, np->prefix,
16701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                    np->uri);
16711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0) {
16721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        xmlListDelete(writer->nsstack);
16731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
16741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    }
16751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
16761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                }
16771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                xmlListPopFront(writer->nsstack);
16791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
16801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
16811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
16831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlListClear(writer->nsstack);
16841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
16851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
16861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
16881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
16891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
16901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
16911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatAttribute:
16921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
16931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
16941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
16951d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
16961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.
16981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
16991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
17021d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer,
17031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * name, const char *format,
17041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  ...)
17051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
17061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
17071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
17081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
17101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap);
17121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
17141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
17151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
17161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
17181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatAttribute:
17191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
17201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
17211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
17221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
17231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.
17251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
17291d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer,
17301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
17311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, va_list argptr)
17321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
17331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
17341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
17351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
17371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
17401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
17411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
17421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteAttribute(writer, name, buf);
17441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
17461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
17471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
17481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
17501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteAttribute:
17511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
17521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute name
17531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  attribute content
17541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml attribute.
17561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
17601d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name,
17611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
17621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
17631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
17641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
17651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
17671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartAttribute(writer, name);
17681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
17691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
17711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
17721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
17731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
17751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndAttribute(writer);
17761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
17771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
17781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
17791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
17811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
17821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
17831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
17841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatAttributeNS:
17851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
17861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
17871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
17881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
17891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
17901d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
17911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.with namespace support
17931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
17941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
17951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
17961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
17971d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer,
17981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * prefix,
17991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
18001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * namespaceURI,
18011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, ...)
18021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
18031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
18041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
18051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
18071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatAttributeNS(writer, prefix, name,
18091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                              namespaceURI, format, ap);
18101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
18121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
18131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
18141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
18161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatAttributeNS:
18171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
18181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
18191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
18201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
18211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
18221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
18231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml attribute.with namespace support
18251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
18271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
18281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
18291d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer,
18301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * prefix,
18311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * name,
18321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const xmlChar * namespaceURI,
18331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     const char *format, va_list argptr)
18341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
18351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
18361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
18371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
18391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
18401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
18421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
18431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
18441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteAttributeNS(writer, prefix, name, namespaceURI,
18461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                       buf);
18471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
18491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
18501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
18511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
18531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteAttributeNS:
18541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
18551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
18561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  attribute local name
18571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
18581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  attribute content
18591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml attribute.
18611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
18621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
18631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
18641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
18651d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer,
18661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * prefix, const xmlChar * name,
18671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * namespaceURI,
18681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * content)
18691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
18701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
18711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
18721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
18731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
18751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
18761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = 0;
18781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (prefix != NULL) {
18791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(prefix);
18801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrcat(buf, BAD_CAST ":");
18811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
18821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlStrcat(buf, name);
18831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
18851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteAttribute(writer, buf, content);
18861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
18871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
18881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
18891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
18901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
18911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (namespaceURI != NULL) {
18921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = 0;
18931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = xmlStrdup(BAD_CAST "xmlns");
18941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (prefix != NULL) {
18951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, BAD_CAST ":");
18961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            buf = xmlStrcat(buf, prefix);
18971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
18981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteAttribute(writer, buf, namespaceURI);
18991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(buf);
19001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
19011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
19021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
19031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
19041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
19051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatElement:
19091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
19111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
19121d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
19131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element.
19151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19191d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatElement(xmlTextWriterPtr writer,
19201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                const xmlChar * name, const char *format,
19211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                ...)
19221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
19241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
19251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
19271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatElement(writer, name, format, ap);
19291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
19311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
19321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatElement:
19361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
19381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
19391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
19401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element.
19421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19461d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer,
19471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 const xmlChar * name, const char *format,
19481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                 va_list argptr)
19491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
19511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
19521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
19541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
19571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
19581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
19591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteElement(writer, name, buf);
19611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
19631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
19641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
19671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteElement:
19681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
19691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element name
19701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  element content
19711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml element.
19731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
19741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
19751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
19761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
19771d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name,
19781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                          const xmlChar * content)
19791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
19801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
19811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
19821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
19841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartElement(writer, name);
19851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
19861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
19881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
19891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
19901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
19921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndElement(writer);
19931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
19941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
19951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
19961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
19971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
19981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
19991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatElementNS:
20021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
20041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
20051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
20061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
20071d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
20081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element with namespace support.
20101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
20131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20141d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer,
20151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * prefix,
20161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * name,
20171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const xmlChar * namespaceURI,
20181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                  const char *format, ...)
20191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
20211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
20221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
20241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatElementNS(writer, prefix, name,
20261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                            namespaceURI, format, ap);
20271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
20291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
20301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatElementNS:
20341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
20361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
20371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
20381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
20391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
20401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml element with namespace support.
20421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
20451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20461d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer,
20471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * prefix,
20481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
20491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * namespaceURI,
20501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, va_list argptr)
20511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
20531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
20541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
20561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
20591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
20601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
20611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteElementNS(writer, prefix, name, namespaceURI,
20631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                     buf);
20641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
20661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
20671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
20681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
20701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteElementNS:
20711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
20721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @prefix:  namespace prefix
20731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  element local name
20741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @namespaceURI:  namespace URI
20751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  element content
20761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml element with namespace support.
20781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
20791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
20801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
20811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
20821d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteElementNS(xmlTextWriterPtr writer,
20831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * prefix, const xmlChar * name,
20841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * namespaceURI,
20851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
20861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
20871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
20881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
20891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (name == NULL) || (*name == '\0'))
20911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
20931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
20941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count =
20951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI);
20961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
20971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
20981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
20991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
21001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
21011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
21031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndElement(writer);
21041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
21051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
21071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
21091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
21101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
21121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartPI:
21131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
21141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
21151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml PI.
21171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
21181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
21191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
21201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
21211d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target)
21221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
21231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
21241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
21251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
21261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
21271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((writer == NULL) || (target == NULL) || (*target == '\0'))
21291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (xmlStrcasecmp(target, (const xmlChar *) "xml") == 0) {
21321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
21331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : target name [Xx][Mm][Ll] is reserved for xml standardization!\n");
21341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
21361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
21381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
21391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
21401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
21411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
21421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
21431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
21441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlTextWriterEndAttribute(writer);
21451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
21461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
21471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
21481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    /* fallthrough */
21491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
21501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
21511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
21521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
21531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
21541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
21551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
215610c08c7d064d24eb9f4c25301f3743dce7186529Daniel Veillard		case XML_TEXTWRITER_NONE:
215710c08c7d064d24eb9f4c25301f3743dce7186529Daniel Veillard		case XML_TEXTWRITER_TEXT:
215810c08c7d064d24eb9f4c25301f3743dce7186529Daniel Veillard		case XML_TEXTWRITER_DTD:
215910c08c7d064d24eb9f4c25301f3743dce7186529Daniel Veillard		    break;
21601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
21611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
21621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    xmlGenericError(xmlGenericErrorContext,
21631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    "xmlTextWriterStartPI : nested PI!\n");
21641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
21651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                default:
21661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
21671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
21681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
21691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
21701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
21721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
21731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
21741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
21751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : out of memory!\n");
21761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
21781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(target);
21801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
21811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
21821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartPI : out of memory!\n");
21831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
21841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
21861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_PI;
21871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
21891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
21901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<?");
21911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
21921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
21945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    count =
21955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlOutputBufferWriteString(writer->out, (const char *) p->name);
21961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
21971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
21981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
21991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
22011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndPI:
22051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End the current xml PI.
22081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22121d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndPI(xmlTextWriterPtr writer)
22131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
22151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
22161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
22171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
22181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
22201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
22231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
22241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
22251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
22271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
22281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
22291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
22311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
22321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI:
22331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_PI_TEXT:
22341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "?>");
22351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
22361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
22371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
22381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
22391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
22401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
22411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
22421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
22441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
22451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatPI:
22491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
22511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
22521d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
22531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted PI.
22551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22591d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target,
22601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                           const char *format, ...)
22611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
22631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
22641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
22661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatPI(writer, target, format, ap);
22681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
22701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
22711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
22721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
22741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatPI:
22751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
22761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
22771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
22785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
22791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml PI.
22811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
22821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
22831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
22841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
22851d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer,
22861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * target, const char *format,
22871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            va_list argptr)
22881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
22891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
22901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
22911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
22931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
22941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
22961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
22971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
22981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
22991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWritePI(writer, target, buf);
23001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
23021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
23031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
23041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
23061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWritePI:
23071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
23081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @target:  PI target
23091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  PI content
23101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml PI.
23121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
23141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
23151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
23161d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target,
23171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                     const xmlChar * content)
23181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
23191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
23201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
23211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
23231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartPI(writer, target);
23241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
23251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content != 0) {
23281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, content);
23291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
23301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
23311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
23321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
23331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndPI(writer);
23341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
23351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
23371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
23391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
23401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
23421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartCDATA:
23431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
23441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml CDATA section.
23461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
23471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
23481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
23491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
23501d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartCDATA(xmlTextWriterPtr writer)
23511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
23521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
23531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
23541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
23551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
23561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
23581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
23611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
23621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
23631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
23641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (p != 0) {
23651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            switch (p->state) {
23661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NONE:
23671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI:
23681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_PI_TEXT:
23691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
23701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_ATTRIBUTE:
23711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlTextWriterEndAttribute(writer);
23721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
23731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
23741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
23751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    /* fallthrough */
23761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_NAME:
23771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    count = xmlOutputBufferWriteString(writer->out, ">");
23781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    if (count < 0)
23791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        return -1;
23801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    sum += count;
23811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    p->state = XML_TEXTWRITER_TEXT;
23821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    break;
23831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                case XML_TEXTWRITER_CDATA:
23841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    xmlGenericError(xmlGenericErrorContext,
23851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    "xmlTextWriterStartCDATA : CDATA not allowed in this context!\n");
23861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
23871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                default:
23881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                    return -1;
23891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            }
23901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
23911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
23921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
23931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
23941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
23951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
23961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
23971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartCDATA : out of memory!\n");
23981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
23991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = 0;
24021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_CDATA;
24031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
24051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<![CDATA[");
24071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
24081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
24101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
24121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
24131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
24151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndCDATA:
24161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
24171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml CDATA section.
24191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
24211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
24221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
24231d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndCDATA(xmlTextWriterPtr writer)
24241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
24251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
24261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
24271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
24281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
24291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
24311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
24341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
24351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
24381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
24391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
24401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
24421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
24431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_CDATA:
24441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "]]>");
24451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
24461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
24471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
24481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
24491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
24501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
24511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
24521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
24541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
24551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
24561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
24581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatCDATA:
24591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
24601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
24611d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
24621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml CDATA.
24641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
24661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
24671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
24681d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format,
24691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              ...)
24701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
24711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
24721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
24731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
24751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatCDATA(writer, format, ap);
24771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
24791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
24801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
24811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
24831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatCDATA:
24841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
24851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
24865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
24871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a formatted xml CDATA.
24891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
24901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
24911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
24921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
24931d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format,
24941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                               va_list argptr)
24951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
24961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
24971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
24981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
24991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
25001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
25031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
25041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
25051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteCDATA(writer, buf);
25071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
25091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
25101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteCDATA:
25141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @content:  CDATA content
25161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write an xml CDATA.
25181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
25211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
25221d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content)
25231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
25251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
25261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
25281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartCDATA(writer);
25291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
25301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
25321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content != 0) {
25331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, content);
25341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
25351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
25361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
25371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndCDATA(writer);
25391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
25401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
25421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
25441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
25451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
25471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterStartDTD:
25481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
25491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
25501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
25511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
25521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Start an xml DTD.
25541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
25551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
25561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
25571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
25581d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTD(xmlTextWriterPtr writer,
25591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * name,
25601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * pubid, const xmlChar * sysid)
25611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
25621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
25631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
25641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
25651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
25661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
25681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
25711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
25721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk != 0) {
25731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
25741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : DTD allowed only in prolog!\n");
25751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
25791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
25801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
25811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
25821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : out of memory!\n");
25831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
25871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
25881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
25891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTD : out of memory!\n");
25901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
25911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
25921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
25931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD;
25941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
25961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
25971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!DOCTYPE ");
25981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
25991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
26011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
26021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
26031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
26051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
26071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (sysid == 0) {
26081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlGenericError(xmlGenericErrorContext,
26091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterStartDTD : system identifier needed!\n");
26101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
26111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
26121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " PUBLIC \"");
26141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
26151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
26161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
26171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
26195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
26201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
26211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
26221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
26231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\"");
26251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
26261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
26271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
26281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
26291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
26311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
26321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
26331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
26341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
26351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
26361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
26371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " \"");
26391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
26401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
26411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
26421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
26445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
26451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
26461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
26471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
26481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, "\"");
26501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
26511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
26521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
26531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
26541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
26561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
26571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
26591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterEndDTD:
26601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
26611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * End an xml DTD.
26631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
26641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
26651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
26661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
26671d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterEndDTD(xmlTextWriterPtr writer)
26681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
26691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
26701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
26711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
26721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
26731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
26751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
26781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
26791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0)
26801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
26831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
26841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
26851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
26861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
26871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_TEXT:
26881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, "]");
26891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
26901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
26911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
26921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
26931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD:
26941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM:
26951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL:
26961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, ">");
26971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
26981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
26991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
27001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
27011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
27021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
27031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
27041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPopFront(writer->nodes);
27061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
27071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteFormatDTD:
27111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
27131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
27141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
27151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
27161d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
27171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD with a formatted markup declarations part.
27191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
27221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
27231d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer,
27241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * name,
27251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * pubid,
27261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * sysid, const char *format, ...)
27271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
27291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
27301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
27321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTD(writer, name, pubid, sysid, format,
27341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                      ap);
27351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
27371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
27381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteVFormatDTD:
27421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
27441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
27451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
27461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  format string (see printf)
27475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
27481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD with a formatted markup declarations part.
27501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
27531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
27541d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer,
27551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name,
27561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * pubid,
27571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * sysid,
27581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const char *format, va_list argptr)
27591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
27611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
27621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
27641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
27651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
27671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
27681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
27691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTD(writer, name, pubid, sysid, buf);
27711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
27731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
27741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
27751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
27771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteDTD:
27781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
27791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @name:  the name of the DTD
27801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
27811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
2782b1d531659b2bee47492ca1c319180116eaaf566eWilliam M. Brack * @subset:  string content of the DTD
27831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write a DTD.
27851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
27861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
27871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
27881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
27891d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTD(xmlTextWriterPtr writer,
27901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * name,
27911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * pubid,
27921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                      const xmlChar * sysid, const xmlChar * subset)
27931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
27941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
27951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
27961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
27971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
27981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTD(writer, name, pubid, sysid);
27991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
28001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (subset != 0) {
28031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlTextWriterWriteString(writer, subset);
28041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count == -1)
28051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
28071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTD(writer);
28091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
28101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
28141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
28151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
28175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDElement:
28185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
28195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
28205841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
28215841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD element.
28225841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
28235841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
28245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
28251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
28261d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name)
28271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
28281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
28291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
28301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
28311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
28321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
28341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
28371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
28381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
28391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
28431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
28441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
28471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD:
28481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " [");
28491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
28501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
28511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
28521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_DTD_TEXT;
28531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
28541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_TEXT:
28551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
28561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM:
28571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndDTDElement(writer);
28581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
28591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
28601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
28611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
28621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
28631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
28641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
28671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
28681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
28691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
28701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
28711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
28751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
28761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
28771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
28781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
28791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
28811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD_ELEM;
28821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
28841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ELEMENT ");
28861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
28871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
28901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
28911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
28921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
28931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
28951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
28961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
28975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
28985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDElement:
28995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
29005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
29015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
29021d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
29035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
29045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD element.
29055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
29065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
29075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
29081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
29091d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer,
29101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
29111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, ...)
29121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
29131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
29141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
29151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
29171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDElement(writer, name, format, ap);
29191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
29211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
29221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
29231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
29255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDElement:
29265841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
29275841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
29285841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
29295841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
29305841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
29315841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD element.
29325841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
29335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
29345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
29351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
29361d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer,
29371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
29381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, va_list argptr)
29391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
29401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
29411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
29421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
29441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
29451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
29471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
29481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
29491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDElement(writer, name, buf);
29511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
29531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
29541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
29551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
29575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDElement:
29585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
29595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD element
29605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the element
29615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
29625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD element.
29635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
29645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
29655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
29661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
29671d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDElement(xmlTextWriterPtr writer,
29681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name, const xmlChar * content)
29691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
29701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
29711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
29721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content == NULL)
29741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
29751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
29771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDElement(writer, name);
29781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
29791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
29801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
29811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, BAD_CAST " ");
29831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
29841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
29851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
29861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
29871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
29881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
29891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
29901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDElement(writer);
29921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
29931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
29941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
29951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
29971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
29981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
29995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
30005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDAttlist:
30015841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
30025841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
30035841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
30045841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD ATTLIST.
30055841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
30065841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
30075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
30081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
30091d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name)
30101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
30111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
30121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
30131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
30141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
30151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
30171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
30201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
30211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
30221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
30261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
30271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
30301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD:
30311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " [");
30321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
30331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
30341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
30351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_DTD_TEXT;
30361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
30371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_TEXT:
30381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
30391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM:
30401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL:
30411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY:
30421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndDTD(writer);
30431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
30441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
30451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
30461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
30471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
30481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
30491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
30521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
30531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
30541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
30551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDAttlist : out of memory!\n");
30561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
30601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
30611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
30621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDAttlist : out of memory!\n");
30631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
30641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
30661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD_ATTL;
30671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
30691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ATTLIST ");
30711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
30721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
30741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *)name);
30751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
30761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
30771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
30781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
30801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
30811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
30825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
30835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDAttlist:
30845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
30855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
30865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
30871d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
30885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
30895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD ATTLIST.
30905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
30915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
30925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
30931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
30941d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer,
30951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const xmlChar * name,
30961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                   const char *format, ...)
30971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
30981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
30991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
31001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
31021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDAttlist(writer, name, format, ap);
31041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
31061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
31071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
31081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
31105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDAttlist:
31115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
31125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
31135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
31145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
31155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD ATTLIST.
31175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
31195841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
31201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
31211d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer,
31221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
31231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const char *format, va_list argptr)
31241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
31251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
31261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
31271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
31291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
31321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
31331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
31341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDAttlist(writer, name, buf);
31361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
31381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
31391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
31401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
31425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDAttlist:
31435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
31445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
31455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the ATTLIST
31465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD ATTLIST.
31485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
31505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
31511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
31521d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer,
31531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                             const xmlChar * name, const xmlChar * content)
31541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
31551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
31561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
31571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content == NULL)
31591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
31621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDAttlist(writer, name);
31631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
31641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, BAD_CAST " ");
31681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
31691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
31721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
31731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDAttlist(writer);
31771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
31781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
31791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
31801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
31821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
31831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
31845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
31855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDTDEntity:
31865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
31875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
31885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD ATTLIST
31895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Start an xml DTD ATTLIST.
31915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
31925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
31935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
31941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
31951d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterStartDTDEntity(xmlTextWriterPtr writer,
31961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            int pe, const xmlChar * name)
31971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
31981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
31991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
32001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
32011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
32021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
32041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
32071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
32081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
32091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
32111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
32131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
32141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
32171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD:
32181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " [");
32191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
32201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
32211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
32221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_DTD_TEXT;
32231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
32241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_TEXT:
32251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
32261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM:
32271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL:
32281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY:
32291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndDTD(writer);
32301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
32311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
32321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
32331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
32341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
32351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
32361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
32371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *)
32391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlMalloc(sizeof(xmlTextWriterStackEntry));
32401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0) {
32411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
32421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
32431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
32451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->name = xmlStrdup(name);
32471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name == 0) {
32481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
32491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterStartDTDElement : out of memory!\n");
32501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p);
32511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
32531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p->state = XML_TEXTWRITER_DTD_ENTY;
32541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlListPushFront(writer->nodes, p);
32561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!ENTITY ");
32581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
32591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
32611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pe != 0) {
32631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " % ");
32641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
32651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
32661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
32671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
32681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *)name);
32701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
32711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
32721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
32731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
32751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
32761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
32785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteFormatDTDInternalEntity:
32795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
32805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
32815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
32825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
32831d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard * @...:  extra parameters for the format
32845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD internal entity.
32865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
32875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
32885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
32891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
32901d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer,
32911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          int pe,
32921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          const xmlChar * name,
32931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                          const char *format, ...)
32941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
32951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
32961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_list ap;
32971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
32981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_start(ap, format);
32991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteVFormatDTDInternalEntity(writer, pe, name,
33011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                    format, ap);
33021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    va_end(ap);
33041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
33051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
33061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33075841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
33085841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteVFormatDTDInternalEntity:
33095841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
33105841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
33115841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
33125841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @format:  format string (see printf)
33135841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
33145841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33155841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a formatted DTD internal entity.
33165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
33185841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
33191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
33201d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer,
33211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           int pe,
33221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           const xmlChar * name,
33231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           const char *format,
33241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                           va_list argptr)
33251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
33261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
33271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
33281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
33301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = xmlTextWriterVSprintf(format, argptr);
33331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == 0)
33341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
33351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlTextWriterWriteDTDInternalEntity(writer, pe, name, buf);
33371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(buf);
33391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
33401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
33411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
33435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDEntity:
33445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
33455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
33465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
33475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
33485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
33495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ndataid:  the xml notation name.
33505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the entity
33515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD entity.
33535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
33555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
33561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
33571d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer,
33581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            int pe,
33591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * name,
33601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * pubid,
33611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * sysid,
33621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * ndataid,
33631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            const xmlChar * content)
33641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
33651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (((content == NULL) && (pubid == NULL) && (sysid == NULL))
33661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        || ((content != NULL) && ((pubid != NULL) || (sysid != NULL))))
33671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((pe != 0) && (ndataid != NULL))
33691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
33701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (content != 0)
33721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return xmlTextWriterWriteDTDInternalEntity(writer, pe, name,
33731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                                   content);
33741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlTextWriterWriteDTDExternalEntity(writer, pe, name, pubid,
33761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                               sysid, ndataid);
33771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
33781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
33805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDInternalEntity:
33815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
33825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
33835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
33845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @content:  content of the entity
33855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD internal entity.
33875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
33885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
33895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
33901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
33911d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer,
33921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    int pe,
33931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
33941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * content)
33951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
33961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
33971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
33981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
33991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((name == NULL) || (*name == '\0') || (content == NULL))
34001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
34031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDEntity(writer, pe, name);
34041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
34051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, BAD_CAST " ");
34091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
34101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
34131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
34141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterWriteString(writer, content);
34171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
34181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
34211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
34221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDEntity(writer);
34261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
34271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
34311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
34321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
34345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDExternalEntity:
34355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
34365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pe:  TRUE if this is a parameter entity, FALSE if not
34375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the DTD entity
34385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
34395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
34405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ndataid:  the xml notation name.
34415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
34425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD internal entity.
34435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
34445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
34455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
34461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
34471d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer,
34481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    int pe,
34491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * name,
34501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * pubid,
34511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * sysid,
34521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                                    const xmlChar * ndataid)
34531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
34541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
34551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
34561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((name == NULL) || (*name == '\0')
34581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        || ((pubid == NULL) && (sysid == NULL)))
34591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if ((pe != 0) && (ndataid != NULL))
34611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
34641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterStartDTDEntity(writer, pe, name);
34651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
34661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
34671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
34681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
34701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (sysid == 0) {
34711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlGenericError(xmlGenericErrorContext,
34721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterWriteDTDEntity : system identifier needed!\n");
34731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
34741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
34751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
34771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
34781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
34791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
34801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
34821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
34831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
34841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
34851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
34875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
34881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
34891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
34901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
34911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
34931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
34941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
34951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
34961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
34971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
34981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
34991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
35001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
35011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
35021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
35031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
35041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
35051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " ");
35071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
35081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
35091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
35101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
35121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
35131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
35141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
35151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35165841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
35175841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
35181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
35191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
35201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
35211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
35231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
35241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
35251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
35261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
35271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (ndataid != NULL) {
35291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " NDATA ");
35301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
35311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
35321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
35331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
35355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out,
35365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                       (const char *) ndataid);
35371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
35381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
35391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
35401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
35411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlTextWriterEndDTDEntity(writer);
35431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count == -1)
35441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
35461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
35481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
35491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
35515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDTDNotation:
35525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @writer:  the xmlTextWriterPtr
35535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @name:  the name of the xml notation
35545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @pubid:  the public identifier, which is an alternative to the system identifier
35555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @sysid:  the system identifier, which is the URI of the DTD
35565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write a DTD entity.
35585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
35595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
35605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
35611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
35621d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer,
35631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * name,
35641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                              const xmlChar * pubid, const xmlChar * sysid)
35651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
35661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
35671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int sum;
35681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlLinkPtr lk;
35691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
35701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL || name == NULL || *name == '\0')
35721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum = 0;
35751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    lk = xmlListFront(writer->nodes);
35761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (lk == 0) {
35771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
35791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
35811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
35821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
35831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
35841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    switch (p->state) {
35851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD:
35861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " [");
35871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
35881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
35891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
35901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            p->state = XML_TEXTWRITER_DTD_TEXT;
35911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            /* fallthrough */
35921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_TEXT:
35931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
35941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ELEM:
35951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ATTL:
35961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        case XML_TEXTWRITER_DTD_ENTY:
35971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlTextWriterEndDTD(writer);
35981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
35991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
36001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
36011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            break;
36021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        default:
36031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
36051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, "<!NOTATION ");
36071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
36081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
36101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, (const char *) name);
36111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
36121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
36141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (pubid != 0) {
36161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
36171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
36211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36245841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
36255841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) pubid);
36261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
36301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
36341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (sysid != 0) {
36361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (pubid == 0) {
36371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
36381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            if (count < 0)
36391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                return -1;
36401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            sum += count;
36411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
36421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWriteString(writer->out, " ");
36431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
36471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        count =
36515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlOutputBufferWriteString(writer->out, (const char *) sysid);
36521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
36561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (count < 0)
36571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return -1;
36581d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        sum += count;
36591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
36601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    count = xmlOutputBufferWriteString(writer->out, ">");
36621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (count < 0)
36631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    sum += count;
36651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return sum;
36671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
36681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
36701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterFlush:
36711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @writer:  the xmlTextWriterPtr
36721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
36731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Flush the output buffer.
36741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
36751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
36761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
36771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardint
36781d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterFlush(xmlTextWriterPtr writer)
36791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
36801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
36811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer == NULL)
36831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
36841d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (writer->out == NULL)
36861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = 0;
36871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    else
36881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        count = xmlOutputBufferFlush(writer->out);
36891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return count;
36911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
36921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
36941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * misc
36951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
36961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
36971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
36981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriterStackEntry:
36991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @lk:  the xmlLinkPtr
37001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
37011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Free callback for the xmlList.
37021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
37031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void
37041d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriterStackEntry(xmlLinkPtr lk)
37051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
37061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p;
37071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
37091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
37101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
37111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->name != 0)
37131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->name);
37141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(p);
37151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
37161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
37181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlCmpTextWriterStackEntry:
37191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data0:  the first data
37201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data1:  the second data
37211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
37221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Compare callback for the xmlList.
37231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
37241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
37251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
37261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
37271d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlCmpTextWriterStackEntry(const void *data0, const void *data1)
37281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
37291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p0;
37301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterStackEntry *p1;
37311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == data1)
37331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
37341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == 0)
37361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
37371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data1 == 0)
37391d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 1;
37401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p0 = (xmlTextWriterStackEntry *) data0;
37421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p1 = (xmlTextWriterStackEntry *) data1;
37431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return xmlStrcmp(p0->name, p1->name);
37451d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
37461d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37471d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
37481d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * misc
37491d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
37501d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37511d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
37521d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlFreeTextWriterNsStackEntry:
37531d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @lk:  the xmlLinkPtr
37541d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
37551d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Free callback for the xmlList.
37561d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
37571d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic void
37581d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlFreeTextWriterNsStackEntry(xmlLinkPtr lk)
37591d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
37601d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p;
37611d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37621d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
37631d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p == 0)
37641d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return;
37651d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37661d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->prefix != 0)
37671d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->prefix);
37681d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (p->uri != 0)
37691d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(p->uri);
37701d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37711d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlFree(p);
37721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
37731d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37741d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
37751d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlCmpTextWriterNsStackEntry:
37761d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data0:  the first data
37771d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @data1:  the second data
37781d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
37791d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Compare callback for the xmlList.
37801d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
37811d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
37821d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
37831d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
37841d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlCmpTextWriterNsStackEntry(const void *data0, const void *data1)
37851d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
37861d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p0;
37871d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlTextWriterNsStackEntry *p1;
37881d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int rc;
37891d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37901d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == data1)
37911d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 0;
37921d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37931d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data0 == 0)
37941d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return -1;
37951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (data1 == 0)
37971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return 1;
37981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
37991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p0 = (xmlTextWriterNsStackEntry *) data0;
38001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    p1 = (xmlTextWriterNsStackEntry *) data1;
38011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    rc = xmlStrcmp(p0->prefix, p1->prefix);
38031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38041d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (rc == 0)
38051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        rc = p0->elem == p1->elem;
38061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return rc;
38081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
38111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterWriteMemCallback:
38121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @context:  the xmlBufferPtr
38131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @str:  the data to write
38141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @len:  the length of the data
38151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
38161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Write callback for the xmlOutputBuffer with target xmlBuffer
38171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
38181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
38191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
38201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
38211d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterWriteMemCallback(void *context, const xmlChar * str, int len)
38221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
38231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlBufferPtr buf = (xmlBufferPtr) context;
38241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlBufferAdd(buf, str, len);
38261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return len;
38281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
38311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterCloseMemCallback:
38321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @context:  the xmlBufferPtr
38331d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
38341d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Close callback for the xmlOutputBuffer with target xmlBuffer
38351d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
38361d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns -1, 0, 1
38371d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
38381d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic int
38391d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterCloseMemCallback(void *context ATTRIBUTE_UNUSED)
38401d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
38411d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return 0;
38421d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
38431d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
38441d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard/**
38455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterWriteDocCallback:
38465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @context:  the xmlBufferPtr
38475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @str:  the data to write
38485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @len:  the length of the data
38495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Write callback for the xmlOutputBuffer with target xmlBuffer
38515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns -1, 0, 1
38535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
38545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int
38555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterWriteDocCallback(void *context, const xmlChar * str, int len)
38565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
38575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
38585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    int rc;
38595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
38601d913863130a17a638db69c2c50f89e5b0d4aae4Daniel Veillard    if ((rc = xmlParseChunk(ctxt, (const char *) str, len, 0)) != 0) {
38615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
38625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlTextWriterWriteDocCallback : XML error %d !\n",
38635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        rc);
38645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
38655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
38665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
38675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return len;
38685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
38695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
38705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
38715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterCloseDocCallback:
38725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @context:  the xmlBufferPtr
38735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Close callback for the xmlOutputBuffer with target xmlBuffer
38755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
38765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * Returns -1, 0, 1
38775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
38785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic int
38795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterCloseDocCallback(void *context)
38805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
38815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
38825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    int rc;
38835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
38845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if ((rc = xmlParseChunk(ctxt, NULL, 0, 1)) != 0) {
38855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
38865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "xmlTextWriterWriteDocCallback : XML error %d !\n",
38875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        rc);
38885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return -1;
38895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
38905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
38915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    return 0;
38925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
38935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
38945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
38951d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * xmlTextWriterVSprintf:
38961d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @format:  see printf
38971d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * @argptr:  pointer to the first member of the variable argument list.
38981d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
38991d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Utility function for formatted output
39001d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard *
39011d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard * Returns a new xmlChar buffer with the data or NULL on error. This buffer must be freed.
39021d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard */
39031d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillardstatic xmlChar *
39041d211e227372e5ed75a69fbad5f50d185d0af936Daniel VeillardxmlTextWriterVSprintf(const char *format, va_list argptr)
39051d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard{
39061d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int size;
39071d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    int count;
39081d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    xmlChar *buf;
39091d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39101d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    size = BUFSIZ;
39111d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    buf = (xmlChar *) xmlMalloc(size);
39121d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    if (buf == NULL) {
39131d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
39141d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                        "xmlTextWriterVSprintf : out of memory!\n");
39151d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        return NULL;
39161d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
39171d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39181d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    while (((count = vsnprintf((char *) buf, size, format, argptr)) < 0)
39191d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard           || (count == size - 1) || (count == size) || (count > size)) {
39201d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        xmlFree(buf);
39211d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        size += BUFSIZ;
39221d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        buf = (xmlChar *) xmlMalloc(size);
39231d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        if (buf == NULL) {
39241d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            xmlGenericError(xmlGenericErrorContext,
39251d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard                            "xmlTextWriterVSprintf : out of memory!\n");
39261d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard            return NULL;
39271d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard        }
39281d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    }
39291d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39301d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard    return buf;
39311d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard}
39321d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard
39335841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard/**
39345841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * xmlTextWriterStartDocumentCallback:
39355841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * @ctx: the user data (XML parser context)
39365841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard *
39375841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard * called at the start of document processing.
39385841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard */
39395841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillardstatic void
39405841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel VeillardxmlTextWriterStartDocumentCallback(void *ctx)
39415841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard{
39425841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
39435841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlDocPtr doc;
39445841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
39455841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#ifdef DEBUG_SAX
39465841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    xmlGenericError(xmlGenericErrorContext, "SAX.startDocument()\n");
39475841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#endif
39485841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if (ctxt->html) {
39495841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#ifdef LIBXML_HTML_ENABLED
39505841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc == NULL)
39515841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
39525841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc == NULL) {
39535841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
39545841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                ctxt->sax->error(ctxt->userData,
39555841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                 "SAX.startDocument(): out of memory\n");
39565841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->errNo = XML_ERR_NO_MEMORY;
39575841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->instate = XML_PARSER_EOF;
39585841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->disableSAX = 1;
39595841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            return;
39605841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        }
39615841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#else
39625841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        xmlGenericError(xmlGenericErrorContext,
39635841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                        "libxml2 built without HTML support\n");
39645841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->errNo = XML_ERR_INTERNAL_ERROR;
39655841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->instate = XML_PARSER_EOF;
39665841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->disableSAX = 1;
39675841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        return;
39685841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard#endif
39695841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    } else {
39705841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        doc = ctxt->myDoc;
39715841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (doc == NULL)
39725841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            doc = ctxt->myDoc = xmlNewDoc(ctxt->version);
39735841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (doc != NULL) {
39745841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if (doc->children == NULL) {
39755841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                if (ctxt->encoding != NULL)
39765841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                    doc->encoding = xmlStrdup(ctxt->encoding);
39775841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                else
39785841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                    doc->encoding = NULL;
39795841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                doc->standalone = ctxt->standalone;
39805841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            }
39815841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        } else {
39825841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
39835841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                ctxt->sax->error(ctxt->userData,
39845841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                                 "SAX.startDocument(): out of memory\n");
39855841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->errNo = XML_ERR_NO_MEMORY;
39865841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->instate = XML_PARSER_EOF;
39875841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->disableSAX = 1;
39885841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            return;
39895841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        }
39905841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
39915841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) &&
39925841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        (ctxt->input != NULL) && (ctxt->input->filename != NULL)) {
39935841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        ctxt->myDoc->URL =
39945841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            xmlCanonicPath((const xmlChar *) ctxt->input->filename);
39955841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard        if (ctxt->myDoc->URL == NULL)
39965841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard            ctxt->myDoc->URL =
39975841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard                xmlStrdup((const xmlChar *) ctxt->input->filename);
39985841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard    }
39995841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard}
40005841f0e0a44fdfaf6cee6511fbb71d5a76e3ff23Daniel Veillard
40012cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
40022cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterSetIndent:
40032cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
40042cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @indent:  do indentation?
40052cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
40062cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Set indentation output. indent = 0 do not indentation. indent > 0 do indentation.
40072cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
40082cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or 0 otherwise.
40092cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard */
40102cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardint
40112cca446b86a77022d5b847b106544aede7207dbcDaniel VeillardxmlTextWriterSetIndent (xmlTextWriterPtr writer, int indent)
40122cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard{
40132cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  if (indent < 0)
40142cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    return -1;
40152cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40162cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  writer->indent = indent;
40172cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  writer->doindent = 1;
40182cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40192cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  return 0;
40202cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
40212cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40222cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
40232cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterSetIndentString:
40242cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
40252cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @str:  the xmlChar string
40262cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
40272cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Set string indentation.
40282cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
40292cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or 0 otherwise.
40302cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard */
40312cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardint
40322cca446b86a77022d5b847b106544aede7207dbcDaniel VeillardxmlTextWriterSetIndentString (xmlTextWriterPtr writer, xmlChar *str)
40332cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard{
40342cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40352cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  if (!str)
40362cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    return -1;
40372cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40382cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  writer->ichar = xmlStrdup (str);
40392cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40402cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  if (!writer->ichar)
40412cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    return -1;
40422cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  else
40432cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    return 0;
40442cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
40452cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40462cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard/**
40472cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * xmlTextWriterWriteIndent:
40482cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * @writer:  the xmlTextWriterPtr
40492cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
40502cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Write indent string.
40512cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard *
40522cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard * Returns -1 on error or the number of strings written.
40532cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard */
40542cca446b86a77022d5b847b106544aede7207dbcDaniel Veillardstatic int
40552cca446b86a77022d5b847b106544aede7207dbcDaniel VeillardxmlTextWriterWriteIndent (xmlTextWriterPtr writer)
40562cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard{
40572cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  int lksize;
40582cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  int i;
40595d4cba413a2abd090b2d4b934e6316e198509eccWilliam M. Brack  int ret = -1;		/* just in case of an empty list */
40602cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40612cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  lksize = xmlListSize (writer->nodes);
40622cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  for (i = 0; i < (lksize-1); i++) {
40635d4cba413a2abd090b2d4b934e6316e198509eccWilliam M. Brack    ret = xmlOutputBufferWriteString (writer->out,
40645d4cba413a2abd090b2d4b934e6316e198509eccWilliam M. Brack            (const char *)writer->ichar);
40652cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard    if (ret == -1)
40662cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard      break;
40672cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  }
40682cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40692cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard  return (ret == -1)?ret:i;
40702cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard}
40712cca446b86a77022d5b847b106544aede7207dbcDaniel Veillard
40721d211e227372e5ed75a69fbad5f50d185d0af936Daniel Veillard#endif
4073