Inline constructors and initializers
[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
08ef48c5 72tui_update_source_window (struct tui_win_info *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{
e6e41501
TT
78 tui_source_window_base *base = (tui_source_window_base *) win_info;
79 base->horizontal_offset = 0;
13274fc3 80 tui_update_source_window_as_is (win_info, gdbarch, s, line_or_addr, noerror);
c906108c
SS
81
82 return;
f80bda8e 83}
c906108c
SS
84
85
f80bda8e
AC
86/* Function to display source in the source/asm window. This function
87 shows the source as specified by the horizontal offset. */
c906108c 88void
08ef48c5 89tui_update_source_window_as_is (struct tui_win_info *win_info,
13274fc3 90 struct gdbarch *gdbarch,
08ef48c5
MS
91 struct symtab *s,
92 struct tui_line_or_address line_or_addr,
93 int noerror)
c906108c 94{
22940a24 95 enum tui_status ret;
c906108c 96
6d012f14 97 if (win_info->generic.type == SRC_WIN)
362c05fe 98 ret = tui_set_source_content (s, line_or_addr.u.line_no, 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 {
6d012f14
AC
109 tui_update_breakpoint_info (win_info, 0);
110 tui_show_source_content (win_info);
111 tui_update_exec_info (win_info);
112 if (win_info->generic.type == SRC_WIN)
c906108c 113 {
51abb421
PA
114 symtab_and_line sal;
115
362c05fe 116 sal.line = line_or_addr.u.line_no +
6d012f14 117 (win_info->generic.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)
6d012f14 125 tui_set_win_focus_to (TUI_SRC_WIN);
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;
13274fc3 157 tui_show_symtab_source (gdbarch, sal.symtab, l, FALSE);
c906108c
SS
158 break;
159 }
160 }
161 else
162 {
b4eb2452 163 for (struct tui_win_info *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;
13274fc3 195 tui_show_symtab_source (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
08ef48c5
MS
208tui_clear_source_content (struct tui_win_info *win_info,
209 int display_prompt)
c906108c 210{
6d012f14 211 if (win_info != NULL)
c906108c 212 {
d02c80cd 213 int i;
c906108c 214
6d012f14 215 win_info->generic.content_in_use = FALSE;
6ba8e26f 216 tui_erase_source_content (win_info, display_prompt);
6d012f14 217 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 218 {
63ed8182 219 struct tui_win_element *element = win_info->generic.content[i];
1c5313c5 220
6d012f14
AC
221 element->which_element.source.has_break = FALSE;
222 element->which_element.source.is_exec_point = FALSE;
c906108c
SS
223 }
224 }
6ba8e26f 225}
c906108c
SS
226
227
c906108c 228void
08ef48c5
MS
229tui_erase_source_content (struct tui_win_info *win_info,
230 int display_prompt)
c906108c 231{
6ba8e26f
AC
232 int x_pos;
233 int half_width = (win_info->generic.width - 2) / 2;
c906108c 234
cafb3438 235 if (win_info->generic.handle != NULL)
c906108c 236 {
6d012f14
AC
237 werase (win_info->generic.handle);
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
6d012f14 243 if (win_info->generic.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);
6d012f14
AC
251 mvwaddstr (win_info->generic.handle,
252 (win_info->generic.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 }
6d012f14 263 tui_refresh_win (&win_info->generic);
c906108c 264 }
6ba8e26f 265}
c906108c
SS
266
267
bc712bbf
SC
268/* Redraw the complete line of a source or disassembly window. */
269static void
5b6fe301 270tui_show_source_line (struct tui_win_info *win_info, int lineno)
bc712bbf 271{
5b6fe301 272 struct tui_win_element *line;
798e1c30 273 int x;
bc712bbf 274
63ed8182 275 line = win_info->generic.content[lineno - 1];
6d012f14 276 if (line->which_element.source.is_exec_point)
55c10aca 277 tui_set_reverse_mode (win_info->generic.handle, true);
bc712bbf 278
62f29fda
TT
279 wmove (win_info->generic.handle, lineno, 1);
280 tui_puts (line->which_element.source.line,
281 win_info->generic.handle);
6d012f14 282 if (line->which_element.source.is_exec_point)
55c10aca 283 tui_set_reverse_mode (win_info->generic.handle, false);
bc712bbf
SC
284
285 /* Clear to end of line but stop before the border. */
798e1c30
EZ
286 x = getcurx (win_info->generic.handle);
287 while (x + 1 < win_info->generic.width)
288 {
289 waddch (win_info->generic.handle, ' ');
290 x = getcurx (win_info->generic.handle);
291 }
bc712bbf
SC
292}
293
c906108c 294void
5b6fe301 295tui_show_source_content (struct tui_win_info *win_info)
c906108c 296{
6d012f14 297 if (win_info->generic.content_size > 0)
c906108c 298 {
bc712bbf
SC
299 int lineno;
300
6d012f14
AC
301 for (lineno = 1; lineno <= win_info->generic.content_size; lineno++)
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
AC
307 tui_check_and_display_highlight_if_needed (win_info);
308 tui_refresh_win (&win_info->generic);
309 win_info->generic.content_in_use = TRUE;
bc712bbf 310}
c906108c 311
6f11e682
TT
312/* Refill the source window's source cache and update it. If WIN_INFO
313 is a disassembly window, then just update it. */
314
315void
316tui_refill_source_window (struct tui_win_info *win_info)
317{
318 symtab *s = nullptr;
319
320 if (win_info->generic.type == SRC_WIN)
321 {
322 symtab_and_line cursal = get_current_source_symtab_and_line ();
323 s = (cursal.symtab == NULL
324 ? find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)))
325 : cursal.symtab);
326 }
327
e6e41501 328 tui_source_window_base *base = (tui_source_window_base *) win_info;
6f11e682 329 tui_update_source_window_as_is (win_info,
e6e41501 330 base->gdbarch,
6f11e682
TT
331 s,
332 win_info->generic.content[0]
333 ->which_element.source.line_or_addr,
334 FALSE);
335}
c906108c 336
f80bda8e 337/* Scroll the source forward or backward horizontally. */
6f11e682 338
c906108c 339void
13446e05
TT
340tui_source_window_base::do_scroll_horizontal
341 (enum tui_scroll_direction direction, int num_to_scroll)
c906108c 342{
13446e05 343 if (generic.content != NULL)
c906108c
SS
344 {
345 int offset;
c906108c
SS
346
347 if (direction == LEFT_SCROLL)
e6e41501 348 offset = horizontal_offset + num_to_scroll;
c906108c
SS
349 else
350 {
e6e41501 351 offset = horizontal_offset - num_to_scroll;
a743e542 352 if (offset < 0)
c906108c
SS
353 offset = 0;
354 }
e6e41501 355 horizontal_offset = offset;
13446e05 356 tui_refill_source_window (this);
c906108c 357 }
6ba8e26f 358}
c906108c
SS
359
360
1cc6d956
MS
361/* Set or clear the has_break flag in the line whose line is
362 line_no. */
363
c906108c 364void
08ef48c5
MS
365tui_set_is_exec_point_at (struct tui_line_or_address l,
366 struct tui_win_info *win_info)
c906108c 367{
00b90ae2 368 int changed = 0;
c906108c 369 int i;
63a33118 370 tui_win_content content = win_info->generic.content;
c906108c
SS
371
372 i = 0;
6d012f14 373 while (i < win_info->generic.content_size)
c906108c 374 {
6ba8e26f 375 int new_state;
362c05fe
AS
376 struct tui_line_or_address content_loa =
377 content[i]->which_element.source.line_or_addr;
378
379 gdb_assert (l.loa == LOA_ADDRESS || l.loa == LOA_LINE);
380 gdb_assert (content_loa.loa == LOA_LINE
381 || content_loa.loa == LOA_ADDRESS);
382 if (content_loa.loa == l.loa
383 && ((l.loa == LOA_LINE && content_loa.u.line_no == l.u.line_no)
384 || (content_loa.u.addr == l.u.addr)))
6ba8e26f 385 new_state = TRUE;
c906108c 386 else
6ba8e26f
AC
387 new_state = FALSE;
388 if (new_state != content[i]->which_element.source.is_exec_point)
00b90ae2
SC
389 {
390 changed++;
6ba8e26f 391 content[i]->which_element.source.is_exec_point = new_state;
6d012f14 392 tui_show_source_line (win_info, i + 1);
00b90ae2 393 }
c906108c
SS
394 i++;
395 }
00b90ae2 396 if (changed)
f7f0a123 397 tui_refill_source_window (win_info);
00b90ae2 398}
c906108c 399
00b2bad4
SC
400/* Update the execution windows to show the active breakpoints.
401 This is called whenever a breakpoint is inserted, removed or
402 has its state changed. */
c906108c 403void
b4eb2452 404tui_update_all_breakpoint_info ()
c906108c 405{
b4eb2452 406 for (tui_win_info *win : tui_source_windows ())
c906108c 407 {
00b2bad4
SC
408 if (tui_update_breakpoint_info (win, FALSE))
409 {
f80bda8e 410 tui_update_exec_info (win);
00b2bad4 411 }
c906108c 412 }
00b2bad4 413}
c906108c
SS
414
415
1cc6d956
MS
416/* Scan the source window and the breakpoints to update the has_break
417 information for each line.
418
419 Returns 1 if something changed and the execution window must be
420 refreshed. */
421
00b2bad4 422int
08ef48c5
MS
423tui_update_breakpoint_info (struct tui_win_info *win,
424 int current_only)
c906108c
SS
425{
426 int i;
00b2bad4 427 int need_refresh = 0;
e6e41501 428 tui_source_window_base *src = (tui_source_window_base *) win;
c906108c 429
6d012f14 430 for (i = 0; i < win->generic.content_size; i++)
00b2bad4
SC
431 {
432 struct breakpoint *bp;
433 extern struct breakpoint *breakpoint_chain;
434 int mode;
5b6fe301 435 struct tui_source_element *line;
00b2bad4 436
63ed8182 437 line = &win->generic.content[i]->which_element.source;
6d012f14 438 if (current_only && !line->is_exec_point)
00b2bad4
SC
439 continue;
440
441 /* Scan each breakpoint to see if the current line has something to
442 do with it. Identify enable/disabled breakpoints as well as
443 those that we already hit. */
444 mode = 0;
445 for (bp = breakpoint_chain;
cafb3438 446 bp != NULL;
00b2bad4
SC
447 bp = bp->next)
448 {
f8eba3c6
TT
449 struct bp_location *loc;
450
362c05fe
AS
451 gdb_assert (line->line_or_addr.loa == LOA_LINE
452 || line->line_or_addr.loa == LOA_ADDRESS);
f8eba3c6
TT
453
454 for (loc = bp->loc; loc != NULL; loc = loc->next)
455 {
456 if ((win == TUI_SRC_WIN
2f202fde 457 && loc->symtab != NULL
aa079c93
JK
458 && filename_cmp (src->fullname,
459 symtab_to_fullname (loc->symtab)) == 0
f8eba3c6
TT
460 && line->line_or_addr.loa == LOA_LINE
461 && loc->line_number == line->line_or_addr.u.line_no)
462 || (win == TUI_DISASM_WIN
463 && line->line_or_addr.loa == LOA_ADDRESS
464 && loc->address == line->line_or_addr.u.addr))
465 {
466 if (bp->enable_state == bp_disabled)
467 mode |= TUI_BP_DISABLED;
468 else
469 mode |= TUI_BP_ENABLED;
470 if (bp->hit_count)
471 mode |= TUI_BP_HIT;
472 if (bp->loc->cond)
473 mode |= TUI_BP_CONDITIONAL;
474 if (bp->type == bp_hardware_breakpoint)
475 mode |= TUI_BP_HARDWARE;
476 }
477 }
00b2bad4 478 }
6d012f14 479 if (line->has_break != mode)
00b2bad4 480 {
6d012f14 481 line->has_break = mode;
00b2bad4
SC
482 need_refresh = 1;
483 }
484 }
485 return need_refresh;
486}
c906108c 487
c906108c 488
6ba8e26f
AC
489/* Function to initialize the content of the execution info window,
490 based upon the input window which is either the source or
491 disassembly window. */
22940a24 492enum tui_status
5b6fe301 493tui_set_exec_info_content (struct tui_win_info *win_info)
c906108c 494{
22940a24 495 enum tui_status ret = TUI_SUCCESS;
c906108c 496
e6e41501
TT
497 tui_source_window_base *base = (tui_source_window_base *) win_info;
498 if (base->execution_info != NULL)
c906108c 499 {
e6e41501 500 struct tui_gen_win_info *exec_info_ptr = base->execution_info;
c906108c 501
6ba8e26f
AC
502 if (exec_info_ptr->content == NULL)
503 exec_info_ptr->content =
63ed8182 504 tui_alloc_content (win_info->generic.height, exec_info_ptr->type);
6ba8e26f 505 if (exec_info_ptr->content != NULL)
c906108c
SS
506 {
507 int i;
508
6d012f14
AC
509 tui_update_breakpoint_info (win_info, 1);
510 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 511 {
5b6fe301
MS
512 struct tui_win_element *element;
513 struct tui_win_element *src_element;
00b2bad4 514 int mode;
c906108c 515
63ed8182
PP
516 element = exec_info_ptr->content[i];
517 src_element = win_info->generic.content[i];
00b2bad4 518
6d012f14
AC
519 memset(element->which_element.simple_string, ' ',
520 sizeof(element->which_element.simple_string));
521 element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
00b2bad4
SC
522
523 /* Now update the exec info content based upon the state
524 of each line as indicated by the source content. */
6ba8e26f 525 mode = src_element->which_element.source.has_break;
00b2bad4 526 if (mode & TUI_BP_HIT)
6d012f14 527 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
528 (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
529 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
6d012f14 530 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
531 (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
532
533 if (mode & TUI_BP_ENABLED)
6d012f14 534 element->which_element.simple_string[TUI_BP_BREAK_POS] = '+';
00b2bad4 535 else if (mode & TUI_BP_DISABLED)
6d012f14 536 element->which_element.simple_string[TUI_BP_BREAK_POS] = '-';
00b2bad4 537
6ba8e26f 538 if (src_element->which_element.source.is_exec_point)
6d012f14 539 element->which_element.simple_string[TUI_EXEC_POS] = '>';
c906108c 540 }
6ba8e26f 541 exec_info_ptr->content_size = win_info->generic.content_size;
c906108c
SS
542 }
543 else
544 ret = TUI_FAILURE;
545 }
546
547 return ret;
00b2bad4 548}
c906108c
SS
549
550
c906108c 551void
5b6fe301 552tui_show_exec_info_content (struct tui_win_info *win_info)
c906108c 553{
e6e41501
TT
554 tui_source_window_base *base = (tui_source_window_base *) win_info;
555 struct tui_gen_win_info *exec_info = base->execution_info;
6ba8e26f
AC
556 int cur_line;
557
558 werase (exec_info->handle);
559 tui_refresh_win (exec_info);
560 for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++)
561 mvwaddstr (exec_info->handle,
562 cur_line,
c906108c 563 0,
7a6e7fcc
RO
564 (char *) exec_info->content[cur_line - 1]
565 ->which_element.simple_string);
6ba8e26f
AC
566 tui_refresh_win (exec_info);
567 exec_info->content_in_use = TRUE;
f80bda8e 568}
c906108c
SS
569
570
c906108c 571void
5b6fe301 572tui_erase_exec_info_content (struct tui_win_info *win_info)
c906108c 573{
e6e41501
TT
574 tui_source_window_base *base = (tui_source_window_base *) win_info;
575 struct tui_gen_win_info *exec_info = base->execution_info;
c906108c 576
6ba8e26f
AC
577 werase (exec_info->handle);
578 tui_refresh_win (exec_info);
f80bda8e 579}
c906108c 580
c906108c 581void
5b6fe301 582tui_clear_exec_info_content (struct tui_win_info *win_info)
c906108c 583{
e6e41501
TT
584 tui_source_window_base *base = (tui_source_window_base *) win_info;
585 base->execution_info->content_in_use = FALSE;
6d012f14 586 tui_erase_exec_info_content (win_info);
c906108c
SS
587
588 return;
f80bda8e 589}
c906108c 590
f80bda8e 591/* Function to update the execution info window. */
c906108c 592void
5b6fe301 593tui_update_exec_info (struct tui_win_info *win_info)
c906108c 594{
6ba8e26f
AC
595 tui_set_exec_info_content (win_info);
596 tui_show_exec_info_content (win_info);
597}
c906108c 598
f80bda8e 599enum tui_status
6d012f14 600tui_alloc_source_buffer (struct tui_win_info *win_info)
c906108c 601{
d02c80cd 602 int i, line_width, max_lines;
c906108c 603
7bc2c8b8
AA
604 /* The window width/height includes the highlight box. Determine actual
605 content dimensions, including string null-terminators. */
606 max_lines = win_info->generic.height - 2;
607 line_width = win_info->generic.width - 2 + 1;
608
62f29fda 609 /* Allocate the buffer for the source lines. */
6d012f14 610 if (win_info->generic.content == NULL)
c906108c 611 {
1cc6d956 612 /* Allocate the content list. */
63ed8182 613 win_info->generic.content = tui_alloc_content (max_lines, SRC_WIN);
6ba8e26f 614 for (i = 0; i < max_lines; i++)
63ed8182 615 win_info->generic.content[i]->which_element.source.line
62f29fda 616 = (char *) xmalloc (line_width);
c906108c 617 }
c906108c 618
81b7c67a 619 return TUI_SUCCESS;
6ba8e26f 620}
c906108c
SS
621
622
766062f6 623/* Answer whether a particular line number or address is displayed
f80bda8e 624 in the current source window. */
c906108c 625int
08ef48c5
MS
626tui_line_is_displayed (int line,
627 struct tui_win_info *win_info,
6ba8e26f 628 int check_threshold)
c906108c 629{
6ba8e26f 630 int is_displayed = FALSE;
c906108c
SS
631 int i, threshold;
632
6ba8e26f 633 if (check_threshold)
c906108c
SS
634 threshold = SCROLL_THRESHOLD;
635 else
636 threshold = 0;
637 i = 0;
e5908723
MS
638 while (i < win_info->generic.content_size - threshold
639 && !is_displayed)
c906108c 640 {
63ed8182
PP
641 is_displayed
642 = win_info->generic.content[i]
643 ->which_element.source.line_or_addr.loa == LOA_LINE
644 && win_info->generic.content[i]
63a33118 645 ->which_element.source.line_or_addr.u.line_no == line;
c906108c
SS
646 i++;
647 }
648
6ba8e26f 649 return is_displayed;
f80bda8e 650}
c906108c
SS
651
652
766062f6 653/* Answer whether a particular line number or address is displayed
f80bda8e 654 in the current source window. */
a4b99e53 655int
08ef48c5
MS
656tui_addr_is_displayed (CORE_ADDR addr,
657 struct tui_win_info *win_info,
658 int check_threshold)
a4b99e53 659{
6ba8e26f 660 int is_displayed = FALSE;
a4b99e53
SC
661 int i, threshold;
662
6ba8e26f 663 if (check_threshold)
a4b99e53
SC
664 threshold = SCROLL_THRESHOLD;
665 else
666 threshold = 0;
667 i = 0;
e5908723
MS
668 while (i < win_info->generic.content_size - threshold
669 && !is_displayed)
a4b99e53 670 {
63ed8182
PP
671 is_displayed
672 = win_info->generic.content[i]
673 ->which_element.source.line_or_addr.loa == LOA_ADDRESS
674 && win_info->generic.content[i]
675 ->which_element.source.line_or_addr.u.addr == addr;
a4b99e53
SC
676 i++;
677 }
678
6ba8e26f 679 return is_displayed;
a4b99e53
SC
680}
681
682
c906108c
SS
683/*****************************************
684** STATIC LOCAL FUNCTIONS **
685******************************************/
This page took 2.250638 seconds and 4 git commands to generate.