Fix scrolling right in the TUI
[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;
798e1c30 276 int x;
bc712bbf 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
62f29fda
TT
282 wmove (win_info->generic.handle, lineno, 1);
283 tui_puts (line->which_element.source.line,
284 win_info->generic.handle);
6d012f14
AC
285 if (line->which_element.source.is_exec_point)
286 wattroff (win_info->generic.handle, A_STANDOUT);
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;
456 bp != (struct breakpoint *) NULL;
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
9a2b4c1b
MS
507 if (win_info->detail.source_info.execution_info
508 != (struct tui_gen_win_info *) NULL)
c906108c 509 {
9a2b4c1b
MS
510 struct tui_gen_win_info *exec_info_ptr
511 = win_info->detail.source_info.execution_info;
c906108c 512
6ba8e26f
AC
513 if (exec_info_ptr->content == NULL)
514 exec_info_ptr->content =
63ed8182 515 tui_alloc_content (win_info->generic.height, exec_info_ptr->type);
6ba8e26f 516 if (exec_info_ptr->content != NULL)
c906108c
SS
517 {
518 int i;
519
6d012f14
AC
520 tui_update_breakpoint_info (win_info, 1);
521 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 522 {
5b6fe301
MS
523 struct tui_win_element *element;
524 struct tui_win_element *src_element;
00b2bad4 525 int mode;
c906108c 526
63ed8182
PP
527 element = exec_info_ptr->content[i];
528 src_element = win_info->generic.content[i];
00b2bad4 529
6d012f14
AC
530 memset(element->which_element.simple_string, ' ',
531 sizeof(element->which_element.simple_string));
532 element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
00b2bad4
SC
533
534 /* Now update the exec info content based upon the state
535 of each line as indicated by the source content. */
6ba8e26f 536 mode = src_element->which_element.source.has_break;
00b2bad4 537 if (mode & TUI_BP_HIT)
6d012f14 538 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
539 (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
540 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
6d012f14 541 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
542 (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
543
544 if (mode & TUI_BP_ENABLED)
6d012f14 545 element->which_element.simple_string[TUI_BP_BREAK_POS] = '+';
00b2bad4 546 else if (mode & TUI_BP_DISABLED)
6d012f14 547 element->which_element.simple_string[TUI_BP_BREAK_POS] = '-';
00b2bad4 548
6ba8e26f 549 if (src_element->which_element.source.is_exec_point)
6d012f14 550 element->which_element.simple_string[TUI_EXEC_POS] = '>';
c906108c 551 }
6ba8e26f 552 exec_info_ptr->content_size = win_info->generic.content_size;
c906108c
SS
553 }
554 else
555 ret = TUI_FAILURE;
556 }
557
558 return ret;
00b2bad4 559}
c906108c
SS
560
561
c906108c 562void
5b6fe301 563tui_show_exec_info_content (struct tui_win_info *win_info)
c906108c 564{
9a2b4c1b
MS
565 struct tui_gen_win_info *exec_info
566 = win_info->detail.source_info.execution_info;
6ba8e26f
AC
567 int cur_line;
568
569 werase (exec_info->handle);
570 tui_refresh_win (exec_info);
571 for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++)
572 mvwaddstr (exec_info->handle,
573 cur_line,
c906108c 574 0,
7a6e7fcc
RO
575 (char *) exec_info->content[cur_line - 1]
576 ->which_element.simple_string);
6ba8e26f
AC
577 tui_refresh_win (exec_info);
578 exec_info->content_in_use = TRUE;
f80bda8e 579}
c906108c
SS
580
581
c906108c 582void
5b6fe301 583tui_erase_exec_info_content (struct tui_win_info *win_info)
c906108c 584{
9a2b4c1b
MS
585 struct tui_gen_win_info *exec_info
586 = win_info->detail.source_info.execution_info;
c906108c 587
6ba8e26f
AC
588 werase (exec_info->handle);
589 tui_refresh_win (exec_info);
f80bda8e 590}
c906108c 591
c906108c 592void
5b6fe301 593tui_clear_exec_info_content (struct tui_win_info *win_info)
c906108c 594{
6d012f14
AC
595 win_info->detail.source_info.execution_info->content_in_use = FALSE;
596 tui_erase_exec_info_content (win_info);
c906108c
SS
597
598 return;
f80bda8e 599}
c906108c 600
f80bda8e 601/* Function to update the execution info window. */
c906108c 602void
5b6fe301 603tui_update_exec_info (struct tui_win_info *win_info)
c906108c 604{
6ba8e26f
AC
605 tui_set_exec_info_content (win_info);
606 tui_show_exec_info_content (win_info);
607}
c906108c 608
f80bda8e 609enum tui_status
6d012f14 610tui_alloc_source_buffer (struct tui_win_info *win_info)
c906108c 611{
d02c80cd 612 int i, line_width, max_lines;
c906108c 613
7bc2c8b8
AA
614 /* The window width/height includes the highlight box. Determine actual
615 content dimensions, including string null-terminators. */
616 max_lines = win_info->generic.height - 2;
617 line_width = win_info->generic.width - 2 + 1;
618
62f29fda 619 /* Allocate the buffer for the source lines. */
6d012f14 620 if (win_info->generic.content == NULL)
c906108c 621 {
1cc6d956 622 /* Allocate the content list. */
63ed8182 623 win_info->generic.content = tui_alloc_content (max_lines, SRC_WIN);
6ba8e26f 624 for (i = 0; i < max_lines; i++)
63ed8182 625 win_info->generic.content[i]->which_element.source.line
62f29fda 626 = (char *) xmalloc (line_width);
c906108c 627 }
c906108c 628
81b7c67a 629 return TUI_SUCCESS;
6ba8e26f 630}
c906108c
SS
631
632
766062f6 633/* Answer whether a particular line number or address is displayed
f80bda8e 634 in the current source window. */
c906108c 635int
08ef48c5
MS
636tui_line_is_displayed (int line,
637 struct tui_win_info *win_info,
6ba8e26f 638 int check_threshold)
c906108c 639{
6ba8e26f 640 int is_displayed = FALSE;
c906108c
SS
641 int i, threshold;
642
6ba8e26f 643 if (check_threshold)
c906108c
SS
644 threshold = SCROLL_THRESHOLD;
645 else
646 threshold = 0;
647 i = 0;
e5908723
MS
648 while (i < win_info->generic.content_size - threshold
649 && !is_displayed)
c906108c 650 {
63ed8182
PP
651 is_displayed
652 = win_info->generic.content[i]
653 ->which_element.source.line_or_addr.loa == LOA_LINE
654 && win_info->generic.content[i]
63a33118 655 ->which_element.source.line_or_addr.u.line_no == line;
c906108c
SS
656 i++;
657 }
658
6ba8e26f 659 return is_displayed;
f80bda8e 660}
c906108c
SS
661
662
766062f6 663/* Answer whether a particular line number or address is displayed
f80bda8e 664 in the current source window. */
a4b99e53 665int
08ef48c5
MS
666tui_addr_is_displayed (CORE_ADDR addr,
667 struct tui_win_info *win_info,
668 int check_threshold)
a4b99e53 669{
6ba8e26f 670 int is_displayed = FALSE;
a4b99e53
SC
671 int i, threshold;
672
6ba8e26f 673 if (check_threshold)
a4b99e53
SC
674 threshold = SCROLL_THRESHOLD;
675 else
676 threshold = 0;
677 i = 0;
e5908723
MS
678 while (i < win_info->generic.content_size - threshold
679 && !is_displayed)
a4b99e53 680 {
63ed8182
PP
681 is_displayed
682 = win_info->generic.content[i]
683 ->which_element.source.line_or_addr.loa == LOA_ADDRESS
684 && win_info->generic.content[i]
685 ->which_element.source.line_or_addr.u.addr == addr;
a4b99e53
SC
686 i++;
687 }
688
6ba8e26f 689 return is_displayed;
a4b99e53
SC
690}
691
692
c906108c
SS
693/*****************************************
694** STATIC LOCAL FUNCTIONS **
695******************************************/
This page took 2.112807 seconds and 4 git commands to generate.