diff options
author | Sam Lantinga <slouken@libsdl.org> | 2007-07-12 07:52:50 +0000 |
---|---|---|
committer | Sam Lantinga <slouken@libsdl.org> | 2007-07-12 07:52:50 +0000 |
commit | fc4cf4c9fc4d1cd69f1352c32f59a171349f61a0 (patch) | |
tree | c4b9b38ef48187e0b742c0a796a234293505e55b /src/stdlib | |
parent | 4a00054e187ed8ef874635f525d5347618eb1151 (diff) |
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
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402503
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; } |