AC_LIBOBJ(snprintf)
fi
+XIPH_FUNC_VA_COPY
+
dnl SCO uses chsize() instead of ftruncate()
AC_CHECK_FUNCS(ftruncate, , [AC_CHECK_LIB(x, chsize)])
--- /dev/null
+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
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));
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);