#include "lib/intmath/muldiv.h"
#include "lib/err/torerr.h"
#include <stdlib.h>
unsigned
round_to_next_multiple_of(unsigned number, unsigned divisor)
{
raw_assert(divisor > 0);
if (UINT_MAX - divisor + 1 < number)
return UINT_MAX;
number += divisor - 1;
number -= number % divisor;
return number;
}
uint32_t
round_uint32_to_next_multiple_of(uint32_t number, uint32_t divisor)
{
raw_assert(divisor > 0);
if (UINT32_MAX - divisor + 1 < number)
return UINT32_MAX;
number += divisor - 1;
number -= number % divisor;
return number;
}
uint64_t
round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor)
{
raw_assert(divisor > 0);
if (UINT64_MAX - divisor + 1 < number)
return UINT64_MAX;
number += divisor - 1;
number -= number % divisor;
return number;
}
static uint64_t
gcd64(uint64_t a, uint64_t b)
{
while (b) {
uint64_t t = b;
b = a % b;
a = t;
}
return a;
}
uint64_t
tor_mul_u64_nowrap(uint64_t a, uint64_t b)
{
if (a == 0 || b == 0) {
return 0;
} else if (PREDICT_UNLIKELY(UINT64_MAX / a < b)) {
return UINT64_MAX;
} else {
return a*b;
}
}
void
simplify_fraction64(uint64_t *numer, uint64_t *denom)
{
raw_assert(denom);
uint64_t gcd = gcd64(*numer, *denom);
*numer /= gcd;
*denom /= gcd;
}