summaryrefslogtreecommitdiff
path: root/src/internal
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-05-27 03:22:52 -0400
committerRich Felker <dalias@aerifal.cx>2015-05-27 03:27:59 -0400
commit61a3364d246e72b903da8b76c2e27a225a51351e (patch)
tree8845c8e1798280285b6f0b27244d978eb602c300 /src/internal
parent63c188ec42e76ff768e81f6b65b11c68fc43351e (diff)
downloadmusl-61a3364d246e72b903da8b76c2e27a225a51351e.tar.gz
musl-61a3364d246e72b903da8b76c2e27a225a51351e.tar.bz2
musl-61a3364d246e72b903da8b76c2e27a225a51351e.tar.xz
musl-61a3364d246e72b903da8b76c2e27a225a51351e.zip
overhaul locale internals to treat categories roughly uniformly
previously, LC_MESSAGES was treated specially as the only category which could be set to a locale name without a definition file, in order to facilitate gettext message translations when no libc locale was available. LC_NUMERIC was completely un-settable, and LC_CTYPE stored a flag intended to be used for a possible future byte-based C locale, instead of storing a __locale_map pointer like the other categories use. this patch changes all categories to be represented by pointers to __locale_map structures, and allows locale names without definition files to be treated as valid locales with trivial definition when used in any category. outwardly visible functional changes should be minor, limited mainly to the strings read back from setlocale and the way gettext handles translations in categories other than LC_MESSAGES. various internal refactoring has also been performed, and improvements in const correctness have been made.
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/libc.h4
-rw-r--r--src/internal/locale_impl.h8
2 files changed, 5 insertions, 7 deletions
diff --git a/src/internal/libc.h b/src/internal/libc.h
index 212f0e8b..6810cd8b 100644
--- a/src/internal/libc.h
+++ b/src/internal/libc.h
@@ -8,9 +8,7 @@
struct __locale_map;
struct __locale_struct {
- volatile int ctype_utf8;
- char *messages_name;
- struct __locale_map *volatile cat[4];
+ const struct __locale_map *volatile cat[6];
};
struct __libc {
diff --git a/src/internal/locale_impl.h b/src/internal/locale_impl.h
index 5aebbf68..9b8385e9 100644
--- a/src/internal/locale_impl.h
+++ b/src/internal/locale_impl.h
@@ -9,20 +9,20 @@ struct __locale_map {
const void *map;
size_t map_size;
char name[LOCALE_NAME_MAX+1];
- struct __locale_map *next;
+ const struct __locale_map *next;
};
-int __setlocalecat(locale_t, int, const char *);
+const struct __locale_map *__get_locale(int, const char *);
const char *__mo_lookup(const void *, size_t, const char *);
const char *__lctrans(const char *, const struct __locale_map *);
const char *__lctrans_cur(const char *);
-#define LCTRANS(msg, lc, loc) __lctrans(msg, (loc)->cat[(lc)-2])
+#define LCTRANS(msg, lc, loc) __lctrans(msg, (loc)->cat[(lc)])
#define LCTRANS_CUR(msg) __lctrans_cur(msg)
#define CURRENT_LOCALE (__pthread_self()->locale)
-#define CURRENT_UTF8 (__pthread_self()->locale->ctype_utf8)
+#define CURRENT_UTF8 (!!__pthread_self()->locale->cat[LC_CTYPE])
#undef MB_CUR_MAX
#define MB_CUR_MAX (CURRENT_UTF8 ? 4 : 1)