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