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