summaryrefslogtreecommitdiff
path: root/lib/readline/nls.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/readline/nls.c')
-rw-r--r--lib/readline/nls.c85
1 files changed, 69 insertions, 16 deletions
diff --git a/lib/readline/nls.c b/lib/readline/nls.c
index 8447c10f..5c6a13b6 100644
--- a/lib/readline/nls.c
+++ b/lib/readline/nls.c
@@ -57,6 +57,9 @@
static int utf8locale (char *);
+#define RL_DEFAULT_LOCALE "C"
+static char *_rl_current_locale = 0;
+
#if !defined (HAVE_SETLOCALE)
/* A list of legal values for the LANG or LC_CTYPE environment variables.
If a locale name in this list is the value for the LC_ALL, LC_CTYPE,
@@ -132,50 +135,61 @@ _rl_init_locale (void)
that doesn't return anything, we set lspec to the empty string to
force the subsequent call to setlocale() to define the `native'
environment. */
+#if defined (HAVE_SETLOCALE)
if (lspec == 0 || *lspec == 0)
lspec = setlocale (LC_CTYPE, (char *)NULL);
if (lspec == 0)
lspec = "";
ret = setlocale (LC_CTYPE, lspec); /* ok, since it does not change locale */
+#else
+ ret = (lspec == 0 || *lspec == 0) ? RL_DEFAULT_LOCALE : lspec;
+#endif
_rl_utf8locale = (ret && *ret) ? utf8locale (ret) : 0;
+ _rl_current_locale = savestring (ret);
return ret;
}
-/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value
- to decide the defaults for 8-bit character input and output. Returns
- 1 if we set eight-bit mode. */
-int
-_rl_init_eightbit (void)
-{
/* If we have setlocale(3), just check the current LC_CTYPE category
- value, and go into eight-bit mode if it's not C or POSIX. */
+ value (passed as LOCALESTR), and go into eight-bit mode if it's not "C"
+ or "POSIX". If FORCE is non-zero, we reset the locale variables to values
+ appropriate for the C locale if the locale is "C" or "POSIX". FORCE is 0
+ when this is called from _rl_init_eightbit, since we're modifying the
+ default initial values and don't need to change anything else. If we
+ don't have setlocale(3), we check the codeset portion of LOCALESTR against
+ a set of known values and go into eight-bit mode if it matches one of those.
+ Returns 1 if we set eight-bit (multibyte) mode. */
+static int
+_rl_set_localevars (char *localestr, int force)
+{
#if defined (HAVE_SETLOCALE)
- char *lspec, *t;
-
- t = _rl_init_locale (); /* returns static pointer */
-
- if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0))
+ if (localestr && *localestr && (localestr[0] != 'C' || localestr[1]) && (STREQ (localestr, "POSIX") == 0))
{
_rl_meta_flag = 1;
_rl_convert_meta_chars_to_ascii = 0;
_rl_output_meta_chars = 1;
return (1);
}
+ else if (force)
+ {
+ /* Default "C" locale settings. */
+ _rl_meta_flag = 0;
+ _rl_convert_meta_chars_to_ascii = 1;
+ _rl_output_meta_chars = 0;
+ return (0);
+ }
else
return (0);
#else /* !HAVE_SETLOCALE */
- char *lspec, *t;
+ char *t;
int i;
/* We don't have setlocale. Finesse it. Check the environment for the
appropriate variables and set eight-bit mode if they have the right
values. */
- lspec = _rl_get_locale_var ("LC_CTYPE");
-
- if (lspec == 0 || (t = normalize_codeset (lspec)) == 0)
+ if (localestr == 0 || (t = normalize_codeset (localestr)) == 0)
return (0);
for (i = 0; t && legal_lang_values[i]; i++)
if (STREQ (t, legal_lang_values[i]))
@@ -186,6 +200,14 @@ _rl_init_eightbit (void)
break;
}
+ if (force && legal_lang_values[i] == 0) /* didn't find it */
+ {
+ /* Default "C" locale settings. */
+ _rl_meta_flag = 0;
+ _rl_convert_meta_chars_to_ascii = 1;
+ _rl_output_meta_chars = 0;
+ }
+
_rl_utf8locale = *t ? STREQ (t, "utf8") : 0;
xfree (t);
@@ -193,6 +215,21 @@ _rl_init_eightbit (void)
#endif /* !HAVE_SETLOCALE */
}
+/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value
+ to decide the defaults for 8-bit character input and output. Returns
+ 1 if we set eight-bit mode. */
+int
+_rl_init_eightbit (void)
+{
+ char *t, *ol;
+
+ ol = _rl_current_locale;
+ t = _rl_init_locale (); /* resets _rl_current_locale, returns static pointer */
+ xfree (ol);
+
+ return (_rl_set_localevars (t, 0));
+}
+
#if !defined (HAVE_SETLOCALE)
static char *
normalize_codeset (char *codeset)
@@ -289,3 +326,19 @@ find_codeset (char *name, size_t *lenp)
return result;
}
+
+void
+_rl_reset_locale (void)
+{
+ char *ol, *nl;
+
+ /* This should not be NULL; _rl_init_eightbit sets it on the first call to
+ readline() or rl_initialize(). */
+ ol = _rl_current_locale;
+ nl = _rl_init_locale (); /* resets _rl_current_locale */
+
+ if ((ol == 0 && nl) || (ol && nl && (STREQ (ol, nl) == 0)))
+ (void)_rl_set_localevars (nl, 1);
+
+ xfree (ol);
+}