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