15 static struct locarr locarr = { 0, NULL };
17 static int add(const char *locstr, int length)
22 item = strndup(locstr, length);
24 for (i = 0 ; item[i] ; i++)
25 item[i] = tolower(item[i]);
26 for (i = 0 ; i < locarr.count ; i++)
27 if (!strcmp(item, locarr.arr[i])) {
32 ptr = realloc(locarr.arr, (1 + locarr.count) * sizeof(locarr.arr[0]));
35 locarr.arr[locarr.count++] = item;
47 free(locarr.arr[--locarr.count]);
50 int locales_add(const char *locstr)
52 const char *stop, *next;
54 stop = strchrnul(locstr, ',');
55 next = stop + !!*stop;
56 while (locstr != stop) {
57 if (add(locstr, stop - locstr))
59 do { stop--; } while(stop > locstr && *stop != '-');
66 int locales_score(const char *lang)
71 for (i = 0 ; i < locarr.count ; i++)
72 if (!strcasecmp(lang, locarr.arr[i]))
78 char *locales_locate_file(const char *filename)
84 for (i = 0 ; i < locarr.count ; i++) {
85 if (snprintf(path, sizeof path, "locales/%s/%s", locarr.arr[i], filename) >= (int)(sizeof path)) {
89 if (!access(path, F_OK)) {
90 result = strdup(path);
96 if (access(filename, F_OK)) {
97 result = strdup(filename);