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