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: dk3maid8.ctr
12 */
13
14 /** @file dk3maid8.c The dk3maid8 module.
15 */
16
17
18 #include <libdk3c/dk3ma.h>
19
20
21
22
23
24
25
26 /** Constant numeric values.
27 */
28 static dk3_um_t const dk3maid8_um_array[] = {
29 #if DK3_HAVE_LONG_LONG
30 /* 0 */ (dk3_um_t)10ULL,
31 /* 1 */ (dk3_um_t)1ULL,
32 /* 2 */ (dk3_um_t)2ULL,
33 /* 3 */ (dk3_um_t)3ULL,
34 /* 4 */ (dk3_um_t)4ULL,
35 /* 5 */ (dk3_um_t)5ULL,
36 /* 6 */ (dk3_um_t)6ULL,
37 /* 7 */ (dk3_um_t)7ULL,
38 /* 8 */ (dk3_um_t)8ULL,
39 /* 9 */ (dk3_um_t)9ULL,
40 /* 10 */ (dk3_um_t)10ULL,
41 /* 11 */ (dk3_um_t)11ULL,
42 /* 12 */ (dk3_um_t)12ULL,
43 /* 13 */ (dk3_um_t)13ULL,
44 /* 14 */ (dk3_um_t)14ULL,
45 /* 15 */ (dk3_um_t)15ULL,
46 /* 16 */ (dk3_um_t)16ULL
47 #else
48 /* 0 */ (dk3_um_t)10UL,
49 /* 1 */ (dk3_um_t)1UL,
50 /* 2 */ (dk3_um_t)2UL,
51 /* 3 */ (dk3_um_t)3UL,
52 /* 4 */ (dk3_um_t)4UL,
53 /* 5 */ (dk3_um_t)5UL,
54 /* 6 */ (dk3_um_t)6UL,
55 /* 7 */ (dk3_um_t)7UL,
56 /* 8 */ (dk3_um_t)8UL,
57 /* 9 */ (dk3_um_t)9UL,
58 /* 10 */ (dk3_um_t)10UL,
59 /* 11 */ (dk3_um_t)11UL,
60 /* 12 */ (dk3_um_t)12UL,
61 /* 13 */ (dk3_um_t)13UL,
62 /* 14 */ (dk3_um_t)14UL,
63 /* 15 */ (dk3_um_t)15UL,
64 /* 16 */ (dk3_um_t)16UL
65 #endif
66 };
67
68
69
70 /** Find start of text in string.
71 @param str String to search for text.
72 @return Pointer to start of text on success, NULL on error.
73 */
74 static
75 char const *
dk3maid8_str_c8_start(char const * str)76 dk3maid8_str_c8_start(char const *str)
77 {
78 char const *back = NULL;
79 if (NULL != str) {
80 back = str;
81 while((' ' == *back) || ('\t' == *back)) { back++; }
82 switch(*back) {
83 case '\0': case '\n': case '\r': {
84 back = NULL;
85 } break;
86 }
87 }
88 return back;
89 }
90
91
92
93 int
dk3ma_um_from_c8_string(dk3_um_t * rp,char const * src,int * ec)94 dk3ma_um_from_c8_string(dk3_um_t *rp, char const *src, int *ec)
95 {
96 char const *ptr = NULL; /* Current char to process */
97 dk3_um_t val = DK3_UM_0; /* Value found */
98 dk3_um_t op = DK3_UM_0; /* Operand to add */
99 int mec = 0; /* Math error code */
100 int back = 0; /* Function result */
101 int found = 0; /* Flag: Digits found */
102 int cc = 1; /* Flag: Can continue */
103 int action = 0; /* Action to take */
104
105 if ((NULL != rp) && (NULL != src)) {
106 ptr = dk3maid8_str_c8_start(src);
107 if (NULL != ptr) {
108 while (0 != cc) {
109 action = 0;
110 switch(*(ptr++)) {
111 case '\0': { /* End of string */
112 cc = 0;
113 if (0 != found) {
114 back = 1;
115 } else {
116 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
117 }
118 } break;
119 case '0': {
120 found = 1; action = 1; op = DK3_UM_0;
121 } break;
122 case '1': {
123 found = 1; action = 1; op = dk3maid8_um_array[1];
124 } break;
125 case '2': {
126 found = 1; action = 1; op = dk3maid8_um_array[2];
127 } break;
128 case '3': {
129 found = 1; action = 1; op = dk3maid8_um_array[3];
130 } break;
131 case '4': {
132 found = 1; action = 1; op = dk3maid8_um_array[4];
133 } break;
134 case '5': {
135 found = 1; action = 1; op = dk3maid8_um_array[5];
136 } break;
137 case '6': {
138 found = 1; action = 1; op = dk3maid8_um_array[6];
139 } break;
140 case '7': {
141 found = 1; action = 1; op = dk3maid8_um_array[7];
142 } break;
143 case '8': {
144 found = 1; action = 1; op = dk3maid8_um_array[8];
145 } break;
146 case '9': {
147 found = 1; action = 1; op = dk3maid8_um_array[9];
148 } break;
149 default: { /* Non-digit */
150 cc = 0;
151 if (0 != found) {
152 back = 1;
153 }
154 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
155 } break;
156 }
157 if (0 != cc) {
158 switch(action) {
159 case 1: {
160 val = dk3ma_um_add_ok(
161 dk3ma_um_mul_ok(val, dk3maid8_um_array[0], &mec), op, &mec
162 );
163 if (0 != mec) {
164 cc = 0;
165 val = DK3_UM_MAX;
166 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
167 }
168 } break;
169 }
170 }
171 }
172 } else {
173 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
174 }
175 *rp = val;
176 #if DK3_ON_WINDOWS
177
178 #else
179 #if DK3_HAVE_INTMAX_T
180
181 #else
182 #if DK3_HAVE_LONG_LONG
183
184 #else
185
186 #endif
187 #endif
188 #endif
189 } else {
190 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
191 }
192 return back;
193 }
194
195
196
197 int
dk3ma_im_from_c8_string(dk3_im_t * rp,char const * src,int * ec)198 dk3ma_im_from_c8_string(dk3_im_t *rp, char const *src, int *ec)
199 {
200 char const *ptr = NULL; /* Start of text */
201 dk3_um_t umv = DK3_UM_0; /* Temporary value */
202 dk3_im_t val = DK3_IM_0; /* Conversion result */
203 int back = 0; /* Function result */
204 if ((NULL != rp) && (NULL != src)) {
205 ptr = dk3maid8_str_c8_start(src);
206 if (NULL != ptr) {
207 if ('-' == *ptr) {
208 ptr++;
209 if (0 != dk3ma_um_from_c8_string(&umv, ptr, ec)) {
210 if ((dk3_um_t)DK3_IM_MAX >= umv) {
211 val = (dk3_im_t)umv;
212 val = DK3_IM_0 - val;
213 back = 1;
214 } else {
215 val = DK3_IM_MIN;
216 #if 0
217 if ((dk3_um_t)(DK3_IM_MAX + (dk3_im_t)1L) == umv)
218 #else
219 if (((dk3_um_t)DK3_IM_MAX + (dk3_um_t)1UL) == umv)
220 #endif
221 {
222 back = 1;
223 } else {
224 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
225 }
226 }
227 }
228 } else {
229 if (0 != dk3ma_um_from_c8_string(&umv, ptr, ec)) {
230 if ((dk3_um_t)DK3_IM_MAX >= umv) {
231 val = (dk3_im_t)umv;
232 back = 1;
233 } else {
234 val = DK3_IM_MAX;
235 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
236 }
237 }
238 }
239 } else {
240 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
241 }
242 *rp = val;
243 } else {
244 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
245 }
246 return back;
247 }
248
249
250
251 int
dk3ma_us_from_c8_string(unsigned short * rp,char const * src,int * ec)252 dk3ma_us_from_c8_string(unsigned short *rp, char const *src, int *ec)
253 {
254 dk3_um_t val = DK3_UM_0;
255 int back = 0;
256 if ((NULL != rp) && (NULL != src)) {
257 if (0 != dk3ma_um_from_c8_string(&val, src, ec)) {
258 if ((dk3_um_t)DK3_US_MAX >= val) {
259 *rp = (unsigned short)val;
260 back = 1;
261 } else {
262 *rp = DK3_US_MAX;
263 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
264 }
265 } else {
266 *rp = (unsigned short)val;
267 }
268 } else {
269 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
270 }
271 return back;
272 }
273
274
275
276 int
dk3ma_s_from_c8_string(short * rp,char const * src,int * ec)277 dk3ma_s_from_c8_string(short *rp, char const *src, int *ec)
278 {
279 dk3_im_t val = DK3_IM_0;
280 int back = 0;
281 if ((NULL != rp) && (NULL != src)) {
282 if (0 != dk3ma_im_from_c8_string(&val, src, ec)) {
283 if (((dk3_im_t)DK3_S_MIN <= val) && ((dk3_im_t)DK3_S_MAX >= val)) {
284 *rp = (short)val;
285 back = 1;
286 } else {
287 if (DK3_IM_0 > val) {
288 *rp = DK3_S_MIN;
289 } else {
290 *rp = DK3_S_MAX;
291 }
292 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
293 }
294 } else {
295 *rp = (short)val;
296 }
297 } else {
298 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
299 }
300 return back;
301 }
302
303
304
305 int
dk3ma_ui_from_c8_string(unsigned * rp,char const * src,int * ec)306 dk3ma_ui_from_c8_string(unsigned *rp, char const *src, int *ec)
307 {
308 dk3_um_t val = DK3_UM_0;
309 int back = 0;
310 if ((NULL != rp) && (NULL != src)) {
311 if (0 != dk3ma_um_from_c8_string(&val, src, ec)) {
312 if ((dk3_um_t)DK3_U_MAX >= val) {
313 *rp = (unsigned) val;
314 back = 1;
315 } else {
316 *rp = DK3_U_MAX;
317 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
318 }
319 } else {
320 *rp = (unsigned)val;
321 }
322 } else {
323 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
324 }
325 return back;
326 }
327
328
329
330 int
dk3ma_i_from_c8_string(int * rp,char const * src,int * ec)331 dk3ma_i_from_c8_string(int *rp, char const *src, int *ec)
332 {
333 dk3_im_t val = DK3_IM_0;
334 int back = 0;
335 if ((NULL != rp) && (NULL != src)) {
336 if (0 != dk3ma_im_from_c8_string(&val, src, ec)) {
337 if (((dk3_im_t)DK3_I_MIN <= val) && ((dk3_im_t)DK3_I_MAX >= val)) {
338 *rp = (int)val;
339 back = 1;
340 } else {
341 if (DK3_IM_0 > val) { *rp = DK3_I_MIN; } else { *rp = DK3_I_MAX; }
342 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
343 }
344 } else {
345 *rp = (int)val;
346 }
347 } else {
348 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
349 }
350 return back;
351 }
352
353
354
355 int
dk3ma_ul_from_c8_string(unsigned long * rp,char const * src,int * ec)356 dk3ma_ul_from_c8_string(unsigned long *rp, char const *src, int *ec)
357 {
358 dk3_um_t val = DK3_UM_0;
359 int back = 0;
360 if ((NULL != rp) && (NULL != src)) {
361 if (0 != dk3ma_um_from_c8_string(&val, src, ec)) {
362 if ((dk3_um_t)DK3_UL_MAX >= val) {
363 *rp = (unsigned long)val;
364 back = 1;
365 } else {
366 *rp = DK3_UL_MAX;
367 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
368 }
369 } else {
370 *rp = (unsigned long)val;
371 }
372 } else {
373 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
374 }
375 return back;
376 }
377
378
379
380 int
dk3ma_l_from_c8_string(long * rp,char const * src,int * ec)381 dk3ma_l_from_c8_string(long *rp, char const *src, int *ec)
382 {
383 dk3_im_t val = DK3_IM_0;
384 int back = 0;
385 if ((NULL != rp) && (NULL != src)) {
386 if (0 != dk3ma_im_from_c8_string(&val, src, ec)) {
387 if (((dk3_im_t)DK3_L_MIN <= val) && ((dk3_im_t)DK3_L_MAX >= val)) {
388 *rp = (long)val;
389 back = 1;
390 } else {
391 if (DK3_IM_0 > val) { *rp = DK3_L_MIN; } else { *rp = DK3_L_MAX; }
392 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
393 }
394 } else {
395 *rp = (long)val;
396 }
397 } else {
398 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
399 }
400 return back;
401 }
402
403
404
405 #if DK3_HAVE_LONG_LONG
406
407 int
dk3ma_ull_from_c8_string(unsigned long long * rp,char const * src,int * ec)408 dk3ma_ull_from_c8_string(unsigned long long *rp, char const *src, int *ec)
409 {
410 dk3_um_t val = DK3_UM_0;
411 int back = 0;
412 if ((NULL != rp) && (NULL != src)) {
413 if (0 != dk3ma_um_from_c8_string(&val, src, ec)) {
414 if ((dk3_um_t)DK3_ULL_MAX >= val) {
415 *rp = (unsigned long long)val;
416 back = 1;
417 } else {
418 *rp = DK3_ULL_MAX;
419 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
420 }
421 } else {
422 *rp = (unsigned long long)val;
423 }
424 } else {
425 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
426 }
427 return back;
428 }
429
430
431 int
dk3ma_ll_from_c8_string(long long * rp,char const * src,int * ec)432 dk3ma_ll_from_c8_string(long long *rp, char const *src, int *ec)
433 {
434 dk3_im_t val = DK3_IM_0;
435 int back = 0;
436 if ((NULL != rp) && (NULL != src)) {
437 if (0 != dk3ma_im_from_c8_string(&val, src, ec)) {
438 if (((dk3_im_t)DK3_LL_MIN <= val) && ((dk3_im_t)DK3_LL_MAX >= val)) {
439 *rp = (long long)val;
440 back = 1;
441 } else {
442 if (DK3_IM_0 > val) { *rp = DK3_LL_MIN; } else { *rp = DK3_LL_MAX; }
443 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
444 }
445 } else {
446 *rp = (long long)val;
447 }
448 } else {
449 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
450 }
451 return back;
452 }
453
454 #endif
455
456
457
458 #if DK3_HAVE_INTMAX_T
459
460 int
dk3ma_uintmax_t_from_c8_string(uintmax_t * rp,char const * src,int * ec)461 dk3ma_uintmax_t_from_c8_string(uintmax_t *rp, char const *src, int *ec)
462 {
463 dk3_um_t val = DK3_UM_0;
464 int back = 0;
465 if ((NULL != rp) && (NULL != src)) {
466 if (0 != dk3ma_um_from_c8_string(&val, src, ec)) {
467 *rp = (uintmax_t)val;
468 back = 1;
469 } else {
470 *rp = (uintmax_t)val;
471 }
472 } else {
473 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
474 }
475 return back;
476 }
477
478
479
480 int
dk3ma_intmax_t_from_c8_string(intmax_t * rp,char const * src,int * ec)481 dk3ma_intmax_t_from_c8_string(intmax_t *rp, char const *src, int *ec)
482 {
483 dk3_im_t val = DK3_IM_0;
484 int back = 0;
485 if ((NULL != rp) && (NULL != src)) {
486 if (0 != dk3ma_im_from_c8_string(&val, src, ec)) {
487 *rp = (intmax_t)val;
488 back = 1;
489 } else {
490 *rp = (intmax_t)val;
491 }
492 } else {
493 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
494 }
495 return back;
496 }
497
498 #endif
499