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 /lib | |
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 'lib')
-rw-r--r-- | lib/localeconv.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/lib/localeconv.c b/lib/localeconv.c index 60c050f486..c1a34baa05 100644 --- a/lib/localeconv.c +++ b/lib/localeconv.c @@ -19,10 +19,14 @@ /* Specification. */ #include <locale.h> +#include <limits.h> + #if HAVE_STRUCT_LCONV_DECIMAL_POINT +# define FIX_CHAR_VALUE(x) ((x) >= 0 ? (x) : CHAR_MAX) + /* Override for platforms where 'struct lconv' lacks the int_p_*, int_n_* - members. */ + members or where fields of type 'char' are set to -1 instead of CHAR_MAX. */ struct lconv * localeconv (void) @@ -41,21 +45,30 @@ localeconv (void) result.positive_sign = sys_result->positive_sign; result.negative_sign = sys_result->negative_sign; result.currency_symbol = sys_result->currency_symbol; - result.frac_digits = sys_result->frac_digits; - result.p_cs_precedes = sys_result->p_cs_precedes; - result.p_sign_posn = sys_result->p_sign_posn; - result.p_sep_by_space = sys_result->p_sep_by_space; - result.n_cs_precedes = sys_result->n_cs_precedes; - result.n_sign_posn = sys_result->n_sign_posn; - result.n_sep_by_space = sys_result->n_sep_by_space; + result.frac_digits = FIX_CHAR_VALUE (sys_result->frac_digits); + result.p_cs_precedes = FIX_CHAR_VALUE (sys_result->p_cs_precedes); + result.p_sign_posn = FIX_CHAR_VALUE (sys_result->p_sign_posn); + result.p_sep_by_space = FIX_CHAR_VALUE (sys_result->p_sep_by_space); + result.n_cs_precedes = FIX_CHAR_VALUE (sys_result->n_cs_precedes); + result.n_sign_posn = FIX_CHAR_VALUE (sys_result->n_sign_posn); + result.n_sep_by_space = FIX_CHAR_VALUE (sys_result->n_sep_by_space); result.int_curr_symbol = sys_result->int_curr_symbol; - result.int_frac_digits = sys_result->int_frac_digits; - result.int_p_cs_precedes = sys_result->p_cs_precedes; - result.int_p_sign_posn = sys_result->p_sign_posn; - result.int_p_sep_by_space = sys_result->p_sep_by_space; - result.int_n_cs_precedes = sys_result->n_cs_precedes; - result.int_n_sign_posn = sys_result->n_sign_posn; - result.int_n_sep_by_space = sys_result->n_sep_by_space; + result.int_frac_digits = FIX_CHAR_VALUE (sys_result->int_frac_digits); +# if HAVE_STRUCT_LCONV_INT_P_CS_PRECEDES + result.int_p_cs_precedes = FIX_CHAR_VALUE (sys_result->int_p_cs_precedes); + result.int_p_sign_posn = FIX_CHAR_VALUE (sys_result->int_p_sign_posn); + result.int_p_sep_by_space = FIX_CHAR_VALUE (sys_result->int_p_sep_by_space); + result.int_n_cs_precedes = FIX_CHAR_VALUE (sys_result->int_n_cs_precedes); + result.int_n_sign_posn = FIX_CHAR_VALUE (sys_result->int_n_sign_posn); + result.int_n_sep_by_space = FIX_CHAR_VALUE (sys_result->int_n_sep_by_space); +# else + result.int_p_cs_precedes = FIX_CHAR_VALUE (sys_result->p_cs_precedes); + result.int_p_sign_posn = FIX_CHAR_VALUE (sys_result->p_sign_posn); + result.int_p_sep_by_space = FIX_CHAR_VALUE (sys_result->p_sep_by_space); + result.int_n_cs_precedes = FIX_CHAR_VALUE (sys_result->n_cs_precedes); + result.int_n_sign_posn = FIX_CHAR_VALUE (sys_result->n_sign_posn); + result.int_n_sep_by_space = FIX_CHAR_VALUE (sys_result->n_sep_by_space); +# endif return &result; } @@ -64,8 +77,6 @@ localeconv (void) /* Override for platforms where 'struct lconv' is a dummy. */ -# include <limits.h> - struct lconv * localeconv (void) { |