diff options
Diffstat (limited to 'newlib/libc/locale/localeconv.c')
-rw-r--r-- | newlib/libc/locale/localeconv.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/newlib/libc/locale/localeconv.c b/newlib/libc/locale/localeconv.c new file mode 100644 index 000000000..14151733c --- /dev/null +++ b/newlib/libc/locale/localeconv.c @@ -0,0 +1,66 @@ +#include "newlib.h" +#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) +{ +#ifdef __HAVE_LOCALE_INFO__ + const struct lc_numeric_T *n = __get_current_numeric_locale (); + const struct lc_monetary_T *m = __get_current_monetary_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]; +#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]; +#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]; +#endif /* !__HAVE_LOCALE_INFO_EXTENDED__ */ +#endif /* __HAVE_LOCALE_INFO__ */ + return (struct lconv *) &lconv; +} + +#ifndef _REENT_ONLY +struct lconv * +_DEFUN_VOID (localeconv) +{ + return _localeconv_r (_REENT); +} +#endif |