Line | Branch | Exec | Source |
---|---|---|---|
1 | #include <stdlib.h> | ||
2 | #include "osc52.h" | ||
3 | #include "output.h" | ||
4 | #include "util/base64.h" | ||
5 | #include "util/debug.h" | ||
6 | #include "util/xstring.h" | ||
7 | |||
8 | 3 | bool term_osc52_copy(TermOutputBuffer *output, StringView text, TermCopyFlags flags) | |
9 | { | ||
10 | 3 | BUG_ON(flags == 0); | |
11 | 3 | size_t bufsize = (text.length / 3 * 4) + 4; | |
12 | 3 | char *buf = malloc(bufsize); | |
13 |
1/2✓ Branch 0 (4→5) taken 3 times.
✗ Branch 1 (4→21) not taken.
|
3 | if (unlikely(!buf)) { |
14 | return false; | ||
15 | } | ||
16 | |||
17 | 3 | size_t plen = !!(flags & TCOPY_PRIMARY); | |
18 | 3 | size_t clen = !!(flags & TCOPY_CLIPBOARD); | |
19 | 3 | char *start = term_output_reserve_space(output, 16); | |
20 | 3 | char *end = xmempcpy4(start, STRN("\033]52;"), "p", plen, "c", clen, STRN(";")); | |
21 | 3 | output->count += (end - start); | |
22 | |||
23 |
2/2✓ Branch 0 (7→8) taken 1 times.
✓ Branch 1 (7→9) taken 2 times.
|
3 | if (unlikely(text.length == 0)) { |
24 | 1 | goto out; | |
25 | } | ||
26 | |||
27 | 2 | size_t remainder = text.length % 3; | |
28 | 2 | size_t ilen = 0; | |
29 | 2 | size_t olen = 0; | |
30 |
1/2✓ Branch 0 (9→10) taken 2 times.
✗ Branch 1 (9→15) not taken.
|
2 | if (text.length >= 3) { |
31 | 2 | ilen = text.length - remainder; | |
32 | 2 | BUG_ON(ilen == 0); | |
33 | 2 | BUG_ON(ilen % 3 != 0); | |
34 | 2 | olen = base64_encode_block(text.data, ilen, buf, bufsize); | |
35 | } | ||
36 | |||
37 |
2/2✓ Branch 0 (15→16) taken 1 times.
✓ Branch 1 (15→18) taken 1 times.
|
2 | if (remainder) { |
38 | 1 | base64_encode_final(text.data + ilen, remainder, buf + olen); | |
39 | 1 | olen += 4; | |
40 | } | ||
41 | |||
42 | 2 | term_put_bytes(output, buf, olen); | |
43 | |||
44 | 3 | out: | |
45 | 3 | free(buf); | |
46 | 3 | term_put_literal(output, "\033\\"); | |
47 | 3 | return true; | |
48 | } | ||
49 |