summaryrefslogtreecommitdiff
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 */