diff options
Diffstat (limited to 'gdb/source.c')
-rw-r--r-- | gdb/source.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/gdb/source.c b/gdb/source.c index 0fd370b..99dffa8 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -774,9 +774,9 @@ prepare_path_for_appending (const char *path) If FILENAME_OPENED is non-null, set it to a newly allocated string naming the actual file opened (this string will always start with a "/"). We - have to take special pains to avoid doubling the "/" between the directory - and the file, sigh! Emacs gets confuzzed by this when we print the - source file name!!! + have to ensure that we avoid doubling the "/" between the directory and the + file, because Emacs has special treatment of double slashes. + See "(emacs) Minibuffer File". If OPTS has OPF_RETURN_REALPATH set return FILENAME_OPENED resolved by gdb_realpath. Even without OPF_RETURN_REALPATH this function still returns @@ -1312,14 +1312,12 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int nlines = stopline - line; struct ui_out *uiout = current_uiout; - /* Regardless of whether we can open the file, set current_source_symtab. */ + /* Regardless of whether we can open the file, we'll want to set + current_source_symtab, but not if throw an error, or return without + printing any source lines. */ current_source_location *loc = get_source_location (current_program_space); - loc->set (s, line); - first_line_listed = line; - last_line_listed = line; - /* If printing of source lines is disabled, just print file and line number. */ if (uiout->test_flags (ui_source_list) && source_open) @@ -1380,6 +1378,10 @@ print_source_lines_base (struct symtab *s, int line, int stopline, uiout->text ("\n"); } + loc->set (s, line); + first_line_listed = line; + last_line_listed = line; + return; } @@ -1399,12 +1401,9 @@ print_source_lines_base (struct symtab *s, int line, int stopline, } const char *iter = lines.c_str (); - int new_lineno = loc->line (); - while (nlines-- > 0 && *iter != '\0') + int new_lineno = line; + for (; nlines-- > 0 && *iter != '\0'; ++new_lineno) { - char buf[20]; - - last_line_listed = loc->line (); if (flags & PRINT_SOURCE_LINES_FILENAME) { uiout->message ("%ps", @@ -1415,7 +1414,6 @@ print_source_lines_base (struct symtab *s, int line, int stopline, uiout->message ("%ps\t", styled_string (line_number_style.style (), pulongest (new_lineno))); - ++new_lineno; while (*iter != '\0') { @@ -1457,6 +1455,8 @@ print_source_lines_base (struct symtab *s, int line, int stopline, } else if (*iter > 0 && *iter < 040) { + char buf[20]; + xsnprintf (buf, sizeof (buf), "^%c", *iter + 0100); uiout->text (buf); ++iter; @@ -1470,7 +1470,11 @@ print_source_lines_base (struct symtab *s, int line, int stopline, uiout->text ("\n"); } - loc->set (loc->symtab (), new_lineno); + /* As NEW_LINENO was incremented after displaying the last source line, + the last line shown was the one before NEW_LINENO. */ + first_line_listed = line; + last_line_listed = new_lineno - 1; + loc->set (s, new_lineno); } |