summaryrefslogtreecommitdiff
path: root/Src/params.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/params.c')
-rw-r--r--Src/params.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/Src/params.c b/Src/params.c
index 134355173..26ff2c566 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -381,6 +381,7 @@ scancountparams(HashNode hn, int flags)
static Patprog scanprog;
static char *scanstr;
static char **paramvals;
+static Param foundparam;
/**/
void
@@ -404,6 +405,7 @@ scanparamvals(HashNode hn, int flags)
} else if ((flags & SCANPM_MATCHKEY) && !pattry(scanprog, v.pm->nam)) {
return;
}
+ foundparam = v.pm;
if (flags & SCANPM_WANTKEYS) {
paramvals[numparamvals++] = v.pm->nam;
if (!(flags & (SCANPM_WANTVALS|SCANPM_MATCHVAL)))
@@ -1598,7 +1600,7 @@ setstrvalue(Value v, char *val)
zsfree(val);
return;
}
- if (v->pm->flags & PM_HASHED) {
+ if ((v->pm->flags & PM_HASHED) && (v->isarr & SCANPM_MATCHMANY)) {
zerr("%s: attempt to set slice of associative array", v->pm->nam, 0);
zsfree(val);
return;
@@ -1663,6 +1665,11 @@ setstrvalue(Value v, char *val)
setarrvalue(v, ss);
}
break;
+ case PM_HASHED:
+ {
+ (foundparam->sets.cfn) (foundparam, val);
+ }
+ break;
}
if ((!v->pm->env && !(v->pm->flags & PM_EXPORTED) &&
!(isset(ALLEXPORT) && !(v->pm->flags & PM_HASHELEM))) ||