Start fixing BcNum parsing and printing for reversal
diff --git a/src/bc/num.c b/src/bc/num.c
index da194e8..fdc6da5 100644
--- a/src/bc/num.c
+++ b/src/bc/num.c
@@ -51,7 +51,7 @@
 
 static bool bc_num_strValid(const char* val, size_t base);
 
-static BcStatus bc_num_parseDecimal(BcNum *n, const char* val, size_t scale);
+static BcStatus bc_num_parseDecimal(BcNum *n, const char* val);
 static BcStatus bc_num_parseLowBase(BcNum* n, const char* val,
                                      size_t base, size_t scale);
 static BcStatus bc_num_parseHighBase(BcNum* n, const char* val,
@@ -139,7 +139,7 @@
 
   if (!bc_num_strValid(val, base)) return BC_STATUS_MATH_INVALID_STRING;
 
-  if (base == 10) status = bc_num_parseDecimal(n, val, scale);
+  if (base == 10) status = bc_num_parseDecimal(n, val);
   else if (base < 10) status = bc_num_parseLowBase(n, val, base, scale);
   else status = bc_num_parseHighBase(n, val, base, scale);
 
@@ -777,15 +777,14 @@
   return true;
 }
 
-static BcStatus bc_num_parseDecimal(BcNum* n, const char* val, size_t scale) {
+static BcStatus bc_num_parseDecimal(BcNum* n, const char* val) {
 
   BcStatus status;
   size_t len;
-  char c;
   size_t i;
   const char* ptr;
   size_t radix;
-  size_t inv_pow;
+  size_t end;
   char* num;
 
   len = strlen(val);
@@ -794,20 +793,28 @@
 
   if (len) {
 
+    bool zero;
+
+    zero = true;
+
+    for (i = 0; zero && i < len; ++i) {
+      if (val[i] != '0' && val[i] != '.') zero = false;
+    }
+
+    if (zero) {
+      memset(n->num, 0, sizeof(char) * n->cap);
+      n->neg = false;
+      return BC_STATUS_SUCCESS;
+    }
+
     status = bc_num_expand(n, len);
 
     if (status) return status;
 
-    memset(n->num, 0, sizeof(char) * len);
   }
   else {
-
-    n->num = malloc(BC_NUM_DEF_SIZE);
-
-    if (!n->num) return BC_STATUS_MALLOC_FAIL;
-
-    memset(n->num, 0, sizeof(char) * BC_NUM_DEF_SIZE);
-
+    memset(n->num, 0, sizeof(char) * n->cap);
+    n->neg = false;
     return BC_STATUS_SUCCESS;
   }
 
@@ -822,51 +829,24 @@
   radix -= i;
   len -= i;
 
-  scale = len - radix;
+  n->rdx = len - radix;
+  end = len - 1;
 
-  for (i = 0; i < radix; ++i) {
-    n->num[i] = BC_NUM_FROM_CHAR(ptr[i]);
+  for (i = 0; i < n->rdx; ++i) {
+    n->num[i] = BC_NUM_FROM_CHAR(ptr[end - i]);
     n->len += 1;
   }
 
-  ptr += radix + 1;
-
-  n->rdx = radix;
-
   if (i >= len) return BC_STATUS_SUCCESS;
 
-  inv_pow = 0;
-
-  while (inv_pow < scale && ptr[inv_pow] == '0') ++inv_pow;
-
-  if (!radix && (inv_pow >= scale || ptr[inv_pow] == '\0')) {
-
-    if (!n->len) n->neg = false;
-
-    n->rdx = n->len;
-
-    return BC_STATUS_SUCCESS;
-  }
-
   num = n->num + n->len;
+  end = radix - 1;
 
-  for (i = 0; i < inv_pow; ++i) {
-    num[i] = 0;
+  for (i = 0; i < radix; ++i) {
+    num[i] = BC_NUM_FROM_CHAR(val[end - i]);
     ++n->len;
   }
 
-  c = ptr[i];
-
-  while (i < scale && c != '\0') {
-
-    num[i] = BC_NUM_FROM_CHAR(c);
-
-    ++n->len;
-
-    ++i;
-    c = ptr[i];
-  }
-
   return BC_STATUS_SUCCESS;
 }
 
@@ -903,7 +883,7 @@
       ++chars;
     }
 
-    for (i = 0; i < n->rdx; ++i) {
+    for (i = n->len - 1; i >= n->rdx && i < n->len; --i) {
 
       fputc(BC_NUM_TO_CHAR(n->num[i]), f);
       ++chars;
@@ -915,7 +895,7 @@
       }
     }
 
-    if (i < n->len) {
+    if (n->rdx) {
 
       fputc('.', f);
       ++chars;
@@ -926,7 +906,7 @@
         chars = 0;
       }
 
-      for (; i < n->len; ++i) {
+      for (; i < n->len; --i) {
 
         fputc(BC_NUM_TO_CHAR(n->num[i]), f);
         ++chars;