summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2023-04-28 01:12:16 +0200
committerBruno Haible <bruno@clisp.org>2023-04-28 01:12:16 +0200
commitefb17ec15925db925088e801920a3df17b11ac49 (patch)
tree10c5fc1d895d3737c340d67b8db3d2b366727e7d /lib
parentfedd186a0b85045d2a1446abbb17eb9151bf0e11 (diff)
downloadgnulib-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.c45
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)
{