summaryrefslogtreecommitdiff
path: root/src/internal
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-07-02 19:33:19 -0400
committerRich Felker <dalias@aerifal.cx>2014-07-02 19:33:19 -0400
commit0bc03091bb674ebb9fa6fe69e4aec1da3ac484f2 (patch)
tree7f43063dd039e09a6a74d2677e1138d345bf7b9d /src/internal
parent984c25b74da085c6ae6b44a87bbd5f8afc9be331 (diff)
downloadmusl-0bc03091bb674ebb9fa6fe69e4aec1da3ac484f2.tar.gz
add locale framework
this commit adds non-stub implementations of setlocale, duplocale, newlocale, and uselocale, along with the data structures and minimal code needed for representing the active locale on a per-thread basis and optimizing the common case where thread-local locale settings are not in use. at this point, the data structures only contain what is necessary to represent LC_CTYPE (a single flag) and LC_MESSAGES (a name for use in finding message translation files). representation for the other categories will be added later; the expectation is that a single pointer will suffice for each. for LC_CTYPE, the strings "C" and "POSIX" are treated as special; any other string is accepted and treated as "C.UTF-8". for other categories, any string is accepted after being truncated to a maximum supported length (currently 15 bytes). for LC_MESSAGES, the name is kept regardless of whether libc itself can use such a message translation locale, since applications using catgets or gettext should be able to use message locales libc is not aware of. for other categories, names which are not successfully loaded as locales (which, at present, means all names) are treated as aliases for "C". setlocale never fails. locale settings are not yet used anywhere, so this commit should have no visible effects except for the contents of the string returned by setlocale.
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/libc.h8
-rw-r--r--src/internal/locale_impl.h18
2 files changed, 23 insertions, 3 deletions
diff --git a/src/internal/libc.h b/src/internal/libc.h
index fb4d9bc0..037d16b6 100644
--- a/src/internal/libc.h
+++ b/src/internal/libc.h
@@ -5,6 +5,11 @@
#include <stdio.h>
#include <limits.h>
+struct __locale_struct {
+ int ctype_utf8;
+ char *messages_name;
+};
+
struct __libc {
int has_thread_pointer;
int can_do_threads;
@@ -16,6 +21,9 @@ struct __libc {
int ofl_lock[2];
size_t tls_size;
size_t page_size;
+ volatile int uselocale_cnt;
+ volatile int bytelocale_cnt_minus_1;
+ struct __locale_struct global_locale;
};
extern size_t __hwcap;
diff --git a/src/internal/locale_impl.h b/src/internal/locale_impl.h
index f41c6f24..2747b85a 100644
--- a/src/internal/locale_impl.h
+++ b/src/internal/locale_impl.h
@@ -1,5 +1,17 @@
#include <locale.h>
+#include <stdlib.h>
+#include "libc.h"
+#include "pthread_impl.h"
-struct __locale_struct {
- int dummy;
-};
+#define LOCALE_NAME_MAX 15
+
+int __setlocalecat(locale_t, int, const char *);
+
+#define CURRENT_LOCALE \
+ (libc.uselocale_cnt ? __pthread_self()->locale : &libc.global_locale)
+
+#define CURRENT_UTF8 \
+ (libc.bytelocale_cnt_minus_1<0 || __pthread_self()->locale->ctype_utf8)
+
+#undef MB_CUR_MAX
+#define MB_CUR_MAX (CURRENT_UTF8 ? 4 : 1)