@@ -256,7 +256,8 @@ static void bc_do_div(
256256 const char * numerator , size_t numerator_size , size_t numerator_readable_size ,
257257 const char * divisor , size_t divisor_size ,
258258 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
260261) {
261262 size_t numerator_arr_size = BC_ARR_SIZE_FROM_LEN (numerator_size );
262263 size_t divisor_arr_size = BC_ARR_SIZE_FROM_LEN (divisor_size );
@@ -298,6 +299,23 @@ static void bc_do_div(
298299 char * qend = qptr + (* quot )-> n_len + (* quot )-> n_scale - 1 ;
299300 bc_convert_vector_to_char (quot_vectors , qptr , qend , quot_real_arr_size );
300301 }
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+ rem_arr_size = numerator_arr_size ;
309+ * rptr = 0 ;
310+ }
311+ BC_VECTOR * rem_vectors = numerator_vectors ;
312+
313+ if (rem_over_size > 0 ) {
314+ bc_convert_vector_to_char_with_skip (rem_vectors , rptr , rend , rem_arr_size , rem_over_size );
315+ } else {
316+ bc_convert_vector_to_char (rem_vectors , rptr , rend , rem_arr_size );
317+ }
318+ }
301319
302320 if (allocation_arr_size > BC_STACK_VECTOR_SIZE ) {
303321 efree (numerator_vectors );
@@ -524,7 +542,9 @@ bool bc_divide_ex(bc_num numerator, bc_num divisor, bc_num *quot, bc_num *rem, s
524542 bc_do_div (
525543 numeratorptr , numerator_size , numerator_readable_size ,
526544 divisorptr , divisor_size ,
527- quot , quot_size
545+ quot , quot_size ,
546+ rem , rem_over_size , rem_write_size ,
547+ use_quot , use_rem
528548 );
529549
530550 if (use_quot ) {
0 commit comments