Annotation of embedaddon/libxml2/xmlwriter.c, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * xmlwriter.c: XML text writer implementation
! 4: *
! 5: * For license and disclaimer see the license and disclaimer of
! 6: * libxml2.
! 7: *
! 8: * alfred@mickautsch.de
! 9: */
! 10:
! 11: #define IN_LIBXML
! 12: #include "libxml.h"
! 13: #include <string.h>
! 14:
! 15: #include <libxml/xmlmemory.h>
! 16: #include <libxml/parser.h>
! 17: #include <libxml/uri.h>
! 18: #include <libxml/HTMLtree.h>
! 19:
! 20: #ifdef LIBXML_WRITER_ENABLED
! 21:
! 22: #include <libxml/xmlwriter.h>
! 23:
! 24: #define B64LINELEN 72
! 25: #define B64CRLF "\r\n"
! 26:
! 27: /*
! 28: * The following VA_COPY was coded following an example in
! 29: * the Samba project. It may not be sufficient for some
! 30: * esoteric implementations of va_list (i.e. it may need
! 31: * something involving a memcpy) but (hopefully) will be
! 32: * sufficient for libxml2.
! 33: */
! 34: #ifndef VA_COPY
! 35: #ifdef HAVE_VA_COPY
! 36: #define VA_COPY(dest, src) va_copy(dest, src)
! 37: #else
! 38: #ifdef HAVE___VA_COPY
! 39: #define VA_COPY(dest,src) __va_copy(dest, src)
! 40: #else
! 41: #define VA_COPY(dest,src) (dest) = (src)
! 42: #endif
! 43: #endif
! 44: #endif
! 45:
! 46: /*
! 47: * Types are kept private
! 48: */
! 49: typedef enum {
! 50: XML_TEXTWRITER_NONE = 0,
! 51: XML_TEXTWRITER_NAME,
! 52: XML_TEXTWRITER_ATTRIBUTE,
! 53: XML_TEXTWRITER_TEXT,
! 54: XML_TEXTWRITER_PI,
! 55: XML_TEXTWRITER_PI_TEXT,
! 56: XML_TEXTWRITER_CDATA,
! 57: XML_TEXTWRITER_DTD,
! 58: XML_TEXTWRITER_DTD_TEXT,
! 59: XML_TEXTWRITER_DTD_ELEM,
! 60: XML_TEXTWRITER_DTD_ELEM_TEXT,
! 61: XML_TEXTWRITER_DTD_ATTL,
! 62: XML_TEXTWRITER_DTD_ATTL_TEXT,
! 63: XML_TEXTWRITER_DTD_ENTY, /* entity */
! 64: XML_TEXTWRITER_DTD_ENTY_TEXT,
! 65: XML_TEXTWRITER_DTD_PENT, /* parameter entity */
! 66: XML_TEXTWRITER_COMMENT
! 67: } xmlTextWriterState;
! 68:
! 69: typedef struct _xmlTextWriterStackEntry xmlTextWriterStackEntry;
! 70:
! 71: struct _xmlTextWriterStackEntry {
! 72: xmlChar *name;
! 73: xmlTextWriterState state;
! 74: };
! 75:
! 76: typedef struct _xmlTextWriterNsStackEntry xmlTextWriterNsStackEntry;
! 77: struct _xmlTextWriterNsStackEntry {
! 78: xmlChar *prefix;
! 79: xmlChar *uri;
! 80: xmlLinkPtr elem;
! 81: };
! 82:
! 83: struct _xmlTextWriter {
! 84: xmlOutputBufferPtr out; /* output buffer */
! 85: xmlListPtr nodes; /* element name stack */
! 86: xmlListPtr nsstack; /* name spaces stack */
! 87: int level;
! 88: int indent; /* enable indent */
! 89: int doindent; /* internal indent flag */
! 90: xmlChar *ichar; /* indent character */
! 91: char qchar; /* character used for quoting attribute values */
! 92: xmlParserCtxtPtr ctxt;
! 93: int no_doc_free;
! 94: xmlDocPtr doc;
! 95: };
! 96:
! 97: static void xmlFreeTextWriterStackEntry(xmlLinkPtr lk);
! 98: static int xmlCmpTextWriterStackEntry(const void *data0,
! 99: const void *data1);
! 100: static int xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer);
! 101: static void xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk);
! 102: static int xmlCmpTextWriterNsStackEntry(const void *data0,
! 103: const void *data1);
! 104: static int xmlTextWriterWriteDocCallback(void *context,
! 105: const xmlChar * str, int len);
! 106: static int xmlTextWriterCloseDocCallback(void *context);
! 107:
! 108: static xmlChar *xmlTextWriterVSprintf(const char *format, va_list argptr);
! 109: static int xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
! 110: const unsigned char *data);
! 111: static void xmlTextWriterStartDocumentCallback(void *ctx);
! 112: static int xmlTextWriterWriteIndent(xmlTextWriterPtr writer);
! 113: static int
! 114: xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
! 115: xmlTextWriterStackEntry * p);
! 116:
! 117: /**
! 118: * xmlWriterErrMsg:
! 119: * @ctxt: a writer context
! 120: * @error: the error number
! 121: * @msg: the error message
! 122: *
! 123: * Handle a writer error
! 124: */
! 125: static void
! 126: xmlWriterErrMsg(xmlTextWriterPtr ctxt, xmlParserErrors error,
! 127: const char *msg)
! 128: {
! 129: if (ctxt != NULL) {
! 130: __xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
! 131: NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
! 132: NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg);
! 133: } else {
! 134: __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
! 135: XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, 0, 0, "%s", msg);
! 136: }
! 137: }
! 138:
! 139: /**
! 140: * xmlWriterErrMsgInt:
! 141: * @ctxt: a writer context
! 142: * @error: the error number
! 143: * @msg: the error message
! 144: * @val: an int
! 145: *
! 146: * Handle a writer error
! 147: */
! 148: static void
! 149: xmlWriterErrMsgInt(xmlTextWriterPtr ctxt, xmlParserErrors error,
! 150: const char *msg, int val)
! 151: {
! 152: if (ctxt != NULL) {
! 153: __xmlRaiseError(NULL, NULL, NULL, ctxt->ctxt,
! 154: NULL, XML_FROM_WRITER, error, XML_ERR_FATAL,
! 155: NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
! 156: } else {
! 157: __xmlRaiseError(NULL, NULL, NULL, NULL, NULL, XML_FROM_WRITER, error,
! 158: XML_ERR_FATAL, NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
! 159: }
! 160: }
! 161:
! 162: /**
! 163: * xmlNewTextWriter:
! 164: * @out: an xmlOutputBufferPtr
! 165: *
! 166: * Create a new xmlNewTextWriter structure using an xmlOutputBufferPtr
! 167: * NOTE: the @out parameter will be deallocated when the writer is closed
! 168: * (if the call succeed.)
! 169: *
! 170: * Returns the new xmlTextWriterPtr or NULL in case of error
! 171: */
! 172: xmlTextWriterPtr
! 173: xmlNewTextWriter(xmlOutputBufferPtr out)
! 174: {
! 175: xmlTextWriterPtr ret;
! 176:
! 177: ret = (xmlTextWriterPtr) xmlMalloc(sizeof(xmlTextWriter));
! 178: if (ret == NULL) {
! 179: xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
! 180: "xmlNewTextWriter : out of memory!\n");
! 181: return NULL;
! 182: }
! 183: memset(ret, 0, (size_t) sizeof(xmlTextWriter));
! 184:
! 185: ret->nodes = xmlListCreate((xmlListDeallocator)
! 186: xmlFreeTextWriterStackEntry,
! 187: (xmlListDataCompare)
! 188: xmlCmpTextWriterStackEntry);
! 189: if (ret->nodes == NULL) {
! 190: xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
! 191: "xmlNewTextWriter : out of memory!\n");
! 192: xmlFree(ret);
! 193: return NULL;
! 194: }
! 195:
! 196: ret->nsstack = xmlListCreate((xmlListDeallocator)
! 197: xmlFreeTextWriterNsStackEntry,
! 198: (xmlListDataCompare)
! 199: xmlCmpTextWriterNsStackEntry);
! 200: if (ret->nsstack == NULL) {
! 201: xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
! 202: "xmlNewTextWriter : out of memory!\n");
! 203: xmlListDelete(ret->nodes);
! 204: xmlFree(ret);
! 205: return NULL;
! 206: }
! 207:
! 208: ret->out = out;
! 209: ret->ichar = xmlStrdup(BAD_CAST " ");
! 210: ret->qchar = '"';
! 211:
! 212: if (!ret->ichar) {
! 213: xmlListDelete(ret->nodes);
! 214: xmlListDelete(ret->nsstack);
! 215: xmlFree(ret);
! 216: xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
! 217: "xmlNewTextWriter : out of memory!\n");
! 218: return NULL;
! 219: }
! 220:
! 221: ret->doc = xmlNewDoc(NULL);
! 222:
! 223: ret->no_doc_free = 0;
! 224:
! 225: return ret;
! 226: }
! 227:
! 228: /**
! 229: * xmlNewTextWriterFilename:
! 230: * @uri: the URI of the resource for the output
! 231: * @compression: compress the output?
! 232: *
! 233: * Create a new xmlNewTextWriter structure with @uri as output
! 234: *
! 235: * Returns the new xmlTextWriterPtr or NULL in case of error
! 236: */
! 237: xmlTextWriterPtr
! 238: xmlNewTextWriterFilename(const char *uri, int compression)
! 239: {
! 240: xmlTextWriterPtr ret;
! 241: xmlOutputBufferPtr out;
! 242:
! 243: out = xmlOutputBufferCreateFilename(uri, NULL, compression);
! 244: if (out == NULL) {
! 245: xmlWriterErrMsg(NULL, XML_IO_EIO,
! 246: "xmlNewTextWriterFilename : cannot open uri\n");
! 247: return NULL;
! 248: }
! 249:
! 250: ret = xmlNewTextWriter(out);
! 251: if (ret == NULL) {
! 252: xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
! 253: "xmlNewTextWriterFilename : out of memory!\n");
! 254: xmlOutputBufferClose(out);
! 255: return NULL;
! 256: }
! 257:
! 258: ret->indent = 0;
! 259: ret->doindent = 0;
! 260: return ret;
! 261: }
! 262:
! 263: /**
! 264: * xmlNewTextWriterMemory:
! 265: * @buf: xmlBufferPtr
! 266: * @compression: compress the output?
! 267: *
! 268: * Create a new xmlNewTextWriter structure with @buf as output
! 269: * TODO: handle compression
! 270: *
! 271: * Returns the new xmlTextWriterPtr or NULL in case of error
! 272: */
! 273: xmlTextWriterPtr
! 274: xmlNewTextWriterMemory(xmlBufferPtr buf, int compression ATTRIBUTE_UNUSED)
! 275: {
! 276: xmlTextWriterPtr ret;
! 277: xmlOutputBufferPtr out;
! 278:
! 279: /*::todo handle compression */
! 280: out = xmlOutputBufferCreateBuffer(buf, NULL);
! 281:
! 282: if (out == NULL) {
! 283: xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
! 284: "xmlNewTextWriterMemory : out of memory!\n");
! 285: return NULL;
! 286: }
! 287:
! 288: ret = xmlNewTextWriter(out);
! 289: if (ret == NULL) {
! 290: xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
! 291: "xmlNewTextWriterMemory : out of memory!\n");
! 292: xmlOutputBufferClose(out);
! 293: return NULL;
! 294: }
! 295:
! 296: return ret;
! 297: }
! 298:
! 299: /**
! 300: * xmlNewTextWriterPushParser:
! 301: * @ctxt: xmlParserCtxtPtr to hold the new XML document tree
! 302: * @compression: compress the output?
! 303: *
! 304: * Create a new xmlNewTextWriter structure with @ctxt as output
! 305: * NOTE: the @ctxt context will be freed with the resulting writer
! 306: * (if the call succeeds).
! 307: * TODO: handle compression
! 308: *
! 309: * Returns the new xmlTextWriterPtr or NULL in case of error
! 310: */
! 311: xmlTextWriterPtr
! 312: xmlNewTextWriterPushParser(xmlParserCtxtPtr ctxt,
! 313: int compression ATTRIBUTE_UNUSED)
! 314: {
! 315: xmlTextWriterPtr ret;
! 316: xmlOutputBufferPtr out;
! 317:
! 318: if (ctxt == NULL) {
! 319: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 320: "xmlNewTextWriterPushParser : invalid context!\n");
! 321: return NULL;
! 322: }
! 323:
! 324: out = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
! 325: xmlTextWriterWriteDocCallback,
! 326: (xmlOutputCloseCallback)
! 327: xmlTextWriterCloseDocCallback,
! 328: (void *) ctxt, NULL);
! 329: if (out == NULL) {
! 330: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 331: "xmlNewTextWriterPushParser : error at xmlOutputBufferCreateIO!\n");
! 332: return NULL;
! 333: }
! 334:
! 335: ret = xmlNewTextWriter(out);
! 336: if (ret == NULL) {
! 337: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 338: "xmlNewTextWriterPushParser : error at xmlNewTextWriter!\n");
! 339: xmlOutputBufferClose(out);
! 340: return NULL;
! 341: }
! 342:
! 343: ret->ctxt = ctxt;
! 344:
! 345: return ret;
! 346: }
! 347:
! 348: /**
! 349: * xmlNewTextWriterDoc:
! 350: * @doc: address of a xmlDocPtr to hold the new XML document tree
! 351: * @compression: compress the output?
! 352: *
! 353: * Create a new xmlNewTextWriter structure with @*doc as output
! 354: *
! 355: * Returns the new xmlTextWriterPtr or NULL in case of error
! 356: */
! 357: xmlTextWriterPtr
! 358: xmlNewTextWriterDoc(xmlDocPtr * doc, int compression)
! 359: {
! 360: xmlTextWriterPtr ret;
! 361: xmlSAXHandler saxHandler;
! 362: xmlParserCtxtPtr ctxt;
! 363:
! 364: memset(&saxHandler, '\0', sizeof(saxHandler));
! 365: xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
! 366: saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
! 367: saxHandler.startElement = xmlSAX2StartElement;
! 368: saxHandler.endElement = xmlSAX2EndElement;
! 369:
! 370: ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
! 371: if (ctxt == NULL) {
! 372: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 373: "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
! 374: return NULL;
! 375: }
! 376: /*
! 377: * For some reason this seems to completely break if node names
! 378: * are interned.
! 379: */
! 380: ctxt->dictNames = 0;
! 381:
! 382: ctxt->myDoc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION);
! 383: if (ctxt->myDoc == NULL) {
! 384: xmlFreeParserCtxt(ctxt);
! 385: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 386: "xmlNewTextWriterDoc : error at xmlNewDoc!\n");
! 387: return NULL;
! 388: }
! 389:
! 390: ret = xmlNewTextWriterPushParser(ctxt, compression);
! 391: if (ret == NULL) {
! 392: xmlFreeDoc(ctxt->myDoc);
! 393: xmlFreeParserCtxt(ctxt);
! 394: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 395: "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
! 396: return NULL;
! 397: }
! 398:
! 399: xmlSetDocCompressMode(ctxt->myDoc, compression);
! 400:
! 401: if (doc != NULL) {
! 402: *doc = ctxt->myDoc;
! 403: ret->no_doc_free = 1;
! 404: }
! 405:
! 406: return ret;
! 407: }
! 408:
! 409: /**
! 410: * xmlNewTextWriterTree:
! 411: * @doc: xmlDocPtr
! 412: * @node: xmlNodePtr or NULL for doc->children
! 413: * @compression: compress the output?
! 414: *
! 415: * Create a new xmlNewTextWriter structure with @doc as output
! 416: * starting at @node
! 417: *
! 418: * Returns the new xmlTextWriterPtr or NULL in case of error
! 419: */
! 420: xmlTextWriterPtr
! 421: xmlNewTextWriterTree(xmlDocPtr doc, xmlNodePtr node, int compression)
! 422: {
! 423: xmlTextWriterPtr ret;
! 424: xmlSAXHandler saxHandler;
! 425: xmlParserCtxtPtr ctxt;
! 426:
! 427: if (doc == NULL) {
! 428: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 429: "xmlNewTextWriterTree : invalid document tree!\n");
! 430: return NULL;
! 431: }
! 432:
! 433: memset(&saxHandler, '\0', sizeof(saxHandler));
! 434: xmlSAX2InitDefaultSAXHandler(&saxHandler, 1);
! 435: saxHandler.startDocument = xmlTextWriterStartDocumentCallback;
! 436: saxHandler.startElement = xmlSAX2StartElement;
! 437: saxHandler.endElement = xmlSAX2EndElement;
! 438:
! 439: ctxt = xmlCreatePushParserCtxt(&saxHandler, NULL, NULL, 0, NULL);
! 440: if (ctxt == NULL) {
! 441: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 442: "xmlNewTextWriterDoc : error at xmlCreatePushParserCtxt!\n");
! 443: return NULL;
! 444: }
! 445: /*
! 446: * For some reason this seems to completely break if node names
! 447: * are interned.
! 448: */
! 449: ctxt->dictNames = 0;
! 450:
! 451: ret = xmlNewTextWriterPushParser(ctxt, compression);
! 452: if (ret == NULL) {
! 453: xmlFreeParserCtxt(ctxt);
! 454: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 455: "xmlNewTextWriterDoc : error at xmlNewTextWriterPushParser!\n");
! 456: return NULL;
! 457: }
! 458:
! 459: ctxt->myDoc = doc;
! 460: ctxt->node = node;
! 461: ret->no_doc_free = 1;
! 462:
! 463: xmlSetDocCompressMode(doc, compression);
! 464:
! 465: return ret;
! 466: }
! 467:
! 468: /**
! 469: * xmlFreeTextWriter:
! 470: * @writer: the xmlTextWriterPtr
! 471: *
! 472: * Deallocate all the resources associated to the writer
! 473: */
! 474: void
! 475: xmlFreeTextWriter(xmlTextWriterPtr writer)
! 476: {
! 477: if (writer == NULL)
! 478: return;
! 479:
! 480: if (writer->out != NULL)
! 481: xmlOutputBufferClose(writer->out);
! 482:
! 483: if (writer->nodes != NULL)
! 484: xmlListDelete(writer->nodes);
! 485:
! 486: if (writer->nsstack != NULL)
! 487: xmlListDelete(writer->nsstack);
! 488:
! 489: if (writer->ctxt != NULL) {
! 490: if ((writer->ctxt->myDoc != NULL) && (writer->no_doc_free == 0)) {
! 491: xmlFreeDoc(writer->ctxt->myDoc);
! 492: writer->ctxt->myDoc = NULL;
! 493: }
! 494: xmlFreeParserCtxt(writer->ctxt);
! 495: }
! 496:
! 497: if (writer->doc != NULL)
! 498: xmlFreeDoc(writer->doc);
! 499:
! 500: if (writer->ichar != NULL)
! 501: xmlFree(writer->ichar);
! 502: xmlFree(writer);
! 503: }
! 504:
! 505: /**
! 506: * xmlTextWriterStartDocument:
! 507: * @writer: the xmlTextWriterPtr
! 508: * @version: the xml version ("1.0") or NULL for default ("1.0")
! 509: * @encoding: the encoding or NULL for default
! 510: * @standalone: "yes" or "no" or NULL for default
! 511: *
! 512: * Start a new xml document
! 513: *
! 514: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 515: */
! 516: int
! 517: xmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version,
! 518: const char *encoding, const char *standalone)
! 519: {
! 520: int count;
! 521: int sum;
! 522: xmlLinkPtr lk;
! 523: xmlCharEncodingHandlerPtr encoder;
! 524:
! 525: if ((writer == NULL) || (writer->out == NULL)) {
! 526: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 527: "xmlTextWriterStartDocument : invalid writer!\n");
! 528: return -1;
! 529: }
! 530:
! 531: lk = xmlListFront(writer->nodes);
! 532: if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
! 533: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 534: "xmlTextWriterStartDocument : not allowed in this context!\n");
! 535: return -1;
! 536: }
! 537:
! 538: encoder = NULL;
! 539: if (encoding != NULL) {
! 540: encoder = xmlFindCharEncodingHandler(encoding);
! 541: if (encoder == NULL) {
! 542: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 543: "xmlTextWriterStartDocument : out of memory!\n");
! 544: return -1;
! 545: }
! 546: }
! 547:
! 548: writer->out->encoder = encoder;
! 549: if (encoder != NULL) {
! 550: if (writer->out->conv == NULL) {
! 551: writer->out->conv = xmlBufferCreateSize(4000);
! 552: }
! 553: xmlCharEncOutFunc(encoder, writer->out->conv, NULL);
! 554: if ((writer->doc != NULL) && (writer->doc->encoding == NULL))
! 555: writer->doc->encoding = xmlStrdup((xmlChar *)writer->out->encoder->name);
! 556: } else
! 557: writer->out->conv = NULL;
! 558:
! 559: sum = 0;
! 560: count = xmlOutputBufferWriteString(writer->out, "<?xml version=");
! 561: if (count < 0)
! 562: return -1;
! 563: sum += count;
! 564: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 565: if (count < 0)
! 566: return -1;
! 567: sum += count;
! 568: if (version != 0)
! 569: count = xmlOutputBufferWriteString(writer->out, version);
! 570: else
! 571: count = xmlOutputBufferWriteString(writer->out, "1.0");
! 572: if (count < 0)
! 573: return -1;
! 574: sum += count;
! 575: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 576: if (count < 0)
! 577: return -1;
! 578: sum += count;
! 579: if (writer->out->encoder != 0) {
! 580: count = xmlOutputBufferWriteString(writer->out, " encoding=");
! 581: if (count < 0)
! 582: return -1;
! 583: sum += count;
! 584: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 585: if (count < 0)
! 586: return -1;
! 587: sum += count;
! 588: count =
! 589: xmlOutputBufferWriteString(writer->out,
! 590: writer->out->encoder->name);
! 591: if (count < 0)
! 592: return -1;
! 593: sum += count;
! 594: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 595: if (count < 0)
! 596: return -1;
! 597: sum += count;
! 598: }
! 599:
! 600: if (standalone != 0) {
! 601: count = xmlOutputBufferWriteString(writer->out, " standalone=");
! 602: if (count < 0)
! 603: return -1;
! 604: sum += count;
! 605: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 606: if (count < 0)
! 607: return -1;
! 608: sum += count;
! 609: count = xmlOutputBufferWriteString(writer->out, standalone);
! 610: if (count < 0)
! 611: return -1;
! 612: sum += count;
! 613: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 614: if (count < 0)
! 615: return -1;
! 616: sum += count;
! 617: }
! 618:
! 619: count = xmlOutputBufferWriteString(writer->out, "?>\n");
! 620: if (count < 0)
! 621: return -1;
! 622: sum += count;
! 623:
! 624: return sum;
! 625: }
! 626:
! 627: /**
! 628: * xmlTextWriterEndDocument:
! 629: * @writer: the xmlTextWriterPtr
! 630: *
! 631: * End an xml document. All open elements are closed, and
! 632: * the content is flushed to the output.
! 633: *
! 634: * Returns the bytes written or -1 in case of error
! 635: */
! 636: int
! 637: xmlTextWriterEndDocument(xmlTextWriterPtr writer)
! 638: {
! 639: int count;
! 640: int sum;
! 641: xmlLinkPtr lk;
! 642: xmlTextWriterStackEntry *p;
! 643:
! 644: if (writer == NULL) {
! 645: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 646: "xmlTextWriterEndDocument : invalid writer!\n");
! 647: return -1;
! 648: }
! 649:
! 650: sum = 0;
! 651: while ((lk = xmlListFront(writer->nodes)) != NULL) {
! 652: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 653: if (p == 0)
! 654: break;
! 655: switch (p->state) {
! 656: case XML_TEXTWRITER_NAME:
! 657: case XML_TEXTWRITER_ATTRIBUTE:
! 658: case XML_TEXTWRITER_TEXT:
! 659: count = xmlTextWriterEndElement(writer);
! 660: if (count < 0)
! 661: return -1;
! 662: sum += count;
! 663: break;
! 664: case XML_TEXTWRITER_PI:
! 665: case XML_TEXTWRITER_PI_TEXT:
! 666: count = xmlTextWriterEndPI(writer);
! 667: if (count < 0)
! 668: return -1;
! 669: sum += count;
! 670: break;
! 671: case XML_TEXTWRITER_CDATA:
! 672: count = xmlTextWriterEndCDATA(writer);
! 673: if (count < 0)
! 674: return -1;
! 675: sum += count;
! 676: break;
! 677: case XML_TEXTWRITER_DTD:
! 678: case XML_TEXTWRITER_DTD_TEXT:
! 679: case XML_TEXTWRITER_DTD_ELEM:
! 680: case XML_TEXTWRITER_DTD_ELEM_TEXT:
! 681: case XML_TEXTWRITER_DTD_ATTL:
! 682: case XML_TEXTWRITER_DTD_ATTL_TEXT:
! 683: case XML_TEXTWRITER_DTD_ENTY:
! 684: case XML_TEXTWRITER_DTD_ENTY_TEXT:
! 685: case XML_TEXTWRITER_DTD_PENT:
! 686: count = xmlTextWriterEndDTD(writer);
! 687: if (count < 0)
! 688: return -1;
! 689: sum += count;
! 690: break;
! 691: case XML_TEXTWRITER_COMMENT:
! 692: count = xmlTextWriterEndComment(writer);
! 693: if (count < 0)
! 694: return -1;
! 695: sum += count;
! 696: break;
! 697: default:
! 698: break;
! 699: }
! 700: }
! 701:
! 702: if (!writer->indent) {
! 703: count = xmlOutputBufferWriteString(writer->out, "\n");
! 704: if (count < 0)
! 705: return -1;
! 706: sum += count;
! 707: }
! 708:
! 709: sum += xmlTextWriterFlush(writer);
! 710:
! 711: return sum;
! 712: }
! 713:
! 714: /**
! 715: * xmlTextWriterStartComment:
! 716: * @writer: the xmlTextWriterPtr
! 717: *
! 718: * Start an xml comment.
! 719: *
! 720: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 721: */
! 722: int
! 723: xmlTextWriterStartComment(xmlTextWriterPtr writer)
! 724: {
! 725: int count;
! 726: int sum;
! 727: xmlLinkPtr lk;
! 728: xmlTextWriterStackEntry *p;
! 729:
! 730: if (writer == NULL) {
! 731: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 732: "xmlTextWriterStartComment : invalid writer!\n");
! 733: return -1;
! 734: }
! 735:
! 736: sum = 0;
! 737: lk = xmlListFront(writer->nodes);
! 738: if (lk != 0) {
! 739: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 740: if (p != 0) {
! 741: switch (p->state) {
! 742: case XML_TEXTWRITER_TEXT:
! 743: case XML_TEXTWRITER_NONE:
! 744: break;
! 745: case XML_TEXTWRITER_NAME:
! 746: /* Output namespace declarations */
! 747: count = xmlTextWriterOutputNSDecl(writer);
! 748: if (count < 0)
! 749: return -1;
! 750: sum += count;
! 751: count = xmlOutputBufferWriteString(writer->out, ">");
! 752: if (count < 0)
! 753: return -1;
! 754: sum += count;
! 755: if (writer->indent) {
! 756: count =
! 757: xmlOutputBufferWriteString(writer->out, "\n");
! 758: if (count < 0)
! 759: return -1;
! 760: sum += count;
! 761: }
! 762: p->state = XML_TEXTWRITER_TEXT;
! 763: break;
! 764: default:
! 765: return -1;
! 766: }
! 767: }
! 768: }
! 769:
! 770: p = (xmlTextWriterStackEntry *)
! 771: xmlMalloc(sizeof(xmlTextWriterStackEntry));
! 772: if (p == 0) {
! 773: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 774: "xmlTextWriterStartElement : out of memory!\n");
! 775: return -1;
! 776: }
! 777:
! 778: p->name = NULL;
! 779: p->state = XML_TEXTWRITER_COMMENT;
! 780:
! 781: xmlListPushFront(writer->nodes, p);
! 782:
! 783: if (writer->indent) {
! 784: count = xmlTextWriterWriteIndent(writer);
! 785: if (count < 0)
! 786: return -1;
! 787: sum += count;
! 788: }
! 789:
! 790: count = xmlOutputBufferWriteString(writer->out, "<!--");
! 791: if (count < 0)
! 792: return -1;
! 793: sum += count;
! 794:
! 795: return sum;
! 796: }
! 797:
! 798: /**
! 799: * xmlTextWriterEndComment:
! 800: * @writer: the xmlTextWriterPtr
! 801: *
! 802: * End the current xml coment.
! 803: *
! 804: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 805: */
! 806: int
! 807: xmlTextWriterEndComment(xmlTextWriterPtr writer)
! 808: {
! 809: int count;
! 810: int sum;
! 811: xmlLinkPtr lk;
! 812: xmlTextWriterStackEntry *p;
! 813:
! 814: if (writer == NULL) {
! 815: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 816: "xmlTextWriterEndComment : invalid writer!\n");
! 817: return -1;
! 818: }
! 819:
! 820: lk = xmlListFront(writer->nodes);
! 821: if (lk == 0) {
! 822: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 823: "xmlTextWriterEndComment : not allowed in this context!\n");
! 824: return -1;
! 825: }
! 826:
! 827: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 828: if (p == 0)
! 829: return -1;
! 830:
! 831: sum = 0;
! 832: switch (p->state) {
! 833: case XML_TEXTWRITER_COMMENT:
! 834: count = xmlOutputBufferWriteString(writer->out, "-->");
! 835: if (count < 0)
! 836: return -1;
! 837: sum += count;
! 838: break;
! 839: default:
! 840: return -1;
! 841: }
! 842:
! 843: if (writer->indent) {
! 844: count = xmlOutputBufferWriteString(writer->out, "\n");
! 845: if (count < 0)
! 846: return -1;
! 847: sum += count;
! 848: }
! 849:
! 850: xmlListPopFront(writer->nodes);
! 851: return sum;
! 852: }
! 853:
! 854: /**
! 855: * xmlTextWriterWriteFormatComment:
! 856: * @writer: the xmlTextWriterPtr
! 857: * @format: format string (see printf)
! 858: * @...: extra parameters for the format
! 859: *
! 860: * Write an xml comment.
! 861: *
! 862: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 863: */
! 864: int XMLCDECL
! 865: xmlTextWriterWriteFormatComment(xmlTextWriterPtr writer,
! 866: const char *format, ...)
! 867: {
! 868: int rc;
! 869: va_list ap;
! 870:
! 871: va_start(ap, format);
! 872:
! 873: rc = xmlTextWriterWriteVFormatComment(writer, format, ap);
! 874:
! 875: va_end(ap);
! 876: return rc;
! 877: }
! 878:
! 879: /**
! 880: * xmlTextWriterWriteVFormatComment:
! 881: * @writer: the xmlTextWriterPtr
! 882: * @format: format string (see printf)
! 883: * @argptr: pointer to the first member of the variable argument list.
! 884: *
! 885: * Write an xml comment.
! 886: *
! 887: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 888: */
! 889: int
! 890: xmlTextWriterWriteVFormatComment(xmlTextWriterPtr writer,
! 891: const char *format, va_list argptr)
! 892: {
! 893: int rc;
! 894: xmlChar *buf;
! 895:
! 896: if (writer == NULL) {
! 897: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 898: "xmlTextWriterWriteVFormatComment : invalid writer!\n");
! 899: return -1;
! 900: }
! 901:
! 902: buf = xmlTextWriterVSprintf(format, argptr);
! 903: if (buf == NULL)
! 904: return -1;
! 905:
! 906: rc = xmlTextWriterWriteComment(writer, buf);
! 907:
! 908: xmlFree(buf);
! 909: return rc;
! 910: }
! 911:
! 912: /**
! 913: * xmlTextWriterWriteComment:
! 914: * @writer: the xmlTextWriterPtr
! 915: * @content: comment string
! 916: *
! 917: * Write an xml comment.
! 918: *
! 919: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 920: */
! 921: int
! 922: xmlTextWriterWriteComment(xmlTextWriterPtr writer, const xmlChar * content)
! 923: {
! 924: int count;
! 925: int sum;
! 926:
! 927: sum = 0;
! 928: count = xmlTextWriterStartComment(writer);
! 929: if (count < 0)
! 930: return -1;
! 931: sum += count;
! 932: count = xmlTextWriterWriteString(writer, content);
! 933: if (count < 0)
! 934: return -1;
! 935: sum += count;
! 936: count = xmlTextWriterEndComment(writer);
! 937: if (count < 0)
! 938: return -1;
! 939: sum += count;
! 940:
! 941: return sum;
! 942: }
! 943:
! 944: /**
! 945: * xmlTextWriterStartElement:
! 946: * @writer: the xmlTextWriterPtr
! 947: * @name: element name
! 948: *
! 949: * Start an xml element.
! 950: *
! 951: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 952: */
! 953: int
! 954: xmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar * name)
! 955: {
! 956: int count;
! 957: int sum;
! 958: xmlLinkPtr lk;
! 959: xmlTextWriterStackEntry *p;
! 960:
! 961: if ((writer == NULL) || (name == NULL) || (*name == '\0'))
! 962: return -1;
! 963:
! 964: sum = 0;
! 965: lk = xmlListFront(writer->nodes);
! 966: if (lk != 0) {
! 967: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 968: if (p != 0) {
! 969: switch (p->state) {
! 970: case XML_TEXTWRITER_PI:
! 971: case XML_TEXTWRITER_PI_TEXT:
! 972: return -1;
! 973: case XML_TEXTWRITER_NONE:
! 974: break;
! 975: case XML_TEXTWRITER_ATTRIBUTE:
! 976: count = xmlTextWriterEndAttribute(writer);
! 977: if (count < 0)
! 978: return -1;
! 979: sum += count;
! 980: /* fallthrough */
! 981: case XML_TEXTWRITER_NAME:
! 982: /* Output namespace declarations */
! 983: count = xmlTextWriterOutputNSDecl(writer);
! 984: if (count < 0)
! 985: return -1;
! 986: sum += count;
! 987: count = xmlOutputBufferWriteString(writer->out, ">");
! 988: if (count < 0)
! 989: return -1;
! 990: sum += count;
! 991: if (writer->indent)
! 992: count =
! 993: xmlOutputBufferWriteString(writer->out, "\n");
! 994: p->state = XML_TEXTWRITER_TEXT;
! 995: break;
! 996: default:
! 997: break;
! 998: }
! 999: }
! 1000: }
! 1001:
! 1002: p = (xmlTextWriterStackEntry *)
! 1003: xmlMalloc(sizeof(xmlTextWriterStackEntry));
! 1004: if (p == 0) {
! 1005: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 1006: "xmlTextWriterStartElement : out of memory!\n");
! 1007: return -1;
! 1008: }
! 1009:
! 1010: p->name = xmlStrdup(name);
! 1011: if (p->name == 0) {
! 1012: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 1013: "xmlTextWriterStartElement : out of memory!\n");
! 1014: xmlFree(p);
! 1015: return -1;
! 1016: }
! 1017: p->state = XML_TEXTWRITER_NAME;
! 1018:
! 1019: xmlListPushFront(writer->nodes, p);
! 1020:
! 1021: if (writer->indent) {
! 1022: count = xmlTextWriterWriteIndent(writer);
! 1023: sum += count;
! 1024: }
! 1025:
! 1026: count = xmlOutputBufferWriteString(writer->out, "<");
! 1027: if (count < 0)
! 1028: return -1;
! 1029: sum += count;
! 1030: count =
! 1031: xmlOutputBufferWriteString(writer->out, (const char *) p->name);
! 1032: if (count < 0)
! 1033: return -1;
! 1034: sum += count;
! 1035:
! 1036: return sum;
! 1037: }
! 1038:
! 1039: /**
! 1040: * xmlTextWriterStartElementNS:
! 1041: * @writer: the xmlTextWriterPtr
! 1042: * @prefix: namespace prefix or NULL
! 1043: * @name: element local name
! 1044: * @namespaceURI: namespace URI or NULL
! 1045: *
! 1046: * Start an xml element with namespace support.
! 1047: *
! 1048: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1049: */
! 1050: int
! 1051: xmlTextWriterStartElementNS(xmlTextWriterPtr writer,
! 1052: const xmlChar * prefix, const xmlChar * name,
! 1053: const xmlChar * namespaceURI)
! 1054: {
! 1055: int count;
! 1056: int sum;
! 1057: xmlChar *buf;
! 1058:
! 1059: if ((writer == NULL) || (name == NULL) || (*name == '\0'))
! 1060: return -1;
! 1061:
! 1062: buf = NULL;
! 1063: if (prefix != 0) {
! 1064: buf = xmlStrdup(prefix);
! 1065: buf = xmlStrcat(buf, BAD_CAST ":");
! 1066: }
! 1067: buf = xmlStrcat(buf, name);
! 1068:
! 1069: sum = 0;
! 1070: count = xmlTextWriterStartElement(writer, buf);
! 1071: xmlFree(buf);
! 1072: if (count < 0)
! 1073: return -1;
! 1074: sum += count;
! 1075:
! 1076: if (namespaceURI != 0) {
! 1077: xmlTextWriterNsStackEntry *p = (xmlTextWriterNsStackEntry *)
! 1078: xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
! 1079: if (p == 0) {
! 1080: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 1081: "xmlTextWriterStartElementNS : out of memory!\n");
! 1082: return -1;
! 1083: }
! 1084:
! 1085: buf = xmlStrdup(BAD_CAST "xmlns");
! 1086: if (prefix != 0) {
! 1087: buf = xmlStrcat(buf, BAD_CAST ":");
! 1088: buf = xmlStrcat(buf, prefix);
! 1089: }
! 1090:
! 1091: p->prefix = buf;
! 1092: p->uri = xmlStrdup(namespaceURI);
! 1093: if (p->uri == 0) {
! 1094: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 1095: "xmlTextWriterStartElementNS : out of memory!\n");
! 1096: xmlFree(p);
! 1097: return -1;
! 1098: }
! 1099: p->elem = xmlListFront(writer->nodes);
! 1100:
! 1101: xmlListPushFront(writer->nsstack, p);
! 1102: }
! 1103:
! 1104: return sum;
! 1105: }
! 1106:
! 1107: /**
! 1108: * xmlTextWriterEndElement:
! 1109: * @writer: the xmlTextWriterPtr
! 1110: *
! 1111: * End the current xml element.
! 1112: *
! 1113: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1114: */
! 1115: int
! 1116: xmlTextWriterEndElement(xmlTextWriterPtr writer)
! 1117: {
! 1118: int count;
! 1119: int sum;
! 1120: xmlLinkPtr lk;
! 1121: xmlTextWriterStackEntry *p;
! 1122:
! 1123: if (writer == NULL)
! 1124: return -1;
! 1125:
! 1126: lk = xmlListFront(writer->nodes);
! 1127: if (lk == 0) {
! 1128: xmlListDelete(writer->nsstack);
! 1129: writer->nsstack = NULL;
! 1130: return -1;
! 1131: }
! 1132:
! 1133: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 1134: if (p == 0) {
! 1135: xmlListDelete(writer->nsstack);
! 1136: writer->nsstack = NULL;
! 1137: return -1;
! 1138: }
! 1139:
! 1140: sum = 0;
! 1141: switch (p->state) {
! 1142: case XML_TEXTWRITER_ATTRIBUTE:
! 1143: count = xmlTextWriterEndAttribute(writer);
! 1144: if (count < 0) {
! 1145: xmlListDelete(writer->nsstack);
! 1146: writer->nsstack = NULL;
! 1147: return -1;
! 1148: }
! 1149: sum += count;
! 1150: /* fallthrough */
! 1151: case XML_TEXTWRITER_NAME:
! 1152: /* Output namespace declarations */
! 1153: count = xmlTextWriterOutputNSDecl(writer);
! 1154: if (count < 0)
! 1155: return -1;
! 1156: sum += count;
! 1157:
! 1158: if (writer->indent) /* next element needs indent */
! 1159: writer->doindent = 1;
! 1160: count = xmlOutputBufferWriteString(writer->out, "/>");
! 1161: if (count < 0)
! 1162: return -1;
! 1163: sum += count;
! 1164: break;
! 1165: case XML_TEXTWRITER_TEXT:
! 1166: if ((writer->indent) && (writer->doindent)) {
! 1167: count = xmlTextWriterWriteIndent(writer);
! 1168: sum += count;
! 1169: writer->doindent = 1;
! 1170: } else
! 1171: writer->doindent = 1;
! 1172: count = xmlOutputBufferWriteString(writer->out, "</");
! 1173: if (count < 0)
! 1174: return -1;
! 1175: sum += count;
! 1176: count = xmlOutputBufferWriteString(writer->out,
! 1177: (const char *) p->name);
! 1178: if (count < 0)
! 1179: return -1;
! 1180: sum += count;
! 1181: count = xmlOutputBufferWriteString(writer->out, ">");
! 1182: if (count < 0)
! 1183: return -1;
! 1184: sum += count;
! 1185: break;
! 1186: default:
! 1187: return -1;
! 1188: }
! 1189:
! 1190: if (writer->indent) {
! 1191: count = xmlOutputBufferWriteString(writer->out, "\n");
! 1192: sum += count;
! 1193: }
! 1194:
! 1195: xmlListPopFront(writer->nodes);
! 1196: return sum;
! 1197: }
! 1198:
! 1199: /**
! 1200: * xmlTextWriterFullEndElement:
! 1201: * @writer: the xmlTextWriterPtr
! 1202: *
! 1203: * End the current xml element. Writes an end tag even if the element is empty
! 1204: *
! 1205: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1206: */
! 1207: int
! 1208: xmlTextWriterFullEndElement(xmlTextWriterPtr writer)
! 1209: {
! 1210: int count;
! 1211: int sum;
! 1212: xmlLinkPtr lk;
! 1213: xmlTextWriterStackEntry *p;
! 1214:
! 1215: if (writer == NULL)
! 1216: return -1;
! 1217:
! 1218: lk = xmlListFront(writer->nodes);
! 1219: if (lk == 0)
! 1220: return -1;
! 1221:
! 1222: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 1223: if (p == 0)
! 1224: return -1;
! 1225:
! 1226: sum = 0;
! 1227: switch (p->state) {
! 1228: case XML_TEXTWRITER_ATTRIBUTE:
! 1229: count = xmlTextWriterEndAttribute(writer);
! 1230: if (count < 0)
! 1231: return -1;
! 1232: sum += count;
! 1233: /* fallthrough */
! 1234: case XML_TEXTWRITER_NAME:
! 1235: /* Output namespace declarations */
! 1236: count = xmlTextWriterOutputNSDecl(writer);
! 1237: if (count < 0)
! 1238: return -1;
! 1239: sum += count;
! 1240:
! 1241: count = xmlOutputBufferWriteString(writer->out, ">");
! 1242: if (count < 0)
! 1243: return -1;
! 1244: sum += count;
! 1245: if (writer->indent)
! 1246: writer->doindent = 0;
! 1247: /* fallthrough */
! 1248: case XML_TEXTWRITER_TEXT:
! 1249: if ((writer->indent) && (writer->doindent)) {
! 1250: count = xmlTextWriterWriteIndent(writer);
! 1251: sum += count;
! 1252: writer->doindent = 1;
! 1253: } else
! 1254: writer->doindent = 1;
! 1255: count = xmlOutputBufferWriteString(writer->out, "</");
! 1256: if (count < 0)
! 1257: return -1;
! 1258: sum += count;
! 1259: count = xmlOutputBufferWriteString(writer->out,
! 1260: (const char *) p->name);
! 1261: if (count < 0)
! 1262: return -1;
! 1263: sum += count;
! 1264: count = xmlOutputBufferWriteString(writer->out, ">");
! 1265: if (count < 0)
! 1266: return -1;
! 1267: sum += count;
! 1268: break;
! 1269: default:
! 1270: return -1;
! 1271: }
! 1272:
! 1273: if (writer->indent) {
! 1274: count = xmlOutputBufferWriteString(writer->out, "\n");
! 1275: sum += count;
! 1276: }
! 1277:
! 1278: xmlListPopFront(writer->nodes);
! 1279: return sum;
! 1280: }
! 1281:
! 1282: /**
! 1283: * xmlTextWriterWriteFormatRaw:
! 1284: * @writer: the xmlTextWriterPtr
! 1285: * @format: format string (see printf)
! 1286: * @...: extra parameters for the format
! 1287: *
! 1288: * Write a formatted raw xml text.
! 1289: *
! 1290: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1291: */
! 1292: int XMLCDECL
! 1293: xmlTextWriterWriteFormatRaw(xmlTextWriterPtr writer, const char *format,
! 1294: ...)
! 1295: {
! 1296: int rc;
! 1297: va_list ap;
! 1298:
! 1299: va_start(ap, format);
! 1300:
! 1301: rc = xmlTextWriterWriteVFormatRaw(writer, format, ap);
! 1302:
! 1303: va_end(ap);
! 1304: return rc;
! 1305: }
! 1306:
! 1307: /**
! 1308: * xmlTextWriterWriteVFormatRaw:
! 1309: * @writer: the xmlTextWriterPtr
! 1310: * @format: format string (see printf)
! 1311: * @argptr: pointer to the first member of the variable argument list.
! 1312: *
! 1313: * Write a formatted raw xml text.
! 1314: *
! 1315: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1316: */
! 1317: int
! 1318: xmlTextWriterWriteVFormatRaw(xmlTextWriterPtr writer, const char *format,
! 1319: va_list argptr)
! 1320: {
! 1321: int rc;
! 1322: xmlChar *buf;
! 1323:
! 1324: if (writer == NULL)
! 1325: return -1;
! 1326:
! 1327: buf = xmlTextWriterVSprintf(format, argptr);
! 1328: if (buf == NULL)
! 1329: return -1;
! 1330:
! 1331: rc = xmlTextWriterWriteRaw(writer, buf);
! 1332:
! 1333: xmlFree(buf);
! 1334: return rc;
! 1335: }
! 1336:
! 1337: /**
! 1338: * xmlTextWriterWriteRawLen:
! 1339: * @writer: the xmlTextWriterPtr
! 1340: * @content: text string
! 1341: * @len: length of the text string
! 1342: *
! 1343: * Write an xml text.
! 1344: * TODO: what about entities and special chars??
! 1345: *
! 1346: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1347: */
! 1348: int
! 1349: xmlTextWriterWriteRawLen(xmlTextWriterPtr writer, const xmlChar * content,
! 1350: int len)
! 1351: {
! 1352: int count;
! 1353: int sum;
! 1354: xmlLinkPtr lk;
! 1355: xmlTextWriterStackEntry *p;
! 1356:
! 1357: if (writer == NULL) {
! 1358: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 1359: "xmlTextWriterWriteRawLen : invalid writer!\n");
! 1360: return -1;
! 1361: }
! 1362:
! 1363: if ((content == NULL) || (len < 0)) {
! 1364: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 1365: "xmlTextWriterWriteRawLen : invalid content!\n");
! 1366: return -1;
! 1367: }
! 1368:
! 1369: sum = 0;
! 1370: lk = xmlListFront(writer->nodes);
! 1371: if (lk != 0) {
! 1372: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 1373: count = xmlTextWriterHandleStateDependencies(writer, p);
! 1374: if (count < 0)
! 1375: return -1;
! 1376: sum += count;
! 1377: }
! 1378:
! 1379: if (writer->indent)
! 1380: writer->doindent = 0;
! 1381:
! 1382: if (content != NULL) {
! 1383: count =
! 1384: xmlOutputBufferWrite(writer->out, len, (const char *) content);
! 1385: if (count < 0)
! 1386: return -1;
! 1387: sum += count;
! 1388: }
! 1389:
! 1390: return sum;
! 1391: }
! 1392:
! 1393: /**
! 1394: * xmlTextWriterWriteRaw:
! 1395: * @writer: the xmlTextWriterPtr
! 1396: * @content: text string
! 1397: *
! 1398: * Write a raw xml text.
! 1399: *
! 1400: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1401: */
! 1402: int
! 1403: xmlTextWriterWriteRaw(xmlTextWriterPtr writer, const xmlChar * content)
! 1404: {
! 1405: return xmlTextWriterWriteRawLen(writer, content, xmlStrlen(content));
! 1406: }
! 1407:
! 1408: /**
! 1409: * xmlTextWriterWriteFormatString:
! 1410: * @writer: the xmlTextWriterPtr
! 1411: * @format: format string (see printf)
! 1412: * @...: extra parameters for the format
! 1413: *
! 1414: * Write a formatted xml text.
! 1415: *
! 1416: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1417: */
! 1418: int XMLCDECL
! 1419: xmlTextWriterWriteFormatString(xmlTextWriterPtr writer, const char *format,
! 1420: ...)
! 1421: {
! 1422: int rc;
! 1423: va_list ap;
! 1424:
! 1425: if ((writer == NULL) || (format == NULL))
! 1426: return -1;
! 1427:
! 1428: va_start(ap, format);
! 1429:
! 1430: rc = xmlTextWriterWriteVFormatString(writer, format, ap);
! 1431:
! 1432: va_end(ap);
! 1433: return rc;
! 1434: }
! 1435:
! 1436: /**
! 1437: * xmlTextWriterWriteVFormatString:
! 1438: * @writer: the xmlTextWriterPtr
! 1439: * @format: format string (see printf)
! 1440: * @argptr: pointer to the first member of the variable argument list.
! 1441: *
! 1442: * Write a formatted xml text.
! 1443: *
! 1444: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1445: */
! 1446: int
! 1447: xmlTextWriterWriteVFormatString(xmlTextWriterPtr writer,
! 1448: const char *format, va_list argptr)
! 1449: {
! 1450: int rc;
! 1451: xmlChar *buf;
! 1452:
! 1453: if ((writer == NULL) || (format == NULL))
! 1454: return -1;
! 1455:
! 1456: buf = xmlTextWriterVSprintf(format, argptr);
! 1457: if (buf == NULL)
! 1458: return -1;
! 1459:
! 1460: rc = xmlTextWriterWriteString(writer, buf);
! 1461:
! 1462: xmlFree(buf);
! 1463: return rc;
! 1464: }
! 1465:
! 1466: /**
! 1467: * xmlTextWriterWriteString:
! 1468: * @writer: the xmlTextWriterPtr
! 1469: * @content: text string
! 1470: *
! 1471: * Write an xml text.
! 1472: *
! 1473: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1474: */
! 1475: int
! 1476: xmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar * content)
! 1477: {
! 1478: int count;
! 1479: int sum;
! 1480: xmlLinkPtr lk;
! 1481: xmlTextWriterStackEntry *p;
! 1482: xmlChar *buf;
! 1483:
! 1484: if ((writer == NULL) || (content == NULL))
! 1485: return -1;
! 1486:
! 1487: sum = 0;
! 1488: buf = (xmlChar *) content;
! 1489: lk = xmlListFront(writer->nodes);
! 1490: if (lk != 0) {
! 1491: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 1492: if (p != 0) {
! 1493: switch (p->state) {
! 1494: case XML_TEXTWRITER_NAME:
! 1495: case XML_TEXTWRITER_TEXT:
! 1496: #if 0
! 1497: buf = NULL;
! 1498: xmlOutputBufferWriteEscape(writer->out, content, NULL);
! 1499: #endif
! 1500: buf = xmlEncodeSpecialChars(NULL, content);
! 1501: break;
! 1502: case XML_TEXTWRITER_ATTRIBUTE:
! 1503: buf = NULL;
! 1504: xmlAttrSerializeTxtContent(writer->out->buffer, writer->doc,
! 1505: NULL, content);
! 1506: break;
! 1507: default:
! 1508: break;
! 1509: }
! 1510: }
! 1511: }
! 1512:
! 1513: if (buf != NULL) {
! 1514: count = xmlTextWriterWriteRaw(writer, buf);
! 1515:
! 1516: if (buf != content) /* buf was allocated by us, so free it */
! 1517: xmlFree(buf);
! 1518:
! 1519: if (count < 0)
! 1520: return -1;
! 1521: sum += count;
! 1522: }
! 1523:
! 1524: return sum;
! 1525: }
! 1526:
! 1527: /**
! 1528: * xmlOutputBufferWriteBase64:
! 1529: * @out: the xmlOutputBufferPtr
! 1530: * @data: binary data
! 1531: * @len: the number of bytes to encode
! 1532: *
! 1533: * Write base64 encoded data to an xmlOutputBuffer.
! 1534: * Adapted from John Walker's base64.c (http://www.fourmilab.ch/).
! 1535: *
! 1536: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1537: */
! 1538: static int
! 1539: xmlOutputBufferWriteBase64(xmlOutputBufferPtr out, int len,
! 1540: const unsigned char *data)
! 1541: {
! 1542: static unsigned char dtable[64] =
! 1543: {'A','B','C','D','E','F','G','H','I','J','K','L','M',
! 1544: 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
! 1545: 'a','b','c','d','e','f','g','h','i','j','k','l','m',
! 1546: 'n','o','p','q','r','s','t','u','v','w','x','y','z',
! 1547: '0','1','2','3','4','5','6','7','8','9','+','/'};
! 1548:
! 1549: int i;
! 1550: int linelen;
! 1551: int count;
! 1552: int sum;
! 1553:
! 1554: if ((out == NULL) || (len < 0) || (data == NULL))
! 1555: return(-1);
! 1556:
! 1557: linelen = 0;
! 1558: sum = 0;
! 1559:
! 1560: i = 0;
! 1561: while (1) {
! 1562: unsigned char igroup[3];
! 1563: unsigned char ogroup[4];
! 1564: int c;
! 1565: int n;
! 1566:
! 1567: igroup[0] = igroup[1] = igroup[2] = 0;
! 1568: for (n = 0; n < 3 && i < len; n++, i++) {
! 1569: c = data[i];
! 1570: igroup[n] = (unsigned char) c;
! 1571: }
! 1572:
! 1573: if (n > 0) {
! 1574: ogroup[0] = dtable[igroup[0] >> 2];
! 1575: ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
! 1576: ogroup[2] =
! 1577: dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
! 1578: ogroup[3] = dtable[igroup[2] & 0x3F];
! 1579:
! 1580: if (n < 3) {
! 1581: ogroup[3] = '=';
! 1582: if (n < 2) {
! 1583: ogroup[2] = '=';
! 1584: }
! 1585: }
! 1586:
! 1587: if (linelen >= B64LINELEN) {
! 1588: count = xmlOutputBufferWrite(out, 2, B64CRLF);
! 1589: if (count == -1)
! 1590: return -1;
! 1591: sum += count;
! 1592: linelen = 0;
! 1593: }
! 1594: count = xmlOutputBufferWrite(out, 4, (const char *) ogroup);
! 1595: if (count == -1)
! 1596: return -1;
! 1597: sum += count;
! 1598:
! 1599: linelen += 4;
! 1600: }
! 1601:
! 1602: if (i >= len)
! 1603: break;
! 1604: }
! 1605:
! 1606: return sum;
! 1607: }
! 1608:
! 1609: /**
! 1610: * xmlTextWriterWriteBase64:
! 1611: * @writer: the xmlTextWriterPtr
! 1612: * @data: binary data
! 1613: * @start: the position within the data of the first byte to encode
! 1614: * @len: the number of bytes to encode
! 1615: *
! 1616: * Write an base64 encoded xml text.
! 1617: *
! 1618: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1619: */
! 1620: int
! 1621: xmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data,
! 1622: int start, int len)
! 1623: {
! 1624: int count;
! 1625: int sum;
! 1626: xmlLinkPtr lk;
! 1627: xmlTextWriterStackEntry *p;
! 1628:
! 1629: if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
! 1630: return -1;
! 1631:
! 1632: sum = 0;
! 1633: lk = xmlListFront(writer->nodes);
! 1634: if (lk != 0) {
! 1635: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 1636: if (p != 0) {
! 1637: count = xmlTextWriterHandleStateDependencies(writer, p);
! 1638: if (count < 0)
! 1639: return -1;
! 1640: sum += count;
! 1641: }
! 1642: }
! 1643:
! 1644: if (writer->indent)
! 1645: writer->doindent = 0;
! 1646:
! 1647: count =
! 1648: xmlOutputBufferWriteBase64(writer->out, len,
! 1649: (unsigned char *) data + start);
! 1650: if (count < 0)
! 1651: return -1;
! 1652: sum += count;
! 1653:
! 1654: return sum;
! 1655: }
! 1656:
! 1657: /**
! 1658: * xmlOutputBufferWriteBinHex:
! 1659: * @out: the xmlOutputBufferPtr
! 1660: * @data: binary data
! 1661: * @len: the number of bytes to encode
! 1662: *
! 1663: * Write hqx encoded data to an xmlOutputBuffer.
! 1664: * ::todo
! 1665: *
! 1666: * Returns the bytes written (may be 0 because of buffering)
! 1667: * or -1 in case of error
! 1668: */
! 1669: static int
! 1670: xmlOutputBufferWriteBinHex(xmlOutputBufferPtr out,
! 1671: int len, const unsigned char *data)
! 1672: {
! 1673: int count;
! 1674: int sum;
! 1675: static char hex[16] =
! 1676: {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
! 1677: int i;
! 1678:
! 1679: if ((out == NULL) || (data == NULL) || (len < 0)) {
! 1680: return -1;
! 1681: }
! 1682:
! 1683: sum = 0;
! 1684: for (i = 0; i < len; i++) {
! 1685: count =
! 1686: xmlOutputBufferWrite(out, 1,
! 1687: (const char *) &hex[data[i] >> 4]);
! 1688: if (count == -1)
! 1689: return -1;
! 1690: sum += count;
! 1691: count =
! 1692: xmlOutputBufferWrite(out, 1,
! 1693: (const char *) &hex[data[i] & 0xF]);
! 1694: if (count == -1)
! 1695: return -1;
! 1696: sum += count;
! 1697: }
! 1698:
! 1699: return sum;
! 1700: }
! 1701:
! 1702: /**
! 1703: * xmlTextWriterWriteBinHex:
! 1704: * @writer: the xmlTextWriterPtr
! 1705: * @data: binary data
! 1706: * @start: the position within the data of the first byte to encode
! 1707: * @len: the number of bytes to encode
! 1708: *
! 1709: * Write a BinHex encoded xml text.
! 1710: *
! 1711: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1712: */
! 1713: int
! 1714: xmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data,
! 1715: int start, int len)
! 1716: {
! 1717: int count;
! 1718: int sum;
! 1719: xmlLinkPtr lk;
! 1720: xmlTextWriterStackEntry *p;
! 1721:
! 1722: if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))
! 1723: return -1;
! 1724:
! 1725: sum = 0;
! 1726: lk = xmlListFront(writer->nodes);
! 1727: if (lk != 0) {
! 1728: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 1729: if (p != 0) {
! 1730: count = xmlTextWriterHandleStateDependencies(writer, p);
! 1731: if (count < 0)
! 1732: return -1;
! 1733: sum += count;
! 1734: }
! 1735: }
! 1736:
! 1737: if (writer->indent)
! 1738: writer->doindent = 0;
! 1739:
! 1740: count =
! 1741: xmlOutputBufferWriteBinHex(writer->out, len,
! 1742: (unsigned char *) data + start);
! 1743: if (count < 0)
! 1744: return -1;
! 1745: sum += count;
! 1746:
! 1747: return sum;
! 1748: }
! 1749:
! 1750: /**
! 1751: * xmlTextWriterStartAttribute:
! 1752: * @writer: the xmlTextWriterPtr
! 1753: * @name: element name
! 1754: *
! 1755: * Start an xml attribute.
! 1756: *
! 1757: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1758: */
! 1759: int
! 1760: xmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name)
! 1761: {
! 1762: int count;
! 1763: int sum;
! 1764: xmlLinkPtr lk;
! 1765: xmlTextWriterStackEntry *p;
! 1766:
! 1767: if ((writer == NULL) || (name == NULL) || (*name == '\0'))
! 1768: return -1;
! 1769:
! 1770: sum = 0;
! 1771: lk = xmlListFront(writer->nodes);
! 1772: if (lk == 0)
! 1773: return -1;
! 1774:
! 1775: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 1776: if (p == 0)
! 1777: return -1;
! 1778:
! 1779: switch (p->state) {
! 1780: case XML_TEXTWRITER_ATTRIBUTE:
! 1781: count = xmlTextWriterEndAttribute(writer);
! 1782: if (count < 0)
! 1783: return -1;
! 1784: sum += count;
! 1785: /* fallthrough */
! 1786: case XML_TEXTWRITER_NAME:
! 1787: count = xmlOutputBufferWriteString(writer->out, " ");
! 1788: if (count < 0)
! 1789: return -1;
! 1790: sum += count;
! 1791: count =
! 1792: xmlOutputBufferWriteString(writer->out,
! 1793: (const char *) name);
! 1794: if (count < 0)
! 1795: return -1;
! 1796: sum += count;
! 1797: count = xmlOutputBufferWriteString(writer->out, "=");
! 1798: if (count < 0)
! 1799: return -1;
! 1800: sum += count;
! 1801: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 1802: if (count < 0)
! 1803: return -1;
! 1804: sum += count;
! 1805: p->state = XML_TEXTWRITER_ATTRIBUTE;
! 1806: break;
! 1807: default:
! 1808: return -1;
! 1809: }
! 1810:
! 1811: return sum;
! 1812: }
! 1813:
! 1814: /**
! 1815: * xmlTextWriterStartAttributeNS:
! 1816: * @writer: the xmlTextWriterPtr
! 1817: * @prefix: namespace prefix or NULL
! 1818: * @name: element local name
! 1819: * @namespaceURI: namespace URI or NULL
! 1820: *
! 1821: * Start an xml attribute with namespace support.
! 1822: *
! 1823: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1824: */
! 1825: int
! 1826: xmlTextWriterStartAttributeNS(xmlTextWriterPtr writer,
! 1827: const xmlChar * prefix, const xmlChar * name,
! 1828: const xmlChar * namespaceURI)
! 1829: {
! 1830: int count;
! 1831: int sum;
! 1832: xmlChar *buf;
! 1833: xmlTextWriterNsStackEntry *p;
! 1834:
! 1835: if ((writer == NULL) || (name == NULL) || (*name == '\0'))
! 1836: return -1;
! 1837:
! 1838: /* Handle namespace first in case of error */
! 1839: if (namespaceURI != 0) {
! 1840: xmlTextWriterNsStackEntry nsentry, *curns;
! 1841:
! 1842: buf = xmlStrdup(BAD_CAST "xmlns");
! 1843: if (prefix != 0) {
! 1844: buf = xmlStrcat(buf, BAD_CAST ":");
! 1845: buf = xmlStrcat(buf, prefix);
! 1846: }
! 1847:
! 1848: nsentry.prefix = buf;
! 1849: nsentry.uri = (xmlChar *)namespaceURI;
! 1850: nsentry.elem = xmlListFront(writer->nodes);
! 1851:
! 1852: curns = (xmlTextWriterNsStackEntry *)xmlListSearch(writer->nsstack,
! 1853: (void *)&nsentry);
! 1854: if ((curns != NULL)) {
! 1855: xmlFree(buf);
! 1856: if (xmlStrcmp(curns->uri, namespaceURI) == 0) {
! 1857: /* Namespace already defined on element skip */
! 1858: buf = NULL;
! 1859: } else {
! 1860: /* Prefix mismatch so error out */
! 1861: return -1;
! 1862: }
! 1863: }
! 1864:
! 1865: /* Do not add namespace decl to list - it is already there */
! 1866: if (buf != NULL) {
! 1867: p = (xmlTextWriterNsStackEntry *)
! 1868: xmlMalloc(sizeof(xmlTextWriterNsStackEntry));
! 1869: if (p == 0) {
! 1870: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 1871: "xmlTextWriterStartAttributeNS : out of memory!\n");
! 1872: return -1;
! 1873: }
! 1874:
! 1875: p->prefix = buf;
! 1876: p->uri = xmlStrdup(namespaceURI);
! 1877: if (p->uri == 0) {
! 1878: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 1879: "xmlTextWriterStartAttributeNS : out of memory!\n");
! 1880: xmlFree(p);
! 1881: return -1;
! 1882: }
! 1883: p->elem = xmlListFront(writer->nodes);
! 1884:
! 1885: xmlListPushFront(writer->nsstack, p);
! 1886: }
! 1887: }
! 1888:
! 1889: buf = NULL;
! 1890: if (prefix != 0) {
! 1891: buf = xmlStrdup(prefix);
! 1892: buf = xmlStrcat(buf, BAD_CAST ":");
! 1893: }
! 1894: buf = xmlStrcat(buf, name);
! 1895:
! 1896: sum = 0;
! 1897: count = xmlTextWriterStartAttribute(writer, buf);
! 1898: xmlFree(buf);
! 1899: if (count < 0)
! 1900: return -1;
! 1901: sum += count;
! 1902:
! 1903: return sum;
! 1904: }
! 1905:
! 1906: /**
! 1907: * xmlTextWriterEndAttribute:
! 1908: * @writer: the xmlTextWriterPtr
! 1909: *
! 1910: * End the current xml element.
! 1911: *
! 1912: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1913: */
! 1914: int
! 1915: xmlTextWriterEndAttribute(xmlTextWriterPtr writer)
! 1916: {
! 1917: int count;
! 1918: int sum;
! 1919: xmlLinkPtr lk;
! 1920: xmlTextWriterStackEntry *p;
! 1921:
! 1922: if (writer == NULL)
! 1923: return -1;
! 1924:
! 1925: lk = xmlListFront(writer->nodes);
! 1926: if (lk == 0) {
! 1927: return -1;
! 1928: }
! 1929:
! 1930: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 1931: if (p == 0) {
! 1932: return -1;
! 1933: }
! 1934:
! 1935: sum = 0;
! 1936: switch (p->state) {
! 1937: case XML_TEXTWRITER_ATTRIBUTE:
! 1938: p->state = XML_TEXTWRITER_NAME;
! 1939:
! 1940: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 1941: if (count < 0) {
! 1942: return -1;
! 1943: }
! 1944: sum += count;
! 1945: break;
! 1946: default:
! 1947: return -1;
! 1948: }
! 1949:
! 1950: return sum;
! 1951: }
! 1952:
! 1953: /**
! 1954: * xmlTextWriterWriteFormatAttribute:
! 1955: * @writer: the xmlTextWriterPtr
! 1956: * @name: attribute name
! 1957: * @format: format string (see printf)
! 1958: * @...: extra parameters for the format
! 1959: *
! 1960: * Write a formatted xml attribute.
! 1961: *
! 1962: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1963: */
! 1964: int XMLCDECL
! 1965: xmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer,
! 1966: const xmlChar * name, const char *format,
! 1967: ...)
! 1968: {
! 1969: int rc;
! 1970: va_list ap;
! 1971:
! 1972: va_start(ap, format);
! 1973:
! 1974: rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap);
! 1975:
! 1976: va_end(ap);
! 1977: return rc;
! 1978: }
! 1979:
! 1980: /**
! 1981: * xmlTextWriterWriteVFormatAttribute:
! 1982: * @writer: the xmlTextWriterPtr
! 1983: * @name: attribute name
! 1984: * @format: format string (see printf)
! 1985: * @argptr: pointer to the first member of the variable argument list.
! 1986: *
! 1987: * Write a formatted xml attribute.
! 1988: *
! 1989: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 1990: */
! 1991: int
! 1992: xmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer,
! 1993: const xmlChar * name,
! 1994: const char *format, va_list argptr)
! 1995: {
! 1996: int rc;
! 1997: xmlChar *buf;
! 1998:
! 1999: if (writer == NULL)
! 2000: return -1;
! 2001:
! 2002: buf = xmlTextWriterVSprintf(format, argptr);
! 2003: if (buf == NULL)
! 2004: return -1;
! 2005:
! 2006: rc = xmlTextWriterWriteAttribute(writer, name, buf);
! 2007:
! 2008: xmlFree(buf);
! 2009: return rc;
! 2010: }
! 2011:
! 2012: /**
! 2013: * xmlTextWriterWriteAttribute:
! 2014: * @writer: the xmlTextWriterPtr
! 2015: * @name: attribute name
! 2016: * @content: attribute content
! 2017: *
! 2018: * Write an xml attribute.
! 2019: *
! 2020: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2021: */
! 2022: int
! 2023: xmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name,
! 2024: const xmlChar * content)
! 2025: {
! 2026: int count;
! 2027: int sum;
! 2028:
! 2029: sum = 0;
! 2030: count = xmlTextWriterStartAttribute(writer, name);
! 2031: if (count < 0)
! 2032: return -1;
! 2033: sum += count;
! 2034: count = xmlTextWriterWriteString(writer, content);
! 2035: if (count < 0)
! 2036: return -1;
! 2037: sum += count;
! 2038: count = xmlTextWriterEndAttribute(writer);
! 2039: if (count < 0)
! 2040: return -1;
! 2041: sum += count;
! 2042:
! 2043: return sum;
! 2044: }
! 2045:
! 2046: /**
! 2047: * xmlTextWriterWriteFormatAttributeNS:
! 2048: * @writer: the xmlTextWriterPtr
! 2049: * @prefix: namespace prefix
! 2050: * @name: attribute local name
! 2051: * @namespaceURI: namespace URI
! 2052: * @format: format string (see printf)
! 2053: * @...: extra parameters for the format
! 2054: *
! 2055: * Write a formatted xml attribute.with namespace support
! 2056: *
! 2057: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2058: */
! 2059: int XMLCDECL
! 2060: xmlTextWriterWriteFormatAttributeNS(xmlTextWriterPtr writer,
! 2061: const xmlChar * prefix,
! 2062: const xmlChar * name,
! 2063: const xmlChar * namespaceURI,
! 2064: const char *format, ...)
! 2065: {
! 2066: int rc;
! 2067: va_list ap;
! 2068:
! 2069: va_start(ap, format);
! 2070:
! 2071: rc = xmlTextWriterWriteVFormatAttributeNS(writer, prefix, name,
! 2072: namespaceURI, format, ap);
! 2073:
! 2074: va_end(ap);
! 2075: return rc;
! 2076: }
! 2077:
! 2078: /**
! 2079: * xmlTextWriterWriteVFormatAttributeNS:
! 2080: * @writer: the xmlTextWriterPtr
! 2081: * @prefix: namespace prefix
! 2082: * @name: attribute local name
! 2083: * @namespaceURI: namespace URI
! 2084: * @format: format string (see printf)
! 2085: * @argptr: pointer to the first member of the variable argument list.
! 2086: *
! 2087: * Write a formatted xml attribute.with namespace support
! 2088: *
! 2089: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2090: */
! 2091: int
! 2092: xmlTextWriterWriteVFormatAttributeNS(xmlTextWriterPtr writer,
! 2093: const xmlChar * prefix,
! 2094: const xmlChar * name,
! 2095: const xmlChar * namespaceURI,
! 2096: const char *format, va_list argptr)
! 2097: {
! 2098: int rc;
! 2099: xmlChar *buf;
! 2100:
! 2101: if (writer == NULL)
! 2102: return -1;
! 2103:
! 2104: buf = xmlTextWriterVSprintf(format, argptr);
! 2105: if (buf == NULL)
! 2106: return -1;
! 2107:
! 2108: rc = xmlTextWriterWriteAttributeNS(writer, prefix, name, namespaceURI,
! 2109: buf);
! 2110:
! 2111: xmlFree(buf);
! 2112: return rc;
! 2113: }
! 2114:
! 2115: /**
! 2116: * xmlTextWriterWriteAttributeNS:
! 2117: * @writer: the xmlTextWriterPtr
! 2118: * @prefix: namespace prefix
! 2119: * @name: attribute local name
! 2120: * @namespaceURI: namespace URI
! 2121: * @content: attribute content
! 2122: *
! 2123: * Write an xml attribute.
! 2124: *
! 2125: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2126: */
! 2127: int
! 2128: xmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer,
! 2129: const xmlChar * prefix, const xmlChar * name,
! 2130: const xmlChar * namespaceURI,
! 2131: const xmlChar * content)
! 2132: {
! 2133: int count;
! 2134: int sum;
! 2135:
! 2136: if ((writer == NULL) || (name == NULL) || (*name == '\0'))
! 2137: return -1;
! 2138:
! 2139: sum = 0;
! 2140: count = xmlTextWriterStartAttributeNS(writer, prefix, name, namespaceURI);
! 2141: if (count < 0)
! 2142: return -1;
! 2143: sum += count;
! 2144: count = xmlTextWriterWriteString(writer, content);
! 2145: if (count < 0)
! 2146: return -1;
! 2147: sum += count;
! 2148: count = xmlTextWriterEndAttribute(writer);
! 2149: if (count < 0)
! 2150: return -1;
! 2151: sum += count;
! 2152:
! 2153: return sum;
! 2154: }
! 2155:
! 2156: /**
! 2157: * xmlTextWriterWriteFormatElement:
! 2158: * @writer: the xmlTextWriterPtr
! 2159: * @name: element name
! 2160: * @format: format string (see printf)
! 2161: * @...: extra parameters for the format
! 2162: *
! 2163: * Write a formatted xml element.
! 2164: *
! 2165: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2166: */
! 2167: int XMLCDECL
! 2168: xmlTextWriterWriteFormatElement(xmlTextWriterPtr writer,
! 2169: const xmlChar * name, const char *format,
! 2170: ...)
! 2171: {
! 2172: int rc;
! 2173: va_list ap;
! 2174:
! 2175: va_start(ap, format);
! 2176:
! 2177: rc = xmlTextWriterWriteVFormatElement(writer, name, format, ap);
! 2178:
! 2179: va_end(ap);
! 2180: return rc;
! 2181: }
! 2182:
! 2183: /**
! 2184: * xmlTextWriterWriteVFormatElement:
! 2185: * @writer: the xmlTextWriterPtr
! 2186: * @name: element name
! 2187: * @format: format string (see printf)
! 2188: * @argptr: pointer to the first member of the variable argument list.
! 2189: *
! 2190: * Write a formatted xml element.
! 2191: *
! 2192: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2193: */
! 2194: int
! 2195: xmlTextWriterWriteVFormatElement(xmlTextWriterPtr writer,
! 2196: const xmlChar * name, const char *format,
! 2197: va_list argptr)
! 2198: {
! 2199: int rc;
! 2200: xmlChar *buf;
! 2201:
! 2202: if (writer == NULL)
! 2203: return -1;
! 2204:
! 2205: buf = xmlTextWriterVSprintf(format, argptr);
! 2206: if (buf == NULL)
! 2207: return -1;
! 2208:
! 2209: rc = xmlTextWriterWriteElement(writer, name, buf);
! 2210:
! 2211: xmlFree(buf);
! 2212: return rc;
! 2213: }
! 2214:
! 2215: /**
! 2216: * xmlTextWriterWriteElement:
! 2217: * @writer: the xmlTextWriterPtr
! 2218: * @name: element name
! 2219: * @content: element content
! 2220: *
! 2221: * Write an xml element.
! 2222: *
! 2223: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2224: */
! 2225: int
! 2226: xmlTextWriterWriteElement(xmlTextWriterPtr writer, const xmlChar * name,
! 2227: const xmlChar * content)
! 2228: {
! 2229: int count;
! 2230: int sum;
! 2231:
! 2232: sum = 0;
! 2233: count = xmlTextWriterStartElement(writer, name);
! 2234: if (count == -1)
! 2235: return -1;
! 2236: sum += count;
! 2237: count = xmlTextWriterWriteString(writer, content);
! 2238: if (count == -1)
! 2239: return -1;
! 2240: sum += count;
! 2241: count = xmlTextWriterEndElement(writer);
! 2242: if (count == -1)
! 2243: return -1;
! 2244: sum += count;
! 2245:
! 2246: return sum;
! 2247: }
! 2248:
! 2249: /**
! 2250: * xmlTextWriterWriteFormatElementNS:
! 2251: * @writer: the xmlTextWriterPtr
! 2252: * @prefix: namespace prefix
! 2253: * @name: element local name
! 2254: * @namespaceURI: namespace URI
! 2255: * @format: format string (see printf)
! 2256: * @...: extra parameters for the format
! 2257: *
! 2258: * Write a formatted xml element with namespace support.
! 2259: *
! 2260: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2261: */
! 2262: int XMLCDECL
! 2263: xmlTextWriterWriteFormatElementNS(xmlTextWriterPtr writer,
! 2264: const xmlChar * prefix,
! 2265: const xmlChar * name,
! 2266: const xmlChar * namespaceURI,
! 2267: const char *format, ...)
! 2268: {
! 2269: int rc;
! 2270: va_list ap;
! 2271:
! 2272: va_start(ap, format);
! 2273:
! 2274: rc = xmlTextWriterWriteVFormatElementNS(writer, prefix, name,
! 2275: namespaceURI, format, ap);
! 2276:
! 2277: va_end(ap);
! 2278: return rc;
! 2279: }
! 2280:
! 2281: /**
! 2282: * xmlTextWriterWriteVFormatElementNS:
! 2283: * @writer: the xmlTextWriterPtr
! 2284: * @prefix: namespace prefix
! 2285: * @name: element local name
! 2286: * @namespaceURI: namespace URI
! 2287: * @format: format string (see printf)
! 2288: * @argptr: pointer to the first member of the variable argument list.
! 2289: *
! 2290: * Write a formatted xml element with namespace support.
! 2291: *
! 2292: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2293: */
! 2294: int
! 2295: xmlTextWriterWriteVFormatElementNS(xmlTextWriterPtr writer,
! 2296: const xmlChar * prefix,
! 2297: const xmlChar * name,
! 2298: const xmlChar * namespaceURI,
! 2299: const char *format, va_list argptr)
! 2300: {
! 2301: int rc;
! 2302: xmlChar *buf;
! 2303:
! 2304: if (writer == NULL)
! 2305: return -1;
! 2306:
! 2307: buf = xmlTextWriterVSprintf(format, argptr);
! 2308: if (buf == NULL)
! 2309: return -1;
! 2310:
! 2311: rc = xmlTextWriterWriteElementNS(writer, prefix, name, namespaceURI,
! 2312: buf);
! 2313:
! 2314: xmlFree(buf);
! 2315: return rc;
! 2316: }
! 2317:
! 2318: /**
! 2319: * xmlTextWriterWriteElementNS:
! 2320: * @writer: the xmlTextWriterPtr
! 2321: * @prefix: namespace prefix
! 2322: * @name: element local name
! 2323: * @namespaceURI: namespace URI
! 2324: * @content: element content
! 2325: *
! 2326: * Write an xml element with namespace support.
! 2327: *
! 2328: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2329: */
! 2330: int
! 2331: xmlTextWriterWriteElementNS(xmlTextWriterPtr writer,
! 2332: const xmlChar * prefix, const xmlChar * name,
! 2333: const xmlChar * namespaceURI,
! 2334: const xmlChar * content)
! 2335: {
! 2336: int count;
! 2337: int sum;
! 2338:
! 2339: if ((writer == NULL) || (name == NULL) || (*name == '\0'))
! 2340: return -1;
! 2341:
! 2342: sum = 0;
! 2343: count =
! 2344: xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI);
! 2345: if (count < 0)
! 2346: return -1;
! 2347: sum += count;
! 2348: count = xmlTextWriterWriteString(writer, content);
! 2349: if (count == -1)
! 2350: return -1;
! 2351: sum += count;
! 2352: count = xmlTextWriterEndElement(writer);
! 2353: if (count == -1)
! 2354: return -1;
! 2355: sum += count;
! 2356:
! 2357: return sum;
! 2358: }
! 2359:
! 2360: /**
! 2361: * xmlTextWriterStartPI:
! 2362: * @writer: the xmlTextWriterPtr
! 2363: * @target: PI target
! 2364: *
! 2365: * Start an xml PI.
! 2366: *
! 2367: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2368: */
! 2369: int
! 2370: xmlTextWriterStartPI(xmlTextWriterPtr writer, const xmlChar * target)
! 2371: {
! 2372: int count;
! 2373: int sum;
! 2374: xmlLinkPtr lk;
! 2375: xmlTextWriterStackEntry *p;
! 2376:
! 2377: if ((writer == NULL) || (target == NULL) || (*target == '\0'))
! 2378: return -1;
! 2379:
! 2380: if (xmlStrcasecmp(target, (const xmlChar *) "xml") == 0) {
! 2381: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 2382: "xmlTextWriterStartPI : target name [Xx][Mm][Ll] is reserved for xml standardization!\n");
! 2383: return -1;
! 2384: }
! 2385:
! 2386: sum = 0;
! 2387: lk = xmlListFront(writer->nodes);
! 2388: if (lk != 0) {
! 2389: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 2390: if (p != 0) {
! 2391: switch (p->state) {
! 2392: case XML_TEXTWRITER_ATTRIBUTE:
! 2393: count = xmlTextWriterEndAttribute(writer);
! 2394: if (count < 0)
! 2395: return -1;
! 2396: sum += count;
! 2397: /* fallthrough */
! 2398: case XML_TEXTWRITER_NAME:
! 2399: /* Output namespace declarations */
! 2400: count = xmlTextWriterOutputNSDecl(writer);
! 2401: if (count < 0)
! 2402: return -1;
! 2403: sum += count;
! 2404: count = xmlOutputBufferWriteString(writer->out, ">");
! 2405: if (count < 0)
! 2406: return -1;
! 2407: sum += count;
! 2408: p->state = XML_TEXTWRITER_TEXT;
! 2409: break;
! 2410: case XML_TEXTWRITER_NONE:
! 2411: case XML_TEXTWRITER_TEXT:
! 2412: case XML_TEXTWRITER_DTD:
! 2413: break;
! 2414: case XML_TEXTWRITER_PI:
! 2415: case XML_TEXTWRITER_PI_TEXT:
! 2416: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 2417: "xmlTextWriterStartPI : nested PI!\n");
! 2418: return -1;
! 2419: default:
! 2420: return -1;
! 2421: }
! 2422: }
! 2423: }
! 2424:
! 2425: p = (xmlTextWriterStackEntry *)
! 2426: xmlMalloc(sizeof(xmlTextWriterStackEntry));
! 2427: if (p == 0) {
! 2428: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 2429: "xmlTextWriterStartPI : out of memory!\n");
! 2430: return -1;
! 2431: }
! 2432:
! 2433: p->name = xmlStrdup(target);
! 2434: if (p->name == 0) {
! 2435: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 2436: "xmlTextWriterStartPI : out of memory!\n");
! 2437: xmlFree(p);
! 2438: return -1;
! 2439: }
! 2440: p->state = XML_TEXTWRITER_PI;
! 2441:
! 2442: xmlListPushFront(writer->nodes, p);
! 2443:
! 2444: count = xmlOutputBufferWriteString(writer->out, "<?");
! 2445: if (count < 0)
! 2446: return -1;
! 2447: sum += count;
! 2448: count =
! 2449: xmlOutputBufferWriteString(writer->out, (const char *) p->name);
! 2450: if (count < 0)
! 2451: return -1;
! 2452: sum += count;
! 2453:
! 2454: return sum;
! 2455: }
! 2456:
! 2457: /**
! 2458: * xmlTextWriterEndPI:
! 2459: * @writer: the xmlTextWriterPtr
! 2460: *
! 2461: * End the current xml PI.
! 2462: *
! 2463: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2464: */
! 2465: int
! 2466: xmlTextWriterEndPI(xmlTextWriterPtr writer)
! 2467: {
! 2468: int count;
! 2469: int sum;
! 2470: xmlLinkPtr lk;
! 2471: xmlTextWriterStackEntry *p;
! 2472:
! 2473: if (writer == NULL)
! 2474: return -1;
! 2475:
! 2476: lk = xmlListFront(writer->nodes);
! 2477: if (lk == 0)
! 2478: return 0;
! 2479:
! 2480: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 2481: if (p == 0)
! 2482: return 0;
! 2483:
! 2484: sum = 0;
! 2485: switch (p->state) {
! 2486: case XML_TEXTWRITER_PI:
! 2487: case XML_TEXTWRITER_PI_TEXT:
! 2488: count = xmlOutputBufferWriteString(writer->out, "?>");
! 2489: if (count < 0)
! 2490: return -1;
! 2491: sum += count;
! 2492: break;
! 2493: default:
! 2494: return -1;
! 2495: }
! 2496:
! 2497: if (writer->indent) {
! 2498: count = xmlOutputBufferWriteString(writer->out, "\n");
! 2499: if (count < 0)
! 2500: return -1;
! 2501: sum += count;
! 2502: }
! 2503:
! 2504: xmlListPopFront(writer->nodes);
! 2505: return sum;
! 2506: }
! 2507:
! 2508: /**
! 2509: * xmlTextWriterWriteFormatPI:
! 2510: * @writer: the xmlTextWriterPtr
! 2511: * @target: PI target
! 2512: * @format: format string (see printf)
! 2513: * @...: extra parameters for the format
! 2514: *
! 2515: * Write a formatted PI.
! 2516: *
! 2517: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2518: */
! 2519: int XMLCDECL
! 2520: xmlTextWriterWriteFormatPI(xmlTextWriterPtr writer, const xmlChar * target,
! 2521: const char *format, ...)
! 2522: {
! 2523: int rc;
! 2524: va_list ap;
! 2525:
! 2526: va_start(ap, format);
! 2527:
! 2528: rc = xmlTextWriterWriteVFormatPI(writer, target, format, ap);
! 2529:
! 2530: va_end(ap);
! 2531: return rc;
! 2532: }
! 2533:
! 2534: /**
! 2535: * xmlTextWriterWriteVFormatPI:
! 2536: * @writer: the xmlTextWriterPtr
! 2537: * @target: PI target
! 2538: * @format: format string (see printf)
! 2539: * @argptr: pointer to the first member of the variable argument list.
! 2540: *
! 2541: * Write a formatted xml PI.
! 2542: *
! 2543: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2544: */
! 2545: int
! 2546: xmlTextWriterWriteVFormatPI(xmlTextWriterPtr writer,
! 2547: const xmlChar * target, const char *format,
! 2548: va_list argptr)
! 2549: {
! 2550: int rc;
! 2551: xmlChar *buf;
! 2552:
! 2553: if (writer == NULL)
! 2554: return -1;
! 2555:
! 2556: buf = xmlTextWriterVSprintf(format, argptr);
! 2557: if (buf == NULL)
! 2558: return -1;
! 2559:
! 2560: rc = xmlTextWriterWritePI(writer, target, buf);
! 2561:
! 2562: xmlFree(buf);
! 2563: return rc;
! 2564: }
! 2565:
! 2566: /**
! 2567: * xmlTextWriterWritePI:
! 2568: * @writer: the xmlTextWriterPtr
! 2569: * @target: PI target
! 2570: * @content: PI content
! 2571: *
! 2572: * Write an xml PI.
! 2573: *
! 2574: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2575: */
! 2576: int
! 2577: xmlTextWriterWritePI(xmlTextWriterPtr writer, const xmlChar * target,
! 2578: const xmlChar * content)
! 2579: {
! 2580: int count;
! 2581: int sum;
! 2582:
! 2583: sum = 0;
! 2584: count = xmlTextWriterStartPI(writer, target);
! 2585: if (count == -1)
! 2586: return -1;
! 2587: sum += count;
! 2588: if (content != 0) {
! 2589: count = xmlTextWriterWriteString(writer, content);
! 2590: if (count == -1)
! 2591: return -1;
! 2592: sum += count;
! 2593: }
! 2594: count = xmlTextWriterEndPI(writer);
! 2595: if (count == -1)
! 2596: return -1;
! 2597: sum += count;
! 2598:
! 2599: return sum;
! 2600: }
! 2601:
! 2602: /**
! 2603: * xmlTextWriterStartCDATA:
! 2604: * @writer: the xmlTextWriterPtr
! 2605: *
! 2606: * Start an xml CDATA section.
! 2607: *
! 2608: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2609: */
! 2610: int
! 2611: xmlTextWriterStartCDATA(xmlTextWriterPtr writer)
! 2612: {
! 2613: int count;
! 2614: int sum;
! 2615: xmlLinkPtr lk;
! 2616: xmlTextWriterStackEntry *p;
! 2617:
! 2618: if (writer == NULL)
! 2619: return -1;
! 2620:
! 2621: sum = 0;
! 2622: lk = xmlListFront(writer->nodes);
! 2623: if (lk != 0) {
! 2624: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 2625: if (p != 0) {
! 2626: switch (p->state) {
! 2627: case XML_TEXTWRITER_NONE:
! 2628: case XML_TEXTWRITER_TEXT:
! 2629: case XML_TEXTWRITER_PI:
! 2630: case XML_TEXTWRITER_PI_TEXT:
! 2631: break;
! 2632: case XML_TEXTWRITER_ATTRIBUTE:
! 2633: count = xmlTextWriterEndAttribute(writer);
! 2634: if (count < 0)
! 2635: return -1;
! 2636: sum += count;
! 2637: /* fallthrough */
! 2638: case XML_TEXTWRITER_NAME:
! 2639: /* Output namespace declarations */
! 2640: count = xmlTextWriterOutputNSDecl(writer);
! 2641: if (count < 0)
! 2642: return -1;
! 2643: sum += count;
! 2644: count = xmlOutputBufferWriteString(writer->out, ">");
! 2645: if (count < 0)
! 2646: return -1;
! 2647: sum += count;
! 2648: p->state = XML_TEXTWRITER_TEXT;
! 2649: break;
! 2650: case XML_TEXTWRITER_CDATA:
! 2651: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 2652: "xmlTextWriterStartCDATA : CDATA not allowed in this context!\n");
! 2653: return -1;
! 2654: default:
! 2655: return -1;
! 2656: }
! 2657: }
! 2658: }
! 2659:
! 2660: p = (xmlTextWriterStackEntry *)
! 2661: xmlMalloc(sizeof(xmlTextWriterStackEntry));
! 2662: if (p == 0) {
! 2663: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 2664: "xmlTextWriterStartCDATA : out of memory!\n");
! 2665: return -1;
! 2666: }
! 2667:
! 2668: p->name = NULL;
! 2669: p->state = XML_TEXTWRITER_CDATA;
! 2670:
! 2671: xmlListPushFront(writer->nodes, p);
! 2672:
! 2673: count = xmlOutputBufferWriteString(writer->out, "<![CDATA[");
! 2674: if (count < 0)
! 2675: return -1;
! 2676: sum += count;
! 2677:
! 2678: return sum;
! 2679: }
! 2680:
! 2681: /**
! 2682: * xmlTextWriterEndCDATA:
! 2683: * @writer: the xmlTextWriterPtr
! 2684: *
! 2685: * End an xml CDATA section.
! 2686: *
! 2687: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2688: */
! 2689: int
! 2690: xmlTextWriterEndCDATA(xmlTextWriterPtr writer)
! 2691: {
! 2692: int count;
! 2693: int sum;
! 2694: xmlLinkPtr lk;
! 2695: xmlTextWriterStackEntry *p;
! 2696:
! 2697: if (writer == NULL)
! 2698: return -1;
! 2699:
! 2700: lk = xmlListFront(writer->nodes);
! 2701: if (lk == 0)
! 2702: return -1;
! 2703:
! 2704: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 2705: if (p == 0)
! 2706: return -1;
! 2707:
! 2708: sum = 0;
! 2709: switch (p->state) {
! 2710: case XML_TEXTWRITER_CDATA:
! 2711: count = xmlOutputBufferWriteString(writer->out, "]]>");
! 2712: if (count < 0)
! 2713: return -1;
! 2714: sum += count;
! 2715: break;
! 2716: default:
! 2717: return -1;
! 2718: }
! 2719:
! 2720: xmlListPopFront(writer->nodes);
! 2721: return sum;
! 2722: }
! 2723:
! 2724: /**
! 2725: * xmlTextWriterWriteFormatCDATA:
! 2726: * @writer: the xmlTextWriterPtr
! 2727: * @format: format string (see printf)
! 2728: * @...: extra parameters for the format
! 2729: *
! 2730: * Write a formatted xml CDATA.
! 2731: *
! 2732: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2733: */
! 2734: int XMLCDECL
! 2735: xmlTextWriterWriteFormatCDATA(xmlTextWriterPtr writer, const char *format,
! 2736: ...)
! 2737: {
! 2738: int rc;
! 2739: va_list ap;
! 2740:
! 2741: va_start(ap, format);
! 2742:
! 2743: rc = xmlTextWriterWriteVFormatCDATA(writer, format, ap);
! 2744:
! 2745: va_end(ap);
! 2746: return rc;
! 2747: }
! 2748:
! 2749: /**
! 2750: * xmlTextWriterWriteVFormatCDATA:
! 2751: * @writer: the xmlTextWriterPtr
! 2752: * @format: format string (see printf)
! 2753: * @argptr: pointer to the first member of the variable argument list.
! 2754: *
! 2755: * Write a formatted xml CDATA.
! 2756: *
! 2757: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2758: */
! 2759: int
! 2760: xmlTextWriterWriteVFormatCDATA(xmlTextWriterPtr writer, const char *format,
! 2761: va_list argptr)
! 2762: {
! 2763: int rc;
! 2764: xmlChar *buf;
! 2765:
! 2766: if (writer == NULL)
! 2767: return -1;
! 2768:
! 2769: buf = xmlTextWriterVSprintf(format, argptr);
! 2770: if (buf == NULL)
! 2771: return -1;
! 2772:
! 2773: rc = xmlTextWriterWriteCDATA(writer, buf);
! 2774:
! 2775: xmlFree(buf);
! 2776: return rc;
! 2777: }
! 2778:
! 2779: /**
! 2780: * xmlTextWriterWriteCDATA:
! 2781: * @writer: the xmlTextWriterPtr
! 2782: * @content: CDATA content
! 2783: *
! 2784: * Write an xml CDATA.
! 2785: *
! 2786: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2787: */
! 2788: int
! 2789: xmlTextWriterWriteCDATA(xmlTextWriterPtr writer, const xmlChar * content)
! 2790: {
! 2791: int count;
! 2792: int sum;
! 2793:
! 2794: sum = 0;
! 2795: count = xmlTextWriterStartCDATA(writer);
! 2796: if (count == -1)
! 2797: return -1;
! 2798: sum += count;
! 2799: if (content != 0) {
! 2800: count = xmlTextWriterWriteString(writer, content);
! 2801: if (count == -1)
! 2802: return -1;
! 2803: sum += count;
! 2804: }
! 2805: count = xmlTextWriterEndCDATA(writer);
! 2806: if (count == -1)
! 2807: return -1;
! 2808: sum += count;
! 2809:
! 2810: return sum;
! 2811: }
! 2812:
! 2813: /**
! 2814: * xmlTextWriterStartDTD:
! 2815: * @writer: the xmlTextWriterPtr
! 2816: * @name: the name of the DTD
! 2817: * @pubid: the public identifier, which is an alternative to the system identifier
! 2818: * @sysid: the system identifier, which is the URI of the DTD
! 2819: *
! 2820: * Start an xml DTD.
! 2821: *
! 2822: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2823: */
! 2824: int
! 2825: xmlTextWriterStartDTD(xmlTextWriterPtr writer,
! 2826: const xmlChar * name,
! 2827: const xmlChar * pubid, const xmlChar * sysid)
! 2828: {
! 2829: int count;
! 2830: int sum;
! 2831: xmlLinkPtr lk;
! 2832: xmlTextWriterStackEntry *p;
! 2833:
! 2834: if (writer == NULL || name == NULL || *name == '\0')
! 2835: return -1;
! 2836:
! 2837: sum = 0;
! 2838: lk = xmlListFront(writer->nodes);
! 2839: if ((lk != NULL) && (xmlLinkGetData(lk) != NULL)) {
! 2840: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 2841: "xmlTextWriterStartDTD : DTD allowed only in prolog!\n");
! 2842: return -1;
! 2843: }
! 2844:
! 2845: p = (xmlTextWriterStackEntry *)
! 2846: xmlMalloc(sizeof(xmlTextWriterStackEntry));
! 2847: if (p == 0) {
! 2848: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 2849: "xmlTextWriterStartDTD : out of memory!\n");
! 2850: return -1;
! 2851: }
! 2852:
! 2853: p->name = xmlStrdup(name);
! 2854: if (p->name == 0) {
! 2855: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 2856: "xmlTextWriterStartDTD : out of memory!\n");
! 2857: xmlFree(p);
! 2858: return -1;
! 2859: }
! 2860: p->state = XML_TEXTWRITER_DTD;
! 2861:
! 2862: xmlListPushFront(writer->nodes, p);
! 2863:
! 2864: count = xmlOutputBufferWriteString(writer->out, "<!DOCTYPE ");
! 2865: if (count < 0)
! 2866: return -1;
! 2867: sum += count;
! 2868: count = xmlOutputBufferWriteString(writer->out, (const char *) name);
! 2869: if (count < 0)
! 2870: return -1;
! 2871: sum += count;
! 2872:
! 2873: if (pubid != 0) {
! 2874: if (sysid == 0) {
! 2875: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 2876: "xmlTextWriterStartDTD : system identifier needed!\n");
! 2877: return -1;
! 2878: }
! 2879:
! 2880: if (writer->indent)
! 2881: count = xmlOutputBufferWrite(writer->out, 1, "\n");
! 2882: else
! 2883: count = xmlOutputBufferWrite(writer->out, 1, " ");
! 2884: if (count < 0)
! 2885: return -1;
! 2886: sum += count;
! 2887:
! 2888: count = xmlOutputBufferWriteString(writer->out, "PUBLIC ");
! 2889: if (count < 0)
! 2890: return -1;
! 2891: sum += count;
! 2892:
! 2893: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 2894: if (count < 0)
! 2895: return -1;
! 2896: sum += count;
! 2897:
! 2898: count =
! 2899: xmlOutputBufferWriteString(writer->out, (const char *) pubid);
! 2900: if (count < 0)
! 2901: return -1;
! 2902: sum += count;
! 2903:
! 2904: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 2905: if (count < 0)
! 2906: return -1;
! 2907: sum += count;
! 2908: }
! 2909:
! 2910: if (sysid != 0) {
! 2911: if (pubid == 0) {
! 2912: if (writer->indent)
! 2913: count = xmlOutputBufferWrite(writer->out, 1, "\n");
! 2914: else
! 2915: count = xmlOutputBufferWrite(writer->out, 1, " ");
! 2916: if (count < 0)
! 2917: return -1;
! 2918: sum += count;
! 2919: count = xmlOutputBufferWriteString(writer->out, "SYSTEM ");
! 2920: if (count < 0)
! 2921: return -1;
! 2922: sum += count;
! 2923: } else {
! 2924: if (writer->indent)
! 2925: count = xmlOutputBufferWriteString(writer->out, "\n ");
! 2926: else
! 2927: count = xmlOutputBufferWrite(writer->out, 1, " ");
! 2928: if (count < 0)
! 2929: return -1;
! 2930: sum += count;
! 2931: }
! 2932:
! 2933: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 2934: if (count < 0)
! 2935: return -1;
! 2936: sum += count;
! 2937:
! 2938: count =
! 2939: xmlOutputBufferWriteString(writer->out, (const char *) sysid);
! 2940: if (count < 0)
! 2941: return -1;
! 2942: sum += count;
! 2943:
! 2944: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 2945: if (count < 0)
! 2946: return -1;
! 2947: sum += count;
! 2948: }
! 2949:
! 2950: return sum;
! 2951: }
! 2952:
! 2953: /**
! 2954: * xmlTextWriterEndDTD:
! 2955: * @writer: the xmlTextWriterPtr
! 2956: *
! 2957: * End an xml DTD.
! 2958: *
! 2959: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 2960: */
! 2961: int
! 2962: xmlTextWriterEndDTD(xmlTextWriterPtr writer)
! 2963: {
! 2964: int loop;
! 2965: int count;
! 2966: int sum;
! 2967: xmlLinkPtr lk;
! 2968: xmlTextWriterStackEntry *p;
! 2969:
! 2970: if (writer == NULL)
! 2971: return -1;
! 2972:
! 2973: sum = 0;
! 2974: loop = 1;
! 2975: while (loop) {
! 2976: lk = xmlListFront(writer->nodes);
! 2977: if (lk == NULL)
! 2978: break;
! 2979: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 2980: if (p == 0)
! 2981: break;
! 2982: switch (p->state) {
! 2983: case XML_TEXTWRITER_DTD_TEXT:
! 2984: count = xmlOutputBufferWriteString(writer->out, "]");
! 2985: if (count < 0)
! 2986: return -1;
! 2987: sum += count;
! 2988: /* fallthrough */
! 2989: case XML_TEXTWRITER_DTD:
! 2990: count = xmlOutputBufferWriteString(writer->out, ">");
! 2991:
! 2992: if (writer->indent) {
! 2993: if (count < 0)
! 2994: return -1;
! 2995: sum += count;
! 2996: count = xmlOutputBufferWriteString(writer->out, "\n");
! 2997: }
! 2998:
! 2999: xmlListPopFront(writer->nodes);
! 3000: break;
! 3001: case XML_TEXTWRITER_DTD_ELEM:
! 3002: case XML_TEXTWRITER_DTD_ELEM_TEXT:
! 3003: count = xmlTextWriterEndDTDElement(writer);
! 3004: break;
! 3005: case XML_TEXTWRITER_DTD_ATTL:
! 3006: case XML_TEXTWRITER_DTD_ATTL_TEXT:
! 3007: count = xmlTextWriterEndDTDAttlist(writer);
! 3008: break;
! 3009: case XML_TEXTWRITER_DTD_ENTY:
! 3010: case XML_TEXTWRITER_DTD_PENT:
! 3011: case XML_TEXTWRITER_DTD_ENTY_TEXT:
! 3012: count = xmlTextWriterEndDTDEntity(writer);
! 3013: break;
! 3014: case XML_TEXTWRITER_COMMENT:
! 3015: count = xmlTextWriterEndComment(writer);
! 3016: break;
! 3017: default:
! 3018: loop = 0;
! 3019: continue;
! 3020: }
! 3021:
! 3022: if (count < 0)
! 3023: return -1;
! 3024: sum += count;
! 3025: }
! 3026:
! 3027: return sum;
! 3028: }
! 3029:
! 3030: /**
! 3031: * xmlTextWriterWriteFormatDTD:
! 3032: * @writer: the xmlTextWriterPtr
! 3033: * @name: the name of the DTD
! 3034: * @pubid: the public identifier, which is an alternative to the system identifier
! 3035: * @sysid: the system identifier, which is the URI of the DTD
! 3036: * @format: format string (see printf)
! 3037: * @...: extra parameters for the format
! 3038: *
! 3039: * Write a DTD with a formatted markup declarations part.
! 3040: *
! 3041: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3042: */
! 3043: int XMLCDECL
! 3044: xmlTextWriterWriteFormatDTD(xmlTextWriterPtr writer,
! 3045: const xmlChar * name,
! 3046: const xmlChar * pubid,
! 3047: const xmlChar * sysid, const char *format, ...)
! 3048: {
! 3049: int rc;
! 3050: va_list ap;
! 3051:
! 3052: va_start(ap, format);
! 3053:
! 3054: rc = xmlTextWriterWriteVFormatDTD(writer, name, pubid, sysid, format,
! 3055: ap);
! 3056:
! 3057: va_end(ap);
! 3058: return rc;
! 3059: }
! 3060:
! 3061: /**
! 3062: * xmlTextWriterWriteVFormatDTD:
! 3063: * @writer: the xmlTextWriterPtr
! 3064: * @name: the name of the DTD
! 3065: * @pubid: the public identifier, which is an alternative to the system identifier
! 3066: * @sysid: the system identifier, which is the URI of the DTD
! 3067: * @format: format string (see printf)
! 3068: * @argptr: pointer to the first member of the variable argument list.
! 3069: *
! 3070: * Write a DTD with a formatted markup declarations part.
! 3071: *
! 3072: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3073: */
! 3074: int
! 3075: xmlTextWriterWriteVFormatDTD(xmlTextWriterPtr writer,
! 3076: const xmlChar * name,
! 3077: const xmlChar * pubid,
! 3078: const xmlChar * sysid,
! 3079: const char *format, va_list argptr)
! 3080: {
! 3081: int rc;
! 3082: xmlChar *buf;
! 3083:
! 3084: if (writer == NULL)
! 3085: return -1;
! 3086:
! 3087: buf = xmlTextWriterVSprintf(format, argptr);
! 3088: if (buf == NULL)
! 3089: return -1;
! 3090:
! 3091: rc = xmlTextWriterWriteDTD(writer, name, pubid, sysid, buf);
! 3092:
! 3093: xmlFree(buf);
! 3094: return rc;
! 3095: }
! 3096:
! 3097: /**
! 3098: * xmlTextWriterWriteDTD:
! 3099: * @writer: the xmlTextWriterPtr
! 3100: * @name: the name of the DTD
! 3101: * @pubid: the public identifier, which is an alternative to the system identifier
! 3102: * @sysid: the system identifier, which is the URI of the DTD
! 3103: * @subset: string content of the DTD
! 3104: *
! 3105: * Write a DTD.
! 3106: *
! 3107: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3108: */
! 3109: int
! 3110: xmlTextWriterWriteDTD(xmlTextWriterPtr writer,
! 3111: const xmlChar * name,
! 3112: const xmlChar * pubid,
! 3113: const xmlChar * sysid, const xmlChar * subset)
! 3114: {
! 3115: int count;
! 3116: int sum;
! 3117:
! 3118: sum = 0;
! 3119: count = xmlTextWriterStartDTD(writer, name, pubid, sysid);
! 3120: if (count == -1)
! 3121: return -1;
! 3122: sum += count;
! 3123: if (subset != 0) {
! 3124: count = xmlTextWriterWriteString(writer, subset);
! 3125: if (count == -1)
! 3126: return -1;
! 3127: sum += count;
! 3128: }
! 3129: count = xmlTextWriterEndDTD(writer);
! 3130: if (count == -1)
! 3131: return -1;
! 3132: sum += count;
! 3133:
! 3134: return sum;
! 3135: }
! 3136:
! 3137: /**
! 3138: * xmlTextWriterStartDTDElement:
! 3139: * @writer: the xmlTextWriterPtr
! 3140: * @name: the name of the DTD element
! 3141: *
! 3142: * Start an xml DTD element.
! 3143: *
! 3144: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3145: */
! 3146: int
! 3147: xmlTextWriterStartDTDElement(xmlTextWriterPtr writer, const xmlChar * name)
! 3148: {
! 3149: int count;
! 3150: int sum;
! 3151: xmlLinkPtr lk;
! 3152: xmlTextWriterStackEntry *p;
! 3153:
! 3154: if (writer == NULL || name == NULL || *name == '\0')
! 3155: return -1;
! 3156:
! 3157: sum = 0;
! 3158: lk = xmlListFront(writer->nodes);
! 3159: if (lk == 0) {
! 3160: return -1;
! 3161: }
! 3162:
! 3163: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 3164: if (p != 0) {
! 3165: switch (p->state) {
! 3166: case XML_TEXTWRITER_DTD:
! 3167: count = xmlOutputBufferWriteString(writer->out, " [");
! 3168: if (count < 0)
! 3169: return -1;
! 3170: sum += count;
! 3171: if (writer->indent) {
! 3172: count = xmlOutputBufferWriteString(writer->out, "\n");
! 3173: if (count < 0)
! 3174: return -1;
! 3175: sum += count;
! 3176: }
! 3177: p->state = XML_TEXTWRITER_DTD_TEXT;
! 3178: /* fallthrough */
! 3179: case XML_TEXTWRITER_DTD_TEXT:
! 3180: case XML_TEXTWRITER_NONE:
! 3181: break;
! 3182: default:
! 3183: return -1;
! 3184: }
! 3185: }
! 3186:
! 3187: p = (xmlTextWriterStackEntry *)
! 3188: xmlMalloc(sizeof(xmlTextWriterStackEntry));
! 3189: if (p == 0) {
! 3190: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 3191: "xmlTextWriterStartDTDElement : out of memory!\n");
! 3192: return -1;
! 3193: }
! 3194:
! 3195: p->name = xmlStrdup(name);
! 3196: if (p->name == 0) {
! 3197: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 3198: "xmlTextWriterStartDTDElement : out of memory!\n");
! 3199: xmlFree(p);
! 3200: return -1;
! 3201: }
! 3202: p->state = XML_TEXTWRITER_DTD_ELEM;
! 3203:
! 3204: xmlListPushFront(writer->nodes, p);
! 3205:
! 3206: if (writer->indent) {
! 3207: count = xmlTextWriterWriteIndent(writer);
! 3208: if (count < 0)
! 3209: return -1;
! 3210: sum += count;
! 3211: }
! 3212:
! 3213: count = xmlOutputBufferWriteString(writer->out, "<!ELEMENT ");
! 3214: if (count < 0)
! 3215: return -1;
! 3216: sum += count;
! 3217: count = xmlOutputBufferWriteString(writer->out, (const char *) name);
! 3218: if (count < 0)
! 3219: return -1;
! 3220: sum += count;
! 3221:
! 3222: return sum;
! 3223: }
! 3224:
! 3225: /**
! 3226: * xmlTextWriterEndDTDElement:
! 3227: * @writer: the xmlTextWriterPtr
! 3228: *
! 3229: * End an xml DTD element.
! 3230: *
! 3231: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3232: */
! 3233: int
! 3234: xmlTextWriterEndDTDElement(xmlTextWriterPtr writer)
! 3235: {
! 3236: int count;
! 3237: int sum;
! 3238: xmlLinkPtr lk;
! 3239: xmlTextWriterStackEntry *p;
! 3240:
! 3241: if (writer == NULL)
! 3242: return -1;
! 3243:
! 3244: sum = 0;
! 3245: lk = xmlListFront(writer->nodes);
! 3246: if (lk == 0)
! 3247: return -1;
! 3248:
! 3249: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 3250: if (p == 0)
! 3251: return -1;
! 3252:
! 3253: switch (p->state) {
! 3254: case XML_TEXTWRITER_DTD_ELEM:
! 3255: case XML_TEXTWRITER_DTD_ELEM_TEXT:
! 3256: count = xmlOutputBufferWriteString(writer->out, ">");
! 3257: if (count < 0)
! 3258: return -1;
! 3259: sum += count;
! 3260: break;
! 3261: default:
! 3262: return -1;
! 3263: }
! 3264:
! 3265: if (writer->indent) {
! 3266: count = xmlOutputBufferWriteString(writer->out, "\n");
! 3267: if (count < 0)
! 3268: return -1;
! 3269: sum += count;
! 3270: }
! 3271:
! 3272: xmlListPopFront(writer->nodes);
! 3273: return sum;
! 3274: }
! 3275:
! 3276: /**
! 3277: * xmlTextWriterWriteFormatDTDElement:
! 3278: * @writer: the xmlTextWriterPtr
! 3279: * @name: the name of the DTD element
! 3280: * @format: format string (see printf)
! 3281: * @...: extra parameters for the format
! 3282: *
! 3283: * Write a formatted DTD element.
! 3284: *
! 3285: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3286: */
! 3287: int XMLCDECL
! 3288: xmlTextWriterWriteFormatDTDElement(xmlTextWriterPtr writer,
! 3289: const xmlChar * name,
! 3290: const char *format, ...)
! 3291: {
! 3292: int rc;
! 3293: va_list ap;
! 3294:
! 3295: va_start(ap, format);
! 3296:
! 3297: rc = xmlTextWriterWriteVFormatDTDElement(writer, name, format, ap);
! 3298:
! 3299: va_end(ap);
! 3300: return rc;
! 3301: }
! 3302:
! 3303: /**
! 3304: * xmlTextWriterWriteVFormatDTDElement:
! 3305: * @writer: the xmlTextWriterPtr
! 3306: * @name: the name of the DTD element
! 3307: * @format: format string (see printf)
! 3308: * @argptr: pointer to the first member of the variable argument list.
! 3309: *
! 3310: * Write a formatted DTD element.
! 3311: *
! 3312: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3313: */
! 3314: int
! 3315: xmlTextWriterWriteVFormatDTDElement(xmlTextWriterPtr writer,
! 3316: const xmlChar * name,
! 3317: const char *format, va_list argptr)
! 3318: {
! 3319: int rc;
! 3320: xmlChar *buf;
! 3321:
! 3322: if (writer == NULL)
! 3323: return -1;
! 3324:
! 3325: buf = xmlTextWriterVSprintf(format, argptr);
! 3326: if (buf == NULL)
! 3327: return -1;
! 3328:
! 3329: rc = xmlTextWriterWriteDTDElement(writer, name, buf);
! 3330:
! 3331: xmlFree(buf);
! 3332: return rc;
! 3333: }
! 3334:
! 3335: /**
! 3336: * xmlTextWriterWriteDTDElement:
! 3337: * @writer: the xmlTextWriterPtr
! 3338: * @name: the name of the DTD element
! 3339: * @content: content of the element
! 3340: *
! 3341: * Write a DTD element.
! 3342: *
! 3343: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3344: */
! 3345: int
! 3346: xmlTextWriterWriteDTDElement(xmlTextWriterPtr writer,
! 3347: const xmlChar * name, const xmlChar * content)
! 3348: {
! 3349: int count;
! 3350: int sum;
! 3351:
! 3352: if (content == NULL)
! 3353: return -1;
! 3354:
! 3355: sum = 0;
! 3356: count = xmlTextWriterStartDTDElement(writer, name);
! 3357: if (count == -1)
! 3358: return -1;
! 3359: sum += count;
! 3360:
! 3361: count = xmlTextWriterWriteString(writer, content);
! 3362: if (count == -1)
! 3363: return -1;
! 3364: sum += count;
! 3365:
! 3366: count = xmlTextWriterEndDTDElement(writer);
! 3367: if (count == -1)
! 3368: return -1;
! 3369: sum += count;
! 3370:
! 3371: return sum;
! 3372: }
! 3373:
! 3374: /**
! 3375: * xmlTextWriterStartDTDAttlist:
! 3376: * @writer: the xmlTextWriterPtr
! 3377: * @name: the name of the DTD ATTLIST
! 3378: *
! 3379: * Start an xml DTD ATTLIST.
! 3380: *
! 3381: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3382: */
! 3383: int
! 3384: xmlTextWriterStartDTDAttlist(xmlTextWriterPtr writer, const xmlChar * name)
! 3385: {
! 3386: int count;
! 3387: int sum;
! 3388: xmlLinkPtr lk;
! 3389: xmlTextWriterStackEntry *p;
! 3390:
! 3391: if (writer == NULL || name == NULL || *name == '\0')
! 3392: return -1;
! 3393:
! 3394: sum = 0;
! 3395: lk = xmlListFront(writer->nodes);
! 3396: if (lk == 0) {
! 3397: return -1;
! 3398: }
! 3399:
! 3400: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 3401: if (p != 0) {
! 3402: switch (p->state) {
! 3403: case XML_TEXTWRITER_DTD:
! 3404: count = xmlOutputBufferWriteString(writer->out, " [");
! 3405: if (count < 0)
! 3406: return -1;
! 3407: sum += count;
! 3408: if (writer->indent) {
! 3409: count = xmlOutputBufferWriteString(writer->out, "\n");
! 3410: if (count < 0)
! 3411: return -1;
! 3412: sum += count;
! 3413: }
! 3414: p->state = XML_TEXTWRITER_DTD_TEXT;
! 3415: /* fallthrough */
! 3416: case XML_TEXTWRITER_DTD_TEXT:
! 3417: case XML_TEXTWRITER_NONE:
! 3418: break;
! 3419: default:
! 3420: return -1;
! 3421: }
! 3422: }
! 3423:
! 3424: p = (xmlTextWriterStackEntry *)
! 3425: xmlMalloc(sizeof(xmlTextWriterStackEntry));
! 3426: if (p == 0) {
! 3427: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 3428: "xmlTextWriterStartDTDAttlist : out of memory!\n");
! 3429: return -1;
! 3430: }
! 3431:
! 3432: p->name = xmlStrdup(name);
! 3433: if (p->name == 0) {
! 3434: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 3435: "xmlTextWriterStartDTDAttlist : out of memory!\n");
! 3436: xmlFree(p);
! 3437: return -1;
! 3438: }
! 3439: p->state = XML_TEXTWRITER_DTD_ATTL;
! 3440:
! 3441: xmlListPushFront(writer->nodes, p);
! 3442:
! 3443: if (writer->indent) {
! 3444: count = xmlTextWriterWriteIndent(writer);
! 3445: if (count < 0)
! 3446: return -1;
! 3447: sum += count;
! 3448: }
! 3449:
! 3450: count = xmlOutputBufferWriteString(writer->out, "<!ATTLIST ");
! 3451: if (count < 0)
! 3452: return -1;
! 3453: sum += count;
! 3454: count = xmlOutputBufferWriteString(writer->out, (const char *) name);
! 3455: if (count < 0)
! 3456: return -1;
! 3457: sum += count;
! 3458:
! 3459: return sum;
! 3460: }
! 3461:
! 3462: /**
! 3463: * xmlTextWriterEndDTDAttlist:
! 3464: * @writer: the xmlTextWriterPtr
! 3465: *
! 3466: * End an xml DTD attribute list.
! 3467: *
! 3468: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3469: */
! 3470: int
! 3471: xmlTextWriterEndDTDAttlist(xmlTextWriterPtr writer)
! 3472: {
! 3473: int count;
! 3474: int sum;
! 3475: xmlLinkPtr lk;
! 3476: xmlTextWriterStackEntry *p;
! 3477:
! 3478: if (writer == NULL)
! 3479: return -1;
! 3480:
! 3481: sum = 0;
! 3482: lk = xmlListFront(writer->nodes);
! 3483: if (lk == 0)
! 3484: return -1;
! 3485:
! 3486: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 3487: if (p == 0)
! 3488: return -1;
! 3489:
! 3490: switch (p->state) {
! 3491: case XML_TEXTWRITER_DTD_ATTL:
! 3492: case XML_TEXTWRITER_DTD_ATTL_TEXT:
! 3493: count = xmlOutputBufferWriteString(writer->out, ">");
! 3494: if (count < 0)
! 3495: return -1;
! 3496: sum += count;
! 3497: break;
! 3498: default:
! 3499: return -1;
! 3500: }
! 3501:
! 3502: if (writer->indent) {
! 3503: count = xmlOutputBufferWriteString(writer->out, "\n");
! 3504: if (count < 0)
! 3505: return -1;
! 3506: sum += count;
! 3507: }
! 3508:
! 3509: xmlListPopFront(writer->nodes);
! 3510: return sum;
! 3511: }
! 3512:
! 3513: /**
! 3514: * xmlTextWriterWriteFormatDTDAttlist:
! 3515: * @writer: the xmlTextWriterPtr
! 3516: * @name: the name of the DTD ATTLIST
! 3517: * @format: format string (see printf)
! 3518: * @...: extra parameters for the format
! 3519: *
! 3520: * Write a formatted DTD ATTLIST.
! 3521: *
! 3522: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3523: */
! 3524: int XMLCDECL
! 3525: xmlTextWriterWriteFormatDTDAttlist(xmlTextWriterPtr writer,
! 3526: const xmlChar * name,
! 3527: const char *format, ...)
! 3528: {
! 3529: int rc;
! 3530: va_list ap;
! 3531:
! 3532: va_start(ap, format);
! 3533:
! 3534: rc = xmlTextWriterWriteVFormatDTDAttlist(writer, name, format, ap);
! 3535:
! 3536: va_end(ap);
! 3537: return rc;
! 3538: }
! 3539:
! 3540: /**
! 3541: * xmlTextWriterWriteVFormatDTDAttlist:
! 3542: * @writer: the xmlTextWriterPtr
! 3543: * @name: the name of the DTD ATTLIST
! 3544: * @format: format string (see printf)
! 3545: * @argptr: pointer to the first member of the variable argument list.
! 3546: *
! 3547: * Write a formatted DTD ATTLIST.
! 3548: *
! 3549: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3550: */
! 3551: int
! 3552: xmlTextWriterWriteVFormatDTDAttlist(xmlTextWriterPtr writer,
! 3553: const xmlChar * name,
! 3554: const char *format, va_list argptr)
! 3555: {
! 3556: int rc;
! 3557: xmlChar *buf;
! 3558:
! 3559: if (writer == NULL)
! 3560: return -1;
! 3561:
! 3562: buf = xmlTextWriterVSprintf(format, argptr);
! 3563: if (buf == NULL)
! 3564: return -1;
! 3565:
! 3566: rc = xmlTextWriterWriteDTDAttlist(writer, name, buf);
! 3567:
! 3568: xmlFree(buf);
! 3569: return rc;
! 3570: }
! 3571:
! 3572: /**
! 3573: * xmlTextWriterWriteDTDAttlist:
! 3574: * @writer: the xmlTextWriterPtr
! 3575: * @name: the name of the DTD ATTLIST
! 3576: * @content: content of the ATTLIST
! 3577: *
! 3578: * Write a DTD ATTLIST.
! 3579: *
! 3580: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3581: */
! 3582: int
! 3583: xmlTextWriterWriteDTDAttlist(xmlTextWriterPtr writer,
! 3584: const xmlChar * name, const xmlChar * content)
! 3585: {
! 3586: int count;
! 3587: int sum;
! 3588:
! 3589: if (content == NULL)
! 3590: return -1;
! 3591:
! 3592: sum = 0;
! 3593: count = xmlTextWriterStartDTDAttlist(writer, name);
! 3594: if (count == -1)
! 3595: return -1;
! 3596: sum += count;
! 3597:
! 3598: count = xmlTextWriterWriteString(writer, content);
! 3599: if (count == -1)
! 3600: return -1;
! 3601: sum += count;
! 3602:
! 3603: count = xmlTextWriterEndDTDAttlist(writer);
! 3604: if (count == -1)
! 3605: return -1;
! 3606: sum += count;
! 3607:
! 3608: return sum;
! 3609: }
! 3610:
! 3611: /**
! 3612: * xmlTextWriterStartDTDEntity:
! 3613: * @writer: the xmlTextWriterPtr
! 3614: * @pe: TRUE if this is a parameter entity, FALSE if not
! 3615: * @name: the name of the DTD ATTLIST
! 3616: *
! 3617: * Start an xml DTD ATTLIST.
! 3618: *
! 3619: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3620: */
! 3621: int
! 3622: xmlTextWriterStartDTDEntity(xmlTextWriterPtr writer,
! 3623: int pe, const xmlChar * name)
! 3624: {
! 3625: int count;
! 3626: int sum;
! 3627: xmlLinkPtr lk;
! 3628: xmlTextWriterStackEntry *p;
! 3629:
! 3630: if (writer == NULL || name == NULL || *name == '\0')
! 3631: return -1;
! 3632:
! 3633: sum = 0;
! 3634: lk = xmlListFront(writer->nodes);
! 3635: if (lk != 0) {
! 3636:
! 3637: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 3638: if (p != 0) {
! 3639: switch (p->state) {
! 3640: case XML_TEXTWRITER_DTD:
! 3641: count = xmlOutputBufferWriteString(writer->out, " [");
! 3642: if (count < 0)
! 3643: return -1;
! 3644: sum += count;
! 3645: if (writer->indent) {
! 3646: count =
! 3647: xmlOutputBufferWriteString(writer->out, "\n");
! 3648: if (count < 0)
! 3649: return -1;
! 3650: sum += count;
! 3651: }
! 3652: p->state = XML_TEXTWRITER_DTD_TEXT;
! 3653: /* fallthrough */
! 3654: case XML_TEXTWRITER_DTD_TEXT:
! 3655: case XML_TEXTWRITER_NONE:
! 3656: break;
! 3657: default:
! 3658: return -1;
! 3659: }
! 3660: }
! 3661: }
! 3662:
! 3663: p = (xmlTextWriterStackEntry *)
! 3664: xmlMalloc(sizeof(xmlTextWriterStackEntry));
! 3665: if (p == 0) {
! 3666: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 3667: "xmlTextWriterStartDTDElement : out of memory!\n");
! 3668: return -1;
! 3669: }
! 3670:
! 3671: p->name = xmlStrdup(name);
! 3672: if (p->name == 0) {
! 3673: xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,
! 3674: "xmlTextWriterStartDTDElement : out of memory!\n");
! 3675: xmlFree(p);
! 3676: return -1;
! 3677: }
! 3678:
! 3679: if (pe != 0)
! 3680: p->state = XML_TEXTWRITER_DTD_PENT;
! 3681: else
! 3682: p->state = XML_TEXTWRITER_DTD_ENTY;
! 3683:
! 3684: xmlListPushFront(writer->nodes, p);
! 3685:
! 3686: if (writer->indent) {
! 3687: count = xmlTextWriterWriteIndent(writer);
! 3688: if (count < 0)
! 3689: return -1;
! 3690: sum += count;
! 3691: }
! 3692:
! 3693: count = xmlOutputBufferWriteString(writer->out, "<!ENTITY ");
! 3694: if (count < 0)
! 3695: return -1;
! 3696: sum += count;
! 3697:
! 3698: if (pe != 0) {
! 3699: count = xmlOutputBufferWriteString(writer->out, "% ");
! 3700: if (count < 0)
! 3701: return -1;
! 3702: sum += count;
! 3703: }
! 3704:
! 3705: count = xmlOutputBufferWriteString(writer->out, (const char *) name);
! 3706: if (count < 0)
! 3707: return -1;
! 3708: sum += count;
! 3709:
! 3710: return sum;
! 3711: }
! 3712:
! 3713: /**
! 3714: * xmlTextWriterEndDTDEntity:
! 3715: * @writer: the xmlTextWriterPtr
! 3716: *
! 3717: * End an xml DTD entity.
! 3718: *
! 3719: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3720: */
! 3721: int
! 3722: xmlTextWriterEndDTDEntity(xmlTextWriterPtr writer)
! 3723: {
! 3724: int count;
! 3725: int sum;
! 3726: xmlLinkPtr lk;
! 3727: xmlTextWriterStackEntry *p;
! 3728:
! 3729: if (writer == NULL)
! 3730: return -1;
! 3731:
! 3732: sum = 0;
! 3733: lk = xmlListFront(writer->nodes);
! 3734: if (lk == 0)
! 3735: return -1;
! 3736:
! 3737: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 3738: if (p == 0)
! 3739: return -1;
! 3740:
! 3741: switch (p->state) {
! 3742: case XML_TEXTWRITER_DTD_ENTY_TEXT:
! 3743: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 3744: if (count < 0)
! 3745: return -1;
! 3746: sum += count;
! 3747: case XML_TEXTWRITER_DTD_ENTY:
! 3748: case XML_TEXTWRITER_DTD_PENT:
! 3749: count = xmlOutputBufferWriteString(writer->out, ">");
! 3750: if (count < 0)
! 3751: return -1;
! 3752: sum += count;
! 3753: break;
! 3754: default:
! 3755: return -1;
! 3756: }
! 3757:
! 3758: if (writer->indent) {
! 3759: count = xmlOutputBufferWriteString(writer->out, "\n");
! 3760: if (count < 0)
! 3761: return -1;
! 3762: sum += count;
! 3763: }
! 3764:
! 3765: xmlListPopFront(writer->nodes);
! 3766: return sum;
! 3767: }
! 3768:
! 3769: /**
! 3770: * xmlTextWriterWriteFormatDTDInternalEntity:
! 3771: * @writer: the xmlTextWriterPtr
! 3772: * @pe: TRUE if this is a parameter entity, FALSE if not
! 3773: * @name: the name of the DTD entity
! 3774: * @format: format string (see printf)
! 3775: * @...: extra parameters for the format
! 3776: *
! 3777: * Write a formatted DTD internal entity.
! 3778: *
! 3779: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3780: */
! 3781: int XMLCDECL
! 3782: xmlTextWriterWriteFormatDTDInternalEntity(xmlTextWriterPtr writer,
! 3783: int pe,
! 3784: const xmlChar * name,
! 3785: const char *format, ...)
! 3786: {
! 3787: int rc;
! 3788: va_list ap;
! 3789:
! 3790: va_start(ap, format);
! 3791:
! 3792: rc = xmlTextWriterWriteVFormatDTDInternalEntity(writer, pe, name,
! 3793: format, ap);
! 3794:
! 3795: va_end(ap);
! 3796: return rc;
! 3797: }
! 3798:
! 3799: /**
! 3800: * xmlTextWriterWriteVFormatDTDInternalEntity:
! 3801: * @writer: the xmlTextWriterPtr
! 3802: * @pe: TRUE if this is a parameter entity, FALSE if not
! 3803: * @name: the name of the DTD entity
! 3804: * @format: format string (see printf)
! 3805: * @argptr: pointer to the first member of the variable argument list.
! 3806: *
! 3807: * Write a formatted DTD internal entity.
! 3808: *
! 3809: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3810: */
! 3811: int
! 3812: xmlTextWriterWriteVFormatDTDInternalEntity(xmlTextWriterPtr writer,
! 3813: int pe,
! 3814: const xmlChar * name,
! 3815: const char *format,
! 3816: va_list argptr)
! 3817: {
! 3818: int rc;
! 3819: xmlChar *buf;
! 3820:
! 3821: if (writer == NULL)
! 3822: return -1;
! 3823:
! 3824: buf = xmlTextWriterVSprintf(format, argptr);
! 3825: if (buf == NULL)
! 3826: return -1;
! 3827:
! 3828: rc = xmlTextWriterWriteDTDInternalEntity(writer, pe, name, buf);
! 3829:
! 3830: xmlFree(buf);
! 3831: return rc;
! 3832: }
! 3833:
! 3834: /**
! 3835: * xmlTextWriterWriteDTDEntity:
! 3836: * @writer: the xmlTextWriterPtr
! 3837: * @pe: TRUE if this is a parameter entity, FALSE if not
! 3838: * @name: the name of the DTD entity
! 3839: * @pubid: the public identifier, which is an alternative to the system identifier
! 3840: * @sysid: the system identifier, which is the URI of the DTD
! 3841: * @ndataid: the xml notation name.
! 3842: * @content: content of the entity
! 3843: *
! 3844: * Write a DTD entity.
! 3845: *
! 3846: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3847: */
! 3848: int
! 3849: xmlTextWriterWriteDTDEntity(xmlTextWriterPtr writer,
! 3850: int pe,
! 3851: const xmlChar * name,
! 3852: const xmlChar * pubid,
! 3853: const xmlChar * sysid,
! 3854: const xmlChar * ndataid,
! 3855: const xmlChar * content)
! 3856: {
! 3857: if ((content == NULL) && (pubid == NULL) && (sysid == NULL))
! 3858: return -1;
! 3859: if ((pe != 0) && (ndataid != NULL))
! 3860: return -1;
! 3861:
! 3862: if ((pubid == NULL) && (sysid == NULL))
! 3863: return xmlTextWriterWriteDTDInternalEntity(writer, pe, name,
! 3864: content);
! 3865:
! 3866: return xmlTextWriterWriteDTDExternalEntity(writer, pe, name, pubid,
! 3867: sysid, ndataid);
! 3868: }
! 3869:
! 3870: /**
! 3871: * xmlTextWriterWriteDTDInternalEntity:
! 3872: * @writer: the xmlTextWriterPtr
! 3873: * @pe: TRUE if this is a parameter entity, FALSE if not
! 3874: * @name: the name of the DTD entity
! 3875: * @content: content of the entity
! 3876: *
! 3877: * Write a DTD internal entity.
! 3878: *
! 3879: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3880: */
! 3881: int
! 3882: xmlTextWriterWriteDTDInternalEntity(xmlTextWriterPtr writer,
! 3883: int pe,
! 3884: const xmlChar * name,
! 3885: const xmlChar * content)
! 3886: {
! 3887: int count;
! 3888: int sum;
! 3889:
! 3890: if ((name == NULL) || (*name == '\0') || (content == NULL))
! 3891: return -1;
! 3892:
! 3893: sum = 0;
! 3894: count = xmlTextWriterStartDTDEntity(writer, pe, name);
! 3895: if (count == -1)
! 3896: return -1;
! 3897: sum += count;
! 3898:
! 3899: count = xmlTextWriterWriteString(writer, content);
! 3900: if (count == -1)
! 3901: return -1;
! 3902: sum += count;
! 3903:
! 3904: count = xmlTextWriterEndDTDEntity(writer);
! 3905: if (count == -1)
! 3906: return -1;
! 3907: sum += count;
! 3908:
! 3909: return sum;
! 3910: }
! 3911:
! 3912: /**
! 3913: * xmlTextWriterWriteDTDExternalEntity:
! 3914: * @writer: the xmlTextWriterPtr
! 3915: * @pe: TRUE if this is a parameter entity, FALSE if not
! 3916: * @name: the name of the DTD entity
! 3917: * @pubid: the public identifier, which is an alternative to the system identifier
! 3918: * @sysid: the system identifier, which is the URI of the DTD
! 3919: * @ndataid: the xml notation name.
! 3920: *
! 3921: * Write a DTD external entity. The entity must have been started with xmlTextWriterStartDTDEntity
! 3922: *
! 3923: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3924: */
! 3925: int
! 3926: xmlTextWriterWriteDTDExternalEntity(xmlTextWriterPtr writer,
! 3927: int pe,
! 3928: const xmlChar * name,
! 3929: const xmlChar * pubid,
! 3930: const xmlChar * sysid,
! 3931: const xmlChar * ndataid)
! 3932: {
! 3933: int count;
! 3934: int sum;
! 3935:
! 3936: if (((pubid == NULL) && (sysid == NULL)))
! 3937: return -1;
! 3938: if ((pe != 0) && (ndataid != NULL))
! 3939: return -1;
! 3940:
! 3941: sum = 0;
! 3942: count = xmlTextWriterStartDTDEntity(writer, pe, name);
! 3943: if (count == -1)
! 3944: return -1;
! 3945: sum += count;
! 3946:
! 3947: count =
! 3948: xmlTextWriterWriteDTDExternalEntityContents(writer, pubid, sysid,
! 3949: ndataid);
! 3950: if (count < 0)
! 3951: return -1;
! 3952: sum += count;
! 3953:
! 3954: count = xmlTextWriterEndDTDEntity(writer);
! 3955: if (count == -1)
! 3956: return -1;
! 3957: sum += count;
! 3958:
! 3959: return sum;
! 3960: }
! 3961:
! 3962: /**
! 3963: * xmlTextWriterWriteDTDExternalEntityContents:
! 3964: * @writer: the xmlTextWriterPtr
! 3965: * @pubid: the public identifier, which is an alternative to the system identifier
! 3966: * @sysid: the system identifier, which is the URI of the DTD
! 3967: * @ndataid: the xml notation name.
! 3968: *
! 3969: * Write the contents of a DTD external entity.
! 3970: *
! 3971: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 3972: */
! 3973: int
! 3974: xmlTextWriterWriteDTDExternalEntityContents(xmlTextWriterPtr writer,
! 3975: const xmlChar * pubid,
! 3976: const xmlChar * sysid,
! 3977: const xmlChar * ndataid)
! 3978: {
! 3979: int count;
! 3980: int sum;
! 3981: xmlLinkPtr lk;
! 3982: xmlTextWriterStackEntry *p;
! 3983:
! 3984: if (writer == NULL) {
! 3985: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 3986: "xmlTextWriterWriteDTDExternalEntityContents: xmlTextWriterPtr invalid!\n");
! 3987: return -1;
! 3988: }
! 3989:
! 3990: sum = 0;
! 3991: lk = xmlListFront(writer->nodes);
! 3992: if (lk == 0) {
! 3993: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 3994: "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
! 3995: return -1;
! 3996: }
! 3997:
! 3998: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 3999: if (p == 0)
! 4000: return -1;
! 4001:
! 4002: switch (p->state) {
! 4003: case XML_TEXTWRITER_DTD_ENTY:
! 4004: break;
! 4005: case XML_TEXTWRITER_DTD_PENT:
! 4006: if (ndataid != NULL) {
! 4007: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 4008: "xmlTextWriterWriteDTDExternalEntityContents: notation not allowed with parameter entities!\n");
! 4009: return -1;
! 4010: }
! 4011: break;
! 4012: default:
! 4013: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 4014: "xmlTextWriterWriteDTDExternalEntityContents: you must call xmlTextWriterStartDTDEntity before the call to this function!\n");
! 4015: return -1;
! 4016: }
! 4017:
! 4018: if (pubid != 0) {
! 4019: if (sysid == 0) {
! 4020: xmlWriterErrMsg(writer, XML_ERR_INTERNAL_ERROR,
! 4021: "xmlTextWriterWriteDTDExternalEntityContents: system identifier needed!\n");
! 4022: return -1;
! 4023: }
! 4024:
! 4025: count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
! 4026: if (count < 0)
! 4027: return -1;
! 4028: sum += count;
! 4029:
! 4030: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 4031: if (count < 0)
! 4032: return -1;
! 4033: sum += count;
! 4034:
! 4035: count =
! 4036: xmlOutputBufferWriteString(writer->out, (const char *) pubid);
! 4037: if (count < 0)
! 4038: return -1;
! 4039: sum += count;
! 4040:
! 4041: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 4042: if (count < 0)
! 4043: return -1;
! 4044: sum += count;
! 4045: }
! 4046:
! 4047: if (sysid != 0) {
! 4048: if (pubid == 0) {
! 4049: count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
! 4050: if (count < 0)
! 4051: return -1;
! 4052: sum += count;
! 4053: }
! 4054:
! 4055: count = xmlOutputBufferWriteString(writer->out, " ");
! 4056: if (count < 0)
! 4057: return -1;
! 4058: sum += count;
! 4059:
! 4060: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 4061: if (count < 0)
! 4062: return -1;
! 4063: sum += count;
! 4064:
! 4065: count =
! 4066: xmlOutputBufferWriteString(writer->out, (const char *) sysid);
! 4067: if (count < 0)
! 4068: return -1;
! 4069: sum += count;
! 4070:
! 4071: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 4072: if (count < 0)
! 4073: return -1;
! 4074: sum += count;
! 4075: }
! 4076:
! 4077: if (ndataid != NULL) {
! 4078: count = xmlOutputBufferWriteString(writer->out, " NDATA ");
! 4079: if (count < 0)
! 4080: return -1;
! 4081: sum += count;
! 4082:
! 4083: count =
! 4084: xmlOutputBufferWriteString(writer->out,
! 4085: (const char *) ndataid);
! 4086: if (count < 0)
! 4087: return -1;
! 4088: sum += count;
! 4089: }
! 4090:
! 4091: return sum;
! 4092: }
! 4093:
! 4094: /**
! 4095: * xmlTextWriterWriteDTDNotation:
! 4096: * @writer: the xmlTextWriterPtr
! 4097: * @name: the name of the xml notation
! 4098: * @pubid: the public identifier, which is an alternative to the system identifier
! 4099: * @sysid: the system identifier, which is the URI of the DTD
! 4100: *
! 4101: * Write a DTD entity.
! 4102: *
! 4103: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 4104: */
! 4105: int
! 4106: xmlTextWriterWriteDTDNotation(xmlTextWriterPtr writer,
! 4107: const xmlChar * name,
! 4108: const xmlChar * pubid, const xmlChar * sysid)
! 4109: {
! 4110: int count;
! 4111: int sum;
! 4112: xmlLinkPtr lk;
! 4113: xmlTextWriterStackEntry *p;
! 4114:
! 4115: if (writer == NULL || name == NULL || *name == '\0')
! 4116: return -1;
! 4117:
! 4118: sum = 0;
! 4119: lk = xmlListFront(writer->nodes);
! 4120: if (lk == 0) {
! 4121: return -1;
! 4122: }
! 4123:
! 4124: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 4125: if (p != 0) {
! 4126: switch (p->state) {
! 4127: case XML_TEXTWRITER_DTD:
! 4128: count = xmlOutputBufferWriteString(writer->out, " [");
! 4129: if (count < 0)
! 4130: return -1;
! 4131: sum += count;
! 4132: if (writer->indent) {
! 4133: count = xmlOutputBufferWriteString(writer->out, "\n");
! 4134: if (count < 0)
! 4135: return -1;
! 4136: sum += count;
! 4137: }
! 4138: p->state = XML_TEXTWRITER_DTD_TEXT;
! 4139: /* fallthrough */
! 4140: case XML_TEXTWRITER_DTD_TEXT:
! 4141: break;
! 4142: default:
! 4143: return -1;
! 4144: }
! 4145: }
! 4146:
! 4147: if (writer->indent) {
! 4148: count = xmlTextWriterWriteIndent(writer);
! 4149: if (count < 0)
! 4150: return -1;
! 4151: sum += count;
! 4152: }
! 4153:
! 4154: count = xmlOutputBufferWriteString(writer->out, "<!NOTATION ");
! 4155: if (count < 0)
! 4156: return -1;
! 4157: sum += count;
! 4158: count = xmlOutputBufferWriteString(writer->out, (const char *) name);
! 4159: if (count < 0)
! 4160: return -1;
! 4161: sum += count;
! 4162:
! 4163: if (pubid != 0) {
! 4164: count = xmlOutputBufferWriteString(writer->out, " PUBLIC ");
! 4165: if (count < 0)
! 4166: return -1;
! 4167: sum += count;
! 4168: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 4169: if (count < 0)
! 4170: return -1;
! 4171: sum += count;
! 4172: count =
! 4173: xmlOutputBufferWriteString(writer->out, (const char *) pubid);
! 4174: if (count < 0)
! 4175: return -1;
! 4176: sum += count;
! 4177: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 4178: if (count < 0)
! 4179: return -1;
! 4180: sum += count;
! 4181: }
! 4182:
! 4183: if (sysid != 0) {
! 4184: if (pubid == 0) {
! 4185: count = xmlOutputBufferWriteString(writer->out, " SYSTEM");
! 4186: if (count < 0)
! 4187: return -1;
! 4188: sum += count;
! 4189: }
! 4190: count = xmlOutputBufferWriteString(writer->out, " ");
! 4191: if (count < 0)
! 4192: return -1;
! 4193: sum += count;
! 4194: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 4195: if (count < 0)
! 4196: return -1;
! 4197: sum += count;
! 4198: count =
! 4199: xmlOutputBufferWriteString(writer->out, (const char *) sysid);
! 4200: if (count < 0)
! 4201: return -1;
! 4202: sum += count;
! 4203: count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);
! 4204: if (count < 0)
! 4205: return -1;
! 4206: sum += count;
! 4207: }
! 4208:
! 4209: count = xmlOutputBufferWriteString(writer->out, ">");
! 4210: if (count < 0)
! 4211: return -1;
! 4212: sum += count;
! 4213:
! 4214: return sum;
! 4215: }
! 4216:
! 4217: /**
! 4218: * xmlTextWriterFlush:
! 4219: * @writer: the xmlTextWriterPtr
! 4220: *
! 4221: * Flush the output buffer.
! 4222: *
! 4223: * Returns the bytes written (may be 0 because of buffering) or -1 in case of error
! 4224: */
! 4225: int
! 4226: xmlTextWriterFlush(xmlTextWriterPtr writer)
! 4227: {
! 4228: int count;
! 4229:
! 4230: if (writer == NULL)
! 4231: return -1;
! 4232:
! 4233: if (writer->out == NULL)
! 4234: count = 0;
! 4235: else
! 4236: count = xmlOutputBufferFlush(writer->out);
! 4237:
! 4238: return count;
! 4239: }
! 4240:
! 4241: /**
! 4242: * misc
! 4243: */
! 4244:
! 4245: /**
! 4246: * xmlFreeTextWriterStackEntry:
! 4247: * @lk: the xmlLinkPtr
! 4248: *
! 4249: * Free callback for the xmlList.
! 4250: */
! 4251: static void
! 4252: xmlFreeTextWriterStackEntry(xmlLinkPtr lk)
! 4253: {
! 4254: xmlTextWriterStackEntry *p;
! 4255:
! 4256: p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);
! 4257: if (p == 0)
! 4258: return;
! 4259:
! 4260: if (p->name != 0)
! 4261: xmlFree(p->name);
! 4262: xmlFree(p);
! 4263: }
! 4264:
! 4265: /**
! 4266: * xmlCmpTextWriterStackEntry:
! 4267: * @data0: the first data
! 4268: * @data1: the second data
! 4269: *
! 4270: * Compare callback for the xmlList.
! 4271: *
! 4272: * Returns -1, 0, 1
! 4273: */
! 4274: static int
! 4275: xmlCmpTextWriterStackEntry(const void *data0, const void *data1)
! 4276: {
! 4277: xmlTextWriterStackEntry *p0;
! 4278: xmlTextWriterStackEntry *p1;
! 4279:
! 4280: if (data0 == data1)
! 4281: return 0;
! 4282:
! 4283: if (data0 == 0)
! 4284: return -1;
! 4285:
! 4286: if (data1 == 0)
! 4287: return 1;
! 4288:
! 4289: p0 = (xmlTextWriterStackEntry *) data0;
! 4290: p1 = (xmlTextWriterStackEntry *) data1;
! 4291:
! 4292: return xmlStrcmp(p0->name, p1->name);
! 4293: }
! 4294:
! 4295: /**
! 4296: * misc
! 4297: */
! 4298:
! 4299: /**
! 4300: * xmlTextWriterOutputNSDecl:
! 4301: * @writer: the xmlTextWriterPtr
! 4302: *
! 4303: * Output the current namespace declarations.
! 4304: */
! 4305: static int
! 4306: xmlTextWriterOutputNSDecl(xmlTextWriterPtr writer)
! 4307: {
! 4308: xmlLinkPtr lk;
! 4309: xmlTextWriterNsStackEntry *np;
! 4310: int count;
! 4311: int sum;
! 4312:
! 4313: sum = 0;
! 4314: while (!xmlListEmpty(writer->nsstack)) {
! 4315: xmlChar *namespaceURI = NULL;
! 4316: xmlChar *prefix = NULL;
! 4317:
! 4318: lk = xmlListFront(writer->nsstack);
! 4319: np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
! 4320:
! 4321: if (np != 0) {
! 4322: namespaceURI = xmlStrdup(np->uri);
! 4323: prefix = xmlStrdup(np->prefix);
! 4324: }
! 4325:
! 4326: xmlListPopFront(writer->nsstack);
! 4327:
! 4328: if (np != 0) {
! 4329: count = xmlTextWriterWriteAttribute(writer, prefix, namespaceURI);
! 4330: xmlFree(namespaceURI);
! 4331: xmlFree(prefix);
! 4332:
! 4333: if (count < 0) {
! 4334: xmlListDelete(writer->nsstack);
! 4335: writer->nsstack = NULL;
! 4336: return -1;
! 4337: }
! 4338: sum += count;
! 4339: }
! 4340: }
! 4341: return sum;
! 4342: }
! 4343:
! 4344: /**
! 4345: * xmlFreeTextWriterNsStackEntry:
! 4346: * @lk: the xmlLinkPtr
! 4347: *
! 4348: * Free callback for the xmlList.
! 4349: */
! 4350: static void
! 4351: xmlFreeTextWriterNsStackEntry(xmlLinkPtr lk)
! 4352: {
! 4353: xmlTextWriterNsStackEntry *p;
! 4354:
! 4355: p = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);
! 4356: if (p == 0)
! 4357: return;
! 4358:
! 4359: if (p->prefix != 0)
! 4360: xmlFree(p->prefix);
! 4361: if (p->uri != 0)
! 4362: xmlFree(p->uri);
! 4363:
! 4364: xmlFree(p);
! 4365: }
! 4366:
! 4367: /**
! 4368: * xmlCmpTextWriterNsStackEntry:
! 4369: * @data0: the first data
! 4370: * @data1: the second data
! 4371: *
! 4372: * Compare callback for the xmlList.
! 4373: *
! 4374: * Returns -1, 0, 1
! 4375: */
! 4376: static int
! 4377: xmlCmpTextWriterNsStackEntry(const void *data0, const void *data1)
! 4378: {
! 4379: xmlTextWriterNsStackEntry *p0;
! 4380: xmlTextWriterNsStackEntry *p1;
! 4381: int rc;
! 4382:
! 4383: if (data0 == data1)
! 4384: return 0;
! 4385:
! 4386: if (data0 == 0)
! 4387: return -1;
! 4388:
! 4389: if (data1 == 0)
! 4390: return 1;
! 4391:
! 4392: p0 = (xmlTextWriterNsStackEntry *) data0;
! 4393: p1 = (xmlTextWriterNsStackEntry *) data1;
! 4394:
! 4395: rc = xmlStrcmp(p0->prefix, p1->prefix);
! 4396:
! 4397: if ((rc != 0) || (p0->elem != p1->elem))
! 4398: rc = -1;
! 4399:
! 4400: return rc;
! 4401: }
! 4402:
! 4403: /**
! 4404: * xmlTextWriterWriteDocCallback:
! 4405: * @context: the xmlBufferPtr
! 4406: * @str: the data to write
! 4407: * @len: the length of the data
! 4408: *
! 4409: * Write callback for the xmlOutputBuffer with target xmlBuffer
! 4410: *
! 4411: * Returns -1, 0, 1
! 4412: */
! 4413: static int
! 4414: xmlTextWriterWriteDocCallback(void *context, const xmlChar * str, int len)
! 4415: {
! 4416: xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
! 4417: int rc;
! 4418:
! 4419: if ((rc = xmlParseChunk(ctxt, (const char *) str, len, 0)) != 0) {
! 4420: xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
! 4421: "xmlTextWriterWriteDocCallback : XML error %d !\n",
! 4422: rc);
! 4423: return -1;
! 4424: }
! 4425:
! 4426: return len;
! 4427: }
! 4428:
! 4429: /**
! 4430: * xmlTextWriterCloseDocCallback:
! 4431: * @context: the xmlBufferPtr
! 4432: *
! 4433: * Close callback for the xmlOutputBuffer with target xmlBuffer
! 4434: *
! 4435: * Returns -1, 0, 1
! 4436: */
! 4437: static int
! 4438: xmlTextWriterCloseDocCallback(void *context)
! 4439: {
! 4440: xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) context;
! 4441: int rc;
! 4442:
! 4443: if ((rc = xmlParseChunk(ctxt, NULL, 0, 1)) != 0) {
! 4444: xmlWriterErrMsgInt(NULL, XML_ERR_INTERNAL_ERROR,
! 4445: "xmlTextWriterWriteDocCallback : XML error %d !\n",
! 4446: rc);
! 4447: return -1;
! 4448: }
! 4449:
! 4450: return 0;
! 4451: }
! 4452:
! 4453: /**
! 4454: * xmlTextWriterVSprintf:
! 4455: * @format: see printf
! 4456: * @argptr: pointer to the first member of the variable argument list.
! 4457: *
! 4458: * Utility function for formatted output
! 4459: *
! 4460: * Returns a new xmlChar buffer with the data or NULL on error. This buffer must be freed.
! 4461: */
! 4462: static xmlChar *
! 4463: xmlTextWriterVSprintf(const char *format, va_list argptr)
! 4464: {
! 4465: int size;
! 4466: int count;
! 4467: xmlChar *buf;
! 4468: va_list locarg;
! 4469:
! 4470: size = BUFSIZ;
! 4471: buf = (xmlChar *) xmlMalloc(size);
! 4472: if (buf == NULL) {
! 4473: xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
! 4474: "xmlTextWriterVSprintf : out of memory!\n");
! 4475: return NULL;
! 4476: }
! 4477:
! 4478: VA_COPY(locarg, argptr);
! 4479: while (((count = vsnprintf((char *) buf, size, format, locarg)) < 0)
! 4480: || (count == size - 1) || (count == size) || (count > size)) {
! 4481: va_end(locarg);
! 4482: xmlFree(buf);
! 4483: size += BUFSIZ;
! 4484: buf = (xmlChar *) xmlMalloc(size);
! 4485: if (buf == NULL) {
! 4486: xmlWriterErrMsg(NULL, XML_ERR_NO_MEMORY,
! 4487: "xmlTextWriterVSprintf : out of memory!\n");
! 4488: return NULL;
! 4489: }
! 4490: VA_COPY(locarg, argptr);
! 4491: }
! 4492: va_end(locarg);
! 4493:
! 4494: return buf;
! 4495: }
! 4496:
! 4497: /**
! 4498: * xmlTextWriterStartDocumentCallback:
! 4499: * @ctx: the user data (XML parser context)
! 4500: *
! 4501: * called at the start of document processing.
! 4502: */
! 4503: static void
! 4504: xmlTextWriterStartDocumentCallback(void *ctx)
! 4505: {
! 4506: xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
! 4507: xmlDocPtr doc;
! 4508:
! 4509: if (ctxt->html) {
! 4510: #ifdef LIBXML_HTML_ENABLED
! 4511: if (ctxt->myDoc == NULL)
! 4512: ctxt->myDoc = htmlNewDocNoDtD(NULL, NULL);
! 4513: if (ctxt->myDoc == NULL) {
! 4514: if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
! 4515: ctxt->sax->error(ctxt->userData,
! 4516: "SAX.startDocument(): out of memory\n");
! 4517: ctxt->errNo = XML_ERR_NO_MEMORY;
! 4518: ctxt->instate = XML_PARSER_EOF;
! 4519: ctxt->disableSAX = 1;
! 4520: return;
! 4521: }
! 4522: #else
! 4523: xmlWriterErrMsg(NULL, XML_ERR_INTERNAL_ERROR,
! 4524: "libxml2 built without HTML support\n");
! 4525: ctxt->errNo = XML_ERR_INTERNAL_ERROR;
! 4526: ctxt->instate = XML_PARSER_EOF;
! 4527: ctxt->disableSAX = 1;
! 4528: return;
! 4529: #endif
! 4530: } else {
! 4531: doc = ctxt->myDoc;
! 4532: if (doc == NULL)
! 4533: doc = ctxt->myDoc = xmlNewDoc(ctxt->version);
! 4534: if (doc != NULL) {
! 4535: if (doc->children == NULL) {
! 4536: if (ctxt->encoding != NULL)
! 4537: doc->encoding = xmlStrdup(ctxt->encoding);
! 4538: else
! 4539: doc->encoding = NULL;
! 4540: doc->standalone = ctxt->standalone;
! 4541: }
! 4542: } else {
! 4543: if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
! 4544: ctxt->sax->error(ctxt->userData,
! 4545: "SAX.startDocument(): out of memory\n");
! 4546: ctxt->errNo = XML_ERR_NO_MEMORY;
! 4547: ctxt->instate = XML_PARSER_EOF;
! 4548: ctxt->disableSAX = 1;
! 4549: return;
! 4550: }
! 4551: }
! 4552: if ((ctxt->myDoc != NULL) && (ctxt->myDoc->URL == NULL) &&
! 4553: (ctxt->input != NULL) && (ctxt->input->filename != NULL)) {
! 4554: ctxt->myDoc->URL =
! 4555: xmlCanonicPath((const xmlChar *) ctxt->input->filename);
! 4556: if (ctxt->myDoc->URL == NULL)
! 4557: ctxt->myDoc->URL =
! 4558: xmlStrdup((const xmlChar *) ctxt->input->filename);
! 4559: }
! 4560: }
! 4561:
! 4562: /**
! 4563: * xmlTextWriterSetIndent:
! 4564: * @writer: the xmlTextWriterPtr
! 4565: * @indent: do indentation?
! 4566: *
! 4567: * Set indentation output. indent = 0 do not indentation. indent > 0 do indentation.
! 4568: *
! 4569: * Returns -1 on error or 0 otherwise.
! 4570: */
! 4571: int
! 4572: xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent)
! 4573: {
! 4574: if ((writer == NULL) || (indent < 0))
! 4575: return -1;
! 4576:
! 4577: writer->indent = indent;
! 4578: writer->doindent = 1;
! 4579:
! 4580: return 0;
! 4581: }
! 4582:
! 4583: /**
! 4584: * xmlTextWriterSetIndentString:
! 4585: * @writer: the xmlTextWriterPtr
! 4586: * @str: the xmlChar string
! 4587: *
! 4588: * Set string indentation.
! 4589: *
! 4590: * Returns -1 on error or 0 otherwise.
! 4591: */
! 4592: int
! 4593: xmlTextWriterSetIndentString(xmlTextWriterPtr writer, const xmlChar * str)
! 4594: {
! 4595: if ((writer == NULL) || (!str))
! 4596: return -1;
! 4597:
! 4598: if (writer->ichar != NULL)
! 4599: xmlFree(writer->ichar);
! 4600: writer->ichar = xmlStrdup(str);
! 4601:
! 4602: if (!writer->ichar)
! 4603: return -1;
! 4604: else
! 4605: return 0;
! 4606: }
! 4607:
! 4608: /**
! 4609: * xmlTextWriterWriteIndent:
! 4610: * @writer: the xmlTextWriterPtr
! 4611: *
! 4612: * Write indent string.
! 4613: *
! 4614: * Returns -1 on error or the number of strings written.
! 4615: */
! 4616: static int
! 4617: xmlTextWriterWriteIndent(xmlTextWriterPtr writer)
! 4618: {
! 4619: int lksize;
! 4620: int i;
! 4621: int ret;
! 4622:
! 4623: lksize = xmlListSize(writer->nodes);
! 4624: if (lksize < 1)
! 4625: return (-1); /* list is empty */
! 4626: for (i = 0; i < (lksize - 1); i++) {
! 4627: ret = xmlOutputBufferWriteString(writer->out,
! 4628: (const char *) writer->ichar);
! 4629: if (ret == -1)
! 4630: return (-1);
! 4631: }
! 4632:
! 4633: return (lksize - 1);
! 4634: }
! 4635:
! 4636: /**
! 4637: * xmlTextWriterHandleStateDependencies:
! 4638: * @writer: the xmlTextWriterPtr
! 4639: * @p: the xmlTextWriterStackEntry
! 4640: *
! 4641: * Write state dependent strings.
! 4642: *
! 4643: * Returns -1 on error or the number of characters written.
! 4644: */
! 4645: static int
! 4646: xmlTextWriterHandleStateDependencies(xmlTextWriterPtr writer,
! 4647: xmlTextWriterStackEntry * p)
! 4648: {
! 4649: int count;
! 4650: int sum;
! 4651: char extra[3];
! 4652:
! 4653: if (writer == NULL)
! 4654: return -1;
! 4655:
! 4656: if (p == NULL)
! 4657: return 0;
! 4658:
! 4659: sum = 0;
! 4660: extra[0] = extra[1] = extra[2] = '\0';
! 4661: if (p != 0) {
! 4662: sum = 0;
! 4663: switch (p->state) {
! 4664: case XML_TEXTWRITER_NAME:
! 4665: /* Output namespace declarations */
! 4666: count = xmlTextWriterOutputNSDecl(writer);
! 4667: if (count < 0)
! 4668: return -1;
! 4669: sum += count;
! 4670: extra[0] = '>';
! 4671: p->state = XML_TEXTWRITER_TEXT;
! 4672: break;
! 4673: case XML_TEXTWRITER_PI:
! 4674: extra[0] = ' ';
! 4675: p->state = XML_TEXTWRITER_PI_TEXT;
! 4676: break;
! 4677: case XML_TEXTWRITER_DTD:
! 4678: extra[0] = ' ';
! 4679: extra[1] = '[';
! 4680: p->state = XML_TEXTWRITER_DTD_TEXT;
! 4681: break;
! 4682: case XML_TEXTWRITER_DTD_ELEM:
! 4683: extra[0] = ' ';
! 4684: p->state = XML_TEXTWRITER_DTD_ELEM_TEXT;
! 4685: break;
! 4686: case XML_TEXTWRITER_DTD_ATTL:
! 4687: extra[0] = ' ';
! 4688: p->state = XML_TEXTWRITER_DTD_ATTL_TEXT;
! 4689: break;
! 4690: case XML_TEXTWRITER_DTD_ENTY:
! 4691: case XML_TEXTWRITER_DTD_PENT:
! 4692: extra[0] = ' ';
! 4693: extra[1] = writer->qchar;
! 4694: p->state = XML_TEXTWRITER_DTD_ENTY_TEXT;
! 4695: break;
! 4696: default:
! 4697: break;
! 4698: }
! 4699: }
! 4700:
! 4701: if (*extra != '\0') {
! 4702: count = xmlOutputBufferWriteString(writer->out, extra);
! 4703: if (count < 0)
! 4704: return -1;
! 4705: sum += count;
! 4706: }
! 4707:
! 4708: return sum;
! 4709: }
! 4710:
! 4711: #define bottom_xmlwriter
! 4712: #include "elfgcchack.h"
! 4713: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>