Change tui_check_and_display_highlight_if_needed to be a method
[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);
f80bda8e 80}
c906108c
SS
81
82
f80bda8e
AC
83/* Function to display source in the source/asm window. This function
84 shows the source as specified by the horizontal offset. */
c906108c 85void
be4da588 86tui_update_source_window_as_is (struct tui_source_window_base *win_info,
13274fc3 87 struct gdbarch *gdbarch,
08ef48c5
MS
88 struct symtab *s,
89 struct tui_line_or_address line_or_addr,
90 int noerror)
c906108c 91{
22940a24 92 enum tui_status ret;
c906108c 93
cb2ce893 94 if (win_info->type == SRC_WIN)
5813316f
TT
95 ret = tui_set_source_content (win_info, s, line_or_addr.u.line_no,
96 noerror);
c906108c 97 else
9d391078 98 ret = tui_set_disassem_content (win_info, gdbarch, line_or_addr.u.addr);
c906108c
SS
99
100 if (ret == TUI_FAILURE)
101 {
caf0bc4e 102 tui_clear_source_content (win_info);
6d012f14 103 tui_clear_exec_info_content (win_info);
c906108c
SS
104 }
105 else
106 {
0807ab7b 107 tui_update_breakpoint_info (win_info, nullptr, false);
6d012f14
AC
108 tui_show_source_content (win_info);
109 tui_update_exec_info (win_info);
cb2ce893 110 if (win_info->type == SRC_WIN)
c906108c 111 {
51abb421
PA
112 symtab_and_line sal;
113
362c05fe 114 sal.line = line_or_addr.u.line_no +
53e7cdba 115 (win_info->content.size () - 2);
52575520 116 sal.symtab = s;
eb822aa6 117 sal.pspace = SYMTAB_PSPACE (s);
51abb421 118 set_current_source_symtab_and_line (sal);
ef5eab5a
MS
119 /* If the focus was in the asm win, put it in the src win if
120 we don't have a split layout. */
e5908723
MS
121 if (tui_win_with_focus () == TUI_DISASM_WIN
122 && tui_current_layout () != SRC_DISASSEM_COMMAND)
5813316f 123 tui_set_win_focus_to (win_info);
c906108c
SS
124 }
125 }
f80bda8e 126}
c906108c
SS
127
128
f80bda8e
AC
129/* Function to ensure that the source and/or disassemly windows
130 reflect the input address. */
c906108c 131void
13274fc3 132tui_update_source_windows_with_addr (struct gdbarch *gdbarch, CORE_ADDR addr)
c906108c 133{
c774cec6 134 if (addr != 0)
c906108c
SS
135 {
136 struct symtab_and_line sal;
362c05fe 137 struct tui_line_or_address l;
a4b99e53 138
dd1abb8c 139 switch (tui_current_layout ())
c906108c
SS
140 {
141 case DISASSEM_COMMAND:
142 case DISASSEM_DATA_COMMAND:
13274fc3 143 tui_show_disassem (gdbarch, addr);
c906108c
SS
144 break;
145 case SRC_DISASSEM_COMMAND:
13274fc3 146 tui_show_disassem_and_update_source (gdbarch, addr);
c906108c
SS
147 break;
148 default:
c774cec6 149 sal = find_pc_line (addr, 0);
362c05fe
AS
150 l.loa = LOA_LINE;
151 l.u.line_no = sal.line;
5813316f 152 tui_show_symtab_source (TUI_SRC_WIN, gdbarch, sal.symtab, l, FALSE);
c906108c
SS
153 break;
154 }
155 }
156 else
157 {
ad54d15b 158 for (struct tui_source_window_base *win_info : tui_source_windows ())
c906108c 159 {
caf0bc4e 160 tui_clear_source_content (win_info);
6d012f14 161 tui_clear_exec_info_content (win_info);
c906108c
SS
162 }
163 }
6ba8e26f 164}
c906108c 165
f80bda8e
AC
166/* Function to ensure that the source and/or disassemly windows
167 reflect the input address. */
c906108c 168void
f80bda8e 169tui_update_source_windows_with_line (struct symtab *s, int line)
c906108c 170{
13274fc3 171 struct gdbarch *gdbarch;
84b1e7c7 172 CORE_ADDR pc;
362c05fe 173 struct tui_line_or_address l;
13274fc3
UW
174
175 if (!s)
176 return;
177
eb822aa6 178 gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s));
13274fc3 179
dd1abb8c 180 switch (tui_current_layout ())
c906108c
SS
181 {
182 case DISASSEM_COMMAND:
183 case DISASSEM_DATA_COMMAND:
84b1e7c7 184 find_line_pc (s, line, &pc);
13274fc3 185 tui_update_source_windows_with_addr (gdbarch, pc);
c906108c
SS
186 break;
187 default:
362c05fe
AS
188 l.loa = LOA_LINE;
189 l.u.line_no = line;
5813316f 190 tui_show_symtab_source (TUI_SRC_WIN, gdbarch, s, l, FALSE);
dd1abb8c 191 if (tui_current_layout () == SRC_DISASSEM_COMMAND)
84b1e7c7
SC
192 {
193 find_line_pc (s, line, &pc);
13274fc3 194 tui_show_disassem (gdbarch, pc);
84b1e7c7 195 }
c906108c
SS
196 break;
197 }
f80bda8e 198}
c906108c 199
c906108c 200void
caf0bc4e 201tui_clear_source_content (struct tui_source_window_base *win_info)
c906108c 202{
6d012f14 203 if (win_info != NULL)
c906108c 204 {
d02c80cd 205 int i;
c906108c 206
caf0bc4e 207 tui_erase_source_content (win_info);
53e7cdba 208 for (i = 0; i < win_info->content.size (); i++)
c906108c 209 {
53e7cdba 210 struct tui_source_element *element = &win_info->content[i];
1c5313c5 211
0598af48 212 element->break_mode = 0;
53e7cdba 213 element->is_exec_point = false;
c906108c
SS
214 }
215 }
6ba8e26f 216}
c906108c
SS
217
218
c906108c 219void
caf0bc4e 220tui_erase_source_content (struct tui_source_window_base *win_info)
c906108c 221{
6ba8e26f 222 int x_pos;
cb2ce893 223 int half_width = (win_info->width - 2) / 2;
c906108c 224
cb2ce893 225 if (win_info->handle != NULL)
c906108c 226 {
cb2ce893 227 werase (win_info->handle);
b4ef5aeb 228 win_info->check_and_display_highlight_if_needed ();
caf0bc4e
TT
229
230 const char *no_src_str;
231
232 if (win_info->type == SRC_WIN)
233 no_src_str = NO_SRC_STRING;
234 else
235 no_src_str = NO_DISASSEM_STRING;
236 if (strlen (no_src_str) >= half_width)
237 x_pos = 1;
238 else
239 x_pos = half_width - strlen (no_src_str);
240 mvwaddstr (win_info->handle,
241 (win_info->height / 2),
242 x_pos,
243 (char *) no_src_str);
244
f31ec9af 245 win_info->content.clear ();
5b81daba 246 win_info->refresh_window ();
c906108c 247 }
6ba8e26f 248}
c906108c
SS
249
250
bc712bbf
SC
251/* Redraw the complete line of a source or disassembly window. */
252static void
53e7cdba 253tui_show_source_line (struct tui_source_window_base *win_info, int lineno)
bc712bbf 254{
53e7cdba 255 struct tui_source_element *line;
798e1c30 256 int x;
bc712bbf 257
53e7cdba
TT
258 line = &win_info->content[lineno - 1];
259 if (line->is_exec_point)
cb2ce893 260 tui_set_reverse_mode (win_info->handle, true);
bc712bbf 261
cb2ce893 262 wmove (win_info->handle, lineno, 1);
53e7cdba 263 tui_puts (line->line,
cb2ce893 264 win_info->handle);
53e7cdba 265 if (line->is_exec_point)
cb2ce893 266 tui_set_reverse_mode (win_info->handle, false);
bc712bbf
SC
267
268 /* Clear to end of line but stop before the border. */
cb2ce893
TT
269 x = getcurx (win_info->handle);
270 while (x + 1 < win_info->width)
798e1c30 271 {
cb2ce893
TT
272 waddch (win_info->handle, ' ');
273 x = getcurx (win_info->handle);
798e1c30 274 }
bc712bbf
SC
275}
276
c906108c 277void
7908abbf 278tui_show_source_content (struct tui_source_window_base *win_info)
c906108c 279{
53e7cdba 280 if (!win_info->content.empty ())
c906108c 281 {
bc712bbf
SC
282 int lineno;
283
53e7cdba 284 for (lineno = 1; lineno <= win_info->content.size (); lineno++)
6d012f14 285 tui_show_source_line (win_info, lineno);
c906108c 286 }
bc712bbf 287 else
caf0bc4e 288 tui_erase_source_content (win_info);
bc712bbf 289
b4ef5aeb 290 win_info->check_and_display_highlight_if_needed ();
5b81daba 291 win_info->refresh_window ();
bc712bbf 292}
c906108c 293
ad54d15b 294/* See tui-data.h. */
6f11e682 295
5104fe36
TT
296void
297tui_source_window_base::clear_detail ()
298{
299 gdbarch = NULL;
300 start_line_or_addr.loa = LOA_ADDRESS;
301 start_line_or_addr.u.addr = 0;
302 horizontal_offset = 0;
303}
304
305tui_source_window_base::tui_source_window_base (enum tui_win_type type)
306 : tui_win_info (type),
307 execution_info (new tui_exec_info_window ())
308{
309 gdb_assert (type == SRC_WIN || type == DISASSEM_WIN);
310 start_line_or_addr.loa = LOA_ADDRESS;
311 start_line_or_addr.u.addr = 0;
312}
313
314
315tui_source_window_base::~tui_source_window_base ()
316{
317 xfree (fullname);
318 delete execution_info;
319}
320
321void
322tui_source_window_base::reset (int height, int width,
323 int origin_x, int origin_y)
324{
325 tui_gen_win_info::reset (height, width - 3,
326 origin_x + 3, origin_y);
327 execution_info->reset (height, 3, origin_x, origin_y);
328}
329
330/* See tui-data.h. */
331
332void
333tui_source_window_base::refresh_all ()
334{
335 tui_show_source_content (this);
b4ef5aeb 336 check_and_display_highlight_if_needed ();
5104fe36
TT
337 tui_erase_exec_info_content (this);
338 tui_update_exec_info (this);
339}
340
341/* See tui-data.h. */
342
343void
344tui_source_window_base::update_tab_width ()
345{
346 /* We don't really change the height of any windows, but
347 calling these 2 functions causes a complete regeneration
348 and redisplay of the window's contents, which will take
349 the new tab width into account. */
350 make_invisible_and_set_new_height (height);
351 make_visible_with_new_height ();
352}
353
354/* See tui-data.h. */
355
356void
357tui_source_window_base::set_new_height (int height)
358{
359 execution_info->make_visible (false);
360 execution_info->height = height;
361 execution_info->origin.y = origin.y;
362 if (height > 1)
363 execution_info->viewport_height = height - 1;
364 else
365 execution_info->viewport_height = height;
366 execution_info->viewport_height--;
367
368 if (m_has_locator)
369 {
370 tui_locator_window *gen_win_info = tui_locator_win_info_ptr ();
371 gen_win_info->make_visible (false);
372 gen_win_info->origin.y = origin.y + height;
373 }
374}
375
376/* See tui-data.h. */
377
378void
379tui_source_window_base::do_make_visible_with_new_height ()
380{
381 execution_info->make_visible (true);
382 if (!content.empty ())
383 {
384 struct tui_line_or_address line_or_addr;
385 struct symtab_and_line cursal
386 = get_current_source_symtab_and_line ();
387
388 line_or_addr = start_line_or_addr;
389 tui_update_source_window (this, gdbarch,
390 cursal.symtab, line_or_addr, TRUE);
391 }
392 else if (deprecated_safe_get_selected_frame () != NULL)
393 {
394 struct tui_line_or_address line;
395 struct symtab_and_line cursal
396 = get_current_source_symtab_and_line ();
397 struct frame_info *frame = deprecated_safe_get_selected_frame ();
398 struct gdbarch *gdbarch = get_frame_arch (frame);
399
400 struct symtab *s = find_pc_line_symtab (get_frame_pc (frame));
401 if (type == SRC_WIN)
402 {
403 line.loa = LOA_LINE;
404 line.u.line_no = cursal.line;
405 }
406 else
407 {
408 line.loa = LOA_ADDRESS;
409 find_line_pc (s, cursal.line, &line.u.addr);
410 }
411 tui_update_source_window (this, gdbarch, s, line, TRUE);
412 }
413 if (m_has_locator)
414 {
415 tui_locator_win_info_ptr ()->make_visible (true);
416 tui_show_locator_content ();
417 }
418}
419
420/* See tui-data.h. */
421
422void
423tui_source_window_base::make_visible (bool visible)
424{
425 execution_info->make_visible (visible);
426 tui_win_info::make_visible (visible);
427}
428
429/* See tui-data.h. */
430
431void
432tui_source_window_base::refresh_window ()
433{
434 execution_info->refresh_window ();
435 tui_win_info::refresh_window ();
436}
437
438/* See tui-data.h. */
439
6f11e682 440void
ad54d15b 441tui_source_window_base::refill ()
6f11e682
TT
442{
443 symtab *s = nullptr;
444
cb2ce893 445 if (type == SRC_WIN)
6f11e682
TT
446 {
447 symtab_and_line cursal = get_current_source_symtab_and_line ();
448 s = (cursal.symtab == NULL
449 ? find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)))
450 : cursal.symtab);
451 }
452
ad54d15b 453 tui_update_source_window_as_is (this, gdbarch, s,
53e7cdba 454 content[0].line_or_addr,
6f11e682
TT
455 FALSE);
456}
c906108c 457
f80bda8e 458/* Scroll the source forward or backward horizontally. */
6f11e682 459
c906108c 460void
c3bd716f 461tui_source_window_base::do_scroll_horizontal (int num_to_scroll)
c906108c 462{
53e7cdba 463 if (!content.empty ())
c906108c 464 {
c3bd716f
TT
465 int offset = horizontal_offset + num_to_scroll;
466 if (offset < 0)
467 offset = 0;
e6e41501 468 horizontal_offset = offset;
ad54d15b 469 refill ();
c906108c 470 }
6ba8e26f 471}
c906108c
SS
472
473
0598af48 474/* Set or clear the is_exec_point flag in the line whose line is
1cc6d956
MS
475 line_no. */
476
c906108c 477void
ad54d15b 478tui_source_window_base::set_is_exec_point_at (struct tui_line_or_address l)
c906108c 479{
02c28df0 480 bool changed = false;
c906108c 481 int i;
c906108c
SS
482
483 i = 0;
53e7cdba 484 while (i < content.size ())
c906108c 485 {
02c28df0 486 bool new_state;
362c05fe 487 struct tui_line_or_address content_loa =
53e7cdba 488 content[i].line_or_addr;
362c05fe
AS
489
490 gdb_assert (l.loa == LOA_ADDRESS || l.loa == LOA_LINE);
491 gdb_assert (content_loa.loa == LOA_LINE
492 || content_loa.loa == LOA_ADDRESS);
493 if (content_loa.loa == l.loa
494 && ((l.loa == LOA_LINE && content_loa.u.line_no == l.u.line_no)
f7952c57 495 || (l.loa == LOA_ADDRESS && content_loa.u.addr == l.u.addr)))
02c28df0 496 new_state = true;
c906108c 497 else
02c28df0 498 new_state = false;
53e7cdba 499 if (new_state != content[i].is_exec_point)
00b90ae2 500 {
02c28df0 501 changed = true;
53e7cdba 502 content[i].is_exec_point = new_state;
ad54d15b 503 tui_show_source_line (this, i + 1);
00b90ae2 504 }
c906108c
SS
505 i++;
506 }
00b90ae2 507 if (changed)
ad54d15b 508 refill ();
00b90ae2 509}
c906108c 510
0807ab7b
TT
511/* See tui-winsource.h. */
512
c906108c 513void
0807ab7b 514tui_update_all_breakpoint_info (struct breakpoint *being_deleted)
c906108c 515{
ad54d15b 516 for (tui_source_window_base *win : tui_source_windows ())
c906108c 517 {
0807ab7b 518 if (tui_update_breakpoint_info (win, being_deleted, false))
00b2bad4 519 {
f80bda8e 520 tui_update_exec_info (win);
00b2bad4 521 }
c906108c 522 }
00b2bad4 523}
c906108c
SS
524
525
0807ab7b 526/* Scan the source window and the breakpoints to update the break_mode
1cc6d956
MS
527 information for each line.
528
0807ab7b 529 Returns true if something changed and the execution window must be
1cc6d956
MS
530 refreshed. */
531
0807ab7b
TT
532bool
533tui_update_breakpoint_info (struct tui_source_window_base *win,
534 struct breakpoint *being_deleted,
535 bool current_only)
c906108c
SS
536{
537 int i;
0807ab7b 538 bool need_refresh = false;
c906108c 539
53e7cdba 540 for (i = 0; i < win->content.size (); i++)
00b2bad4
SC
541 {
542 struct breakpoint *bp;
543 extern struct breakpoint *breakpoint_chain;
5b6fe301 544 struct tui_source_element *line;
00b2bad4 545
53e7cdba 546 line = &win->content[i];
6d012f14 547 if (current_only && !line->is_exec_point)
00b2bad4
SC
548 continue;
549
550 /* Scan each breakpoint to see if the current line has something to
551 do with it. Identify enable/disabled breakpoints as well as
552 those that we already hit. */
0598af48 553 tui_bp_flags mode = 0;
00b2bad4 554 for (bp = breakpoint_chain;
cafb3438 555 bp != NULL;
00b2bad4
SC
556 bp = bp->next)
557 {
f8eba3c6
TT
558 struct bp_location *loc;
559
362c05fe
AS
560 gdb_assert (line->line_or_addr.loa == LOA_LINE
561 || line->line_or_addr.loa == LOA_ADDRESS);
f8eba3c6 562
0807ab7b
TT
563 if (bp == being_deleted)
564 continue;
565
f8eba3c6
TT
566 for (loc = bp->loc; loc != NULL; loc = loc->next)
567 {
c2cd8994 568 if (win->location_matches_p (loc, i))
f8eba3c6
TT
569 {
570 if (bp->enable_state == bp_disabled)
571 mode |= TUI_BP_DISABLED;
572 else
573 mode |= TUI_BP_ENABLED;
574 if (bp->hit_count)
575 mode |= TUI_BP_HIT;
576 if (bp->loc->cond)
577 mode |= TUI_BP_CONDITIONAL;
578 if (bp->type == bp_hardware_breakpoint)
579 mode |= TUI_BP_HARDWARE;
580 }
581 }
00b2bad4 582 }
0598af48 583 if (line->break_mode != mode)
00b2bad4 584 {
0598af48
TT
585 line->break_mode = mode;
586 need_refresh = true;
00b2bad4
SC
587 }
588 }
589 return need_refresh;
590}
c906108c 591
489e9d8b
TT
592/* See tui-data.h. */
593
594tui_exec_info_content *
595tui_exec_info_window::maybe_allocate_content (int n_elements)
596{
597 if (m_content == nullptr)
598 m_content = XNEWVEC (tui_exec_info_content, n_elements);
599 return m_content;
600}
601
c906108c 602
6ba8e26f
AC
603/* Function to initialize the content of the execution info window,
604 based upon the input window which is either the source or
605 disassembly window. */
73fbdc65 606void
21c32dca 607tui_set_exec_info_content (struct tui_source_window_base *win_info)
c906108c 608{
098f9ed4
TT
609 tui_exec_info_content *content
610 = win_info->execution_info->maybe_allocate_content (win_info->height);
c906108c 611
098f9ed4
TT
612 tui_update_breakpoint_info (win_info, nullptr, true);
613 for (int i = 0; i < win_info->content.size (); i++)
614 {
615 tui_exec_info_content &element = content[i];
616 struct tui_source_element *src_element;
617 tui_bp_flags mode;
618
619 src_element = &win_info->content[i];
620
621 memset (element, ' ', sizeof (tui_exec_info_content));
622 element[TUI_EXECINFO_SIZE - 1] = 0;
623
624 /* Now update the exec info content based upon the state
625 of each line as indicated by the source content. */
626 mode = src_element->break_mode;
627 if (mode & TUI_BP_HIT)
628 element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
629 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
630 element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
631
632 if (mode & TUI_BP_ENABLED)
633 element[TUI_BP_BREAK_POS] = '+';
634 else if (mode & TUI_BP_DISABLED)
635 element[TUI_BP_BREAK_POS] = '-';
636
637 if (src_element->is_exec_point)
638 element[TUI_EXEC_POS] = '>';
c906108c 639 }
00b2bad4 640}
c906108c
SS
641
642
c906108c 643void
21c32dca 644tui_show_exec_info_content (struct tui_source_window_base *win_info)
c906108c 645{
489e9d8b
TT
646 struct tui_exec_info_window *exec_info = win_info->execution_info;
647 const tui_exec_info_content *content = exec_info->get_content ();
6ba8e26f
AC
648
649 werase (exec_info->handle);
53e7cdba 650 for (int cur_line = 1; cur_line <= win_info->content.size (); cur_line++)
6ba8e26f
AC
651 mvwaddstr (exec_info->handle,
652 cur_line,
c906108c 653 0,
489e9d8b 654 content[cur_line - 1]);
5b81daba 655 exec_info->refresh_window ();
f80bda8e 656}
c906108c
SS
657
658
c906108c 659void
21c32dca 660tui_erase_exec_info_content (struct tui_source_window_base *win_info)
c906108c 661{
21c32dca 662 struct tui_gen_win_info *exec_info = win_info->execution_info;
c906108c 663
6ba8e26f 664 werase (exec_info->handle);
5b81daba 665 exec_info->refresh_window ();
f80bda8e 666}
c906108c 667
c906108c 668void
21c32dca 669tui_clear_exec_info_content (struct tui_source_window_base *win_info)
c906108c 670{
6d012f14 671 tui_erase_exec_info_content (win_info);
f80bda8e 672}
c906108c 673
f80bda8e 674/* Function to update the execution info window. */
c906108c 675void
21c32dca 676tui_update_exec_info (struct tui_source_window_base *win_info)
c906108c 677{
6ba8e26f
AC
678 tui_set_exec_info_content (win_info);
679 tui_show_exec_info_content (win_info);
680}
c906108c 681
29d2c474 682void
53e7cdba 683tui_alloc_source_buffer (struct tui_source_window_base *win_info)
c906108c 684{
d02c80cd 685 int i, line_width, max_lines;
c906108c 686
7bc2c8b8
AA
687 /* The window width/height includes the highlight box. Determine actual
688 content dimensions, including string null-terminators. */
cb2ce893
TT
689 max_lines = win_info->height - 2;
690 line_width = win_info->width - 2 + 1;
7bc2c8b8 691
62f29fda 692 /* Allocate the buffer for the source lines. */
53e7cdba
TT
693 win_info->content.resize (max_lines);
694 for (i = 0; i < max_lines; i++)
c906108c 695 {
53e7cdba
TT
696 if (win_info->content[i].line == nullptr)
697 win_info->content[i].line = (char *) xmalloc (line_width);
c906108c 698 }
6ba8e26f 699}
c906108c
SS
700
701
766062f6 702/* Answer whether a particular line number or address is displayed
f80bda8e 703 in the current source window. */
c906108c 704int
08ef48c5 705tui_line_is_displayed (int line,
53e7cdba 706 struct tui_source_window_base *win_info,
6ba8e26f 707 int check_threshold)
c906108c 708{
6ba8e26f 709 int is_displayed = FALSE;
c906108c
SS
710 int i, threshold;
711
6ba8e26f 712 if (check_threshold)
c906108c
SS
713 threshold = SCROLL_THRESHOLD;
714 else
715 threshold = 0;
716 i = 0;
53e7cdba 717 while (i < win_info->content.size () - threshold
e5908723 718 && !is_displayed)
c906108c 719 {
63ed8182 720 is_displayed
53e7cdba
TT
721 = win_info->content[i].line_or_addr.loa == LOA_LINE
722 && win_info->content[i].line_or_addr.u.line_no == line;
c906108c
SS
723 i++;
724 }
725
6ba8e26f 726 return is_displayed;
f80bda8e 727}
c906108c
SS
728
729
766062f6 730/* Answer whether a particular line number or address is displayed
f80bda8e 731 in the current source window. */
a4b99e53 732int
08ef48c5 733tui_addr_is_displayed (CORE_ADDR addr,
53e7cdba 734 struct tui_source_window_base *win_info,
08ef48c5 735 int check_threshold)
a4b99e53 736{
6ba8e26f 737 int is_displayed = FALSE;
a4b99e53
SC
738 int i, threshold;
739
6ba8e26f 740 if (check_threshold)
a4b99e53
SC
741 threshold = SCROLL_THRESHOLD;
742 else
743 threshold = 0;
744 i = 0;
53e7cdba 745 while (i < win_info->content.size () - threshold
e5908723 746 && !is_displayed)
a4b99e53 747 {
63ed8182 748 is_displayed
53e7cdba
TT
749 = win_info->content[i].line_or_addr.loa == LOA_ADDRESS
750 && win_info->content[i].line_or_addr.u.addr == addr;
a4b99e53
SC
751 i++;
752 }
753
6ba8e26f 754 return is_displayed;
a4b99e53 755}
This page took 3.12742 seconds and 4 git commands to generate.