summaryrefslogtreecommitdiff
path: root/lib/localeconv.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/localeconv.c')
-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)
{