summaryrefslogtreecommitdiff
path: root/src/locale
diff options
context:
space:
mode:
Diffstat (limited to 'src/locale')
-rw-r--r--src/locale/__get_locale.c13
-rw-r--r--src/locale/__load_locale.c64
-rw-r--r--src/locale/_locale.h5
-rw-r--r--src/locale/localeconv.c3
-rw-r--r--src/locale/setlocale.c3
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) {