Automatic Copyright Year update after running gdb/copyright.py
[deliverable/binutils-gdb.git] / gdb / tui / tui-source.c
CommitLineData
f377b406 1/* TUI display source window.
f33c6cbf 2
88b9d363 3 Copyright (C) 1998-2022 Free Software Foundation, Inc.
f33c6cbf 4
f377b406
SC
5 Contributed by Hewlett-Packard Company.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
d1da6b01 23#include <math.h>
c906108c
SS
24#include <ctype.h>
25#include "symtab.h"
26#include "frame.h"
27#include "breakpoint.h"
c2c6d25f 28#include "source.h"
13274fc3 29#include "objfiles.h"
a7417d46 30#include "filenames.h"
62f29fda 31#include "source-cache.h"
c906108c 32
d7b2e967
AC
33#include "tui/tui.h"
34#include "tui/tui-data.h"
62f29fda 35#include "tui/tui-io.h"
d7b2e967 36#include "tui/tui-stack.h"
d1da6b01 37#include "tui/tui-win.h"
d7b2e967
AC
38#include "tui/tui-winsource.h"
39#include "tui/tui-source.h"
f237f998 40#include "tui/tui-location.h"
6a83354a 41#include "gdb_curses.h"
c906108c 42
98427f35 43/* Function to display source in the source window. */
61c33f10 44bool
81c82c4b 45tui_source_window::set_contents (struct gdbarch *arch,
9f7540a5 46 const struct symtab_and_line &sal)
c906108c 47{
9f7540a5
TT
48 struct symtab *s = sal.symtab;
49 int line_no = sal.line;
81c82c4b 50
61c33f10
TT
51 if (s == NULL)
52 return false;
53
61c33f10
TT
54 /* Take hilite (window border) into account, when
55 calculating the number of lines. */
9e820dec 56 int nlines = height - 2;
61c33f10
TT
57
58 std::string srclines;
59 const std::vector<off_t> *offsets;
60 if (!g_source_cache.get_source_lines (s, line_no, line_no + nlines,
61 &srclines)
62 || !g_source_cache.get_line_charpos (s, &offsets))
63 return false;
64
65 int cur_line_no, cur_line;
61c33f10
TT
66 const char *s_filename = symtab_to_filename_for_display (s);
67
68 title = s_filename;
c906108c 69
61c33f10
TT
70 m_fullname = make_unique_xstrdup (symtab_to_fullname (s));
71
72 cur_line = 0;
08feed99 73 m_gdbarch = SYMTAB_OBJFILE (s)->arch ();
432b5c40
TT
74 m_start_line_or_addr.loa = LOA_LINE;
75 cur_line_no = m_start_line_or_addr.u.line_no = line_no;
61c33f10 76
9e820dec 77 m_digits = 7;
61c33f10
TT
78 if (compact_source)
79 {
80 /* Solaris 11+gcc 5.5 has ambiguous overloads of log10, so we
81 cast to double to get the right one. */
82 double l = log10 ((double) offsets->size ());
9e820dec 83 m_digits = 1 + (int) l;
61c33f10
TT
84 }
85
9e820dec 86 m_max_length = -1;
61c33f10 87 const char *iter = srclines.c_str ();
432b5c40 88 m_content.resize (nlines);
61c33f10 89 while (cur_line < nlines)
c906108c 90 {
432b5c40 91 struct tui_source_element *element = &m_content[cur_line];
61c33f10
TT
92
93 std::string text;
94 if (*iter != '\0')
9e820dec
TT
95 {
96 int line_len;
97 text = tui_copy_source_line (&iter, &line_len);
98 m_max_length = std::max (m_max_length, line_len);
99 }
61c33f10
TT
100
101 /* Set whether element is the execution point
102 and whether there is a break point on it. */
103 element->line_or_addr.loa = LOA_LINE;
104 element->line_or_addr.u.line_no = cur_line_no;
105 element->is_exec_point
f237f998 106 = (filename_cmp (tui_location.full_name ().c_str (),
61c33f10 107 symtab_to_fullname (s)) == 0
f237f998 108 && cur_line_no == tui_location.line_no ());
61c33f10 109
432b5c40 110 m_content[cur_line].line = std::move (text);
61c33f10
TT
111
112 cur_line++;
113 cur_line_no++;
c906108c 114 }
61c33f10
TT
115
116 return true;
98427f35 117}
c906108c
SS
118
119
a358af15
AC
120/* Answer whether the source is currently displayed in the source
121 window. */
a38da35d
TT
122bool
123tui_source_window::showing_source_p (const char *fullname) const
c906108c 124{
432b5c40 125 return (!m_content.empty ()
f237f998 126 && (filename_cmp (tui_location.full_name ().c_str (),
56d397a3 127 fullname) == 0));
98427f35 128}
c906108c
SS
129
130
98427f35 131/* Scroll the source forward or backward vertically. */
c906108c 132void
c3bd716f 133tui_source_window::do_scroll_vertical (int num_to_scroll)
c906108c 134{
432b5c40 135 if (!m_content.empty ())
c906108c 136 {
c906108c 137 struct symtab *s;
52575520 138 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
432b5c40 139 struct gdbarch *arch = m_gdbarch;
c906108c 140
cafb3438 141 if (cursal.symtab == NULL)
9ae6bf64
TT
142 {
143 struct frame_info *fi = get_selected_frame (NULL);
144 s = find_pc_line_symtab (get_frame_pc (fi));
145 arch = get_frame_arch (fi);
146 }
c906108c 147 else
52575520 148 s = cursal.symtab;
c906108c 149
432b5c40 150 int line_no = m_start_line_or_addr.u.line_no + num_to_scroll;
cb44333d
TT
151 const std::vector<off_t> *offsets;
152 if (g_source_cache.get_line_charpos (s, &offsets)
9ae6bf64 153 && line_no > offsets->size ())
432b5c40 154 line_no = m_start_line_or_addr.u.line_no;
9ae6bf64
TT
155 if (line_no <= 0)
156 line_no = 1;
27229e99 157
9ae6bf64 158 cursal.line = line_no;
f5a7c406
AB
159 find_line_pc (cursal.symtab, cursal.line, &cursal.pc);
160 for (struct tui_source_window_base *win_info : tui_source_windows ())
161 win_info->update_source_window_as_is (arch, cursal);
c906108c 162 }
98427f35 163}
b73dd877 164
c2cd8994
TT
165bool
166tui_source_window::location_matches_p (struct bp_location *loc, int line_no)
167{
432b5c40
TT
168 return (m_content[line_no].line_or_addr.loa == LOA_LINE
169 && m_content[line_no].line_or_addr.u.line_no == loc->line_number
c2cd8994 170 && loc->symtab != NULL
7226433c 171 && filename_cmp (m_fullname.get (),
c2cd8994
TT
172 symtab_to_fullname (loc->symtab)) == 0);
173}
a54700c6 174
c9033fe8
TT
175/* See tui-source.h. */
176
177bool
178tui_source_window::line_is_displayed (int line) const
179{
432b5c40 180 if (m_content.size () < SCROLL_THRESHOLD)
cbfa8581
SV
181 return false;
182
432b5c40 183 for (size_t i = 0; i < m_content.size () - SCROLL_THRESHOLD; ++i)
c9033fe8 184 {
432b5c40
TT
185 if (m_content[i].line_or_addr.loa == LOA_LINE
186 && m_content[i].line_or_addr.u.line_no == line)
cbfa8581 187 return true;
c9033fe8
TT
188 }
189
cbfa8581 190 return false;
c9033fe8
TT
191}
192
a54700c6 193void
1ae58f0c 194tui_source_window::maybe_update (struct frame_info *fi, symtab_and_line sal)
a54700c6 195{
1630140d 196 int start_line = (sal.line - ((height - 2) / 2)) + 1;
a54700c6
TT
197 if (start_line <= 0)
198 start_line = 1;
199
200 bool source_already_displayed = (sal.symtab != 0
7226433c 201 && showing_source_p (m_fullname.get ()));
a54700c6 202
1ae58f0c 203 if (!(source_already_displayed && line_is_displayed (sal.line)))
9f7540a5
TT
204 {
205 sal.line = start_line;
206 update_source_window (get_frame_arch (fi), sal);
207 }
a54700c6
TT
208 else
209 {
9f7540a5
TT
210 struct tui_line_or_address l;
211
212 l.loa = LOA_LINE;
1ae58f0c 213 l.u.line_no = sal.line;
a54700c6
TT
214 set_is_exec_point_at (l);
215 }
216}
432b5c40
TT
217
218void
219tui_source_window::display_start_addr (struct gdbarch **gdbarch_p,
220 CORE_ADDR *addr_p)
221{
222 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
223
224 *gdbarch_p = m_gdbarch;
225 find_line_pc (cursal.symtab, m_start_line_or_addr.u.line_no, addr_p);
226}
9e820dec
TT
227
228/* See tui-winsource.h. */
229
230void
231tui_source_window::show_line_number (int offset) const
232{
233 int lineno = m_content[0].line_or_addr.u.line_no + offset;
234 char text[20];
1b6d4bb2
HD
235 /* To completely overwrite the previous border when the source window height
236 is increased, both spaces after the line number have to be redrawn. */
237 xsnprintf (text, sizeof (text), "%*d ", m_digits - 1, lineno);
9e820dec
TT
238 waddstr (handle.get (), text);
239}
This page took 2.521323 seconds and 4 git commands to generate.