mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-11 13:01:28 +02:00
11314: fix for typeset -U not updating value in environment
This commit is contained in:
parent
94a6e3c227
commit
ade3663216
3 changed files with 21 additions and 10 deletions
|
@ -1,3 +1,8 @@
|
|||
2000-05-10 Peter Stephenson <pws@pwstephenson.fsnet.co.uk>
|
||||
|
||||
* 11314: Src/builtin.c, Src/params.c: typeset -Uing tied variables
|
||||
didn't update the value in the environment.
|
||||
|
||||
2000-05-10 Bart Schaefer <schaefer@zsh.org>
|
||||
|
||||
* 11312: Config/config.mk: defs.mk depends on config.status.
|
||||
|
|
|
@ -1607,11 +1607,20 @@ typeset_single(char *cname, char *pname, Param pm, int func,
|
|||
}
|
||||
if ((on & PM_UNIQUE) && !(pm->flags & PM_READONLY & ~off)) {
|
||||
Param apm;
|
||||
if (PM_TYPE(pm->flags) == PM_ARRAY)
|
||||
uniqarray((*pm->gets.afn) (pm));
|
||||
else if (PM_TYPE(pm->flags) == PM_SCALAR && pm->ename &&
|
||||
(apm = (Param) paramtab->getnode(paramtab, pm->ename)))
|
||||
uniqarray((*apm->gets.afn) (apm));
|
||||
char **x;
|
||||
if (PM_TYPE(pm->flags) == PM_ARRAY) {
|
||||
x = (*pm->gets.afn)(pm);
|
||||
uniqarray(x);
|
||||
if (pm->ename && x)
|
||||
arrfixenv(pm->ename, x);
|
||||
} else if (PM_TYPE(pm->flags) == PM_SCALAR && pm->ename &&
|
||||
(apm =
|
||||
(Param) paramtab->getnode(paramtab, pm->ename))) {
|
||||
x = (*apm->gets.afn)(apm);
|
||||
uniqarray(x);
|
||||
if (x)
|
||||
arrfixenv(pm->nam, x);
|
||||
}
|
||||
}
|
||||
pm->flags = (pm->flags | on) & ~(off | PM_UNSET);
|
||||
/* This auxlen/pm->ct stuff is a nasty hack. */
|
||||
|
|
|
@ -2299,10 +2299,9 @@ colonarrsetfn(Param pm, char *x)
|
|||
}
|
||||
|
||||
/**/
|
||||
int
|
||||
void
|
||||
uniqarray(char **x)
|
||||
{
|
||||
int changes = 0;
|
||||
char **t, **p = x;
|
||||
|
||||
if (!x || !*x)
|
||||
|
@ -2312,10 +2311,8 @@ uniqarray(char **x)
|
|||
if (!strcmp(*p, *t)) {
|
||||
zsfree(*p);
|
||||
for (t = p--; (*t = t[1]) != NULL; t++);
|
||||
changes++;
|
||||
break;
|
||||
}
|
||||
return changes;
|
||||
}
|
||||
|
||||
/* Function to get value of special parameter `#' and `ARGC' */
|
||||
|
@ -2759,7 +2756,7 @@ pipestatsetfn(Param pm, char **x)
|
|||
* do the replacing, since we've already scanned for the string. */
|
||||
|
||||
/**/
|
||||
static void
|
||||
void
|
||||
arrfixenv(char *s, char **t)
|
||||
{
|
||||
char **ep, *u;
|
||||
|
|
Loading…
Reference in a new issue