/simpletypesystem/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/simpletypesystem/trunk
89 by Gustav Hartvigsson
* Started working on Threads
1
#include "BaseN.h"
2
3
#define S_BASE_16_LAST 15
90 by Gustav Hartvigsson
* Macros were wrong.
4
#define S_BASE_32_LAST 31
5
#define S_BASE_64_LAST 63
6
7
#define padding_mark =
8
9
#if 0
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
10
   TEMPLATE FOR THE ASCII TABLE REVERSE
11
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
12
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
13
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
14
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
15
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*3*/
16
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*4*/
17
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*5*/
18
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*6*/
19
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*7*/
20
21
22
  LEGEND:
23
0..127     VALID NUMBER.
24
25
-1         INVALID
26
27
-2         IGNORE
28
29
-3         PADDING MARK
30
31
32
Padding mark is only not used in Base16, so it will generate an error.
33
34
#endif
35
36
37
/* ****************************************************************************
90 by Gustav Hartvigsson
* Macros were wrong.
38
 ********************************* BASE 16 ************************************
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
39
 **************************************************************************** */
90 by Gustav Hartvigsson
* Macros were wrong.
40
89 by Gustav Hartvigsson
* Started working on Threads
41
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
42
static const schar
89 by Gustav Hartvigsson
* Started working on Threads
43
S_BASE_16_ALPHABET[16] = {
44
  '0','1','2','3','4','5','6','7','8','9',
45
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
46
  'A','B','C','D','E','F'
89 by Gustav Hartvigsson
* Started working on Threads
47
};
48
49
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
50
static const sbyte
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
51
S_BASE_16_REVERSE[128] = {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
52
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
53
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
54
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
55
  -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
56
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, /*3*/
57
  -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*4*/
58
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*5*/
59
  -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*6*/
60
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*7*/
61
};
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
62
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
63
#define base_16_concat(first,last)  ((last) | (first << 4))
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
64
#define base_16_mask_shift(byte)    ((byte & 0xf0) >> 4)
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
65
#define base_16_mask(byte)          (byte & 0x0f)
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
66
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
67
schar *
68
s_base_16_enc (const sbyte * input_data,
100 by Gustav Hartvigsson
* Fixed README.
69
               size_t in_len,
70
               size_t * out_len) {
71
  
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
72
  *out_len = (in_len * 2);
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
73
  
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
74
  schar * ret_val = s_malloc ((*out_len) + 1);
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
75
  
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
76
  s_dbg_print ("in len: %zu out_len: %zu\n", in_len, *out_len);
77
  
78
  ret_val[*out_len] = '\0';
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
79
  
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
80
  size_t pos = 0;
81
  
82
  for (sint i = 0; i < in_len; i++) {
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
83
    subyte m_byte = (subyte)input_data[i];
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
84
    ret_val [pos] = S_BASE_16_ALPHABET[base_16_mask_shift(m_byte)];
85
    ret_val [pos+1] = S_BASE_16_ALPHABET[base_16_mask(m_byte)];
86
    pos += 2;
87
  }
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
88
  
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
89
  return ret_val;
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
90
}
91
92
sbyte *
93
s_base_16_dec (const schar * base16_str,
100 by Gustav Hartvigsson
* Fixed README.
94
               size_t in_len,
95
               size_t * out_len) {
96
  *out_len = (round_up ((in_len / 2), 2) + 1);
161 by Gustav Hartvigsson
Base16[enc,dec] - Can now create byte arrays of fixed size.
97
  
98
  return s_base_16_dec_size (base16_str, in_len, *out_len);
99
}
100
101
sbyte *
102
s_base_16_dec_size (const schar * base16_str,
103
                   size_t in_len,
104
                   size_t out_len) {
105
  sbyte * ptr = (sbyte *) base16_str;
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
106
  sbyte * endptr = ptr + in_len;
161 by Gustav Hartvigsson
Base16[enc,dec] - Can now create byte arrays of fixed size.
107
  sbyte * ret_val = s_malloc (sizeof(sbyte) * (out_len));
108
  
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
109
  subyte first;
110
  subyte second;
111
  subyte concat;
112
  
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
113
  size_t pos = 0;
114
  
115
  
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
116
  //s_dbg_print ("first,\t second,\t concat\n");
117
  while (ptr != endptr) {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
118
    if (S_BASE_16_REVERSE[(size_t)*ptr] < 0) {
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
119
      s_err_print ("Unclean Base16 data.\n");
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
120
    }
121
    
122
    first = *ptr++;
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
123
    second = *ptr++;
124
    concat = base_16_concat(S_BASE_16_REVERSE[first],
125
                                 S_BASE_16_REVERSE[second]);
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
126
    
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
127
    //s_dbg_print ("%02x (%d),\t %02x (%d),\t %02x (%d)\n",first ,first, second, second, concat, concat);
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
128
    
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
129
    
130
    ret_val[pos] = concat;
131
    pos++;
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
132
  }
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
133
  
134
  return ret_val;
135
}
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
136
137
/* ****************************************************************************
138
 ********************************* BASE 32 ************************************
139
 **************************************************************************** */
140
141
89 by Gustav Hartvigsson
* Started working on Threads
142
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
143
static const schar
89 by Gustav Hartvigsson
* Started working on Threads
144
S_BASE_32_ALPHABET[32] = {
145
/* 0   1   2   3   4   5   6   7   8   9 */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
146
  'A','B','C','D','E','F','G','H','I','J',
147
  'K','L','M','N','O','P','Q','R','S','T',
148
  'U','V','W','X','Y','Z',
149
                          '2','3','4','5',
150
  '6','7'
151
};
152
153
154
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
155
static const sbyte
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
156
S_BASE_32_REVERSE[128] = {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
157
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
158
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
159
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
160
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
161
  -1, -1, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -3, -1, -1, /*3*/
162
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*4*/
163
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, -1, /*5*/
164
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*6*/
165
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, -1, /*7*/
166
};
167
168
/* TODO */
169
schar *
90 by Gustav Hartvigsson
* Macros were wrong.
170
s_base_32_enc (const sbyte * input_data,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
171
               size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
172
               size_t * out_len);
173
90 by Gustav Hartvigsson
* Macros were wrong.
174
/* TODO */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
175
sbyte *
90 by Gustav Hartvigsson
* Macros were wrong.
176
s_base_32_dec (const schar * base32_str,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
177
               size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
178
               size_t * out_len);
179
90 by Gustav Hartvigsson
* Macros were wrong.
180
/* * BASE 32 HEX * */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
181
182
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
183
static const schar
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
184
S_BASE_32_HEX_ALPHABET[32] = {
185
/* 0   1   2   3   4   5   6   7   8   9 */
186
  '0','1','2','3','4','5','6','7','8','9',
187
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
188
  'A','B','C','D','E','F','G','H','I','J',
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
189
  'K','L','M','N','O','P','Q','R','S','T',
190
  'U','V'
191
};
192
193
194
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
195
static const sbyte
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
196
S_BASE_32_HEX_REVERSE[128] = {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
197
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
198
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
199
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
200
  -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
201
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, /*3*/
202
  -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /*4*/
203
  25, 26, 27, 28, 29, 30, 31, 31, -1, -1, -1, -1, -1, -1, -1, -1, /*5*/
204
  -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /*7*/
205
  25, 26, 27, 28, 29, 30, 31, 31, -1, -1, -1, -1, -1, -1, -1, -1, /*8*/
206
};
207
208
/* TODO */
209
schar *
90 by Gustav Hartvigsson
* Macros were wrong.
210
s_base_32_hex_enc (const sbyte * input_data,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
211
                   size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
212
                   size_t * out_len);
213
90 by Gustav Hartvigsson
* Macros were wrong.
214
/* TODO */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
215
sbyte *
90 by Gustav Hartvigsson
* Macros were wrong.
216
s_base_32_hex_dec (const schar * base32_str,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
217
                   size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
218
                   size_t * out_len);
219
90 by Gustav Hartvigsson
* Macros were wrong.
220
221
/* ****************************************************************************
222
 ********************************* BASE 64 ************************************
223
 **************************************************************************** */
224
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
225
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
226
static const schar
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
227
S_BASE_64_ALPHABET[64] = {
228
/* 0   1   2   3   4   5   6   7   8   9 */
229
  'A','B','C','D','E','F','G','H','I','J',
230
  'K','L','M','N','O','P','Q','R','S','T',
231
  'U','V','W','X','Y','Z',
232
                          'a','b','c','d',
233
  'e','f','g','h','i','j','k','l','m','n',
234
  'o','p','q','r','s','t','u','v','w','x',
235
  'y','z',
236
          '0','1','2','3','4','5','6','7',
237
  '8','9',
238
          '+','/'
239
};
240
241
/* TODO */
242
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
243
static const sbyte
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
244
S_BASE_64_REVERSE[128] = {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
245
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
246
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
247
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
248
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, 64, /*2*/
249
  53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, -3, -1, -1, /*3*/
250
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*4*/
251
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, -1, /*5*/
252
  -1, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, /*6*/
253
  42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -1, -1, -1, -1, /*7*/
254
};
255
256
schar *
90 by Gustav Hartvigsson
* Macros were wrong.
257
s_base_64_enc (const sbyte * input_data,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
258
               size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
259
               size_t * out_len);
260
90 by Gustav Hartvigsson
* Macros were wrong.
261
sbyte *
262
s_base_64_dec (const schar * base64_str,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
263
               size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
264
               size_t * out_len);
265
90 by Gustav Hartvigsson
* Macros were wrong.
266
/* * BASE 64 SAFE * */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
267
268
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
269
static const schar
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
270
S_BASE_64_SAFE_ALPHABET[64] = {
271
/* 0   1   2   3   4   5   6   7   8   9 */
272
  'A','B','C','D','E','F','G','H','I','J',
273
  'K','L','M','N','O','P','Q','R','S','T',
274
  'U','V','W','X','Y','Z',
275
                          'a','b','c','d',
276
  'e','f','g','h','i','j','k','l','m','n',
277
  'o','p','q','r','s','t','u','v','w','x',
278
  'y','z',
279
          '0','1','2','3','4','5','6','7',
280
  '8','9',
281
          '-','_'
282
};
283
284
/* TODO */
285
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
286
static const sbyte
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
287
S_BASE_64_SAFE_REVERSE[128] = {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
288
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
289
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
290
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
291
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, /*2*/
292
  53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, -3, -1, -1, /*3*/
293
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*4*/
294
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, 64, /*5*/
295
  -1, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, /*6*/
296
  42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -1, -1, -1, -1, /*7*/
297
};
298
299
/* TODO */
300
schar *
90 by Gustav Hartvigsson
* Macros were wrong.
301
s_base_64_safe_enc (const sbyte * input_data,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
302
                    size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
303
                    size_t * out_len);
304
90 by Gustav Hartvigsson
* Macros were wrong.
305
/* TODO */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
306
sbyte *
90 by Gustav Hartvigsson
* Macros were wrong.
307
s_base_64_safe_dec (const schar * base64_str,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
308
                    size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
309
                    size_t * out_len);
310
90 by Gustav Hartvigsson
* Macros were wrong.
311