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;