| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
#include |
|
2
|
|
|
|
|
|
|
#include |
|
3
|
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
namespace panda { namespace encode { |
|
5
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
using std::int64_t; |
|
7
|
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
static const int EQ = 254; /* padding */ |
|
9
|
|
|
|
|
|
|
static const int XX = 255; /* illegal char */ |
|
10
|
|
|
|
|
|
|
static const int INVALID = XX; |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
static const char basis64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
|
13
|
|
|
|
|
|
|
static const char basis64url[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; |
|
14
|
|
|
|
|
|
|
static const unsigned char index64[256] = { |
|
15
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
16
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
17
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,62, XX,62,XX,63, |
|
18
|
|
|
|
|
|
|
52,53,54,55, 56,57,58,59, 60,61,XX,XX, XX,EQ,XX,XX, |
|
19
|
|
|
|
|
|
|
XX, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, |
|
20
|
|
|
|
|
|
|
15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,63, |
|
21
|
|
|
|
|
|
|
XX,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, |
|
22
|
|
|
|
|
|
|
41,42,43,44, 45,46,47,48, 49,50,51,XX, XX,XX,XX,XX, |
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
25
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
26
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
27
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
28
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
29
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
30
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
31
|
|
|
|
|
|
|
XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
|
32
|
|
|
|
|
|
|
}; |
|
33
|
|
|
|
|
|
|
|
|
34
|
4
|
|
|
|
|
|
size_t encode_base64 (const string_view source, char* dest, bool url_mode, bool use_pad) { |
|
35
|
4
|
|
|
|
|
|
char* ptr = dest; |
|
36
|
4
|
100
|
|
|
|
|
const char* basis = url_mode ? basis64url : basis64; |
|
37
|
4
|
|
|
|
|
|
const char* str = source.data(); |
|
38
|
|
|
|
|
|
|
|
|
39
|
267
|
100
|
|
|
|
|
for (int64_t len = source.length(); len > 0; len -= 3) { |
|
40
|
263
|
|
|
|
|
|
unsigned char c1 = *str++; |
|
41
|
263
|
100
|
|
|
|
|
unsigned char c2 = len > 1 ? *str++ : '\0'; |
|
42
|
263
|
|
|
|
|
|
*ptr++ = basis[c1>>2]; |
|
43
|
263
|
|
|
|
|
|
*ptr++ = basis[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)]; |
|
44
|
263
|
100
|
|
|
|
|
if (len > 2) { |
|
45
|
260
|
|
|
|
|
|
unsigned char c3 = *str++; |
|
46
|
260
|
|
|
|
|
|
*ptr++ = basis[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)]; |
|
47
|
260
|
|
|
|
|
|
*ptr++ = basis[c3 & 0x3F]; |
|
48
|
3
|
50
|
|
|
|
|
} else if (len == 2) { |
|
49
|
0
|
|
|
|
|
|
*ptr++ = basis[(c2 & 0xF) << 2]; |
|
50
|
0
|
0
|
|
|
|
|
if (use_pad) *ptr++ = '='; |
|
51
|
3
|
100
|
|
|
|
|
} else if (use_pad) { |
|
52
|
1
|
|
|
|
|
|
*ptr++ = '='; |
|
53
|
1
|
|
|
|
|
|
*ptr++ = '='; |
|
54
|
|
|
|
|
|
|
} |
|
55
|
|
|
|
|
|
|
} |
|
56
|
4
|
|
|
|
|
|
return ptr - dest; |
|
57
|
|
|
|
|
|
|
} |
|
58
|
|
|
|
|
|
|
|
|
59
|
4
|
|
|
|
|
|
size_t decode_base64 (const string_view source, char* dest) { |
|
60
|
4
|
|
|
|
|
|
const unsigned char* str = (const unsigned char*)source.data(); |
|
61
|
4
|
|
|
|
|
|
const unsigned char* const end = str + source.length(); |
|
62
|
4
|
|
|
|
|
|
char* ptr = dest; |
|
63
|
|
|
|
|
|
|
|
|
64
|
264
|
100
|
|
|
|
|
while (str < end) { |
|
65
|
|
|
|
|
|
|
unsigned char c[4]; |
|
66
|
263
|
|
|
|
|
|
int i = 0; |
|
67
|
785
|
|
|
|
|
|
do { |
|
68
|
1048
|
|
|
|
|
|
unsigned char uc = index64[*str++]; |
|
69
|
1048
|
50
|
|
|
|
|
if (uc != INVALID) c[i++] = uc; |
|
70
|
1048
|
100
|
|
|
|
|
if (str == end) { |
|
71
|
4
|
100
|
|
|
|
|
if (i < 4) { |
|
72
|
5
|
50
|
|
|
|
|
if (i < 2) goto thats_it; |
|
73
|
2
|
50
|
|
|
|
|
if (i == 2) c[2] = EQ; |
|
74
|
2
|
|
|
|
|
|
c[3] = EQ; |
|
75
|
|
|
|
|
|
|
} |
|
76
|
4
|
|
|
|
|
|
break; |
|
77
|
|
|
|
|
|
|
} |
|
78
|
1044
|
100
|
|
|
|
|
} while (i < 4); |
|
79
|
|
|
|
|
|
|
|
|
80
|
263
|
50
|
|
|
|
|
if (c[0] == EQ || c[1] == EQ) break; |
|
|
|
50
|
|
|
|
|
|
|
81
|
263
|
|
|
|
|
|
*ptr++ = (c[0] << 2) | ((c[1] & 0x30) >> 4); |
|
82
|
263
|
100
|
|
|
|
|
if (c[2] == EQ) break; |
|
83
|
260
|
|
|
|
|
|
*ptr++ = ((c[1] & 0x0F) << 4) | ((c[2] & 0x3C) >> 2); |
|
84
|
260
|
50
|
|
|
|
|
if (c[3] == EQ) break; |
|
85
|
260
|
|
|
|
|
|
*ptr++ = ((c[2] & 0x03) << 6) | c[3]; |
|
86
|
|
|
|
|
|
|
} |
|
87
|
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
thats_it: |
|
89
|
4
|
|
|
|
|
|
return ptr - dest; |
|
90
|
|
|
|
|
|
|
} |
|
91
|
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
}} |