about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Doc/Zsh/cond.yo2
-rw-r--r--Src/params.c48
3 files changed, 45 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 4e4e99205..b3d92d4c3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2007-05-13  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
+	* Phil Pennoc: unposted: Doc/Zsh/cond.yo: should document
+	POSIX regular expressions as extended, not basic.
+
+	* 23436: Src/params.c: handle empty strings for locale
+	variables more consistently.
+
 	* 23434: Completion/Unix/Command/_configure: use also
 	for config.status.
 
diff --git a/Doc/Zsh/cond.yo b/Doc/Zsh/cond.yo
index 1b7630d78..1a4d5a71c 100644
--- a/Doc/Zsh/cond.yo
+++ b/Doc/Zsh/cond.yo
@@ -114,7 +114,7 @@ true if var(string) matches the regular expression
 var(regexp).  If the option tt(RE_MATCH_PCRE) is set
 var(regexp) is tested as a PCRE regular expression using
 the tt(zsh/pcre) module, else it is tested as a POSIX
-regular expression using the tt(zsh/regex) module.
+extended regular expression using the tt(zsh/regex) module.
 If the option tt(BASH_REMATCH) is set the array
 tt(BASH_REMATCH) is set to the substring that matched the pattern
 followed by the substrings that matched parenthesised
diff --git a/Src/params.c b/Src/params.c
index 461c4697a..4a813a089 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -3414,10 +3414,21 @@ setlang(char *x)
 {
     struct localename *ln;
 
+    /*
+     * Set the global locale to the value passed, but override
+     * this with any non-empty definitions for specific
+     * categories.
+     *
+     * We only use non-empty definitions because empty values aren't
+     * valid as locales; when passed to setlocale() they mean "use the
+     * environment variable", but if that's what we're setting the value
+     * from this is meaningless.  So just all $LANG to show through in
+     * that case.
+     */
     setlocale(LC_ALL, x ? x : "");
     queue_signals();
     for (ln = lc_names; ln->name; ln++)
-	if ((x = getsparam(ln->name)))
+	if ((x = getsparam(ln->name)) && *x)
 	    setlocale(ln->category, x);
     unqueue_signals();
 }
@@ -3427,10 +3438,18 @@ void
 lc_allsetfn(Param pm, char *x)
 {
     strsetfn(pm, x);
-    if (!x) {
-	queue_signals();
-	setlang(getsparam("LANG"));
-	unqueue_signals();
+    /*
+     * Treat an empty LC_ALL the same as an unset one,
+     * namely by using LANG as the default locale but overriding
+     * that with any LC_* that are set.
+     */
+    if (!x || !*x) {
+	x = getsparam("LANG");
+	if (x && *x) {
+	    queue_signals();
+	    setlang(x);
+	    unqueue_signals();
+	}
     }
     else
 	setlocale(LC_ALL, x);
@@ -3448,18 +3467,27 @@ langsetfn(Param pm, char *x)
 void
 lcsetfn(Param pm, char *x)
 {
+    char *x2;
     struct localename *ln;
 
     strsetfn(pm, x);
-    if (getsparam("LC_ALL"))
+    if ((x2 = getsparam("LC_ALL")) && *x)
 	return;
     queue_signals();
-    if (!x)
+    /* Treat empty LC_* the same as unset. */
+    if (!x || !*x)
 	x = getsparam("LANG");
 
-    for (ln = lc_names; ln->name; ln++)
-	if (!strcmp(ln->name, pm->node.nam))
-	    setlocale(ln->category, x ? x : "");
+    /*
+     * If we've got no non-empty string at this
+     * point (after checking $LANG, too),
+     * we shouldn't bother setting anything.
+     */
+    if (x && *x) {
+	for (ln = lc_names; ln->name; ln++)
+	    if (!strcmp(ln->name, pm->node.nam))
+		setlocale(ln->category, x);
+    }
     unqueue_signals();
 }
 #endif /* USE_LOCALE */