[gdb/tui] Don't show line number for lines not in source file

Currently, for a source file containing only 5 lines, we also show line
numbers 6 and 7 if they're in scope of the source window:
...
    0 +-compact-source.c----------------+
    1 |___3_{                           |
    2 |___4_  return 0;                 |
    3 |___5_}                           |
    4 |___6_                            |
    5 |___7_                            |
    6 +---------------------------------+
...

Fix this by not showing line numbers not in a source file, such that we have instead:
...
    0 +-compact-source.c----------------+
    1 |___3_{                           |
    2 |___4_  return 0;                 |
    3 |___5_}                           |
    4 |                                 |
    5 |                                 |
    6 +---------------------------------+
...

Tested on x86_64-linux.

Suggested-By: Simon Marchi <simon.marchi@efficios.com>
Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Tom de Vries
2023-05-16 17:40:32 +02:00
parent d1792f72bf
commit 68b25a74aa
3 changed files with 39 additions and 21 deletions

View File

@@ -53,22 +53,18 @@ if {![Term::enter_tui]} {
set re_border "\\|" set re_border "\\|"
foreach_with_prefix src_window_size {7 8} { set max_line_nr_in_source_file [llength $src_list]
set src_window_lines [expr $src_window_size - 2] # Ensure there are more lines in the window than in the source file.
set max_line_nr_in_source_file [llength $src_list] set src_window_lines [expr $max_line_nr_in_source_file + 2]
set max_line_nr_in_source_window \ # Account for border size.
[expr $max_line_nr_in_source_file + $src_window_lines - 1] set src_window_size [expr $src_window_lines + 2]
Term::command "wh src $src_window_size"
Term::command "wh src $src_window_size" set re_left_margin "___4_"
if { $max_line_nr_in_source_window == 9 } { Term::check_contents "compact source format" \
set re_left_margin "___4_" "$re_border$re_left_margin$re_line_four *$re_border"
} elseif { $max_line_nr_in_source_window == 10 } {
set re_left_margin "___04_"
} else {
error "unhandled max_line_nr_in_source_window"
}
Term::check_contents "compact source format" \ set re_left_margin "___0*[expr $max_line_nr_in_source_file + 1]_"
"$re_border$re_left_margin$re_line_four *$re_border" Term::check_contents_not "no surplus line number" \
} "$re_border$re_left_margin *$re_border"

View File

@@ -1004,6 +1004,14 @@ namespace eval Term {
gdb_assert {[regexp -- $regexp $contents]} $test_name gdb_assert {[regexp -- $regexp $contents]} $test_name
} }
# As check_contents, but check that the text contents of the terminal does
# not match the regular expression.
proc check_contents_not {test_name regexp} {
dump_screen
set contents [get_all_lines]
gdb_assert {![regexp -- $regexp $contents]} $test_name
}
# Get the region of the screen described by X, Y, WIDTH, # Get the region of the screen described by X, Y, WIDTH,
# and HEIGHT, and separate the lines using SEP. # and HEIGHT, and separate the lines using SEP.
proc get_region { x y width height sep } { proc get_region { x y width height sep } {

View File

@@ -80,7 +80,7 @@ tui_source_window::set_contents (struct gdbarch *arch,
/* Solaris 11+gcc 5.5 has ambiguous overloads of log10, so we /* Solaris 11+gcc 5.5 has ambiguous overloads of log10, so we
cast to double to get the right one. */ cast to double to get the right one. */
int lines_in_file = offsets->size (); int lines_in_file = offsets->size ();
int max_line_nr = lines_in_file + nlines - 1; int max_line_nr = lines_in_file;
int digits_needed = 1 + (int)log10 ((double) max_line_nr); int digits_needed = 1 + (int)log10 ((double) max_line_nr);
int trailing_space = 1; int trailing_space = 1;
m_digits = digits_needed + trailing_space; m_digits = digits_needed + trailing_space;
@@ -100,6 +100,11 @@ tui_source_window::set_contents (struct gdbarch *arch,
text = tui_copy_source_line (&iter, &line_len); text = tui_copy_source_line (&iter, &line_len);
m_max_length = std::max (m_max_length, line_len); m_max_length = std::max (m_max_length, line_len);
} }
else
{
/* Line not in source file. */
cur_line_no = -1;
}
/* Set whether element is the execution point /* Set whether element is the execution point
and whether there is a break point on it. */ and whether there is a break point on it. */
@@ -233,11 +238,20 @@ tui_source_window::display_start_addr (struct gdbarch **gdbarch_p,
void void
tui_source_window::show_line_number (int offset) const tui_source_window::show_line_number (int offset) const
{ {
int lineno = m_content[0].line_or_addr.u.line_no + offset; int lineno = m_content[offset].line_or_addr.u.line_no;
char text[20]; char text[20];
char space = tui_left_margin_verbose ? '_' : ' '; char space = tui_left_margin_verbose ? '_' : ' ';
xsnprintf (text, sizeof (text), if (lineno == -1)
tui_left_margin_verbose ? "%0*d%c" : "%*d%c", m_digits - 1, {
lineno, space); /* Line not in source file, don't show line number. */
for (int i = 0; i <= m_digits; ++i)
text[i] = (i == m_digits) ? '\0' : space;
}
else
{
xsnprintf (text, sizeof (text),
tui_left_margin_verbose ? "%0*d%c" : "%*d%c", m_digits - 1,
lineno, space);
}
waddstr (handle.get (), text); waddstr (handle.get (), text);
} }