/* 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: dk3maus.ctr */ /** @file dk3maus.c The dk3maus module. */ #line 98 "dk3maus.ctr" #include "dk3ma.h" #line 106 "dk3maus.ctr" unsigned short dk3ma_us_add_ok(unsigned short a, unsigned short b, int *ec) { if (NULL != ec) { if ((DK3_US_MAX - a) < b) { *ec = DK3_ERROR_MATH_OVERFLOW; } } return (a + b); } unsigned short dk3ma_us_sub_ok(unsigned short a, unsigned short b, int *ec) { if (NULL != ec) { if (b > a) { *ec = DK3_ERROR_MATH_OVERFLOW; } } return (a - b); } unsigned short dk3ma_us_mul_ok(unsigned short a, unsigned short b, int *ec) { if (NULL != ec) { if (0 != a) { if ((DK3_US_MAX / a) < b) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } return (a * b); } unsigned short dk3ma_us_div_ok(unsigned short a, unsigned short b, int *ec) { unsigned short back = (unsigned short)0; if (0 != b) { back = a / b; } else { if (NULL != ec) { *ec = DK3_ERROR_MATH_DIVZERO; } back = DK3_US_MAX; } return back; } unsigned short dk3ma_us_gcd(unsigned short a, unsigned short b) { unsigned short h; while (0 < b) { h = a % b; a = b; b = h; } if (0 == a) { a = (unsigned short)1; } return a; }