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: dk4a85e.ctr
12 */
13
14 /** @file dk4a85e.c The dk4a85e 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 <libdk4c/dk4a85e.h>
28 #include <libdk4c/dk4edstm.h>
29 #include <libdk4base/dk4mem.h>
30
31
32
33
34
35
36
37 static const unsigned long dk4a85e_pow_85[] = {
38 (85UL * 85UL * 85UL * 85UL),
39 (85UL * 85UL * 85UL),
40 (85UL * 85UL),
41 85UL
42 };
43
44
45
46 void
47
dk4a85_enc_init(dk4_a85_enc_t * enc,int az,dk4_er_t * erp)48 dk4a85_enc_init(dk4_a85_enc_t *enc, int az, dk4_er_t *erp)
49 {
50 #if DK4_USE_ASSERT
51 assert(NULL != enc);
52 #endif
53 if (NULL != enc) {
54 DK4_MEMRES(enc, sizeof(dk4_a85_enc_t));
55 enc->ob[5] = '\0';
56 enc->ci = 0;
57 enc->os = 0;
58 enc->az = ((0 != az) ? 1 : 0);
59 } else {
60 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
61 }
62 }
63
64
65
66 int
67
dk4a85_enc_add(dk4_a85_enc_t * enc,unsigned char input,dk4_er_t * erp)68 dk4a85_enc_add(dk4_a85_enc_t *enc, unsigned char input, dk4_er_t *erp)
69 {
70 unsigned long val;
71 unsigned long v1;
72 int back = DK4_EDSTM_ERROR;
73 #if DK4_USE_ASSERT
74 assert(NULL != enc);
75 #endif
76 if (NULL != enc) {
77 back = DK4_EDSTM_ACCEPT;
78 enc->ib[enc->ci] = input;
79 enc->ci += 1;
80 if (4 <= enc->ci) {
81 back = DK4_EDSTM_FINISHED;
82 val = (((unsigned long)(enc->ib[0]) << 24) & 0xFF000000UL)
83 | (((unsigned long)(enc->ib[1]) << 16) & 0x00FF0000UL)
84 | (((unsigned long)(enc->ib[2]) << 8) & 0x0000FF00UL)
85 | (((unsigned long)(enc->ib[3]) ) & 0x000000FFUL);
86 if ((0UL == val) && (0 != enc->az)) {
87 enc->ob[0] = 'z';
88 enc->ob[1] = '\0';
89 enc->os = 1;
90 } else {
91 v1 = val / dk4a85e_pow_85[0];
92 enc->ob[0] = (char)(33 + v1);
93 val = val % dk4a85e_pow_85[0];
94 v1 = val / dk4a85e_pow_85[1];
95 enc->ob[1] = (char)(33 + v1);
96 val = val % dk4a85e_pow_85[1];
97 v1 = val / dk4a85e_pow_85[2];
98 enc->ob[2] = (char)(33 + v1);
99 val = val % dk4a85e_pow_85[2];
100 v1 = val / dk4a85e_pow_85[3];
101 enc->ob[3] = (char)(33 + v1);
102 val = val % dk4a85e_pow_85[3];
103 enc->ob[4] = (char)(33 + val);
104 enc->os = 5;
105 }
106 enc->ci = 0;
107 }
108 } else {
109 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
110 }
111 return back;
112 }
113
114
115
116 int
117
dk4a85_enc_finish(dk4_a85_enc_t * enc,dk4_er_t * erp)118 dk4a85_enc_finish(dk4_a85_enc_t *enc, dk4_er_t *erp)
119 {
120 unsigned long val;
121 unsigned long v1;
122 int back = DK4_EDSTM_ERROR;
123
124 #if DK4_USE_ASSERT
125 assert(NULL != enc);
126 #endif
127 if (NULL != enc) {
128 if (0 == enc->ci) {
129 back = DK4_EDSTM_ACCEPT;
130 enc->ob[0] = '\0';
131 enc->os = 0;
132 } else {
133 switch (enc->ci) {
134 case 1: {
135
136 back = DK4_EDSTM_FINISHED;
137 val = (((unsigned long)(enc->ib[0]) << 24) & 0xFF000000UL);
138
139 v1 = val / dk4a85e_pow_85[0];
140 enc->ob[0] = (char)(33 + v1);
141
142 val = val % dk4a85e_pow_85[0];
143 v1 = val / dk4a85e_pow_85[1];
144 enc->ob[1] = (char)((33 + v1));
145
146 enc->os = 2;
147 enc->ci = 0;
148 } break;
149 case 2: {
150
151 back = DK4_EDSTM_FINISHED;
152 val = (((unsigned long)(enc->ib[0]) << 24) & 0xFF000000UL)
153 | (((unsigned long)(enc->ib[1]) << 16) & 0x00FF0000UL);
154
155 v1 = val / dk4a85e_pow_85[0];
156 enc->ob[0] = (char)(33 + v1);
157
158 val = val % dk4a85e_pow_85[0];
159 v1 = val / dk4a85e_pow_85[1];
160 enc->ob[1] = (char)(33 + v1);
161
162 val = val % dk4a85e_pow_85[1];
163 v1 = val / dk4a85e_pow_85[2];
164 enc->ob[2] = (char)(33 + v1);
165
166 enc->os = 3;
167 enc->ci = 0;
168 } break;
169 case 3: {
170
171 back = DK4_EDSTM_FINISHED;
172 val = (((unsigned long)(enc->ib[0]) << 24) & 0xFF000000UL)
173 | (((unsigned long)(enc->ib[1]) << 16) & 0x00FF0000UL)
174 | (((unsigned long)(enc->ib[2]) << 8) & 0x0000FF00UL);
175
176 v1 = val / dk4a85e_pow_85[0];
177 enc->ob[0] = (char)(33 + v1);
178
179 val = val % dk4a85e_pow_85[0];
180 v1 = val / dk4a85e_pow_85[1];
181 enc->ob[1] = (char)(33 + v1);
182
183 val = val % dk4a85e_pow_85[1];
184 v1 = val / dk4a85e_pow_85[2];
185 enc->ob[2] = (char)(33 + v1);
186
187 val = val % dk4a85e_pow_85[2];
188 v1 = val / dk4a85e_pow_85[3];
189 enc->ob[3] = (char)(33 + v1);
190
191 enc->os = 4;
192 enc->ci = 0;
193 } break;
194 default: {
195
196 back = DK4_EDSTM_FINISHED;
197 val = (((unsigned long)(enc->ib[0]) << 24) & 0xFF000000UL)
198 | (((unsigned long)(enc->ib[1]) << 16) & 0x00FF0000UL)
199 | (((unsigned long)(enc->ib[2]) << 8) & 0x0000FF00UL)
200 | (((unsigned long)(enc->ib[3]) ) & 0x000000FFUL);
201
202 if ((0UL == val) && (0 != enc->az)) {
203 enc->ob[0] = 'z';
204 enc->ob[1] = '\0';
205 enc->os = 1;
206 } else {
207 v1 = val / dk4a85e_pow_85[0];
208 enc->ob[0] = (char)(33 + v1);
209
210 val = val % dk4a85e_pow_85[0];
211 v1 = val / dk4a85e_pow_85[1];
212 enc->ob[1] = (char)(33 + v1);
213
214 val = val % dk4a85e_pow_85[1];
215 v1 = val / dk4a85e_pow_85[2];
216 enc->ob[2] = (char)(33 + v1);
217
218 val = val % dk4a85e_pow_85[2];
219 v1 = val / dk4a85e_pow_85[3];
220 enc->ob[3] = (char)(33 + v1);
221
222 val = val % dk4a85e_pow_85[3];
223 enc->ob[4] = (char)(33 + val);
224
225 enc->os = 5;
226 }
227 enc->ci = 0;
228 } break;
229 }
230 }
231 } else {
232 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
233 }
234 return back;
235 }
236
237
238
239 int
240
dk4a85_enc_output(const char ** dptr,size_t * szptr,dk4_a85_enc_t const * enc,dk4_er_t * erp)241 dk4a85_enc_output(
242 const char **dptr,
243 size_t *szptr,
244 dk4_a85_enc_t const *enc,
245 dk4_er_t *erp
246 )
247 {
248 int back = 0;
249 #if DK4_USE_ASSERT
250 assert(NULL != enc);
251 assert(NULL != dptr);
252 assert(NULL != szptr);
253 #endif
254 if ((NULL != dptr) && (NULL != szptr) && (NULL != enc)) {
255 *dptr = &(enc->ob[0]);
256 *szptr = enc->os;
257 if (0 < enc->os) {
258 back = 1;
259 }
260 } else {
261 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
262 }
263 return back;
264 }
265
266