From 5168aa72cd43f42572ea32358c115a38f52a6032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 20 Jan 2021 19:20:03 +0100 Subject: [PATCH] selection: replace \r\n and \n with \r, and strip \e from pasted text Closes #305 Closes #306 --- selection.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/selection.c b/selection.c index 00292541..57553609 100644 --- a/selection.c +++ b/selection.c @@ -1608,12 +1608,36 @@ fdm_receive(struct fdm *fdm, int fd, int events, void *data) if (count == 0) break; - /* Call cb while at same time replacing \r\n with \n */ + /* + * Call cb while at same time replace: + * - \r\n -> \r + * - \n -> \r + * - \e -> (i.e. strip ESC) + */ 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') { + for (size_t i = 0; i < left; i++) { + switch (p[i]) { + default: + break; + + case '\n': + p[i] = '\r'; + break; + + case '\r': + if (i + 1 < left && p[i + 1] == '\n') { + ctx->decoder(ctx, p, i + 1); + + xassert(i + 2 <= left); + p += i + 2; + left -= i + 2; + goto again; + } + break; + + case '\x1b': ctx->decoder(ctx, p, i); xassert(i + 1 <= left);