Fix a misinterpretation of the bc spec
diff --git a/include/bc/data.h b/include/bc/data.h
index 44ef9ba..603f247 100644
--- a/include/bc/data.h
+++ b/include/bc/data.h
@@ -251,8 +251,8 @@
int bc_entry_cmp(void* entry1, void*entry2);
void bc_entry_free(void* entry);
-void bc_arb_free(void* num);
-
void bc_num_free(void* num);
+void bc_constant_free(void* constant);
+
#endif // BC_DATA_H
diff --git a/src/bc/data.c b/src/bc/data.c
index cf72258..d58133f 100644
--- a/src/bc/data.c
+++ b/src/bc/data.c
@@ -399,15 +399,6 @@
free(e->name);
}
-void bc_arb_free(void* num) {
-
- fxdpnt* n;
-
- n = *((fxdpnt**) num);
-
- arb_free(n);
-}
-
void bc_num_free(void* num) {
BcNum* n;
@@ -433,3 +424,12 @@
}
}
}
+
+void bc_constant_free(void* constant) {
+
+ char* c;
+
+ c = *((char**) constant);
+
+ free(c);
+}
diff --git a/src/bc/parse.c b/src/bc/parse.c
index 4c14daa..efa9c73 100644
--- a/src/bc/parse.c
+++ b/src/bc/parse.c
@@ -1219,13 +1219,10 @@
case BC_LEX_NUMBER:
{
size_t idx;
- fxdpnt* num;
idx = parse->program->constants.len;
- num = arb_str2fxdpnt(parse->token.string);
-
- status = bc_vec_push(&parse->program->constants, &num);
+ status = bc_vec_push(&parse->program->constants, &parse->token.string);
if (status) {
return status;
diff --git a/src/bc/program.c b/src/bc/program.c
index 2525c27..504aba2 100644
--- a/src/bc/program.c
+++ b/src/bc/program.c
@@ -275,24 +275,12 @@
goto string_err;
}
- s = bc_vec_init(&p->constants, sizeof(fxdpnt*), bc_arb_free);
+ s = bc_vec_init(&p->constants, sizeof(char*), bc_constant_free);
if (s) {
goto const_err;
}
- s = bc_vec_push(&p->constants, &p->zero);
-
- if (s) {
- goto expr_err;
- }
-
- s = bc_vec_push(&p->constants, &p->one);
-
- if (s) {
- goto expr_err;
- }
-
s = bc_vec_init(&p->expr_stack, sizeof(BcNum), bc_num_free);
if (s) {
@@ -343,8 +331,6 @@
expr_err:
bc_vec_free(&p->constants);
- p->zero = NULL;
- p->one = NULL;
const_err:
@@ -606,10 +592,17 @@
{
size_t idx;
BcNum num;
+ char* str;
idx = bc_program_index(code, &ip->idx);
- num.num = *((fxdpnt**) bc_vec_item(&p->constants, idx));
+ str = *((char**) bc_vec_item(&p->constants, idx));
+
+ if (!str) {
+ return BC_STATUS_VM_INVALID_EXPR;
+ }
+
+ num.num = arb_str2fxdpnt(str);
if (!num.num) {
return BC_STATUS_VM_INVALID_EXPR;