@@ -256,7 +256,8 @@ static void bc_do_div(
256
256
const char * numerator , size_t numerator_size , size_t numerator_readable_size ,
257
257
const char * divisor , size_t divisor_size ,
258
258
bc_num * quot , size_t quot_size ,
259
- bool use_quot
259
+ bc_num * rem , size_t rem_over_size , size_t rem_write_size ,
260
+ bool use_quot , bool use_rem
260
261
) {
261
262
size_t numerator_arr_size = BC_ARR_SIZE_FROM_LEN (numerator_size );
262
263
size_t divisor_arr_size = BC_ARR_SIZE_FROM_LEN (divisor_size );
@@ -298,6 +299,24 @@ static void bc_do_div(
298
299
char * qend = qptr + (* quot )-> n_len + (* quot )-> n_scale - 1 ;
299
300
bc_convert_vector_to_char (quot_vectors , qptr , qend , quot_real_arr_size );
300
301
}
302
+ if (use_rem ) {
303
+ char * rptr = (* rem )-> n_value ;
304
+ char * rend = rptr + rem_write_size - 1 ;
305
+
306
+ size_t rem_arr_size = (rem_write_size + rem_over_size + BC_VECTOR_SIZE - 1 ) / BC_VECTOR_SIZE ;
307
+ if (UNEXPECTED (rem_arr_size > numerator_arr_size )) {
308
+ /* If numerator_arr_size is exceeded because the integer part is zero */
309
+ rem_arr_size = numerator_arr_size ;
310
+ * rptr = 0 ;
311
+ }
312
+ BC_VECTOR * rem_vectors = numerator_vectors ;
313
+
314
+ if (rem_over_size > 0 ) {
315
+ bc_convert_vector_to_char_with_skip (rem_vectors , rptr , rend , rem_arr_size , rem_over_size );
316
+ } else {
317
+ bc_convert_vector_to_char (rem_vectors , rptr , rend , rem_arr_size );
318
+ }
319
+ }
301
320
302
321
if (allocation_arr_size > BC_STACK_VECTOR_SIZE ) {
303
322
efree (numerator_vectors );
@@ -524,7 +543,9 @@ bool bc_divide_ex(bc_num numerator, bc_num divisor, bc_num *quot, bc_num *rem, s
524
543
bc_do_div (
525
544
numeratorptr , numerator_size , numerator_readable_size ,
526
545
divisorptr , divisor_size ,
527
- quot , quot_size
546
+ quot , quot_size ,
547
+ rem , rem_over_size , rem_write_size ,
548
+ use_quot , use_rem
528
549
);
529
550
530
551
if (use_quot ) {
0 commit comments