38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlsave.c: Implemetation of the document serializer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * See Copyright for the status of this software.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * daniel@veillard.com
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define IN_LIBXML
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include "libxml.h"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <string.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/xmlmemory.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/parserInternals.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/tree.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/xmlsave.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define MAX_INDENT 60
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include <libxml/HTMLtree.h>
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * XHTML detection *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define XHTML_STRICT_PUBLIC_ID BAD_CAST \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "-//W3C//DTD XHTML 1.0 Strict//EN"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define XHTML_STRICT_SYSTEM_ID BAD_CAST \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define XHTML_FRAME_PUBLIC_ID BAD_CAST \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "-//W3C//DTD XHTML 1.0 Frameset//EN"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define XHTML_FRAME_SYSTEM_ID BAD_CAST \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define XHTML_TRANS_PUBLIC_ID BAD_CAST \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "-//W3C//DTD XHTML 1.0 Transitional//EN"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define XHTML_TRANS_SYSTEM_ID BAD_CAST \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define XHTML_NS_NAME BAD_CAST "http://www.w3.org/1999/xhtml"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlIsXHTML:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @systemID: the system identifier
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @publicID: the public identifier
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Try to find if the document correspond to an XHTML DTD
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if true, 0 if not and -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlIsXHTML(const xmlChar *systemID, const xmlChar *publicID) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((systemID == NULL) && (publicID == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (publicID != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(publicID, XHTML_STRICT_PUBLIC_ID)) return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(publicID, XHTML_FRAME_PUBLIC_ID)) return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(publicID, XHTML_TRANS_PUBLIC_ID)) return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (systemID != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(systemID, XHTML_STRICT_SYSTEM_ID)) return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(systemID, XHTML_FRAME_SYSTEM_ID)) return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(systemID, XHTML_TRANS_SYSTEM_ID)) return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_OUTPUT_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define TODO \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext, \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "Unimplemented block at %s:%d\n", \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __FILE__, __LINE__);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstruct _xmlSaveCtxt {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *_private;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int type;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int fd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const xmlChar *filename;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const xmlChar *encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr handler;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocPtr doc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int options;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int level;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync char indent[MAX_INDENT + 1]; /* array for indenting output */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int indent_nr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int indent_size;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingOutputFunc escape; /* used for element content */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingOutputFunc escapeAttr;/* used for attribute content */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync};
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Output error handlers *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveErrMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an out of memory condition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveErrMemory(const char *extra)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlSimpleError(XML_FROM_OUTPUT, XML_ERR_NO_MEMORY, NULL, NULL, extra);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveErr:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @code: the error number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the location of the error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @extra: extra informations
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Handle an out of memory condition
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveErr(int code, xmlNodePtr node, const char *extra)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *msg = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch(code) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case XML_SAVE_NOT_UTF8:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync msg = "string is not in UTF-8\n";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case XML_SAVE_CHAR_INVALID:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync msg = "invalid character value\n";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case XML_SAVE_UNKNOWN_ENCODING:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync msg = "unknown encoding %s\n";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case XML_SAVE_NO_DOCTYPE:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync msg = "document has no DOCTYPE\n";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync default:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync msg = "unexpected error number\n";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync __xmlSimpleError(XML_FROM_OUTPUT, code, node, msg, extra);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Special escaping routines *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic unsigned char *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSerializeHexCharRef(unsigned char *out, int val) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned char *ptr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '&';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '#';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'x';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (val < 0x10) ptr = out;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (val < 0x100) ptr = out + 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (val < 0x1000) ptr = out + 2;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (val < 0x10000) ptr = out + 3;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if (val < 0x100000) ptr = out + 4;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else ptr = out + 5;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out = ptr + 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (val > 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (val & 0xF) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 0: *ptr-- = '0'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 1: *ptr-- = '1'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 2: *ptr-- = '2'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 3: *ptr-- = '3'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 4: *ptr-- = '4'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 5: *ptr-- = '5'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 6: *ptr-- = '6'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 7: *ptr-- = '7'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 8: *ptr-- = '8'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 9: *ptr-- = '9'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 0xA: *ptr-- = 'A'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 0xB: *ptr-- = 'B'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 0xC: *ptr-- = 'C'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 0xD: *ptr-- = 'D'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 0xE: *ptr-- = 'E'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 0xF: *ptr-- = 'F'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync default: *ptr-- = '0'; break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val >>= 4;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = ';';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(out);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlEscapeEntities:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out: a pointer to an array of bytes to store the result
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @outlen: the length of @out
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @in: a pointer to an array of unescaped UTF-8 bytes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @inlen: the length of @in
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Take a block of UTF-8 chars in and escape them. Used when there is no
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * encoding specified.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if success, or -1 otherwise
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The value of @inlen after return is the number of octets consumed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * if the return value is positive, else unpredictable.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The value of @outlen after return is the number of octets consumed.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlEscapeEntities(unsigned char* out, int *outlen,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const xmlChar* in, int *inlen) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned char* outstart = out;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const unsigned char* base = in;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned char* outend = out + *outlen;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const unsigned char* inend;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int val;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync inend = in + (*inlen);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while ((in < inend) && (out < outend)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*in == '<') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outend - out < 4) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '&';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'l';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 't';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = ';';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*in == '>') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outend - out < 4) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '&';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'g';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 't';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = ';';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*in == '&') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outend - out < 5) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = '&';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'a';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'm';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = 'p';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = ';';
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (((*in >= 0x20) && (*in < 0x80)) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (*in == '\n') || (*in == '\t')) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * default case, just copy !
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *out++ = *in++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*in >= 0x80) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * We assume we have UTF-8 input.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outend - out < 10) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*in < 0xC0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErr(XML_SAVE_NOT_UTF8, NULL, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto error;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*in < 0xE0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (inend - in < 2) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val = (in[0]) & 0x1F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (in[1]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in += 2;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*in < 0xF0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (inend - in < 3) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val = (in[0]) & 0x0F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (in[1]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (in[2]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in += 3;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*in < 0xF8) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (inend - in < 4) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val = (in[0]) & 0x07;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (in[1]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (in[2]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (in[3]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in += 4;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErr(XML_SAVE_CHAR_INVALID, NULL, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto error;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (!IS_CHAR(val)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErr(XML_SAVE_CHAR_INVALID, NULL, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto error;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * We could do multiple things here. Just save as a char ref
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out = xmlSerializeHexCharRef(out, val);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (IS_BYTE_CHAR(*in)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outend - out < 6) break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out = xmlSerializeHexCharRef(out, *in++);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlEscapeEntities : char out of range\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync in++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync goto error;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *outlen = out - outstart;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *inlen = in - base;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncerror:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *outlen = out - outstart;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *inlen = in - base;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Allocation and deallocation *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveCtxtInit:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: the saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Initialize a saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveCtxtInit(xmlSaveCtxtPtr ctxt)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int i;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->encoding == NULL) && (ctxt->escape == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->escape = xmlEscapeEntities;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync len = xmlStrlen((xmlChar *)xmlTreeIndentString);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlTreeIndentString == NULL) || (len == 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(&ctxt->indent[0], 0, MAX_INDENT + 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent_size = len;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent_nr = MAX_INDENT / ctxt->indent_size;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync for (i = 0;i < ctxt->indent_nr;i++)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memcpy(&ctxt->indent[i * ctxt->indent_size], xmlTreeIndentString,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent_size);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent[ctxt->indent_nr * ctxt->indent_size] = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlSaveNoEmptyTags) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->options |= XML_SAVE_NO_EMPTY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlFreeSaveCtxt:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Free a saving context, destroying the ouptut in any remaining buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlFreeSaveCtxt(xmlSaveCtxtPtr ctxt)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->encoding != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree((char *) ctxt->encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->buf != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferClose(ctxt->buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNewSaveCtxt:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a new saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the new structure or NULL in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic xmlSaveCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNewSaveCtxt(const char *encoding, int options)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = (xmlSaveCtxtPtr) xmlMalloc(sizeof(xmlSaveCtxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErrMemory("creating saving context");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( NULL );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(ret, 0, sizeof(xmlSaveCtxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (encoding != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->handler = xmlFindCharEncodingHandler(encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->handler == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeSaveCtxt(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->encoding = xmlStrdup((const xmlChar *)encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->escape = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtInit(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Use the options
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Re-check this option as it may already have been set */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ret->options & XML_SAVE_NO_EMPTY) && ! (options & XML_SAVE_NO_EMPTY)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync options |= XML_SAVE_NO_EMPTY;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->options = options;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (options & XML_SAVE_FORMAT)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->format = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dumping XML tree content to a simple buffer *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlAttrSerializeContent:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @attr: the attribute pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Serialize the attribute in the buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlAttrSerializeContent(xmlOutputBufferPtr buf, xmlAttrPtr attr)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr children;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync children = attr->children;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (children != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (children->type) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case XML_TEXT_NODE:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrSerializeTxtContent(buf->buffer, attr->doc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync attr, children->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case XML_ENTITY_REF_NODE:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf->buffer, BAD_CAST "&", 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf->buffer, children->name,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrlen(children->name));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf->buffer, BAD_CAST ";", 1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync default:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* should not happen unless we have a badly built tree */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync children = children->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dumping XML tree content to an I/O output buffer *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTML_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void xmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void xmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int xmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNsDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: a namespace
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump a local Namespace definition.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Should be called in the context of attributes dumps.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNsDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur == NULL) || (buf == NULL)) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_LOCAL_NAMESPACE) && (cur->href != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(cur->prefix, BAD_CAST "xml"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Within the context of an element attributes */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->prefix != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 7, " xmlns:");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 6, " xmlns");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "=");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWriteQuotedString(buf->buffer, cur->href);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNsListDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the first namespace
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump a list of local Namespace definitions.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Should be called in the context of attributes dumps.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (cur != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNsDumpOutput(buf, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur = cur->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlDtdDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @dtd: the pointer to the DTD
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump the XML document DTD, if any.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDtdDumpOutput(xmlSaveCtxtPtr ctxt, xmlDtdPtr dtd) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int format, level;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocPtr doc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (dtd == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt == NULL) || (ctxt->buf == NULL))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = ctxt->buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 10, "<!DOCTYPE ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)dtd->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (dtd->ExternalID != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 8, " PUBLIC ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWriteQuotedString(buf->buffer, dtd->ExternalID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, " ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWriteQuotedString(buf->buffer, dtd->SystemID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (dtd->SystemID != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 8, " SYSTEM ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWriteQuotedString(buf->buffer, dtd->SystemID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((dtd->entities == NULL) && (dtd->elements == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (dtd->attributes == NULL) && (dtd->notations == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (dtd->pentities == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ">");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, " [\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump the notations first they are not in the DTD children list
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Do this only on a standalone DTD or on the internal subset though.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((dtd->notations != NULL) && ((dtd->doc == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (dtd->doc->intSubset == dtd))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDumpNotationTable(buf->buffer, (xmlNotationTablePtr) dtd->notations);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync format = ctxt->format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync level = ctxt->level;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync doc = ctxt->doc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->level = -1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->doc = dtd->doc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodeListDumpOutput(ctxt, dtd->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->level = level;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->doc = doc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "]>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlAttrDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the attribute pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML attribute
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlAttrDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = ctxt->buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buf == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, " ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ":");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "=\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrSerializeContent(buf, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlAttrListDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the first attribute pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: an optional encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump a list of XML attributes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlAttrListDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (cur != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrDumpOutput(ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur = cur->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNodeListDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the first node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML node list, recursive behaviour, children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = ctxt->buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (cur != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->format) && (xmlIndentTreeOutput) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((cur->type == XML_ELEMENT_NODE) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->type == XML_COMMENT_NODE) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->type == XML_PI_NODE)))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, ctxt->indent_size *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->level > ctxt->indent_nr ?
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent_nr : ctxt->level),
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodeDumpOutputInternal(ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur = cur->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNodeDumpOutputInternal:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML node, recursive behaviour, children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNodeDumpOutputInternal(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr tmp;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *start, *end;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = ctxt->buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_XINCLUDE_START)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_XINCLUDE_END)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_DOCUMENT_NODE) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->type == XML_HTML_DOCUMENT_NODE)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocContentDumpOutput(ctxt, (xmlDocPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_DTD_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDtdDumpOutput(ctxt, (xmlDtdPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_DOCUMENT_FRAG_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodeListDumpOutput(ctxt, cur->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ELEMENT_DECL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDumpElementDecl(buf->buffer, (xmlElementPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ATTRIBUTE_DECL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDumpAttributeDecl(buf->buffer, (xmlAttributePtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ENTITY_DECL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDumpEntityDecl(buf->buffer, (xmlEntityPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_TEXT_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->content != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->name != xmlStringTextNoenc) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Disable escaping, needed for XSLT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *) cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_PI_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->content != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "<?");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->content != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, " ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "?>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "<?");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "?>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_COMMENT_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->content != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 4, "<!--");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, "-->");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ENTITY_REF_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "&");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ";");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_CDATA_SECTION_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->content == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 12, "<![CDATA[]]>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync start = end = cur->content;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*end != '\0') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((*end == ']') && (*(end + 1) == ']') &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (*(end + 2) == '>')) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync end = end + 2;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 9, "<![CDATA[");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, end - start, (const char *)start);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, "]]>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync start = end;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync end++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (start != end) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 9, "<![CDATA[");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)start);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, "]]>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ATTRIBUTE_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrDumpOutput(ctxt, (xmlAttrPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_NAMESPACE_DECL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNsDumpOutput(buf, (xmlNsPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync format = ctxt->format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (format == 1) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = cur->children;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (tmp != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((tmp->type == XML_TEXT_NODE) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (tmp->type == XML_CDATA_SECTION_NODE) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (tmp->type == XML_ENTITY_REF_NODE)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = tmp->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "<");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ":");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->nsDef)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNsListDumpOutput(buf, cur->nsDef);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->properties != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrListDumpOutput(ctxt, cur->properties);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (((cur->type == XML_ELEMENT_NODE) || (cur->content == NULL)) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->children == NULL) && ((ctxt->options & XML_SAVE_NO_EMPTY) == 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "/>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ">");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->children != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->format) xmlOutputBufferWrite(buf, 1, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->level >= 0) ctxt->level++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodeListDumpOutput(ctxt, cur->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->level > 0) ctxt->level--;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlIndentTreeOutput) && (ctxt->format))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, ctxt->indent_size *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->level > ctxt->indent_nr ?
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent_nr : ctxt->level),
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "</");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ":");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ">");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlDocContentDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDocContentDumpOutput(xmlSaveCtxtPtr ctxt, xmlDocPtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTML_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDtdPtr dtd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int is_xhtml = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const xmlChar *oldenc = cur->encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const xmlChar *oldctxtenc = ctxt->encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const xmlChar *encoding = ctxt->encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingOutputFunc oldescape = ctxt->escape;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingOutputFunc oldescapeAttr = ctxt->escapeAttr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf = ctxt->buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncoding enc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInitParser();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->encoding != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur->encoding = BAD_CAST ctxt->encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (cur->encoding != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = cur->encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (cur->charset != XML_CHAR_ENCODING_UTF8) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = (const xmlChar *)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGetCharEncodingName((xmlCharEncoding) cur->charset);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync enc = xmlParseCharEncoding((const char*) encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((encoding != NULL) && (oldctxtenc == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (buf->encoder == NULL) && (buf->conv == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((ctxt->options & XML_SAVE_NO_DECL) == 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((enc != XML_CHAR_ENCODING_UTF8) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (enc != XML_CHAR_ENCODING_NONE) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (enc != XML_CHAR_ENCODING_ASCII)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * we need to switch to this encoding but just for this document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * since we output the XMLDecl the conversion must be done to not
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * generate not well formed documents.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf->encoder = xmlFindCharEncodingHandler((const char *)encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buf->encoder == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf->conv = xmlBufferCreate();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buf->conv == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncCloseFunc(buf->encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErrMemory("creating encoding buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * initialize the state, e.g. if outputting a BOM
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncOutFunc(buf->encoder, buf->conv, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->escape == xmlEscapeEntities)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->escape = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->escapeAttr == xmlEscapeEntities)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->escapeAttr = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Save the XML declaration
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->options & XML_SAVE_NO_DECL) == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 14, "<?xml version=");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->version != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWriteQuotedString(buf->buffer, cur->version);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 5, "\"1.0\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (encoding != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 10, " encoding=");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferWriteQuotedString(buf->buffer, (xmlChar *) encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (cur->standalone) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 0:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 16, " standalone=\"no\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 1:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 17, " standalone=\"yes\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, "?>\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTML_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->options & XML_SAVE_NO_XHTML) == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync dtd = xmlGetIntSubset(cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (dtd != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (is_xhtml < 0) is_xhtml = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->children != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr child = cur->children;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (child != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->level = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTML_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (is_xhtml)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xhtmlNodeDumpOutput(ctxt, child);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodeDumpOutputInternal(ctxt, child);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync child = child->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->encoding != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur->encoding = oldenc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Restore the state of the saving context at the end of the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((encoding != NULL) && (oldctxtenc == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((ctxt->options & XML_SAVE_NO_DECL) == 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((enc != XML_CHAR_ENCODING_UTF8) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (enc != XML_CHAR_ENCODING_NONE) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (enc != XML_CHAR_ENCODING_ASCII)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferFlush(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncCloseFunc(buf->encoder);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferFree(buf->conv);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf->encoder = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf->conv = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->escape = oldescape;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->escapeAttr = oldescapeAttr;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTML_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Functions specific to XHTML serialization *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xhtmlIsEmpty:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Check if a node is an empty xhtml node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 1 if the node is an empty node, 0 if not and -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic int
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxhtmlIsEmpty(xmlNodePtr node) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (node == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (node->type != XML_ELEMENT_NODE)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((node->ns != NULL) && (!xmlStrEqual(node->ns->href, XHTML_NS_NAME)))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (node->children != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync switch (node->name[0]) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'a':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "area"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'b':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "br"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "base"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "basefont"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'c':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "col"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'f':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "frame"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'h':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "hr"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'i':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "img"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "input"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "isindex"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'l':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "link"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'm':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "meta"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync case 'p':
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(node->name, BAD_CAST "param"))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xhtmlAttrListDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the first attribute pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump a list of XML attributes
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxhtmlAttrListDumpOutput(xmlSaveCtxtPtr ctxt, xmlAttrPtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrPtr xml_lang = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrPtr lang = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrPtr name = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrPtr id = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr parent;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = ctxt->buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync parent = cur->parent;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (cur != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "id")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync id = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "name")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync name = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns == NULL) && (xmlStrEqual(cur->name, BAD_CAST "lang")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync lang = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (xmlStrEqual(cur->name, BAD_CAST "lang")) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(cur->ns->prefix, BAD_CAST "xml")))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xml_lang = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else if ((cur->ns == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((cur->children == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->children->content == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->children->content[0] == 0)) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (htmlIsBooleanAttr(cur->name))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->children != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeNode(cur->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur->children = xmlNewText(cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->children != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur->children->parent = (xmlNodePtr) cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrDumpOutput(ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur = cur->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * C.8
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((name != NULL) && (id == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((parent != NULL) && (parent->name != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((xmlStrEqual(parent->name, BAD_CAST "a")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(parent->name, BAD_CAST "p")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(parent->name, BAD_CAST "div")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(parent->name, BAD_CAST "img")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(parent->name, BAD_CAST "map")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(parent->name, BAD_CAST "applet")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(parent->name, BAD_CAST "form")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(parent->name, BAD_CAST "frame")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(parent->name, BAD_CAST "iframe")))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 5, " id=\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrSerializeContent(buf, name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * C.7.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((lang != NULL) && (xml_lang == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 11, " xml:lang=\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrSerializeContent(buf, lang);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xml_lang != NULL) && (lang == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 7, " lang=\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrSerializeContent(buf, xml_lang);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xhtmlNodeListDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the XHTML document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the first node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @level: the imbrication level for indenting
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: is formatting allowed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: an optional encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML node list, recursive behaviour, children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or xmlKeepBlanksDefault(0) was called
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxhtmlNodeListDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = ctxt->buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (cur != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt->format) && (xmlIndentTreeOutput) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->type == XML_ELEMENT_NODE))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, ctxt->indent_size *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->level > ctxt->indent_nr ?
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent_nr : ctxt->level),
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xhtmlNodeDumpOutput(ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur = cur->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xhtmlNodeDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the XHTML document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @level: the imbrication level for indenting
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: is formatting allowed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: an optional encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XHTML node, recursive behaviour, children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncstatic void
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxhtmlNodeDumpOutput(xmlSaveCtxtPtr ctxt, xmlNodePtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int format, addmeta = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr tmp;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *start, *end;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_DOCUMENT_NODE) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->type == XML_HTML_DOCUMENT_NODE)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocContentDumpOutput(ctxt, (xmlDocPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_XINCLUDE_START)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_XINCLUDE_END)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_DTD_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDtdDumpOutput(ctxt, (xmlDtdPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_DOCUMENT_FRAG_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xhtmlNodeListDumpOutput(ctxt, cur->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = ctxt->buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ELEMENT_DECL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDumpElementDecl(buf->buffer, (xmlElementPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ATTRIBUTE_DECL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDumpAttributeDecl(buf->buffer, (xmlAttributePtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ENTITY_DECL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDumpEntityDecl(buf->buffer, (xmlEntityPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_TEXT_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->content != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->name == xmlStringText) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->name != xmlStringTextNoenc)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Disable escaping, needed for XSLT
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *) cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_PI_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->content != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "<?");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->content != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, " ");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "?>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "<?");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "?>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_COMMENT_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->content != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 4, "<!--");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, "-->");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ENTITY_REF_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "&");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ";");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_CDATA_SECTION_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync start = end = cur->content;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*end != '\0') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*end == ']' && *(end + 1) == ']' && *(end + 2) == '>') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync end = end + 2;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 9, "<![CDATA[");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, end - start, (const char *)start);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, "]]>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync start = end;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync end++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (start != end) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 9, "<![CDATA[");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)start);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, "]]>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->type == XML_ATTRIBUTE_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrDumpOutput(ctxt, (xmlAttrPtr) cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync format = ctxt->format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (format == 1) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = cur->children;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (tmp != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((tmp->type == XML_TEXT_NODE) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (tmp->type == XML_ENTITY_REF_NODE)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync format = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = tmp->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "<");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ":");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->nsDef)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNsListDumpOutput(buf, cur->nsDef);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlStrEqual(cur->name, BAD_CAST "html") &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->ns == NULL) && (cur->nsDef == NULL))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * 3.1.1. Strictly Conforming Documents A.3.1.1 3/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync " xmlns=\"http://www.w3.org/1999/xhtml\"");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->properties != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xhtmlAttrListDumpOutput(ctxt, cur->properties);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_ELEMENT_NODE) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->parent != NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->parent->parent == (xmlNodePtr) cur->doc) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrEqual(cur->name, BAD_CAST"head") &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlStrEqual(cur->parent->name, BAD_CAST"html")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = cur->children;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (tmp != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrEqual(tmp->name, BAD_CAST"meta")) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *httpequiv;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync httpequiv = xmlGetProp(tmp, BAD_CAST"http-equiv");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (httpequiv != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlStrcasecmp(httpequiv, BAD_CAST"Content-Type") == 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(httpequiv);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync break;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(httpequiv);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync tmp = tmp->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (tmp == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync addmeta = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_ELEMENT_NODE) && (cur->children == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (((cur->ns == NULL) || (cur->ns->prefix == NULL)) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((xhtmlIsEmpty(cur) == 1) && (addmeta == 0))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * C.2. Empty Elements
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, " />");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (addmeta == 1) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ">");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlIndentTreeOutput)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, ctxt->indent_size *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->level + 1 > ctxt->indent_nr ?
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent_nr : ctxt->level + 1), ctxt->indent);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->encoding) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)ctxt->encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 5, "UTF-8");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 4, "\" />");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->format)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ">");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * C.3. Element Minimization and Empty Element Content
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "</");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ":");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ">");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ">");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (addmeta == 1) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlIndentTreeOutput)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, ctxt->indent_size *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->level + 1 > ctxt->indent_nr ?
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent_nr : ctxt->level + 1), ctxt->indent);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->encoding) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)ctxt->encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 5, "UTF-8");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 4, "\" />");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type != XML_ELEMENT_NODE) && (cur->content != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteEscape(buf, cur->content, ctxt->escape);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#if 0
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This was removed due to problems with HTML processors.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * See bug #345147.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * 4.8. Script and Style elements
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->type == XML_ELEMENT_NODE) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((xmlStrEqual(cur->name, BAD_CAST "script")) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(cur->name, BAD_CAST "style"))) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((cur->ns == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrEqual(cur->ns->href, XHTML_NS_NAME)))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodePtr child = cur->children;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (child != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (child->type == XML_TEXT_NODE) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlStrchr(child->content, '<') == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrchr(child->content, '&') == NULL) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (xmlStrstr(child->content, BAD_CAST "]]>") == NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* Nothing to escape, so just output as is... */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* FIXME: Should we do something about "--" also? */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int level = ctxt->level;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int indent = ctxt->format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->level = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *) child->content);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* (We cannot use xhtmlNodeDumpOutput() here because
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * we wish to leave '>' unescaped!) */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->level = level;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = indent;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* We must use a CDATA section. Unfortunately,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * this will break CSS and JavaScript when read by
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * a browser in HTML4-compliant mode. :-( */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync start = end = child->content;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*end != '\0') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*end == ']' &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *(end + 1) == ']' &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *(end + 2) == '>') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync end = end + 2;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 9, "<![CDATA[");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, end - start,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)start);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, "]]>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync start = end;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync end++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (start != end) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 9, "<![CDATA[");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, end - start,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (const char *)start);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 3, "]]>");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int level = ctxt->level;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int indent = ctxt->format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->level = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xhtmlNodeDumpOutput(ctxt, child);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->level = level;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = indent;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync child = child->next;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->children != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int indent = ctxt->format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (format) xmlOutputBufferWrite(buf, 1, "\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->level >= 0) ctxt->level++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xhtmlNodeListDumpOutput(ctxt, cur->children);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->level > 0) ctxt->level--;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->format = indent;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((xmlIndentTreeOutput) && (format))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, ctxt->indent_size *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (ctxt->level > ctxt->indent_nr ?
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent_nr : ctxt->level),
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->indent);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 2, "</");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ":");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWriteString(buf, (const char *)cur->name);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferWrite(buf, 1, ">");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Public entry points *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveToFd:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @fd: a file descriptor number
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding name to use or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @options: a set of xmlSaveOptions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a document saving context serializing to a file descriptor
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * with the encoding and the options given.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new serialization context or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveToFd(int fd, const char *encoding, int options)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlNewSaveCtxt(encoding, options);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buf = xmlOutputBufferCreateFd(fd, ret->handler);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->buf == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeSaveCtxt(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveToFilename:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: a file name or an URL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding name to use or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @options: a set of xmlSaveOptions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a document saving context serializing to a filename or possibly
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * to an URL (but this is less reliable) with the encoding and the options
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * given.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new serialization context or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveToFilename(const char *filename, const char *encoding, int options)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int compression = 0; /* TODO handle compression option */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlNewSaveCtxt(encoding, options);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buf = xmlOutputBufferCreateFilename(filename, ret->handler,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->buf == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeSaveCtxt(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveToBuffer:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buffer: a buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding name to use or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @options: a set of xmlSaveOptions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a document saving context serializing to a buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * with the encoding and the options given
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new serialization context or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveToBuffer(xmlBufferPtr buffer, const char *encoding, int options)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr out_buff;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr handler;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlNewSaveCtxt(encoding, options);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (encoding != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync handler = xmlFindCharEncodingHandler(encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (handler == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync handler = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync out_buff = xmlOutputBufferCreateBuffer(buffer, handler);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out_buff == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (handler) xmlCharEncCloseFunc(handler);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buf = out_buff;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveToIO:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @iowrite: an I/O write function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ioclose: an I/O close function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ioctx: an I/O handler
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding name to use or NULL
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @options: a set of xmlSaveOptions
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Create a document saving context serializing to a file descriptor
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * with the encoding and the options given
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns a new serialization context or NULL in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveCtxtPtr
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveToIO(xmlOutputWriteCallback iowrite,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputCloseCallback ioclose,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync void *ioctx, const char *encoding, int options)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtPtr ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlNewSaveCtxt(encoding, options);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret == NULL) return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret->buf = xmlOutputBufferCreateIO(iowrite, ioclose, ioctx, ret->handler);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ret->buf == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeSaveCtxt(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveDoc:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a document saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: a document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Save a full document to a saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: The function is not fully implemented yet as it does not return the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * byte count but 0 instead
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclong
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveDoc(xmlSaveCtxtPtr ctxt, xmlDocPtr doc)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync long ret = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt == NULL) || (doc == NULL)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (xmlDocContentDumpOutput(ctxt, doc) < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveTree:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a document saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @node: the top node of the subtree to save
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Save a subtree starting at the node parameter to a saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * TODO: The function is not fully implemented yet as it does not return the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * byte count but 0 instead
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclong
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveTree(xmlSaveCtxtPtr ctxt, xmlNodePtr node)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync long ret = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((ctxt == NULL) || (node == NULL)) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodeDumpOutputInternal(ctxt, node);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveFlush:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a document saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Flush a document saving context, i.e. make sure that all bytes have
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * been output.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveFlush(xmlSaveCtxtPtr ctxt)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt == NULL) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt->buf == NULL) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlOutputBufferFlush(ctxt->buf));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveClose:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a document saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Close a document saving context, i.e. make sure that all bytes have
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * been output and free the associated data.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of byte written or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveClose(xmlSaveCtxtPtr ctxt)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt == NULL) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlSaveFlush(ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFreeSaveCtxt(ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveSetEscape:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a document saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @escape: the escaping function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Set a custom escaping function to be used for text in element content
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if successful or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveSetEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt == NULL) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->escape = escape;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveSetAttrEscape:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @ctxt: a document saving context
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @escape: the escaping function
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Set a custom escaping function to be used for text in attribute content
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns 0 if successful or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveSetAttrEscape(xmlSaveCtxtPtr ctxt, xmlCharEncodingOutputFunc escape)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (ctxt == NULL) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt->escapeAttr = escape;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Public entry points based on buffers *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlAttrSerializeTxtContent:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @attr: the attribute node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @string: the text content
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Serialize text attribute values to an xml simple buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlAttrSerializeTxtContent(xmlBufferPtr buf, xmlDocPtr doc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlAttrPtr attr, const xmlChar * string)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlChar *base, *cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (string == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur = (xmlChar *) string;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync while (*cur != 0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*cur == '\n') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base != cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, base, cur - base);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, BAD_CAST "&#10;", 5);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*cur == '\r') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base != cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, base, cur - base);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, BAD_CAST "&#13;", 5);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*cur == '\t') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base != cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, base, cur - base);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, BAD_CAST "&#9;", 4);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*cur == '"') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base != cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, base, cur - base);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, BAD_CAST "&quot;", 6);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*cur == '<') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base != cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, base, cur - base);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, BAD_CAST "&lt;", 4);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*cur == '>') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base != cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, base, cur - base);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, BAD_CAST "&gt;", 4);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*cur == '&') {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base != cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, base, cur - base);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, BAD_CAST "&amp;", 5);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if ((*cur >= 0x80) && ((doc == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (doc->encoding == NULL))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * We assume we have UTF-8 content.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned char tmp[10];
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int val = 0, l = 1;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base != cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, base, cur - base);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (*cur < 0xC0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErr(XML_SAVE_NOT_UTF8, (xmlNodePtr) attr, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (doc != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSerializeHexCharRef(tmp, *cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, (xmlChar *) tmp, -1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*cur < 0xE0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val = (cur[0]) & 0x1F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (cur[1]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync l = 2;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*cur < 0xF0) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val = (cur[0]) & 0x0F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (cur[1]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (cur[2]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync l = 3;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else if (*cur < 0xF8) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val = (cur[0]) & 0x07;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (cur[1]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (cur[2]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val <<= 6;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync val |= (cur[3]) & 0x3F;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync l = 4;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((l == 1) || (!IS_CHAR(val))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErr(XML_SAVE_CHAR_INVALID, (xmlNodePtr) attr, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (doc != NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSerializeHexCharRef(tmp, *cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, (xmlChar *) tmp, -1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync continue;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * We could do multiple things here. Just save
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * as a char ref
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSerializeHexCharRef(tmp, val);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, (xmlChar *) tmp, -1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur += l;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync base = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur++;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (base != cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlBufferAdd(buf, base, cur - base);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNodeDump:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @level: the imbrication level for indenting
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: is formatting allowed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML node, recursive behaviour,children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or xmlKeepBlanksDefault(0) was called
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written to the buffer or -1 in case of error
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur, int level,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int format)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync unsigned int use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr outbuf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInitParser();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_TREE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlNodeDump : node == NULL\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buf == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_TREE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlNodeDump : buf == NULL\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync outbuf = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outbuf == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErrMemory("creating buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(outbuf, 0, (size_t) sizeof(xmlOutputBuffer));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync outbuf->buffer = buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync outbuf->encoder = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync outbuf->writecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync outbuf->closecallback = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync outbuf->context = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync outbuf->written = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync use = buf->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodeDumpOutput(outbuf, doc, cur, level, format, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree(outbuf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = buf->use - use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlElemDump:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @f: the FILE * for the output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML/HTML node, recursive behaviour, children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlElemDump(FILE * f, xmlDocPtr doc, xmlNodePtr cur)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr outbuf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInitParser();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_TREE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlElemDump : cur == NULL\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_TREE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (doc == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlElemDump : doc == NULL\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync outbuf = xmlOutputBufferCreateFile(f, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (outbuf == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTML_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync htmlNodeDumpOutput(outbuf, doc, cur, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErr(XML_ERR_INTERNAL_ERROR, cur, "HTML support not compiled in\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_HTML_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodeDumpOutput(outbuf, doc, cur, 0, 1, NULL);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferClose(outbuf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/************************************************************************
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Saving functions front-ends *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ************************************************************************/
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlNodeDumpOutput:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: the XML buffer output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the current node
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @level: the imbrication level for indenting
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: is formatting allowed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: an optional encoding string
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML node, recursive behaviour, children are printed too.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or xmlKeepBlanksDefault(0) was called
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int level, int format, const char *encoding)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxt ctxt;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTML_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDtdPtr dtd;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int is_xhtml = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlInitParser();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((buf == NULL) || (cur == NULL)) return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (encoding == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = "UTF-8";
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(&ctxt, 0, sizeof(ctxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.doc = doc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.buf = buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.level = level;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.format = format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.encoding = (const xmlChar *) encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtInit(&ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef LIBXML_HTML_ENABLED
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync dtd = xmlGetIntSubset(doc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (dtd != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync is_xhtml = xmlIsXHTML(dtd->SystemID, dtd->ExternalID);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (is_xhtml < 0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync is_xhtml = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (is_xhtml)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xhtmlNodeDumpOutput(&ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlNodeDumpOutputInternal(&ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlDocDumpFormatMemoryEnc:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out_doc: Document to generate XML text from
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc_txt_ptr: Memory pointer for allocated XML text
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc_txt_len: Length of the generated XML text
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @txt_encoding: Character encoding to use when generating XML text
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump the current DOM tree into memory using the character encoding specified
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * by the caller. Note it is up to the caller of this function to free the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * allocated memory with xmlFree().
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or xmlKeepBlanksDefault(0) was called
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int * doc_txt_len, const char * txt_encoding,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxt ctxt;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int dummy = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr out_buff = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr conv_hdlr = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (doc_txt_len == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync doc_txt_len = &dummy; /* Continue, caller just won't get length */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (doc_txt_ptr == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *doc_txt_len = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *doc_txt_ptr = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *doc_txt_len = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out_doc == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /* No document, no output */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Validate the encoding value, if provided.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * This logic is copied from xmlSaveFileEnc.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (txt_encoding == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync txt_encoding = (const char *) out_doc->encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (txt_encoding != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync conv_hdlr = xmlFindCharEncodingHandler(txt_encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ( conv_hdlr == NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, (xmlNodePtr) out_doc,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync txt_encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((out_buff = xmlAllocOutputBuffer(conv_hdlr)) == NULL ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErrMemory("creating buffer");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(&ctxt, 0, sizeof(ctxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.doc = out_doc;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.buf = out_buff;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.level = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.format = format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.encoding = (const xmlChar *) txt_encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtInit(&ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocContentDumpOutput(&ctxt, out_doc);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferFlush(out_buff);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (out_buff->conv != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *doc_txt_len = out_buff->conv->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *doc_txt_ptr = xmlStrndup(out_buff->conv->content, *doc_txt_len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync } else {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *doc_txt_len = out_buff->buffer->use;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *doc_txt_ptr = xmlStrndup(out_buff->buffer->content, *doc_txt_len);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (void)xmlOutputBufferClose(out_buff);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((*doc_txt_ptr == NULL) && (*doc_txt_len > 0)) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *doc_txt_len = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveErrMemory("creating output");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlDocDumpMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mem: OUT: the memory pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: OUT: the memory length
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document in memory and return the #xmlChar * and it's size
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * in bytes. It's up to the caller to free the memory with xmlFree().
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * The resulting byte array is zero terminated, though the last 0 is not
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * included in the returned size.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocDumpFormatMemoryEnc(cur, mem, size, NULL, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlDocDumpFormatMemory:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @mem: OUT: the memory pointer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @size: OUT: the memory length
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document in memory and return the #xmlChar * and it's size.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * It's up to the caller to free the memory with xmlFree().
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or xmlKeepBlanksDefault(0) was called
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDocDumpFormatMemory(xmlDocPtr cur, xmlChar**mem, int *size, int format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocDumpFormatMemoryEnc(cur, mem, size, NULL, format);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlDocDumpMemoryEnc:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @out_doc: Document to generate XML text from
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc_txt_ptr: Memory pointer for allocated XML text
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @doc_txt_len: Length of the generated XML text
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @txt_encoding: Character encoding to use when generating XML text
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump the current DOM tree into memory using the character encoding specified
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * by the caller. Note it is up to the caller of this function to free the
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * allocated memory with xmlFree().
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncvoid
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDocDumpMemoryEnc(xmlDocPtr out_doc, xmlChar **doc_txt_ptr,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int * doc_txt_len, const char * txt_encoding) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocDumpFormatMemoryEnc(out_doc, doc_txt_ptr, doc_txt_len,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync txt_encoding, 0);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlDocFormatDump:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @f: the FILE*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document to an open FILE.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of bytes written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or xmlKeepBlanksDefault(0) was called
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDocFormatDump(FILE *f, xmlDocPtr cur, int format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxt ctxt;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char * encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr handler = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef DEBUG_TREE
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlGenericError(xmlGenericErrorContext,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "xmlDocDump : document == NULL\n");
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = (const char *) cur->encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (encoding != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync handler = xmlFindCharEncodingHandler(encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (handler == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlFree((char *) cur->encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync cur->encoding = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = xmlOutputBufferCreateFile(f, handler);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buf == NULL) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(&ctxt, 0, sizeof(ctxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.doc = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.buf = buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.level = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.format = format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.encoding = (const xmlChar *) encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtInit(&ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocContentDumpOutput(&ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlOutputBufferClose(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlDocDump:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @f: the FILE*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document to an open FILE.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of bytes written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlDocDump(FILE *f, xmlDocPtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlDocFormatDump (f, cur, 0));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveFileTo:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: an output I/O buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding if any assuming the I/O layer handles the trancoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document to an I/O buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Warning ! This call xmlOutputBufferClose() on buf which is not available
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * after this call.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of bytes written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveFileTo(xmlOutputBufferPtr buf, xmlDocPtr cur, const char *encoding) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxt ctxt;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buf == NULL) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferClose(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(&ctxt, 0, sizeof(ctxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.doc = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.buf = buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.level = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.format = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.encoding = (const xmlChar *) encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtInit(&ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocContentDumpOutput(&ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlOutputBufferClose(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveFormatFileTo:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @buf: an output I/O buffer
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the encoding if any assuming the I/O layer handles the trancoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document to an I/O buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Warning ! This call xmlOutputBufferClose() on buf which is not available
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * after this call.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of bytes written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveFormatFileTo(xmlOutputBufferPtr buf, xmlDocPtr cur,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char *encoding, int format)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync{
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxt ctxt;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buf == NULL) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if ((cur == NULL) ||
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ((cur->type != XML_DOCUMENT_NODE) &&
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync (cur->type != XML_HTML_DOCUMENT_NODE))) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferClose(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(&ctxt, 0, sizeof(ctxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.doc = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.buf = buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.level = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.format = format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.encoding = (const xmlChar *) encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtInit(&ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocContentDumpOutput(&ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlOutputBufferClose(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return (ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveFormatFileEnc:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the filename or URL to output
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document being saved
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the name of the encoding to use or NULL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces be added.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document to a file or an URL.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Returns the number of bytes written or -1 in case of error.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or xmlKeepBlanksDefault(0) was called
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveFormatFileEnc( const char * filename, xmlDocPtr cur,
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync const char * encoding, int format ) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxt ctxt;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlOutputBufferPtr buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlCharEncodingHandlerPtr handler = NULL;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync int ret;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (encoding == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync encoding = (const char *) cur->encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (encoding != NULL) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync handler = xmlFindCharEncodingHandler(encoding);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (handler == NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync }
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#ifdef HAVE_ZLIB_H
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (cur->compression < 0) cur->compression = xmlGetCompressMode();
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync /*
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * save the content to a temp buffer.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync buf = xmlOutputBufferCreateFilename(filename, handler, cur->compression);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if (buf == NULL) return(-1);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync memset(&ctxt, 0, sizeof(ctxt));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.doc = cur;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.buf = buf;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.level = 0;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.format = format;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ctxt.encoding = (const xmlChar *) encoding;
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlSaveCtxtInit(&ctxt);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync xmlDocContentDumpOutput(&ctxt, cur);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ret = xmlOutputBufferClose(buf);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(ret);
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveFileEnc:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the filename (or URL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @encoding: the name of an encoding (or NULL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document, converting it to the given encoding
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of bytes written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveFileEnc(const char *filename, xmlDocPtr cur, const char *encoding) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( xmlSaveFormatFileEnc( filename, cur, encoding, 0 ) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveFormatFile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the filename (or URL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @format: should formatting spaces been added
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document to a file. Will use compression if
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * compiled in and enabled. If @filename is "-" the stdout file is
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * used. If @format is set then the document will be indented on output.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Note that @format = 1 provide node indenting only if xmlIndentTreeOutput = 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * or xmlKeepBlanksDefault(0) was called
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of bytes written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveFormatFile(const char *filename, xmlDocPtr cur, int format) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return ( xmlSaveFormatFileEnc( filename, cur, NULL, format ) );
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync/**
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * xmlSaveFile:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @filename: the filename (or URL)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * @cur: the document
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync *
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * Dump an XML document to a file. Will use compression if
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * compiled in and enabled. If @filename is "-" the stdout file is
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * used.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync * returns: the number of bytes written or -1 in case of failure.
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncint
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncxmlSaveFile(const char *filename, xmlDocPtr cur) {
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return(xmlSaveFormatFileEnc(filename, cur, NULL, 0));
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync}
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#endif /* LIBXML_OUTPUT_ENABLED */
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#define bottom_xmlsave
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#include "elfgcchack.h"