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