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