diff options
-rw-r--r-- | doc/ref/guile-invoke.texi | 18 | ||||
-rw-r--r-- | libguile/guile.c | 41 |
2 files changed, 56 insertions, 3 deletions
diff --git a/doc/ref/guile-invoke.texi b/doc/ref/guile-invoke.texi index 5a9a3f7ef..7cf4c9f88 100644 --- a/doc/ref/guile-invoke.texi +++ b/doc/ref/guile-invoke.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the GNU Guile Reference Manual. -@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2005, 2010, 2011 +@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2005, 2010, 2011, 2013 @c Free Software Foundation, Inc. @c See the file guile.texi for copying conditions. @@ -291,6 +291,22 @@ This variable names the file that holds the Guile REPL command history. You can specify a different history file by setting this environment variable. By default, the history file is @file{$HOME/.guile_history}. +@item GUILE_INSTALL_LOCALE +@vindex GUILE_INSTALL_LOCALE +This is a flag that can be used to tell Guile whether or not to install +the current locale at startup, via a call to @code{(setlocale LC_ALL +"")}. @xref{Locales}, for more information on locales. + +You may explicitly indicate that you do not want to install +the locale by setting @env{GUILE_INSTALL_LOCALE} to @code{0}, or +explicitly enable it by setting the variable to @code{1}. + +Usually, installing the current locale is the right thing to do. It +allows Guile to correctly parse and print strings with non-ASCII +characters. However, for compatibility with previous Guile 2.0 +releases, this option is off by default. The next stable release series +of Guile (the 2.2 series) will install locales by default. + @item GUILE_LOAD_COMPILED_PATH @vindex GUILE_LOAD_COMPILED_PATH This variable may be used to augment the path that is searched for diff --git a/libguile/guile.c b/libguile/guile.c index ac22b83df..2c3be8e2f 100644 --- a/libguile/guile.c +++ b/libguile/guile.c @@ -1,5 +1,6 @@ -/* Copyright (C) 1996,1997,2000,2001, 2006, 2008, 2011 Free Software Foundation, Inc. - * +/* Copyright (C) 1996, 1997, 2000, 2001, 2006, 2008, + * 2011, 2013 Free Software Foundation, Inc. + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 3 of @@ -36,6 +37,7 @@ #include <libguile/scmconfig.h> #endif #include <ltdl.h> +#include <locale.h> #ifdef HAVE_WINSOCK2_H #include <winsock2.h> @@ -64,9 +66,44 @@ inner_main (void *closure SCM_UNUSED, int argc, char **argv) #endif /* __MINGW32__ */ } +static int +get_integer_from_environment (const char *var, int def) +{ + char *end = 0; + char *val = getenv (var); + long res = def; + if (!val) + return def; + res = strtol (val, &end, 10); + if (end == val) + { + fprintf (stderr, "guile: warning: invalid %s: %s\n", var, val); + return def; + } + return res; +} + +static int +should_install_locale (void) +{ + /* If the GUILE_INSTALL_LOCALE environment variable is set to a + nonzero value, we should install the locale via setlocale(). This + behavior is off by default for compatibility with previous 2.0.x + releases. It will be on by default in 2.2. */ + return get_integer_from_environment ("GUILE_INSTALL_LOCALE", 0); +} + int main (int argc, char **argv) { + /* If we should install a locale, do it right at the beginning so that + string conversion for command-line arguments, along with possible + error messages, use the right locale. See + <https://lists.gnu.org/archive/html/guile-devel/2011-11/msg00041.html> + for the rationale. */ + if (should_install_locale () && setlocale (LC_ALL, "") == NULL) + fprintf (stderr, "guile: warning: failed to install locale\n"); + scm_install_gmp_memory_functions = 1; scm_boot_guile (argc, argv, inner_main, 0); return 0; /* never reached */ |