Remove tui_set_win_height
[deliverable/binutils-gdb.git] / gdb / tui / tui-winsource.c
CommitLineData
f377b406 1/* TUI display source/assembly 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"
fd0407d6 27#include "value.h"
52575520 28#include "source.h"
13274fc3 29#include "objfiles.h"
a7417d46 30#include "filenames.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-win.h"
37#include "tui/tui-wingeneral.h"
38#include "tui/tui-winsource.h"
39#include "tui/tui-source.h"
40#include "tui/tui-disasm.h"
6a83354a 41#include "gdb_curses.h"
c906108c 42
1f393769 43/* Function to display the "main" routine. */
c906108c 44void
b4eb2452 45tui_display_main ()
c906108c 46{
b4eb2452 47 if (!tui_source_windows ().empty ())
c906108c 48 {
13274fc3 49 struct gdbarch *gdbarch;
c906108c
SS
50 CORE_ADDR addr;
51
13274fc3 52 tui_get_begin_asm_address (&gdbarch, &addr);
c774cec6 53 if (addr != (CORE_ADDR) 0)
c906108c 54 {
34248c3a 55 struct symtab *s;
c906108c 56
13274fc3 57 tui_update_source_windows_with_addr (gdbarch, addr);
34248c3a
DE
58 s = find_pc_line_symtab (addr);
59 if (s != NULL)
60 tui_update_locator_fullname (symtab_to_fullname (s));
2e17b763 61 else
56d397a3 62 tui_update_locator_fullname ("??");
c906108c
SS
63 }
64 }
2e17b763 65}
c906108c
SS
66
67
68
f80bda8e
AC
69/* Function to display source in the source window. This function
70 initializes the horizontal scroll to 0. */
c906108c 71void
be4da588 72tui_update_source_window (struct tui_source_window_base *win_info,
13274fc3 73 struct gdbarch *gdbarch,
08ef48c5
MS
74 struct symtab *s,
75 struct tui_line_or_address line_or_addr,
76 int noerror)
c906108c 77{
be4da588 78 win_info->horizontal_offset = 0;
13274fc3 79 tui_update_source_window_as_is (win_info, gdbarch, s, line_or_addr, noerror);
c906108c
SS
80
81 return;
f80bda8e 82}
c906108c
SS
83
84
f80bda8e
AC
85/* Function to display source in the source/asm window. This function
86 shows the source as specified by the horizontal offset. */
c906108c 87void
be4da588 88tui_update_source_window_as_is (struct tui_source_window_base *win_info,
13274fc3 89 struct gdbarch *gdbarch,
08ef48c5
MS
90 struct symtab *s,
91 struct tui_line_or_address line_or_addr,
92 int noerror)
c906108c 93{
22940a24 94 enum tui_status ret;
c906108c 95
cb2ce893 96 if (win_info->type == SRC_WIN)
5813316f
TT
97 ret = tui_set_source_content (win_info, s, line_or_addr.u.line_no,
98 noerror);
c906108c 99 else
13274fc3 100 ret = tui_set_disassem_content (gdbarch, line_or_addr.u.addr);
c906108c
SS
101
102 if (ret == TUI_FAILURE)
103 {
6d012f14
AC
104 tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT);
105 tui_clear_exec_info_content (win_info);
c906108c
SS
106 }
107 else
108 {
0807ab7b 109 tui_update_breakpoint_info (win_info, nullptr, false);
6d012f14
AC
110 tui_show_source_content (win_info);
111 tui_update_exec_info (win_info);
cb2ce893 112 if (win_info->type == SRC_WIN)
c906108c 113 {
51abb421
PA
114 symtab_and_line sal;
115
362c05fe 116 sal.line = line_or_addr.u.line_no +
53e7cdba 117 (win_info->content.size () - 2);
52575520 118 sal.symtab = s;
eb822aa6 119 sal.pspace = SYMTAB_PSPACE (s);
51abb421 120 set_current_source_symtab_and_line (sal);
ef5eab5a
MS
121 /* If the focus was in the asm win, put it in the src win if
122 we don't have a split layout. */
e5908723
MS
123 if (tui_win_with_focus () == TUI_DISASM_WIN
124 && tui_current_layout () != SRC_DISASSEM_COMMAND)
5813316f 125 tui_set_win_focus_to (win_info);
c906108c
SS
126 }
127 }
128
129
130 return;
f80bda8e 131}
c906108c
SS
132
133
f80bda8e
AC
134/* Function to ensure that the source and/or disassemly windows
135 reflect the input address. */
c906108c 136void
13274fc3 137tui_update_source_windows_with_addr (struct gdbarch *gdbarch, CORE_ADDR addr)
c906108c 138{
c774cec6 139 if (addr != 0)
c906108c
SS
140 {
141 struct symtab_and_line sal;
362c05fe 142 struct tui_line_or_address l;
a4b99e53 143
dd1abb8c 144 switch (tui_current_layout ())
c906108c
SS
145 {
146 case DISASSEM_COMMAND:
147 case DISASSEM_DATA_COMMAND:
13274fc3 148 tui_show_disassem (gdbarch, addr);
c906108c
SS
149 break;
150 case SRC_DISASSEM_COMMAND:
13274fc3 151 tui_show_disassem_and_update_source (gdbarch, addr);
c906108c
SS
152 break;
153 default:
c774cec6 154 sal = find_pc_line (addr, 0);
362c05fe
AS
155 l.loa = LOA_LINE;
156 l.u.line_no = sal.line;
5813316f 157 tui_show_symtab_source (TUI_SRC_WIN, gdbarch, sal.symtab, l, FALSE);
c906108c
SS
158 break;
159 }
160 }
161 else
162 {
ad54d15b 163 for (struct tui_source_window_base *win_info : tui_source_windows ())
c906108c 164 {
6d012f14
AC
165 tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT);
166 tui_clear_exec_info_content (win_info);
c906108c
SS
167 }
168 }
6ba8e26f 169}
c906108c 170
f80bda8e
AC
171/* Function to ensure that the source and/or disassemly windows
172 reflect the input address. */
c906108c 173void
f80bda8e 174tui_update_source_windows_with_line (struct symtab *s, int line)
c906108c 175{
13274fc3 176 struct gdbarch *gdbarch;
84b1e7c7 177 CORE_ADDR pc;
362c05fe 178 struct tui_line_or_address l;
13274fc3
UW
179
180 if (!s)
181 return;
182
eb822aa6 183 gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s));
13274fc3 184
dd1abb8c 185 switch (tui_current_layout ())
c906108c
SS
186 {
187 case DISASSEM_COMMAND:
188 case DISASSEM_DATA_COMMAND:
84b1e7c7 189 find_line_pc (s, line, &pc);
13274fc3 190 tui_update_source_windows_with_addr (gdbarch, pc);
c906108c
SS
191 break;
192 default:
362c05fe
AS
193 l.loa = LOA_LINE;
194 l.u.line_no = line;
5813316f 195 tui_show_symtab_source (TUI_SRC_WIN, gdbarch, s, l, FALSE);
dd1abb8c 196 if (tui_current_layout () == SRC_DISASSEM_COMMAND)
84b1e7c7
SC
197 {
198 find_line_pc (s, line, &pc);
13274fc3 199 tui_show_disassem (gdbarch, pc);
84b1e7c7 200 }
c906108c
SS
201 break;
202 }
203
204 return;
f80bda8e 205}
c906108c 206
c906108c 207void
7908abbf 208tui_clear_source_content (struct tui_source_window_base *win_info,
08ef48c5 209 int display_prompt)
c906108c 210{
6d012f14 211 if (win_info != NULL)
c906108c 212 {
d02c80cd 213 int i;
c906108c 214
cb2ce893 215 win_info->content_in_use = FALSE;
6ba8e26f 216 tui_erase_source_content (win_info, display_prompt);
53e7cdba 217 for (i = 0; i < win_info->content.size (); i++)
c906108c 218 {
53e7cdba 219 struct tui_source_element *element = &win_info->content[i];
1c5313c5 220
0598af48 221 element->break_mode = 0;
53e7cdba 222 element->is_exec_point = false;
c906108c
SS
223 }
224 }
6ba8e26f 225}
c906108c
SS
226
227
c906108c 228void
7908abbf 229tui_erase_source_content (struct tui_source_window_base *win_info,
08ef48c5 230 int display_prompt)
c906108c 231{
6ba8e26f 232 int x_pos;
cb2ce893 233 int half_width = (win_info->width - 2) / 2;
c906108c 234
cb2ce893 235 if (win_info->handle != NULL)
c906108c 236 {
cb2ce893 237 werase (win_info->handle);
6d012f14 238 tui_check_and_display_highlight_if_needed (win_info);
6ba8e26f 239 if (display_prompt == EMPTY_SOURCE_PROMPT)
c906108c 240 {
a121b7c1 241 const char *no_src_str;
c906108c 242
cb2ce893 243 if (win_info->type == SRC_WIN)
6ba8e26f 244 no_src_str = NO_SRC_STRING;
c906108c 245 else
6ba8e26f
AC
246 no_src_str = NO_DISASSEM_STRING;
247 if (strlen (no_src_str) >= half_width)
248 x_pos = 1;
c906108c 249 else
6ba8e26f 250 x_pos = half_width - strlen (no_src_str);
cb2ce893
TT
251 mvwaddstr (win_info->handle,
252 (win_info->height / 2),
6ba8e26f 253 x_pos,
7a6e7fcc 254 (char *) no_src_str);
c906108c 255
1cc6d956
MS
256 /* elz: Added this function call to set the real contents of
257 the window to what is on the screen, so that later calls
258 to refresh, do display the correct stuff, and not the old
259 image. */
c906108c 260
6ba8e26f 261 tui_set_source_content_nil (win_info, no_src_str);
c906108c 262 }
5b81daba 263 win_info->refresh_window ();
c906108c 264 }
6ba8e26f 265}
c906108c
SS
266
267
bc712bbf
SC
268/* Redraw the complete line of a source or disassembly window. */
269static void
53e7cdba 270tui_show_source_line (struct tui_source_window_base *win_info, int lineno)
bc712bbf 271{
53e7cdba 272 struct tui_source_element *line;
798e1c30 273 int x;
bc712bbf 274
53e7cdba
TT
275 line = &win_info->content[lineno - 1];
276 if (line->is_exec_point)
cb2ce893 277 tui_set_reverse_mode (win_info->handle, true);
bc712bbf 278
cb2ce893 279 wmove (win_info->handle, lineno, 1);
53e7cdba 280 tui_puts (line->line,
cb2ce893 281 win_info->handle);
53e7cdba 282 if (line->is_exec_point)
cb2ce893 283 tui_set_reverse_mode (win_info->handle, false);
bc712bbf
SC
284
285 /* Clear to end of line but stop before the border. */
cb2ce893
TT
286 x = getcurx (win_info->handle);
287 while (x + 1 < win_info->width)
798e1c30 288 {
cb2ce893
TT
289 waddch (win_info->handle, ' ');
290 x = getcurx (win_info->handle);
798e1c30 291 }
bc712bbf
SC
292}
293
c906108c 294void
7908abbf 295tui_show_source_content (struct tui_source_window_base *win_info)
c906108c 296{
53e7cdba 297 if (!win_info->content.empty ())
c906108c 298 {
bc712bbf
SC
299 int lineno;
300
53e7cdba 301 for (lineno = 1; lineno <= win_info->content.size (); lineno++)
6d012f14 302 tui_show_source_line (win_info, lineno);
c906108c 303 }
bc712bbf 304 else
6d012f14 305 tui_erase_source_content (win_info, TRUE);
bc712bbf 306
6d012f14 307 tui_check_and_display_highlight_if_needed (win_info);
5b81daba 308 win_info->refresh_window ();
cb2ce893 309 win_info->content_in_use = TRUE;
bc712bbf 310}
c906108c 311
ad54d15b 312/* See tui-data.h. */
6f11e682
TT
313
314void
ad54d15b 315tui_source_window_base::refill ()
6f11e682
TT
316{
317 symtab *s = nullptr;
318
cb2ce893 319 if (type == SRC_WIN)
6f11e682
TT
320 {
321 symtab_and_line cursal = get_current_source_symtab_and_line ();
322 s = (cursal.symtab == NULL
323 ? find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)))
324 : cursal.symtab);
325 }
326
ad54d15b 327 tui_update_source_window_as_is (this, gdbarch, s,
53e7cdba 328 content[0].line_or_addr,
6f11e682
TT
329 FALSE);
330}
c906108c 331
f80bda8e 332/* Scroll the source forward or backward horizontally. */
6f11e682 333
c906108c 334void
c3bd716f 335tui_source_window_base::do_scroll_horizontal (int num_to_scroll)
c906108c 336{
53e7cdba 337 if (!content.empty ())
c906108c 338 {
c3bd716f
TT
339 int offset = horizontal_offset + num_to_scroll;
340 if (offset < 0)
341 offset = 0;
e6e41501 342 horizontal_offset = offset;
ad54d15b 343 refill ();
c906108c 344 }
6ba8e26f 345}
c906108c
SS
346
347
0598af48 348/* Set or clear the is_exec_point flag in the line whose line is
1cc6d956
MS
349 line_no. */
350
c906108c 351void
ad54d15b 352tui_source_window_base::set_is_exec_point_at (struct tui_line_or_address l)
c906108c 353{
02c28df0 354 bool changed = false;
c906108c 355 int i;
c906108c
SS
356
357 i = 0;
53e7cdba 358 while (i < content.size ())
c906108c 359 {
02c28df0 360 bool new_state;
362c05fe 361 struct tui_line_or_address content_loa =
53e7cdba 362 content[i].line_or_addr;
362c05fe
AS
363
364 gdb_assert (l.loa == LOA_ADDRESS || l.loa == LOA_LINE);
365 gdb_assert (content_loa.loa == LOA_LINE
366 || content_loa.loa == LOA_ADDRESS);
367 if (content_loa.loa == l.loa
368 && ((l.loa == LOA_LINE && content_loa.u.line_no == l.u.line_no)
f7952c57 369 || (l.loa == LOA_ADDRESS && content_loa.u.addr == l.u.addr)))
02c28df0 370 new_state = true;
c906108c 371 else
02c28df0 372 new_state = false;
53e7cdba 373 if (new_state != content[i].is_exec_point)
00b90ae2 374 {
02c28df0 375 changed = true;
53e7cdba 376 content[i].is_exec_point = new_state;
ad54d15b 377 tui_show_source_line (this, i + 1);
00b90ae2 378 }
c906108c
SS
379 i++;
380 }
00b90ae2 381 if (changed)
ad54d15b 382 refill ();
00b90ae2 383}
c906108c 384
0807ab7b
TT
385/* See tui-winsource.h. */
386
c906108c 387void
0807ab7b 388tui_update_all_breakpoint_info (struct breakpoint *being_deleted)
c906108c 389{
ad54d15b 390 for (tui_source_window_base *win : tui_source_windows ())
c906108c 391 {
0807ab7b 392 if (tui_update_breakpoint_info (win, being_deleted, false))
00b2bad4 393 {
f80bda8e 394 tui_update_exec_info (win);
00b2bad4 395 }
c906108c 396 }
00b2bad4 397}
c906108c
SS
398
399
0807ab7b 400/* Scan the source window and the breakpoints to update the break_mode
1cc6d956
MS
401 information for each line.
402
0807ab7b 403 Returns true if something changed and the execution window must be
1cc6d956
MS
404 refreshed. */
405
0807ab7b
TT
406bool
407tui_update_breakpoint_info (struct tui_source_window_base *win,
408 struct breakpoint *being_deleted,
409 bool current_only)
c906108c
SS
410{
411 int i;
0807ab7b 412 bool need_refresh = false;
e6e41501 413 tui_source_window_base *src = (tui_source_window_base *) win;
c906108c 414
53e7cdba 415 for (i = 0; i < win->content.size (); i++)
00b2bad4
SC
416 {
417 struct breakpoint *bp;
418 extern struct breakpoint *breakpoint_chain;
5b6fe301 419 struct tui_source_element *line;
00b2bad4 420
53e7cdba 421 line = &win->content[i];
6d012f14 422 if (current_only && !line->is_exec_point)
00b2bad4
SC
423 continue;
424
425 /* Scan each breakpoint to see if the current line has something to
426 do with it. Identify enable/disabled breakpoints as well as
427 those that we already hit. */
0598af48 428 tui_bp_flags mode = 0;
00b2bad4 429 for (bp = breakpoint_chain;
cafb3438 430 bp != NULL;
00b2bad4
SC
431 bp = bp->next)
432 {
f8eba3c6
TT
433 struct bp_location *loc;
434
362c05fe
AS
435 gdb_assert (line->line_or_addr.loa == LOA_LINE
436 || line->line_or_addr.loa == LOA_ADDRESS);
f8eba3c6 437
0807ab7b
TT
438 if (bp == being_deleted)
439 continue;
440
f8eba3c6
TT
441 for (loc = bp->loc; loc != NULL; loc = loc->next)
442 {
443 if ((win == TUI_SRC_WIN
2f202fde 444 && loc->symtab != NULL
aa079c93
JK
445 && filename_cmp (src->fullname,
446 symtab_to_fullname (loc->symtab)) == 0
f8eba3c6
TT
447 && line->line_or_addr.loa == LOA_LINE
448 && loc->line_number == line->line_or_addr.u.line_no)
449 || (win == TUI_DISASM_WIN
450 && line->line_or_addr.loa == LOA_ADDRESS
451 && loc->address == line->line_or_addr.u.addr))
452 {
453 if (bp->enable_state == bp_disabled)
454 mode |= TUI_BP_DISABLED;
455 else
456 mode |= TUI_BP_ENABLED;
457 if (bp->hit_count)
458 mode |= TUI_BP_HIT;
459 if (bp->loc->cond)
460 mode |= TUI_BP_CONDITIONAL;
461 if (bp->type == bp_hardware_breakpoint)
462 mode |= TUI_BP_HARDWARE;
463 }
464 }
00b2bad4 465 }
0598af48 466 if (line->break_mode != mode)
00b2bad4 467 {
0598af48
TT
468 line->break_mode = mode;
469 need_refresh = true;
00b2bad4
SC
470 }
471 }
472 return need_refresh;
473}
c906108c 474
489e9d8b
TT
475/* See tui-data.h. */
476
477tui_exec_info_content *
478tui_exec_info_window::maybe_allocate_content (int n_elements)
479{
480 if (m_content == nullptr)
481 m_content = XNEWVEC (tui_exec_info_content, n_elements);
482 return m_content;
483}
484
c906108c 485
6ba8e26f
AC
486/* Function to initialize the content of the execution info window,
487 based upon the input window which is either the source or
488 disassembly window. */
73fbdc65 489void
21c32dca 490tui_set_exec_info_content (struct tui_source_window_base *win_info)
c906108c 491{
21c32dca 492 if (win_info->execution_info != NULL)
c906108c 493 {
489e9d8b
TT
494 tui_exec_info_content *content
495 = win_info->execution_info->maybe_allocate_content (win_info->height);
c906108c 496
0807ab7b 497 tui_update_breakpoint_info (win_info, nullptr, true);
53e7cdba 498 for (int i = 0; i < win_info->content.size (); i++)
33325343 499 {
489e9d8b 500 tui_exec_info_content &element = content[i];
53e7cdba 501 struct tui_source_element *src_element;
0598af48 502 tui_bp_flags mode;
33325343 503
53e7cdba 504 src_element = &win_info->content[i];
33325343 505
489e9d8b
TT
506 memset (element, ' ', sizeof (tui_exec_info_content));
507 element[TUI_EXECINFO_SIZE - 1] = 0;
33325343
TT
508
509 /* Now update the exec info content based upon the state
510 of each line as indicated by the source content. */
0598af48 511 mode = src_element->break_mode;
33325343 512 if (mode & TUI_BP_HIT)
489e9d8b 513 element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
33325343 514 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
489e9d8b 515 element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
33325343
TT
516
517 if (mode & TUI_BP_ENABLED)
489e9d8b 518 element[TUI_BP_BREAK_POS] = '+';
33325343 519 else if (mode & TUI_BP_DISABLED)
489e9d8b 520 element[TUI_BP_BREAK_POS] = '-';
33325343 521
53e7cdba 522 if (src_element->is_exec_point)
489e9d8b 523 element[TUI_EXEC_POS] = '>';
c906108c 524 }
c906108c 525 }
00b2bad4 526}
c906108c
SS
527
528
c906108c 529void
21c32dca 530tui_show_exec_info_content (struct tui_source_window_base *win_info)
c906108c 531{
489e9d8b
TT
532 struct tui_exec_info_window *exec_info = win_info->execution_info;
533 const tui_exec_info_content *content = exec_info->get_content ();
6ba8e26f
AC
534
535 werase (exec_info->handle);
5b81daba 536 exec_info->refresh_window ();
53e7cdba 537 for (int cur_line = 1; cur_line <= win_info->content.size (); cur_line++)
6ba8e26f
AC
538 mvwaddstr (exec_info->handle,
539 cur_line,
c906108c 540 0,
489e9d8b 541 content[cur_line - 1]);
5b81daba 542 exec_info->refresh_window ();
6ba8e26f 543 exec_info->content_in_use = TRUE;
f80bda8e 544}
c906108c
SS
545
546
c906108c 547void
21c32dca 548tui_erase_exec_info_content (struct tui_source_window_base *win_info)
c906108c 549{
21c32dca 550 struct tui_gen_win_info *exec_info = win_info->execution_info;
c906108c 551
6ba8e26f 552 werase (exec_info->handle);
5b81daba 553 exec_info->refresh_window ();
f80bda8e 554}
c906108c 555
c906108c 556void
21c32dca 557tui_clear_exec_info_content (struct tui_source_window_base *win_info)
c906108c 558{
21c32dca 559 win_info->execution_info->content_in_use = FALSE;
6d012f14 560 tui_erase_exec_info_content (win_info);
f80bda8e 561}
c906108c 562
f80bda8e 563/* Function to update the execution info window. */
c906108c 564void
21c32dca 565tui_update_exec_info (struct tui_source_window_base *win_info)
c906108c 566{
6ba8e26f
AC
567 tui_set_exec_info_content (win_info);
568 tui_show_exec_info_content (win_info);
569}
c906108c 570
29d2c474 571void
53e7cdba 572tui_alloc_source_buffer (struct tui_source_window_base *win_info)
c906108c 573{
d02c80cd 574 int i, line_width, max_lines;
c906108c 575
7bc2c8b8
AA
576 /* The window width/height includes the highlight box. Determine actual
577 content dimensions, including string null-terminators. */
cb2ce893
TT
578 max_lines = win_info->height - 2;
579 line_width = win_info->width - 2 + 1;
7bc2c8b8 580
62f29fda 581 /* Allocate the buffer for the source lines. */
53e7cdba
TT
582 win_info->content.resize (max_lines);
583 for (i = 0; i < max_lines; i++)
c906108c 584 {
53e7cdba
TT
585 if (win_info->content[i].line == nullptr)
586 win_info->content[i].line = (char *) xmalloc (line_width);
c906108c 587 }
6ba8e26f 588}
c906108c
SS
589
590
766062f6 591/* Answer whether a particular line number or address is displayed
f80bda8e 592 in the current source window. */
c906108c 593int
08ef48c5 594tui_line_is_displayed (int line,
53e7cdba 595 struct tui_source_window_base *win_info,
6ba8e26f 596 int check_threshold)
c906108c 597{
6ba8e26f 598 int is_displayed = FALSE;
c906108c
SS
599 int i, threshold;
600
6ba8e26f 601 if (check_threshold)
c906108c
SS
602 threshold = SCROLL_THRESHOLD;
603 else
604 threshold = 0;
605 i = 0;
53e7cdba 606 while (i < win_info->content.size () - threshold
e5908723 607 && !is_displayed)
c906108c 608 {
63ed8182 609 is_displayed
53e7cdba
TT
610 = win_info->content[i].line_or_addr.loa == LOA_LINE
611 && win_info->content[i].line_or_addr.u.line_no == line;
c906108c
SS
612 i++;
613 }
614
6ba8e26f 615 return is_displayed;
f80bda8e 616}
c906108c
SS
617
618
766062f6 619/* Answer whether a particular line number or address is displayed
f80bda8e 620 in the current source window. */
a4b99e53 621int
08ef48c5 622tui_addr_is_displayed (CORE_ADDR addr,
53e7cdba 623 struct tui_source_window_base *win_info,
08ef48c5 624 int check_threshold)
a4b99e53 625{
6ba8e26f 626 int is_displayed = FALSE;
a4b99e53
SC
627 int i, threshold;
628
6ba8e26f 629 if (check_threshold)
a4b99e53
SC
630 threshold = SCROLL_THRESHOLD;
631 else
632 threshold = 0;
633 i = 0;
53e7cdba 634 while (i < win_info->content.size () - threshold
e5908723 635 && !is_displayed)
a4b99e53 636 {
63ed8182 637 is_displayed
53e7cdba
TT
638 = win_info->content[i].line_or_addr.loa == LOA_ADDRESS
639 && win_info->content[i].line_or_addr.u.addr == addr;
a4b99e53
SC
640 i++;
641 }
642
6ba8e26f 643 return is_displayed;
a4b99e53
SC
644}
645
646
c906108c
SS
647/*****************************************
648** STATIC LOCAL FUNCTIONS **
649******************************************/
This page took 2.070683 seconds and 4 git commands to generate.