1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-28 06:30:57 +02:00

45772: Restore locale on parameter scope end.

Check if relevant parameters changes and if so restore system settings.
This commit is contained in:
Peter Stephenson 2020-05-05 20:28:31 +01:00
parent 455c80e4bb
commit c486040220
2 changed files with 39 additions and 0 deletions

View file

@ -1,3 +1,8 @@
2020-05-05 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 45772: Src/params.c: Upon restoring locale variables, restore
the corresponding system settings.
2020-05-23 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
* unposted: Src/Builtins/rlimits.c: add a comment about how to

View file

@ -5569,6 +5569,14 @@ startparamscope(void)
locallevel++;
}
#ifdef USE_LOCALE
/*
* Flag that one of the special LC_ functions or LANG changed on scope
* end
*/
static int lc_update_needed;
#endif /* USE_LOCALE */
/* End a parameter scope: delete the parameters local to the scope. */
/**/
@ -5579,7 +5587,28 @@ endparamscope(void)
locallevel--;
/* This pops anything from a higher locallevel */
saveandpophiststack(0, HFILE_USE_OPTIONS);
#ifdef USE_LOCALE
lc_update_needed = 0;
#endif
scanhashtable(paramtab, 0, 0, 0, scanendscope, 0);
#ifdef USE_LOCALE
if (lc_update_needed)
{
/* Locale changed --- ensure it is restored. */
char *val;
if ((val = getsparam_u("LC_ALL")) && *val) {
setlocale(LC_ALL, val);
} else {
struct localename *ln;
if ((val = getsparam_u("LANG")) && *val)
setlang(val);
for (ln = lc_names; ln->name; ln++) {
if ((val = getsparam_u(ln->name)) && *val)
setlocale(ln->category, val);
}
}
}
#endif /* USE_LOCALE */
unqueue_signals();
}
@ -5600,6 +5629,11 @@ scanendscope(HashNode hn, UNUSED(int flags))
*/
Param tpm = pm->old;
#ifdef USE_LOCALE
if (!strncmp(pm->node.nam, "LC_", 3) ||
!strcmp(pm->node.nam, "LANG"))
lc_update_needed = 1;
#endif
if (!strcmp(pm->node.nam, "SECONDS"))
{
setsecondstype(pm, PM_TYPE(tpm->node.flags), PM_TYPE(pm->node.flags));