summaryrefslogtreecommitdiff
path: root/Src/math.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2001-07-06 18:33:59 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2001-07-06 18:33:59 +0000
commit2c75f5b0da61fa703b0b4f9dc12143aad5e00017 (patch)
tree73890893ddc261b0d5c64fc49e88571967c49efb /Src/math.c
parent3dc88e102e48395a7b96ec006eafae96c08db6b0 (diff)
downloadzsh-2c75f5b0da61fa703b0b4f9dc12143aad5e00017.tar.gz
zsh-2c75f5b0da61fa703b0b4f9dc12143aad5e00017.zip
15291, 15292: fix bug setting scalar in math mode
Diffstat (limited to 'Src/math.c')
-rw-r--r--Src/math.c57
1 files changed, 42 insertions, 15 deletions
diff --git a/Src/math.c b/Src/math.c
index 0ea16e7ba..5e4b67c9b 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -476,7 +476,7 @@ static struct mathvalue *stack;
/**/
static void
-push(mnumber val, char *lval)
+push(mnumber val, char *lval, int getme)
{
if (sp == STACKSZ - 1)
zerr("stack overflow", NULL, 0);
@@ -484,8 +484,21 @@ push(mnumber val, char *lval)
sp++;
stack[sp].val = val;
stack[sp].lval = lval;
+ if (getme)
+ stack[sp].val.type = MN_UNSET;
}
+/**/
+static mnumber
+pop(int noget)
+{
+ struct mathvalue *mv = stack+sp;
+
+ if (mv->val.type == MN_UNSET && !noget)
+ mv->val = getnparam(mv->lval);
+ sp--;
+ return mv->val;
+}
/**/
static mnumber
@@ -615,8 +628,8 @@ op(int what)
if (tp & (OP_A2|OP_A2IR|OP_A2IO|OP_E2|OP_E2IO)) {
/* Make sure anyone seeing this message reports it. */
DPUTS(sp < 1, "BUG: math: not enough wallabies in outback.");
- b = stack[sp--].val;
- a = stack[sp--].val;
+ b = pop(0);
+ a = pop(what == EQ);
if (tp & (OP_A2IO|OP_E2IO)) {
/* coerce to integers */
@@ -785,13 +798,15 @@ op(int what)
}
if (tp & (OP_E2|OP_E2IO)) {
lv = stack[sp+1].lval;
- push(setvar(lv,c), lv);
+ push(setvar(lv,c), lv, 0);
} else
- push(c,NULL);
+ push(c,NULL, 0);
return;
}
spval = &stack[sp].val;
+ if (stack[sp].val.type == MN_UNSET)
+ *spval = getnparam(stack[sp].lval);
switch (what) {
case NOT:
if (spval->type & MN_FLOAT) {
@@ -837,11 +852,11 @@ op(int what)
break;
case QUEST:
DPUTS(sp < 2, "BUG: math: three shall be the number of the counting.");
- c = stack[sp--].val;
- b = stack[sp--].val;
- a = stack[sp--].val;
+ c = pop(0);
+ b = pop(0);
+ a = pop(0);
/* b and c can stay different types in this case. */
- push(((a.type & MN_FLOAT) ? a.u.d : a.u.l) ? b : c, NULL);
+ push(((a.type & MN_FLOAT) ? a.u.d : a.u.l) ? b : c, NULL, 0);
break;
case COLON:
zerr("':' without '?'", NULL, 0);
@@ -872,7 +887,11 @@ static void
bop(int tk)
{
mnumber *spval = &stack[sp].val;
- int tst = (spval->type & MN_FLOAT) ? (zlong)spval->u.d : spval->u.l;
+ int tst;
+
+ if (stack[sp].val.type == MN_UNSET)
+ *spval = getnparam(stack[sp].lval);
+ tst = (spval->type & MN_FLOAT) ? (zlong)spval->u.d : spval->u.l;
switch (tk) {
case DAND:
@@ -938,7 +957,15 @@ mathevall(char *s, int prek, char **ep)
DPUTS(!errflag && sp,
"BUG: math: wallabies roaming too freely in outback");
- ret = stack[0].val;
+ if (errflag) {
+ ret.type = MN_INTEGER;
+ ret.u.l = errflag;
+ } else {
+ if (stack[0].val.type == MN_UNSET)
+ ret = getnparam(stack[0].lval);
+ else
+ ret = stack[0].val;
+ }
if (--mlevel) {
lastbase = xlastbase;
@@ -1056,16 +1083,16 @@ mathparse(int pc)
return;
switch (mtok) {
case NUM:
- push(yyval, NULL);
+ push(yyval, NULL, 0);
break;
case ID:
- push((noeval ? zero_mnumber : getnparam(yylval)), yylval);
+ push(zero_mnumber, yylval, !noeval);
break;
case CID:
- push((noeval ? zero_mnumber : getcvar(yylval)), yylval);
+ push((noeval ? zero_mnumber : getcvar(yylval)), yylval, 0);
break;
case FUNC:
- push((noeval ? zero_mnumber : callmathfunc(yylval)), yylval);
+ push((noeval ? zero_mnumber : callmathfunc(yylval)), yylval, 0);
break;
case M_INPAR:
mathparse(TOPPREC);