diff options
| author | Berke Güzel <wenekar1@gmail.com> | 2026-10-13 19:47:42 +0300 |
|---|---|---|
| committer | Berke Güzel <wenekar1@gmail.com> | 2026-10-13 19:47:42 +0300 |
| commit | 1846b07e80ceb64b0732538a56bf8463efde3c8d (patch) | |
| tree | fd020feacdc5c433bc77c312d95e8aaae2ac0fb3 | |
| parent | 1b52f704a005d79d00b1260b1e5bc5d6798ff7b6 (diff) | |
Optimize term_feed ASCII scanning alignment and fast CSI SGR single-param loop
| -rw-r--r-- | src/fastcsi.c | 32 | ||||
| -rw-r--r-- | src/text.c | 5 |
2 files changed, 33 insertions, 4 deletions
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) { @@ -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 && |
