1 #include "newlib.h"
2 #include "setlocale.h"
3 
4 struct lconv *
__localeconv_l(struct __locale_t * locale)5 __localeconv_l (struct __locale_t *locale)
6 {
7   struct lconv *lconv = &locale->lconv;
8   if (locale == __get_C_locale ())
9     return lconv;
10 
11 #ifdef __HAVE_LOCALE_INFO__
12   const struct lc_numeric_T *n = __get_numeric_locale (locale);
13   const struct lc_monetary_T *m = __get_monetary_locale (locale);
14 
15   lconv->decimal_point = (char *) n->decimal_point;
16   lconv->thousands_sep = (char *) n->thousands_sep;
17   lconv->grouping = (char *) n->grouping;
18   lconv->int_curr_symbol = (char *) m->int_curr_symbol;
19   lconv->currency_symbol = (char *) m->currency_symbol;
20   lconv->mon_decimal_point = (char *) m->mon_decimal_point;
21   lconv->mon_thousands_sep = (char *) m->mon_thousands_sep;
22   lconv->mon_grouping = (char *) m->mon_grouping;
23   lconv->positive_sign = (char *) m->positive_sign;
24   lconv->negative_sign = (char *) m->negative_sign;
25   lconv->int_frac_digits = m->int_frac_digits[0];
26   lconv->frac_digits = m->frac_digits[0];
27   lconv->p_cs_precedes = m->p_cs_precedes[0];
28   lconv->p_sep_by_space = m->p_sep_by_space[0];
29   lconv->n_cs_precedes = m->n_cs_precedes[0];
30   lconv->n_sep_by_space = m->n_sep_by_space[0];
31   lconv->p_sign_posn = m->p_sign_posn[0];
32   lconv->n_sign_posn = m->n_sign_posn[0];
33 #ifdef __HAVE_LOCALE_INFO_EXTENDED__
34   lconv->int_p_cs_precedes = m->int_p_cs_precedes[0];
35   lconv->int_p_sep_by_space = m->int_p_sep_by_space[0];
36   lconv->int_n_cs_precedes = m->int_n_cs_precedes[0];
37   lconv->int_n_sep_by_space = m->int_n_sep_by_space[0];
38   lconv->int_n_sign_posn = m->int_n_sign_posn[0];
39   lconv->int_p_sign_posn = m->int_p_sign_posn[0];
40 #else /* !__HAVE_LOCALE_INFO_EXTENDED__ */
41   lconv->int_p_cs_precedes = m->p_cs_precedes[0];
42   lconv->int_p_sep_by_space = m->p_sep_by_space[0];
43   lconv->int_n_cs_precedes = m->n_cs_precedes[0];
44   lconv->int_n_sep_by_space = m->n_sep_by_space[0];
45   lconv->int_n_sign_posn = m->n_sign_posn[0];
46   lconv->int_p_sign_posn = m->p_sign_posn[0];
47 #endif /* !__HAVE_LOCALE_INFO_EXTENDED__ */
48 #endif /* __HAVE_LOCALE_INFO__ */
49   return lconv;
50 }
51 
52 struct lconv *
localeconv(void)53 localeconv (void)
54 {
55   /* Note that we always fall back to the global locale, even in case
56      of specifying a reent.  Otherwise a call to _localeconv_r would just
57      crash if the reent locale pointer is NULL. */
58   return __localeconv_l (__get_current_locale ());
59 }
60