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