Introduce has_locator 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{
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 {
b4eb2452 162 for (struct tui_win_info *win_info : tui_source_windows ())
c906108c 163 {
6d012f14
AC
164 tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT);
165 tui_clear_exec_info_content (win_info);
c906108c
SS
166 }
167 }
6ba8e26f 168}
c906108c 169
f80bda8e
AC
170/* Function to ensure that the source and/or disassemly windows
171 reflect the input address. */
c906108c 172void
f80bda8e 173tui_update_source_windows_with_line (struct symtab *s, int line)
c906108c 174{
13274fc3 175 struct gdbarch *gdbarch;
84b1e7c7 176 CORE_ADDR pc;
362c05fe 177 struct tui_line_or_address l;
13274fc3
UW
178
179 if (!s)
180 return;
181
eb822aa6 182 gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s));
13274fc3 183
dd1abb8c 184 switch (tui_current_layout ())
c906108c
SS
185 {
186 case DISASSEM_COMMAND:
187 case DISASSEM_DATA_COMMAND:
84b1e7c7 188 find_line_pc (s, line, &pc);
13274fc3 189 tui_update_source_windows_with_addr (gdbarch, pc);
c906108c
SS
190 break;
191 default:
362c05fe
AS
192 l.loa = LOA_LINE;
193 l.u.line_no = line;
13274fc3 194 tui_show_symtab_source (gdbarch, s, l, FALSE);
dd1abb8c 195 if (tui_current_layout () == SRC_DISASSEM_COMMAND)
84b1e7c7
SC
196 {
197 find_line_pc (s, line, &pc);
13274fc3 198 tui_show_disassem (gdbarch, pc);
84b1e7c7 199 }
c906108c
SS
200 break;
201 }
202
203 return;
f80bda8e 204}
c906108c 205
c906108c 206void
08ef48c5
MS
207tui_clear_source_content (struct tui_win_info *win_info,
208 int display_prompt)
c906108c 209{
6d012f14 210 if (win_info != NULL)
c906108c 211 {
d02c80cd 212 int i;
c906108c 213
6d012f14 214 win_info->generic.content_in_use = FALSE;
6ba8e26f 215 tui_erase_source_content (win_info, display_prompt);
6d012f14 216 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 217 {
63ed8182 218 struct tui_win_element *element = win_info->generic.content[i];
1c5313c5 219
6d012f14
AC
220 element->which_element.source.has_break = FALSE;
221 element->which_element.source.is_exec_point = FALSE;
c906108c
SS
222 }
223 }
6ba8e26f 224}
c906108c
SS
225
226
c906108c 227void
08ef48c5
MS
228tui_erase_source_content (struct tui_win_info *win_info,
229 int display_prompt)
c906108c 230{
6ba8e26f
AC
231 int x_pos;
232 int half_width = (win_info->generic.width - 2) / 2;
c906108c 233
cafb3438 234 if (win_info->generic.handle != NULL)
c906108c 235 {
6d012f14
AC
236 werase (win_info->generic.handle);
237 tui_check_and_display_highlight_if_needed (win_info);
6ba8e26f 238 if (display_prompt == EMPTY_SOURCE_PROMPT)
c906108c 239 {
a121b7c1 240 const char *no_src_str;
c906108c 241
6d012f14 242 if (win_info->generic.type == SRC_WIN)
6ba8e26f 243 no_src_str = NO_SRC_STRING;
c906108c 244 else
6ba8e26f
AC
245 no_src_str = NO_DISASSEM_STRING;
246 if (strlen (no_src_str) >= half_width)
247 x_pos = 1;
c906108c 248 else
6ba8e26f 249 x_pos = half_width - strlen (no_src_str);
6d012f14
AC
250 mvwaddstr (win_info->generic.handle,
251 (win_info->generic.height / 2),
6ba8e26f 252 x_pos,
7a6e7fcc 253 (char *) no_src_str);
c906108c 254
1cc6d956
MS
255 /* elz: Added this function call to set the real contents of
256 the window to what is on the screen, so that later calls
257 to refresh, do display the correct stuff, and not the old
258 image. */
c906108c 259
6ba8e26f 260 tui_set_source_content_nil (win_info, no_src_str);
c906108c 261 }
6d012f14 262 tui_refresh_win (&win_info->generic);
c906108c 263 }
6ba8e26f 264}
c906108c
SS
265
266
bc712bbf
SC
267/* Redraw the complete line of a source or disassembly window. */
268static void
5b6fe301 269tui_show_source_line (struct tui_win_info *win_info, int lineno)
bc712bbf 270{
5b6fe301 271 struct tui_win_element *line;
798e1c30 272 int x;
bc712bbf 273
63ed8182 274 line = win_info->generic.content[lineno - 1];
6d012f14 275 if (line->which_element.source.is_exec_point)
55c10aca 276 tui_set_reverse_mode (win_info->generic.handle, true);
bc712bbf 277
62f29fda
TT
278 wmove (win_info->generic.handle, lineno, 1);
279 tui_puts (line->which_element.source.line,
280 win_info->generic.handle);
6d012f14 281 if (line->which_element.source.is_exec_point)
55c10aca 282 tui_set_reverse_mode (win_info->generic.handle, false);
bc712bbf
SC
283
284 /* Clear to end of line but stop before the border. */
798e1c30
EZ
285 x = getcurx (win_info->generic.handle);
286 while (x + 1 < win_info->generic.width)
287 {
288 waddch (win_info->generic.handle, ' ');
289 x = getcurx (win_info->generic.handle);
290 }
bc712bbf
SC
291}
292
c906108c 293void
5b6fe301 294tui_show_source_content (struct tui_win_info *win_info)
c906108c 295{
6d012f14 296 if (win_info->generic.content_size > 0)
c906108c 297 {
bc712bbf
SC
298 int lineno;
299
6d012f14
AC
300 for (lineno = 1; lineno <= win_info->generic.content_size; lineno++)
301 tui_show_source_line (win_info, lineno);
c906108c 302 }
bc712bbf 303 else
6d012f14 304 tui_erase_source_content (win_info, TRUE);
bc712bbf 305
6d012f14
AC
306 tui_check_and_display_highlight_if_needed (win_info);
307 tui_refresh_win (&win_info->generic);
308 win_info->generic.content_in_use = TRUE;
bc712bbf 309}
c906108c 310
6f11e682
TT
311/* Refill the source window's source cache and update it. If WIN_INFO
312 is a disassembly window, then just update it. */
313
314void
315tui_refill_source_window (struct tui_win_info *win_info)
316{
317 symtab *s = nullptr;
318
319 if (win_info->generic.type == SRC_WIN)
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
327 tui_update_source_window_as_is (win_info,
328 win_info->detail.source_info.gdbarch,
329 s,
330 win_info->generic.content[0]
331 ->which_element.source.line_or_addr,
332 FALSE);
333}
c906108c 334
f80bda8e 335/* Scroll the source forward or backward horizontally. */
6f11e682 336
c906108c 337void
13446e05
TT
338tui_source_window_base::do_scroll_horizontal
339 (enum tui_scroll_direction direction, int num_to_scroll)
c906108c 340{
13446e05 341 if (generic.content != NULL)
c906108c
SS
342 {
343 int offset;
c906108c
SS
344
345 if (direction == LEFT_SCROLL)
13446e05 346 offset = detail.source_info.horizontal_offset
9a2b4c1b 347 + num_to_scroll;
c906108c
SS
348 else
349 {
13446e05 350 offset = detail.source_info.horizontal_offset
a743e542
MS
351 - num_to_scroll;
352 if (offset < 0)
c906108c
SS
353 offset = 0;
354 }
13446e05
TT
355 detail.source_info.horizontal_offset = offset;
356 tui_refill_source_window (this);
c906108c 357 }
6ba8e26f 358}
c906108c
SS
359
360
1cc6d956
MS
361/* Set or clear the has_break flag in the line whose line is
362 line_no. */
363
c906108c 364void
08ef48c5
MS
365tui_set_is_exec_point_at (struct tui_line_or_address l,
366 struct tui_win_info *win_info)
c906108c 367{
00b90ae2 368 int changed = 0;
c906108c 369 int i;
63a33118 370 tui_win_content content = win_info->generic.content;
c906108c
SS
371
372 i = 0;
6d012f14 373 while (i < win_info->generic.content_size)
c906108c 374 {
6ba8e26f 375 int new_state;
362c05fe
AS
376 struct tui_line_or_address content_loa =
377 content[i]->which_element.source.line_or_addr;
378
379 gdb_assert (l.loa == LOA_ADDRESS || l.loa == LOA_LINE);
380 gdb_assert (content_loa.loa == LOA_LINE
381 || content_loa.loa == LOA_ADDRESS);
382 if (content_loa.loa == l.loa
383 && ((l.loa == LOA_LINE && content_loa.u.line_no == l.u.line_no)
384 || (content_loa.u.addr == l.u.addr)))
6ba8e26f 385 new_state = TRUE;
c906108c 386 else
6ba8e26f
AC
387 new_state = FALSE;
388 if (new_state != content[i]->which_element.source.is_exec_point)
00b90ae2
SC
389 {
390 changed++;
6ba8e26f 391 content[i]->which_element.source.is_exec_point = new_state;
6d012f14 392 tui_show_source_line (win_info, i + 1);
00b90ae2 393 }
c906108c
SS
394 i++;
395 }
00b90ae2 396 if (changed)
f7f0a123 397 tui_refill_source_window (win_info);
00b90ae2 398}
c906108c 399
00b2bad4
SC
400/* Update the execution windows to show the active breakpoints.
401 This is called whenever a breakpoint is inserted, removed or
402 has its state changed. */
c906108c 403void
b4eb2452 404tui_update_all_breakpoint_info ()
c906108c 405{
b4eb2452 406 for (tui_win_info *win : tui_source_windows ())
c906108c 407 {
00b2bad4
SC
408 if (tui_update_breakpoint_info (win, FALSE))
409 {
f80bda8e 410 tui_update_exec_info (win);
00b2bad4 411 }
c906108c 412 }
00b2bad4 413}
c906108c
SS
414
415
1cc6d956
MS
416/* Scan the source window and the breakpoints to update the has_break
417 information for each line.
418
419 Returns 1 if something changed and the execution window must be
420 refreshed. */
421
00b2bad4 422int
08ef48c5
MS
423tui_update_breakpoint_info (struct tui_win_info *win,
424 int current_only)
c906108c
SS
425{
426 int i;
00b2bad4 427 int need_refresh = 0;
5b6fe301 428 struct tui_source_info *src = &win->detail.source_info;
c906108c 429
6d012f14 430 for (i = 0; i < win->generic.content_size; i++)
00b2bad4
SC
431 {
432 struct breakpoint *bp;
433 extern struct breakpoint *breakpoint_chain;
434 int mode;
5b6fe301 435 struct tui_source_element *line;
00b2bad4 436
63ed8182 437 line = &win->generic.content[i]->which_element.source;
6d012f14 438 if (current_only && !line->is_exec_point)
00b2bad4
SC
439 continue;
440
441 /* Scan each breakpoint to see if the current line has something to
442 do with it. Identify enable/disabled breakpoints as well as
443 those that we already hit. */
444 mode = 0;
445 for (bp = breakpoint_chain;
cafb3438 446 bp != NULL;
00b2bad4
SC
447 bp = bp->next)
448 {
f8eba3c6
TT
449 struct bp_location *loc;
450
362c05fe
AS
451 gdb_assert (line->line_or_addr.loa == LOA_LINE
452 || line->line_or_addr.loa == LOA_ADDRESS);
f8eba3c6
TT
453
454 for (loc = bp->loc; loc != NULL; loc = loc->next)
455 {
456 if ((win == TUI_SRC_WIN
2f202fde 457 && loc->symtab != NULL
aa079c93
JK
458 && filename_cmp (src->fullname,
459 symtab_to_fullname (loc->symtab)) == 0
f8eba3c6
TT
460 && line->line_or_addr.loa == LOA_LINE
461 && loc->line_number == line->line_or_addr.u.line_no)
462 || (win == TUI_DISASM_WIN
463 && line->line_or_addr.loa == LOA_ADDRESS
464 && loc->address == line->line_or_addr.u.addr))
465 {
466 if (bp->enable_state == bp_disabled)
467 mode |= TUI_BP_DISABLED;
468 else
469 mode |= TUI_BP_ENABLED;
470 if (bp->hit_count)
471 mode |= TUI_BP_HIT;
472 if (bp->loc->cond)
473 mode |= TUI_BP_CONDITIONAL;
474 if (bp->type == bp_hardware_breakpoint)
475 mode |= TUI_BP_HARDWARE;
476 }
477 }
00b2bad4 478 }
6d012f14 479 if (line->has_break != mode)
00b2bad4 480 {
6d012f14 481 line->has_break = mode;
00b2bad4
SC
482 need_refresh = 1;
483 }
484 }
485 return need_refresh;
486}
c906108c 487
c906108c 488
6ba8e26f
AC
489/* Function to initialize the content of the execution info window,
490 based upon the input window which is either the source or
491 disassembly window. */
22940a24 492enum tui_status
5b6fe301 493tui_set_exec_info_content (struct tui_win_info *win_info)
c906108c 494{
22940a24 495 enum tui_status ret = TUI_SUCCESS;
c906108c 496
cafb3438 497 if (win_info->detail.source_info.execution_info != NULL)
c906108c 498 {
9a2b4c1b
MS
499 struct tui_gen_win_info *exec_info_ptr
500 = win_info->detail.source_info.execution_info;
c906108c 501
6ba8e26f
AC
502 if (exec_info_ptr->content == NULL)
503 exec_info_ptr->content =
63ed8182 504 tui_alloc_content (win_info->generic.height, exec_info_ptr->type);
6ba8e26f 505 if (exec_info_ptr->content != NULL)
c906108c
SS
506 {
507 int i;
508
6d012f14
AC
509 tui_update_breakpoint_info (win_info, 1);
510 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 511 {
5b6fe301
MS
512 struct tui_win_element *element;
513 struct tui_win_element *src_element;
00b2bad4 514 int mode;
c906108c 515
63ed8182
PP
516 element = exec_info_ptr->content[i];
517 src_element = win_info->generic.content[i];
00b2bad4 518
6d012f14
AC
519 memset(element->which_element.simple_string, ' ',
520 sizeof(element->which_element.simple_string));
521 element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
00b2bad4
SC
522
523 /* Now update the exec info content based upon the state
524 of each line as indicated by the source content. */
6ba8e26f 525 mode = src_element->which_element.source.has_break;
00b2bad4 526 if (mode & TUI_BP_HIT)
6d012f14 527 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
528 (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
529 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
6d012f14 530 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
531 (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
532
533 if (mode & TUI_BP_ENABLED)
6d012f14 534 element->which_element.simple_string[TUI_BP_BREAK_POS] = '+';
00b2bad4 535 else if (mode & TUI_BP_DISABLED)
6d012f14 536 element->which_element.simple_string[TUI_BP_BREAK_POS] = '-';
00b2bad4 537
6ba8e26f 538 if (src_element->which_element.source.is_exec_point)
6d012f14 539 element->which_element.simple_string[TUI_EXEC_POS] = '>';
c906108c 540 }
6ba8e26f 541 exec_info_ptr->content_size = win_info->generic.content_size;
c906108c
SS
542 }
543 else
544 ret = TUI_FAILURE;
545 }
546
547 return ret;
00b2bad4 548}
c906108c
SS
549
550
c906108c 551void
5b6fe301 552tui_show_exec_info_content (struct tui_win_info *win_info)
c906108c 553{
9a2b4c1b
MS
554 struct tui_gen_win_info *exec_info
555 = win_info->detail.source_info.execution_info;
6ba8e26f
AC
556 int cur_line;
557
558 werase (exec_info->handle);
559 tui_refresh_win (exec_info);
560 for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++)
561 mvwaddstr (exec_info->handle,
562 cur_line,
c906108c 563 0,
7a6e7fcc
RO
564 (char *) exec_info->content[cur_line - 1]
565 ->which_element.simple_string);
6ba8e26f
AC
566 tui_refresh_win (exec_info);
567 exec_info->content_in_use = TRUE;
f80bda8e 568}
c906108c
SS
569
570
c906108c 571void
5b6fe301 572tui_erase_exec_info_content (struct tui_win_info *win_info)
c906108c 573{
9a2b4c1b
MS
574 struct tui_gen_win_info *exec_info
575 = win_info->detail.source_info.execution_info;
c906108c 576
6ba8e26f
AC
577 werase (exec_info->handle);
578 tui_refresh_win (exec_info);
f80bda8e 579}
c906108c 580
c906108c 581void
5b6fe301 582tui_clear_exec_info_content (struct tui_win_info *win_info)
c906108c 583{
6d012f14
AC
584 win_info->detail.source_info.execution_info->content_in_use = FALSE;
585 tui_erase_exec_info_content (win_info);
c906108c
SS
586
587 return;
f80bda8e 588}
c906108c 589
f80bda8e 590/* Function to update the execution info window. */
c906108c 591void
5b6fe301 592tui_update_exec_info (struct tui_win_info *win_info)
c906108c 593{
6ba8e26f
AC
594 tui_set_exec_info_content (win_info);
595 tui_show_exec_info_content (win_info);
596}
c906108c 597
f80bda8e 598enum tui_status
6d012f14 599tui_alloc_source_buffer (struct tui_win_info *win_info)
c906108c 600{
d02c80cd 601 int i, line_width, max_lines;
c906108c 602
7bc2c8b8
AA
603 /* The window width/height includes the highlight box. Determine actual
604 content dimensions, including string null-terminators. */
605 max_lines = win_info->generic.height - 2;
606 line_width = win_info->generic.width - 2 + 1;
607
62f29fda 608 /* Allocate the buffer for the source lines. */
6d012f14 609 if (win_info->generic.content == NULL)
c906108c 610 {
1cc6d956 611 /* Allocate the content list. */
63ed8182 612 win_info->generic.content = tui_alloc_content (max_lines, SRC_WIN);
6ba8e26f 613 for (i = 0; i < max_lines; i++)
63ed8182 614 win_info->generic.content[i]->which_element.source.line
62f29fda 615 = (char *) xmalloc (line_width);
c906108c 616 }
c906108c 617
81b7c67a 618 return TUI_SUCCESS;
6ba8e26f 619}
c906108c
SS
620
621
766062f6 622/* Answer whether a particular line number or address is displayed
f80bda8e 623 in the current source window. */
c906108c 624int
08ef48c5
MS
625tui_line_is_displayed (int line,
626 struct tui_win_info *win_info,
6ba8e26f 627 int check_threshold)
c906108c 628{
6ba8e26f 629 int is_displayed = FALSE;
c906108c
SS
630 int i, threshold;
631
6ba8e26f 632 if (check_threshold)
c906108c
SS
633 threshold = SCROLL_THRESHOLD;
634 else
635 threshold = 0;
636 i = 0;
e5908723
MS
637 while (i < win_info->generic.content_size - threshold
638 && !is_displayed)
c906108c 639 {
63ed8182
PP
640 is_displayed
641 = win_info->generic.content[i]
642 ->which_element.source.line_or_addr.loa == LOA_LINE
643 && win_info->generic.content[i]
63a33118 644 ->which_element.source.line_or_addr.u.line_no == line;
c906108c
SS
645 i++;
646 }
647
6ba8e26f 648 return is_displayed;
f80bda8e 649}
c906108c
SS
650
651
766062f6 652/* Answer whether a particular line number or address is displayed
f80bda8e 653 in the current source window. */
a4b99e53 654int
08ef48c5
MS
655tui_addr_is_displayed (CORE_ADDR addr,
656 struct tui_win_info *win_info,
657 int check_threshold)
a4b99e53 658{
6ba8e26f 659 int is_displayed = FALSE;
a4b99e53
SC
660 int i, threshold;
661
6ba8e26f 662 if (check_threshold)
a4b99e53
SC
663 threshold = SCROLL_THRESHOLD;
664 else
665 threshold = 0;
666 i = 0;
e5908723
MS
667 while (i < win_info->generic.content_size - threshold
668 && !is_displayed)
a4b99e53 669 {
63ed8182
PP
670 is_displayed
671 = win_info->generic.content[i]
672 ->which_element.source.line_or_addr.loa == LOA_ADDRESS
673 && win_info->generic.content[i]
674 ->which_element.source.line_or_addr.u.addr == addr;
a4b99e53
SC
675 i++;
676 }
677
6ba8e26f 678 return is_displayed;
a4b99e53
SC
679}
680
681
c906108c
SS
682/*****************************************
683** STATIC LOCAL FUNCTIONS **
684******************************************/
This page took 2.103315 seconds and 4 git commands to generate.