Fix for bug #447 merged from SDL 1.2
authorSam Lantinga <slouken@libsdl.org>
Wed, 04 Jul 2007 08:01:04 +0000
changeset 2143 e906da4414a3
parent 2142 ca80c942e69c
child 2144 665c2669e6a3
Fix for bug #447 merged from SDL 1.2
include/SDL_stdinc.h
src/stdlib/SDL_iconv.c
src/video/x11/SDL_x11window.c
test/testiconv.c
--- a/include/SDL_stdinc.h	Wed Jul 04 07:08:16 2007 +0000
+++ b/include/SDL_stdinc.h	Wed Jul 04 08:01:04 2007 +0000
@@ -656,8 +656,7 @@
                                                const char *fromcode,
                                                const char *inbuf,
                                                size_t inbytesleft);
-#define SDL_iconv_utf8_ascii(S)		SDL_iconv_string("646", "UTF-8", S, SDL_strlen(S)+1)
-#define SDL_iconv_utf8_latin1(S)	SDL_iconv_string("8859-1", "UTF-8", S, SDL_strlen(S)+1)
+#define SDL_iconv_utf8_locale(S)	SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1)
 #define SDL_iconv_utf8_ucs2(S)		(Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1)
 #define SDL_iconv_utf8_ucs4(S)		(Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1)
 
--- a/src/stdlib/SDL_iconv.c	Wed Jul 04 07:08:16 2007 +0000
+++ b/src/stdlib/SDL_iconv.c	Wed Jul 04 08:01:04 2007 +0000
@@ -773,6 +773,27 @@
 
 #endif /* !HAVE_ICONV */
 
+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 || SDL_strcmp(lang, "C") == 0) {
+        lang = "ASCII";
+    }
+    return lang;
+}
+
 char *
 SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf,
                  size_t inbytesleft)
@@ -784,6 +805,12 @@
     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) {
         return NULL;
--- a/src/video/x11/SDL_x11window.c	Wed Jul 04 07:08:16 2007 +0000
+++ b/src/video/x11/SDL_x11window.c	Wed Jul 04 08:01:04 2007 +0000
@@ -429,13 +429,13 @@
 #endif
 
     if (title != NULL) {
-        char *title_latin1 = SDL_iconv_utf8_latin1((char *) title);
-        if (!title_latin1) {
+        char *title_locale = SDL_iconv_utf8_locale(title);
+        if (!title_locale) {
             SDL_OutOfMemory();
             return;
         }
-        status = XStringListToTextProperty(&title_latin1, 1, &titleprop);
-        SDL_free(title_latin1);
+        status = XStringListToTextProperty(&title_locale, 1, &titleprop);
+        SDL_free(title_locale);
         if (status) {
             XSetTextProperty(display, data->window, &titleprop, XA_WM_NAME);
             XFree(titleprop.value);
@@ -454,13 +454,13 @@
 #endif
     }
     if (icon != NULL) {
-        char *icon_latin1 = SDL_iconv_utf8_latin1((char *) icon);
-        if (!icon_latin1) {
+        char *icon_locale = SDL_iconv_utf8_locale(icon);
+        if (!icon_locale) {
             SDL_OutOfMemory();
             return;
         }
-        status = XStringListToTextProperty(&icon_latin1, 1, &iconprop);
-        SDL_free(icon_latin1);
+        status = XStringListToTextProperty(&icon_locale, 1, &iconprop);
+        SDL_free(icon_locale);
         if (status) {
             XSetTextProperty(display, data->window, &iconprop,
                              XA_WM_ICON_NAME);
--- a/test/testiconv.c	Wed Jul 04 07:08:16 2007 +0000
+++ b/test/testiconv.c	Wed Jul 04 08:01:04 2007 +0000
@@ -61,10 +61,10 @@
                 fprintf(stderr, "FAIL: %s\n", formats[i]);
                 ++errors;
             }
-            if(test[0]) {
+            if (test[0]) {
                 SDL_free(test[0]);
             }
-            if(test[1]) {
+            if (test[1]) {
                 SDL_free(test[1]);
             }
         }