]> granicus.if.org Git - mutt/commitdiff
Add mutt_buffer_printf function, with autoconf test for va_copy.
authorBrendan Cully <brendan@kublai.com>
Thu, 15 Dec 2005 18:36:24 +0000 (18:36 +0000)
committerBrendan Cully <brendan@kublai.com>
Thu, 15 Dec 2005 18:36:24 +0000 (18:36 +0000)
configure.in
m4/funcs.m4 [new file with mode: 0644]
muttlib.c
protos.h

index f5ecc9c661bb242c0700084b494ded4bf9526ad1..65f1f9ec4b1e63ae703dc159511ae495e07631a0 100644 (file)
@@ -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 (file)
index 0000000..d7157f3
--- /dev/null
@@ -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 <stdarg.h>], [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 <stdarg.h>], [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
index 56f0f179a07ca4fcf30655021d5ee80141eea145..de8ec4f0215435fb17257be1e3240ae0fa80dbfa 100644 (file)
--- 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));
index 8b4340a5917505024efb9b110b2e293dcb636ad7..9b11ee1e4b7e698f0a5e3c8e2bdc3e236c1eddb0 100644 (file)
--- 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);