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