File Coverage

src/panda/encode/base16.cc
Criterion Covered Total %
statement 18 18 100.0
branch 6 6 100.0
condition n/a
subroutine n/a
pod n/a
total 24 24 100.0


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             static const char basis16[] = "0123456789abcdef";
8             static const char basis16up[] = "0123456789ABCDEF";
9             static const unsigned char index16[256] = {
10             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
11             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
12             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
13             0, 1, 2, 3, 4, 5, 6, 7, 8, 9,XX,XX, XX,XX,XX,XX,
14             XX,10,11,12, 13,14,15,XX, XX,XX,XX,XX, XX,XX,XX,XX,
15             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
16             XX,10,11,12, 13,14,15,XX, XX,XX,XX,XX, XX,XX,XX,XX,
17             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
18             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
19             XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,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             };
27              
28 2           size_t encode_base16 (const string_view source, char* dest, bool upper) {
29 2 100         const char* basis = upper ? basis16up : basis16;
30 2           unsigned const char* str = (unsigned const char*)source.data();
31 2           unsigned const char* const end = str + source.length();
32 2           char* ptr = dest;
33              
34 514 100         for (; str != end; ++str) {
35 512           unsigned char c = *str;
36 512           *ptr++ = basis[c / 16];
37 512           *ptr++ = basis[c % 16];
38             }
39              
40 2           return ptr - dest;
41             }
42              
43 2           size_t decode_base16 (const string_view source, char* dest) {
44 2           unsigned const char* str = (unsigned const char*)source.data();
45 2           unsigned const char* const end = str + source.length();
46 2           char* ptr = dest;
47              
48 514 100         while (str + 1 < end) {
49 512           *ptr++ = index16[*str] * 16 + index16[str[1]];
50 512           str += 2;
51             }
52              
53 2           return ptr - dest;
54             }
55              
56             }}