From 7faeef296d8b0041ae340c3febf7eb0a78e60b0f Mon Sep 17 00:00:00 2001 From: Clyne Sullivan <clyne@bitgloo.com> Date: Wed, 28 Mar 2018 11:56:35 -0400 Subject: [PATCH] allow solve to error safely --- builtins.c | 6 ++++-- parser.c | 25 +++++++++++++++++++------ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/builtins.c b/builtins.c index c68b3d9..883dd20 100644 --- a/builtins.c +++ b/builtins.c @@ -133,8 +133,10 @@ int bn_solve(instance *it) { variable *s = igetarg(it, 0); variable **ops = iparse(it, (const char *)s->value.p); - if (ops == 0) - return -1; + if (ops == 0) { + ipush(it, (uint32_t)make_varf(0, 0.0f)); + return 0; + } variable *a = isolve(it, ops, 0); free(ops); diff --git a/parser.c b/parser.c index ecf3a50..a1e96cf 100644 --- a/parser.c +++ b/parser.c @@ -290,12 +290,13 @@ int idoline(instance *it, const char *s) return 0; it->lines[it->lnidx] = ops; + variable **copy; loop: - if (it->ret != 0) - itryfree(it->ret); - it->ret = 0; + //if (it->ret != 0) + // itryfree(it->ret); + //it->ret = 0; - variable **copy = (variable **)malloc(32 * sizeof(variable *)); + copy = (variable **)malloc(32 * sizeof(variable *)); for (int i = 0; i < 32; i++) { variable *v = it->lines[it->lnidx][i]; if (v != 0) { @@ -317,8 +318,15 @@ loop: } } it->ret = isolve(it, copy, 0); - if (it->ret == 0) + if (it->ret == 0) { idelline(copy); + } else { + variable *ret = igetvar(it, "ANS"); + ret->type = it->ret->type; + ret->value.p = it->ret->value.p; + it->ret = ret; + } + free(copy); it->lnidx++; @@ -580,7 +588,12 @@ variable **iparse(instance *it, const char *s) goto fail; } else { if (ooffset == 0) { - ops[ooffset++] = make_varf(0, 0.0f); + variable *a; + if (it->ret != 0) + a = it->ret; + else + a = make_varf(0, 0.0f); + ops[ooffset++] = a; } else if (ops[ooffset - 1]->type == OPERATOR) { free(word); goto fail;