diff options
Diffstat (limited to 'source/fitz/buffer.c')
-rw-r--r-- | source/fitz/buffer.c | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/source/fitz/buffer.c b/source/fitz/buffer.c index 07ce9361..e9295a26 100644 --- a/source/fitz/buffer.c +++ b/source/fitz/buffer.c @@ -224,45 +224,47 @@ fz_buffer_printf(fz_context *ctx, fz_buffer *buffer, const char *fmt, ...) int ret; va_list args; va_start(args, fmt); - ret = fz_buffer_vprintf(ctx, buffer, fmt, args); - va_end(args); - return ret; } int fz_buffer_vprintf(fz_context *ctx, fz_buffer *buffer, const char *fmt, va_list old_args) { + int slack; int len; + va_list args; + + slack = buffer->cap - buffer->len; +#ifdef _MSC_VER /* Microsoft Visual C */ + args = old_args; +#else + va_copy(args, old_args); +#endif + len = fz_vsnprintf((char *)buffer->data + buffer->len, slack, fmt, args); +#ifndef _MSC_VER + va_end(args); +#endif - do + /* len = number of chars written, not including the terminating + * NULL, so len+1 > slack means "truncated". */ + if (len+1 > slack) { - int slack = buffer->cap - buffer->len; + /* Grow the buffer and retry */ + fz_ensure_buffer(ctx, buffer, buffer->len + len); + slack = buffer->cap - buffer->len; - if (slack > 0) - { - va_list args; #ifdef _MSC_VER /* Microsoft Visual C */ - args = old_args; + args = old_args; #else - va_copy(args, old_args); + va_copy(args, old_args); #endif - len = vsnprintf((char *)buffer->data + buffer->len, slack, fmt, args); + len = fz_vsnprintf((char *)buffer->data + buffer->len, slack, fmt, args); #ifndef _MSC_VER - va_end(args); + va_end(args); #endif - /* len = number of chars written, not including the terminating - * NULL, so len+1 > slack means "truncated". MSVC differs here - * and returns -1 for truncated. */ - if (len >= 0 && len+1 <= slack) - break; - } - /* Grow the buffer and retry */ - fz_grow_buffer(ctx, buffer); } - while (1); buffer->len += len; |