Allow using less horizontal space in TUI source window
[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 {
88 double l = log10 (offsets->size ());
89 digits = 1 + (int) l;
90 }
91
29d2c474 92 const char *iter = srclines.c_str ();
81c82c4b 93 content.resize (nlines);
29d2c474 94 while (cur_line < nlines)
c906108c 95 {
53e7cdba 96 struct tui_source_element *element
81c82c4b 97 = &content[cur_line];
29d2c474
TT
98
99 std::string text;
100 if (*iter != '\0')
1df2f9ef
TT
101 text = tui_copy_source_line (&iter, cur_line_no,
102 horizontal_offset,
d1da6b01 103 line_width, digits);
29d2c474
TT
104
105 /* Set whether element is the execution point
106 and whether there is a break point on it. */
53e7cdba
TT
107 element->line_or_addr.loa = LOA_LINE;
108 element->line_or_addr.u.line_no = cur_line_no;
109 element->is_exec_point
9923f347 110 = (filename_cmp (locator->full_name.c_str (),
53e7cdba
TT
111 symtab_to_fullname (s)) == 0
112 && cur_line_no == locator->line_no);
113
5d051055 114 content[cur_line].line = std::move (text);
29d2c474
TT
115
116 cur_line++;
117 cur_line_no++;
c906108c 118 }
29d2c474 119 ret = TUI_SUCCESS;
c906108c
SS
120 }
121 }
122 return ret;
98427f35 123}
c906108c
SS
124
125
98427f35
SC
126/* Function to display source in the source window. This function
127 initializes the horizontal scroll to 0. */
c906108c 128void
bb01dbfc
TT
129tui_source_window::show_symtab_source (struct gdbarch *gdbarch,
130 struct symtab *s,
131 struct tui_line_or_address line)
c906108c 132{
bb01dbfc
TT
133 horizontal_offset = 0;
134 update_source_window_as_is (gdbarch, s, line);
98427f35 135}
c906108c 136
c906108c 137
a358af15
AC
138/* Answer whether the source is currently displayed in the source
139 window. */
a38da35d
TT
140bool
141tui_source_window::showing_source_p (const char *fullname) const
c906108c 142{
f6cc34a9 143 return (!content.empty ()
9923f347 144 && (filename_cmp (tui_locator_win_info_ptr ()->full_name.c_str (),
56d397a3 145 fullname) == 0));
98427f35 146}
c906108c
SS
147
148
98427f35 149/* Scroll the source forward or backward vertically. */
c906108c 150void
c3bd716f 151tui_source_window::do_scroll_vertical (int num_to_scroll)
c906108c 152{
53e7cdba 153 if (!content.empty ())
c906108c 154 {
362c05fe 155 struct tui_line_or_address l;
c906108c 156 struct symtab *s;
52575520 157 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
c906108c 158
cafb3438 159 if (cursal.symtab == NULL)
34248c3a 160 s = find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)));
c906108c 161 else
52575520 162 s = cursal.symtab;
c906108c 163
362c05fe 164 l.loa = LOA_LINE;
53e7cdba 165 l.u.line_no = content[0].line_or_addr.u.line_no
c3bd716f 166 + num_to_scroll;
cb44333d
TT
167 const std::vector<off_t> *offsets;
168 if (g_source_cache.get_line_charpos (s, &offsets)
169 && l.u.line_no > offsets->size ())
c3bd716f
TT
170 /* line = s->nlines - win_info->content_size + 1; */
171 /* elz: fix for dts 23398. */
53e7cdba 172 l.u.line_no = content[0].line_or_addr.u.line_no;
c3bd716f
TT
173 if (l.u.line_no <= 0)
174 l.u.line_no = 1;
27229e99 175
362c05fe 176 print_source_lines (s, l.u.line_no, l.u.line_no + 1, 0);
c906108c 177 }
98427f35 178}
b73dd877 179
c2cd8994
TT
180bool
181tui_source_window::location_matches_p (struct bp_location *loc, int line_no)
182{
183 return (content[line_no].line_or_addr.loa == LOA_LINE
184 && content[line_no].line_or_addr.u.line_no == loc->line_number
185 && loc->symtab != NULL
7226433c 186 && filename_cmp (m_fullname.get (),
c2cd8994
TT
187 symtab_to_fullname (loc->symtab)) == 0);
188}
a54700c6 189
c9033fe8
TT
190/* See tui-source.h. */
191
192bool
193tui_source_window::line_is_displayed (int line) const
194{
195 bool is_displayed = false;
196 int threshold = SCROLL_THRESHOLD;
197 int i = 0;
198 while (i < content.size () - threshold && !is_displayed)
199 {
200 is_displayed
201 = (content[i].line_or_addr.loa == LOA_LINE
202 && content[i].line_or_addr.u.line_no == line);
203 i++;
204 }
205
206 return is_displayed;
207}
208
a54700c6
TT
209void
210tui_source_window::maybe_update (struct frame_info *fi, symtab_and_line sal,
211 int line_no, CORE_ADDR addr)
212{
213 int start_line = (line_no - (viewport_height / 2)) + 1;
214 if (start_line <= 0)
215 start_line = 1;
216
217 bool source_already_displayed = (sal.symtab != 0
7226433c 218 && showing_source_p (m_fullname.get ()));
a54700c6
TT
219
220 struct tui_line_or_address l;
221
222 l.loa = LOA_LINE;
223 l.u.line_no = start_line;
224 if (!(source_already_displayed
c9033fe8 225 && line_is_displayed (line_no)))
017f9828 226 update_source_window (get_frame_arch (fi), sal.symtab, l);
a54700c6
TT
227 else
228 {
229 l.u.line_no = line_no;
230 set_is_exec_point_at (l);
231 }
232}
This page took 2.022984 seconds and 4 git commands to generate.