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