Simplify tui_source_window_base::maybe_update method
[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
98427f35
SC
128/* Function to display source in the source window. This function
129 initializes the horizontal scroll to 0. */
c906108c 130void
bb01dbfc
TT
131tui_source_window::show_symtab_source (struct gdbarch *gdbarch,
132 struct symtab *s,
133 struct tui_line_or_address line)
c906108c 134{
bb01dbfc
TT
135 horizontal_offset = 0;
136 update_source_window_as_is (gdbarch, s, line);
98427f35 137}
c906108c 138
c906108c 139
a358af15
AC
140/* Answer whether the source is currently displayed in the source
141 window. */
a38da35d
TT
142bool
143tui_source_window::showing_source_p (const char *fullname) const
c906108c 144{
f6cc34a9 145 return (!content.empty ()
9923f347 146 && (filename_cmp (tui_locator_win_info_ptr ()->full_name.c_str (),
56d397a3 147 fullname) == 0));
98427f35 148}
c906108c
SS
149
150
98427f35 151/* Scroll the source forward or backward vertically. */
c906108c 152void
c3bd716f 153tui_source_window::do_scroll_vertical (int num_to_scroll)
c906108c 154{
53e7cdba 155 if (!content.empty ())
c906108c 156 {
362c05fe 157 struct tui_line_or_address l;
c906108c 158 struct symtab *s;
52575520 159 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
c906108c 160
cafb3438 161 if (cursal.symtab == NULL)
34248c3a 162 s = find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)));
c906108c 163 else
52575520 164 s = cursal.symtab;
c906108c 165
362c05fe 166 l.loa = LOA_LINE;
53e7cdba 167 l.u.line_no = content[0].line_or_addr.u.line_no
c3bd716f 168 + num_to_scroll;
cb44333d
TT
169 const std::vector<off_t> *offsets;
170 if (g_source_cache.get_line_charpos (s, &offsets)
171 && l.u.line_no > offsets->size ())
c3bd716f
TT
172 /* line = s->nlines - win_info->content_size + 1; */
173 /* elz: fix for dts 23398. */
53e7cdba 174 l.u.line_no = content[0].line_or_addr.u.line_no;
c3bd716f
TT
175 if (l.u.line_no <= 0)
176 l.u.line_no = 1;
27229e99 177
362c05fe 178 print_source_lines (s, l.u.line_no, l.u.line_no + 1, 0);
c906108c 179 }
98427f35 180}
b73dd877 181
c2cd8994
TT
182bool
183tui_source_window::location_matches_p (struct bp_location *loc, int line_no)
184{
185 return (content[line_no].line_or_addr.loa == LOA_LINE
186 && content[line_no].line_or_addr.u.line_no == loc->line_number
187 && loc->symtab != NULL
7226433c 188 && filename_cmp (m_fullname.get (),
c2cd8994
TT
189 symtab_to_fullname (loc->symtab)) == 0);
190}
a54700c6 191
c9033fe8
TT
192/* See tui-source.h. */
193
194bool
195tui_source_window::line_is_displayed (int line) const
196{
197 bool is_displayed = false;
198 int threshold = SCROLL_THRESHOLD;
199 int i = 0;
200 while (i < content.size () - threshold && !is_displayed)
201 {
202 is_displayed
203 = (content[i].line_or_addr.loa == LOA_LINE
204 && content[i].line_or_addr.u.line_no == line);
205 i++;
206 }
207
208 return is_displayed;
209}
210
a54700c6 211void
1ae58f0c 212tui_source_window::maybe_update (struct frame_info *fi, symtab_and_line sal)
a54700c6 213{
1ae58f0c 214 int start_line = (sal.line - (viewport_height / 2)) + 1;
a54700c6
TT
215 if (start_line <= 0)
216 start_line = 1;
217
218 bool source_already_displayed = (sal.symtab != 0
7226433c 219 && showing_source_p (m_fullname.get ()));
a54700c6
TT
220
221 struct tui_line_or_address l;
222
223 l.loa = LOA_LINE;
224 l.u.line_no = start_line;
1ae58f0c 225 if (!(source_already_displayed && line_is_displayed (sal.line)))
017f9828 226 update_source_window (get_frame_arch (fi), sal.symtab, l);
a54700c6
TT
227 else
228 {
1ae58f0c 229 l.u.line_no = sal.line;
a54700c6
TT
230 set_is_exec_point_at (l);
231 }
232}
This page took 2.062255 seconds and 4 git commands to generate.