Warn about misconfigured locale.
authorStas Boukarev <stassats@gmail.com>
Sun, 16 Dec 2012 17:10:08 +0000 (21:10 +0400)
committerStas Boukarev <stassats@gmail.com>
Sun, 16 Dec 2012 17:10:08 +0000 (21:10 +0400)
Check the return value of setlocale(3) and inform about values of
relevant environment variables.
Fixes lp#727625

NEWS
src/runtime/runtime.c

diff --git a/NEWS b/NEWS
index b7953e8..81a6e6e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,6 @@
 ;;;; -*- coding: utf-8; fill-column: 78 -*-
 changes relative to sbcl-1.1.2:
+  * enhancement: warnings about bad locale settings, LANG, LC_CTYPE, etc.
   * bug fix: fasls are now once again directly executable (on platforms
     supporting shebang lines, with a suitably-installed sbcl).
 
index 63bc99c..7548e1c 100644 (file)
@@ -347,6 +347,50 @@ char *saved_runtime_path = NULL;
 void pthreads_win32_init();
 #endif
 
+void print_locale_variable(const char *name)
+{
+  char *value = getenv(name);
+
+  if (value) {
+    fprintf(stderr, "\n  %s=%s", name, value);
+  }
+}
+
+void setup_locale()
+{
+  if(setlocale(LC_ALL, "") == NULL) {
+#ifndef LISP_FEATURE_WIN32
+
+    fprintf(stderr, "WARNING: Setting locale failed.\n");
+    fprintf(stderr, "  Check the following varaibles for correct values:");
+
+    if (setlocale(LC_CTYPE, "") == NULL) {
+      print_locale_variable("LC_ALL");
+      print_locale_variable("LC_CTYPE");
+      print_locale_variable("LANG");
+    }
+
+    if (setlocale(LC_MESSAGES, "") == NULL) {
+      print_locale_variable("LC_MESSAGES");
+    }
+    if (setlocale(LC_COLLATE, "") == NULL) {
+      print_locale_variable("LC_COLLATE");
+    }
+    if (setlocale(LC_MONETARY, "") == NULL) {
+      print_locale_variable("LC_MONETARY");
+    }
+    if (setlocale(LC_NUMERIC, "") == NULL) {
+      print_locale_variable("LC_NUMERIC");
+    }
+    if (setlocale(LC_TIME, "") == NULL) {
+      print_locale_variable("LC_TIME");
+    }
+    fprintf(stderr, "\n");
+
+#endif
+  }
+}
+
 \f
 int
 main(int argc, char *argv[], char *envp[])
@@ -379,8 +423,6 @@ main(int argc, char *argv[], char *envp[])
     interrupt_init();
     block_blockable_signals(0, 0);
 
-    setlocale(LC_ALL, "");
-
     runtime_options = NULL;
 
     /* Save the argv[0] derived runtime path in case
@@ -561,6 +603,8 @@ main(int argc, char *argv[], char *envp[])
     gc_init();
     validate();
 
+    setup_locale();
+
     /* If no core file was specified, look for one. */
     if (!core) {
         core = search_for_core();