compiler/libec; eda, extras: const fixes for DB apps
[sdk] / extras / base64.ec
1 static char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2 static char base64inv[128] =
3 {
4     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,0, 0, 0,63,
7    52,53,54,55,56,57,58,59,60,61, 0, 0, 0, 0, 0, 0,
8     0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
9    15,16,17,18,19,20,21,22,23,24,25, 0, 0, 0, 0, 0,
10     0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
11    41,42,43,44,45,46,47,48,49,50,51, 0, 0, 0, 0, 0
12 };
13
14 int Base64Encode(byte * input, int len, byte * encoded)
15 {
16    uint buffer;
17    int c = 0;
18    int remaining = 3;
19    int encLen = 0;
20    while(c < len)
21    {
22       if(len - c < 3)
23       {
24          remaining = len - c;
25          buffer = 0;
26          buffer |= (int)input[c] << 16;
27          if(len - c > 1)
28             buffer |= (int)input[c+1] << 8;
29       }
30       else
31          buffer = ((int)input[c] << 16) | ((int)input[c+1] << 8) | input[c+2];
32       encoded[encLen++] = base64digits[(buffer & 0xFC0000) >> 18];
33       encoded[encLen++] = base64digits[(buffer & 0x03F000) >> 12];
34       encoded[encLen++] = (remaining >= 2) ? base64digits[(buffer & 0x000FC0) >> 6] : '=';
35       encoded[encLen++] = (remaining >= 3) ? base64digits[(buffer & 0x00003F)]      : '=';
36       c += 3;
37    }
38    encoded[encLen] = 0;
39    return encLen;
40 }
41
42 int Base64Decode(const byte * input, int len, byte * decoded)
43 {
44    uint buffer;
45    int c = 0;
46    int decLen = 0;
47    while(c < len)
48    {
49       buffer = ((int)base64inv[input[c]] << 18) | ((int)base64inv[input[c+1]] << 12) | ((int)base64inv[input[c+2]] << 6) | ((int)base64inv[input[c+3]]);
50
51       decoded[decLen++] = (byte)((buffer & 0xFF0000) >> 16);
52       if(len - c < 4)
53       {
54          if(input[c+2] != '=')
55          {
56             decoded[decLen++] = (byte)((buffer & 0x00FF00) >> 8);
57             if(input[c+3] != '=')
58                decoded[decLen++] = (byte)(buffer & 0x0000FF);
59          }
60       }
61       else
62       {
63          decoded[decLen++] = (byte)((buffer & 0x00FF00) >> 8);
64          decoded[decLen++] = (byte)(buffer & 0x0000FF);
65       }
66       c += 4;
67    }
68    decoded[decLen] = 0;
69    return decLen;
70 }