Finish rewriting add for the array reverse refactor
diff --git a/src/bc/num.c b/src/bc/num.c
index 50abcdb..9f28fab 100644
--- a/src/bc/num.c
+++ b/src/bc/num.c
@@ -608,10 +608,11 @@
   char* ptr_a;
   char* ptr_b;
   char* ptr_c;
-  size_t scale_a;
-  size_t scale_b;
   size_t i;
   size_t min;
+  size_t diff;
+  size_t a_whole;
+  size_t b_whole;
   char carry;
 
   c->neg = a->neg;
@@ -626,24 +627,62 @@
 
   c->len = 0;
 
+  if (a->rdx > b->rdx) {
+
+    diff = a->rdx - b->rdx;
+
+    ptr = a->num;
+    ptr_a = a->num + diff;
+    ptr_b = b->num;
+  }
+  else {
+
+    diff = b->rdx - a->rdx;
+
+    ptr = b->num;
+    ptr_a = a->num;
+    ptr_b = b->num + diff;
+  }
+
+  ptr_c = c->num;
+
+  for (i = 0; i < diff; ++i) {
+    ptr_c[i] = ptr[i];
+    ++c->len;
+  }
+
+  ptr_c += diff;
+
+  carry = 0;
+
+  for (i = 0; i < min; ++i) {
+
+    ptr_c[i] = ptr_a[i] + ptr_b[i] + carry;
+    ++c->len;
+
+    carry = 0;
+
+    while (ptr_c[i] >= 10) {
+      carry += 1;
+      ptr_c[i] -= 10;
+    }
+  }
+
+  c->rdx = c->len;
+
+  a_whole = a->len - a->rdx;
+  b_whole = b->len - b->rdx;
+
+  min = BC_MIN(a_whole, b_whole);
+
   ptr_a = a->num + a->rdx;
   ptr_b = b->num + b->rdx;
   ptr_c = c->num + c->rdx;
 
-  ptr = scale_a > scale_b ? ptr_a : ptr_b;
-
-  i = scale - 1;
-
-  while (i < scale && i >= min) {
-    ptr_c[i] = ptr[i];
-    --i;
-  }
-
-  carry = 0;
-
-  for (; i < scale; --i) {
+  for (i = 0; i < min; ++i) {
 
     ptr_c[i] = ptr_a[i] + ptr_b[i] + carry;
+    ++c->len;
 
     carry = 0;
 
@@ -653,55 +692,27 @@
     }
   }
 
-  if (a->rdx == c->rdx - 1) {
+  if (a_whole > b_whole) {
 
-    min = b->rdx;
-    scale = a->rdx - min;
-    i = min - 1;
+    for (; i < a_whole; ++i) {
 
-    ptr_a = a->num + scale;
-    ptr_b = b->num;
-    ptr_c = c->num + (c->rdx - min);
+      ptr_c[i] = ptr_a[i] + carry;
+      ++c->len;
 
-    ptr = a->num;
+      carry = 0;
+    }
   }
   else {
 
-    min = a->rdx;
-    scale = b->rdx - min;
-    i = min - 1;
+    for (; i < b_whole; ++i) {
 
-    ptr_a = a->num;
-    ptr_b = b->num + scale;
-    ptr_c = c->num + (c->rdx - min);
+      ptr_c[i] = ptr_b[i] + carry;
+      ++c->len;
 
-    ptr = b->num;
-  }
-
-  for (; i < min; --i) {
-
-    ptr_c[i] = ptr_a[i] + ptr_b[i] + carry;
-
-    carry = 0;
-
-    while (ptr_c[i] >= 10) {
-      carry += 1;
-      ptr_c[i] -= 10;
+      carry = 0;
     }
   }
 
-  --ptr_c;
-
-  *ptr_c = carry;
-
-  i = scale - 1;
-
-  while (i < scale) {
-    *ptr_c += ptr[i];
-    --ptr_c;
-    --i;
-  }
-
   return BC_STATUS_SUCCESS;
 }
 
@@ -788,7 +799,7 @@
 
     b = base - 9 + 'A';
 
-    for (; i < len; ++i) {
+    for (i = 0; i < len; ++i) {
 
       c = val[i];