mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-27 04:40:59 +01:00
33118: record original param unset state when treating empty the same as unset,
to avoid incorrect NO_UNSET errors
This commit is contained in:
parent
4414e54ea7
commit
5a9f3ac773
2 changed files with 13 additions and 6 deletions
15
Src/subst.c
15
Src/subst.c
|
|
@ -1522,6 +1522,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags)
|
|||
* unset. I don't quite understand why (v == NULL) isn't
|
||||
* good enough, but there are places where we seem to need
|
||||
* to second guess whether a value is a real value or not.
|
||||
* See in particular the (colf && !vunset) test below.
|
||||
*/
|
||||
int vunset = 0;
|
||||
/*
|
||||
|
|
@ -2638,8 +2639,10 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags)
|
|||
* - (array) contains no elements
|
||||
* - (scalar) contains an empty string
|
||||
*/
|
||||
if (colf && !vunset)
|
||||
if (colf && !vunset) {
|
||||
vunset = (isarr) ? !*aval : !*val || (*val == Nularg && !val[1]);
|
||||
vunset *= -1; /* Record that vunset was originally false */
|
||||
}
|
||||
|
||||
switch (s[-1]) {
|
||||
case '+':
|
||||
|
|
@ -2862,7 +2865,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags)
|
|||
getmatcharr(&aval, s, flags, flnum, replstr);
|
||||
} else {
|
||||
if (vunset) {
|
||||
if (unset(UNSET)) {
|
||||
if (vunset > 0 && unset(UNSET)) {
|
||||
*idend = '\0';
|
||||
zerr("%s: parameter not set", idbeg);
|
||||
return NULL;
|
||||
|
|
@ -2892,7 +2895,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags)
|
|||
return NULL;
|
||||
}
|
||||
if (vunset) {
|
||||
if (unset(UNSET)) {
|
||||
if (vunset > 0 && unset(UNSET)) {
|
||||
*idend = '\0';
|
||||
zerr("%s: parameter not set", idbeg);
|
||||
return NULL;
|
||||
|
|
@ -2974,7 +2977,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags)
|
|||
*ap = NULL;
|
||||
} else {
|
||||
if (vunset) {
|
||||
if (unset(UNSET)) {
|
||||
if (vunset > 0 && unset(UNSET)) {
|
||||
*idend = '\0';
|
||||
zerr("%s: parameter not set", idbeg);
|
||||
deletehashtable(ht);
|
||||
|
|
@ -3003,7 +3006,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags)
|
|||
}
|
||||
}
|
||||
if (vunset) {
|
||||
if (unset(UNSET)) {
|
||||
if (vunset > 0 && unset(UNSET)) {
|
||||
*idend = '\0';
|
||||
zerr("%s: parameter not set", idbeg);
|
||||
return NULL;
|
||||
|
|
@ -3020,7 +3023,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags)
|
|||
val = dupstring(vunset ? "0" : "1");
|
||||
isarr = 0;
|
||||
} else if (vunset) {
|
||||
if (unset(UNSET)) {
|
||||
if (vunset > 0 && unset(UNSET)) {
|
||||
*idend = '\0';
|
||||
zerr("%s: parameter not set", idbeg);
|
||||
return NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue