X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Flocale%2F__setlocalecat.c;h=1c894d9ca459d9f659cb59e5ac1f3229700d1668;hb=3b26a32df42092af6d0cdac655e52635b91d36b2;hp=a947dbfff8a3388f73cd993e42ec92fa5f538f04;hpb=674e28af2deaa3ef2b71af18f7a18af22467d5ef;p=musl diff --git a/src/locale/__setlocalecat.c b/src/locale/__setlocalecat.c index a947dbff..1c894d9c 100644 --- a/src/locale/__setlocalecat.c +++ b/src/locale/__setlocalecat.c @@ -4,6 +4,63 @@ #include "libc.h" #include "atomic.h" +const char *__lctrans_impl(const char *msg, const struct __locale_map *lm) +{ + const char *trans = 0; + if (lm) trans = __mo_lookup(lm->map, lm->map_size, msg); + return trans ? trans : msg; +} + +const unsigned char *__map_file(const char *, size_t *); +int __munmap(void *, size_t); +char *__strchrnul(const char *, int); + +static struct __locale_map *findlocale(const char *name, size_t n) +{ + static void *loc_head; + struct __locale_map *p, *new, *old_head; + const char *path = 0, *z; + char buf[256]; + size_t l; + const void *map; + size_t map_size; + + for (p=loc_head; p; p=p->next) + if (!strcmp(name, p->name)) return p; + + if (!libc.secure) path = getenv("MUSL_LOCPATH"); + /* FIXME: add a default path? */ + if (!path) return 0; + + for (; *path; path=z+!!*z) { + z = __strchrnul(path, ':'); + l = z - path - !!*z; + if (l >= sizeof buf - n - 2) continue; + memcpy(buf, path, l); + buf[l] = '/'; + memcpy(buf+l+1, name, n); + buf[l+1+n] = 0; + map = __map_file(buf, &map_size); + if (map) { + new = malloc(sizeof *new); + if (!new) { + __munmap((void *)map, map_size); + return 0; + } + new->map = map; + new->map_size = map_size; + memcpy(new->name, name, n); + new->name[n] = 0; + do { + old_head = loc_head; + new->next = old_head; + } while (a_cas_p(&loc_head, old_head, new) != old_head); + return new; + } + } + return 0; +} + static const char envvars[][12] = { "LC_CTYPE", "LC_NUMERIC", @@ -22,10 +79,13 @@ int __setlocalecat(locale_t loc, int cat, const char *val) (val = "C.UTF-8"); } - size_t n = strnlen(val, LOCALE_NAME_MAX); + size_t n; + for (n=0; ncat[cat-2]) break; + do old = loc->cat[cat-2]; + while (a_cas_p(&loc->cat[cat-2], old, data) != old); + case LC_NUMERIC: break; } return 0;