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