[Bf-blender-cvs] [701a7dc] master: Fix T43544: Runtime Error when Locale is not valid

Sergey Sharybin noreply at git.blender.org
Tue Feb 3 13:36:38 CET 2015


Commit: 701a7dcc87f312a207b6652a2afc2e32fe236f34
Author: Sergey Sharybin
Date:   Tue Feb 3 17:34:05 2015 +0500
Branches: master
https://developer.blender.org/rB701a7dcc87f312a207b6652a2afc2e32fe236f34

Fix T43544: Runtime Error when Locale is not valid

This is not a real fix and only prevents crash, textures IO might be not
working totally correct if they're unicode path or so. Proper solution
would be to detect which locale we can use and set LANG, LC_ALL and friends.

===================================================================

M	source/blender/blenfont/intern/blf_lang.c

===================================================================

diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index 10614e8..8951ef5 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -33,6 +33,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+#ifndef _WIN32
+#  include <locale.h>
+#endif
+
 #include "RNA_types.h"
 
 #include "BLF_translation.h" /* own include */
@@ -189,7 +193,33 @@ void BLF_lang_init(void)
 {
 #ifdef WITH_INTERNATIONAL
 	const char * const messagepath = BKE_appdir_folder_id(BLENDER_DATAFILES, "locale");
+#endif
+
+	/* Make sure LANG is correct and wouldn't cause std::rumtime_error. */
+#ifndef _WIN32
+	/* TODO(sergey): This code only ensures LANG is set properly, so later when
+	 * Cycles will try to use file system API from boost there'll be no runtime
+	 * exception generated by std::locale() which _requires_ having proper LANG
+	 * set in the environment.
+	 *
+	 * Ideally we also need to ensure LC_ALL, LC_MESSAGES and others are also
+	 * set to a proper value, but currently it's not a huge deal and doesn't
+	 * cause any headache.
+	 *
+	 * Would also be good to find nicer way to check if LANG is correct.
+	 */
+	const char *lang = getenv("LANG");
+	if(lang != NULL) {
+		char *old_locale = setlocale(LC_ALL, NULL);
+		if (setlocale(LC_ALL, lang) == NULL) {
+			setenv("LANG", "C", 1);
+			printf("Warning: Falling back to the standard locale (\"C\")\n");
+		}
+		setlocale(LC_ALL, old_locale);
+	}
+#endif
 
+#ifdef WITH_INTERNATIONAL
 	if (messagepath) {
 		bl_locale_init(messagepath, TEXT_DOMAIN_NAME);
 		fill_locales();




More information about the Bf-blender-cvs mailing list