1 /*
2 Copyright (C) 2014-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 /*
7 WARNING: This file was generated by the dkct program (see
8 http://dktools.sourceforge.net/ for details).
9 Changes you make here will be lost if dkct is run again!
10 You should modify the original source and run dkct on it.
11 Original source: dk3maul.ctr
12 */
13
14 /** @file dk3maul.c The dk3maul module.
15 */
16
17
18
19
20 #include <libdk3c/dk3ma.h>
21 #include <libdk3c/dk3unused.h>
22
23
24
25
26
27
28
29 unsigned long
dk3ma_ul_add_ok(unsigned long a,unsigned long b,int * ec)30 dk3ma_ul_add_ok(unsigned long a, unsigned long b, int *ec)
31 {
32
33 if (NULL != ec) {
34 if ((DK3_UL_MAX - a) < b) { *ec = DK3_ERROR_MATH_OVERFLOW; }
35 }
36 return (a + b);
37 }
38
39
40
41 unsigned long
dk3ma_ul_sub_ok(unsigned long a,unsigned long b,int * ec)42 dk3ma_ul_sub_ok(unsigned long a, unsigned long b, int *ec)
43 {
44
45 if (NULL != ec) {
46 if (b > a) {
47 *ec = DK3_ERROR_MATH_OVERFLOW;
48 }
49 }
50 return (a - b);
51 }
52
53
54
55 unsigned long
dk3ma_ul_mul_ok(unsigned long a,unsigned long b,int * ec)56 dk3ma_ul_mul_ok(unsigned long a, unsigned long b, int *ec)
57 {
58
59 if (NULL != ec) {
60 if (0UL != a) {
61 if ((DK3_UL_MAX / a) < b) {
62 *ec = DK3_ERROR_MATH_OVERFLOW;
63 }
64 }
65 }
66 return (a * b);
67 }
68
69
70
71 unsigned long
dk3ma_ul_div_ok(unsigned long a,unsigned long b,int * ec)72 dk3ma_ul_div_ok(unsigned long a, unsigned long b, int *ec)
73 {
74 unsigned long back = 0UL;
75
76 if (0UL != b) {
77 back = a / b;
78 } else {
79 if (NULL != ec) {
80 *ec = DK3_ERROR_MATH_DIVZERO;
81 }
82 back = DK3_UL_MAX;
83 }
84 return back;
85 }
86
87
88
89 unsigned long
dk3ma_ul_gcd(unsigned long a,unsigned long b)90 dk3ma_ul_gcd(unsigned long a, unsigned long b)
91 {
92 unsigned long h;
93
94 while (0UL < b) {
95 h = a % b;
96 a = b;
97 b = h;
98 }
99 if (0UL == a) { a = 1UL; }
100 return a;
101 }
102
103
104
105 #if DK3_HAVE_LONG_LONG
106
107 unsigned long long
dk3ma_ull_add_ok(unsigned long long a,unsigned long long b,int * ec)108 dk3ma_ull_add_ok(unsigned long long a, unsigned long long b, int *ec)
109 {
110 #if DK3_ON_WINDOWS
111
112 #else
113
114 #endif
115 if (NULL != ec) {
116 if ((DK3_ULL_MAX - a) < b) {
117 *ec = DK3_ERROR_MATH_OVERFLOW;
118 }
119 }
120 #if DK3_ON_WINDOWS
121
122 #else
123
124 #endif
125 return (a + b);
126 }
127
128
129
130 unsigned long long
dk3ma_ull_sub_ok(unsigned long long a,unsigned long long b,int * ec)131 dk3ma_ull_sub_ok(unsigned long long a, unsigned long long b, int *ec)
132 {
133 #if DK3_ON_WINDOWS
134
135 #else
136
137 #endif
138 if (NULL != ec) {
139 if (b > a) {
140 *ec = DK3_ERROR_MATH_OVERFLOW;
141 }
142 }
143 #if DK3_ON_WINDOWS
144
145 #else
146
147 #endif
148 return (a - b);
149 }
150
151
152
153 unsigned long long
dk3ma_ull_mul_ok(unsigned long long a,unsigned long long b,int * ec)154 dk3ma_ull_mul_ok(unsigned long long a, unsigned long long b, int *ec)
155 {
156 #if DK3_ON_WINDOWS
157
158 #else
159
160 #endif
161 if (NULL != ec) {
162 if (0ULL != a) {
163 if ((DK3_ULL_MAX / a) < b) { *ec = DK3_ERROR_MATH_OVERFLOW; }
164 }
165 }
166 #if DK3_ON_WINDOWS
167
168 #else
169
170 #endif
171 return (a * b);
172 }
173
174
175
176 unsigned long long
dk3ma_ull_div_ok(unsigned long long a,unsigned long long b,int * ec)177 dk3ma_ull_div_ok(unsigned long long a, unsigned long long b, int *ec)
178 {
179 unsigned long long back = (unsigned long long)0;
180 #if DK3_ON_WINDOWS
181
182 #else
183
184 #endif
185 if (0ULL != b) {
186 back = a / b;
187 } else {
188 if (NULL != ec) {
189 *ec = DK3_ERROR_MATH_DIVZERO;
190 }
191 back = DK3_ULL_MAX;
192 }
193 #if DK3_ON_WINDOWS
194
195 #else
196
197 #endif
198 return back;
199 }
200
201
202
203 unsigned long long
dk3ma_ull_gcd(unsigned long long a,unsigned long long b)204 dk3ma_ull_gcd(unsigned long long a, unsigned long long b)
205 {
206 unsigned long long h;
207 #if DK3_ON_WINDOWS
208
209 #else
210
211 #endif
212 while (0ULL < b) {
213 h = a % b;
214 a = b;
215 b = h;
216 }
217 if (0ULL == a) { a = 1ULL; }
218 #if DK3_ON_WINDOWS
219
220 #else
221
222 #endif
223 return a;
224 }
225
226
227 #endif
228
229
230
231 #if DK3_HAVE_INTMAX_T
232
233 uintmax_t
dk3ma_uintmax_t_add_ok(uintmax_t a,uintmax_t b,int * ec)234 dk3ma_uintmax_t_add_ok(uintmax_t a, uintmax_t b, int *ec)
235 {
236 #if DK3_ON_WINDOWS
237
238 #else
239
240 #endif
241 if (NULL != ec) {
242 if ((DK3_UINTMAX_T_MAX - a) < b) {
243 *ec = DK3_ERROR_MATH_OVERFLOW;
244 }
245 }
246 #if DK3_ON_WINDOWS
247
248 #else
249
250 #endif
251 return (a + b);
252 }
253
254
255
256 uintmax_t
dk3ma_uintmax_t_sub_ok(uintmax_t a,uintmax_t b,int * ec)257 dk3ma_uintmax_t_sub_ok(uintmax_t a, uintmax_t b, int *ec)
258 {
259 #if DK3_ON_WINDOWS
260
261 #else
262
263 #endif
264 if (NULL != ec) {
265 if (b > a) {
266 *ec = DK3_ERROR_MATH_OVERFLOW;
267 }
268 }
269 #if DK3_ON_WINDOWS
270
271 #else
272
273 #endif
274 return (a - b);
275 }
276
277
278
279 uintmax_t
dk3ma_uintmax_t_mul_ok(uintmax_t a,uintmax_t b,int * ec)280 dk3ma_uintmax_t_mul_ok(uintmax_t a, uintmax_t b, int *ec)
281 {
282 #if DK3_ON_WINDOWS
283
284 #else
285
286 #endif
287 if (NULL != ec) {
288 if (DK3_UINTMAX_T_0 != a) {
289 if ((DK3_UINTMAX_T_MAX / a) < b) {
290 *ec = DK3_ERROR_MATH_OVERFLOW;
291 }
292 }
293 }
294 #if DK3_ON_WINDOWS
295
296 #else
297
298 #endif
299 return (a * b);
300 }
301
302
303
304 uintmax_t
dk3ma_uintmax_t_div_ok(uintmax_t a,uintmax_t b,int * ec)305 dk3ma_uintmax_t_div_ok(uintmax_t a, uintmax_t b, int *ec)
306 {
307 uintmax_t back = (uintmax_t)0;
308 #if DK3_ON_WINDOWS
309
310 #else
311
312 #endif
313 if (DK3_UINTMAX_T_0 != b) {
314 back = a / b;
315 } else {
316 if (NULL != ec) {
317 *ec = DK3_ERROR_MATH_DIVZERO;
318 }
319 back = DK3_UINTMAX_T_MAX;
320 }
321 #if DK3_ON_WINDOWS
322
323 #else
324
325 #endif
326 return back;
327 }
328
329
330
331 uintmax_t
dk3ma_uintmax_t_gcd(uintmax_t a,uintmax_t b)332 dk3ma_uintmax_t_gcd(uintmax_t a, uintmax_t b)
333 {
334 uintmax_t h;
335 #if DK3_ON_WINDOWS
336
337 #else
338
339 #endif
340 while (DK3_UINTMAX_T_0 < b) {
341 h = a % b;
342 a = b;
343 b = h;
344 }
345 if (DK3_UINTMAX_T_0 == a) { a = DK3_UINTMAX_T_1; }
346 #if DK3_ON_WINDOWS
347
348 #else
349
350 #endif
351 return a;
352 }
353
354
355 #endif
356
357
358
359 dk3_um_t
dk3ma_um_add_ok(dk3_um_t a,dk3_um_t b,int * ec)360 dk3ma_um_add_ok(dk3_um_t a, dk3_um_t b, int *ec)
361 {
362 #if DK3_HAVE_INTMAX_T
363 return (dk3ma_uintmax_t_add_ok(a, b, ec));
364 #else
365 #if DK3_HAVE_LONG_LONG
366 return (dk3ma_ull_add_ok(a, b, ec));
367 #else
368 return (dk3ma_ul_add_ok(a, b, ec));
369 #endif
370 #endif
371 }
372
373
374
375 dk3_um_t
dk3ma_um_sub_ok(dk3_um_t a,dk3_um_t b,int * ec)376 dk3ma_um_sub_ok(dk3_um_t a, dk3_um_t b, int *ec)
377 {
378 #if DK3_HAVE_INTMAX_T
379 return (dk3ma_uintmax_t_sub_ok(a, b, ec));
380 #else
381 #if DK3_HAVE_LONG_LONG
382 return (dk3ma_ull_sub_ok(a, b, ec));
383 #else
384 return (dk3ma_ul_sub_ok(a, b, ec));
385 #endif
386 #endif
387 }
388
389
390
391 dk3_um_t
dk3ma_um_mul_ok(dk3_um_t a,dk3_um_t b,int * ec)392 dk3ma_um_mul_ok(dk3_um_t a, dk3_um_t b, int *ec)
393 {
394 #if DK3_HAVE_INTMAX_T
395 return (dk3ma_uintmax_t_mul_ok(a, b, ec));
396 #else
397 #if DK3_HAVE_LONG_LONG
398 return (dk3ma_ull_mul_ok(a, b, ec));
399 #else
400 return (dk3ma_ul_mul_ok(a, b, ec));
401 #endif
402 #endif
403 }
404
405
406
407 dk3_um_t
dk3ma_um_div_ok(dk3_um_t a,dk3_um_t b,int * ec)408 dk3ma_um_div_ok(dk3_um_t a, dk3_um_t b, int *ec)
409 {
410 #if DK3_HAVE_INTMAX_T
411 return (dk3ma_uintmax_t_div_ok(a, b, ec));
412 #else
413 #if DK3_HAVE_LONG_LONG
414 return (dk3ma_ull_div_ok(a, b, ec));
415 #else
416 return (dk3ma_ul_div_ok(a, b, ec));
417 #endif
418 #endif
419 }
420
421
422
423 dk3_um_t
dk3ma_um_gcd(dk3_um_t a,dk3_um_t b)424 dk3ma_um_gcd(dk3_um_t a, dk3_um_t b)
425 {
426 #if DK3_HAVE_INTMAX_T
427 return (dk3ma_uintmax_t_gcd(a, b));
428 #else
429 #if DK3_HAVE_LONG_LONG
430 return (dk3ma_ull_gcd(a, b));
431 #else
432 return (dk3ma_ul_gcd(a, b));
433 #endif
434 #endif
435 }
436
437
438
439 size_t
dk3ma_um_to_sz(dk3_um_t um,int * DK3_ARG_UNUSED (ec))440 dk3ma_um_to_sz(dk3_um_t um, int * DK3_ARG_UNUSED(ec) )
441 {
442 size_t back = 0;
443
444 DK3_UNUSED_ARG(ec)
445 #if DK3_SIZEOF_SIZE_T >= DK3_SIZEOF_UM
446 back = (size_t)um;
447 #else
448 if ((dk3_um_t)DK3_SIZE_T_MAX >= um) {
449 back = (size_t)um;
450 } else {
451 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
452 }
453 #endif
454 return back;
455 }
456
457