Mercurial > hg > octave-lyh > gnulib-hg
changeset 9674:b69f1141e94f
Fix *printf behaviour regarding the left-adjust flag on HP-UX 10.20.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Thu, 07 Feb 2008 02:08:13 +0100 |
parents | d95fe39a37f7 |
children | 2caa4d287a00 |
files | ChangeLog doc/posix-functions/fprintf.texi doc/posix-functions/printf.texi doc/posix-functions/snprintf.texi doc/posix-functions/sprintf.texi doc/posix-functions/vfprintf.texi doc/posix-functions/vprintf.texi doc/posix-functions/vsnprintf.texi doc/posix-functions/vsprintf.texi lib/vasnprintf.c m4/fprintf-posix.m4 m4/printf.m4 m4/snprintf-posix.m4 m4/sprintf-posix.m4 m4/vasnprintf-posix.m4 m4/vasnprintf.m4 m4/vasprintf-posix.m4 m4/vfprintf-posix.m4 m4/vsnprintf-posix.m4 m4/vsprintf-posix.m4 tests/test-snprintf-posix.h tests/test-sprintf-posix.h tests/test-vasnprintf-posix.c tests/test-vasprintf-posix.c |
diffstat | 24 files changed, 417 insertions(+), 127 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,35 @@ +2008-02-06 Bruno Haible <bruno@clisp.org> + + Fix *printf behaviour regarding the left-adjust flag on HP-UX 10.20. + * m4/printf.m4 (gl_PRINTF_FLAG_LEFTADJUST): New macro. + * lib/vasnprintf.c (VASNPRINTF): Handle NEED_PRINTF_FLAG_LEFTADJUST. + * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST): New macro. + (gl_PREREQ_VASNPRINTF_WITH_EXTRAS): Invoke it. + * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke + gl_PRINTF_FLAG_LEFTADJUST and test its result. Invoke + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST. + * m4/snprintf-posix.m4 (gl_FUNC_SNPRINTF_POSIX): Likewise. + * m4/sprintf-posix.m4 (gl_FUNC_SPRINTF_POSIX): Likewise. + * m4/vasnprintf-posix.m4 (gl_FUNC_VASNPRINTF_POSIX): Likewise. + * m4/vasprintf-posix.m4 (gl_FUNC_VASPRINTF_POSIX): Likewise. + * m4/vfprintf-posix.m4 (gl_FUNC_VFPRINTF_POSIX): Likewise. + * m4/vsnprintf-posix.m4 (gl_FUNC_VSNPRINTF_POSIX): Likewise. + * m4/vsprintf-posix.m4 (gl_FUNC_VSPRINTF_POSIX): Likewise. + * tests/test-vasnprintf-posix.c (test_function): Add testcases for the + left-adjust flag. + * tests/test-snprintf-posix.h (test_function): Likewise. + * tests/test-sprintf-posix.h (test_function): Likewise. + * tests/test-vasprintf-posix.c (test_function): Likewise. + * doc/functions/fprintf.texi: Update. + * doc/functions/printf.texi: Update. + * doc/functions/snprintf.texi: Update. + * doc/functions/sprintf.texi: Update. + * doc/functions/vfprintf.texi: Update. + * doc/functions/vprintf.texi: Update. + * doc/functions/vsnprintf.texi: Update. + * doc/functions/vsprintf.texi: Update. + Reported by Peter Fales <psfales@alcatel-lucent.com>. + 2008-02-06 Bruno Haible <bruno@clisp.org> Fix bug introduced on 2008-01-26.
--- a/doc/posix-functions/fprintf.texi +++ b/doc/posix-functions/fprintf.texi @@ -34,6 +34,10 @@ This function doesn't support the @code{'} flag on some platforms: NetBSD 3.0, Cygwin 2006, mingw. @item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded with zeroes) on some platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw.
--- a/doc/posix-functions/printf.texi +++ b/doc/posix-functions/printf.texi @@ -34,6 +34,10 @@ This function doesn't support the @code{'} flag on some platforms: NetBSD 3.0, Cygwin 2006, mingw. @item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded with zeroes) on some platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw.
--- a/doc/posix-functions/snprintf.texi +++ b/doc/posix-functions/snprintf.texi @@ -41,6 +41,10 @@ This function doesn't support the @code{'} flag on some platforms: NetBSD 3.0, Cygwin 2006, mingw. @item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded with zeroes) on some platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw.
--- a/doc/posix-functions/sprintf.texi +++ b/doc/posix-functions/sprintf.texi @@ -34,6 +34,10 @@ This function doesn't support the @code{'} flag on some platforms: NetBSD 3.0, Cygwin 2006, mingw. @item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded with zeroes) on some platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw.
--- a/doc/posix-functions/vfprintf.texi +++ b/doc/posix-functions/vfprintf.texi @@ -34,6 +34,10 @@ This function doesn't support the @code{'} flag on some platforms: NetBSD 3.0, Cygwin 2006, mingw. @item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded with zeroes) on some platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw.
--- a/doc/posix-functions/vprintf.texi +++ b/doc/posix-functions/vprintf.texi @@ -34,6 +34,10 @@ This function doesn't support the @code{'} flag on some platforms: NetBSD 3.0, Cygwin 2006, mingw. @item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded with zeroes) on some platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw.
--- a/doc/posix-functions/vsnprintf.texi +++ b/doc/posix-functions/vsnprintf.texi @@ -41,6 +41,10 @@ This function doesn't support the @code{'} flag on some platforms: NetBSD 3.0, Cygwin 2006, mingw. @item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded with zeroes) on some platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw.
--- a/doc/posix-functions/vsprintf.texi +++ b/doc/posix-functions/vsprintf.texi @@ -34,6 +34,10 @@ This function doesn't support the @code{'} flag on some platforms: NetBSD 3.0, Cygwin 2006, mingw. @item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded with zeroes) on some platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw.
--- a/lib/vasnprintf.c +++ b/lib/vasnprintf.c @@ -3566,7 +3566,7 @@ { arg_type type = a.arg[dp->arg_index].type; int flags = dp->flags; -#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION +#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION int has_width; size_t width; #endif @@ -3579,7 +3579,9 @@ #else # define prec_ourselves 0 #endif -#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION +#if NEED_PRINTF_FLAG_LEFTADJUST +# define pad_ourselves 1 +#elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION int pad_ourselves; #else # define pad_ourselves 0 @@ -3593,7 +3595,7 @@ TCHAR_T *tmp; #endif -#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION +#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION has_width = 0; width = 0; if (dp->width_start != dp->width_end) @@ -3883,7 +3885,7 @@ #endif /* Decide whether to perform the padding ourselves. */ -#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION +#if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION) switch (dp->conversion) { # if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO @@ -4494,7 +4496,7 @@ /* Here count <= allocated - length. */ /* Perform padding. */ -#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION +#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION if (pad_ourselves && has_width) { size_t w;
--- a/m4/fprintf-posix.m4 +++ b/m4/fprintf-posix.m4 @@ -1,5 +1,5 @@ -# fprintf-posix.m4 serial 9 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# fprintf-posix.m4 serial 10 +dnl Copyright (C) 2007-2008 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. @@ -16,6 +16,7 @@ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) @@ -38,15 +39,19 @@ *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) - case "$gl_cv_func_printf_flag_zero" in + case "$gl_cv_func_printf_flag_leftadjust" in *yes) - case "$gl_cv_func_printf_precision" in + case "$gl_cv_func_printf_flag_zero" in *yes) - case "$gl_cv_func_printf_enomem" in + case "$gl_cv_func_printf_precision" in *yes) - # fprintf exists and is - # already POSIX compliant. - gl_cv_func_fprintf_posix=yes + case "$gl_cv_func_printf_enomem" in + *yes) + # fprintf exists and is + # already POSIX compliant. + gl_cv_func_fprintf_posix=yes + ;; + esac ;; esac ;; @@ -78,6 +83,7 @@ gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM
--- a/m4/printf.m4 +++ b/m4/printf.m4 @@ -1,5 +1,5 @@ -# printf.m4 serial 21 -dnl Copyright (C) 2003, 2007 Free Software Foundation, Inc. +# printf.m4 serial 22 +dnl Copyright (C) 2003, 2007-2008 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. @@ -684,6 +684,47 @@ ]) ]) +dnl Test whether the *printf family of functions supports the - flag correctly. +dnl (ISO C99.) See +dnl <http://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html> +dnl Result is gl_cv_func_printf_flag_leftadjust. + +AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly], + [gl_cv_func_printf_flag_leftadjust], + [ + AC_TRY_RUN([ +#include <stdio.h> +#include <string.h> +static char buf[100]; +int main () +{ + /* Check that a '-' flag is not annihilated by a negative width. */ + if (sprintf (buf, "a%-*sc", -3, "b") < 0 + || strcmp (buf, "ab c") != 0) + return 1; + return 0; +}], + [gl_cv_func_printf_flag_leftadjust=yes], + [gl_cv_func_printf_flag_leftadjust=no], + [ +changequote(,)dnl + case "$host_os" in + # Guess yes on HP-UX 11. + hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";; + # Guess no on HP-UX 10 and older. + hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";; + # Guess yes otherwise. + *) gl_cv_func_printf_flag_leftadjust="guessing yes";; + esac +changequote([,])dnl + ]) + ]) +]) + dnl Test whether the *printf family of functions supports padding of non-finite dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> @@ -1185,14 +1226,15 @@ dnl 7 = gl_PRINTF_DIRECTIVE_N dnl 8 = gl_PRINTF_POSITIONS dnl 9 = gl_PRINTF_FLAG_GROUPING -dnl 10 = gl_PRINTF_FLAG_ZERO -dnl 11 = gl_PRINTF_PRECISION -dnl 12 = gl_PRINTF_ENOMEM -dnl 13 = gl_SNPRINTF_PRESENCE -dnl 14 = gl_SNPRINTF_TRUNCATION_C99 -dnl 15 = gl_SNPRINTF_RETVAL_C99 -dnl 16 = gl_SNPRINTF_DIRECTIVE_N -dnl 17 = gl_VSNPRINTF_ZEROSIZE_C99 +dnl 10 = gl_PRINTF_FLAG_LEFTADJUST +dnl 11 = gl_PRINTF_FLAG_ZERO +dnl 12 = gl_PRINTF_PRECISION +dnl 13 = gl_PRINTF_ENOMEM +dnl 14 = gl_SNPRINTF_PRESENCE +dnl 15 = gl_SNPRINTF_TRUNCATION_C99 +dnl 16 = gl_SNPRINTF_RETVAL_C99 +dnl 17 = gl_SNPRINTF_DIRECTIVE_N +dnl 18 = gl_VSNPRINTF_ZEROSIZE_C99 dnl dnl 1 = checking whether printf supports size specifiers as in C99... dnl 2 = checking whether printf supports 'long double' arguments... @@ -1203,36 +1245,38 @@ dnl 7 = checking whether printf supports the 'n' directive... dnl 8 = checking whether printf supports POSIX/XSI format strings with positions... dnl 9 = checking whether printf supports the grouping flag... -dnl 10 = checking whether printf supports the zero flag correctly... -dnl 11 = checking whether printf supports large precisions... -dnl 12 = checking whether printf survives out-of-memory conditions... -dnl 13 = checking for snprintf... -dnl 14 = checking whether snprintf truncates the result as in C99... -dnl 15 = checking whether snprintf returns a byte count as in C99... -dnl 16 = checking whether snprintf fully supports the 'n' directive... -dnl 17 = checking whether vsnprintf respects a zero size as in C99... +dnl 10 = checking whether printf supports the left-adjust flag correctly... +dnl 11 = checking whether printf supports the zero flag correctly... +dnl 12 = checking whether printf supports large precisions... +dnl 13 = checking whether printf survives out-of-memory conditions... +dnl 14 = checking for snprintf... +dnl 15 = checking whether snprintf truncates the result as in C99... +dnl 16 = checking whether snprintf returns a byte count as in C99... +dnl 17 = checking whether snprintf fully supports the 'n' directive... +dnl 18 = checking whether vsnprintf respects a zero size as in C99... dnl dnl . = yes, # = no. dnl -dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -dnl glibc 2.5 . . . . . . . . . . . . . . . . . -dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . -dnl FreeBSD 5.4, 6.1 . . . . # . . . . # . # . . . . . -dnl MacOS X 10.3.9 . . . . # . . . . # . # . . . . . -dnl OpenBSD 3.9, 4.0 . ? ? ? # ? . . ? ? ? ? . . . ? ? -dnl Cygwin 2007 (= Cygwin 1.5.24) . . . . # # . . . # ? ? . . . . . -dnl Cygwin 2006 (= Cygwin 1.5.19) # . . . # # . . # # ? ? . . . . . -dnl Solaris 10 . . # # # . . . . # . . . . . . . -dnl Solaris 2.6 ... 9 # . # # # # . . . # . . . . . . . -dnl Solaris 2.5.1 # . # # # # . . . # . . # # # # # -dnl AIX 5.2 . . # # # . . . . # . . . . . . . -dnl AIX 4.3.2, 5.1 # . # # # # . . . # . . . . . . . -dnl HP-UX 11.31 . . . . # . . . . # . . . . # # . -dnl HP-UX 10.20, 11.{00,11,23} # . . . # # . . . # . . . . # # # -dnl IRIX 6.5 # . # # # # . . . # . . . . # . . -dnl OSF/1 5.1 # . # # # # . . . # . . . . # . # -dnl OSF/1 4.0d # . # # # # . . . # . . # # # # # -dnl NetBSD 4.0 . ? ? ? ? ? . . ? ? ? ? . . . ? ? -dnl NetBSD 3.0 . . . . # # . # # # . # . . . . . -dnl BeOS # # . # # # . # . . # ? . . . . . -dnl mingw # # # # # # . # # # # ? . # # # . +dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +dnl glibc 2.5 . . . . . . . . . . . . . . . . . . +dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . +dnl FreeBSD 5.4, 6.1 . . . . # . . . . . # . # . . . . . +dnl MacOS X 10.3.9 . . . . # . . . . . # . # . . . . . +dnl OpenBSD 3.9, 4.0 . . # # # # . . # . # . # . . . . . +dnl Cygwin 2007 (= Cygwin 1.5.24) . . . . # # . . . ? # ? ? . . . . . +dnl Cygwin 2006 (= Cygwin 1.5.19) # . . . # # . . # ? # ? ? . . . . . +dnl Solaris 10 . . # # # . . . . . # . . . . . . . +dnl Solaris 2.6 ... 9 # . # # # # . . . . # . . . . . . . +dnl Solaris 2.5.1 # . # # # # . . . . # . . # # # # # +dnl AIX 5.2 . . # # # . . . . . # . . . . . . . +dnl AIX 4.3.2, 5.1 # . # # # # . . . . # . . . . . . . +dnl HP-UX 11.31 . . . . # . . . . . # . . . . # # . +dnl HP-UX 11.{00,11,23} # . . . # # . . . . # . . . . # # # +dnl HP-UX 10.20 # . . . # # . . . # # . . . . # # # +dnl IRIX 6.5 # . # # # # . . . . # . . . . # . . +dnl OSF/1 5.1 # . # # # # . . . . # . . . . # . # +dnl OSF/1 4.0d # . # # # # . . . . # . . # # # # # +dnl NetBSD 4.0 . ? ? ? ? ? . . ? ? ? ? ? . . . ? ? +dnl NetBSD 3.0 . . . . # # . # # ? # . # . . . . . +dnl BeOS # # . # # # . # . ? . # ? . . . . . +dnl mingw # # # # # # . # # . # # ? . # # # .
--- a/m4/snprintf-posix.m4 +++ b/m4/snprintf-posix.m4 @@ -1,5 +1,5 @@ -# snprintf-posix.m4 serial 10 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# snprintf-posix.m4 serial 11 +dnl Copyright (C) 2007-2008 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. @@ -16,6 +16,7 @@ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) @@ -44,23 +45,27 @@ *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) - case "$gl_cv_func_printf_flag_zero" in + case "$gl_cv_func_printf_flag_leftadjust" in *yes) - case "$gl_cv_func_printf_precision" in + case "$gl_cv_func_printf_flag_zero" in *yes) - case "$gl_cv_func_printf_enomem" in + case "$gl_cv_func_printf_precision" in *yes) - case "$gl_cv_func_snprintf_truncation_c99" in + case "$gl_cv_func_printf_enomem" in *yes) - case "$gl_cv_func_snprintf_retval_c99" in + case "$gl_cv_func_snprintf_truncation_c99" in *yes) - case "$gl_cv_func_snprintf_directive_n" in + case "$gl_cv_func_snprintf_retval_c99" in *yes) - case "$gl_cv_func_vsnprintf_zerosize_c99" in + case "$gl_cv_func_snprintf_directive_n" in *yes) - # snprintf exists and is - # already POSIX compliant. - gl_cv_func_snprintf_posix=yes + case "$gl_cv_func_vsnprintf_zerosize_c99" in + *yes) + # snprintf exists and is + # already POSIX compliant. + gl_cv_func_snprintf_posix=yes + ;; + esac ;; esac ;; @@ -101,6 +106,7 @@ gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM
--- a/m4/sprintf-posix.m4 +++ b/m4/sprintf-posix.m4 @@ -1,5 +1,5 @@ -# sprintf-posix.m4 serial 9 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# sprintf-posix.m4 serial 10 +dnl Copyright (C) 2007-2008 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. @@ -16,6 +16,7 @@ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) @@ -38,15 +39,19 @@ *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) - case "$gl_cv_func_printf_flag_zero" in + case "$gl_cv_func_printf_flag_leftadjust" in *yes) - case "$gl_cv_func_printf_precision" in + case "$gl_cv_func_printf_flag_zero" in *yes) - case "$gl_cv_func_printf_enomem" in + case "$gl_cv_func_printf_precision" in *yes) - # sprintf exists and is - # already POSIX compliant. - gl_cv_func_sprintf_posix=yes + case "$gl_cv_func_printf_enomem" in + *yes) + # sprintf exists and is + # already POSIX compliant. + gl_cv_func_sprintf_posix=yes + ;; + esac ;; esac ;; @@ -78,6 +83,7 @@ gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM
--- a/m4/vasnprintf-posix.m4 +++ b/m4/vasnprintf-posix.m4 @@ -1,5 +1,5 @@ -# vasnprintf-posix.m4 serial 10 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# vasnprintf-posix.m4 serial 11 +dnl Copyright (C) 2007-2008 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. @@ -16,6 +16,7 @@ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) @@ -39,17 +40,21 @@ *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) - case "$gl_cv_func_printf_flag_zero" in + case "$gl_cv_func_printf_flag_leftadjust" in *yes) - case "$gl_cv_func_printf_precision" in + case "$gl_cv_func_printf_flag_zero" in *yes) - case "$gl_cv_func_printf_enomem" in + case "$gl_cv_func_printf_precision" in *yes) - if test $ac_cv_func_vasnprintf = yes; then - # vasnprintf exists and is - # already POSIX compliant. - gl_cv_func_vasnprintf_posix=yes - fi + case "$gl_cv_func_printf_enomem" in + *yes) + if test $ac_cv_func_vasnprintf = yes; then + # vasnprintf exists and is + # already POSIX compliant. + gl_cv_func_vasnprintf_posix=yes + fi + ;; + esac ;; esac ;; @@ -81,6 +86,7 @@ gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM
--- a/m4/vasnprintf.m4 +++ b/m4/vasnprintf.m4 @@ -1,5 +1,5 @@ -# vasnprintf.m4 serial 23 -dnl Copyright (C) 2002-2004, 2006-2007 Free Software Foundation, Inc. +# vasnprintf.m4 serial 24 +dnl Copyright (C) 2002-2004, 2006-2008 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. @@ -166,6 +166,21 @@ esac ]) +# Extra prerequisites of lib/vasnprintf.c for supporting the '-' flag. +AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST], +[ + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) + case "$gl_cv_func_printf_flag_leftadjust" in + *yes) + ;; + *) + AC_DEFINE([NEED_PRINTF_FLAG_LEFTADJUST], 1, + [Define if the vasnprintf implementation needs special code for the + '-' flag.]) + ;; + esac +]) + # Extra prerequisites of lib/vasnprintf.c for supporting the 0 flag. AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_ZERO], [ @@ -234,6 +249,7 @@ gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM
--- a/m4/vasprintf-posix.m4 +++ b/m4/vasprintf-posix.m4 @@ -1,5 +1,5 @@ -# vasprintf-posix.m4 serial 10 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# vasprintf-posix.m4 serial 11 +dnl Copyright (C) 2007-2008 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. @@ -16,6 +16,7 @@ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) @@ -39,17 +40,21 @@ *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) - case "$gl_cv_func_printf_flag_zero" in + case "$gl_cv_func_printf_flag_leftadjust" in *yes) - case "$gl_cv_func_printf_precision" in + case "$gl_cv_func_printf_flag_zero" in *yes) - case "$gl_cv_func_printf_enomem" in + case "$gl_cv_func_printf_precision" in *yes) - if test $ac_cv_func_vasprintf = yes; then - # vasprintf exists and is - # already POSIX compliant. - gl_cv_func_vasprintf_posix=yes - fi + case "$gl_cv_func_printf_enomem" in + *yes) + if test $ac_cv_func_vasprintf = yes; then + # vasprintf exists and is + # already POSIX compliant. + gl_cv_func_vasprintf_posix=yes + fi + ;; + esac ;; esac ;; @@ -81,6 +86,7 @@ gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM
--- a/m4/vfprintf-posix.m4 +++ b/m4/vfprintf-posix.m4 @@ -1,5 +1,5 @@ -# vfprintf-posix.m4 serial 9 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# vfprintf-posix.m4 serial 10 +dnl Copyright (C) 2007-2008 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. @@ -16,6 +16,7 @@ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) @@ -38,15 +39,19 @@ *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) - case "$gl_cv_func_printf_flag_zero" in + case "$gl_cv_func_printf_flag_leftadjust" in *yes) - case "$gl_cv_func_printf_precision" in + case "$gl_cv_func_printf_flag_zero" in *yes) - case "$gl_cv_func_printf_enomem" in + case "$gl_cv_func_printf_precision" in *yes) - # vfprintf exists and is - # already POSIX compliant. - gl_cv_func_vfprintf_posix=yes + case "$gl_cv_func_printf_enomem" in + *yes) + # vfprintf exists and is + # already POSIX compliant. + gl_cv_func_vfprintf_posix=yes + ;; + esac ;; esac ;; @@ -78,6 +83,7 @@ gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM
--- a/m4/vsnprintf-posix.m4 +++ b/m4/vsnprintf-posix.m4 @@ -1,5 +1,5 @@ -# vsnprintf-posix.m4 serial 10 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# vsnprintf-posix.m4 serial 11 +dnl Copyright (C) 2007-2008 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. @@ -16,6 +16,7 @@ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) @@ -45,23 +46,27 @@ *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) - case "$gl_cv_func_printf_flag_zero" in + case "$gl_cv_func_printf_flag_leftadjust" in *yes) - case "$gl_cv_func_printf_precision" in + case "$gl_cv_func_printf_flag_zero" in *yes) - case "$gl_cv_func_printf_enomem" in + case "$gl_cv_func_printf_precision" in *yes) - case "$gl_cv_func_snprintf_truncation_c99" in + case "$gl_cv_func_printf_enomem" in *yes) - case "$gl_cv_func_snprintf_retval_c99" in + case "$gl_cv_func_snprintf_truncation_c99" in *yes) - case "$gl_cv_func_snprintf_directive_n" in + case "$gl_cv_func_snprintf_retval_c99" in *yes) - case "$gl_cv_func_vsnprintf_zerosize_c99" in + case "$gl_cv_func_snprintf_directive_n" in *yes) - # vsnprintf exists and is - # already POSIX compliant. - gl_cv_func_vsnprintf_posix=yes + case "$gl_cv_func_vsnprintf_zerosize_c99" in + *yes) + # vsnprintf exists and is + # already POSIX compliant. + gl_cv_func_vsnprintf_posix=yes + ;; + esac ;; esac ;; @@ -102,6 +107,7 @@ gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM
--- a/m4/vsprintf-posix.m4 +++ b/m4/vsprintf-posix.m4 @@ -1,5 +1,5 @@ -# vsprintf-posix.m4 serial 9 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# vsprintf-posix.m4 serial 10 +dnl Copyright (C) 2007-2008 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. @@ -16,6 +16,7 @@ AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) AC_REQUIRE([gl_PRINTF_POSITIONS]) AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) @@ -38,15 +39,19 @@ *yes) case "$gl_cv_func_printf_flag_grouping" in *yes) - case "$gl_cv_func_printf_flag_zero" in + case "$gl_cv_func_printf_flag_leftadjust" in *yes) - case "$gl_cv_func_printf_precision" in + case "$gl_cv_func_printf_flag_zero" in *yes) - case "$gl_cv_func_printf_enomem" in + case "$gl_cv_func_printf_precision" in *yes) - # vsprintf exists and is - # already POSIX compliant. - gl_cv_func_vsprintf_posix=yes + case "$gl_cv_func_printf_enomem" in + *yes) + # vsprintf exists and is + # already POSIX compliant. + gl_cv_func_vsprintf_posix=yes + ;; + esac ;; esac ;; @@ -78,6 +83,7 @@ gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_PREREQ_VASNPRINTF_DIRECTIVE_F gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST gl_PREREQ_VASNPRINTF_FLAG_ZERO gl_PREREQ_VASNPRINTF_PRECISION gl_PREREQ_VASNPRINTF_ENOMEM
--- a/tests/test-snprintf-posix.h +++ b/tests/test-snprintf-posix.h @@ -1,5 +1,5 @@ /* Test of POSIX compatible vsnprintf() and snprintf() functions. - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007-2008 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -2786,6 +2786,32 @@ ASSERT (retval == strlen (result)); } + /* Test the support of the left-adjust flag. */ + + { + char result[100]; + int retval = + my_snprintf (result, sizeof (result), "a%*sc", -3, "b"); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (retval == strlen (result)); + } + + { + char result[100]; + int retval = + my_snprintf (result, sizeof (result), "a%-*sc", 3, "b"); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (retval == strlen (result)); + } + + { + char result[100]; + int retval = + my_snprintf (result, sizeof (result), "a%-*sc", -3, "b"); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (retval == strlen (result)); + } + /* Test the support of large precision. */ {
--- a/tests/test-sprintf-posix.h +++ b/tests/test-sprintf-posix.h @@ -1,5 +1,5 @@ /* Test of POSIX compatible vsprintf() and sprintf() functions. - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007-2008 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -2760,6 +2760,32 @@ ASSERT (retval == strlen (result)); } + /* Test the support of the left-adjust flag. */ + + { + char result[1000]; + int retval = + my_sprintf (result, "a%*sc", -3, "b"); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (retval == strlen (result)); + } + + { + char result[1000]; + int retval = + my_sprintf (result, "a%-*sc", 3, "b"); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (retval == strlen (result)); + } + + { + char result[1000]; + int retval = + my_sprintf (result, "a%-*sc", -3, "b"); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (retval == strlen (result)); + } + /* Test the support of large precision. */ {
--- a/tests/test-vasnprintf-posix.c +++ b/tests/test-vasnprintf-posix.c @@ -1,5 +1,5 @@ /* Test of POSIX compatible vasnprintf() and asnprintf() functions. - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007-2008 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -3253,6 +3253,38 @@ free (result); } + /* Test the support of the left-adjust flag. */ + + { + size_t length; + char *result = + my_asnprintf (NULL, &length, "a%*sc", -3, "b"); + ASSERT (result != NULL); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (length == strlen (result)); + free (result); + } + + { + size_t length; + char *result = + my_asnprintf (NULL, &length, "a%-*sc", 3, "b"); + ASSERT (result != NULL); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (length == strlen (result)); + free (result); + } + + { + size_t length; + char *result = + my_asnprintf (NULL, &length, "a%-*sc", -3, "b"); + ASSERT (result != NULL); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (length == strlen (result)); + free (result); + } + /* Test the support of large precision. */ {
--- a/tests/test-vasprintf-posix.c +++ b/tests/test-vasprintf-posix.c @@ -1,5 +1,5 @@ /* Test of POSIX compatible vasprintf() and asprintf() functions. - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007-2008 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -3234,6 +3234,38 @@ free (result); } + /* Test the support of the left-adjust flag. */ + + { + char *result; + int retval = + my_asprintf (&result, "a%*sc", -3, "b"); + ASSERT (result != NULL); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (retval == strlen (result)); + free (result); + } + + { + char *result; + int retval = + my_asprintf (&result, "a%-*sc", 3, "b"); + ASSERT (result != NULL); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (retval == strlen (result)); + free (result); + } + + { + char *result; + int retval = + my_asprintf (&result, "a%-*sc", -3, "b"); + ASSERT (result != NULL); + ASSERT (strcmp (result, "ab c") == 0); + ASSERT (retval == strlen (result)); + free (result); + } + /* Test the support of large precision. */ {