summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBerke Güzel <wenekar1@gmail.com>2026-10-13 19:47:42 +0300
committerBerke Güzel <wenekar1@gmail.com>2026-10-13 19:47:42 +0300
commit1846b07e80ceb64b0732538a56bf8463efde3c8d (patch)
treefd020feacdc5c433bc77c312d95e8aaae2ac0fb3 /src
parent1b52f704a005d79d00b1260b1e5bc5d6798ff7b6 (diff)
Optimize term_feed ASCII scanning alignment and fast CSI SGR single-param loop
Diffstat (limited to 'src')
-rw-r--r--src/fastcsi.c32
-rw-r--r--src/text.c5
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) {
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 &&