dte test coverage


Directory: ./
File: src/terminal/rxvt.c
Date: 2025-12-11 10:43:49
Coverage Exec Excl Total
Lines: 98.0% 48 0 49
Functions: 100.0% 1 0 1
Branches: 85.3% 29 0 34

Line Branch Exec Source
1 #include "parse.h"
2 #include "rxvt.h"
3
4 /*
5 rxvt uses some key codes that differ from the ones used by xterm.
6 They don't conflict or overlap with the xterm codes, but specifically
7 aren't handled by term_parse_sequence() because some of them violate
8 the ECMA-48 spec (notably, the ones ending with '$', which isn't a
9 valid final byte).
10 */
11 232 ssize_t rxvt_parse_key(const char *buf, size_t length, KeyCode *k)
12 {
13 232 KeyCode extra_mods = 0;
14 232 size_t extra_bytes = 0;
15
3/4
✓ Branch 2 → 3 taken 183 times.
✓ Branch 2 → 4 taken 49 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 183 times.
232 if (length < 2 || buf[0] != '\033') {
16 49 goto generic;
17 }
18
19 183 KeyCode mods;
20
3/4
✓ Branch 5 → 6 taken 5 times.
✓ Branch 5 → 7 taken 79 times.
✓ Branch 5 → 10 taken 99 times.
✗ Branch 5 → 11 not taken.
183 switch (buf[1]) {
21 5 case 'O':
22 5 mods = MOD_CTRL;
23 5 goto final;
24 case '[':
25 mods = MOD_SHIFT;
26 84 final:
27
2/2
✓ Branch 7 → 8 taken 58 times.
✓ Branch 7 → 35 taken 26 times.
84 if (length < 3) {
28 return TPARSE_PARTIAL_MATCH;
29 }
30
2/2
✓ Branch 8 → 9 taken 8 times.
✓ Branch 8 → 11 taken 50 times.
58 switch (buf[2]) {
31 8 case 'a': // Up
32 case 'b': // Down
33 case 'c': // Right
34 case 'd': // Left
35 8 *k = mods | (KEY_UP + (buf[2] - 'a'));
36 8 return 3;
37 }
38 break;
39 99 case '\033':
40 99 extra_mods = MOD_META;
41 99 extra_bytes = 1;
42 99 buf++;
43 99 length--;
44 99 break;
45 }
46
47
3/4
✓ Branch 11 → 12 taken 50 times.
✓ Branch 11 → 13 taken 99 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 50 times.
149 if (length < 4 || buf[1] != '[') {
48 99 goto generic;
49 }
50
51 50 KeyCode key;
52 50 ssize_t n;
53
5/5
✓ Branch 14 → 15 taken 12 times.
✓ Branch 14 → 16 taken 12 times.
✓ Branch 14 → 17 taken 12 times.
✓ Branch 14 → 18 taken 12 times.
✓ Branch 14 → 19 taken 2 times.
50 switch (buf[3]) {
54 12 case '~': key = 0; break;
55 12 case '^': key = MOD_CTRL; break;
56 12 case '$': key = MOD_SHIFT; break;
57 12 case '@': key = MOD_SHIFT | MOD_CTRL; break;
58 2 default: goto generic;
59 }
60
61
6/7
✓ Branch 20 → 21 taken 8 times.
✓ Branch 20 → 22 taken 8 times.
✓ Branch 20 → 23 taken 8 times.
✓ Branch 20 → 24 taken 8 times.
✓ Branch 20 → 25 taken 8 times.
✓ Branch 20 → 26 taken 8 times.
✗ Branch 20 → 27 not taken.
48 switch (buf[2]) {
62 8 case '2': key |= KEY_INSERT; break;
63 8 case '3': key |= KEY_DELETE; break;
64 8 case '5': key |= KEY_PAGE_UP; break;
65 8 case '6': key |= KEY_PAGE_DOWN; break;
66 8 case '7': key |= KEY_HOME; break;
67 8 case '8': key |= KEY_END; break;
68 default: goto generic;
69 }
70
71 48 *k = key | extra_mods;
72 48 return 4 + extra_bytes;
73
74 150 generic:
75 150 n = term_parse_sequence(buf, length, &key);
76
2/2
✓ Branch 30 → 31 taken 2 times.
✓ Branch 30 → 35 taken 148 times.
150 if (n <= 0) {
77 return n;
78 }
79
3/4
✓ Branch 31 → 32 taken 1 time.
✓ Branch 31 → 34 taken 1 time.
✓ Branch 32 → 33 taken 1 time.
✗ Branch 32 → 34 not taken.
2 if (unlikely(key == KEY_IGNORE && extra_mods)) {
80 1 extra_mods = 0;
81 }
82 2 *k = key | extra_mods;
83 2 return n + extra_bytes;
84 }
85