diff options
Diffstat (limited to 'src/stdlib')
-rw-r--r-- | src/stdlib/SDL_iconv.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/src/stdlib/SDL_iconv.c b/src/stdlib/SDL_iconv.c index fc6acfb7..39d16526 100644 --- a/src/stdlib/SDL_iconv.c +++ b/src/stdlib/SDL_iconv.c @@ -111,10 +111,8 @@ static struct int format; } encodings[] = { /* *INDENT-OFF* */ - { "646", ENCODING_ASCII }, { "ASCII", ENCODING_ASCII }, { "US-ASCII", ENCODING_ASCII }, - { "LATIN1", ENCODING_LATIN1 }, { "8859-1", ENCODING_LATIN1 }, { "ISO-8859-1", ENCODING_LATIN1 }, { "UTF8", ENCODING_UTF8 }, @@ -138,6 +136,27 @@ static struct /* *INDENT-ON* */ }; +static const char * +getlocale() +{ + const char *lang; + + lang = SDL_getenv("LC_ALL"); + if (!lang) { + lang = SDL_getenv("LC_CTYPE"); + } + if (!lang) { + lang = SDL_getenv("LC_MESSAGES"); + } + if (!lang) { + lang = SDL_getenv("LANG"); + } + if (!lang || !*lang || SDL_strcmp(lang, "C") == 0) { + lang = "ASCII"; + } + return lang; +} + SDL_iconv_t SDL_iconv_open(const char *tocode, const char *fromcode) { @@ -145,6 +164,12 @@ SDL_iconv_open(const char *tocode, const char *fromcode) int dst_fmt = ENCODING_UNKNOWN; int i; + if (!fromcode || !*fromcode) { + fromcode = getlocale(); + } + if (!tocode || !*tocode) { + fromcode = getlocale(); + } for (i = 0; i < SDL_arraysize(encodings); ++i) { if (SDL_strcasecmp(fromcode, encodings[i].name) == 0) { src_fmt = encodings[i].format; @@ -805,14 +830,18 @@ SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t outbytesleft; size_t retCode = 0; - if (!fromcode || !*fromcode) { - fromcode = getlocale(); - } - if (!tocode || !*tocode) { - tocode = getlocale(); - } cd = SDL_iconv_open(tocode, fromcode); if (cd == (SDL_iconv_t) - 1) { + /* See if we can recover here (fixes iconv on Solaris 11) */ + if (!tocode || !*tocode) { + tocode = "UTF-8"; + } + if (!fromcode || !*fromcode) { + tocode = "UTF-8"; + } + cd = SDL_iconv_open(tocode, fromcode); + } + if (cd == (SDL_iconv_t) - 1) { return NULL; } |