summaryrefslogtreecommitdiff
path: root/source/fitz/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz/buffer.c')
-rw-r--r--source/fitz/buffer.c44
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;