static mnumber setmathvar(struct mathvalue *mvp, mnumber v) { if (mvp->pval) { /* * This value may have been hanging around for a while. * Be ultra-paranoid in checking the variable is still valid. */ char *s = mvp->lval, *ptr; Param pm; DPUTS(!mvp->lval, "no variable name but variable value in math"); if ((ptr = strchr(s, '['))) s = dupstrpfx(s, ptr - s); pm = (Param) paramtab->getnode(paramtab, s); if (pm == mvp->pval->pm) { if (noeval) return v; setnumvalue(mvp->pval, v); return v; } /* Different parameter, start again from scratch */ mvp->pval = NULL; } if (!mvp->lval) { zerr("lvalue required"); v.type = MN_INTEGER; v.u.l = 0; return v; } if (noeval) return v; untokenize(mvp->lval); setnparam(mvp->lval, v); return v; }
static mnumber setmathvar(struct mathvalue *mvp, mnumber v) { Param pm; if (mvp->pval) { /* * This value may have been hanging around for a while. * Be ultra-paranoid in checking the variable is still valid. */ char *s = mvp->lval, *ptr; Param pm; DPUTS(!mvp->lval, "no variable name but variable value in math"); if ((ptr = strchr(s, '['))) s = dupstrpfx(s, ptr - s); pm = (Param) paramtab->getnode(paramtab, s); if (pm == mvp->pval->pm) { if (noeval) return v; setnumvalue(mvp->pval, v); return v; } /* Different parameter, start again from scratch */ mvp->pval = NULL; } if (!mvp->lval) { zerr("lvalue required"); v.type = MN_INTEGER; v.u.l = 0; return v; } if (noeval) return v; untokenize(mvp->lval); pm = setnparam(mvp->lval, v); if (pm) { /* * If we are performing an assignment, we return the * number with the same type as the parameter we are * assigning to, in the spirit of the way assignments * in C work. Note this was a change to long-standing * zsh behaviour. */ switch (PM_TYPE(pm->node.flags)) { case PM_INTEGER: if (v.type != MN_INTEGER) { v.u.l = (zlong)v.u.d; v.type = MN_INTEGER; } break; case PM_EFLOAT: case PM_FFLOAT: if (v.type != MN_FLOAT) { v.u.d = (double)v.u.l; v.type = MN_FLOAT; } break; } } return v; }