diff options
author | Bruno Haible <bruno@clisp.org> | 2023-04-28 01:12:16 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2023-04-28 01:12:16 +0200 |
commit | efb17ec15925db925088e801920a3df17b11ac49 (patch) | |
tree | 10c5fc1d895d3737c340d67b8db3d2b366727e7d /m4 | |
parent | fedd186a0b85045d2a1446abbb17eb9151bf0e11 (diff) | |
download | gnulib-efb17ec15925db925088e801920a3df17b11ac49.tar.gz |
localeconv: Work around a mingw bug.
* m4/localeconv.m4 (gl_FUNC_LOCALECONV): Test whether fields of type
'char' are filled correctly.
(gl_PREREQ_LOCALECONV): Test whether 'struct lconv' has the int_{p,n}_*
members.
* lib/localeconv.c (FIX_CHAR_VALUE): New macro.
(localeconv): Replace negative field values with CHAR_MAX.
* doc/posix-functions/localeconv.texi: Mention the mingw bug.
Diffstat (limited to 'm4')
-rw-r--r-- | m4/localeconv.m4 | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/m4/localeconv.m4 b/m4/localeconv.m4 index ae225fed66..374dcbf54f 100644 --- a/m4/localeconv.m4 +++ b/m4/localeconv.m4 @@ -1,4 +1,4 @@ -# localeconv.m4 serial 1 +# localeconv.m4 serial 2 dnl Copyright (C) 2012-2023 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -8,10 +8,45 @@ AC_DEFUN([gl_FUNC_LOCALECONV], [ AC_REQUIRE([gl_LOCALE_H_DEFAULTS]) AC_REQUIRE([gl_LOCALE_H]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles if test $REPLACE_STRUCT_LCONV = 1; then REPLACE_LOCALECONV=1 fi + if test $REPLACE_LOCALECONV = 0; then + dnl Test whether fields of type 'char' are filled correctly. + dnl This test fails on mingw 5.0.3. + AC_CACHE_CHECK([whether localeconv works], + [gl_cv_func_localeconv_works], + [AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ + #include <locale.h> + #include <limits.h> + int main () + { + struct lconv *l = localeconv (); + return l->frac_digits != CHAR_MAX && l->frac_digits < 0; + } + ]])], + [gl_cv_func_localeconv_works=yes], + [gl_cv_func_localeconv_works=no], + [case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_localeconv_works="guessing yes" ;; + # Guess yes on musl systems. + *-musl* | midipix*) gl_cv_func_localeconv_works="guessing yes" ;; + # Guess no on native Windows. + mingw*) gl_cv_func_localeconv_works="guessing no" ;; + # If we don't know, obey --enable-cross-guesses. + *) gl_cv_func_localeconv_works="$gl_cross_guess_normal" ;; + esac + ]) + ]) + case "$gl_cv_func_localeconv_works" in + *yes) ;; + *) REPLACE_LOCALECONV=1 ;; + esac + fi ]) # Prerequisites of lib/localeconv.c. @@ -19,4 +54,6 @@ AC_DEFUN([gl_PREREQ_LOCALECONV], [ AC_CHECK_MEMBERS([struct lconv.decimal_point], [], [], [[#include <locale.h>]]) + AC_CHECK_MEMBERS([struct lconv.int_p_cs_precedes], [], [], + [[#include <locale.h>]]) ]) |