Remove tui_source_window::show_symtab_source
[deliverable/binutils-gdb.git] / gdb / tui / tui-source.c
CommitLineData
f377b406 1/* TUI display source window.
f33c6cbf 2
42a4f53d 3 Copyright (C) 1998-2019 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"
6a83354a 40#include "gdb_curses.h"
c906108c 41
98427f35 42/* Function to display source in the source window. */
a358af15 43enum tui_status
81c82c4b
TT
44tui_source_window::set_contents (struct gdbarch *arch,
45 struct symtab *s,
46 struct tui_line_or_address line_or_addr)
c906108c 47{
81c82c4b
TT
48 gdb_assert (line_or_addr.loa == LOA_LINE);
49 int line_no = line_or_addr.u.line_no;
50
22940a24 51 enum tui_status ret = TUI_FAILURE;
c906108c 52
cafb3438 53 if (s != NULL)
c906108c 54 {
62f29fda 55 int line_width, nlines;
c906108c 56
29d2c474 57 ret = TUI_SUCCESS;
398fdd60 58 line_width = width - TUI_EXECINFO_SIZE - 1;
29d2c474
TT
59 /* Take hilite (window border) into account, when
60 calculating the number of lines. */
81c82c4b 61 nlines = (line_no + (height - 2)) - line_no;
29d2c474
TT
62
63 std::string srclines;
d1da6b01 64 const std::vector<off_t> *offsets;
29d2c474 65 if (!g_source_cache.get_source_lines (s, line_no, line_no + nlines,
d1da6b01
TT
66 &srclines)
67 || !g_source_cache.get_line_charpos (s, &offsets))
20149b6b 68 ret = TUI_FAILURE;
29d2c474
TT
69 else
70 {
71 int cur_line_no, cur_line;
3add462f 72 struct tui_locator_window *locator
29d2c474 73 = tui_locator_win_info_ptr ();
29d2c474
TT
74 const char *s_filename = symtab_to_filename_for_display (s);
75
ab0e1f1a 76 title = s_filename;
29d2c474 77
7226433c 78 m_fullname = make_unique_xstrdup (symtab_to_fullname (s));
29d2c474
TT
79
80 cur_line = 0;
81c82c4b
TT
81 gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s));
82 start_line_or_addr.loa = LOA_LINE;
83 cur_line_no = start_line_or_addr.u.line_no = line_no;
29d2c474 84
d1da6b01
TT
85 int digits = 0;
86 if (compact_source)
87 {
1cd4a20a
CB
88 /* Solaris 11+gcc 5.5 has ambiguous overloads of log10, so we
89 cast to double to get the right one. */
90 double l = log10 ((double) offsets->size ());
d1da6b01
TT
91 digits = 1 + (int) l;
92 }
93
29d2c474 94 const char *iter = srclines.c_str ();
81c82c4b 95 content.resize (nlines);
29d2c474 96 while (cur_line < nlines)
c906108c 97 {
53e7cdba 98 struct tui_source_element *element
81c82c4b 99 = &content[cur_line];
29d2c474
TT
100
101 std::string text;
102 if (*iter != '\0')
1df2f9ef
TT
103 text = tui_copy_source_line (&iter, cur_line_no,
104 horizontal_offset,
d1da6b01 105 line_width, digits);
29d2c474
TT
106
107 /* Set whether element is the execution point
108 and whether there is a break point on it. */
53e7cdba
TT
109 element->line_or_addr.loa = LOA_LINE;
110 element->line_or_addr.u.line_no = cur_line_no;
111 element->is_exec_point
9923f347 112 = (filename_cmp (locator->full_name.c_str (),
53e7cdba
TT
113 symtab_to_fullname (s)) == 0
114 && cur_line_no == locator->line_no);
115
5d051055 116 content[cur_line].line = std::move (text);
29d2c474
TT
117
118 cur_line++;
119 cur_line_no++;
c906108c 120 }
29d2c474 121 ret = TUI_SUCCESS;
c906108c
SS
122 }
123 }
124 return ret;
98427f35 125}
c906108c
SS
126
127
a358af15
AC
128/* Answer whether the source is currently displayed in the source
129 window. */
a38da35d
TT
130bool
131tui_source_window::showing_source_p (const char *fullname) const
c906108c 132{
f6cc34a9 133 return (!content.empty ()
9923f347 134 && (filename_cmp (tui_locator_win_info_ptr ()->full_name.c_str (),
56d397a3 135 fullname) == 0));
98427f35 136}
c906108c
SS
137
138
98427f35 139/* Scroll the source forward or backward vertically. */
c906108c 140void
c3bd716f 141tui_source_window::do_scroll_vertical (int num_to_scroll)
c906108c 142{
53e7cdba 143 if (!content.empty ())
c906108c 144 {
362c05fe 145 struct tui_line_or_address l;
c906108c 146 struct symtab *s;
52575520 147 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
c906108c 148
cafb3438 149 if (cursal.symtab == NULL)
34248c3a 150 s = find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)));
c906108c 151 else
52575520 152 s = cursal.symtab;
c906108c 153
362c05fe 154 l.loa = LOA_LINE;
53e7cdba 155 l.u.line_no = content[0].line_or_addr.u.line_no
c3bd716f 156 + num_to_scroll;
cb44333d
TT
157 const std::vector<off_t> *offsets;
158 if (g_source_cache.get_line_charpos (s, &offsets)
159 && l.u.line_no > offsets->size ())
c3bd716f
TT
160 /* line = s->nlines - win_info->content_size + 1; */
161 /* elz: fix for dts 23398. */
53e7cdba 162 l.u.line_no = content[0].line_or_addr.u.line_no;
c3bd716f
TT
163 if (l.u.line_no <= 0)
164 l.u.line_no = 1;
27229e99 165
362c05fe 166 print_source_lines (s, l.u.line_no, l.u.line_no + 1, 0);
c906108c 167 }
98427f35 168}
b73dd877 169
c2cd8994
TT
170bool
171tui_source_window::location_matches_p (struct bp_location *loc, int line_no)
172{
173 return (content[line_no].line_or_addr.loa == LOA_LINE
174 && content[line_no].line_or_addr.u.line_no == loc->line_number
175 && loc->symtab != NULL
7226433c 176 && filename_cmp (m_fullname.get (),
c2cd8994
TT
177 symtab_to_fullname (loc->symtab)) == 0);
178}
a54700c6 179
c9033fe8
TT
180/* See tui-source.h. */
181
182bool
183tui_source_window::line_is_displayed (int line) const
184{
185 bool is_displayed = false;
186 int threshold = SCROLL_THRESHOLD;
187 int i = 0;
188 while (i < content.size () - threshold && !is_displayed)
189 {
190 is_displayed
191 = (content[i].line_or_addr.loa == LOA_LINE
192 && content[i].line_or_addr.u.line_no == line);
193 i++;
194 }
195
196 return is_displayed;
197}
198
a54700c6 199void
1ae58f0c 200tui_source_window::maybe_update (struct frame_info *fi, symtab_and_line sal)
a54700c6 201{
1ae58f0c 202 int start_line = (sal.line - (viewport_height / 2)) + 1;
a54700c6
TT
203 if (start_line <= 0)
204 start_line = 1;
205
206 bool source_already_displayed = (sal.symtab != 0
7226433c 207 && showing_source_p (m_fullname.get ()));
a54700c6
TT
208
209 struct tui_line_or_address l;
210
211 l.loa = LOA_LINE;
212 l.u.line_no = start_line;
1ae58f0c 213 if (!(source_already_displayed && line_is_displayed (sal.line)))
017f9828 214 update_source_window (get_frame_arch (fi), sal.symtab, l);
a54700c6
TT
215 else
216 {
1ae58f0c 217 l.u.line_no = sal.line;
a54700c6
TT
218 set_is_exec_point_at (l);
219 }
220}
This page took 2.574174 seconds and 4 git commands to generate.