From c3b119ea81a7b6bf01cf8ba064ab9df8f7c92f1e Mon Sep 17 00:00:00 2001 From: CismonX Date: Thu, 20 Jul 2023 07:00:14 +0800 Subject: [PATCH] vt: improve handling of HTS Do not insert existing positions into the tab stop list. This prevents a performance issue when iterating through an extremely long tab stop list. Also corrects the behaviour of CBT. --- vt.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/vt.c b/vt.c index 2ee2dbaf..51b69c7e 100644 --- a/vt.c +++ b/vt.c @@ -436,6 +436,27 @@ UNITTEST xassert(term.vt.private == expected); } +static void +tab_set(struct terminal *term) +{ + int col = term->grid->cursor.point.col; + + if (tll_length(term->tab_stops) == 0 || tll_back(term->tab_stops) < col) { + tll_push_back(term->tab_stops, col); + return; + } + + tll_foreach(term->tab_stops, it) { + if (it->item < col) { + continue; + } + if (it->item > col) { + tll_insert_before(term->tab_stops, it, col); + } + break; + } +} + static void action_esc_dispatch(struct terminal *term, uint8_t final) { @@ -478,14 +499,7 @@ action_esc_dispatch(struct terminal *term, uint8_t final) break; case 'H': - tll_foreach(term->tab_stops, it) { - if (it->item >= term->grid->cursor.point.col) { - tll_insert_before(term->tab_stops, it, term->grid->cursor.point.col); - break; - } - } - - tll_push_back(term->tab_stops, term->grid->cursor.point.col); + tab_set(term); break; case 'M':