@@ -19,16 +19,17 @@ static int format_integer(char *dst, cell *c, int grouping, int sep, int decimal
1919 size_t len = mp_int_string_len (& c -> val_bigint -> ival , radix ) - 1 ;
2020 tmpbuf1 = malloc (len + 1 );
2121 check_error (tmpbuf1 );
22+ mp_int_to_string (& c -> val_bigint -> ival , radix , tmpbuf1 , len + 1 );
23+ len *= 2 ;
2224 tmpbuf2 = malloc (len + 1 );
2325 check_error (tmpbuf2 );
24- mp_int_to_string (& c -> val_bigint -> ival , radix , tmpbuf1 , len + 1 );
2526 }
2627
2728 const char * src = tmpbuf1 + strlen (tmpbuf1 ) - 1 ; // start from back
2829 char * dst2 = tmpbuf2 ;
2930 int i = 1 , j = 1 ;
3031
31- while (src >= tmpbuf1 ) {
32+ while (src > tmpbuf1 ) {
3233 * dst2 ++ = * src -- ;
3334
3435 if (grouping && !decimals && !(i ++ % grouping ) && * src )
@@ -476,7 +477,7 @@ bool do_format(query *q, cell *str, pl_idx str_ctx, cell *p1, pl_idx p1_ctx, cel
476477
477478 print_term_to_buf (q , c , 0 , 0 , false);
478479 len = SB_strlen (q -> sb );
479- CHECK_BUF (len * 10 );
480+ CHECK_BUF (len * 2 + 1 );
480481 len = format_integer (dst , c , noargval ?3 :argval , '_' , 0 , 10 );
481482 break ;
482483
@@ -488,7 +489,7 @@ bool do_format(query *q, cell *str, pl_idx str_ctx, cell *p1, pl_idx p1_ctx, cel
488489
489490 print_term_to_buf (q , c , 0 , 0 , false);
490491 len = SB_strlen (q -> sb );
491- CHECK_BUF (len * 10 );
492+ CHECK_BUF (len * 2 + 1 );
492493 len = format_integer (dst , c , 0 , ',' , noargval ?0 :argval , 10 );
493494 break ;
494495
@@ -500,7 +501,7 @@ bool do_format(query *q, cell *str, pl_idx str_ctx, cell *p1, pl_idx p1_ctx, cel
500501
501502 print_term_to_buf (q , c , 0 , 0 , false);
502503 len = SB_strlen (q -> sb );
503- CHECK_BUF (len * 10 );
504+ CHECK_BUF (len * 2 + 1 );
504505 len = format_integer (dst , c , 3 , ',' , noargval ?0 :argval , 10 );
505506 break ;
506507
0 commit comments