From: Stas Boukarev Date: Sun, 16 Dec 2012 17:10:08 +0000 (+0400) Subject: Warn about misconfigured locale. X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=17e630f7dcb8f8a46361f5a09a872a280449ac33;p=sbcl.git Warn about misconfigured locale. Check the return value of setlocale(3) and inform about values of relevant environment variables. Fixes lp#727625 --- diff --git a/NEWS b/NEWS index b7953e8..81a6e6e 100644 --- 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). diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 63bc99c..7548e1c 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -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 + } +} + 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();