Introduce tui_gen_win_info::name 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
be4da588 72tui_update_source_window (struct tui_source_window_base *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{
be4da588 78 win_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
be4da588 88tui_update_source_window_as_is (struct tui_source_window_base *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
cb2ce893 96 if (win_info->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);
cb2ce893 111 if (win_info->type == SRC_WIN)
c906108c 112 {
51abb421
PA
113 symtab_and_line sal;
114
362c05fe 115 sal.line = line_or_addr.u.line_no +
cb2ce893 116 (win_info->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 {
ad54d15b 162 for (struct tui_source_window_base *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
cb2ce893 214 win_info->content_in_use = FALSE;
6ba8e26f 215 tui_erase_source_content (win_info, display_prompt);
cb2ce893 216 for (i = 0; i < win_info->content_size; i++)
c906108c 217 {
cb2ce893 218 struct tui_win_element *element = win_info->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 231 int x_pos;
cb2ce893 232 int half_width = (win_info->width - 2) / 2;
c906108c 233
cb2ce893 234 if (win_info->handle != NULL)
c906108c 235 {
cb2ce893 236 werase (win_info->handle);
6d012f14 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
cb2ce893 242 if (win_info->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);
cb2ce893
TT
250 mvwaddstr (win_info->handle,
251 (win_info->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 }
5b81daba 262 win_info->refresh_window ();
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
cb2ce893 274 line = win_info->content[lineno - 1];
6d012f14 275 if (line->which_element.source.is_exec_point)
cb2ce893 276 tui_set_reverse_mode (win_info->handle, true);
bc712bbf 277
cb2ce893 278 wmove (win_info->handle, lineno, 1);
62f29fda 279 tui_puts (line->which_element.source.line,
cb2ce893 280 win_info->handle);
6d012f14 281 if (line->which_element.source.is_exec_point)
cb2ce893 282 tui_set_reverse_mode (win_info->handle, false);
bc712bbf
SC
283
284 /* Clear to end of line but stop before the border. */
cb2ce893
TT
285 x = getcurx (win_info->handle);
286 while (x + 1 < win_info->width)
798e1c30 287 {
cb2ce893
TT
288 waddch (win_info->handle, ' ');
289 x = getcurx (win_info->handle);
798e1c30 290 }
bc712bbf
SC
291}
292
c906108c 293void
5b6fe301 294tui_show_source_content (struct tui_win_info *win_info)
c906108c 295{
cb2ce893 296 if (win_info->content_size > 0)
c906108c 297 {
bc712bbf
SC
298 int lineno;
299
cb2ce893 300 for (lineno = 1; lineno <= win_info->content_size; lineno++)
6d012f14 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 306 tui_check_and_display_highlight_if_needed (win_info);
5b81daba 307 win_info->refresh_window ();
cb2ce893 308 win_info->content_in_use = TRUE;
bc712bbf 309}
c906108c 310
ad54d15b 311/* See tui-data.h. */
6f11e682
TT
312
313void
ad54d15b 314tui_source_window_base::refill ()
6f11e682
TT
315{
316 symtab *s = nullptr;
317
cb2ce893 318 if (type == SRC_WIN)
6f11e682
TT
319 {
320 symtab_and_line cursal = get_current_source_symtab_and_line ();
321 s = (cursal.symtab == NULL
322 ? find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL)))
323 : cursal.symtab);
324 }
325
ad54d15b 326 tui_update_source_window_as_is (this, gdbarch, s,
cb2ce893 327 content[0]
6f11e682
TT
328 ->which_element.source.line_or_addr,
329 FALSE);
330}
c906108c 331
f80bda8e 332/* Scroll the source forward or backward horizontally. */
6f11e682 333
c906108c 334void
13446e05
TT
335tui_source_window_base::do_scroll_horizontal
336 (enum tui_scroll_direction direction, int num_to_scroll)
c906108c 337{
cb2ce893 338 if (content != NULL)
c906108c
SS
339 {
340 int offset;
c906108c
SS
341
342 if (direction == LEFT_SCROLL)
e6e41501 343 offset = horizontal_offset + num_to_scroll;
c906108c
SS
344 else
345 {
e6e41501 346 offset = horizontal_offset - num_to_scroll;
a743e542 347 if (offset < 0)
c906108c
SS
348 offset = 0;
349 }
e6e41501 350 horizontal_offset = offset;
ad54d15b 351 refill ();
c906108c 352 }
6ba8e26f 353}
c906108c
SS
354
355
1cc6d956
MS
356/* Set or clear the has_break flag in the line whose line is
357 line_no. */
358
c906108c 359void
ad54d15b 360tui_source_window_base::set_is_exec_point_at (struct tui_line_or_address l)
c906108c 361{
00b90ae2 362 int changed = 0;
c906108c 363 int i;
c906108c
SS
364
365 i = 0;
cb2ce893 366 while (i < 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;
ad54d15b 385 tui_show_source_line (this, i + 1);
00b90ae2 386 }
c906108c
SS
387 i++;
388 }
00b90ae2 389 if (changed)
ad54d15b 390 refill ();
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
b4eb2452 397tui_update_all_breakpoint_info ()
c906108c 398{
ad54d15b 399 for (tui_source_window_base *win : tui_source_windows ())
c906108c 400 {
00b2bad4
SC
401 if (tui_update_breakpoint_info (win, FALSE))
402 {
f80bda8e 403 tui_update_exec_info (win);
00b2bad4 404 }
c906108c 405 }
00b2bad4 406}
c906108c
SS
407
408
1cc6d956
MS
409/* Scan the source window and the breakpoints to update the has_break
410 information for each line.
411
412 Returns 1 if something changed and the execution window must be
413 refreshed. */
414
00b2bad4 415int
08ef48c5
MS
416tui_update_breakpoint_info (struct tui_win_info *win,
417 int current_only)
c906108c
SS
418{
419 int i;
00b2bad4 420 int need_refresh = 0;
e6e41501 421 tui_source_window_base *src = (tui_source_window_base *) win;
c906108c 422
cb2ce893 423 for (i = 0; i < win->content_size; i++)
00b2bad4
SC
424 {
425 struct breakpoint *bp;
426 extern struct breakpoint *breakpoint_chain;
427 int mode;
5b6fe301 428 struct tui_source_element *line;
00b2bad4 429
cb2ce893 430 line = &win->content[i]->which_element.source;
6d012f14 431 if (current_only && !line->is_exec_point)
00b2bad4
SC
432 continue;
433
434 /* Scan each breakpoint to see if the current line has something to
435 do with it. Identify enable/disabled breakpoints as well as
436 those that we already hit. */
437 mode = 0;
438 for (bp = breakpoint_chain;
cafb3438 439 bp != NULL;
00b2bad4
SC
440 bp = bp->next)
441 {
f8eba3c6
TT
442 struct bp_location *loc;
443
362c05fe
AS
444 gdb_assert (line->line_or_addr.loa == LOA_LINE
445 || line->line_or_addr.loa == LOA_ADDRESS);
f8eba3c6
TT
446
447 for (loc = bp->loc; loc != NULL; loc = loc->next)
448 {
449 if ((win == TUI_SRC_WIN
2f202fde 450 && loc->symtab != NULL
aa079c93
JK
451 && filename_cmp (src->fullname,
452 symtab_to_fullname (loc->symtab)) == 0
f8eba3c6
TT
453 && line->line_or_addr.loa == LOA_LINE
454 && loc->line_number == line->line_or_addr.u.line_no)
455 || (win == TUI_DISASM_WIN
456 && line->line_or_addr.loa == LOA_ADDRESS
457 && loc->address == line->line_or_addr.u.addr))
458 {
459 if (bp->enable_state == bp_disabled)
460 mode |= TUI_BP_DISABLED;
461 else
462 mode |= TUI_BP_ENABLED;
463 if (bp->hit_count)
464 mode |= TUI_BP_HIT;
465 if (bp->loc->cond)
466 mode |= TUI_BP_CONDITIONAL;
467 if (bp->type == bp_hardware_breakpoint)
468 mode |= TUI_BP_HARDWARE;
469 }
470 }
00b2bad4 471 }
6d012f14 472 if (line->has_break != mode)
00b2bad4 473 {
6d012f14 474 line->has_break = mode;
00b2bad4
SC
475 need_refresh = 1;
476 }
477 }
478 return need_refresh;
479}
c906108c 480
c906108c 481
6ba8e26f
AC
482/* Function to initialize the content of the execution info window,
483 based upon the input window which is either the source or
484 disassembly window. */
22940a24 485enum tui_status
5b6fe301 486tui_set_exec_info_content (struct tui_win_info *win_info)
c906108c 487{
22940a24 488 enum tui_status ret = TUI_SUCCESS;
c906108c 489
e6e41501
TT
490 tui_source_window_base *base = (tui_source_window_base *) win_info;
491 if (base->execution_info != NULL)
c906108c 492 {
e6e41501 493 struct tui_gen_win_info *exec_info_ptr = base->execution_info;
c906108c 494
6ba8e26f
AC
495 if (exec_info_ptr->content == NULL)
496 exec_info_ptr->content =
cb2ce893 497 tui_alloc_content (win_info->height, exec_info_ptr->type);
6ba8e26f 498 if (exec_info_ptr->content != NULL)
c906108c
SS
499 {
500 int i;
501
6d012f14 502 tui_update_breakpoint_info (win_info, 1);
cb2ce893 503 for (i = 0; i < win_info->content_size; i++)
c906108c 504 {
5b6fe301
MS
505 struct tui_win_element *element;
506 struct tui_win_element *src_element;
00b2bad4 507 int mode;
c906108c 508
63ed8182 509 element = exec_info_ptr->content[i];
cb2ce893 510 src_element = win_info->content[i];
00b2bad4 511
6d012f14
AC
512 memset(element->which_element.simple_string, ' ',
513 sizeof(element->which_element.simple_string));
514 element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
00b2bad4
SC
515
516 /* Now update the exec info content based upon the state
517 of each line as indicated by the source content. */
6ba8e26f 518 mode = src_element->which_element.source.has_break;
00b2bad4 519 if (mode & TUI_BP_HIT)
6d012f14 520 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
521 (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
522 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
6d012f14 523 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
524 (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
525
526 if (mode & TUI_BP_ENABLED)
6d012f14 527 element->which_element.simple_string[TUI_BP_BREAK_POS] = '+';
00b2bad4 528 else if (mode & TUI_BP_DISABLED)
6d012f14 529 element->which_element.simple_string[TUI_BP_BREAK_POS] = '-';
00b2bad4 530
6ba8e26f 531 if (src_element->which_element.source.is_exec_point)
6d012f14 532 element->which_element.simple_string[TUI_EXEC_POS] = '>';
c906108c 533 }
cb2ce893 534 exec_info_ptr->content_size = win_info->content_size;
c906108c
SS
535 }
536 else
537 ret = TUI_FAILURE;
538 }
539
540 return ret;
00b2bad4 541}
c906108c
SS
542
543
c906108c 544void
5b6fe301 545tui_show_exec_info_content (struct tui_win_info *win_info)
c906108c 546{
e6e41501
TT
547 tui_source_window_base *base = (tui_source_window_base *) win_info;
548 struct tui_gen_win_info *exec_info = base->execution_info;
6ba8e26f
AC
549 int cur_line;
550
551 werase (exec_info->handle);
5b81daba 552 exec_info->refresh_window ();
6ba8e26f
AC
553 for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++)
554 mvwaddstr (exec_info->handle,
555 cur_line,
c906108c 556 0,
7a6e7fcc
RO
557 (char *) exec_info->content[cur_line - 1]
558 ->which_element.simple_string);
5b81daba 559 exec_info->refresh_window ();
6ba8e26f 560 exec_info->content_in_use = TRUE;
f80bda8e 561}
c906108c
SS
562
563
c906108c 564void
5b6fe301 565tui_erase_exec_info_content (struct tui_win_info *win_info)
c906108c 566{
e6e41501
TT
567 tui_source_window_base *base = (tui_source_window_base *) win_info;
568 struct tui_gen_win_info *exec_info = base->execution_info;
c906108c 569
6ba8e26f 570 werase (exec_info->handle);
5b81daba 571 exec_info->refresh_window ();
f80bda8e 572}
c906108c 573
c906108c 574void
5b6fe301 575tui_clear_exec_info_content (struct tui_win_info *win_info)
c906108c 576{
e6e41501
TT
577 tui_source_window_base *base = (tui_source_window_base *) win_info;
578 base->execution_info->content_in_use = FALSE;
6d012f14 579 tui_erase_exec_info_content (win_info);
c906108c
SS
580
581 return;
f80bda8e 582}
c906108c 583
f80bda8e 584/* Function to update the execution info window. */
c906108c 585void
5b6fe301 586tui_update_exec_info (struct tui_win_info *win_info)
c906108c 587{
6ba8e26f
AC
588 tui_set_exec_info_content (win_info);
589 tui_show_exec_info_content (win_info);
590}
c906108c 591
f80bda8e 592enum tui_status
6d012f14 593tui_alloc_source_buffer (struct tui_win_info *win_info)
c906108c 594{
d02c80cd 595 int i, line_width, max_lines;
c906108c 596
7bc2c8b8
AA
597 /* The window width/height includes the highlight box. Determine actual
598 content dimensions, including string null-terminators. */
cb2ce893
TT
599 max_lines = win_info->height - 2;
600 line_width = win_info->width - 2 + 1;
7bc2c8b8 601
62f29fda 602 /* Allocate the buffer for the source lines. */
cb2ce893 603 if (win_info->content == NULL)
c906108c 604 {
1cc6d956 605 /* Allocate the content list. */
cb2ce893 606 win_info->content = tui_alloc_content (max_lines, SRC_WIN);
6ba8e26f 607 for (i = 0; i < max_lines; i++)
cb2ce893 608 win_info->content[i]->which_element.source.line
62f29fda 609 = (char *) xmalloc (line_width);
c906108c 610 }
c906108c 611
81b7c67a 612 return TUI_SUCCESS;
6ba8e26f 613}
c906108c
SS
614
615
766062f6 616/* Answer whether a particular line number or address is displayed
f80bda8e 617 in the current source window. */
c906108c 618int
08ef48c5
MS
619tui_line_is_displayed (int line,
620 struct tui_win_info *win_info,
6ba8e26f 621 int check_threshold)
c906108c 622{
6ba8e26f 623 int is_displayed = FALSE;
c906108c
SS
624 int i, threshold;
625
6ba8e26f 626 if (check_threshold)
c906108c
SS
627 threshold = SCROLL_THRESHOLD;
628 else
629 threshold = 0;
630 i = 0;
cb2ce893 631 while (i < win_info->content_size - threshold
e5908723 632 && !is_displayed)
c906108c 633 {
63ed8182 634 is_displayed
cb2ce893 635 = win_info->content[i]
63ed8182 636 ->which_element.source.line_or_addr.loa == LOA_LINE
cb2ce893 637 && win_info->content[i]
63a33118 638 ->which_element.source.line_or_addr.u.line_no == line;
c906108c
SS
639 i++;
640 }
641
6ba8e26f 642 return is_displayed;
f80bda8e 643}
c906108c
SS
644
645
766062f6 646/* Answer whether a particular line number or address is displayed
f80bda8e 647 in the current source window. */
a4b99e53 648int
08ef48c5
MS
649tui_addr_is_displayed (CORE_ADDR addr,
650 struct tui_win_info *win_info,
651 int check_threshold)
a4b99e53 652{
6ba8e26f 653 int is_displayed = FALSE;
a4b99e53
SC
654 int i, threshold;
655
6ba8e26f 656 if (check_threshold)
a4b99e53
SC
657 threshold = SCROLL_THRESHOLD;
658 else
659 threshold = 0;
660 i = 0;
cb2ce893 661 while (i < win_info->content_size - threshold
e5908723 662 && !is_displayed)
a4b99e53 663 {
63ed8182 664 is_displayed
cb2ce893 665 = win_info->content[i]
63ed8182 666 ->which_element.source.line_or_addr.loa == LOA_ADDRESS
cb2ce893 667 && win_info->content[i]
63ed8182 668 ->which_element.source.line_or_addr.u.addr == addr;
a4b99e53
SC
669 i++;
670 }
671
6ba8e26f 672 return is_displayed;
a4b99e53
SC
673}
674
675
c906108c
SS
676/*****************************************
677** STATIC LOCAL FUNCTIONS **
678******************************************/
This page took 2.121006 seconds and 4 git commands to generate.