sim: bfin: add hw tracing to gpio/sic port events
[deliverable/binutils-gdb.git] / gdb / tui / tui-winsource.c
CommitLineData
f377b406 1/* TUI display source/assembly window.
f33c6cbf 2
0fb0cc75 3 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008,
7b6bb8da 4 2009, 2010, 2011 Free Software Foundation, Inc.
f33c6cbf 5
f377b406
SC
6 Contributed by Hewlett-Packard Company.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
22
23#include "defs.h"
24#include <ctype.h>
25#include "symtab.h"
26#include "frame.h"
27#include "breakpoint.h"
fd0407d6 28#include "value.h"
52575520 29#include "source.h"
13274fc3 30#include "objfiles.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 {
362c05fe
AS
457 gdb_assert (line->line_or_addr.loa == LOA_LINE
458 || line->line_or_addr.loa == LOA_ADDRESS);
6d012f14 459 if ((win == TUI_SRC_WIN
00b2bad4
SC
460 && bp->source_file
461 && (strcmp (src->filename, bp->source_file) == 0)
362c05fe
AS
462 && line->line_or_addr.loa == LOA_LINE
463 && bp->line_number == line->line_or_addr.u.line_no)
6d012f14 464 || (win == TUI_DISASM_WIN
362c05fe 465 && line->line_or_addr.loa == LOA_ADDRESS
e7243d73 466 && bp->loc != NULL
362c05fe 467 && bp->loc->address == line->line_or_addr.u.addr))
00b2bad4
SC
468 {
469 if (bp->enable_state == bp_disabled)
470 mode |= TUI_BP_DISABLED;
471 else
472 mode |= TUI_BP_ENABLED;
473 if (bp->hit_count)
474 mode |= TUI_BP_HIT;
511a6cd4 475 if (bp->loc->cond)
00b2bad4
SC
476 mode |= TUI_BP_CONDITIONAL;
477 if (bp->type == bp_hardware_breakpoint)
478 mode |= TUI_BP_HARDWARE;
479 }
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 =
6d012f14 507 (void **) tui_alloc_content (win_info->generic.height,
6ba8e26f
AC
508 exec_info_ptr->type);
509 if (exec_info_ptr->content != NULL)
c906108c
SS
510 {
511 int i;
512
6d012f14
AC
513 tui_update_breakpoint_info (win_info, 1);
514 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 515 {
5b6fe301
MS
516 struct tui_win_element *element;
517 struct tui_win_element *src_element;
00b2bad4 518 int mode;
c906108c 519
6ba8e26f 520 element = (struct tui_win_element *) exec_info_ptr->content[i];
9a2b4c1b
MS
521 src_element = (struct tui_win_element *)
522 win_info->generic.content[i];
00b2bad4 523
6d012f14
AC
524 memset(element->which_element.simple_string, ' ',
525 sizeof(element->which_element.simple_string));
526 element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
00b2bad4
SC
527
528 /* Now update the exec info content based upon the state
529 of each line as indicated by the source content. */
6ba8e26f 530 mode = src_element->which_element.source.has_break;
00b2bad4 531 if (mode & TUI_BP_HIT)
6d012f14 532 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
533 (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
534 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
6d012f14 535 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
536 (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
537
538 if (mode & TUI_BP_ENABLED)
6d012f14 539 element->which_element.simple_string[TUI_BP_BREAK_POS] = '+';
00b2bad4 540 else if (mode & TUI_BP_DISABLED)
6d012f14 541 element->which_element.simple_string[TUI_BP_BREAK_POS] = '-';
00b2bad4 542
6ba8e26f 543 if (src_element->which_element.source.is_exec_point)
6d012f14 544 element->which_element.simple_string[TUI_EXEC_POS] = '>';
c906108c 545 }
6ba8e26f 546 exec_info_ptr->content_size = win_info->generic.content_size;
c906108c
SS
547 }
548 else
549 ret = TUI_FAILURE;
550 }
551
552 return ret;
00b2bad4 553}
c906108c
SS
554
555
c906108c 556void
5b6fe301 557tui_show_exec_info_content (struct tui_win_info *win_info)
c906108c 558{
9a2b4c1b
MS
559 struct tui_gen_win_info *exec_info
560 = win_info->detail.source_info.execution_info;
6ba8e26f
AC
561 int cur_line;
562
563 werase (exec_info->handle);
564 tui_refresh_win (exec_info);
565 for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++)
566 mvwaddstr (exec_info->handle,
567 cur_line,
c906108c 568 0,
2a8854a7 569 ((struct tui_win_element *)
6ba8e26f
AC
570 exec_info->content[cur_line - 1])->which_element.simple_string);
571 tui_refresh_win (exec_info);
572 exec_info->content_in_use = TRUE;
f80bda8e 573}
c906108c
SS
574
575
c906108c 576void
5b6fe301 577tui_erase_exec_info_content (struct tui_win_info *win_info)
c906108c 578{
9a2b4c1b
MS
579 struct tui_gen_win_info *exec_info
580 = win_info->detail.source_info.execution_info;
c906108c 581
6ba8e26f
AC
582 werase (exec_info->handle);
583 tui_refresh_win (exec_info);
f80bda8e 584}
c906108c 585
c906108c 586void
5b6fe301 587tui_clear_exec_info_content (struct tui_win_info *win_info)
c906108c 588{
6d012f14
AC
589 win_info->detail.source_info.execution_info->content_in_use = FALSE;
590 tui_erase_exec_info_content (win_info);
c906108c
SS
591
592 return;
f80bda8e 593}
c906108c 594
f80bda8e 595/* Function to update the execution info window. */
c906108c 596void
5b6fe301 597tui_update_exec_info (struct tui_win_info *win_info)
c906108c 598{
6ba8e26f
AC
599 tui_set_exec_info_content (win_info);
600 tui_show_exec_info_content (win_info);
601}
c906108c 602
f80bda8e 603enum tui_status
6d012f14 604tui_alloc_source_buffer (struct tui_win_info *win_info)
c906108c 605{
d02c80cd
AC
606 char *src_line_buf;
607 int i, line_width, max_lines;
c906108c 608
1cc6d956 609 max_lines = win_info->generic.height; /* Less the highlight box. */
6ba8e26f 610 line_width = win_info->generic.width - 1;
c906108c 611 /*
81b7c67a
MS
612 * Allocate the buffer for the source lines. Do this only once
613 * since they will be re-used for all source displays. The only
614 * other time this will be done is when a window's size changes.
c5aa993b 615 */
6d012f14 616 if (win_info->generic.content == NULL)
c906108c 617 {
81b7c67a
MS
618 src_line_buf = (char *)
619 xmalloc ((max_lines * line_width) * sizeof (char));
6ba8e26f 620 if (src_line_buf == (char *) NULL)
c906108c 621 {
9a2b4c1b
MS
622 fputs_unfiltered ("Unable to Allocate Memory for "
623 "Source or Disassembly Display.\n",
81b7c67a
MS
624 gdb_stderr);
625 return TUI_FAILURE;
626 }
1cc6d956 627 /* Allocate the content list. */
81b7c67a
MS
628 if ((win_info->generic.content =
629 (void **) tui_alloc_content (max_lines, SRC_WIN)) == NULL)
630 {
631 xfree (src_line_buf);
9a2b4c1b
MS
632 fputs_unfiltered ("Unable to Allocate Memory for "
633 "Source or Disassembly Display.\n",
81b7c67a
MS
634 gdb_stderr);
635 return TUI_FAILURE;
c906108c 636 }
6ba8e26f 637 for (i = 0; i < max_lines; i++)
2a8854a7 638 ((struct tui_win_element *)
6d012f14 639 win_info->generic.content[i])->which_element.source.line =
6ba8e26f 640 src_line_buf + (line_width * i);
c906108c 641 }
c906108c 642
81b7c67a 643 return TUI_SUCCESS;
6ba8e26f 644}
c906108c
SS
645
646
766062f6 647/* Answer whether a particular line number or address is displayed
f80bda8e 648 in the current source window. */
c906108c 649int
08ef48c5
MS
650tui_line_is_displayed (int line,
651 struct tui_win_info *win_info,
6ba8e26f 652 int check_threshold)
c906108c 653{
6ba8e26f 654 int is_displayed = FALSE;
c906108c
SS
655 int i, threshold;
656
6ba8e26f 657 if (check_threshold)
c906108c
SS
658 threshold = SCROLL_THRESHOLD;
659 else
660 threshold = 0;
661 i = 0;
e5908723
MS
662 while (i < win_info->generic.content_size - threshold
663 && !is_displayed)
c906108c 664 {
6ba8e26f 665 is_displayed = (((struct tui_win_element *)
e5908723 666 win_info->generic.content[i])->which_element.source.line_or_addr.loa
362c05fe 667 == LOA_LINE)
e5908723
MS
668 && (((struct tui_win_element *)
669 win_info->generic.content[i])->which_element.source.line_or_addr.u.line_no
670 == (int) line);
c906108c
SS
671 i++;
672 }
673
6ba8e26f 674 return is_displayed;
f80bda8e 675}
c906108c
SS
676
677
766062f6 678/* Answer whether a particular line number or address is displayed
f80bda8e 679 in the current source window. */
a4b99e53 680int
08ef48c5
MS
681tui_addr_is_displayed (CORE_ADDR addr,
682 struct tui_win_info *win_info,
683 int check_threshold)
a4b99e53 684{
6ba8e26f 685 int is_displayed = FALSE;
a4b99e53
SC
686 int i, threshold;
687
6ba8e26f 688 if (check_threshold)
a4b99e53
SC
689 threshold = SCROLL_THRESHOLD;
690 else
691 threshold = 0;
692 i = 0;
e5908723
MS
693 while (i < win_info->generic.content_size - threshold
694 && !is_displayed)
a4b99e53 695 {
6ba8e26f 696 is_displayed = (((struct tui_win_element *)
e5908723 697 win_info->generic.content[i])->which_element.source.line_or_addr.loa
362c05fe 698 == LOA_ADDRESS)
e5908723
MS
699 && (((struct tui_win_element *)
700 win_info->generic.content[i])->which_element.source.line_or_addr.u.addr
701 == addr);
a4b99e53
SC
702 i++;
703 }
704
6ba8e26f 705 return is_displayed;
a4b99e53
SC
706}
707
708
c906108c
SS
709/*****************************************
710** STATIC LOCAL FUNCTIONS **
711******************************************/
This page took 1.112926 seconds and 4 git commands to generate.