inttypes.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /*
  2. * Copyright (c) 2021, Mițca Dumitru <dumitru0mitca@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/NumericLimits.h>
  7. #include <errno.h>
  8. #include <inttypes.h>
  9. #include <stdlib.h>
  10. extern "C" {
  11. imaxdiv_t imaxdiv(intmax_t numerator, intmax_t denominator)
  12. {
  13. imaxdiv_t result;
  14. result.quot = numerator / denominator;
  15. result.rem = numerator % denominator;
  16. if (numerator >= 0 && result.rem < 0) {
  17. result.quot++;
  18. result.rem -= denominator;
  19. }
  20. return result;
  21. }
  22. intmax_t strtoimax(char const* str, char** endptr, int base)
  23. {
  24. long long_value = strtoll(str, endptr, base);
  25. intmax_t max_int_value = NumericLimits<intmax_t>::max();
  26. intmax_t min_int_value = NumericLimits<intmax_t>::min();
  27. if (long_value > max_int_value) {
  28. errno = -ERANGE;
  29. return max_int_value;
  30. } else if (long_value < min_int_value) {
  31. errno = -ERANGE;
  32. return min_int_value;
  33. }
  34. return long_value;
  35. }
  36. uintmax_t strtoumax(char const* str, char** endptr, int base)
  37. {
  38. unsigned long ulong_value = strtoull(str, endptr, base);
  39. uintmax_t max_uint_value = NumericLimits<uintmax_t>::max();
  40. if (ulong_value > max_uint_value) {
  41. errno = -ERANGE;
  42. return max_uint_value;
  43. }
  44. return ulong_value;
  45. }
  46. }