summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--newlib/libc/locale/locale.c14
-rw-r--r--newlib/libc/locale/localeconv.c92
-rw-r--r--newlib/libc/locale/setlocale.h3
3 files changed, 63 insertions, 46 deletions
diff --git a/newlib/libc/locale/locale.c b/newlib/libc/locale/locale.c
index 583e3e2cb..6f7e90870 100644
--- a/newlib/libc/locale/locale.c
+++ b/newlib/libc/locale/locale.c
@@ -223,6 +223,13 @@ const struct __locale_t __C_locale =
__ascii_mbtowc,
0,
NULL,
+ {
+ ".", "", "", "", "", "", "", "", "", "",
+ CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
+ CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
+ CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
+ CHAR_MAX, CHAR_MAX
+ },
#ifndef __HAVE_LOCALE_INFO__
"\1",
"ASCII",
@@ -256,6 +263,13 @@ struct __locale_t __global_locale =
#endif
0,
NULL,
+ {
+ ".", "", "", "", "", "", "", "", "", "",
+ CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
+ CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
+ CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
+ CHAR_MAX, CHAR_MAX
+ },
#ifndef __HAVE_LOCALE_INFO__
"\1",
"ASCII",
diff --git a/newlib/libc/locale/localeconv.c b/newlib/libc/locale/localeconv.c
index 14151733c..623181cf4 100644
--- a/newlib/libc/locale/localeconv.c
+++ b/newlib/libc/locale/localeconv.c
@@ -2,65 +2,65 @@
#include <reent.h>
#include "setlocale.h"
-static
-struct lconv lconv =
-{
- ".", "", "", "", "", "", "", "", "", "",
- CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
- CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
- CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
- CHAR_MAX, CHAR_MAX
-};
-
struct lconv *
-_DEFUN (_localeconv_r, (data),
- struct _reent *data)
+__localeconv_l (struct __locale_t *locale)
{
#ifdef __HAVE_LOCALE_INFO__
- const struct lc_numeric_T *n = __get_current_numeric_locale ();
- const struct lc_monetary_T *m = __get_current_monetary_locale ();
+ struct lconv *lconv = &locale->lconv;
+ const struct lc_numeric_T *n = __get_numeric_locale (locale);
+ const struct lc_monetary_T *m = __get_monetary_locale (locale);
- lconv.decimal_point = (char *) n->decimal_point;
- lconv.thousands_sep = (char *) n->thousands_sep;
- lconv.grouping = (char *) n->grouping;
- lconv.int_curr_symbol = (char *) m->int_curr_symbol;
- lconv.currency_symbol = (char *) m->currency_symbol;
- lconv.mon_decimal_point = (char *) m->mon_decimal_point;
- lconv.mon_thousands_sep = (char *) m->mon_thousands_sep;
- lconv.mon_grouping = (char *) m->mon_grouping;
- lconv.positive_sign = (char *) m->positive_sign;
- lconv.negative_sign = (char *) m->negative_sign;
- lconv.int_frac_digits = m->int_frac_digits[0];
- lconv.frac_digits = m->frac_digits[0];
- lconv.p_cs_precedes = m->p_cs_precedes[0];
- lconv.p_sep_by_space = m->p_sep_by_space[0];
- lconv.n_cs_precedes = m->n_cs_precedes[0];
- lconv.n_sep_by_space = m->n_sep_by_space[0];
- lconv.p_sign_posn = m->p_sign_posn[0];
- lconv.n_sign_posn = m->n_sign_posn[0];
+ lconv->decimal_point = (char *) n->decimal_point;
+ lconv->thousands_sep = (char *) n->thousands_sep;
+ lconv->grouping = (char *) n->grouping;
+ lconv->int_curr_symbol = (char *) m->int_curr_symbol;
+ lconv->currency_symbol = (char *) m->currency_symbol;
+ lconv->mon_decimal_point = (char *) m->mon_decimal_point;
+ lconv->mon_thousands_sep = (char *) m->mon_thousands_sep;
+ lconv->mon_grouping = (char *) m->mon_grouping;
+ lconv->positive_sign = (char *) m->positive_sign;
+ lconv->negative_sign = (char *) m->negative_sign;
+ lconv->int_frac_digits = m->int_frac_digits[0];
+ lconv->frac_digits = m->frac_digits[0];
+ lconv->p_cs_precedes = m->p_cs_precedes[0];
+ lconv->p_sep_by_space = m->p_sep_by_space[0];
+ lconv->n_cs_precedes = m->n_cs_precedes[0];
+ lconv->n_sep_by_space = m->n_sep_by_space[0];
+ lconv->p_sign_posn = m->p_sign_posn[0];
+ lconv->n_sign_posn = m->n_sign_posn[0];
#ifdef __HAVE_LOCALE_INFO_EXTENDED__
- lconv.int_p_cs_precedes = m->int_p_cs_precedes[0];
- lconv.int_p_sep_by_space = m->int_p_sep_by_space[0];
- lconv.int_n_cs_precedes = m->int_n_cs_precedes[0];
- lconv.int_n_sep_by_space = m->int_n_sep_by_space[0];
- lconv.int_n_sign_posn = m->int_n_sign_posn[0];
- lconv.int_p_sign_posn = m->int_p_sign_posn[0];
+ lconv->int_p_cs_precedes = m->int_p_cs_precedes[0];
+ lconv->int_p_sep_by_space = m->int_p_sep_by_space[0];
+ lconv->int_n_cs_precedes = m->int_n_cs_precedes[0];
+ lconv->int_n_sep_by_space = m->int_n_sep_by_space[0];
+ lconv->int_n_sign_posn = m->int_n_sign_posn[0];
+ lconv->int_p_sign_posn = m->int_p_sign_posn[0];
#else /* !__HAVE_LOCALE_INFO_EXTENDED__ */
- lconv.int_p_cs_precedes = m->p_cs_precedes[0];
- lconv.int_p_sep_by_space = m->p_sep_by_space[0];
- lconv.int_n_cs_precedes = m->n_cs_precedes[0];
- lconv.int_n_sep_by_space = m->n_sep_by_space[0];
- lconv.int_n_sign_posn = m->n_sign_posn[0];
- lconv.int_p_sign_posn = m->p_sign_posn[0];
+ lconv->int_p_cs_precedes = m->p_cs_precedes[0];
+ lconv->int_p_sep_by_space = m->p_sep_by_space[0];
+ lconv->int_n_cs_precedes = m->n_cs_precedes[0];
+ lconv->int_n_sep_by_space = m->n_sep_by_space[0];
+ lconv->int_n_sign_posn = m->n_sign_posn[0];
+ lconv->int_p_sign_posn = m->p_sign_posn[0];
#endif /* !__HAVE_LOCALE_INFO_EXTENDED__ */
#endif /* __HAVE_LOCALE_INFO__ */
- return (struct lconv *) &lconv;
+ return lconv;
+}
+
+struct lconv *
+_DEFUN (_localeconv_r, (data),
+ struct _reent *data)
+{
+ /* Note that we always fall back to the global locale, even in case
+ of specifying a reent. Otherwise a call to _localeconv_r would just
+ crash if the reent locale pointer is NULL. */
+ return __localeconv_l (__get_current_locale ());
}
#ifndef _REENT_ONLY
struct lconv *
_DEFUN_VOID (localeconv)
{
- return _localeconv_r (_REENT);
+ return __localeconv_l (__get_current_locale ());
}
#endif
diff --git a/newlib/libc/locale/setlocale.h b/newlib/libc/locale/setlocale.h
index 8f5c93c9b..6885c3a7c 100644
--- a/newlib/libc/locale/setlocale.h
+++ b/newlib/libc/locale/setlocale.h
@@ -180,6 +180,7 @@ struct __locale_t
const char *, size_t, mbstate_t *);
int cjk_lang;
char *ctype_ptr; /* Unused in __global_locale */
+ struct lconv lconv;
#ifndef __HAVE_LOCALE_INFO__
char mb_cur_max[2];
char ctype_codeset[ENCODING_LEN + 1];
@@ -195,6 +196,8 @@ extern struct __locale_t __global_locale;
extern char *__loadlocale (struct __locale_t *, int, const char *);
extern const char *__get_locale_env(struct _reent *, int);
+extern struct lconv *__localeconv_l (struct __locale_t *locale);
+
/* In POSIX terms the global locale is the process-wide locale. Use this
function to always refer to the global locale. */
_ELIDABLE_INLINE struct __locale_t *