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