On Fri, Feb 16, 2007 at 04:57:15PM -0800, Ben Pfaff wrote: > RCS file: /sources/gnulib/gnulib/m4/vsnprintf.m4,v > retrieving revision 1.2 > diff -u -p -r1.2 vsnprintf.m4 > --- m4/vsnprintf.m4 23 Jan 2005 08:06:57 -0000 1.2 > +++ m4/vsnprintf.m4 17 Feb 2007 00:56:09 -0000 > @@ -1,12 +1,27 @@ > -# vsnprintf.m4 serial 2 > -dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. > +# vsnprintf.m4 serial 3 > +dnl Copyright (C) 2002, 2003, 2004, 2007 Free Software Foundation, Inc. > dnl This file is free software; the Free Software Foundation > dnl gives unlimited permission to copy and/or distribute it, > dnl with or without modifications, as long as this notice is preserved. > > AC_DEFUN([gl_FUNC_VSNPRINTF], > [ > - AC_REPLACE_FUNCS(vsnprintf) > + AC_REQUIRE([gl_AC_NATIVE_W32]) > + AC_CHECK_FUNCS_ONCE(vsnprintf) > + AC_MSG_CHECKING([for C99-compliant vsnprintf]) > + if test $ac_cv_func_vsnprintf = no || test $gl_cv_native_w32 = yes; then > + AC_LIBOBJ(vsnprintf) > + AC_DEFINE(vsnprintf, rpl_vsnprintf, > + [Define to rpl_vsnprintf if the replacement function should be used.]) > + AC_MSG_RESULT([no]) > + else > + AC_MSG_RESULT([yes]) > + fi > + if test $gl_cv_native_w32 = yes; then > + AC_LIBOBJ(_vsnprintf) > + AC_DEFINE(_vsnprintf, rpl__vsnprintf, > + [Define to rpl__vsnprintf if the replacement function should be used.]) > + fi > AC_CHECK_DECLS_ONCE(vsnprintf) > gl_PREREQ_VSNPRINTF > ])
Huh? So, if vsnprintf() exists, you assume it's C99-compliant? glib has a check for this, AC_FUNC_VSNPRINTF_C99, because that's not the case on some systems. And, we found that Solaris and AIX 5.1 do not have a C99-compliant vsnprintf(). The attached program returns -1 on Solaris 6/SPARC thru Solaris 9/SPARC which has vsnprintf(), for example. -- albert chin ([EMAIL PROTECTED])
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> int doit(char * s, ...) { char buffer[32]; va_list args; int r; /* AIX 5.1 and Solaris seems to have a half-baked vsnprintf() implementation. The above will return 7 but if you replace the size of the buffer with 0, it borks! */ va_start(args, s); r = vsnprintf(buffer, 0, s, args); va_end(args); printf("r: %d\n", r); if (r != 7) exit(1); exit(0); } int main(void) { doit("1234567"); exit(1); }