selection: optimize \r\n -> \n when receiving clipboard data

Instead of first memmoving, possibly lots of data lots of times, the
received buffer, and _then_ calling the callback, simply call the
callback multiple times, and just skip the \r character(s).
This commit is contained in:
Daniel Eklöf 2019-12-15 12:11:12 +01:00
parent 2c4af8728d
commit 2f475d7b44
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

View file

@ -587,15 +587,23 @@ fdm_receive(struct fdm *fdm, int fd, int events, void *data)
if (count == 0)
break;
/* Replace \r\n with \n */
for (size_t i = 0; i < count - 1; i++) {
if (text[i] == '\r' && text[i + 1] == '\n') {
memmove(&text[i], &text[i + 1], count - i - 1);
count--;
/* Call cb while at same time replacing \r\n with \n */
const char *p = text;
size_t left = count;
again:
for (size_t i = 0; i < left - 1; i++) {
if (p[i] == '\r' && p[i + 1] == '\n') {
ctx->cb(p, i, ctx->user);
assert(i + 1 <= left);
p += i + 1;
left -= i + 1;
goto again;
}
}
ctx->cb(text, count, ctx->user);
ctx->cb(p, left, ctx->user);
left = 0;
}
done: