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.
This commit is contained in:
CismonX 2023-07-20 07:00:14 +08:00
parent a49281ced3
commit c3b119ea81
No known key found for this signature in database
GPG key ID: 3094873E29A482FB

30
vt.c
View file

@ -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':