From 5b57d6d54bcc8b9339b6216e0d62e750ab6e2ef3 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Mon, 26 Mar 2007 02:15:46 +0000 Subject: [PATCH] Prefer nl_langinfo over localeconv. --- ChangeLog | 16 ++++++++++++++++ lib/vasnprintf.c | 25 +++++++++++++++++++++---- m4/fprintf-posix.m4 | 8 ++------ m4/snprintf-posix.m4 | 8 ++------ m4/sprintf-posix.m4 | 8 ++------ m4/vasnprintf-posix.m4 | 8 ++------ m4/vasnprintf.m4 | 14 +++++++++++++- m4/vasprintf-posix.m4 | 8 ++------ m4/vfprintf-posix.m4 | 8 ++------ m4/vsnprintf-posix.m4 | 8 ++------ m4/vsprintf-posix.m4 | 8 ++------ 11 files changed, 66 insertions(+), 53 deletions(-) diff --git a/ChangeLog b/ChangeLog index aeabcc00d..75d701e93 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,21 @@ 2007-03-25 Bruno Haible + * lib/vasnprintf.c: Include langinfo.h. + (VASNPRINTF): Prefer nl_langinfo over localeconv, since it's more + multithread-safe. + * m4/vasnprintf.m4 (gl_PREREQ_VASNPRINTF_DIRECTIVE_A): New macro. + * m4/fprintf-posix.m4 (gl_FUNC_FPRINTF_POSIX): Invoke it. + * 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. + Reported by Simon Josefsson. + +2007-03-25 Bruno Haible + * lib/printf-parse.c [!IN_LIBINTL]: Include , for intmax_t. (PRINTF_PARSE): Make the support for size specifier 'j' unconditional. * modules/vasnprintf (Depends-on): Add stdint. diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c index 75d33b347..ab82b2124 100644 --- a/lib/vasnprintf.c +++ b/lib/vasnprintf.c @@ -41,6 +41,9 @@ #include /* errno */ #include /* CHAR_BIT */ #include /* DBL_MAX_EXP, LDBL_MAX_EXP */ +#if HAVE_NL_LANGINFO +# include +#endif #if WIDE_CHAR_VERSION # include "wprintf-parse.h" #else @@ -507,8 +510,15 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar if ((flags & FLAG_ALT) || mantissa > 0.0L || precision > 0) { - const char *point = - localeconv () -> decimal_point; + const char *point; + /* Prefer nl_langinfo() over localeconv(), + since the latter is not multithread- + safe. */ +# if HAVE_NL_LANGINFO + point = nl_langinfo (RADIXCHAR); +# else + point = localeconv () -> decimal_point; +# endif /* The decimal point is always a single byte: either '.' or ','. */ *p++ = (point[0] != '\0' ? point[0] : '.'); @@ -657,8 +667,15 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar if ((flags & FLAG_ALT) || mantissa > 0.0 || precision > 0) { - const char *point = - localeconv () -> decimal_point; + const char *point; + /* Prefer nl_langinfo() over localeconv(), + since the latter is not multithread- + safe. */ +# if HAVE_NL_LANGINFO + point = nl_langinfo (RADIXCHAR); +# else + point = localeconv () -> decimal_point; +# endif /* The decimal point is always a single byte: either '.' or ','. */ *p++ = (point[0] != '\0' ? point[0] : '.'); diff --git a/m4/fprintf-posix.m4 b/m4/fprintf-posix.m4 index 60e519d60..5566deccf 100644 --- a/m4/fprintf-posix.m4 +++ b/m4/fprintf-posix.m4 @@ -1,4 +1,4 @@ -# fprintf-posix.m4 serial 1 +# fprintf-posix.m4 serial 2 dnl Copyright (C) 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, @@ -31,11 +31,7 @@ AC_DEFUN([gl_FUNC_FPRINTF_POSIX], ;; esac if test $gl_cv_func_fprintf_posix = no; then - if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then - AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, - [Define if the vasnprintf implementation needs special code for - the 'a' and 'A' directives.]) - fi + gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_REPLACE_VASNPRINTF gl_REPLACE_FPRINTF fi diff --git a/m4/snprintf-posix.m4 b/m4/snprintf-posix.m4 index d1f889ed8..7b9e73b4c 100644 --- a/m4/snprintf-posix.m4 +++ b/m4/snprintf-posix.m4 @@ -1,4 +1,4 @@ -# snprintf-posix.m4 serial 1 +# snprintf-posix.m4 serial 2 dnl Copyright (C) 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, @@ -50,11 +50,7 @@ AC_DEFUN([gl_FUNC_SNPRINTF_POSIX], esac fi if test $gl_cv_func_snprintf_posix = no; then - if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then - AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, - [Define if the vasnprintf implementation needs special code for - the 'a' and 'A' directives.]) - fi + gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_REPLACE_VASNPRINTF gl_REPLACE_SNPRINTF fi diff --git a/m4/sprintf-posix.m4 b/m4/sprintf-posix.m4 index 99321940f..5e6c3961b 100644 --- a/m4/sprintf-posix.m4 +++ b/m4/sprintf-posix.m4 @@ -1,4 +1,4 @@ -# sprintf-posix.m4 serial 1 +# sprintf-posix.m4 serial 2 dnl Copyright (C) 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, @@ -31,11 +31,7 @@ AC_DEFUN([gl_FUNC_SPRINTF_POSIX], ;; esac if test $gl_cv_func_sprintf_posix = no; then - if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then - AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, - [Define if the vasnprintf implementation needs special code for - the 'a' and 'A' directives.]) - fi + gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_REPLACE_VASNPRINTF gl_REPLACE_SPRINTF fi diff --git a/m4/vasnprintf-posix.m4 b/m4/vasnprintf-posix.m4 index ea282a1bb..8c3d9779e 100644 --- a/m4/vasnprintf-posix.m4 +++ b/m4/vasnprintf-posix.m4 @@ -1,4 +1,4 @@ -# vasnprintf-posix.m4 serial 2 +# vasnprintf-posix.m4 serial 3 dnl Copyright (C) 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, @@ -34,11 +34,7 @@ AC_DEFUN([gl_FUNC_VASNPRINTF_POSIX], ;; esac if test $gl_cv_func_vasnprintf_posix = no; then - if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then - AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, - [Define if the vasnprintf implementation needs special code for - the 'a' and 'A' directives.]) - fi + gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_REPLACE_VASNPRINTF fi ]) diff --git a/m4/vasnprintf.m4 b/m4/vasnprintf.m4 index 5aa05bc61..a225c1c47 100644 --- a/m4/vasnprintf.m4 +++ b/m4/vasnprintf.m4 @@ -1,4 +1,4 @@ -# vasnprintf.m4 serial 9 +# vasnprintf.m4 serial 10 dnl Copyright (C) 2002-2004, 2006-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, @@ -62,6 +62,18 @@ AC_DEFUN([gl_PREREQ_VASNPRINTF], AC_CHECK_FUNCS(snprintf wcslen) ]) +# Extra prerequisites of lib/vasnprintf.c for supporting the 'a' directive. +AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_A], +[ + AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) + if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then + AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, + [Define if the vasnprintf implementation needs special code for + the 'a' and 'A' directives.]) + AC_CHECK_FUNCS([nl_langinfo]) + fi +]) + # Prerequisites of lib/asnprintf.c. AC_DEFUN([gl_PREREQ_ASNPRINTF], [ diff --git a/m4/vasprintf-posix.m4 b/m4/vasprintf-posix.m4 index 079ac768b..7ab9ab6ee 100644 --- a/m4/vasprintf-posix.m4 +++ b/m4/vasprintf-posix.m4 @@ -1,4 +1,4 @@ -# vasprintf-posix.m4 serial 2 +# vasprintf-posix.m4 serial 3 dnl Copyright (C) 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, @@ -34,11 +34,7 @@ AC_DEFUN([gl_FUNC_VASPRINTF_POSIX], ;; esac if test $gl_cv_func_vasprintf_posix = no; then - if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then - AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, - [Define if the vasnprintf implementation needs special code for - the 'a' and 'A' directives.]) - fi + gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_REPLACE_VASNPRINTF gl_REPLACE_VASPRINTF fi diff --git a/m4/vfprintf-posix.m4 b/m4/vfprintf-posix.m4 index 11cbfda42..9b4178786 100644 --- a/m4/vfprintf-posix.m4 +++ b/m4/vfprintf-posix.m4 @@ -1,4 +1,4 @@ -# vfprintf-posix.m4 serial 1 +# vfprintf-posix.m4 serial 2 dnl Copyright (C) 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, @@ -31,11 +31,7 @@ AC_DEFUN([gl_FUNC_VFPRINTF_POSIX], ;; esac if test $gl_cv_func_vfprintf_posix = no; then - if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then - AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, - [Define if the vasnprintf implementation needs special code for - the 'a' and 'A' directives.]) - fi + gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_REPLACE_VASNPRINTF gl_REPLACE_VFPRINTF fi diff --git a/m4/vsnprintf-posix.m4 b/m4/vsnprintf-posix.m4 index c90ad8ef2..f776da066 100644 --- a/m4/vsnprintf-posix.m4 +++ b/m4/vsnprintf-posix.m4 @@ -1,4 +1,4 @@ -# vsnprintf-posix.m4 serial 1 +# vsnprintf-posix.m4 serial 2 dnl Copyright (C) 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, @@ -51,11 +51,7 @@ AC_DEFUN([gl_FUNC_VSNPRINTF_POSIX], esac fi if test $gl_cv_func_vsnprintf_posix = no; then - if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then - AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, - [Define if the vasnprintf implementation needs special code for - the 'a' and 'A' directives.]) - fi + gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_REPLACE_VASNPRINTF gl_REPLACE_VSNPRINTF fi diff --git a/m4/vsprintf-posix.m4 b/m4/vsprintf-posix.m4 index ef5d2e8a1..f0b7ba93e 100644 --- a/m4/vsprintf-posix.m4 +++ b/m4/vsprintf-posix.m4 @@ -1,4 +1,4 @@ -# vsprintf-posix.m4 serial 1 +# vsprintf-posix.m4 serial 2 dnl Copyright (C) 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, @@ -31,11 +31,7 @@ AC_DEFUN([gl_FUNC_VSPRINTF_POSIX], ;; esac if test $gl_cv_func_vsprintf_posix = no; then - if ! expr "$gl_cv_func_printf_directive_a" : ".*yes" > /dev/null; then - AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, - [Define if the vasnprintf implementation needs special code for - the 'a' and 'A' directives.]) - fi + gl_PREREQ_VASNPRINTF_DIRECTIVE_A gl_REPLACE_VASNPRINTF gl_REPLACE_VSPRINTF fi -- 2.11.0