summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/ref/guile-invoke.texi18
-rw-r--r--libguile/guile.c41
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 */