Fix a bug in parsing different bases
This bug was actually in bc_num_alg_d(). It didn't properly zero a
number that was zero.
diff --git a/src/bc/num.c b/src/bc/num.c
index c7b9ff3..75a0f19 100644
--- a/src/bc/num.c
+++ b/src/bc/num.c
@@ -466,6 +466,7 @@
size_t end;
size_t i;
BcNum copy;
+ bool zero;
if (!b->len) return BC_STATUS_MATH_DIVIDE_BY_ZERO;
else if (!a->len) {
@@ -588,6 +589,9 @@
if (c->rdx > scale) status = bc_num_trunc(c, c->rdx - scale);
+ for (i = 0, zero = true; zero && i < c->len; ++i) zero = !c->num[i];
+ if (zero) bc_num_zero(c);
+
err:
bc_num_free(©);
@@ -1131,6 +1135,7 @@
size_t digits;
BcDigit c;
bool zero;
+ unsigned long v;
len = strlen(val);
@@ -1158,16 +1163,13 @@
for (i = 0; i < len && (c = val[i]) != '.'; ++i) {
- long v;
-
status = bc_num_mul(n, base, &mult, 0);
if (status) goto int_err;
- if (c <= '9') v = c - '0';
- else v = c - 'A' + 10;
+ v = c <= '9' ? c - '0' : c - 'A' + 10;
- status = bc_num_long2num(&temp, v);
+ status = bc_num_ulong2num(&temp, v);
if (status) goto int_err;
@@ -1190,15 +1192,15 @@
bc_num_zero(&result);
bc_num_one(&mult);
- for (digits = 0; i < len; ++i, ++digits) {
+ for (digits = 0; i < len && (c = val[i]); ++i, ++digits) {
- c = val[i];
+ v = c <= '9' ? c - '0' : c - 'A' + 10;
status = bc_num_mul(&result, base, &result, 0);
if (status) goto err;
- status = bc_num_long2num(&temp, (long) c);
+ status = bc_num_ulong2num(&temp, v);
if (status) goto err;
@@ -1215,7 +1217,15 @@
if (status) goto err;
- status = bc_num_add(n, &result, n, 0);
+ status = bc_num_add(n, &result, n, digits);
+
+ if (status) goto err;
+
+ if (n->len) {
+ if (n->rdx < digits && n->len)
+ status = bc_num_extend(n, digits - n->rdx);
+ }
+ else bc_num_zero(n);
err: