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: dk4ahd.ctr
12 */
13 
14 /**	@file dk4ahd.c The dk4ahd 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/dk4ahd.h>
28 #include <libdk4base/dk4mem.h>
29 #include <libdk4c/dk4edstm.h>
30 
31 
32 
33 
34 
35 
36 
37 void
38 
dk4ahex_dec_init(dk4_ahex_dec_t * dec,dk4_er_t * erp)39 dk4ahex_dec_init(dk4_ahex_dec_t *dec, dk4_er_t *erp)
40 {
41 #if	DK4_USE_ASSERT
42   assert(NULL != dec);
43 #endif
44   if (NULL != dec) {
45     DK4_MEMRES(dec, sizeof(dk4_ahex_dec_t));
46     dec->cpos =  0;
47     dec->obyte = 0x00;
48   } else {
49     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
50   }
51 }
52 
53 
54 
55 int
56 
dk4ahex_dec_add(dk4_ahex_dec_t * dec,char tc,dk4_er_t * erp)57 dk4ahex_dec_add(dk4_ahex_dec_t *dec, char tc, dk4_er_t *erp)
58 {
59   int		 back = DK4_EDSTM_ERROR;
60 #if	DK4_USE_ASSERT
61   assert(NULL != dec);
62 #endif
63   if (NULL != dec) {
64     switch (tc) {
65       case ' ' : case '\t' : case '\r' : case '\n' : case 0x00 : case 0x0C : {
66         back = DK4_EDSTM_ACCEPT;
67       } break;
68       case '>' : {
69         back = DK4_EDSTM_STOP;
70       } break;
71       case '0' : {
72         if (0 != dec->cpos) {
73           dec->cpos  = 2;
74 	} else {
75 	  dec->obyte = 0x00;
76 	  dec->cpos  = 1;
77 	}
78       } break;
79       case '1' : {
80         if (0 != dec->cpos) {
81 	  dec->obyte |= 0x01; dec->cpos  = 2;
82 	} else {
83 	  dec->obyte = 0x10; dec->cpos  = 1;
84 	}
85       } break;
86       case '2' : {
87         if (0 != dec->cpos) {
88 	  dec->obyte |= 0x02; dec->cpos  = 2;
89 	} else {
90 	  dec->obyte = 0x20; dec->cpos  = 1;
91 	}
92       } break;
93       case '3' : {
94         if (0 != dec->cpos) {
95 	  dec->obyte |= 0x03; dec->cpos  = 2;
96 	} else {
97 	  dec->obyte = 0x30; dec->cpos  = 1;
98 	}
99       } break;
100       case '4' : {
101         if (0 != dec->cpos) {
102 	  dec->obyte |= 0x04; dec->cpos  = 2;
103 	} else {
104 	  dec->obyte = 0x40; dec->cpos  = 1;
105 	}
106       } break;
107       case '5' : {
108         if (0 != dec->cpos) {
109 	  dec->obyte |= 0x05; dec->cpos  = 2;
110 	} else {
111 	  dec->obyte = 0x50; dec->cpos  = 1;
112 	}
113       } break;
114       case '6' : {
115         if (0 != dec->cpos) {
116 	  dec->obyte |= 0x06; dec->cpos  = 2;
117 	} else {
118 	  dec->obyte = 0x60; dec->cpos  = 1;
119 	}
120       } break;
121       case '7' : {
122         if (0 != dec->cpos) {
123 	  dec->obyte |= 0x07; dec->cpos  = 2;
124 	} else {
125 	  dec->obyte = 0x70; dec->cpos  = 1;
126 	}
127       } break;
128       case '8' : {
129         if (0 != dec->cpos) {
130 	  dec->obyte |= 0x08; dec->cpos  = 2;
131 	} else {
132 	  dec->obyte = 0x80; dec->cpos  = 1;
133 	}
134       } break;
135       case '9' : {
136         if (0 != dec->cpos) {
137 	  dec->obyte |= 0x09; dec->cpos  = 2;
138 	} else {
139 	  dec->obyte = 0x90; dec->cpos  = 1;
140 	}
141       } break;
142       case 'a' : case 'A' : {
143         if (0 != dec->cpos) {
144 	  dec->obyte |= 0x0A; dec->cpos  = 2;
145 	} else {
146 	  dec->obyte = 0xA0; dec->cpos  = 1;
147 	}
148       } break;
149       case 'b' : case 'B' : {
150         if (0 != dec->cpos) {
151 	  dec->obyte |= 0x0B; dec->cpos  = 2;
152 	} else {
153 	  dec->obyte = 0xB0; dec->cpos  = 1;
154 	}
155       } break;
156       case 'c' : case 'C' : {
157         if (0 != dec->cpos) {
158 	  dec->obyte |= 0x0C; dec->cpos  = 2;
159 	} else {
160 	  dec->obyte = 0xC0; dec->cpos  = 1;
161 	}
162       } break;
163       case 'd' : case 'D' : {
164         if (0 != dec->cpos) {
165 	  dec->obyte |= 0x0D; dec->cpos  = 2;
166 	} else {
167 	  dec->obyte = 0xD0; dec->cpos  = 1;
168 	}
169       } break;
170       case 'e' : case 'E' : {
171         if (0 != dec->cpos) {
172 	  dec->obyte |= 0x0E; dec->cpos  = 2;
173 	} else {
174 	  dec->obyte = 0xE0; dec->cpos  = 1;
175 	}
176       } break;
177       case 'f' : case 'F' : {
178         if (0 != dec->cpos) {
179 	  dec->obyte |= 0x0F; dec->cpos  = 2;
180 	} else {
181 	  dec->obyte = 0xF0; dec->cpos  = 1;
182 	}
183       } break;
184     }
185     if (2 == dec->cpos) {
186       dec->cpos = 0;
187       back = DK4_EDSTM_FINISHED;
188     }
189   } else {
190     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
191   }
192   return back;
193 }
194 
195 
196 
197 int
198 
dk4ahex_dec_finish(dk4_ahex_dec_t * dec,dk4_er_t * erp)199 dk4ahex_dec_finish(dk4_ahex_dec_t *dec, dk4_er_t *erp)
200 {
201   int		 back	=	DK4_EDSTM_ERROR;
202 #if	DK4_USE_ASSERT
203   assert(NULL != dec);
204 #endif
205   if (NULL != dec) {
206     switch (dec->cpos) {
207       case 1: {
208         back = DK4_EDSTM_FINISHED;
209       } break;
210       default : {
211         back = DK4_EDSTM_ACCEPT;
212       } break;
213     }
214   } else {
215     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
216   }
217   return back;
218 }
219 
220 
221 
222 unsigned char
223 
dk4ahex_dec_output(dk4_ahex_dec_t const * dec,dk4_er_t * erp)224 dk4ahex_dec_output(dk4_ahex_dec_t const *dec, dk4_er_t *erp)
225 {
226   unsigned char back	= 0x00;
227 #if	DK4_USE_ASSERT
228   assert(NULL != dec);
229 #endif
230   if (NULL != dec) {
231     back = dec->obyte;
232   } else {
233     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
234   }
235   return back;
236 }
237 
238