summaryrefslogtreecommitdiffstats
path: root/Src/math.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-09-22 13:33:14 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-09-22 13:33:14 +0000
commitd6b6dd078d560dba1d72350427035bdbf08f5e20 (patch)
tree45de47f27e5c05653934c03431f67ed5acc318e9 /Src/math.c
parentzsh-workers/7998 (diff)
downloadzsh-d6b6dd078d560dba1d72350427035bdbf08f5e20.tar
zsh-d6b6dd078d560dba1d72350427035bdbf08f5e20.tar.gz
zsh-d6b6dd078d560dba1d72350427035bdbf08f5e20.tar.bz2
zsh-d6b6dd078d560dba1d72350427035bdbf08f5e20.tar.lz
zsh-d6b6dd078d560dba1d72350427035bdbf08f5e20.tar.xz
zsh-d6b6dd078d560dba1d72350427035bdbf08f5e20.tar.zst
zsh-d6b6dd078d560dba1d72350427035bdbf08f5e20.zip
zsh-workers/7999
Diffstat (limited to 'Src/math.c')
-rw-r--r--Src/math.c50
1 files changed, 27 insertions, 23 deletions
diff --git a/Src/math.c b/Src/math.c
index 836e0c671..9edfeb651 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -161,7 +161,7 @@ static int prec[TOKCOUNT] =
0, 16, 0
};
-#define TOPPREC 16
+#define TOPPREC 17
#define ARGPREC (TOPPREC-1)
static int type[TOKCOUNT] =
@@ -498,31 +498,35 @@ callmathfunc(char *o)
mnumber *argv = NULL, *q;
LinkList l = newlinklist();
LinkNode node;
- char *p;
- if (*a) {
- for (p = a; *a; a++) {
- if (*a == '\\' && a[1])
- a++;
- else if (*a == ',') {
- *a = '\0';
- addlinknode(l, p);
- argc++;
- p = a + 1;
- }
+ while (iblank(*a))
+ a++;
+ while (*a) {
+ if (*a) {
+ argc++;
+ q = (mnumber *)zhalloc(sizeof(mnumber));
+ *q = mathevall(a, ARGPREC, &a);
+ addlinknode(l, q);
+ if (errflag || mtok != COMMA)
+ break;
+ a++;
}
- addlinknode(l, p);
- argc++;
}
- if (argc >= f->minargs && (f->maxargs < 0 || argc <= f->maxargs)) {
- if (argc) {
- q = argv = (mnumber *) zhalloc(argc * sizeof(mnumber));
- for (node = firstnode(l); node; incnode(node))
- *q++ = matheval((char *) getdata(node));
- }
- return f->nfunc(n, argc, argv, f->funcid);
- } else
- zerr("wrong number of argument: %s", o, 0);
+ if (*a && !errflag)
+ zerr("bad math expression: illegal character: %c",
+ NULL, *a);
+ if (!errflag) {
+ if (argc >= f->minargs && (f->maxargs < 0 ||
+ argc <= f->maxargs)) {
+ if (argc) {
+ q = argv = (mnumber *)zhalloc(argc * sizeof(mnumber));
+ for (node = firstnode(l); node; incnode(node))
+ *q++ = *(mnumber *)getdata(node);
+ }
+ return f->nfunc(n, argc, argv, f->funcid);
+ } else
+ zerr("wrong number of arguments: %s", o, 0);
+ }
}
} else
zerr("unknown function: %s", n, 0);