• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

KazDragon / terminalpp / 23767390367

30 Mar 2026 08:57PM UTC coverage: 97.867%. Remained the same
23767390367

push

github

web-flow
Update coverage workflow to use vcpkg (#316)

* Update coverage workflow to use vcpkg

* Add coverage exclusion for vcpkg directories

---------

Co-authored-by: PerdixOfMars <perdix.p76l@googlemail.com>

136 of 139 new or added lines in 4 files covered. (97.84%)

1652 of 1688 relevant lines covered (97.87%)

183.56 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.15
/src/glyph.cpp
1
#include "terminalpp/glyph.hpp"
2

3
#include <format>
4

5
#include <iostream>
6

7
namespace terminalpp {
8

9
static bool const is_printable_dec[] = {
10
    // clang-format off
11
/* 0x00 - 0x07 */ false, false, false, false, false, false, false, false,
12
/* 0x08 - 0x0F */ false, false, true,  false, false, false, false, false,
13
/* 0x10 - 0x17 */ false, false, false, false, false, false, false, false,
14
/* 0x18 - 0x1F */ false, false, false, false, false, false, false, false,
15
/* 0x20 - 0x27 */ true,  true,  true,  true,  true,  true,  true,  true,
16
/* 0x28 - 0x2F */ true,  true,  true,  true,  true,  true,  true,  true,
17
/* 0x30 - 0x37 */ true,  true,  true,  true,  true,  true,  true,  true,
18
/* 0x38 - 0x3F */ true,  true,  true,  true,  true,  true,  true,  true,
19
/* 0x40 - 0x47 */ true,  true,  true,  true,  true,  true,  true,  true,
20
/* 0x48 - 0x4F */ true,  true,  true,  true,  true,  true,  true,  true,
21
/* 0x50 - 0x57 */ true,  true,  true,  true,  true,  true,  true,  true,
22
/* 0x58 - 0x5F */ true,  true,  true,  true,  true,  true,  true,  true,
23
/* 0x60 - 0x67 */ true,  true,  true,  true,  true,  true,  true,  true,
24
/* 0x68 - 0x6F */ true,  true,  true,  true,  true,  true,  true,  true,
25
/* 0x70 - 0x77 */ true,  true,  true,  true,  true,  true,  true,  true,
26
/* 0x78 - 0x7F */ true,  true,  true,  true,  true,  true,  true,  false,
27
/* 0x80 - 0x87 */ false, false, false, false, false, false, false, false,
28
/* 0x88 - 0x8F */ false, false, false, false, false, false, false, false,
29
/* 0x90 - 0x97 */ false, false, false, false, false, false, false, false,
30
/* 0x98 - 0x9F */ false, false, false, false, false, false, false, false,
31
/* 0xA0 - 0xA7 */ true,  true,  true,  true,  true,  true,  true,  true,
32
/* 0xA8 - 0xAF */ true,  true,  true,  true,  true,  true,  true,  true,
33
/* 0xB0 - 0xB7 */ true,  true,  true,  true,  true,  true,  true,  true,
34
/* 0xB8 - 0xBF */ true,  true,  true,  true,  true,  true,  true,  true,
35
/* 0xC0 - 0xC7 */ true,  true,  true,  true,  true,  true,  true,  true,
36
/* 0xC8 - 0xCF */ true,  true,  true,  true,  true,  true,  true,  true,
37
/* 0xD0 - 0xD7 */ true,  true,  true,  true,  true,  true,  true,  true,
38
/* 0xD8 - 0xDF */ true,  true,  true,  true,  true,  true,  true,  true,
39
/* 0xE0 - 0xE7 */ true,  true,  true,  true,  true,  true,  true,  true,
40
/* 0xE8 - 0xEF */ true,  true,  true,  true,  true,  true,  true,  true,
41
/* 0xF0 - 0xF7 */ true,  true,  true,  true,  true,  true,  true,  true,
42
/* 0xF8 - 0xFF */ true,  true,  true,  true,  true,  true,  true,  false,
43
    // clang-format on
44
};
45

46
static bool const is_printable_uk[] = {
47
    // clang-format off
48
/* 0x00 - 0x07 */ false, false, false, false, false, false, false, false,
49
/* 0x08 - 0x0F */ false, false, true,  false, false, false, false, false,
50
/* 0x10 - 0x17 */ false, false, false, false, false, false, false, false,
51
/* 0x18 - 0x1F */ false, false, false, false, false, false, false, false,
52
/* 0x20 - 0x27 */ true,  true,  true,  true,  true,  true,  true,  true,
53
/* 0x28 - 0x2F */ true,  true,  true,  true,  true,  true,  true,  true,
54
/* 0x30 - 0x37 */ true,  true,  true,  true,  true,  true,  true,  true,
55
/* 0x38 - 0x3F */ true,  true,  true,  true,  true,  true,  true,  true,
56
/* 0x40 - 0x47 */ true,  true,  true,  true,  true,  true,  true,  true,
57
/* 0x48 - 0x4F */ true,  true,  true,  true,  true,  true,  true,  true,
58
/* 0x50 - 0x57 */ true,  true,  true,  true,  true,  true,  true,  true,
59
/* 0x58 - 0x5F */ true,  true,  true,  true,  true,  true,  true,  true,
60
/* 0x60 - 0x67 */ true,  true,  true,  true,  true,  true,  true,  true,
61
/* 0x68 - 0x6F */ true,  true,  true,  true,  true,  true,  true,  true,
62
/* 0x70 - 0x77 */ true,  true,  true,  true,  true,  true,  true,  true,
63
/* 0x78 - 0x7F */ true,  true,  true,  true,  true,  true,  true,  false,
64
/* 0x80 - 0x87 */ false, false, false, false, false, false, false, false,
65
/* 0x88 - 0x8F */ false, false, false, false, false, false, false, false,
66
/* 0x90 - 0x97 */ false, false, false, false, false, false, false, false,
67
/* 0x98 - 0x9F */ false, false, false, false, false, false, false, false,
68
/* 0xA0 - 0xA7 */ true,  true,  true,  true,  true,  true,  true,  true,
69
/* 0xA8 - 0xAF */ true,  true,  true,  true,  true,  true,  true,  true,
70
/* 0xB0 - 0xB7 */ true,  true,  true,  true,  true,  true,  true,  true,
71
/* 0xB8 - 0xBF */ true,  true,  true,  true,  true,  true,  true,  true,
72
/* 0xC0 - 0xC7 */ true,  true,  true,  true,  true,  true,  true,  true,
73
/* 0xC8 - 0xCF */ true,  true,  true,  true,  true,  true,  true,  true,
74
/* 0xD0 - 0xD7 */ true,  true,  true,  true,  true,  true,  true,  true,
75
/* 0xD8 - 0xDF */ true,  true,  true,  true,  true,  true,  true,  true,
76
/* 0xE0 - 0xE7 */ true,  true,  true,  true,  true,  true,  true,  true,
77
/* 0xE8 - 0xEF */ true,  true,  true,  true,  true,  true,  true,  true,
78
/* 0xF0 - 0xF7 */ true,  true,  true,  true,  true,  true,  true,  true,
79
/* 0xF8 - 0xFF */ true,  true,  true,  true,  true,  true,  true,  false,
80
    // clang-format on
81
};
82

83
static bool const is_printable_us_ascii[] = {
84
    // clang-format off
85
/* 0x00 - 0x07 */ false, false, false, false, false, false, false, false,
86
/* 0x08 - 0x0F */ false, false, true,  false, false, false, false, false,
87
/* 0x10 - 0x17 */ false, false, false, false, false, false, false, false,
88
/* 0x18 - 0x1F */ false, false, false, false, false, false, false, false,
89
/* 0x20 - 0x27 */ true,  true,  true,  true,  true,  true,  true,  true,
90
/* 0x28 - 0x2F */ true,  true,  true,  true,  true,  true,  true,  true,
91
/* 0x30 - 0x37 */ true,  true,  true,  true,  true,  true,  true,  true,
92
/* 0x38 - 0x3F */ true,  true,  true,  true,  true,  true,  true,  true,
93
/* 0x40 - 0x47 */ true,  true,  true,  true,  true,  true,  true,  true,
94
/* 0x48 - 0x4F */ true,  true,  true,  true,  true,  true,  true,  true,
95
/* 0x50 - 0x57 */ true,  true,  true,  true,  true,  true,  true,  true,
96
/* 0x58 - 0x5F */ true,  true,  true,  true,  true,  true,  true,  true,
97
/* 0x60 - 0x67 */ true,  true,  true,  true,  true,  true,  true,  true,
98
/* 0x68 - 0x6F */ true,  true,  true,  true,  true,  true,  true,  true,
99
/* 0x70 - 0x77 */ true,  true,  true,  true,  true,  true,  true,  true,
100
/* 0x78 - 0x7F */ true,  true,  true,  true,  true,  true,  true,  false,
101
/* 0x80 - 0x87 */ false, false, false, false, false, false, false, false,
102
/* 0x88 - 0x8F */ false, false, false, false, false, false, false, false,
103
/* 0x90 - 0x97 */ false, false, false, false, false, false, false, false,
104
/* 0x98 - 0x9F */ false, false, false, false, false, false, false, false,
105
/* 0xA0 - 0xA7 */ false, false, false, false, false, false, false, false,
106
/* 0xA8 - 0xAF */ false, false, false, false, false, false, false, false,
107
/* 0xB0 - 0xB7 */ false, false, false, false, false, false, false, false,
108
/* 0xB8 - 0xBF */ false, false, false, false, false, false, false, false,
109
/* 0xC0 - 0xC7 */ false, false, false, false, false, false, false, false,
110
/* 0xC8 - 0xCF */ false, false, false, false, false, false, false, false,
111
/* 0xD0 - 0xD7 */ false, false, false, false, false, false, false, false,
112
/* 0xD8 - 0xDF */ false, false, false, false, false, false, false, false,
113
/* 0xE0 - 0xE7 */ false, false, false, false, false, false, false, false,
114
/* 0xE8 - 0xEF */ false, false, false, false, false, false, false, false,
115
/* 0xF0 - 0xF7 */ false, false, false, false, false, false, false, false,
116
/* 0xF8 - 0xFF */ false, false, false, false, false, false, false, false,
117
    // clang-format on
118
};
119

120
static bool const is_printable_sco[] = {
121
    // clang-format off
122
/* 0x00 - 0x07 */ false, false, false, false, false, false, false, false,
123
/* 0x08 - 0x0F */ false, false, true,  false, false, false, false, false,
124
/* 0x10 - 0x17 */ false, false, false, false, false, false, false, false,
125
/* 0x18 - 0x1F */ false, false, false, false, false, false, false, false,
126
/* 0x20 - 0x27 */ true,  true,  true,  true,  true,  true,  true,  true,
127
/* 0x28 - 0x2F */ true,  true,  true,  true,  true,  true,  true,  true,
128
/* 0x30 - 0x37 */ true,  true,  true,  true,  true,  true,  true,  true,
129
/* 0x38 - 0x3F */ true,  true,  true,  true,  true,  true,  true,  true,
130
/* 0x40 - 0x47 */ true,  true,  true,  true,  true,  true,  true,  true,
131
/* 0x48 - 0x4F */ true,  true,  true,  true,  true,  true,  true,  true,
132
/* 0x50 - 0x57 */ true,  true,  true,  true,  true,  true,  true,  true,
133
/* 0x58 - 0x5F */ true,  true,  true,  true,  true,  true,  true,  true,
134
/* 0x60 - 0x67 */ true,  true,  true,  true,  true,  true,  true,  true,
135
/* 0x68 - 0x6F */ true,  true,  true,  true,  true,  true,  true,  true,
136
/* 0x70 - 0x77 */ true,  true,  true,  true,  true,  true,  true,  true,
137
/* 0x78 - 0x7F */ true,  true,  true,  true,  true,  true,  true,  false,
138
/* 0x80 - 0x87 */ false, false, false, false, false, false, false, false,
139
/* 0x88 - 0x8F */ false, false, false, false, false, false, false, false,
140
/* 0x90 - 0x97 */ false, false, false, false, false, false, false, false,
141
/* 0x98 - 0x9F */ false, false, false, false, false, false, false, false,
142
/* 0xA0 - 0xA7 */ true,  true,  true,  true,  true,  true,  true,  true,
143
/* 0xA8 - 0xAF */ true,  true,  true,  true,  true,  true,  true,  true,
144
/* 0xB0 - 0xB7 */ true,  true,  true,  true,  true,  true,  true,  true,
145
/* 0xB8 - 0xBF */ true,  true,  true,  true,  true,  true,  true,  true,
146
/* 0xC0 - 0xC7 */ true,  true,  true,  true,  true,  true,  true,  true,
147
/* 0xC8 - 0xCF */ true,  true,  true,  true,  true,  true,  true,  true,
148
/* 0xD0 - 0xD7 */ true,  true,  true,  true,  true,  true,  true,  true,
149
/* 0xD8 - 0xDF */ true,  true,  true,  true,  true,  true,  true,  true,
150
/* 0xE0 - 0xE7 */ true,  true,  true,  true,  true,  true,  true,  true,
151
/* 0xE8 - 0xEF */ true,  true,  true,  true,  true,  true,  true,  true,
152
/* 0xF0 - 0xF7 */ true,  true,  true,  true,  true,  true,  true,  true,
153
/* 0xF8 - 0xFF */ true,  true,  true,  true,  true,  true,  true,  false,
154
    // clang-format on
155
};
156

157
// ==========================================================================
158
// IS_PRINTABLE
159
// ==========================================================================
160
bool is_printable(glyph const &gly) noexcept
542✔
161
{
162
    bool const *lookup = is_printable_dec;
542✔
163

164
    switch (gly.charset_.value_)
542✔
165
    {
166
        default:
64✔
167
            // Fall-through
168
        case terminalpp::charset::dec:
169
            lookup = is_printable_dec;
64✔
170
            break;
64✔
171

172
        case terminalpp::charset::uk:
7✔
173
            lookup = is_printable_uk;
7✔
174
            break;
7✔
175

176
        case terminalpp::charset::us_ascii:
468✔
177
            lookup = is_printable_us_ascii;
468✔
178
            break;
468✔
179

180
        case terminalpp::charset::sco:
3✔
181
            lookup = is_printable_sco;
3✔
182
            break;
3✔
183
    }
184

185
    return lookup[gly.character_];
542✔
186
}
187

188
namespace {
189

190
// ==========================================================================
191
// OUTPUT_CHARSET_AND_CHARACTER
192
// ==========================================================================
193
std::ostream &output_charset_and_character(std::ostream &out, glyph const &gly)
554✔
194
{
195
    if (gly.charset_ != character_set())
554✔
196
    {
197
        out << gly.charset_ << ":";
80✔
198
    }
199

200
    switch (gly.character_)
554✔
201
    {
202
        case '\r':
4✔
203
            return out << "\\r";
4✔
204
        case '\n':
4✔
205
            return out << "\\n";
4✔
206
        case '\t':
4✔
207
            return out << "\\t";
4✔
208
        default:
542✔
209
            if (is_printable(gly))
542✔
210
            {
211
                return out << gly.character_;
524✔
212
            }
213
            else
214
            {
215
                return out << std::format(
18✔
216
                           "0x{:02X}", static_cast<int>(gly.character_));
36✔
217
            }
218
    }
219
}
220

221
// ==========================================================================
222
// UTF8_DECODE
223
// ==========================================================================
224
std::uint32_t utf8_decode(glyph const &gly) noexcept
23✔
225
{
226
    std::uint32_t value = 0;
23✔
227

228
    if ((gly.ucharacter_[0] & 0b10000000) == 0)
23✔
229
    {
NEW
230
        value = gly.ucharacter_[0];
×
231
    }
232

233
    if ((gly.ucharacter_[0] & 0b11100000) == 0b11000000)
23✔
234
    {
235
        value =
13✔
236
            std::uint32_t((gly.ucharacter_[0] & 0b00011111) << 6);  // NOLINT
13✔
237
        value |=
13✔
238
            std::uint32_t((gly.ucharacter_[1] & 0b00111111) << 0);  // NOLINT
13✔
239
    }
240

241
    if ((gly.ucharacter_[0] & 0b11110000) == 0b11100000)
23✔
242
    {
243
        value =
10✔
244
            std::uint32_t((gly.ucharacter_[0] & 0b00001111) << 12);  // NOLINT
10✔
245
        value |=
10✔
246
            std::uint32_t((gly.ucharacter_[1] & 0b00111111) << 6);  // NOLINT
10✔
247
        value |=
10✔
248
            std::uint32_t((gly.ucharacter_[2] & 0b00111111) << 0);  // NOLINT
10✔
249
    }
250

251
    return value;
23✔
252
}
253

254
}  // namespace
255

256
// ==========================================================================
257
// OPERATOR<<(STREAM, GLYPH)
258
// ==========================================================================
259
std::ostream &operator<<(std::ostream &out, glyph const &gly)
577✔
260
{
261
    if (gly.charset_ == terminalpp::charset::utf8)
577✔
262
    {
263
        if (gly.ucharacter_[0] <= 0x7F)
58✔
264
        {
265
            return output_charset_and_character(out, gly);
35✔
266
        }
267
        else
268
        {
269
            return out << std::format("U+{:04X}", utf8_decode(gly));
23✔
270
        }
271
    }
272
    else
273
    {
274
        return output_charset_and_character(out, gly);
519✔
275
    }
276
}
277

278
}  // namespace terminalpp
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc