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