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);
-}