#include "SDL_internal.h"
#include "SDL_syslocale.h"
static SDL_Locale **build_locales_from_csv_string(char *csv, int *count)
{
int i, num_locales;
size_t slen;
size_t alloclen;
char *ptr;
SDL_Locale *loc;
SDL_Locale **result;
if (count) {
*count = 0;
}
while (csv && *csv && SDL_isspace(*csv)) {
++csv;
}
if (!csv || !*csv) {
return NULL; }
num_locales = 1; for (ptr = csv; *ptr; ptr++) {
if (*ptr == ',') {
num_locales++;
}
}
slen = ((size_t)(ptr - csv)) + 1; alloclen = ((num_locales + 1) * sizeof(SDL_Locale *)) + (num_locales * sizeof(SDL_Locale)) + slen;
result = (SDL_Locale **)SDL_calloc(1, alloclen);
if (!result) {
return NULL; }
loc = (SDL_Locale *)(result + (num_locales + 1));
ptr = (char *)(loc + num_locales);
SDL_memcpy(ptr, csv, slen);
i = 0;
result[i++] = loc;
while (true) { while (SDL_isspace(*ptr)) {
ptr++; }
if (*ptr == '\0') {
break;
}
loc->language = ptr++;
while (true) {
const char ch = *ptr;
if (ch == '_') {
*(ptr++) = '\0';
loc->country = ptr;
} else if (SDL_isspace(ch)) {
*(ptr++) = '\0'; } else if (ch == ',') {
*(ptr++) = '\0';
loc++;
result[i++] = loc;
break;
} else if (ch == '\0') {
break;
} else {
ptr++; }
}
}
if (count) {
*count = num_locales;
}
return result;
}
SDL_Locale **SDL_GetPreferredLocales(int *count)
{
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, count);
}