1 /*
2 Copyright (C) 2015-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: dk4mai8dsz.ctr
12 */
13 
14 /**	@file dk4mai8dsz.c The dk4mai8dsz module.
15 */
16 
17 
18 #include "dk4conf.h"
19 
20 #if	DK4_HAVE_ASSERT_H
21 #ifndef	ASSERT_H_INCLUDED
22 #include <assert.h>
23 #define	ASSERT_H_INCLUDED 1
24 #endif
25 #endif
26 
27 #include <libdk4maio8d/dk4mai8ddu.h>
28 #include <libdk4maio8d/dk4mai8dsz.h>
29 #include <libdk4ma/dk4maasz.h>
30 #include <libdk4base/dk4numco.h>
31 #include <libdk4base/dk4str8.h>
32 
33 
34 
35 int
dk4ma_input_c8_dec_size_t(size_t * rp,const char * src,const char ** endptr,int atg,dk4_er_t * erp)36 dk4ma_input_c8_dec_size_t(
37   size_t	 *rp,
38   const char	 *src,
39   const char	**endptr,
40   int		  atg,
41   dk4_er_t	 *erp
42 )
43 {
44   const	char	*myend	=	NULL;
45   dk4_um_t	 um	=	(dk4_um_t)0UL;
46   size_t	 res	=	0;
47   size_t	 xf	=	1024;
48   size_t	 factor	=	1;
49   size_t	 nloop	=	0;
50   int		 back	=	0;
51 #if	DK4_USE_ASSERT
52   assert(NULL != rp);
53   assert(NULL != src);
54 #endif
55   if ((NULL != rp) && (NULL != src)) {
56     if (0 != dk4ma_input_c8_dec_dk4_um_t(&um, src, &myend, 2, erp)) {
57       if (((dk4_um_t)(SIZE_MAX)) >= um) {
58         res = (size_t)um;
59 	if (NULL != myend) {
60 	  back = 1;
61 	  switch (*myend) {
62 	    case 'K': { nloop = 1; myend++; } break;
63 	    case 'M': { nloop = 2; myend++; } break;
64 	    case 'G': { nloop = 3; myend++; } break;
65 	    case 'T': { nloop = 4; myend++; } break;
66 	    case 'P': { nloop = 5; myend++; } break;
67 	    case 'E': { nloop = 6; myend++; } break;
68 	    case 'Z': { nloop = 7; myend++; } break;
69 	    case 'Y': { nloop = 8; myend++; } break;
70 	    case 'k': { nloop = 1; myend++; xf = 1000; } break;
71 	    case 'm': { nloop = 2; myend++; xf = 1000; } break;
72 	    case 'g': { nloop = 3; myend++; xf = 1000; } break;
73 	    case 't': { nloop = 4; myend++; xf = 1000; } break;
74 	    case 'p': { nloop = 5; myend++; xf = 1000; } break;
75 	    case 'e': { nloop = 6; myend++; xf = 1000; } break;
76 	    case 'z': { nloop = 7; myend++; xf = 1000; } break;
77 	    case 'y': { nloop = 8; myend++; xf = 1000; } break;
78 	  }
79 	  while (nloop--) {
80 	    if ((SIZE_MAX / xf) >= factor) {
81 	      factor *= xf;
82 	    } else {
83 	      back = 0;
84 	      dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW);
85 	    }
86 	  }
87 	  if (0 != back) {
88 	    if ((SIZE_MAX / factor) >= res) {
89 	      res *= factor;
90 	      switch (atg) {
91 	        case 2: {
92 		  *rp = res;
93 		} break;
94 		case 1: {
95 		  myend = dk4str8_start(myend, NULL);
96 		  if (NULL != myend) {
97 		    back = 0;
98 		    dk4error_set_simple_error_code(erp, DK4_E_SYNTAX);
99 		  } else {
100 		    *rp = res;
101 		  }
102 		} break;
103 		default: {
104 		  back = 0;
105 		  dk4error_set_simple_error_code(erp, DK4_E_SYNTAX);
106 		} break;
107 	      }
108 	    } else {
109 	      back = 0;
110 	      dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW);
111 	    }
112 	  } else {
113 	    dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW);
114 	  }
115 	} else {
116 	  *rp = res;
117 	  back = 1;
118 	}
119       } else {
120         dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW);
121       }
122     }
123   } else {
124     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
125   }
126   if (NULL != endptr) { *endptr = myend; }
127   return back;
128 }
129 
130 
131 
132 int
dk4ma_input_c8_dec_size_t_simple(size_t * rp,const char * src,const char ** endptr,int atg,dk4_er_t * erp)133 dk4ma_input_c8_dec_size_t_simple(
134   size_t	 *rp,
135   const char	 *src,
136   const char	**endptr,
137   int		  atg,
138   dk4_er_t	 *erp
139 )
140 {
141   const	char	*myend	=	NULL;
142   dk4_um_t	 um	=	(dk4_um_t)0UL;
143   int		 back	=	0;
144 #if	DK4_USE_ASSERT
145   assert(NULL != rp);
146   assert(NULL != src);
147 #endif
148   if ((NULL != rp) && (NULL != src)) {
149     if (0 != dk4ma_input_c8_dec_dk4_um_t(&um, src, &myend, atg, erp)) {
150       if (((dk4_um_t)(SIZE_MAX)) >= um) {
151 	*rp = (size_t)um;
152 	back = 1;
153       } else {
154         dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW);
155       }
156     }
157   } else {
158     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
159   }
160   if (NULL != endptr) { *endptr = myend; }
161   return back;
162 }
163 
164 
165