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