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