st-paste_controls-0.9.2.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
st-paste_controls-0.9.2.diff (1021B) | |
--- | |
1 diff --git a/x.c b/x.c | |
2 index bd23686..254d3d0 100644 | |
3 --- a/x.c | |
4 +++ b/x.c | |
5 @@ -580,11 +580,33 @@ selnotify(XEvent *e) | |
6 * copy and pasting. When receiving some selection data, | |
7 * replace all '\n' with '\r'. | |
8 * FIXME: Fix the computer world. | |
9 + * | |
10 + * Also, replace most C0 control codes with spaces, exc… | |
11 + * HT and CR. Note that we are not replacing C1 control… | |
12 + * (0x80 to 0x9F), as these are possibly valid UTF-8 | |
13 + * continuation bytes. | |
14 */ | |
15 repl = data; | |
16 last = data + nitems * format / 8; | |
17 - while ((repl = memchr(repl, '\n', last - repl))) { | |
18 - *repl++ = '\r'; | |
19 + while (repl != last) { | |
20 + if (*repl <= 0x1f) { | |
21 + switch (*repl) { | |
22 + case 0x09: /* HT \t */ | |
23 + case 0x0D: /* CR \r */ | |
24 + repl++; | |
25 + break; | |
26 + case 0x0a: /* LF \n */ | |
27 + *repl++ = '\r'; | |
28 + break; | |
29 + default: | |
30 + *repl++ = ' '; | |
31 + break; | |
32 + }; | |
33 + } else if (*repl == 0x7f) { /* DEL */ | |
34 + *repl++ = ' '; | |
35 + } else { | |
36 + repl++; | |
37 + } | |
38 } | |
39 | |
40 if (IS_SET(MODE_BRCKTPASTE) && ofs == 0) |