mutt stable branch with some hacks

Add mutt_buffer_printf function, with autoconf test for va_copy.

+53
+2
configure.in
··· 345 345 AC_LIBOBJ(snprintf) 346 346 fi 347 347 348 + XIPH_FUNC_VA_COPY 349 + 348 350 dnl SCO uses chsize() instead of ftruncate() 349 351 AC_CHECK_FUNCS(ftruncate, , [AC_CHECK_LIB(x, chsize)]) 350 352
+22
m4/funcs.m4
··· 1 + dnl XIPH_ macros are GPL, from http://svn.xiph.org/icecast/trunk/m4 2 + dnl 3 + # XIPH_FUNC_VA_COPY 4 + # Test for implementation of va_copy, or define appropriately if missing 5 + AC_DEFUN([XIPH_FUNC_VA_COPY], 6 + [dnl 7 + AC_MSG_CHECKING([for va_copy]) 8 + AC_TRY_LINK([#include <stdarg.h>], [va_list ap1, ap2; va_copy(ap1, ap2);], 9 + AC_MSG_RESULT([va_copy]), 10 + [dnl 11 + AH_TEMPLATE([va_copy], [define if va_copy is not available]) 12 + AC_TRY_LINK([#include <stdarg.h>], [va_list ap1, ap2; __va_copy(ap1, ap2);], 13 + [dnl 14 + AC_DEFINE([va_copy], [__va_copy]) 15 + AC_MSG_RESULT([__va_copy])], 16 + [dnl 17 + AC_DEFINE([va_copy(dest,src)], [memcpy(&dest,&src,sizeof(va_list))]) 18 + AC_MSG_RESULT([memcpy]) 19 + ]) 20 + ]) 21 + ]) 22 + ])dnl XIPH_FUNC_VA_COPY
+28
muttlib.c
··· 1419 1419 return b; 1420 1420 } 1421 1421 1422 + int mutt_buffer_printf (BUFFER* buf, const char* fmt, ...) 1423 + { 1424 + va_list ap, ap_retry; 1425 + int len, blen, doff; 1426 + 1427 + va_start (ap, fmt); 1428 + va_copy (ap_retry, ap); 1429 + 1430 + doff = buf->dptr - buf->data; 1431 + blen = buf->dsize - doff; 1432 + if ((len = vsnprintf (buf->dptr, blen, fmt, ap)) >= blen) 1433 + { 1434 + blen = ++len - blen; 1435 + if (blen < 128) 1436 + blen = 128; 1437 + buf->dsize += blen; 1438 + safe_realloc (&buf->data, buf->dsize); 1439 + buf->dptr = buf->data + doff; 1440 + len = vsnprintf (buf->dptr, len, fmt, ap_retry); 1441 + va_end (ap_retry); 1442 + } 1443 + buf->dptr += len; 1444 + 1445 + va_end (ap); 1446 + 1447 + return len; 1448 + } 1449 + 1422 1450 void mutt_buffer_addstr (BUFFER* buf, const char* s) 1423 1451 { 1424 1452 mutt_buffer_add (buf, s, mutt_strlen (s));
+1
protos.h
··· 39 39 BUFFER * mutt_buffer_init (BUFFER *); 40 40 BUFFER * mutt_buffer_from (BUFFER *, char *); 41 41 void mutt_buffer_free(BUFFER **); 42 + int mutt_buffer_printf (BUFFER*, const char*, ...); 42 43 void mutt_buffer_add (BUFFER*, const char*, size_t); 43 44 void mutt_buffer_addstr (BUFFER*, const char*); 44 45 void mutt_buffer_addch (BUFFER*, char);