diff options
Diffstat (limited to 'src/locale')
| -rw-r--r-- | src/locale/__get_locale.c | 13 | ||||
| -rw-r--r-- | src/locale/__load_locale.c | 64 | ||||
| -rw-r--r-- | src/locale/_locale.h | 5 | ||||
| -rw-r--r-- | src/locale/localeconv.c | 3 | ||||
| -rw-r--r-- | src/locale/setlocale.c | 3 |
5 files changed, 50 insertions, 38 deletions
diff --git a/src/locale/__get_locale.c b/src/locale/__get_locale.c new file mode 100644 index 00000000..4722175c --- /dev/null +++ b/src/locale/__get_locale.c @@ -0,0 +1,13 @@ +#include "locale.h" +#include "_locale.h" + +/* +This implementation only supports a single, global locale. A second +implementation will be needed for POSIX.1-2008 per-thread locales. +*/ + +struct __locale_t * __get_locale(void) +{ + static struct __locale_t l; + return &l; +} diff --git a/src/locale/__load_locale.c b/src/locale/__load_locale.c index d79bb4e4..deff64bb 100644 --- a/src/locale/__load_locale.c +++ b/src/locale/__load_locale.c @@ -110,40 +110,40 @@ char * __load_locale(struct __locale_t *loc, int mask, const char *name) strcpy(loc->monetary, name); if (localefile == NULL) { - loc->mn.mon_decimal_point = ""; - loc->mn.mon_thousands_sep = ""; - loc->mn.mon_grouping = ""; - loc->mn.positive_sign = ""; - loc->mn.negative_sign = ""; - loc->mn.currency_symbol = ""; - loc->mn.frac_digits = CHAR_MAX; - loc->mn.p_cs_precedes = CHAR_MAX; - loc->mn.n_cs_precedes = CHAR_MAX; - loc->mn.p_sep_by_space = CHAR_MAX; - loc->mn.n_sep_by_space = CHAR_MAX; - loc->mn.p_sign_posn = CHAR_MAX; - loc->mn.n_sign_posn = CHAR_MAX; - loc->mn.int_curr_symbol = ""; - loc->mn.int_frac_digits = CHAR_MAX; + loc->lconv.mon_decimal_point = ""; + loc->lconv.mon_thousands_sep = ""; + loc->lconv.mon_grouping = ""; + loc->lconv.positive_sign = ""; + loc->lconv.negative_sign = ""; + loc->lconv.currency_symbol = ""; + loc->lconv.frac_digits = CHAR_MAX; + loc->lconv.p_cs_precedes = CHAR_MAX; + loc->lconv.n_cs_precedes = CHAR_MAX; + loc->lconv.p_sep_by_space = CHAR_MAX; + loc->lconv.n_sep_by_space = CHAR_MAX; + loc->lconv.p_sign_posn = CHAR_MAX; + loc->lconv.n_sign_posn = CHAR_MAX; + loc->lconv.int_curr_symbol = ""; + loc->lconv.int_frac_digits = CHAR_MAX; #if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ - loc->mn.int_p_cs_precedes = CHAR_MAX; - loc->mn.int_n_cs_precedes = CHAR_MAX; - loc->mn.int_p_sep_by_space = CHAR_MAX; - loc->mn.int_n_sep_by_space = CHAR_MAX; - loc->mn.int_p_sign_posn = CHAR_MAX; - loc->mn.int_n_sign_posn = CHAR_MAX; + loc->lconv.int_p_cs_precedes = CHAR_MAX; + loc->lconv.int_n_cs_precedes = CHAR_MAX; + loc->lconv.int_p_sep_by_space = CHAR_MAX; + loc->lconv.int_n_sep_by_space = CHAR_MAX; + loc->lconv.int_p_sign_posn = CHAR_MAX; + loc->lconv.int_n_sign_posn = CHAR_MAX; #else - loc->mn.__int_p_cs_precedes = CHAR_MAX; - loc->mn.__int_n_cs_precedes = CHAR_MAX; - loc->mn.__int_p_sep_by_space = CHAR_MAX; - loc->mn.__int_n_sep_by_space = CHAR_MAX; - loc->mn.__int_p_sign_posn = CHAR_MAX; - loc->mn.__int_n_sign_posn = CHAR_MAX; + loc->lconv.__int_p_cs_precedes = CHAR_MAX; + loc->lconv.__int_n_cs_precedes = CHAR_MAX; + loc->lconv.__int_p_sep_by_space = CHAR_MAX; + loc->lconv.__int_n_sep_by_space = CHAR_MAX; + loc->lconv.__int_p_sign_posn = CHAR_MAX; + loc->lconv.__int_n_sign_posn = CHAR_MAX; #endif } else { /* - loc->mn.monetary fields; + loc->lconv.monetary fields; */ } } @@ -152,12 +152,12 @@ char * __load_locale(struct __locale_t *loc, int mask, const char *name) strcpy(loc->numeric, name); if (localefile == NULL) { - loc->mn.decimal_point = "."; - loc->mn.thousands_sep = ""; - loc->mn.grouping = ""; + loc->lconv.decimal_point = "."; + loc->lconv.thousands_sep = ""; + loc->lconv.grouping = ""; } else { /* - loc->mn.numeric fields + loc->lconv.numeric fields */ } } diff --git a/src/locale/_locale.h b/src/locale/_locale.h index bed7e0f5..8f974ef3 100644 --- a/src/locale/_locale.h +++ b/src/locale/_locale.h @@ -28,7 +28,7 @@ struct __locale_t { char monetary[UCHAR_MAX]; char numeric[UCHAR_MAX]; - struct lconv mn; + struct lconv lconv; char time[UCHAR_MAX]; struct { @@ -60,6 +60,7 @@ struct __locale_t { } lc_time; }; -char * __load_locale(struct __locale_t *, int, const char *); +char * __load_locale(struct __locale_t *loc, int mask, const char *name); +struct __locale_t * __get_locale(void); #endif diff --git a/src/locale/localeconv.c b/src/locale/localeconv.c index e63402e2..0021c13a 100644 --- a/src/locale/localeconv.c +++ b/src/locale/localeconv.c @@ -1,6 +1,5 @@ #include <locale.h> #include "_locale.h" -#include "../_nonstd.h" /** return locale-specific information **/ struct lconv * localeconv(void) @@ -8,7 +7,7 @@ struct lconv * localeconv(void) /* RETURN_SUCCESS(a pointer to a filled-in STRUCTDEF(lconv) for the current locale); */ - return __libc(LCONV); + return &(__get_locale()->lconv); } /*** diff --git a/src/locale/setlocale.c b/src/locale/setlocale.c index 068bf858..72478686 100644 --- a/src/locale/setlocale.c +++ b/src/locale/setlocale.c @@ -2,7 +2,6 @@ #include "string.h" #include "stdlib.h" #include "_locale.h" -#include "../_nonstd.h" #include "LC_ALL_MASK.c" #include "LC_COLLATE_MASK.c" @@ -14,7 +13,7 @@ char * setlocale(int category, const char *locale) { - struct __locale_t *l = __libc(GLOBAL_LOCALE); + struct __locale_t *l = __get_locale(); int mask = 0; if (locale == NULL) { |
