Make handling of constants more robust
diff --git a/src/bc/data.c b/src/bc/data.c
index 02497f9..417e3e8 100644
--- a/src/bc/data.c
+++ b/src/bc/data.c
@@ -304,7 +304,6 @@
switch (r->type) {
case BC_RESULT_INTERMEDIATE:
- case BC_RESULT_CONSTANT:
{
bc_num_free(&r->data.num);
break;
diff --git a/src/bc/program.c b/src/bc/program.c
index 607f1d7..762376f 100644
--- a/src/bc/program.c
+++ b/src/bc/program.c
@@ -627,11 +627,14 @@
case BC_INST_PRINT:
{
- BcResult* num;
+ BcResult* result;
+ BcNum* num;
- num = bc_vec_top(&p->expr_stack);
+ result = bc_vec_top(&p->expr_stack);
- bc_num_print(&num->data.num, p->obase);
+ status = bc_program_num(p, result, &num);
+
+ bc_num_print(num, p->obase);
bc_vec_pop(&p->expr_stack);
@@ -701,30 +704,18 @@
case BC_INST_OP_NEGATE:
{
- BcResult* ptr;
- BcResult result;
+ BcResult* result;
+ BcNum* num;
- ptr = bc_vec_top(&p->expr_stack);
+ result = bc_vec_top(&p->expr_stack);
- if (!ptr) return BC_STATUS_EXEC_INVALID_EXPR;
+ if (!result) return BC_STATUS_EXEC_INVALID_EXPR;
- result.type = BC_RESULT_INTERMEDIATE;
-
- status = bc_num_init(&result.data.num, BC_NUM_DEF_SIZE);
+ status = bc_program_num(p, result, &num);
if (status) return status;
- status = bc_num_copy(&result.data.num, &ptr->data.num);
-
- if (status) return status;
-
- result.data.num.neg = !result.data.num.neg;
-
- status = bc_vec_pop(&p->expr_stack);
-
- if (status) return status;
-
- status = bc_vec_push(&p->expr_stack, &result);
+ num->neg = !num->neg;
break;
}
@@ -945,6 +936,10 @@
status = bc_num_parse(&result->data.num, *s, p->ibase, p->scale);
+ if (status) return status;
+
+ result->type = BC_RESULT_INTERMEDIATE;
+
break;
}