From f7beddb6d03f25560cbce2423ee9d2bcbbfed6e6 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 27 Feb 2009 02:14:00 +0100 Subject: [PATCH] Work around a *printf bug with %ls on Solaris. --- ChangeLog | 19 ++++++++++++++ doc/glibc-functions/obstack_printf.texi | 4 +++ doc/glibc-functions/obstack_vprintf.texi | 4 +++ doc/posix-functions/fprintf.texi | 4 +++ doc/posix-functions/printf.texi | 4 +++ doc/posix-functions/snprintf.texi | 4 +++ doc/posix-functions/sprintf.texi | 4 +++ doc/posix-functions/vfprintf.texi | 4 +++ doc/posix-functions/vprintf.texi | 4 +++ doc/posix-functions/vsnprintf.texi | 4 +++ doc/posix-functions/vsprintf.texi | 4 +++ m4/printf.m4 | 43 ++++++++++++++++++++++++-------- 12 files changed, 92 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index a34e3f835..583fa8f13 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,23 @@ 2009-02-26 Eric Blake + Bruno Haible + + Work around a *printf bug with %ls on Solaris. + * m4/printf.m4 (gl_PRINTF_DIRECTIVE_LS): Also test whether, when a + precision is specified, sprintf stops converting the wide string + argument when the number of bytes that have been produced by this + conversion equals or exceeds the precision. + * doc/posix-functions/fprintf.texi: Update. + * doc/posix-functions/printf.texi: Update. + * doc/posix-functions/snprintf.texi: Update. + * doc/posix-functions/sprintf.texi: Update. + * doc/posix-functions/vfprintf.texi: Update. + * doc/posix-functions/vprintf.texi: Update. + * doc/posix-functions/vsnprintf.texi: Update. + * doc/posix-functions/vsprintf.texi: Update. + * doc/glibc-functions/obstack_printf.texi: Update. + * doc/glibc-functions/obstack_vprintf.texi: Update. + +2009-02-26 Eric Blake stdlib: favor compiler check of random.h * m4/stdlib_h.m4 (gl_STDLIB_H): Skip preprocessor check. Needed diff --git a/doc/glibc-functions/obstack_printf.texi b/doc/glibc-functions/obstack_printf.texi index 83d4c6ce6..7a5726486 100644 --- a/doc/glibc-functions/obstack_printf.texi +++ b/doc/glibc-functions/obstack_printf.texi @@ -38,6 +38,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/doc/glibc-functions/obstack_vprintf.texi b/doc/glibc-functions/obstack_vprintf.texi index ef0d6f527..8556f74b7 100644 --- a/doc/glibc-functions/obstack_vprintf.texi +++ b/doc/glibc-functions/obstack_vprintf.texi @@ -38,6 +38,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/doc/posix-functions/fprintf.texi b/doc/posix-functions/fprintf.texi index 0af41ae87..0434e4422 100644 --- a/doc/posix-functions/fprintf.texi +++ b/doc/posix-functions/fprintf.texi @@ -32,6 +32,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/doc/posix-functions/printf.texi b/doc/posix-functions/printf.texi index da57b2105..1783ad226 100644 --- a/doc/posix-functions/printf.texi +++ b/doc/posix-functions/printf.texi @@ -32,6 +32,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/doc/posix-functions/snprintf.texi b/doc/posix-functions/snprintf.texi index a0ab770b0..d8ecbcccd 100644 --- a/doc/posix-functions/snprintf.texi +++ b/doc/posix-functions/snprintf.texi @@ -43,6 +43,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/doc/posix-functions/sprintf.texi b/doc/posix-functions/sprintf.texi index 756feec5f..003fb44b8 100644 --- a/doc/posix-functions/sprintf.texi +++ b/doc/posix-functions/sprintf.texi @@ -32,6 +32,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/doc/posix-functions/vfprintf.texi b/doc/posix-functions/vfprintf.texi index 90d9fa11d..37c2d11b1 100644 --- a/doc/posix-functions/vfprintf.texi +++ b/doc/posix-functions/vfprintf.texi @@ -32,6 +32,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/doc/posix-functions/vprintf.texi b/doc/posix-functions/vprintf.texi index f3462bc34..453117245 100644 --- a/doc/posix-functions/vprintf.texi +++ b/doc/posix-functions/vprintf.texi @@ -32,6 +32,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/doc/posix-functions/vsnprintf.texi b/doc/posix-functions/vsnprintf.texi index 294c6eafa..f09e0543a 100644 --- a/doc/posix-functions/vsnprintf.texi +++ b/doc/posix-functions/vsnprintf.texi @@ -43,6 +43,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/doc/posix-functions/vsprintf.texi b/doc/posix-functions/vsprintf.texi index beda4a8de..d477b4b3f 100644 --- a/doc/posix-functions/vsprintf.texi +++ b/doc/posix-functions/vsprintf.texi @@ -32,6 +32,10 @@ Cygwin 1.5.x, mingw, BeOS. This function does not support the @samp{ls} directive on some platforms: OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. @item +This function does not support precisions in the @samp{ls} directive correctly +on some platforms: +Solaris 10. +@item This function does not support format directives that access arguments in an arbitrary order, such as @code{"%2$s"}, on some platforms: NetBSD 3.0, mingw, BeOS. diff --git a/m4/printf.m4 b/m4/printf.m4 index f3e201b52..4207ace49 100644 --- a/m4/printf.m4 +++ b/m4/printf.m4 @@ -1,4 +1,4 @@ -# printf.m4 serial 30 +# printf.m4 serial 31 dnl Copyright (C) 2003, 2007-2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -626,7 +626,10 @@ changequote([,])dnl ]) dnl Test whether the *printf family of functions supports the %ls format -dnl directive. +dnl directive and in particular, when a precision is specified, whether +dnl the functions stop converting the wide string argument when the number +dnl of bytes that have been produced by this conversion equals or exceeds +dnl the precision. dnl Result is gl_cv_func_printf_directive_ls. AC_DEFUN([gl_PRINTF_DIRECTIVE_LS], @@ -646,19 +649,40 @@ AC_DEFUN([gl_PRINTF_DIRECTIVE_LS], #include #include #include -static wchar_t wstring[] = { 'a', 'b', 'c', 0 }; int main () { char buf[100]; - buf[0] = '\0'; - sprintf (buf, "%ls", wstring); - return strcmp (buf, "abc") != 0; + /* Test whether %ls works at all. + This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku. */ + { + static const wchar_t wstring[] = { 'a', 'b', 'c', 0 }; + buf[0] = '\0'; + if (sprintf (buf, "%ls", wstring) < 0 + || strcmp (buf, "abc") != 0) + return 1; + } + /* Test whether precisions in %ls are supported as specified in ISO C 99 + section 7.19.6.1: + "If a precision is specified, no more than that many bytes are written + (including shift sequences, if any), and the array shall contain a + null wide character if, to equal the multibyte character sequence + length given by the precision, the function would need to access a + wide character one past the end of the array." + This test fails on Solaris 10. */ + { + static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 }; + buf[0] = '\0'; + if (sprintf (buf, "%.2ls", wstring) < 0 + || strcmp (buf, "ab") != 0) + return 1; + } + return 0; }], [gl_cv_func_printf_directive_ls=yes], [gl_cv_func_printf_directive_ls=no], [ changequote(,)dnl case "$host_os" in openbsd*) gl_cv_func_printf_directive_ls="guessing no";; - solaris2.[1-6]*) gl_cv_func_printf_directive_ls="guessing no";; + solaris*) gl_cv_func_printf_directive_ls="guessing no";; irix*) gl_cv_func_printf_directive_ls="guessing no";; beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";; *) gl_cv_func_printf_directive_ls="guessing yes";; @@ -1362,9 +1386,8 @@ 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 7 ... 9 # . # # # # . . . . . # . . . . . . . . -dnl Solaris 2.6 # . # # # # . # . . . # . . . . . . . . +dnl Solaris 10 . . # # # . . # . . . # . . . . . . . . +dnl Solaris 2.6 ... 9 # . # # # # . # . . . # . . . . . . . . dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # # dnl AIX 5.2 . . # # # . . . . . . # . . . . . . . . dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . . . . . -- 2.11.0