#include <locale.h>
#include <string.h>
+#include <sys/mman.h>
#include "locale_impl.h"
#include "libc.h"
-#include "atomic.h"
+#include "lock.h"
const char *__lctrans_impl(const char *msg, const struct __locale_map *lm)
{
return trans ? trans : msg;
}
-const unsigned char *__map_file(const char *, size_t *);
-int __munmap(void *, size_t);
-char *__strchrnul(const char *, int);
-
static const char envvars[][12] = {
"LC_CTYPE",
"LC_NUMERIC",
"LC_MESSAGES",
};
-static const uint32_t empty_mo[] = { 0x950412de, 0, -1, -1, -1 };
-
-static const struct __locale_map c_dot_utf8 = {
- .map = empty_mo,
- .map_size = sizeof empty_mo,
- .name = "C.UTF-8"
-};
-
const struct __locale_map *__get_locale(int cat, const char *val)
{
- static int lock[2];
+ static volatile int lock[1];
static void *volatile loc_head;
const struct __locale_map *p;
struct __locale_map *new = 0;
if (builtin) {
if (cat == LC_CTYPE && val[1]=='.')
- return (void *)&c_dot_utf8;
+ return (void *)&__c_dot_utf8;
return 0;
}
* sake of being able to do message translations at the
* application level. */
if (!new && (new = malloc(sizeof *new))) {
- new->map = empty_mo;
- new->map_size = sizeof empty_mo;
+ new->map = __c_dot_utf8.map;
+ new->map_size = __c_dot_utf8.map_size;
memcpy(new->name, val, n);
new->name[n] = 0;
new->next = loc_head;
/* For LC_CTYPE, never return a null pointer unless the
* requested name was "C" or "POSIX". */
- if (!new && cat == LC_CTYPE) new = (void *)&c_dot_utf8;
+ if (!new && cat == LC_CTYPE) new = (void *)&__c_dot_utf8;
UNLOCK(lock);
return new;