From ead896141e24c712c6b3b20bcc49f0e45fbd6e72 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 12 Jul 2007 07:52:50 +0000 Subject: [PATCH] Fixed bug #455 If passed "" for the character set, let iconv_open() interpret it as locale. This was merged from revision 3234,3235 from SDL 1.2 --- src/stdlib/SDL_iconv.c | 45 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/src/stdlib/SDL_iconv.c b/src/stdlib/SDL_iconv.c index fc6acfb7f..39d165265 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,13 +830,17 @@ 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; }