/* * Copyright (c) 2021, Mițca Dumitru * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include extern "C" { imaxdiv_t imaxdiv(intmax_t numerator, intmax_t denominator) { imaxdiv_t result; result.quot = numerator / denominator; result.rem = numerator % denominator; if (numerator >= 0 && result.rem < 0) { result.quot++; result.rem -= denominator; } return result; } intmax_t strtoimax(char const* str, char** endptr, int base) { long long_value = strtoll(str, endptr, base); intmax_t max_int_value = NumericLimits::max(); intmax_t min_int_value = NumericLimits::min(); if (long_value > max_int_value) { errno = -ERANGE; return max_int_value; } else if (long_value < min_int_value) { errno = -ERANGE; return min_int_value; } return long_value; } uintmax_t strtoumax(char const* str, char** endptr, int base) { unsigned long ulong_value = strtoull(str, endptr, base); uintmax_t max_uint_value = NumericLimits::max(); if (ulong_value > max_uint_value) { errno = -ERANGE; return max_uint_value; } return ulong_value; } }