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