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