summaryrefslogtreecommitdiff
path: root/src/stdlib
diff options
context:
space:
mode:
authorSam Lantinga <slouken@libsdl.org>2007-07-12 07:52:50 +0000
committerSam Lantinga <slouken@libsdl.org>2007-07-12 07:52:50 +0000
commitfc4cf4c9fc4d1cd69f1352c32f59a171349f61a0 (patch)
treec4b9b38ef48187e0b742c0a796a234293505e55b /src/stdlib
parent4a00054e187ed8ef874635f525d5347618eb1151 (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.c45
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;
}