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: dk3maih8.ctr
12 */
13
14 /** @file dk3maih8.c The dk3maih8 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 dk3maih8_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 *
dk3maih8_str_c8_start(char const * str)76 dk3maih8_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_hex_string(dk3_um_t * rp,char const * src,int * ec)94 dk3ma_um_from_c8_hex_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 = dk3maih8_str_c8_start(src);
107 if (NULL != ptr) {
108 if ('0' == *ptr) { if(('x' == ptr[1])||('X' == ptr[1])) {ptr++; ptr++;} }
109 while (0 != cc) {
110 action = 0;
111 switch(*(ptr++)) {
112 case '\0': { /* End of string */
113 cc = 0;
114 if (0 != found) {
115 back = 1;
116 } else {
117 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
118 }
119 } break;
120 case '0': {
121 found = 1; action = 1; op = DK3_UM_0;
122 } break;
123 case '1': {
124 found = 1; action = 1; op = dk3maih8_um_array[1];
125 } break;
126 case '2': {
127 found = 1; action = 1; op = dk3maih8_um_array[2];
128 } break;
129 case '3': {
130 found = 1; action = 1; op = dk3maih8_um_array[3];
131 } break;
132 case '4': {
133 found = 1; action = 1; op = dk3maih8_um_array[4];
134 } break;
135 case '5': {
136 found = 1; action = 1; op = dk3maih8_um_array[5];
137 } break;
138 case '6': {
139 found = 1; action = 1; op = dk3maih8_um_array[6];
140 } break;
141 case '7': {
142 found = 1; action = 1; op = dk3maih8_um_array[7];
143 } break;
144 case '8': {
145 found = 1; action = 1; op = dk3maih8_um_array[8];
146 } break;
147 case '9': {
148 found = 1; action = 1; op = dk3maih8_um_array[9];
149 } break;
150 case 'a': case 'A': {
151 found = 1; action = 1; op = dk3maih8_um_array[10];
152 } break;
153 case 'b': case 'B': {
154 found = 1; action = 1; op = dk3maih8_um_array[11];
155 } break;
156 case 'c': case 'C': {
157 found = 1; action = 1; op = dk3maih8_um_array[12];
158 } break;
159 case 'd': case 'D': {
160 found = 1; action = 1; op = dk3maih8_um_array[13];
161 } break;
162 case 'e': case 'E': {
163 found = 1; action = 1; op = dk3maih8_um_array[14];
164 } break;
165 case 'f': case 'F': {
166 found = 1; action = 1; op = dk3maih8_um_array[15];
167 } break;
168 default: { /* Non-digit */
169 cc = 0;
170 if (0 != found) {
171 back = 1;
172 }
173 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
174 } break;
175 }
176 if (0 != cc) {
177 switch(action) {
178 case 1: {
179 val = dk3ma_um_add_ok(
180 dk3ma_um_mul_ok(val, dk3maih8_um_array[16], &mec), op, &mec
181 );
182 if (0 != mec) {
183 cc = 0;
184 val = DK3_UM_MAX;
185 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
186 }
187 } break;
188 }
189 }
190 }
191 } else {
192 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
193 }
194 *rp = val;
195 #if DK3_ON_WINDOWS
196
197 #else
198 #if DK3_HAVE_INTMAX_T
199
200 #else
201 #if DK3_HAVE_LONG_LONG
202
203 #else
204
205 #endif
206 #endif
207 #endif
208 } else {
209 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
210 }
211 return back;
212 }
213
214
215
216 int
dk3ma_im_from_c8_hex_string(dk3_im_t * rp,char const * src,int * ec)217 dk3ma_im_from_c8_hex_string(dk3_im_t *rp, char const *src, int *ec)
218 {
219 char const *ptr = NULL; /* Start of text */
220 dk3_um_t umv = DK3_UM_0; /* Temporary value */
221 dk3_im_t val = DK3_IM_0; /* Conversion result */
222 int back = 0; /* Function result */
223 if ((NULL != rp) && (NULL != src)) {
224 ptr = dk3maih8_str_c8_start(src);
225 if (NULL != ptr) {
226 if ('-' == *ptr) {
227 ptr++;
228 if (0 != dk3ma_um_from_c8_hex_string(&umv, ptr, ec)) {
229 if ((dk3_um_t)DK3_IM_MAX >= umv) {
230 val = (dk3_im_t)umv;
231 val = DK3_IM_0 - val;
232 back = 1;
233 } else {
234 val = DK3_IM_MIN;
235 #if 0
236 if ((dk3_um_t)(DK3_IM_MAX + (dk3_im_t)1L) == umv)
237 #else
238 if (((dk3_um_t)DK3_IM_MAX + (dk3_um_t)1UL) == umv)
239 #endif
240 {
241 back = 1;
242 } else {
243 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
244 }
245 }
246 } else {
247 val = (dk3_im_t)umv;
248 }
249 } else {
250 if (0 != dk3ma_um_from_c8_hex_string(&umv, ptr, ec)) {
251 val = (dk3_im_t)umv;
252 back = 1;
253 } else {
254 val = (dk3_im_t)umv;
255 }
256 }
257 } else {
258 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
259 }
260 *rp = val;
261 } else {
262 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
263 }
264 return back;
265 }
266
267
268
269 int
dk3ma_us_from_c8_hex_string(unsigned short * rp,char const * src,int * ec)270 dk3ma_us_from_c8_hex_string(unsigned short *rp, char const *src, int *ec)
271 {
272 dk3_um_t val = DK3_UM_0;
273 int back = 0;
274 if ((NULL != rp) && (NULL != src)) {
275 if (0 != dk3ma_um_from_c8_hex_string(&val, src, ec)) {
276 if ((dk3_um_t)DK3_US_MAX >= val) {
277 *rp = (unsigned short)val;
278 back = 1;
279 } else {
280 *rp = DK3_US_MAX;
281 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
282 }
283 } else {
284 *rp = (unsigned short)val;
285 }
286 } else {
287 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
288 }
289 return back;
290 }
291
292
293
294 int
dk3ma_s_from_c8_hex_string(short * rp,char const * src,int * ec)295 dk3ma_s_from_c8_hex_string(short *rp, char const *src, int *ec)
296 {
297 const char *ptr;
298 unsigned short val = 0U;
299 int back = 0;
300 if ((NULL != rp) && (NULL != src)) {
301 ptr = dk3maih8_str_c8_start(src);
302 if (NULL != ptr) {
303 if ('-' == *ptr) {
304 if (0 != dk3ma_us_from_c8_hex_string(&val, &(ptr[1]), ec)) {
305 if ((unsigned short)DK3_S_MAX >= val) {
306 *rp = (short)(0 - (short)val);
307 back = 1;
308 } else {
309 *rp = DK3_S_MIN;
310 if (((unsigned short)DK3_S_MAX + (unsigned short)1U) == val) {
311 back = 1;
312 } else {
313 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
314 }
315 }
316 } else {
317 *rp = (short)val;
318 }
319 } else {
320 if (0 != dk3ma_us_from_c8_hex_string(&val, ptr, ec)) {
321 *rp = (short)val;
322 back = 1;
323 } else {
324 *rp = (short)val;
325 }
326 }
327 } else {
328 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
329 }
330 } else {
331 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
332 }
333 return back;
334 }
335
336
337
338 int
dk3ma_ui_from_c8_hex_string(unsigned * rp,char const * src,int * ec)339 dk3ma_ui_from_c8_hex_string(unsigned *rp, char const *src, int *ec)
340 {
341 dk3_um_t val = DK3_UM_0;
342 int back = 0;
343 if ((NULL != rp) && (NULL != src)) {
344 if (0 != dk3ma_um_from_c8_hex_string(&val, src, ec)) {
345 if ((dk3_um_t)DK3_U_MAX >= val) {
346 *rp = (unsigned)val;
347 back = 1;
348 } else {
349 *rp = DK3_U_MAX;
350 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
351 }
352 } else {
353 *rp = (unsigned)val;
354 }
355 } else {
356 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
357 }
358 return back;
359 }
360
361
362
363 int
dk3ma_i_from_c8_hex_string(int * rp,char const * src,int * ec)364 dk3ma_i_from_c8_hex_string(int *rp, char const *src, int *ec)
365 {
366 const char *ptr;
367 unsigned val = 0U;
368 int back = 0;
369 if ((NULL != rp) && (NULL != src)) {
370 ptr = dk3maih8_str_c8_start(src);
371 if (NULL != ptr) {
372 if ('-' == *ptr) {
373 if (0 != dk3ma_ui_from_c8_hex_string(&val, &(ptr[1]), ec)) {
374 if ((unsigned)DK3_I_MAX >= val) {
375 *rp = 0 - (int)val;
376 } else {
377 *rp = DK3_I_MIN;
378 if (((unsigned)DK3_I_MAX + 1U) == val) {
379 back = 1;
380 } else {
381 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
382 }
383 }
384 } else {
385 *rp = (int)val;
386 }
387 } else {
388 if (0 != dk3ma_ui_from_c8_hex_string(&val, ptr, ec)) {
389 *rp = (int)val;
390 back = 1;
391 } else {
392 *rp = (int)val;
393 }
394 }
395 } else {
396 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
397 }
398 } else {
399 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
400 }
401 return back;
402 }
403
404
405
406 int
dk3ma_ul_from_c8_hex_string(unsigned long * rp,char const * src,int * ec)407 dk3ma_ul_from_c8_hex_string(unsigned long *rp, char const *src, int *ec)
408 {
409 dk3_um_t val = DK3_UM_0;
410 int back = 0;
411 if ((NULL != rp) && (NULL != src)) {
412 if (0 != dk3ma_um_from_c8_hex_string(&val, src, ec)) {
413 if ((dk3_um_t)DK3_UL_MAX >= val) {
414 *rp = (unsigned long)val;
415 back = 1;
416 } else {
417 *rp = DK3_UL_MAX;
418 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
419 }
420 } else {
421 *rp = (unsigned long)val;
422 }
423 } else {
424 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
425 }
426 return back;
427 }
428
429
430
431 int
dk3ma_l_from_c8_hex_string(long * rp,char const * src,int * ec)432 dk3ma_l_from_c8_hex_string(long *rp, char const *src, int *ec)
433 {
434 const char *ptr;
435 unsigned long val = 0UL;
436 int back = 0;
437 if ((NULL != rp) && (NULL != src)) {
438 ptr = dk3maih8_str_c8_start(src);
439 if (NULL != ptr) {
440 if ('-' == *ptr) {
441 if (0 != dk3ma_ul_from_c8_hex_string(&val, &(ptr[1]), ec)) {
442 if ((unsigned long)DK3_L_MAX >= val) {
443 *rp = (long)(0L - (long)val);
444 back = 1;
445 } else {
446 *rp = DK3_L_MIN;
447 if (((unsigned long)DK3_L_MAX + 1UL) == val) {
448 back = 1;
449 } else {
450 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
451 }
452 }
453 } else {
454 *rp = (long)val;
455 }
456 } else {
457 if (0 != dk3ma_ul_from_c8_hex_string(&val, ptr, ec)) {
458 *rp = (long)val;
459 back = 1;
460 } else {
461 *rp = (long)val;
462 }
463 }
464 } else {
465 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
466 }
467 } else {
468 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
469 }
470 return back;
471 }
472
473
474
475 #if DK3_HAVE_LONG_LONG
476
477 int
dk3ma_ull_from_c8_hex_string(unsigned long long * rp,char const * src,int * ec)478 dk3ma_ull_from_c8_hex_string(unsigned long long *rp, char const *src, int *ec)
479 {
480 dk3_um_t val = DK3_UM_0;
481 int back = 0;
482 if ((NULL != rp) && (NULL != src)) {
483 if (0 != dk3ma_um_from_c8_hex_string(&val, src, ec)) {
484 if ((dk3_um_t)DK3_ULL_MAX >= val) {
485 *rp = (unsigned long long)val;
486 back = 1;
487 } else {
488 *rp = DK3_ULL_MAX;
489 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
490 }
491 } else {
492 *rp = (unsigned long long)val;
493 }
494 } else {
495 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
496 }
497 return back;
498 }
499
500
501
502 int
dk3ma_ll_from_c8_hex_string(long long * rp,char const * src,int * ec)503 dk3ma_ll_from_c8_hex_string(long long *rp, char const *src, int *ec)
504 {
505 char const *ptr;
506 unsigned long long val = 0ULL;
507 int back = 0;
508 if ((NULL != rp) && (NULL != src)) {
509 ptr = dk3maih8_str_c8_start(src);
510 if (NULL != ptr) {
511 if ('-' == *ptr) {
512 if (0 != dk3ma_ull_from_c8_hex_string(&val, &(ptr[1]), ec)) {
513 if ((unsigned long long)DK3_LL_MAX >= val) {
514 *rp = (long long)(0LL - (long long)val);
515 back = 1;
516 } else {
517 *rp = DK3_LL_MIN;
518 if (((unsigned long long)DK3_LL_MAX + 1ULL) == val) {
519 back = 1;
520 } else {
521 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
522 }
523 }
524 } else {
525 *rp = (long long)val;
526 }
527 } else {
528 if (0 != dk3ma_ull_from_c8_hex_string(&val, ptr, ec)) {
529 *rp = (long long)val;
530 back = 1;
531 } else {
532 *rp = (long long)val;
533 }
534 }
535 } else {
536 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
537 }
538 } else {
539 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
540 }
541 return back;
542 }
543
544 #endif
545
546
547
548 #if DK3_HAVE_INTMAX_T
549
550 int
dk3ma_uintmax_t_from_c8_hex_string(uintmax_t * rp,char const * src,int * ec)551 dk3ma_uintmax_t_from_c8_hex_string(uintmax_t *rp, char const *src, int *ec)
552 {
553 dk3_um_t val = DK3_UM_0;
554 int back = 0;
555 if ((NULL != rp) && (NULL != src)) {
556 if (0 != dk3ma_um_from_c8_hex_string(&val, src, ec)) {
557 *rp = (uintmax_t)val;
558 back = 1;
559 } else {
560 *rp = (uintmax_t)val;
561 }
562 } else {
563 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
564 }
565 return back;
566 }
567
568
569
570 int
dk3ma_intmax_t_from_c8_hex_string(intmax_t * rp,char const * src,int * ec)571 dk3ma_intmax_t_from_c8_hex_string(intmax_t *rp, char const *src, int *ec)
572 {
573 const char *ptr;
574 uintmax_t val = DK3_UINTMAX_T_0;
575 int back = 0;
576 if ((NULL != rp) && (NULL != src)) {
577 ptr = dk3maih8_str_c8_start(src);
578 if (NULL != ptr) {
579 if ('-' == *ptr) {
580 if (0 != dk3ma_uintmax_t_from_c8_hex_string(&val, &(ptr[1]), ec)) {
581 if ((uintmax_t)DK3_INTMAX_T_MAX >= val) {
582 *rp = (intmax_t)(DK3_INTMAX_T_0 - (intmax_t)val);
583 back = 1;
584 } else {
585 *rp = DK3_INTMAX_T_MIN;
586 if (((uintmax_t)DK3_INTMAX_T_MAX + DK3_UINTMAX_T_1) == val) {
587 back = 1;
588 } else {
589 if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
590 }
591 }
592 } else {
593 *rp = (intmax_t)val;
594 }
595 } else {
596 if (0 != dk3ma_uintmax_t_from_c8_hex_string(&val, ptr, ec)) {
597 *rp = (intmax_t)val;
598 back = 1;
599 } else {
600 *rp = (intmax_t)val;
601 }
602 }
603 } else {
604 if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; }
605 }
606 } else {
607 if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; }
608 }
609 return back;
610 }
611
612 #endif
613
614