/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
/* FIXME */
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
93
sbyte *
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
94
s_base_16_dec (const schar * base16_str,
100 by Gustav Hartvigsson
* Fixed README.
95
               size_t in_len,
96
               size_t * out_len) {
97
  sbyte * ptr = (sbyte *) base16_str;
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
98
  *out_len = (round_up ((in_len / 2), 2) + 1);
99
  schar * endptr = ptr + in_len;
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
100
  sbyte * ret_val = s_malloc (sizeof(sbyte) * (*out_len));
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
101
  
102
  subyte first;
103
  subyte second;
104
  subyte concat;
105
  
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
106
  size_t pos = 0;
107
  
108
  
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
109
  //s_dbg_print ("first,\t second,\t concat\n");
110
  while (ptr != endptr) {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
111
    if (S_BASE_16_REVERSE[(size_t)*ptr] < 0) {
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
112
      s_err_print ("Unclean Base16 data.\n");
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
113
    }
114
    
115
    first = *ptr++;
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
116
    second = *ptr++;
117
    concat = base_16_concat(S_BASE_16_REVERSE[first],
118
                                 S_BASE_16_REVERSE[second]);
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
119
    
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
120
    //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
121
    
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
122
    
123
    ret_val[pos] = concat;
124
    pos++;
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
125
  }
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
126
  
127
  ret_val[*out_len] = '\0';
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
128
  
129
  return ret_val;
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
130
}
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
131
132
/* ****************************************************************************
133
 ********************************* BASE 32 ************************************
134
 **************************************************************************** */
135
136
89 by Gustav Hartvigsson
* Started working on Threads
137
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
138
static const schar
89 by Gustav Hartvigsson
* Started working on Threads
139
S_BASE_32_ALPHABET[32] = {
140
/* 0   1   2   3   4   5   6   7   8   9 */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
141
  'A','B','C','D','E','F','G','H','I','J',
142
  'K','L','M','N','O','P','Q','R','S','T',
143
  'U','V','W','X','Y','Z',
144
                          '2','3','4','5',
145
  '6','7'
146
};
147
148
149
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
150
static const sbyte
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
151
S_BASE_32_REVERSE[128] = {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
152
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
153
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
154
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
155
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
156
  -1, -1, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -3, -1, -1, /*3*/
157
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*4*/
158
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, -1, /*5*/
159
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*6*/
160
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, -1, /*7*/
161
};
162
163
/* TODO */
164
schar *
90 by Gustav Hartvigsson
* Macros were wrong.
165
s_base_32_enc (const sbyte * input_data,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
166
               size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
167
               size_t * out_len);
168
90 by Gustav Hartvigsson
* Macros were wrong.
169
/* TODO */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
170
sbyte *
90 by Gustav Hartvigsson
* Macros were wrong.
171
s_base_32_dec (const schar * base32_str,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
172
               size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
173
               size_t * out_len);
174
90 by Gustav Hartvigsson
* Macros were wrong.
175
/* * BASE 32 HEX * */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
176
177
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
178
static const schar
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
179
S_BASE_32_HEX_ALPHABET[32] = {
180
/* 0   1   2   3   4   5   6   7   8   9 */
181
  '0','1','2','3','4','5','6','7','8','9',
182
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
183
  'A','B','C','D','E','F','G','H','I','J',
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
184
  'K','L','M','N','O','P','Q','R','S','T',
185
  'U','V'
186
};
187
188
189
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
190
static const sbyte
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
191
S_BASE_32_HEX_REVERSE[128] = {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
192
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
193
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
194
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
195
  -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
196
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, /*3*/
197
  -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /*4*/
198
  25, 26, 27, 28, 29, 30, 31, 31, -1, -1, -1, -1, -1, -1, -1, -1, /*5*/
199
  -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /*7*/
200
  25, 26, 27, 28, 29, 30, 31, 31, -1, -1, -1, -1, -1, -1, -1, -1, /*8*/
201
};
202
203
/* TODO */
204
schar *
90 by Gustav Hartvigsson
* Macros were wrong.
205
s_base_32_hex_enc (const sbyte * input_data,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
206
                   size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
207
                   size_t * out_len);
208
90 by Gustav Hartvigsson
* Macros were wrong.
209
/* TODO */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
210
sbyte *
90 by Gustav Hartvigsson
* Macros were wrong.
211
s_base_32_hex_dec (const schar * base32_str,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
212
                   size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
213
                   size_t * out_len);
214
90 by Gustav Hartvigsson
* Macros were wrong.
215
216
/* ****************************************************************************
217
 ********************************* BASE 64 ************************************
218
 **************************************************************************** */
219
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
220
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
221
static const schar
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
222
S_BASE_64_ALPHABET[64] = {
223
/* 0   1   2   3   4   5   6   7   8   9 */
224
  'A','B','C','D','E','F','G','H','I','J',
225
  'K','L','M','N','O','P','Q','R','S','T',
226
  'U','V','W','X','Y','Z',
227
                          'a','b','c','d',
228
  'e','f','g','h','i','j','k','l','m','n',
229
  'o','p','q','r','s','t','u','v','w','x',
230
  'y','z',
231
          '0','1','2','3','4','5','6','7',
232
  '8','9',
233
          '+','/'
234
};
235
236
/* TODO */
237
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
238
static const sbyte
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
239
S_BASE_64_REVERSE[128] = {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
240
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
241
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
242
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
243
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, 64, /*2*/
244
  53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, -3, -1, -1, /*3*/
245
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*4*/
246
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, -1, /*5*/
247
  -1, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, /*6*/
248
  42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -1, -1, -1, -1, /*7*/
249
};
250
251
schar *
90 by Gustav Hartvigsson
* Macros were wrong.
252
s_base_64_enc (const sbyte * input_data,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
253
               size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
254
               size_t * out_len);
255
90 by Gustav Hartvigsson
* Macros were wrong.
256
sbyte *
257
s_base_64_dec (const schar * base64_str,
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
/* * BASE 64 SAFE * */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
262
263
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
264
static const schar
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
265
S_BASE_64_SAFE_ALPHABET[64] = {
266
/* 0   1   2   3   4   5   6   7   8   9 */
267
  'A','B','C','D','E','F','G','H','I','J',
268
  'K','L','M','N','O','P','Q','R','S','T',
269
  'U','V','W','X','Y','Z',
270
                          'a','b','c','d',
271
  'e','f','g','h','i','j','k','l','m','n',
272
  'o','p','q','r','s','t','u','v','w','x',
273
  'y','z',
274
          '0','1','2','3','4','5','6','7',
275
  '8','9',
276
          '-','_'
277
};
278
279
/* TODO */
280
S_UNUSED
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
281
static const sbyte
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
282
S_BASE_64_SAFE_REVERSE[128] = {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
283
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
284
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
285
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
286
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, /*2*/
287
  53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, -3, -1, -1, /*3*/
288
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*4*/
289
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, 64, /*5*/
290
  -1, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, /*6*/
291
  42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -1, -1, -1, -1, /*7*/
292
};
293
294
/* TODO */
295
schar *
90 by Gustav Hartvigsson
* Macros were wrong.
296
s_base_64_safe_enc (const sbyte * input_data,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
297
                    size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
298
                    size_t * out_len);
299
90 by Gustav Hartvigsson
* Macros were wrong.
300
/* TODO */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
301
sbyte *
90 by Gustav Hartvigsson
* Macros were wrong.
302
s_base_64_safe_dec (const schar * base64_str,
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
303
                    size_t in_len,
100 by Gustav Hartvigsson
* Fixed README.
304
                    size_t * out_len);
305
90 by Gustav Hartvigsson
* Macros were wrong.
306