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