Skip to content

Commit a2ba77c

Browse files
committed
Using rem in bc_do_div
1 parent c7916b5 commit a2ba77c

File tree

1 file changed

+23
-2
lines changed
  • ext/bcmath/libbcmath/src

1 file changed

+23
-2
lines changed

ext/bcmath/libbcmath/src/div.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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,24 @@ 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+
/* 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+
}
301320

302321
if (allocation_arr_size > BC_STACK_VECTOR_SIZE) {
303322
efree(numerator_vectors);
@@ -524,7 +543,9 @@ bool bc_divide_ex(bc_num numerator, bc_num divisor, bc_num *quot, bc_num *rem, s
524543
bc_do_div(
525544
numeratorptr, numerator_size, numerator_readable_size,
526545
divisorptr, divisor_size,
527-
quot, quot_size
546+
quot, quot_size,
547+
rem, rem_over_size, rem_write_size,
548+
use_quot, use_rem
528549
);
529550

530551
if (use_quot) {

0 commit comments

Comments
 (0)