1%% options 2 3copyright owner = Dirk Krause 4copyright year = 2015-xxxx 5SPDX-License-Identifier: BSD-3-Clause 6 7 8%% header 9 10/** @file 11 Arithmetic operations on size_t. 12 13 CRT on Windows: Optional. 14*/ 15 16#ifndef DK4CONF_H_INCLUDED 17#if DK4_BUILDING_DKTOOLS4 18#include "dk4conf.h" 19#else 20#include <dktools-4/dk4conf.h> 21#endif 22#endif 23 24#ifndef DK4TYPES_H_INCLUDED 25#if DK4_BUILDING_DKTOOLS4 26#include <libdk4base/dk4types.h> 27#else 28#include <dktools-4/dk4types.h> 29#endif 30#endif 31 32#ifndef DK4ERROR_H_INCLUDED 33#if DK4_BUILDING_DKTOOLS4 34#include <libdk4base/dk4error.h> 35#else 36#include <dktools-4/dk4error.h> 37#endif 38#endif 39 40 41 42#ifdef __cplusplus 43extern "C" { 44#endif 45 46/** Addition of size_t values. 47 @param a Left operand. 48 @param b Right operand. 49 @param erp Error report, may be NULL. 50 @return Result. 51*/ 52size_t 53dk4ma_size_t_add(size_t a, size_t b, dk4_er_t *erp); 54 55/** Difference of size_t values. 56 @param a Left operand. 57 @param b Right operand. 58 @param erp Error report, may be NULL. 59 @return Result. 60*/ 61size_t 62dk4ma_size_t_sub(size_t a, size_t b, dk4_er_t *erp); 63 64/** Multiplication of size_t values. 65 @param a Left operand. 66 @param b Right operand. 67 @param erp Error report, may be NULL. 68 @return Result. 69*/ 70size_t 71dk4ma_size_t_mul(size_t a, size_t b, dk4_er_t *erp); 72 73/** Convert dk4_um_t value to size_t. 74 @param u Value to convert. 75 @param erp Error report, may be NULL. 76 @return Conversion result. 77 78 Error codes: DK4_E_MATH_OVERFLOW. 79*/ 80size_t 81dk4ma_size_t_from(dk4_um_t u, dk4_er_t *erp); 82 83/** Convert double to signed char. 84 @param d Value to convert. 85 @param erp Error report, may be NULL. 86 @return Conversion result. 87 88 Error codes: DK4_E_OVERFLOW. 89*/ 90size_t 91dk4ma_size_t_from_double(double d, dk4_er_t *erp); 92 93#ifdef __cplusplus 94} 95#endif 96 97%% module 98 99#include "dk4conf.h" 100#include <libdk4base/dk4types.h> 101 102#if DK4_HAVE_LIMITS_H 103#ifndef LIMITS_H_INCLUDED 104#include <limits.h> 105#define LIMITS_H_INCLUDED 1 106#endif 107#endif 108#if DK4_HAVE_STDINT_H 109#ifndef STDINT_H_INCLUDED 110#if defined(__cplusplus) && (!defined(__STDC_LIMIT_MACROS)) 111#define __STDC_LIMIT_MACROS 1 112#endif 113#if defined(__cplusplus) && (!defined(__STDC_CONSTANT_MACROS)) 114#define __STDC_CONSTANT_MACROS 1 115#endif 116#include <stdint.h> 117#define STDINT_H_INCLUDED 1 118#endif 119#endif 120 121#include <libdk4base/dk4error.h> 122#include <libdk4ma/dk4maasz.h> 123#include <libdk4base/dk4error.h> 124#include <libdk4base/dk4numco.h> 125 126 127 128size_t 129dk4ma_size_t_add(size_t a, size_t b, dk4_er_t *erp) 130{ 131 if ((SIZE_MAX - b) < a) { 132 dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); 133 } 134 return (a + b); 135} 136 137 138 139size_t 140dk4ma_size_t_sub(size_t a, size_t b, dk4_er_t *erp) 141{ 142 if (b > a) { 143 dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); 144 } 145 return (a - b); 146} 147 148 149 150size_t 151dk4ma_size_t_mul(size_t a, size_t b, dk4_er_t *erp) 152{ 153 if ((0 < a) && (0 < b)) { 154 if ((SIZE_MAX / a) < b) { 155 dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); 156 } 157 } 158 return (a * b); 159} 160 161 162 163size_t 164dk4ma_size_t_from(dk4_um_t u, dk4_er_t *erp) 165{ 166 if ((dk4_um_t)(SIZE_MAX) < u) { 167 dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); 168 } 169 return ((size_t)u); 170} 171 172 173 174size_t 175dk4ma_size_t_from_double(double d, dk4_er_t *erp) 176{ 177 size_t back = 0; 178 179 if ((double)(SIZE_MAX) < d) { 180 dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); 181 back = SIZE_MAX; 182 } 183 else { 184 if (0.0 > d) { 185 dk4error_set_simple_error_code(erp,DK4_E_MATH_OVERFLOW); 186 } 187 else { 188 back = (size_t)d; 189 } 190 } 191 return back; 192} 193 194 195