gdb/testsuite/tui: implement _csi_P proc

Since commit 3cd522938792 ("Change the pager to a ui_file"), I see these
errors when running gdb.tui/scroll.exp:

    ERROR: invalid command name "_csi_P"
        while executing
    "::gdb_tcl_unknown _csi_P 2"
        ("uplevel" body line 1)
        invoked from within
    "uplevel 1 ::gdb_tcl_unknown $args"
        (procedure "::unknown" line 5)
        invoked from within
    "_csi_P 2"
        ("eval" body line 1)
        invoked from within
    "eval _csi_$cmd $params"

It looks like GDB is emitting a CSI that it did not emit before, the
"Delete character" one:

  https://vt100.net/docs/vt510-rm/DCH.html

Implement it.

Co-Authored-By: Andrew Burgess <aburgess@redhat.com>
Change-Id: I5bf86b6104d51b0623a26a69df83d1ca9a4851b7
This commit is contained in:
Simon Marchi
2022-03-29 20:58:58 -04:00
committed by Simon Marchi
parent 29d210012a
commit 7820b634f7
2 changed files with 56 additions and 0 deletions

View File

@ -492,6 +492,34 @@ proc test_delete_line { } {
} 3 0
}
proc test_delete_character { } {
Term::_move_cursor 2 1
Term::_csi_P
check "delete character, default param" {
"abcdefgh"
"ijlmnop "
"qrstuvwx"
"yz01234 "
} 2 1
Term::_csi_P 3
check "delete character, explicit param" {
"abcdefgh"
"ijop "
"qrstuvwx"
"yz01234 "
} 2 1
Term::_csi_P 12
check "delete character, more than number of columns" {
"abcdefgh"
"ij "
"qrstuvwx"
"yz01234 "
} 2 1
}
proc test_erase_character { } {
Term::_move_cursor 3 2
Term::_csi_X
@ -600,6 +628,7 @@ foreach_with_prefix test {
test_erase_in_display
test_erase_in_line
test_delete_line
test_delete_character
test_erase_character
test_repeat
test_vertical_line_position_absolute

View File

@ -349,6 +349,33 @@ namespace eval Term {
}
}
# Delete Character.
#
# https://vt100.net/docs/vt510-rm/DCH.html
proc _csi_P {args} {
set count [_default [lindex $args 0] 1]
_log_cur "Delete character ($count)" {
variable _cur_row
variable _cur_col
variable _chars
variable _cols
# Move all characters right of the cursor N positions left.
set out_col [expr $_cur_col]
set in_col [expr $_cur_col + $count]
while {$in_col < $_cols} {
set _chars($out_col,$_cur_row) $_chars($in_col,$_cur_row)
incr in_col
incr out_col
}
# Clear the rest of the line.
_clear_in_line $out_col $_cols $_cur_row
}
}
# Erase chars.
#
# https://vt100.net/docs/vt510-rm/ECH.html