Ryan's fix is still good for the built-in version of iconv_open() SDL-1.2
authorSam Lantinga <slouken@libsdl.org>
Thu, 12 Jul 2007 08:04:10 +0000
branchSDL-1.2
changeset 4055 6ed1fded55ff
parent 4054 64bf737873a2
child 4056 6f7af895ab02
Ryan's fix is still good for the built-in version of iconv_open()
src/stdlib/SDL_iconv.c
--- a/src/stdlib/SDL_iconv.c	Thu Jul 12 07:47:29 2007 +0000
+++ b/src/stdlib/SDL_iconv.c	Thu Jul 12 08:04:10 2007 +0000
@@ -131,9 +131,10 @@
 	{ "UCS-4",	ENCODING_UCS4 },
 };
 
-static const char *getlocale()
+static const char *getlocale(char *buffer, size_t bufsize)
 {
 	const char *lang;
+	char *ptr;
 
 	lang = SDL_getenv("LC_ALL");
 	if ( !lang ) {
@@ -148,7 +149,20 @@
 	if ( !lang || !*lang || SDL_strcmp(lang, "C") == 0 ) {
 		lang = "ASCII";
 	}
-	return lang;
+
+	/* We need to trim down strings like "en_US.UTF-8@blah" to "UTF-8" */
+	ptr = SDL_strchr(lang, '.');
+	if (ptr != NULL) {
+		lang = ptr + 1;
+	}
+
+	SDL_strlcpy(buffer, lang, bufsize);
+	ptr = SDL_strchr(buffer, '@');
+	if (ptr != NULL) {
+		*ptr = '\0';  /* chop end of string. */
+	}
+
+	return buffer;
 }
 
 SDL_iconv_t SDL_iconv_open(const char *tocode, const char *fromcode)
@@ -156,12 +170,14 @@
 	int src_fmt = ENCODING_UNKNOWN;
 	int dst_fmt = ENCODING_UNKNOWN;
 	int i;
+	char fromcode_buffer[64];
+	char tocode_buffer[64];
 
 	if ( !fromcode || !*fromcode ) {
-		fromcode = getlocale();
+		fromcode = getlocale(fromcode_buffer, sizeof(fromcode_buffer));
 	}
 	if ( !tocode || !*tocode ) {
-		fromcode = getlocale();
+		tocode = getlocale(tocode_buffer, sizeof(tocode_buffer));
 	}
 	for ( i = 0; i < SDL_arraysize(encodings); ++i ) {
 		if ( SDL_strcasecmp(fromcode, encodings[i].name) == 0 ) {