Fix PR rust/20110
[deliverable/binutils-gdb.git] / gdb / tui / tui-winsource.c
CommitLineData
f377b406 1/* TUI display source/assembly window.
f33c6cbf 2
618f726f 3 Copyright (C) 1998-2016 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"
34#include "tui/tui-stack.h"
35#include "tui/tui-win.h"
36#include "tui/tui-wingeneral.h"
37#include "tui/tui-winsource.h"
38#include "tui/tui-source.h"
39#include "tui/tui-disasm.h"
6a83354a 40#include "gdb_curses.h"
c906108c 41
1f393769 42/* Function to display the "main" routine. */
c906108c 43void
1f393769 44tui_display_main (void)
c906108c 45{
dd1abb8c 46 if ((tui_source_windows ())->count > 0)
c906108c 47 {
13274fc3 48 struct gdbarch *gdbarch;
c906108c
SS
49 CORE_ADDR addr;
50
13274fc3 51 tui_get_begin_asm_address (&gdbarch, &addr);
c774cec6 52 if (addr != (CORE_ADDR) 0)
c906108c 53 {
34248c3a 54 struct symtab *s;
c906108c 55
13274fc3 56 tui_update_source_windows_with_addr (gdbarch, addr);
34248c3a
DE
57 s = find_pc_line_symtab (addr);
58 if (s != NULL)
59 tui_update_locator_fullname (symtab_to_fullname (s));
2e17b763 60 else
56d397a3 61 tui_update_locator_fullname ("??");
c906108c
SS
62 }
63 }
2e17b763 64}
c906108c
SS
65
66
67
f80bda8e
AC
68/* Function to display source in the source window. This function
69 initializes the horizontal scroll to 0. */
c906108c 70void
08ef48c5 71tui_update_source_window (struct tui_win_info *win_info,
13274fc3 72 struct gdbarch *gdbarch,
08ef48c5
MS
73 struct symtab *s,
74 struct tui_line_or_address line_or_addr,
75 int noerror)
c906108c 76{
6d012f14 77 win_info->detail.source_info.horizontal_offset = 0;
13274fc3 78 tui_update_source_window_as_is (win_info, gdbarch, s, line_or_addr, noerror);
c906108c
SS
79
80 return;
f80bda8e 81}
c906108c
SS
82
83
f80bda8e
AC
84/* Function to display source in the source/asm window. This function
85 shows the source as specified by the horizontal offset. */
c906108c 86void
08ef48c5 87tui_update_source_window_as_is (struct tui_win_info *win_info,
13274fc3 88 struct gdbarch *gdbarch,
08ef48c5
MS
89 struct symtab *s,
90 struct tui_line_or_address line_or_addr,
91 int noerror)
c906108c 92{
22940a24 93 enum tui_status ret;
c906108c 94
6d012f14 95 if (win_info->generic.type == SRC_WIN)
362c05fe 96 ret = tui_set_source_content (s, line_or_addr.u.line_no, noerror);
c906108c 97 else
13274fc3 98 ret = tui_set_disassem_content (gdbarch, line_or_addr.u.addr);
c906108c
SS
99
100 if (ret == TUI_FAILURE)
101 {
6d012f14
AC
102 tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT);
103 tui_clear_exec_info_content (win_info);
c906108c
SS
104 }
105 else
106 {
6d012f14
AC
107 tui_update_breakpoint_info (win_info, 0);
108 tui_show_source_content (win_info);
109 tui_update_exec_info (win_info);
110 if (win_info->generic.type == SRC_WIN)
c906108c 111 {
52575520
EZ
112 struct symtab_and_line sal;
113
58397cb7 114 init_sal (&sal);
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);
52575520 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 {
6ba8e26f 244 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
AC
256 x_pos,
257 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
SC
276 int x, y;
277
63ed8182 278 line = win_info->generic.content[lineno - 1];
6d012f14
AC
279 if (line->which_element.source.is_exec_point)
280 wattron (win_info->generic.handle, A_STANDOUT);
bc712bbf 281
6d012f14
AC
282 mvwaddstr (win_info->generic.handle, lineno, 1,
283 line->which_element.source.line);
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. */
6d012f14
AC
288 getyx (win_info->generic.handle, y, x);
289 while (x + 1 < win_info->generic.width)
bc712bbf 290 {
6d012f14
AC
291 waddch (win_info->generic.handle, ' ');
292 getyx (win_info->generic.handle, y, x);
bc712bbf
SC
293 }
294}
295
c906108c 296void
5b6fe301 297tui_show_source_content (struct tui_win_info *win_info)
c906108c 298{
6d012f14 299 if (win_info->generic.content_size > 0)
c906108c 300 {
bc712bbf
SC
301 int lineno;
302
6d012f14
AC
303 for (lineno = 1; lineno <= win_info->generic.content_size; lineno++)
304 tui_show_source_line (win_info, lineno);
c906108c 305 }
bc712bbf 306 else
6d012f14 307 tui_erase_source_content (win_info, TRUE);
bc712bbf 308
6d012f14
AC
309 tui_check_and_display_highlight_if_needed (win_info);
310 tui_refresh_win (&win_info->generic);
311 win_info->generic.content_in_use = TRUE;
bc712bbf 312}
c906108c
SS
313
314
f80bda8e 315/* Scroll the source forward or backward horizontally. */
c906108c 316void
5b6fe301 317tui_horizontal_source_scroll (struct tui_win_info *win_info,
2a8854a7 318 enum tui_scroll_direction direction,
6ba8e26f 319 int num_to_scroll)
c906108c 320{
6d012f14 321 if (win_info->generic.content != NULL)
c906108c 322 {
13274fc3 323 struct gdbarch *gdbarch = win_info->detail.source_info.gdbarch;
c906108c 324 int offset;
aefc7064 325 struct symtab *s = NULL;
c906108c 326
aefc7064
PA
327 if (win_info->generic.type == SRC_WIN)
328 {
9a2b4c1b
MS
329 struct symtab_and_line cursal
330 = get_current_source_symtab_and_line ();
1c5313c5 331
aefc7064 332 if (cursal.symtab == NULL)
34248c3a 333 s = find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)));
aefc7064
PA
334 else
335 s = cursal.symtab;
336 }
c906108c
SS
337
338 if (direction == LEFT_SCROLL)
9a2b4c1b
MS
339 offset = win_info->detail.source_info.horizontal_offset
340 + num_to_scroll;
c906108c
SS
341 else
342 {
a743e542
MS
343 offset = win_info->detail.source_info.horizontal_offset
344 - num_to_scroll;
345 if (offset < 0)
c906108c
SS
346 offset = 0;
347 }
6d012f14 348 win_info->detail.source_info.horizontal_offset = offset;
13274fc3 349 tui_update_source_window_as_is (win_info, gdbarch, s,
63ed8182
PP
350 win_info->generic.content[0]
351 ->which_element.source.line_or_addr,
f80bda8e 352 FALSE);
c906108c
SS
353 }
354
355 return;
6ba8e26f 356}
c906108c
SS
357
358
1cc6d956
MS
359/* Set or clear the has_break flag in the line whose line is
360 line_no. */
361
c906108c 362void
08ef48c5
MS
363tui_set_is_exec_point_at (struct tui_line_or_address l,
364 struct tui_win_info *win_info)
c906108c 365{
00b90ae2 366 int changed = 0;
c906108c 367 int i;
6d012f14 368 tui_win_content content = (tui_win_content) win_info->generic.content;
c906108c
SS
369
370 i = 0;
6d012f14 371 while (i < win_info->generic.content_size)
c906108c 372 {
6ba8e26f 373 int new_state;
362c05fe
AS
374 struct tui_line_or_address content_loa =
375 content[i]->which_element.source.line_or_addr;
376
377 gdb_assert (l.loa == LOA_ADDRESS || l.loa == LOA_LINE);
378 gdb_assert (content_loa.loa == LOA_LINE
379 || content_loa.loa == LOA_ADDRESS);
380 if (content_loa.loa == l.loa
381 && ((l.loa == LOA_LINE && content_loa.u.line_no == l.u.line_no)
382 || (content_loa.u.addr == l.u.addr)))
6ba8e26f 383 new_state = TRUE;
c906108c 384 else
6ba8e26f
AC
385 new_state = FALSE;
386 if (new_state != content[i]->which_element.source.is_exec_point)
00b90ae2
SC
387 {
388 changed++;
6ba8e26f 389 content[i]->which_element.source.is_exec_point = new_state;
6d012f14 390 tui_show_source_line (win_info, i + 1);
00b90ae2 391 }
c906108c
SS
392 i++;
393 }
00b90ae2 394 if (changed)
6d012f14 395 tui_refresh_win (&win_info->generic);
00b90ae2 396}
c906108c 397
00b2bad4
SC
398/* Update the execution windows to show the active breakpoints.
399 This is called whenever a breakpoint is inserted, removed or
400 has its state changed. */
c906108c 401void
d02c80cd 402tui_update_all_breakpoint_info (void)
c906108c 403{
2a8854a7 404 struct tui_list *list = tui_source_windows ();
c906108c 405 int i;
c906108c 406
00b2bad4 407 for (i = 0; i < list->count; i++)
c906108c 408 {
5b6fe301 409 struct tui_win_info *win = list->list[i];
c906108c 410
00b2bad4
SC
411 if (tui_update_breakpoint_info (win, FALSE))
412 {
f80bda8e 413 tui_update_exec_info (win);
00b2bad4 414 }
c906108c 415 }
00b2bad4 416}
c906108c
SS
417
418
1cc6d956
MS
419/* Scan the source window and the breakpoints to update the has_break
420 information for each line.
421
422 Returns 1 if something changed and the execution window must be
423 refreshed. */
424
00b2bad4 425int
08ef48c5
MS
426tui_update_breakpoint_info (struct tui_win_info *win,
427 int current_only)
c906108c
SS
428{
429 int i;
00b2bad4 430 int need_refresh = 0;
5b6fe301 431 struct tui_source_info *src = &win->detail.source_info;
c906108c 432
6d012f14 433 for (i = 0; i < win->generic.content_size; i++)
00b2bad4
SC
434 {
435 struct breakpoint *bp;
436 extern struct breakpoint *breakpoint_chain;
437 int mode;
5b6fe301 438 struct tui_source_element *line;
00b2bad4 439
63ed8182 440 line = &win->generic.content[i]->which_element.source;
6d012f14 441 if (current_only && !line->is_exec_point)
00b2bad4
SC
442 continue;
443
444 /* Scan each breakpoint to see if the current line has something to
445 do with it. Identify enable/disabled breakpoints as well as
446 those that we already hit. */
447 mode = 0;
448 for (bp = breakpoint_chain;
449 bp != (struct breakpoint *) NULL;
450 bp = bp->next)
451 {
f8eba3c6
TT
452 struct bp_location *loc;
453
362c05fe
AS
454 gdb_assert (line->line_or_addr.loa == LOA_LINE
455 || line->line_or_addr.loa == LOA_ADDRESS);
f8eba3c6
TT
456
457 for (loc = bp->loc; loc != NULL; loc = loc->next)
458 {
459 if ((win == TUI_SRC_WIN
2f202fde 460 && loc->symtab != NULL
aa079c93
JK
461 && filename_cmp (src->fullname,
462 symtab_to_fullname (loc->symtab)) == 0
f8eba3c6
TT
463 && line->line_or_addr.loa == LOA_LINE
464 && loc->line_number == line->line_or_addr.u.line_no)
465 || (win == TUI_DISASM_WIN
466 && line->line_or_addr.loa == LOA_ADDRESS
467 && loc->address == line->line_or_addr.u.addr))
468 {
469 if (bp->enable_state == bp_disabled)
470 mode |= TUI_BP_DISABLED;
471 else
472 mode |= TUI_BP_ENABLED;
473 if (bp->hit_count)
474 mode |= TUI_BP_HIT;
475 if (bp->loc->cond)
476 mode |= TUI_BP_CONDITIONAL;
477 if (bp->type == bp_hardware_breakpoint)
478 mode |= TUI_BP_HARDWARE;
479 }
480 }
00b2bad4 481 }
6d012f14 482 if (line->has_break != mode)
00b2bad4 483 {
6d012f14 484 line->has_break = mode;
00b2bad4
SC
485 need_refresh = 1;
486 }
487 }
488 return need_refresh;
489}
c906108c 490
c906108c 491
6ba8e26f
AC
492/* Function to initialize the content of the execution info window,
493 based upon the input window which is either the source or
494 disassembly window. */
22940a24 495enum tui_status
5b6fe301 496tui_set_exec_info_content (struct tui_win_info *win_info)
c906108c 497{
22940a24 498 enum tui_status ret = TUI_SUCCESS;
c906108c 499
9a2b4c1b
MS
500 if (win_info->detail.source_info.execution_info
501 != (struct tui_gen_win_info *) NULL)
c906108c 502 {
9a2b4c1b
MS
503 struct tui_gen_win_info *exec_info_ptr
504 = win_info->detail.source_info.execution_info;
c906108c 505
6ba8e26f
AC
506 if (exec_info_ptr->content == NULL)
507 exec_info_ptr->content =
63ed8182 508 tui_alloc_content (win_info->generic.height, exec_info_ptr->type);
6ba8e26f 509 if (exec_info_ptr->content != NULL)
c906108c
SS
510 {
511 int i;
512
6d012f14
AC
513 tui_update_breakpoint_info (win_info, 1);
514 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 515 {
5b6fe301
MS
516 struct tui_win_element *element;
517 struct tui_win_element *src_element;
00b2bad4 518 int mode;
c906108c 519
63ed8182
PP
520 element = exec_info_ptr->content[i];
521 src_element = win_info->generic.content[i];
00b2bad4 522
6d012f14
AC
523 memset(element->which_element.simple_string, ' ',
524 sizeof(element->which_element.simple_string));
525 element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
00b2bad4
SC
526
527 /* Now update the exec info content based upon the state
528 of each line as indicated by the source content. */
6ba8e26f 529 mode = src_element->which_element.source.has_break;
00b2bad4 530 if (mode & TUI_BP_HIT)
6d012f14 531 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
532 (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
533 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
6d012f14 534 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
535 (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
536
537 if (mode & TUI_BP_ENABLED)
6d012f14 538 element->which_element.simple_string[TUI_BP_BREAK_POS] = '+';
00b2bad4 539 else if (mode & TUI_BP_DISABLED)
6d012f14 540 element->which_element.simple_string[TUI_BP_BREAK_POS] = '-';
00b2bad4 541
6ba8e26f 542 if (src_element->which_element.source.is_exec_point)
6d012f14 543 element->which_element.simple_string[TUI_EXEC_POS] = '>';
c906108c 544 }
6ba8e26f 545 exec_info_ptr->content_size = win_info->generic.content_size;
c906108c
SS
546 }
547 else
548 ret = TUI_FAILURE;
549 }
550
551 return ret;
00b2bad4 552}
c906108c
SS
553
554
c906108c 555void
5b6fe301 556tui_show_exec_info_content (struct tui_win_info *win_info)
c906108c 557{
9a2b4c1b
MS
558 struct tui_gen_win_info *exec_info
559 = win_info->detail.source_info.execution_info;
6ba8e26f
AC
560 int cur_line;
561
562 werase (exec_info->handle);
563 tui_refresh_win (exec_info);
564 for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++)
565 mvwaddstr (exec_info->handle,
566 cur_line,
c906108c 567 0,
63ed8182 568 exec_info->content[cur_line - 1]->which_element.simple_string);
6ba8e26f
AC
569 tui_refresh_win (exec_info);
570 exec_info->content_in_use = TRUE;
f80bda8e 571}
c906108c
SS
572
573
c906108c 574void
5b6fe301 575tui_erase_exec_info_content (struct tui_win_info *win_info)
c906108c 576{
9a2b4c1b
MS
577 struct tui_gen_win_info *exec_info
578 = win_info->detail.source_info.execution_info;
c906108c 579
6ba8e26f
AC
580 werase (exec_info->handle);
581 tui_refresh_win (exec_info);
f80bda8e 582}
c906108c 583
c906108c 584void
5b6fe301 585tui_clear_exec_info_content (struct tui_win_info *win_info)
c906108c 586{
6d012f14
AC
587 win_info->detail.source_info.execution_info->content_in_use = FALSE;
588 tui_erase_exec_info_content (win_info);
c906108c
SS
589
590 return;
f80bda8e 591}
c906108c 592
f80bda8e 593/* Function to update the execution info window. */
c906108c 594void
5b6fe301 595tui_update_exec_info (struct tui_win_info *win_info)
c906108c 596{
6ba8e26f
AC
597 tui_set_exec_info_content (win_info);
598 tui_show_exec_info_content (win_info);
599}
c906108c 600
f80bda8e 601enum tui_status
6d012f14 602tui_alloc_source_buffer (struct tui_win_info *win_info)
c906108c 603{
d02c80cd
AC
604 char *src_line_buf;
605 int i, line_width, max_lines;
c906108c 606
1cc6d956 607 max_lines = win_info->generic.height; /* Less the highlight box. */
6ba8e26f 608 line_width = win_info->generic.width - 1;
c906108c 609 /*
81b7c67a
MS
610 * Allocate the buffer for the source lines. Do this only once
611 * since they will be re-used for all source displays. The only
612 * other time this will be done is when a window's size changes.
c5aa993b 613 */
6d012f14 614 if (win_info->generic.content == NULL)
c906108c 615 {
81b7c67a
MS
616 src_line_buf = (char *)
617 xmalloc ((max_lines * line_width) * sizeof (char));
6ba8e26f 618 if (src_line_buf == (char *) NULL)
c906108c 619 {
9a2b4c1b
MS
620 fputs_unfiltered ("Unable to Allocate Memory for "
621 "Source or Disassembly Display.\n",
81b7c67a
MS
622 gdb_stderr);
623 return TUI_FAILURE;
624 }
1cc6d956 625 /* Allocate the content list. */
63ed8182
PP
626 win_info->generic.content = tui_alloc_content (max_lines, SRC_WIN);
627 if (win_info->generic.content == NULL)
81b7c67a
MS
628 {
629 xfree (src_line_buf);
9a2b4c1b
MS
630 fputs_unfiltered ("Unable to Allocate Memory for "
631 "Source or Disassembly Display.\n",
81b7c67a
MS
632 gdb_stderr);
633 return TUI_FAILURE;
c906108c 634 }
6ba8e26f 635 for (i = 0; i < max_lines; i++)
63ed8182
PP
636 win_info->generic.content[i]->which_element.source.line
637 = src_line_buf + (line_width * i);
c906108c 638 }
c906108c 639
81b7c67a 640 return TUI_SUCCESS;
6ba8e26f 641}
c906108c
SS
642
643
766062f6 644/* Answer whether a particular line number or address is displayed
f80bda8e 645 in the current source window. */
c906108c 646int
08ef48c5
MS
647tui_line_is_displayed (int line,
648 struct tui_win_info *win_info,
6ba8e26f 649 int check_threshold)
c906108c 650{
6ba8e26f 651 int is_displayed = FALSE;
c906108c
SS
652 int i, threshold;
653
6ba8e26f 654 if (check_threshold)
c906108c
SS
655 threshold = SCROLL_THRESHOLD;
656 else
657 threshold = 0;
658 i = 0;
e5908723
MS
659 while (i < win_info->generic.content_size - threshold
660 && !is_displayed)
c906108c 661 {
63ed8182
PP
662 is_displayed
663 = win_info->generic.content[i]
664 ->which_element.source.line_or_addr.loa == LOA_LINE
665 && win_info->generic.content[i]
666 ->which_element.source.line_or_addr.u.line_no == (int) line;
c906108c
SS
667 i++;
668 }
669
6ba8e26f 670 return is_displayed;
f80bda8e 671}
c906108c
SS
672
673
766062f6 674/* Answer whether a particular line number or address is displayed
f80bda8e 675 in the current source window. */
a4b99e53 676int
08ef48c5
MS
677tui_addr_is_displayed (CORE_ADDR addr,
678 struct tui_win_info *win_info,
679 int check_threshold)
a4b99e53 680{
6ba8e26f 681 int is_displayed = FALSE;
a4b99e53
SC
682 int i, threshold;
683
6ba8e26f 684 if (check_threshold)
a4b99e53
SC
685 threshold = SCROLL_THRESHOLD;
686 else
687 threshold = 0;
688 i = 0;
e5908723
MS
689 while (i < win_info->generic.content_size - threshold
690 && !is_displayed)
a4b99e53 691 {
63ed8182
PP
692 is_displayed
693 = win_info->generic.content[i]
694 ->which_element.source.line_or_addr.loa == LOA_ADDRESS
695 && win_info->generic.content[i]
696 ->which_element.source.line_or_addr.u.addr == addr;
a4b99e53
SC
697 i++;
698 }
699
6ba8e26f 700 return is_displayed;
a4b99e53
SC
701}
702
703
c906108c
SS
704/*****************************************
705** STATIC LOCAL FUNCTIONS **
706******************************************/
This page took 1.654073 seconds and 4 git commands to generate.