1
0
Fork 0
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:
Barton E. Schaefer 2014-09-06 22:15:28 -07:00
parent 4414e54ea7
commit 5a9f3ac773
2 changed files with 13 additions and 6 deletions

View file

@ -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;