diff options
Diffstat (limited to 'support/dktools/dk4maai32.ctr')
-rw-r--r-- | support/dktools/dk4maai32.ctr | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/support/dktools/dk4maai32.ctr b/support/dktools/dk4maai32.ctr new file mode 100644 index 0000000000..d03cd997bd --- /dev/null +++ b/support/dktools/dk4maai32.ctr @@ -0,0 +1,299 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2016-xxxx +license = bsd + + +%% header + +/** @file dk4maai32.h Operations on int32_t data. +*/ + + +#ifndef DK4CONF_H_INCLUDED +#include "dk4conf.h" +#endif + +#ifndef DK4TYPES_H_INCLUDED +#include "dk4types.h" +#endif + +#ifndef DK4ERROR_H_INCLUDED +#include "dk4error.h" +#endif + +#if DK4_HAVE_STDLIB_H +#ifndef DK4_STDLIB_H_INCLUDED +#include <stdlib.h> +#define DK4_STDLIB_H_INCLUDED 1 +#endif +#endif + +#if DK4_HAVE_SYS_TYPES_H +#ifndef DK4_SYS_TYPES_H_INCLUDED +#include <sys/types.h> +#define DK4_SYS_TYPES_H_INCLUDED 1 +#endif +#endif + +#if DK4_HAVE_STDINT_H +#ifndef DK4_STDINT_H_INCLUDED +#include <stdint.h> +#define DK4_STDINT_H_INCLUDED 1 +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** Addition of int32_t. + @param a Left operand. + @param b Right operand. + @param erp Error report, may be NULL. + @return Operation result. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if a or b is out of range + - DK4_E_MATH_OVERFLOW<br> + if a mathematical overfow occured. +*/ +int32_t +dk4ma_int32_t_add(int32_t a, int32_t b, dk4_er_t *erp); + +/** Substraction of int32_t. + @param a Left operand. + @param b Right operand. + @param erp Error report, may be NULL. + @return Operation result. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if a or b is out of range + - DK4_E_MATH_OVERFLOW<br> + if a mathematical overfow occured. +*/ +int32_t +dk4ma_int32_t_sub(int32_t a, int32_t b, dk4_er_t *erp); + +/** Multiplication of int32_t. + @param a Left operand. + @param b Right operand. + @param erp Error report, may be NULL. + @return Operation result. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if a or b is out of range + - DK4_E_MATH_OVERFLOW<br> + if a mathematical overfow occured. +*/ +int32_t +dk4ma_int32_t_mul(int32_t a, int32_t b, dk4_er_t *erp); + +/** Division of int32_t. + @param a Left operand. + @param b Right operand. + @param erp Error report, may be NULL. + @return Operation result. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if a or b is out of range + - DK4_E_MATH_OVERFLOW<br> + if a mathematical overfow occured, + - DK4_E_MATH_DIVZERO<br> + if b is 0. +*/ +int32_t +dk4ma_int32_t_div(int32_t a, int32_t b, dk4_er_t *erp); + +/** Absolute value. + @param a Argument. + @param erp Error report, may be NULL. + @return Absolute value of a. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if a or b is out of range + - DK4_E_MATH_OVERFLOW<br> + if a mathematical overfow occured. +*/ +int32_t +dk4ma_int32_t_abs(int32_t a, dk4_er_t *erp); + +#ifdef __cplusplus +} +#endif + + +%% module + +#include "dk4maai32.h" + + + +$!trace-include + + + +int32_t +dk4ma_int32_t_add(int32_t a, int32_t b, dk4_er_t *erp) +{ + if ((DK4_I32_MAX < a) || (DK4_I32_MIN > a)) { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + goto finished; + } + if ((DK4_I32_MAX < b) || (DK4_I32_MIN > b)) { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + goto finished; + } + if ((0L < a) && (0L < b)) { + if ((DK4_I32_MAX - a) < b) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } else { + if ((0L > a) && (0L > b)) { + if (DK4_I32_MIN == a) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } else { + if ((DK4_I32_MIN - a) > b) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } + } + } +finished: + return (a + b); +} + + + +int32_t +dk4ma_int32_t_sub(int32_t a, int32_t b, dk4_er_t *erp) +{ + if ((DK4_I32_MAX < a) || (DK4_I32_MIN > a)) { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + goto finished; + } + if ((DK4_I32_MAX < b) || (DK4_I32_MIN > b)) { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + goto finished; + } + if ((0L < a) && (0L > b)) { + if ((DK4_I32_MAX + b) < a) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } else { + if ((0L > a) && (0L < b)) { + if ((DK4_I32_MIN + b) > a) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } + } +finished: + return (a - b); +} + + + +int32_t +dk4ma_int32_t_mul(int32_t a, int32_t b, dk4_er_t *erp) +{ + if ((DK4_I32_MAX < a) || (DK4_I32_MIN > a)) { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + goto finished; + } + if ((DK4_I32_MAX < b) || (DK4_I32_MIN > b)) { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + goto finished; + } + if ((0L != a) && (0L != b)) { + if (DK4_I32_MIN == b) { + if (1L != a) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } else { + if (DK4_I32_MIN == a) { + if (1L != b) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } else { + if (0L < a) { + if (0L < b) { + if ((DK4_I32_MAX / a) < b) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } else { + if ((DK4_I32_MIN / a) > b) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } + } else { + if (0L < b) { + if ((DK4_I32_MIN / b) > a) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } else { + if ((DK4_I32_MAX / (0L - a)) < (0L - b)) { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } + } + } + } + } + } +finished: + return (a * b); +} + + + +int32_t +dk4ma_int32_t_div(int32_t a, int32_t b, dk4_er_t *erp) +{ + int32_t back = 0L; + if ((DK4_I32_MAX < a) || (DK4_I32_MIN > a)) { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + goto finished; + } + if ((DK4_I32_MAX < b) || (DK4_I32_MIN > b)) { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + goto finished; + } +finished: + if (0L != b) { + if ((DK4_I32_MIN == a) && (-1L == b)) { + back = DK4_I32_MAX; + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + } else { + back = a / b; + } + } else { + if (0L < a) { + back = DK4_I32_MAX; + } else { + if (0L > a) { + back = DK4_I32_MIN; + } + } + dk4error_set_simple_error_code(erp, DK4_E_MATH_DIVZERO); + } + return back; +} + + + +int32_t +dk4ma_int32_t_abs(int32_t a, dk4_er_t *erp) +{ + if (DK4_I32_MIN != a) { + return (0L - a); + } else { + dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); + return (DK4_I32_MAX); + } +} + |