From 6d47cd7c44116a7de8f83e054ac3f92994dded26 Mon Sep 17 00:00:00 2001 From: Brendan Cully Date: Thu, 15 Dec 2005 18:36:24 +0000 Subject: [PATCH] Add mutt_buffer_printf function, with autoconf test for va_copy. --- configure.in | 2 ++ m4/funcs.m4 | 22 ++++++++++++++++++++++ muttlib.c | 28 ++++++++++++++++++++++++++++ protos.h | 1 + 4 files changed, 53 insertions(+) create mode 100644 m4/funcs.m4 diff --git a/configure.in b/configure.in index f5ecc9c6..65f1f9ec 100644 --- a/configure.in +++ b/configure.in @@ -345,6 +345,8 @@ if test $mutt_cv_snprintf = yes; then AC_LIBOBJ(snprintf) fi +XIPH_FUNC_VA_COPY + dnl SCO uses chsize() instead of ftruncate() AC_CHECK_FUNCS(ftruncate, , [AC_CHECK_LIB(x, chsize)]) diff --git a/m4/funcs.m4 b/m4/funcs.m4 new file mode 100644 index 00000000..d7157f3e --- /dev/null +++ b/m4/funcs.m4 @@ -0,0 +1,22 @@ +dnl XIPH_ macros are GPL, from http://svn.xiph.org/icecast/trunk/m4 +dnl +# XIPH_FUNC_VA_COPY +# Test for implementation of va_copy, or define appropriately if missing +AC_DEFUN([XIPH_FUNC_VA_COPY], +[dnl +AC_MSG_CHECKING([for va_copy]) +AC_TRY_LINK([#include ], [va_list ap1, ap2; va_copy(ap1, ap2);], + AC_MSG_RESULT([va_copy]), + [dnl + AH_TEMPLATE([va_copy], [define if va_copy is not available]) + AC_TRY_LINK([#include ], [va_list ap1, ap2; __va_copy(ap1, ap2);], + [dnl + AC_DEFINE([va_copy], [__va_copy]) + AC_MSG_RESULT([__va_copy])], + [dnl + AC_DEFINE([va_copy(dest,src)], [memcpy(&dest,&src,sizeof(va_list))]) + AC_MSG_RESULT([memcpy]) + ]) + ]) +]) +])dnl XIPH_FUNC_VA_COPY diff --git a/muttlib.c b/muttlib.c index 56f0f179..de8ec4f0 100644 --- a/muttlib.c +++ b/muttlib.c @@ -1419,6 +1419,34 @@ BUFFER * mutt_buffer_from(BUFFER *b, char *seed) return b; } +int mutt_buffer_printf (BUFFER* buf, const char* fmt, ...) +{ + va_list ap, ap_retry; + int len, blen, doff; + + va_start (ap, fmt); + va_copy (ap_retry, ap); + + doff = buf->dptr - buf->data; + blen = buf->dsize - doff; + if ((len = vsnprintf (buf->dptr, blen, fmt, ap)) >= blen) + { + blen = ++len - blen; + if (blen < 128) + blen = 128; + buf->dsize += blen; + safe_realloc (&buf->data, buf->dsize); + buf->dptr = buf->data + doff; + len = vsnprintf (buf->dptr, len, fmt, ap_retry); + va_end (ap_retry); + } + buf->dptr += len; + + va_end (ap); + + return len; +} + void mutt_buffer_addstr (BUFFER* buf, const char* s) { mutt_buffer_add (buf, s, mutt_strlen (s)); diff --git a/protos.h b/protos.h index 8b4340a5..9b11ee1e 100644 --- a/protos.h +++ b/protos.h @@ -39,6 +39,7 @@ int mutt_extract_token (BUFFER *, BUFFER *, int); BUFFER * mutt_buffer_init (BUFFER *); BUFFER * mutt_buffer_from (BUFFER *, char *); void mutt_buffer_free(BUFFER **); +int mutt_buffer_printf (BUFFER*, const char*, ...); void mutt_buffer_add (BUFFER*, const char*, size_t); void mutt_buffer_addstr (BUFFER*, const char*); void mutt_buffer_addch (BUFFER*, char); -- 2.40.0