Rip out all references to fxdpnt
diff --git a/include/bc/data.h b/include/bc/data.h
index 603f247..3557f59 100644
--- a/include/bc/data.h
+++ b/include/bc/data.h
@@ -55,10 +55,9 @@
#include <stdbool.h>
-#include <arbprec/arbprec.h>
-
#include <bc/bc.h>
#include <bc/vector.h>
+#include <bc/num.h>
#define BC_PROGRAM_MAX_STMTS (128)
@@ -154,9 +153,9 @@
bool var;
union {
- fxdpnt num;
+ BcNum num;
struct {
- fxdpnt* array;
+ BcNum* array;
uint32_t num_elems;
};
};
@@ -169,7 +168,7 @@
union {
- fxdpnt* num;
+ BcNum num;
const char* name;
};
@@ -192,11 +191,11 @@
} BcFunc;
-typedef fxdpnt* BcVar;
+typedef BcNum BcVar;
typedef BcVec BcArray;
-typedef enum BcNumType {
+typedef enum BcResultType {
BC_NUM_RESULT,
@@ -210,14 +209,14 @@
BC_NUM_IBASE,
BC_NUM_OBASE,
-} BcNumType;
+} BcResultType;
-typedef struct BcNum {
+typedef struct BcResult {
- BcNumType type;
- fxdpnt* num;
+ BcResultType type;
+ BcNum num;
-} BcNum;
+} BcResult;
typedef struct BcInstPtr {
@@ -251,7 +250,7 @@
int bc_entry_cmp(void* entry1, void*entry2);
void bc_entry_free(void* entry);
-void bc_num_free(void* num);
+void bc_result_free(void* num);
void bc_constant_free(void* constant);
diff --git a/include/bc/num.h b/include/bc/num.h
index 0dc6c4a..57c767c 100644
--- a/include/bc/num.h
+++ b/include/bc/num.h
@@ -92,6 +92,12 @@
typedef BcStatus (*BcUnaryFunc)(BcNum* a, BcNum* res, size_t scale);
typedef BcStatus (*BcBinaryFunc)(BcNum* a, BcNum* b, BcNum* res, size_t scale);
+BcStatus bc_num_construct(BcNum* num, size_t request);
+
+BcStatus bc_num_expand(BcNum* num, size_t request);
+
+void bc_num_destruct(BcNum* num);
+
BcStatus bc_num_copy(BcNum* dest, BcNum* src);
BcStatus bc_num_parse(BcNum* num, const char* val,
diff --git a/include/bc/program.h b/include/bc/program.h
index 3a9e0e3..769b963 100644
--- a/include/bc/program.h
+++ b/include/bc/program.h
@@ -63,15 +63,15 @@
#define BC_PROGRAM_BUF_SIZE (1024)
-typedef fxdpnt* (*BcMathOpFunc)(fxdpnt*, fxdpnt*, fxdpnt*, int, size_t);
+typedef BcStatus (*BcMathOpFunc)(BcNum*, BcNum*, BcNum*, size_t);
typedef struct BcProgram {
BcVec ip_stack;
- long scale;
- long ibase;
- long obase;
+ size_t scale;
+ size_t ibase;
+ size_t obase;
long base_max;
long dim_max;
@@ -104,10 +104,10 @@
const char* file;
- fxdpnt* last;
+ BcNum last;
- fxdpnt* zero;
- fxdpnt* one;
+ BcNum zero;
+ BcNum one;
char* num_buf;
size_t buf_size;
diff --git a/src/bc/data.c b/src/bc/data.c
index 5104ca5..3dcecd2 100644
--- a/src/bc/data.c
+++ b/src/bc/data.c
@@ -50,6 +50,7 @@
*
*/
+#include <assert.h>
#include <stdlib.h>
#include <bc/data.h>
@@ -218,7 +219,7 @@
return BC_STATUS_INVALID_PARAM;
}
- *var = arb_alloc(16);
+ return bc_num_construct(var, BC_NUM_DEF_SIZE);
return BC_STATUS_SUCCESS;
}
@@ -233,7 +234,7 @@
return;
}
- arb_free(*v);
+ bc_num_destruct(v);
}
BcStatus bc_array_init(BcArray* array) {
@@ -242,8 +243,7 @@
return BC_STATUS_INVALID_PARAM;
}
- return bc_vec_init(array, sizeof(fxdpnt),
- (BcFreeFunc) arb_free);
+ return bc_vec_init(array, sizeof(BcNum), (BcFreeFunc) bc_num_destruct);
}
void bc_array_free(void* array) {
@@ -265,28 +265,28 @@
local->var = true;
// TODO: Don't malloc.
- arb_str2fxdpnt(num);
+ //arb_str2fxdpnt(num);
return BC_STATUS_SUCCESS;
}
BcStatus bc_local_initArray(BcLocal* local, const char* name, uint32_t nelems) {
- fxdpnt* array;
+ BcNum* array;
assert(nelems);
local->name = name;
local->var = false;
- array = malloc(nelems * sizeof(fxdpnt));
+ array = malloc(nelems * sizeof(BcNum));
if (!array) {
return BC_STATUS_MALLOC_FAIL;
}
for (uint32_t i = 0; i < nelems; ++i) {
- arb_construct(array + i, BC_PROGRAM_DEF_SIZE);
+ bc_num_construct(array + i, BC_PROGRAM_DEF_SIZE);
}
return BC_STATUS_SUCCESS;
@@ -295,7 +295,7 @@
void bc_local_free(void* local) {
BcLocal* l;
- fxdpnt* array;
+ BcNum* array;
uint32_t nelems;
l = (BcLocal*) local;
@@ -303,7 +303,7 @@
free((void*) l->name);
if (l->var) {
- arb_destruct(&l->num);
+ bc_num_destruct(&l->num);
}
else {
@@ -311,7 +311,7 @@
array = l->array;
for (uint32_t i = 0; i < nelems; ++i) {
- arb_destruct(array + i);
+ bc_num_destruct(array + i);
}
free(array);
@@ -326,10 +326,10 @@
temp->type = BC_TEMP_NUM;
if (val) {
- temp->num = arb_str2fxdpnt(val);
+ //temp->num = arb_str2fxdpnt(val);
}
else {
- temp->num = arb_alloc(BC_PROGRAM_DEF_SIZE);
+ //temp->num = arb_alloc(BC_PROGRAM_DEF_SIZE);
}
return BC_STATUS_SUCCESS;
@@ -366,7 +366,7 @@
t = (BcTemp*) temp;
if (t->type == BC_TEMP_NUM) {
- arb_free(t->num);
+ bc_num_destruct(&t->num);
}
}
@@ -399,11 +399,11 @@
free(e->name);
}
-void bc_num_free(void* num) {
+void bc_result_free(void* num) {
- BcNum* n;
+ BcResult* n;
- n = (BcNum*) num;
+ n = (BcResult*) num;
switch (n->type) {
@@ -413,7 +413,7 @@
case BC_NUM_IBASE:
case BC_NUM_OBASE:
{
- arb_free(n->num);
+ bc_num_destruct(&n->num);
break;
}
diff --git a/src/bc/num.c b/src/bc/num.c
index d8830cc..14e885e 100644
--- a/src/bc/num.c
+++ b/src/bc/num.c
@@ -57,12 +57,6 @@
#include <bc/bc.h>
#include <bc/num.h>
-static BcStatus bc_num_construct(BcNum* num, size_t request);
-
-static BcStatus bc_num_expand(BcNum* num, size_t request);
-
-static void bc_num_destruct(BcNum* num);
-
static BcStatus bc_num_unary(BcNum* a, BcNum* b, size_t scale,
BcUnaryFunc op, size_t req);
@@ -95,8 +89,59 @@
static BcStatus bc_num_removeLeadingZeros(BcNum* n);
+BcStatus bc_num_construct(BcNum* num, size_t request) {
+
+ if (!num || !request) return BC_STATUS_INVALID_PARAM;
+
+ memset(num, 0, sizeof(BcNum));
+
+ num->num = malloc(request);
+
+ if (!num->num) {
+ return BC_STATUS_MALLOC_FAIL;
+ }
+
+ num->unused = request;
+
+ return BC_STATUS_SUCCESS;
+}
+
+BcStatus bc_num_expand(BcNum* num, size_t request) {
+
+ if (!num || !request) return BC_STATUS_INVALID_PARAM;
+
+ if (request > num->len + num->unused) {
+
+ size_t extra;
+ char* temp;
+
+ extra = request - (num->len + num->unused);
+
+ temp = realloc(num->num, request);
+
+ if (!temp) {
+ return BC_STATUS_MALLOC_FAIL;
+ }
+
+ num->num = temp;
+
+ num->unused += extra;
+ }
+
+ return BC_STATUS_SUCCESS;
+}
+
+void bc_num_destruct(BcNum* num) {
+
+ if (!num) return;
+
+ if (num->num) free(num->num);
+
+ memset(num, 0, sizeof(BcNum));
+}
+
BcStatus bc_num_parse(BcNum* num, const char* val,
- size_t base, size_t scale)
+ size_t base, size_t scale)
{
BcStatus status;
@@ -291,57 +336,6 @@
return 0;
}
-static BcStatus bc_num_construct(BcNum* num, size_t request) {
-
- if (!num || !request) return BC_STATUS_INVALID_PARAM;
-
- memset(num, 0, sizeof(BcNum));
-
- num->num = malloc(request);
-
- if (!num->num) {
- return BC_STATUS_MALLOC_FAIL;
- }
-
- num->unused = request;
-
- return BC_STATUS_SUCCESS;
-}
-
-static BcStatus bc_num_expand(BcNum* num, size_t request) {
-
- if (!num || !request) return BC_STATUS_INVALID_PARAM;
-
- if (request > num->len + num->unused) {
-
- size_t extra;
- char* temp;
-
- extra = request - (num->len + num->unused);
-
- temp = realloc(num->num, request);
-
- if (!temp) {
- return BC_STATUS_MALLOC_FAIL;
- }
-
- num->num = temp;
-
- num->unused += extra;
- }
-
- return BC_STATUS_SUCCESS;
-}
-
-static void bc_num_destruct(BcNum* num) {
-
- if (!num) return;
-
- if (num->num) free(num->num);
-
- memset(num, 0, sizeof(BcNum));
-}
-
static BcStatus bc_num_unary(BcNum* a, BcNum* b, size_t scale,
BcUnaryFunc op, size_t req)
{
diff --git a/src/bc/program.c b/src/bc/program.c
index 7eac2bf..a2f8071 100644
--- a/src/bc/program.c
+++ b/src/bc/program.c
@@ -64,35 +64,32 @@
static const char* const bc_byte_fmt = "%02x";
-static fxdpnt* bc_program_add(fxdpnt* a, fxdpnt* b, fxdpnt* c, int base, size_t scale);
-static fxdpnt* bc_program_sub(fxdpnt* a, fxdpnt* b, fxdpnt* c, int base, size_t scale);
-
static const BcMathOpFunc bc_math_ops[] = {
- arb_mod,
+ bc_num_mod,
NULL, // &
NULL, // '
NULL, // (
NULL, // )
- arb_mul,
+ bc_num_mul,
- bc_program_add,
+ bc_num_add,
NULL, // ,
- bc_program_sub,
+ bc_num_sub,
NULL, // .
- arb_alg_d,
+ bc_num_div,
};
static BcStatus bc_program_printString(const char* str);
static BcStatus bc_program_execExpr(BcProgram* p, BcVec* exprs,
- fxdpnt** num, bool print);
+ BcNum* num, bool print);
#if 0
static BcStatus bc_program_assign(BcProgram* p, BcExpr* expr,
BcExprType op, fxdpnt* amt);
@@ -203,9 +200,17 @@
}
#endif
- p->last = arb_str2fxdpnt("0");
- p->zero = arb_str2fxdpnt("0");
- p->one = arb_str2fxdpnt("1");
+ s = bc_num_parse(&p->last, "0", 10, 0);
+
+ if (s) return s;
+
+ s = bc_num_parse(&p->zero, "0", 10, 0);
+
+ if (s) goto zero_err;
+
+ s = bc_num_parse(&p->one, "1", 10, 0);
+
+ if (s) goto one_err;
p->num_buf = malloc(BC_PROGRAM_BUF_SIZE + 1);
@@ -281,7 +286,7 @@
goto const_err;
}
- s = bc_vec_init(&p->expr_stack, sizeof(BcNum), bc_num_free);
+ s = bc_vec_init(&p->expr_stack, sizeof(BcNum), bc_result_free);
if (s) {
goto expr_err;
@@ -372,11 +377,15 @@
num_buf_err:
- arb_free(p->last);
+ bc_num_destruct(&p->one);
- if (p->zero) arb_free(p->zero);
+one_err:
- if (p->one) arb_free(p->one);
+ bc_num_destruct(&p->zero);
+
+zero_err:
+
+ bc_num_destruct(&p->last);
return s;
}
@@ -535,11 +544,11 @@
case BC_INST_PRINT:
{
- BcNum* num;
+ BcResult* num;
num = bc_vec_top(&p->expr_stack);
- arb_print(num->num);
+ bc_num_print(&num->num, p->obase);
bc_vec_pop(&p->expr_stack);
@@ -591,7 +600,7 @@
case BC_INST_PUSH_NUM:
{
size_t idx;
- BcNum num;
+ BcResult result;
char* str;
idx = bc_program_index(code, &ip->idx);
@@ -602,15 +611,15 @@
return BC_STATUS_EXEC_INVALID_EXPR;
}
- num.num = arb_str2fxdpnt(str);
+ //result.num = arb_str2fxdpnt(str);
- if (!num.num) {
- return BC_STATUS_EXEC_INVALID_EXPR;
- }
+ //if (!result.num) {
+ // return BC_STATUS_EXEC_INVALID_EXPR;
+ //}
- num.type = BC_NUM_CONSTANT;
+ result.type = BC_NUM_CONSTANT;
- status = bc_vec_push(&p->expr_stack, &num);
+ status = bc_vec_push(&p->expr_stack, &result);
break;
}
@@ -622,10 +631,10 @@
case BC_INST_OP_DIVIDE:
case BC_INST_OP_POWER:
{
- BcNum* ptr;
- BcNum num1;
- BcNum num2;
- BcNum result;
+ BcResult* ptr;
+ BcResult num1;
+ BcResult num2;
+ BcResult result;
ptr = bc_vec_top(&p->expr_stack);
@@ -648,7 +657,10 @@
if (status) return status;
result.type = BC_NUM_RESULT;
- result.num = arb_alloc(16);
+
+ status = bc_num_construct(&result.num, BC_NUM_DEF_SIZE);
+
+ if (status) return status;
if (inst != BC_INST_OP_POWER) {
@@ -656,12 +668,14 @@
op = bc_math_ops[inst - BC_INST_OP_MODULUS];
- result.num = op(num1.num, num2.num, result.num, 10, 10);
+ status = op(&num1.num, &num2.num, &result.num, p->scale);
}
else {
// TODO: Power.
}
+ if (status) return status;
+
status = bc_vec_push(&p->expr_stack, &result);
break;
@@ -768,9 +782,9 @@
bc_vec_free(&p->locals);
bc_vec_free(&p->temps);
- // p->zero and p->one are not freed because they are
- // freed by bc_vec_free() run on p->constants.
- arb_free(p->last);
+ bc_num_destruct(&p->last);
+ bc_num_destruct(&p->zero);
+ bc_num_destruct(&p->one);
memset(p, 0, sizeof(BcProgram));
}
@@ -869,7 +883,7 @@
}
static BcStatus bc_program_execExpr(BcProgram* p, BcVec* exprs,
- fxdpnt** num, bool print)
+ BcNum* num, bool print)
{
#if 0
BcStatus status;
@@ -1395,17 +1409,3 @@
putchar(byte);
}
-
-static fxdpnt* bc_program_add(fxdpnt* a, fxdpnt* b, fxdpnt* c,
- int base, size_t scale)
-{
- (void) scale;
- return arb_add(a, b, c, base);
-}
-
-static fxdpnt* bc_program_sub(fxdpnt* a, fxdpnt* b, fxdpnt* c,
- int base, size_t scale)
-{
- (void) scale;
- return arb_sub(a, b, c, base);
-}