authorgravatar for marc@tiehu.isMarc Tiehuis <marc@tiehu.is> 2019-03-22 22:10:51+13:00
committergravatar for marc@tiehu.isMarc Tiehuis <marc@tiehu.is> 2019-03-22 22:10:51+13:00
log6f90d2c209ccf81498139133ee9ee4023eb176a6
tree86b85e656df35494a832e8f8826a6fc43436d62e
parentb5cc92f16391b1ff5d75e5e6b072b8338b3e8218

Fix bigint_append_buf

All current usages use base 10 and have a limb length of 1, hence why we weren't hitting this error in practice.

1 files changed, 7 insertions(+), 3 deletions(-)

src/bigint.cpp+7-3
......@@ -40,7 +40,7 @@ static uint8_t digit_to_char(uint8_t digit, bool uppercase) {
4040 if (digit <= 9) {
4141 return digit + '0';
4242 } else if (digit <= 35) {
43 return digit + (uppercase ? 'A' : 'a');
43 return (digit - 10) + (uppercase ? 'A' : 'a');
4444 } else {
4545 zig_unreachable();
4646 }
......@@ -1545,6 +1545,10 @@ void bigint_append_buf(Buf *buf, const BigInt *op, uint64_t base) {
15451545 buf_appendf(buf, "%" ZIG_PRI_u64, op->data.digit);
15461546 return;
15471547 }
1548 if (op->digit_count == 1 && base == 16) {
1549 buf_appendf(buf, "%" ZIG_PRI_x64, op->data.digit);
1550 return;
1551 }
15481552 size_t first_digit_index = buf_len(buf);
15491553
15501554 BigInt digit_bi = {0};
......@@ -1556,7 +1560,7 @@ void bigint_append_buf(Buf *buf, const BigInt *op, uint64_t base) {
15561560 bigint_init_bigint(a, op);
15571561
15581562 BigInt base_bi = {0};
1559 bigint_init_unsigned(&base_bi, 10);
1563 bigint_init_unsigned(&base_bi, base);
15601564
15611565 for (;;) {
15621566 bigint_rem(&digit_bi, a, &base_bi);
......@@ -1574,7 +1578,7 @@ void bigint_append_buf(Buf *buf, const BigInt *op, uint64_t base) {
15741578 }
15751579
15761580 // reverse
1577 for (size_t i = first_digit_index; i < buf_len(buf); i += 1) {
1581 for (size_t i = first_digit_index; i < buf_len(buf) / 2; i += 1) {
15781582 size_t other_i = buf_len(buf) + first_digit_index - i - 1;
15791583 uint8_t tmp = buf_ptr(buf)[i];
15801584 buf_ptr(buf)[i] = buf_ptr(buf)[other_i];