File Coverage

src/panda/encode/base32.cc
Criterion Covered Total %
statement 49 55 89.0
branch 30 52 57.6
condition n/a
subroutine n/a
pod n/a
total 79 107 73.8


line stmt bran cond sub pod time code
1             #include
2              
3             namespace panda { namespace encode {
4              
5             static const int XX = 255; /* illegal char */
6              
7             #define REV32(x) index32[(int)(x)]
8              
9             static const char basis32[] = "abcdefghijklmnopqrstuvwxyz234567";
10             static const char basis32up[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
11             static const unsigned char index32[256] = {
12             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
13             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
14             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
15             XX,XX,26,27, 28,29,30,31, XX,XX,XX,XX, XX,XX,XX,XX,
16             XX, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
17             15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,XX,
18             XX, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
19             15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,XX,
20             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
21             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
22             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
23             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
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             };
29              
30 2           size_t encode_base32 (const string_view source, char* dest, bool upper) {
31 2 100         const char* const basis = upper ? basis32up : basis32;
32 2           const unsigned char* str = (unsigned char*)source.data();
33 2           const unsigned char* const end = str + source.length();
34 2           char* ptr = dest;
35              
36 102           while (1) {
37 104 50         if (str == end) break;
38 104           *ptr++ = basis[(*str & 0xf8) >> 3];
39              
40 104 50         if (str == end) {
41 0           ptr--; /* previous char is useless */
42 0           break;
43             }
44 104 100         *ptr++ = basis[((*str & 0x07) << 2) | ((str + 1 != end) ? ((*(str+1) & 0xc0) >> 6) : 0)];
45 104           str++; /* 0 complete, iin=1 */
46              
47 104 100         if (str == end) break;
48 102           *ptr++ = basis[(*str & 0x3e) >> 1];
49              
50 102 50         if (str == end) {
51 0           ptr--; /* previous char is useless */
52 0           break;
53             }
54 102 50         *ptr++ = basis[((*str & 0x01) << 4) | ((str + 1 != end) ? ((*(str+1) & 0xf0) >> 4) : 0)];
55 102           str++; /* 1 complete, iin=2 */
56              
57 102 50         if (str == end) break;
58 102 50         *ptr++ = basis[((*str & 0x0f) << 1) | ((str + 1 != end) ? ((*(str+1) & 0x80) >> 7) : 0)];
59 102           str++; /* 2 complete, iin=3 */
60              
61 102 50         if (str == end) break;
62 102           *ptr++ = basis[(*str & 0x7c) >> 2];
63              
64 102 50         if (str == end) {
65 0           ptr--; /* previous char is useless */
66 0           break;
67             }
68 102 50         *ptr++ = basis[((*str & 0x03) << 3) | ((str + 1 != end) ? ((*(str+1) & 0xe0) >> 5) : 0)];
69 102           str++; /* 3 complete, iin=4 */
70              
71 102 50         if (str == end) break;
72 102           *ptr++ = basis[*str & 0x1f];
73 102           str++; /* 4 complete, iin=5 */
74             }
75              
76 2           return ptr - dest;
77             }
78              
79 2           size_t decode_base32 (const string_view source, char* dest) {
80 2           const char* str = source.data();
81 2           const char* const end = str + source.length();
82 2           unsigned char* ptr = (unsigned char*)dest;
83              
84 102           while (1) {
85 104 50         if (str+1 >= end || *str == 0 || str[1] == 0) break;
    50          
    50          
86 104           *ptr++ = ((REV32(*str) & 0x1f) << 3) | ((REV32(str[1]) & 0x1c) >> 2);
87 104           ++str;
88              
89 104 100         if (str+2 >= end || str[1] == 0 || str[2] == 0) break;
    50          
    50          
90 102           *ptr++ = ((REV32(*str) & 0x03) << 6) | ((REV32(str[1]) & 0x1f) << 1) | ((REV32(str[2]) & 0x10) >> 4);
91 102           str += 2;
92              
93 102 50         if (str+1 == end || str[1] == 0) break;
    50          
94 102           *ptr++ = ((REV32(*str) & 0x0f) << 4) | ((REV32(str[1]) & 0x1e) >> 1);
95 102           ++str;
96              
97 102 50         if (str+2 >= end || str[1] == 0 || str[2] == 0) break;
    50          
    50          
98 102           *ptr++ = ((REV32(*str) & 0x01) << 7) | ((REV32(str[1]) & 0x1f) << 2) | ((REV32(str[2]) & 0x18) >> 3);
99 102           str += 2;
100              
101 102 50         if (str+1 == end || str[1] == 0) break;
    50          
102 102           *ptr++ = ((REV32(*str) & 0x07) << 5) | ((REV32(str[1]) & 0x1f));
103 102           str += 2;
104             }
105              
106 2           return (char*)ptr - dest;
107             }
108              
109             }}