summaryrefslogtreecommitdiff
path: root/Src/math.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/math.c')
-rw-r--r--Src/math.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/Src/math.c b/Src/math.c
index 37981cf22..f9613001a 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -463,7 +463,7 @@ lexconstant(void)
char *nptr;
nptr = ptr;
- if (*nptr == '-')
+ if (IS_DASH(*nptr))
nptr++;
if (*nptr == '0') {
@@ -527,7 +527,7 @@ lexconstant(void)
}
if (*nptr == 'e' || *nptr == 'E') {
nptr++;
- if (*nptr == '+' || *nptr == '-')
+ if (*nptr == '+' || IS_DASH(*nptr))
nptr++;
while (idigit(*nptr) || *nptr == '_')
nptr++;
@@ -599,7 +599,8 @@ zzlex(void)
}
return (unary) ? UPLUS : PLUS;
case '-':
- if (*ptr == '-') {
+ case Dash:
+ if (IS_DASH(*ptr)) {
ptr++;
return (unary) ? PREMINUS : POSTMINUS;
}
@@ -974,7 +975,7 @@ callmathfunc(char *o)
a[strlen(a) - 1] = '\0';
if ((f = getmathfunc(n, 1))) {
- if (f->flags & MFF_STR) {
+ if ((f->flags & (MFF_STR|MFF_USERFUNC)) == MFF_STR) {
return f->sfunc(n, a, f->funcid);
} else {
int argc = 0;
@@ -987,22 +988,34 @@ callmathfunc(char *o)
addlinknode(l, n);
}
- while (iblank(*a))
- a++;
+ if (f->flags & MFF_STR) {
+ if (!*a) {
+ addlinknode(l, dupstring(""));
+ argc++;
+ }
+ } else {
+ while (iblank(*a))
+ a++;
+ }
while (*a) {
if (*a) {
argc++;
if (f->flags & MFF_USERFUNC) {
/* need to pass strings */
char *str;
- marg = mathevall(a, MPREC_ARG, &a);
- if (marg.type & MN_FLOAT) {
- /* convfloat is off the heap */
- str = convfloat(marg.u.d, 0, 0, NULL);
+ if (f->flags & MFF_STR) {
+ str = dupstring(a);
+ a = "";
} else {
- char buf[BDIGBUFSIZE];
- convbase(buf, marg.u.l, 10);
- str = dupstring(buf);
+ marg = mathevall(a, MPREC_ARG, &a);
+ if (marg.type & MN_FLOAT) {
+ /* convfloat is off the heap */
+ str = convfloat(marg.u.d, 0, 0, NULL);
+ } else {
+ char buf[BDIGBUFSIZE];
+ convbase(buf, marg.u.l, 10);
+ str = dupstring(buf);
+ }
}
addlinknode(l, str);
} else {