1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-25 05:10:28 +02:00

22686: unset array if assigning numeric parameter

This commit is contained in:
Peter Stephenson 2006-09-11 11:09:15 +00:00
parent 7b927aeac7
commit b262d310b2
3 changed files with 43 additions and 41 deletions

View file

@ -1,3 +1,8 @@
2006-09-11 Peter Stephenson <pws@csr.com>
* 22686: Src/params.c: unset array if assigning numeric
parameter to it.
2006-09-10 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 22685: Src/builtin.c: printf "%d" \'X should handle multibyte

View file

@ -2495,46 +2495,9 @@ sethparam(char *s, char **val)
return v->pm;
}
/**/
mod_export Param
setiparam(char *s, zlong val)
{
struct value vbuf;
Value v;
char *t = s, *ss;
Param pm;
mnumber mnval;
if (!isident(s)) {
zerr("not an identifier: %s", s);
errflag = 1;
return NULL;
}
queue_signals();
if (!(v = getvalue(&vbuf, &s, 1))) {
if ((ss = strchr(s, '[')))
*ss = '\0';
if (!(pm = createparam(t, ss ? PM_ARRAY : PM_INTEGER)))
pm = (Param) paramtab->getnode(paramtab, t);
DPUTS(!pm, "BUG: parameter not created");
if (ss) {
*ss = '[';
} else {
pm->base = outputradix;
}
v = getvalue(&vbuf, &t, 1);
DPUTS(!v, "BUG: value not found for new parameter");
}
mnval.type = MN_INTEGER;
mnval.u.l = val;
setnumvalue(v, mnval);
unqueue_signals();
return v->pm;
}
/*
* Like setiparam(), but can take an mnumber which can be integer or
* floating.
* Set a generic shell number, floating point or integer.
*/
/**/
@ -2543,7 +2506,7 @@ setnparam(char *s, mnumber val)
{
struct value vbuf;
Value v;
char *t = s, *ss = NULL;
char *t = s, *ss;
Param pm;
if (!isident(s)) {
@ -2552,8 +2515,23 @@ setnparam(char *s, mnumber val)
return NULL;
}
queue_signals();
if (!(v = getvalue(&vbuf, &s, 1))) {
if ((ss = strchr(s, '[')))
ss = strchr(s, '[');
v = getvalue(&vbuf, &s, 1);
if (v && (v->pm->node.flags & (PM_ARRAY|PM_HASHED)) &&
!(v->pm->node.flags & (PM_SPECIAL|PM_TIED)) &&
/*
* not sure what KSHARRAYS has got to do with this...
* copied this from assignsparam().
*/
unset(KSHARRAYS) && !ss) {
unsetparam_pm(v->pm, 0, 1);
s = t;
v = NULL;
}
if (!v) {
/* s has been updated by getvalue, so check again */
ss = strchr(s, '[');
if (ss)
*ss = '\0';
pm = createparam(t, ss ? PM_ARRAY :
(val.type & MN_INTEGER) ? PM_INTEGER : PM_FFLOAT);
@ -2573,6 +2551,19 @@ setnparam(char *s, mnumber val)
return v->pm;
}
/* Simplified interface to setnparam */
/**/
mod_export Param
setiparam(char *s, zlong val)
{
mnumber mnval;
mnval.type = MN_INTEGER;
mnval.u.l = val;
return setnparam(s, mnval);
}
/* Unset a parameter */
/**/

View file

@ -97,6 +97,12 @@
0:setting array elements in math context
>array 1 2
xarr=()
(( xarr = 3 ))
print ${(t)xarr} $xarr
0:converting type from array
>integer 3
print $(( 13 = 42 ))
1:bad lvalue
?(eval):1: lvalue required