/* Copyright (C) 2014-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk3maul.ctr */ /** @file dk3maul.c The dk3maul module. */ #line 271 "dk3maul.ctr" #include "dk3ma.h" #include "dk3unused.h" #line 280 "dk3maul.ctr" unsigned long dk3ma_ul_add_ok(unsigned long a, unsigned long b, int *ec) { #line 287 "dk3maul.ctr" if (NULL != ec) { #line 288 "dk3maul.ctr" if ((DK3_UL_MAX - a) < b) { *ec = DK3_ERROR_MATH_OVERFLOW; } } #line 290 "dk3maul.ctr" return (a + b); } unsigned long dk3ma_ul_sub_ok(unsigned long a, unsigned long b, int *ec) { #line 299 "dk3maul.ctr" if (NULL != ec) { if (b > a) { #line 301 "dk3maul.ctr" *ec = DK3_ERROR_MATH_OVERFLOW; } } return (a - b); } unsigned long dk3ma_ul_mul_ok(unsigned long a, unsigned long b, int *ec) { #line 313 "dk3maul.ctr" if (NULL != ec) { if (0UL != a) { if ((DK3_UL_MAX / a) < b) { #line 316 "dk3maul.ctr" *ec = DK3_ERROR_MATH_OVERFLOW; } } } #line 320 "dk3maul.ctr" return (a * b); } unsigned long dk3ma_ul_div_ok(unsigned long a, unsigned long b, int *ec) { unsigned long back = 0UL; #line 330 "dk3maul.ctr" if (0UL != b) { back = a / b; } else { if (NULL != ec) { #line 334 "dk3maul.ctr" *ec = DK3_ERROR_MATH_DIVZERO; } back = DK3_UL_MAX; } #line 338 "dk3maul.ctr" return back; } unsigned long dk3ma_ul_gcd(unsigned long a, unsigned long b) { unsigned long h; #line 348 "dk3maul.ctr" while (0UL < b) { h = a % b; a = b; b = h; } if (0UL == a) { a = 1UL; } #line 354 "dk3maul.ctr" return a; } #if DK3_HAVE_LONG_LONG unsigned long long dk3ma_ull_add_ok(unsigned long long a, unsigned long long b, int *ec) { #if DK3_ON_WINDOWS #line 366 "dk3maul.ctr" #else #line 368 "dk3maul.ctr" #endif if (NULL != ec) { if ((DK3_ULL_MAX - a) < b) { #line 371 "dk3maul.ctr" *ec = DK3_ERROR_MATH_OVERFLOW; } } #if DK3_ON_WINDOWS #line 376 "dk3maul.ctr" #else #line 378 "dk3maul.ctr" #endif return (a + b); } unsigned long long dk3ma_ull_sub_ok(unsigned long long a, unsigned long long b, int *ec) { #if DK3_ON_WINDOWS #line 389 "dk3maul.ctr" #else #line 391 "dk3maul.ctr" #endif if (NULL != ec) { if (b > a) { #line 394 "dk3maul.ctr" *ec = DK3_ERROR_MATH_OVERFLOW; } } #if DK3_ON_WINDOWS #line 399 "dk3maul.ctr" #else #line 401 "dk3maul.ctr" #endif return (a - b); } unsigned long long dk3ma_ull_mul_ok(unsigned long long a, unsigned long long b, int *ec) { #if DK3_ON_WINDOWS #line 412 "dk3maul.ctr" #else #line 414 "dk3maul.ctr" #endif if (NULL != ec) { if (0ULL != a) { #line 417 "dk3maul.ctr" if ((DK3_ULL_MAX / a) < b) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } #if DK3_ON_WINDOWS #line 422 "dk3maul.ctr" #else #line 424 "dk3maul.ctr" #endif return (a * b); } unsigned long long dk3ma_ull_div_ok(unsigned long long a, unsigned long long b, int *ec) { unsigned long long back = (unsigned long long)0; #if DK3_ON_WINDOWS #line 436 "dk3maul.ctr" #else #line 438 "dk3maul.ctr" #endif if (0ULL != b) { back = a / b; } else { if (NULL != ec) { #line 443 "dk3maul.ctr" *ec = DK3_ERROR_MATH_DIVZERO; } back = DK3_ULL_MAX; } #if DK3_ON_WINDOWS #line 449 "dk3maul.ctr" #else #line 451 "dk3maul.ctr" #endif return back; } unsigned long long dk3ma_ull_gcd(unsigned long long a, unsigned long long b) { unsigned long long h; #if DK3_ON_WINDOWS #line 463 "dk3maul.ctr" #else #line 465 "dk3maul.ctr" #endif while (0ULL < b) { h = a % b; a = b; b = h; } if (0ULL == a) { a = 1ULL; } #if DK3_ON_WINDOWS #line 474 "dk3maul.ctr" #else #line 476 "dk3maul.ctr" #endif return a; } #endif #if DK3_HAVE_INTMAX_T uintmax_t dk3ma_uintmax_t_add_ok(uintmax_t a, uintmax_t b, int *ec) { #if DK3_ON_WINDOWS #line 492 "dk3maul.ctr" #else #line 494 "dk3maul.ctr" #endif if (NULL != ec) { if ((DK3_UINTMAX_T_MAX - a) < b) { #line 497 "dk3maul.ctr" *ec = DK3_ERROR_MATH_OVERFLOW; } } #if DK3_ON_WINDOWS #line 502 "dk3maul.ctr" #else #line 504 "dk3maul.ctr" #endif return (a + b); } uintmax_t dk3ma_uintmax_t_sub_ok(uintmax_t a, uintmax_t b, int *ec) { #if DK3_ON_WINDOWS #line 515 "dk3maul.ctr" #else #line 517 "dk3maul.ctr" #endif if (NULL != ec) { if (b > a) { #line 520 "dk3maul.ctr" *ec = DK3_ERROR_MATH_OVERFLOW; } } #if DK3_ON_WINDOWS #line 525 "dk3maul.ctr" #else #line 527 "dk3maul.ctr" #endif return (a - b); } uintmax_t dk3ma_uintmax_t_mul_ok(uintmax_t a, uintmax_t b, int *ec) { #if DK3_ON_WINDOWS #line 538 "dk3maul.ctr" #else #line 540 "dk3maul.ctr" #endif if (NULL != ec) { if (DK3_UINTMAX_T_0 != a) { if ((DK3_UINTMAX_T_MAX / a) < b) { #line 544 "dk3maul.ctr" *ec = DK3_ERROR_MATH_OVERFLOW; } } } #if DK3_ON_WINDOWS #line 550 "dk3maul.ctr" #else #line 552 "dk3maul.ctr" #endif return (a * b); } uintmax_t dk3ma_uintmax_t_div_ok(uintmax_t a, uintmax_t b, int *ec) { uintmax_t back = (uintmax_t)0; #if DK3_ON_WINDOWS #line 564 "dk3maul.ctr" #else #line 566 "dk3maul.ctr" #endif if (DK3_UINTMAX_T_0 != b) { back = a / b; } else { if (NULL != ec) { #line 571 "dk3maul.ctr" *ec = DK3_ERROR_MATH_DIVZERO; } back = DK3_UINTMAX_T_MAX; } #if DK3_ON_WINDOWS #line 577 "dk3maul.ctr" #else #line 579 "dk3maul.ctr" #endif return back; } uintmax_t dk3ma_uintmax_t_gcd(uintmax_t a, uintmax_t b) { uintmax_t h; #if DK3_ON_WINDOWS #line 591 "dk3maul.ctr" #else #line 593 "dk3maul.ctr" #endif while (DK3_UINTMAX_T_0 < b) { h = a % b; a = b; b = h; } if (DK3_UINTMAX_T_0 == a) { a = DK3_UINTMAX_T_1; } #if DK3_ON_WINDOWS #line 602 "dk3maul.ctr" #else #line 604 "dk3maul.ctr" #endif return a; } #endif dk3_um_t dk3ma_um_add_ok(dk3_um_t a, dk3_um_t b, int *ec) { #if DK3_HAVE_INTMAX_T return (dk3ma_uintmax_t_add_ok(a, b, ec)); #else #if DK3_HAVE_LONG_LONG return (dk3ma_ull_add_ok(a, b, ec)); #else return (dk3ma_ul_add_ok(a, b, ec)); #endif #endif } dk3_um_t dk3ma_um_sub_ok(dk3_um_t a, dk3_um_t b, int *ec) { #if DK3_HAVE_INTMAX_T return (dk3ma_uintmax_t_sub_ok(a, b, ec)); #else #if DK3_HAVE_LONG_LONG return (dk3ma_ull_sub_ok(a, b, ec)); #else return (dk3ma_ul_sub_ok(a, b, ec)); #endif #endif } dk3_um_t dk3ma_um_mul_ok(dk3_um_t a, dk3_um_t b, int *ec) { #if DK3_HAVE_INTMAX_T return (dk3ma_uintmax_t_mul_ok(a, b, ec)); #else #if DK3_HAVE_LONG_LONG return (dk3ma_ull_mul_ok(a, b, ec)); #else return (dk3ma_ul_mul_ok(a, b, ec)); #endif #endif } dk3_um_t dk3ma_um_div_ok(dk3_um_t a, dk3_um_t b, int *ec) { #if DK3_HAVE_INTMAX_T return (dk3ma_uintmax_t_div_ok(a, b, ec)); #else #if DK3_HAVE_LONG_LONG return (dk3ma_ull_div_ok(a, b, ec)); #else return (dk3ma_ul_div_ok(a, b, ec)); #endif #endif } dk3_um_t dk3ma_um_gcd(dk3_um_t a, dk3_um_t b) { #if DK3_HAVE_INTMAX_T return (dk3ma_uintmax_t_gcd(a, b)); #else #if DK3_HAVE_LONG_LONG return (dk3ma_ull_gcd(a, b)); #else return (dk3ma_ul_gcd(a, b)); #endif #endif } size_t dk3ma_um_to_sz(dk3_um_t um, int * DK3_ARG_UNUSED(ec) ) { size_t back = 0; DK3_UNUSED_ARG(ec) #if DK3_SIZEOF_SIZE_T >= DK3_SIZEOF_UM back = (size_t)um; #else if ((dk3_um_t)DK3_SIZE_T_MAX >= um) { back = (size_t)um; } else { if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } #endif return back; }