#include "../SDL_internal.h"
#include "SDL_syslocale.h"
#include "SDL_hints.h"
static SDL_Locale *
build_locales_from_csv_string(char *csv)
{
size_t num_locales = 1;
size_t slen;
size_t alloclen;
char *ptr;
SDL_Locale *loc;
SDL_Locale *retval;
if (!csv || !csv[0]) {
return NULL;
}
for (ptr = csv; *ptr; ptr++) {
if (*ptr == ',') {
num_locales++;
}
}
num_locales++;
slen = ((size_t) (ptr - csv)) + 1;
alloclen = slen + (num_locales * sizeof (SDL_Locale));
loc = retval = (SDL_Locale *) SDL_calloc(1, alloclen);
if (!retval) {
SDL_OutOfMemory();
return NULL;
}
ptr = (char *) (retval + num_locales);
SDL_strlcpy(ptr, csv, slen);
while (SDL_TRUE) {
while (*ptr == ' ') ptr++;
if (*ptr == '\0') {
break;
}
loc->language = ptr++;
while (SDL_TRUE) {
const char ch = *ptr;
if (ch == '_') {
*(ptr++) = '\0';
loc->country = ptr;
} else if (ch == ' ') {
*(ptr++) = '\0';
} else if (ch == ',') {
*(ptr++) = '\0';
loc++;
break;
} else if (ch == '\0') {
loc++;
break;
} else {
ptr++;
}
}
}
return retval;
}
SDL_Locale *
SDL_GetPreferredLocales(void)
{
char locbuf[128];
const char *hint = SDL_GetHint(SDL_HINT_PREFERRED_LOCALES);
if (hint) {
SDL_strlcpy(locbuf, hint, sizeof (locbuf));
} else {
SDL_zeroa(locbuf);
SDL_SYS_GetPreferredLocales(locbuf, sizeof (locbuf));
}
return build_locales_from_csv_string(locbuf);
}