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