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