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