From 599a7fd7a7ce420766324b1a57a83d2c5c6cebf6 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 13 May 2007 20:18:28 +0000 Subject: 23436: consistency with null strings in local variables unposted: Phil Pennock: POSIX RE's are extended --- ChangeLog | 6 ++++++ Doc/Zsh/cond.yo | 2 +- Src/params.c | 48 ++++++++++++++++++++++++++++++++++++++---------- 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 + * 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 */ -- cgit 1.4.1