Index: third_party/libxml/src/xmlIO.c |
diff --git a/third_party/libxml/src/xmlIO.c b/third_party/libxml/src/xmlIO.c |
index 29623dc1eaa072f51c84273d9da9042895d7050d..e628ab094c9313d13be0985deca0ab37e408aba4 100644 |
--- a/third_party/libxml/src/xmlIO.c |
+++ b/third_party/libxml/src/xmlIO.c |
@@ -35,6 +35,9 @@ |
#ifdef HAVE_ZLIB_H |
#include <zlib.h> |
#endif |
+#ifdef HAVE_LZMA_H |
+#include <lzma.h> |
+#endif |
#if defined(WIN32) || defined(_WIN32) |
#include <windows.h> |
@@ -85,12 +88,17 @@ |
#include <libxml/parserInternals.h> |
#include <libxml/xmlIO.h> |
#include <libxml/uri.h> |
+#include <libxml/nanohttp.h> |
+#include <libxml/nanoftp.h> |
#include <libxml/xmlerror.h> |
#ifdef LIBXML_CATALOG_ENABLED |
#include <libxml/catalog.h> |
#endif |
#include <libxml/globals.h> |
+#include "buf.h" |
+#include "enc.h" |
+ |
/* #define VERBOSE_FAILURE */ |
/* #define DEBUG_EXTERNAL_ENTITIES */ |
/* #define DEBUG_INPUT */ |
@@ -763,13 +771,21 @@ int |
xmlCheckFilename (const char *path) |
{ |
#ifdef HAVE_STAT |
- struct stat stat_buffer; |
+ struct stat stat_buffer; |
#endif |
- if (path == NULL) |
- return(0); |
+ if (path == NULL) |
+ return(0); |
#ifdef HAVE_STAT |
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) |
+ /* |
+ * On Windows stat and wstat do not work with long pathname, |
+ * which start with '\\?\' |
+ */ |
+ if ((path[0] == '\\') && (path[1] == '\\') && (path[2] == '?') && |
+ (path[3] == '\\') ) |
+ return 1; |
+ |
if (xmlWrapStat(path, &stat_buffer) == -1) |
return 0; |
#else |
@@ -784,7 +800,14 @@ xmlCheckFilename (const char *path) |
return 1; |
} |
-static int |
+/** |
+ * xmlNop: |
+ * |
+ * No Operation function, does nothing, no input |
+ * |
+ * Returns zero |
+ */ |
+int |
xmlNop(void) { |
return(0); |
} |
@@ -871,7 +894,7 @@ xmlFileMatch (const char *filename ATTRIBUTE_UNUSED) { |
*/ |
static void * |
xmlFileOpen_real (const char *filename) { |
- const char *path = NULL; |
+ const char *path = filename; |
FILE *fd; |
if (filename == NULL) |
@@ -901,11 +924,8 @@ xmlFileOpen_real (const char *filename) { |
#else |
path = &filename[5]; |
#endif |
- } else |
- path = filename; |
+ } |
- if (path == NULL) |
- return(NULL); |
if (!xmlCheckFilename(path)) |
return(NULL); |
@@ -985,7 +1005,7 @@ xmlFileOpenW (const char *filename) { |
#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) |
fd = xmlWrapOpen(path, 1); |
#else |
- fd = fopen(path, "wb"); |
+ fd = fopen(path, "wb"); |
#endif /* WIN32 */ |
if (fd == NULL) xmlIOErr(0, path); |
@@ -1143,7 +1163,12 @@ xmlGzfileOpen_real (const char *filename) { |
gzFile fd; |
if (!strcmp(filename, "-")) { |
- fd = gzdopen(dup(0), "rb"); |
+ int duped_fd = dup(fileno(stdin)); |
+ fd = gzdopen(duped_fd, "rb"); |
+ if (fd == Z_NULL && duped_fd >= 0) { |
+ close(duped_fd); /* gzdOpen() does not close on failure */ |
+ } |
+ |
return((void *) fd); |
} |
@@ -1217,7 +1242,12 @@ xmlGzfileOpenW (const char *filename, int compression) { |
snprintf(mode, sizeof(mode), "wb%d", compression); |
if (!strcmp(filename, "-")) { |
- fd = gzdopen(dup(1), mode); |
+ int duped_fd = dup(fileno(stdout)); |
+ fd = gzdopen(duped_fd, "rb"); |
+ if (fd == Z_NULL && duped_fd >= 0) { |
+ close(duped_fd); /* gzdOpen() does not close on failure */ |
+ } |
+ |
return((void *) fd); |
} |
@@ -1304,6 +1334,125 @@ xmlGzfileClose (void * context) { |
} |
#endif /* HAVE_ZLIB_H */ |
+#ifdef HAVE_LZMA_H |
+/************************************************************************ |
+ * * |
+ * I/O for compressed file accesses * |
+ * * |
+ ************************************************************************/ |
+#include "xzlib.h" |
+/** |
+ * xmlXzfileMatch: |
+ * @filename: the URI for matching |
+ * |
+ * input from compressed file test |
+ * |
+ * Returns 1 if matches, 0 otherwise |
+ */ |
+static int |
+xmlXzfileMatch (const char *filename ATTRIBUTE_UNUSED) { |
+ return(1); |
+} |
+ |
+/** |
+ * xmlXzFileOpen_real: |
+ * @filename: the URI for matching |
+ * |
+ * input from compressed file open |
+ * if @filename is " " then the standard input is used |
+ * |
+ * Returns an I/O context or NULL in case of error |
+ */ |
+static void * |
+xmlXzfileOpen_real (const char *filename) { |
+ const char *path = NULL; |
+ xzFile fd; |
+ |
+ if (!strcmp(filename, "-")) { |
+ fd = __libxml2_xzdopen(dup(fileno(stdin)), "rb"); |
+ return((void *) fd); |
+ } |
+ |
+ if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) { |
+ path = &filename[16]; |
+ } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { |
+ path = &filename[7]; |
+ } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) { |
+ /* lots of generators seems to lazy to read RFC 1738 */ |
+ path = &filename[5]; |
+ } else |
+ path = filename; |
+ |
+ if (path == NULL) |
+ return(NULL); |
+ if (!xmlCheckFilename(path)) |
+ return(NULL); |
+ |
+ fd = __libxml2_xzopen(path, "rb"); |
+ return((void *) fd); |
+} |
+ |
+/** |
+ * xmlXzfileOpen: |
+ * @filename: the URI for matching |
+ * |
+ * Wrapper around xmlXzfileOpen_real that try it with an unescaped |
+ * version of @filename, if this fails fallback to @filename |
+ * |
+ * Returns a handler or NULL in case or failure |
+ */ |
+static void * |
+xmlXzfileOpen (const char *filename) { |
+ char *unescaped; |
+ void *retval; |
+ |
+ retval = xmlXzfileOpen_real(filename); |
+ if (retval == NULL) { |
+ unescaped = xmlURIUnescapeString(filename, 0, NULL); |
+ if (unescaped != NULL) { |
+ retval = xmlXzfileOpen_real(unescaped); |
+ } |
+ xmlFree(unescaped); |
+ } |
+ |
+ return retval; |
+} |
+ |
+/** |
+ * xmlXzfileRead: |
+ * @context: the I/O context |
+ * @buffer: where to drop data |
+ * @len: number of bytes to write |
+ * |
+ * Read @len bytes to @buffer from the compressed I/O channel. |
+ * |
+ * Returns the number of bytes written |
+ */ |
+static int |
+xmlXzfileRead (void * context, char * buffer, int len) { |
+ int ret; |
+ |
+ ret = __libxml2_xzread((xzFile) context, &buffer[0], len); |
+ if (ret < 0) xmlIOErr(0, "xzread()"); |
+ return(ret); |
+} |
+ |
+/** |
+ * xmlXzfileClose: |
+ * @context: the I/O context |
+ * |
+ * Close a compressed I/O channel |
+ */ |
+static int |
+xmlXzfileClose (void * context) { |
+ int ret; |
+ |
+ ret = (__libxml2_xzclose((xzFile) context) == LZMA_OK ) ? 0 : -1; |
+ if (ret < 0) xmlIOErr(0, "xzclose()"); |
+ return(ret); |
+} |
+#endif /* HAVE_LZMA_H */ |
+ |
#ifdef LIBXML_HTTP_ENABLED |
/************************************************************************ |
* * |
@@ -1912,8 +2061,8 @@ xmlIOHTTPCloseWrite( void * context, const char * http_mthd ) { |
/* Pull the data out of the memory output buffer */ |
xmlOutputBufferPtr dctxt = ctxt->doc_buff; |
- http_content = (char *)dctxt->buffer->content; |
- content_lgth = dctxt->buffer->use; |
+ http_content = (char *) xmlBufContent(dctxt->buffer); |
+ content_lgth = xmlBufUse(dctxt->buffer); |
} |
if ( http_content == NULL ) { |
@@ -2179,6 +2328,10 @@ xmlRegisterDefaultInputCallbacks(void) { |
xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen, |
xmlGzfileRead, xmlGzfileClose); |
#endif /* HAVE_ZLIB_H */ |
+#ifdef HAVE_LZMA_H |
+ xmlRegisterInputCallbacks(xmlXzfileMatch, xmlXzfileOpen, |
+ xmlXzfileRead, xmlXzfileClose); |
+#endif /* HAVE_ZLIB_H */ |
#ifdef LIBXML_HTTP_ENABLED |
xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen, |
@@ -2276,15 +2429,15 @@ xmlAllocParserInputBuffer(xmlCharEncoding enc) { |
return(NULL); |
} |
memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); |
- ret->buffer = xmlBufferCreateSize(2 * xmlDefaultBufferSize); |
+ ret->buffer = xmlBufCreateSize(2 * xmlDefaultBufferSize); |
if (ret->buffer == NULL) { |
xmlFree(ret); |
return(NULL); |
} |
- ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT; |
+ xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT); |
ret->encoder = xmlGetCharEncodingHandler(enc); |
if (ret->encoder != NULL) |
- ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize); |
+ ret->raw = xmlBufCreateSize(2 * xmlDefaultBufferSize); |
else |
ret->raw = NULL; |
ret->readcallback = NULL; |
@@ -2315,19 +2468,19 @@ xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) { |
return(NULL); |
} |
memset(ret, 0, (size_t) sizeof(xmlOutputBuffer)); |
- ret->buffer = xmlBufferCreate(); |
+ ret->buffer = xmlBufCreate(); |
if (ret->buffer == NULL) { |
xmlFree(ret); |
return(NULL); |
} |
/* try to avoid a performance problem with Windows realloc() */ |
- if (ret->buffer->alloc == XML_BUFFER_ALLOC_EXACT) |
- ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT; |
+ if (xmlBufGetAllocationScheme(ret->buffer) == XML_BUFFER_ALLOC_EXACT) |
+ xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT); |
ret->encoder = encoder; |
if (encoder != NULL) { |
- ret->conv = xmlBufferCreateSize(4000); |
+ ret->conv = xmlBufCreateSize(4000); |
if (ret->conv == NULL) { |
xmlFree(ret); |
return(NULL); |
@@ -2336,7 +2489,7 @@ xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) { |
/* |
* This call is designed to initiate the encoder state |
*/ |
- xmlCharEncOutFunc(encoder, ret->conv, NULL); |
+ xmlCharEncOutput(ret, 1); |
} else |
ret->conv = NULL; |
ret->writecallback = NULL; |
@@ -2365,7 +2518,7 @@ xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) { |
return(NULL); |
} |
memset(ret, 0, (size_t) sizeof(xmlOutputBuffer)); |
- ret->buffer = xmlBufferCreate(); |
+ ret->buffer = xmlBufCreate(); |
if (ret->buffer == NULL) { |
xmlFree(ret); |
return(NULL); |
@@ -2374,15 +2527,12 @@ xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) { |
/* |
* For conversion buffers we use the special IO handling |
- * We don't do that from the exported API to avoid confusing |
- * user's code. |
*/ |
- ret->buffer->alloc = XML_BUFFER_ALLOC_IO; |
- ret->buffer->contentIO = ret->buffer->content; |
+ xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_IO); |
ret->encoder = encoder; |
if (encoder != NULL) { |
- ret->conv = xmlBufferCreateSize(4000); |
+ ret->conv = xmlBufCreateSize(4000); |
if (ret->conv == NULL) { |
xmlFree(ret); |
return(NULL); |
@@ -2391,7 +2541,7 @@ xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) { |
/* |
* This call is designed to initiate the encoder state |
*/ |
- xmlCharEncOutFunc(encoder, ret->conv, NULL); |
+ xmlCharEncOutput(ret, 1); |
} else |
ret->conv = NULL; |
ret->writecallback = NULL; |
@@ -2415,7 +2565,7 @@ xmlFreeParserInputBuffer(xmlParserInputBufferPtr in) { |
if (in == NULL) return; |
if (in->raw) { |
- xmlBufferFree(in->raw); |
+ xmlBufFree(in->raw); |
in->raw = NULL; |
} |
if (in->encoder != NULL) { |
@@ -2425,7 +2575,7 @@ xmlFreeParserInputBuffer(xmlParserInputBufferPtr in) { |
in->closecallback(in->context); |
} |
if (in->buffer != NULL) { |
- xmlBufferFree(in->buffer); |
+ xmlBufFree(in->buffer); |
in->buffer = NULL; |
} |
@@ -2457,14 +2607,14 @@ xmlOutputBufferClose(xmlOutputBufferPtr out) |
} |
written = out->written; |
if (out->conv) { |
- xmlBufferFree(out->conv); |
+ xmlBufFree(out->conv); |
out->conv = NULL; |
} |
if (out->encoder != NULL) { |
xmlCharEncCloseFunc(out->encoder); |
} |
if (out->buffer != NULL) { |
- xmlBufferFree(out->buffer); |
+ xmlBufFree(out->buffer); |
out->buffer = NULL; |
} |
@@ -2533,6 +2683,12 @@ __xmlParserInputBufferCreateFilename(const char *URI, xmlCharEncoding enc) { |
#endif |
} |
#endif |
+#ifdef HAVE_LZMA_H |
+ if ((xmlInputCallbackTable[i].opencallback == xmlXzfileOpen) && |
+ (strcmp(URI, "-") != 0)) { |
+ ret->compressed = __libxml2_xzcompressed(context); |
+ } |
+#endif |
} |
else |
xmlInputCallbackTable[i].closecallback (context); |
@@ -2794,6 +2950,39 @@ xmlOutputBufferCreateBuffer(xmlBufferPtr buffer, |
return(ret); |
} |
+/** |
+ * xmlOutputBufferGetContent: |
+ * @out: an xmlOutputBufferPtr |
+ * |
+ * Gives a pointer to the data currently held in the output buffer |
+ * |
+ * Returns a pointer to the data or NULL in case of error |
+ */ |
+const xmlChar * |
+xmlOutputBufferGetContent(xmlOutputBufferPtr out) { |
+ if ((out == NULL) || (out->buffer == NULL)) |
+ return(NULL); |
+ |
+ return(xmlBufContent(out->buffer)); |
+} |
+ |
+/** |
+ * xmlOutputBufferGetSize: |
+ * @out: an xmlOutputBufferPtr |
+ * |
+ * Gives the length of the data currently held in the output buffer |
+ * |
+ * Returns 0 in case or error or no data is held, the size otherwise |
+ */ |
+size_t |
+xmlOutputBufferGetSize(xmlOutputBufferPtr out) { |
+ if ((out == NULL) || (out->buffer == NULL)) |
+ return(0); |
+ |
+ return(xmlBufUse(out->buffer)); |
+} |
+ |
+ |
#endif /* LIBXML_OUTPUT_ENABLED */ |
/** |
@@ -2846,7 +3035,7 @@ xmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) { |
ret->context = (void *) mem; |
ret->readcallback = (xmlInputReadCallback) xmlNop; |
ret->closecallback = NULL; |
- errcode = xmlBufferAdd(ret->buffer, (const xmlChar *) mem, size); |
+ errcode = xmlBufAdd(ret->buffer, (const xmlChar *) mem, size); |
if (errcode != 0) { |
xmlFree(ret); |
return(NULL); |
@@ -2883,14 +3072,14 @@ xmlParserInputBufferCreateStatic(const char *mem, int size, |
return(NULL); |
} |
memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); |
- ret->buffer = xmlBufferCreateStatic((void *)mem, (size_t) size); |
+ ret->buffer = xmlBufCreateStatic((void *)mem, (size_t) size); |
if (ret->buffer == NULL) { |
xmlFree(ret); |
return(NULL); |
} |
ret->encoder = xmlGetCharEncodingHandler(enc); |
if (ret->encoder != NULL) |
- ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize); |
+ ret->raw = xmlBufCreateSize(2 * xmlDefaultBufferSize); |
else |
ret->raw = NULL; |
ret->compressed = -1; |
@@ -3059,33 +3248,33 @@ xmlParserInputBufferPush(xmlParserInputBufferPtr in, |
* Store the data in the incoming raw buffer |
*/ |
if (in->raw == NULL) { |
- in->raw = xmlBufferCreate(); |
+ in->raw = xmlBufCreate(); |
} |
- ret = xmlBufferAdd(in->raw, (const xmlChar *) buf, len); |
+ ret = xmlBufAdd(in->raw, (const xmlChar *) buf, len); |
if (ret != 0) |
return(-1); |
/* |
* convert as much as possible to the parser reading buffer. |
*/ |
- use = in->raw->use; |
- nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); |
+ use = xmlBufUse(in->raw); |
+ nbchars = xmlCharEncInput(in, 1); |
if (nbchars < 0) { |
xmlIOErr(XML_IO_ENCODER, NULL); |
in->error = XML_IO_ENCODER; |
return(-1); |
} |
- in->rawconsumed += (use - in->raw->use); |
+ in->rawconsumed += (use - xmlBufUse(in->raw)); |
} else { |
nbchars = len; |
- ret = xmlBufferAdd(in->buffer, (xmlChar *) buf, nbchars); |
+ ret = xmlBufAdd(in->buffer, (xmlChar *) buf, nbchars); |
if (ret != 0) |
return(-1); |
} |
#ifdef DEBUG_INPUT |
xmlGenericError(xmlGenericErrorContext, |
"I/O: pushed %d chars, buffer %d/%d\n", |
- nbchars, in->buffer->use, in->buffer->size); |
+ nbchars, xmlBufUse(in->buffer), xmlBufLength(in->buffer)); |
#endif |
return(nbchars); |
} |
@@ -3123,29 +3312,23 @@ xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { |
char *buffer = NULL; |
int res = 0; |
int nbchars = 0; |
- int buffree; |
- unsigned int needSize; |
if ((in == NULL) || (in->error)) return(-1); |
if ((len <= MINLEN) && (len != 4)) |
len = MINLEN; |
- buffree = in->buffer->size - in->buffer->use; |
- if (buffree <= 0) { |
+ if (xmlBufAvail(in->buffer) <= 0) { |
xmlIOErr(XML_IO_BUFFER_FULL, NULL); |
in->error = XML_IO_BUFFER_FULL; |
return(-1); |
} |
- needSize = in->buffer->use + len + 1; |
- if (needSize > in->buffer->size){ |
- if (!xmlBufferResize(in->buffer, needSize)){ |
- xmlIOErrMemory("growing input buffer"); |
- in->error = XML_ERR_NO_MEMORY; |
- return(-1); |
- } |
+ if (xmlBufGrow(in->buffer, len + 1) < 0) { |
+ xmlIOErrMemory("growing input buffer"); |
+ in->error = XML_ERR_NO_MEMORY; |
+ return(-1); |
} |
- buffer = (char *)&in->buffer->content[in->buffer->use]; |
+ buffer = (char *)xmlBufEnd(in->buffer); |
/* |
* Call the read method for this I/O type. |
@@ -3162,6 +3345,17 @@ xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { |
if (res < 0) { |
return(-1); |
} |
+ |
+ /* |
+ * try to establish compressed status of input if not done already |
+ */ |
+ if (in->compressed == -1) { |
+#ifdef HAVE_LZMA_H |
+ if (in->readcallback == xmlXzfileRead) |
+ in->compressed = __libxml2_xzcompressed(in->context); |
+#endif |
+ } |
+ |
len = res; |
if (in->encoder != NULL) { |
unsigned int use; |
@@ -3170,32 +3364,31 @@ xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { |
* Store the data in the incoming raw buffer |
*/ |
if (in->raw == NULL) { |
- in->raw = xmlBufferCreate(); |
+ in->raw = xmlBufCreate(); |
} |
- res = xmlBufferAdd(in->raw, (const xmlChar *) buffer, len); |
+ res = xmlBufAdd(in->raw, (const xmlChar *) buffer, len); |
if (res != 0) |
return(-1); |
/* |
* convert as much as possible to the parser reading buffer. |
*/ |
- use = in->raw->use; |
- nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); |
+ use = xmlBufUse(in->raw); |
+ nbchars = xmlCharEncInput(in, 1); |
if (nbchars < 0) { |
xmlIOErr(XML_IO_ENCODER, NULL); |
in->error = XML_IO_ENCODER; |
return(-1); |
} |
- in->rawconsumed += (use - in->raw->use); |
+ in->rawconsumed += (use - xmlBufUse(in->raw)); |
} else { |
nbchars = len; |
- in->buffer->use += nbchars; |
- buffer[nbchars] = 0; |
+ xmlBufAddLen(in->buffer, nbchars); |
} |
#ifdef DEBUG_INPUT |
xmlGenericError(xmlGenericErrorContext, |
- "I/O: read %d chars, buffer %d/%d\n", |
- nbchars, in->buffer->use, in->buffer->size); |
+ "I/O: read %d chars, buffer %d\n", |
+ nbchars, xmlBufUse(in->buffer)); |
#endif |
return(nbchars); |
} |
@@ -3217,8 +3410,7 @@ xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) { |
if ((in == NULL) || (in->error)) return(-1); |
if (in->readcallback != NULL) |
return(xmlParserInputBufferGrow(in, len)); |
- else if ((in->buffer != NULL) && |
- (in->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) |
+ else if (xmlBufGetAllocationScheme(in->buffer) == XML_BUFFER_ALLOC_IMMUTABLE) |
return(0); |
else |
return(-1); |
@@ -3263,30 +3455,30 @@ xmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) { |
* Store the data in the incoming raw buffer |
*/ |
if (out->conv == NULL) { |
- out->conv = xmlBufferCreate(); |
+ out->conv = xmlBufCreate(); |
} |
- ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk); |
+ ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk); |
if (ret != 0) |
return(-1); |
- if ((out->buffer->use < MINLEN) && (chunk == len)) |
+ if ((xmlBufUse(out->buffer) < MINLEN) && (chunk == len)) |
goto done; |
/* |
* convert as much as possible to the parser reading buffer. |
*/ |
- ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer); |
+ ret = xmlCharEncOutput(out, 0); |
if ((ret < 0) && (ret != -3)) { |
xmlIOErr(XML_IO_ENCODER, NULL); |
out->error = XML_IO_ENCODER; |
return(-1); |
} |
- nbchars = out->conv->use; |
+ nbchars = xmlBufUse(out->conv); |
} else { |
- ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk); |
+ ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk); |
if (ret != 0) |
return(-1); |
- nbchars = out->buffer->use; |
+ nbchars = xmlBufUse(out->buffer); |
} |
buf += chunk; |
len -= chunk; |
@@ -3300,14 +3492,14 @@ xmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) { |
*/ |
if (out->encoder != NULL) { |
ret = out->writecallback(out->context, |
- (const char *)out->conv->content, nbchars); |
+ (const char *)xmlBufContent(out->conv), nbchars); |
if (ret >= 0) |
- xmlBufferShrink(out->conv, ret); |
+ xmlBufShrink(out->conv, ret); |
} else { |
ret = out->writecallback(out->context, |
- (const char *)out->buffer->content, nbchars); |
+ (const char *)xmlBufContent(out->buffer), nbchars); |
if (ret >= 0) |
- xmlBufferShrink(out->buffer, ret); |
+ xmlBufShrink(out->buffer, ret); |
} |
if (ret < 0) { |
xmlIOErr(XML_IO_WRITE, NULL); |
@@ -3351,7 +3543,7 @@ xmlEscapeContent(unsigned char* out, int *outlen, |
inend = in + (*inlen); |
while ((in < inend) && (out < outend)) { |
- if (*in == '<') { |
+ if (*in == '<') { |
if (outend - out < 4) break; |
*out++ = '&'; |
*out++ = 'l'; |
@@ -3415,7 +3607,8 @@ xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str, |
if ((out == NULL) || (out->error) || (str == NULL) || |
(out->buffer == NULL) || |
- (out->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) return(-1); |
+ (xmlBufGetAllocationScheme(out->buffer) == XML_BUFFER_ALLOC_IMMUTABLE)) |
+ return(-1); |
len = strlen((const char *)str); |
if (len < 0) return(0); |
if (out->error) return(-1); |
@@ -3428,14 +3621,14 @@ xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str, |
* how many bytes to consume and how many bytes to store. |
*/ |
cons = len; |
- chunk = (out->buffer->size - out->buffer->use) - 1; |
+ chunk = xmlBufAvail(out->buffer) - 1; |
/* |
* make sure we have enough room to save first, if this is |
* not the case force a flush, but make sure we stay in the loop |
*/ |
if (chunk < 40) { |
- if (xmlBufferGrow(out->buffer, out->buffer->size + 100) < 0) |
+ if (xmlBufGrow(out->buffer, 100) < 0) |
return(-1); |
oldwritten = -1; |
continue; |
@@ -3449,36 +3642,33 @@ xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str, |
* Store the data in the incoming raw buffer |
*/ |
if (out->conv == NULL) { |
- out->conv = xmlBufferCreate(); |
+ out->conv = xmlBufCreate(); |
} |
- ret = escaping(out->buffer->content + out->buffer->use , |
+ ret = escaping(xmlBufEnd(out->buffer) , |
&chunk, str, &cons); |
if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ |
return(-1); |
- out->buffer->use += chunk; |
- out->buffer->content[out->buffer->use] = 0; |
+ xmlBufAddLen(out->buffer, chunk); |
- if ((out->buffer->use < MINLEN) && (cons == len)) |
+ if ((xmlBufUse(out->buffer) < MINLEN) && (cons == len)) |
goto done; |
/* |
* convert as much as possible to the output buffer. |
*/ |
- ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer); |
+ ret = xmlCharEncOutput(out, 0); |
if ((ret < 0) && (ret != -3)) { |
xmlIOErr(XML_IO_ENCODER, NULL); |
out->error = XML_IO_ENCODER; |
return(-1); |
} |
- nbchars = out->conv->use; |
+ nbchars = xmlBufUse(out->conv); |
} else { |
- ret = escaping(out->buffer->content + out->buffer->use , |
- &chunk, str, &cons); |
+ ret = escaping(xmlBufEnd(out->buffer), &chunk, str, &cons); |
if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ |
return(-1); |
- out->buffer->use += chunk; |
- out->buffer->content[out->buffer->use] = 0; |
- nbchars = out->buffer->use; |
+ xmlBufAddLen(out->buffer, chunk); |
+ nbchars = xmlBufUse(out->buffer); |
} |
str += cons; |
len -= cons; |
@@ -3492,14 +3682,14 @@ xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str, |
*/ |
if (out->encoder != NULL) { |
ret = out->writecallback(out->context, |
- (const char *)out->conv->content, nbchars); |
+ (const char *)xmlBufContent(out->conv), nbchars); |
if (ret >= 0) |
- xmlBufferShrink(out->conv, ret); |
+ xmlBufShrink(out->conv, ret); |
} else { |
ret = out->writecallback(out->context, |
- (const char *)out->buffer->content, nbchars); |
+ (const char *)xmlBufContent(out->buffer), nbchars); |
if (ret >= 0) |
- xmlBufferShrink(out->buffer, ret); |
+ xmlBufShrink(out->buffer, ret); |
} |
if (ret < 0) { |
xmlIOErr(XML_IO_WRITE, NULL); |
@@ -3507,8 +3697,8 @@ xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str, |
return(ret); |
} |
out->written += ret; |
- } else if (out->buffer->size - out->buffer->use < MINLEN) { |
- xmlBufferResize(out->buffer, out->buffer->size + MINLEN); |
+ } else if (xmlBufAvail(out->buffer) < MINLEN) { |
+ xmlBufGrow(out->buffer, MINLEN); |
} |
written += nbchars; |
} while ((len > 0) && (oldwritten != written)); |
@@ -3566,14 +3756,16 @@ xmlOutputBufferFlush(xmlOutputBufferPtr out) { |
*/ |
if ((out->conv != NULL) && (out->encoder != NULL)) { |
/* |
- * convert as much as possible to the parser reading buffer. |
+ * convert as much as possible to the parser output buffer. |
*/ |
- nbchars = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer); |
- if (nbchars < 0) { |
- xmlIOErr(XML_IO_ENCODER, NULL); |
- out->error = XML_IO_ENCODER; |
- return(-1); |
- } |
+ do { |
+ nbchars = xmlCharEncOutput(out, 0); |
+ if (nbchars < 0) { |
+ xmlIOErr(XML_IO_ENCODER, NULL); |
+ out->error = XML_IO_ENCODER; |
+ return(-1); |
+ } |
+ } while (nbchars); |
} |
/* |
@@ -3582,14 +3774,16 @@ xmlOutputBufferFlush(xmlOutputBufferPtr out) { |
if ((out->conv != NULL) && (out->encoder != NULL) && |
(out->writecallback != NULL)) { |
ret = out->writecallback(out->context, |
- (const char *)out->conv->content, out->conv->use); |
+ (const char *)xmlBufContent(out->conv), |
+ xmlBufUse(out->conv)); |
if (ret >= 0) |
- xmlBufferShrink(out->conv, ret); |
+ xmlBufShrink(out->conv, ret); |
} else if (out->writecallback != NULL) { |
ret = out->writecallback(out->context, |
- (const char *)out->buffer->content, out->buffer->use); |
+ (const char *)xmlBufContent(out->buffer), |
+ xmlBufUse(out->buffer)); |
if (ret >= 0) |
- xmlBufferShrink(out->buffer, ret); |
+ xmlBufShrink(out->buffer, ret); |
} |
if (ret < 0) { |
xmlIOErr(XML_IO_FLUSH, NULL); |