Add "usage" text to all TUI command help
[deliverable/binutils-gdb.git] / gdb / tui / tui-source.c
CommitLineData
f377b406 1/* TUI display source window.
f33c6cbf 2
b811d2c2 3 Copyright (C) 1998-2020 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 44tui_source_window::set_contents (struct gdbarch *arch,
9f7540a5 45 const struct symtab_and_line &sal)
c906108c 46{
9f7540a5
TT
47 struct symtab *s = sal.symtab;
48 int line_no = sal.line;
81c82c4b 49
61c33f10
TT
50 if (s == NULL)
51 return false;
52
53 int line_width, nlines;
54
55 line_width = width - TUI_EXECINFO_SIZE - 1;
56 /* Take hilite (window border) into account, when
57 calculating the number of lines. */
1d5d29e7 58 nlines = height - 2;
61c33f10
TT
59
60 std::string srclines;
61 const std::vector<off_t> *offsets;
62 if (!g_source_cache.get_source_lines (s, line_no, line_no + nlines,
63 &srclines)
64 || !g_source_cache.get_line_charpos (s, &offsets))
65 return false;
66
67 int cur_line_no, cur_line;
68 struct tui_locator_window *locator
69 = tui_locator_win_info_ptr ();
70 const char *s_filename = symtab_to_filename_for_display (s);
71
72 title = s_filename;
c906108c 73
61c33f10
TT
74 m_fullname = make_unique_xstrdup (symtab_to_fullname (s));
75
76 cur_line = 0;
432b5c40
TT
77 m_gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s));
78 m_start_line_or_addr.loa = LOA_LINE;
79 cur_line_no = m_start_line_or_addr.u.line_no = line_no;
61c33f10
TT
80
81 int digits = 0;
82 if (compact_source)
83 {
84 /* Solaris 11+gcc 5.5 has ambiguous overloads of log10, so we
85 cast to double to get the right one. */
86 double l = log10 ((double) offsets->size ());
87 digits = 1 + (int) l;
88 }
89
90 const char *iter = srclines.c_str ();
432b5c40 91 m_content.resize (nlines);
61c33f10 92 while (cur_line < nlines)
c906108c 93 {
432b5c40 94 struct tui_source_element *element = &m_content[cur_line];
61c33f10
TT
95
96 std::string text;
97 if (*iter != '\0')
98 text = tui_copy_source_line (&iter, cur_line_no,
432b5c40 99 m_horizontal_offset,
61c33f10
TT
100 line_width, digits);
101
102 /* Set whether element is the execution point
103 and whether there is a break point on it. */
104 element->line_or_addr.loa = LOA_LINE;
105 element->line_or_addr.u.line_no = cur_line_no;
106 element->is_exec_point
107 = (filename_cmp (locator->full_name.c_str (),
108 symtab_to_fullname (s)) == 0
109 && cur_line_no == locator->line_no);
110
432b5c40 111 m_content[cur_line].line = std::move (text);
61c33f10
TT
112
113 cur_line++;
114 cur_line_no++;
c906108c 115 }
61c33f10
TT
116
117 return true;
98427f35 118}
c906108c
SS
119
120
a358af15
AC
121/* Answer whether the source is currently displayed in the source
122 window. */
a38da35d
TT
123bool
124tui_source_window::showing_source_p (const char *fullname) const
c906108c 125{
432b5c40 126 return (!m_content.empty ()
9923f347 127 && (filename_cmp (tui_locator_win_info_ptr ()->full_name.c_str (),
56d397a3 128 fullname) == 0));
98427f35 129}
c906108c
SS
130
131
98427f35 132/* Scroll the source forward or backward vertically. */
c906108c 133void
c3bd716f 134tui_source_window::do_scroll_vertical (int num_to_scroll)
c906108c 135{
432b5c40 136 if (!m_content.empty ())
c906108c 137 {
c906108c 138 struct symtab *s;
52575520 139 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
432b5c40 140 struct gdbarch *arch = m_gdbarch;
c906108c 141
cafb3438 142 if (cursal.symtab == NULL)
9ae6bf64
TT
143 {
144 struct frame_info *fi = get_selected_frame (NULL);
145 s = find_pc_line_symtab (get_frame_pc (fi));
146 arch = get_frame_arch (fi);
147 }
c906108c 148 else
52575520 149 s = cursal.symtab;
c906108c 150
432b5c40 151 int line_no = m_start_line_or_addr.u.line_no + num_to_scroll;
cb44333d
TT
152 const std::vector<off_t> *offsets;
153 if (g_source_cache.get_line_charpos (s, &offsets)
9ae6bf64 154 && line_no > offsets->size ())
432b5c40 155 line_no = m_start_line_or_addr.u.line_no;
9ae6bf64
TT
156 if (line_no <= 0)
157 line_no = 1;
27229e99 158
9ae6bf64 159 cursal.line = line_no;
f5a7c406
AB
160 find_line_pc (cursal.symtab, cursal.line, &cursal.pc);
161 for (struct tui_source_window_base *win_info : tui_source_windows ())
162 win_info->update_source_window_as_is (arch, cursal);
c906108c 163 }
98427f35 164}
b73dd877 165
c2cd8994
TT
166bool
167tui_source_window::location_matches_p (struct bp_location *loc, int line_no)
168{
432b5c40
TT
169 return (m_content[line_no].line_or_addr.loa == LOA_LINE
170 && m_content[line_no].line_or_addr.u.line_no == loc->line_number
c2cd8994 171 && loc->symtab != NULL
7226433c 172 && filename_cmp (m_fullname.get (),
c2cd8994
TT
173 symtab_to_fullname (loc->symtab)) == 0);
174}
a54700c6 175
c9033fe8
TT
176/* See tui-source.h. */
177
178bool
179tui_source_window::line_is_displayed (int line) const
180{
432b5c40 181 if (m_content.size () < SCROLL_THRESHOLD)
cbfa8581
SV
182 return false;
183
432b5c40 184 for (size_t i = 0; i < m_content.size () - SCROLL_THRESHOLD; ++i)
c9033fe8 185 {
432b5c40
TT
186 if (m_content[i].line_or_addr.loa == LOA_LINE
187 && m_content[i].line_or_addr.u.line_no == line)
cbfa8581 188 return true;
c9033fe8
TT
189 }
190
cbfa8581 191 return false;
c9033fe8
TT
192}
193
a54700c6 194void
1ae58f0c 195tui_source_window::maybe_update (struct frame_info *fi, symtab_and_line sal)
a54700c6 196{
1630140d 197 int start_line = (sal.line - ((height - 2) / 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 203
1ae58f0c 204 if (!(source_already_displayed && line_is_displayed (sal.line)))
9f7540a5
TT
205 {
206 sal.line = start_line;
207 update_source_window (get_frame_arch (fi), sal);
208 }
a54700c6
TT
209 else
210 {
9f7540a5
TT
211 struct tui_line_or_address l;
212
213 l.loa = LOA_LINE;
1ae58f0c 214 l.u.line_no = sal.line;
a54700c6
TT
215 set_is_exec_point_at (l);
216 }
217}
432b5c40
TT
218
219void
220tui_source_window::display_start_addr (struct gdbarch **gdbarch_p,
221 CORE_ADDR *addr_p)
222{
223 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
224
225 *gdbarch_p = m_gdbarch;
226 find_line_pc (cursal.symtab, m_start_line_or_addr.u.line_no, addr_p);
227}
This page took 1.967961 seconds and 4 git commands to generate.