From 1846b07e80ceb64b0732538a56bf8463efde3c8d Mon Sep 17 00:00:00 2001 From: Berke Güzel Date: Tue, 13 Oct 2026 19:47:42 +0300 Subject: Optimize term_feed ASCII scanning alignment and fast CSI SGR single-param loop --- src/fastcsi.c | 32 ++++++++++++++++++++++++++++++++ src/text.c | 5 +---- 2 files changed, 33 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/fastcsi.c b/src/fastcsi.c index dfd2dba..6cae7a3 100644 --- a/src/fastcsi.c +++ b/src/fastcsi.c @@ -253,6 +253,38 @@ int term_try_fast_csi(struct term *t, const char *buf, size_t rem) p = q + 1; break; case 'm': { + if (nparams == 1) { + int v = pv[0]; + switch (v) { + case 0: reset_sgr(t); fg = t->cur_fg; bg = t->cur_bg; break; + case 1: t->bold = true; break; + case 2: t->faint = true; break; + case 3: t->italic = true; break; + case 4: t->underline = 1; break; + case 7: t->inverse = true; break; + case 9: t->strike = true; break; + case 21: t->underline = 2; break; + case 22: t->bold = false; t->faint = false; break; + case 23: t->italic = false; break; + case 24: t->underline = 0; break; + case 27: t->inverse = false; break; + case 29: t->strike = false; break; + case 39: fg = TERM_COLOR_FG; break; + case 49: bg = TERM_COLOR_BG; break; + case 53: t->overline = true; break; + case 55: t->overline = false; break; + case 59: t->cur_ul = 0; break; + default: + if ((unsigned)(v - 30) < 8) fg = term_color_index(v - 30); + else if ((unsigned)(v - 40) < 8) bg = term_color_index(v - 40); + else if ((unsigned)(v - 90) < 8) fg = term_color_index(v - 90 + 8); + else if ((unsigned)(v - 100) < 8) bg = term_color_index(v - 100 + 8); + break; + } + flags_ok = false; + p = q + 1; + break; + } for (int j = 0; j < nparams; j++) { int v = pv[j]; switch (v) { diff --git a/src/text.c b/src/text.c index 07ade9d..80c4914 100644 --- a/src/text.c +++ b/src/text.c @@ -220,10 +220,7 @@ static void term_feed_inner(struct term *t, const char *buf, size_t len, unsigne int avail = t->pending_wrap ? t->cols : t->cols - t->cursor_x; int rem = (int)(len - i); if (rem > avail) rem = avail; - int run = 1; - if (rem > 1 && (unsigned char)buf[i + 1] >= 0x20 && - (unsigned char)buf[i + 1] < 0x7f) - run += scan_ascii_run(buf + i + 1, rem - 1); + int run = scan_ascii_run(buf + i, rem); if (TERM_EXPECT(can_stream_bottom(t), 1) && (run == t->cols || (i + (size_t)run < len && -- cgit v1.2.3