* disasm.h (gdb_disassembly): Add GDBARCH parameter.
[deliverable/binutils-gdb.git] / gdb / tui / tui-winsource.c
CommitLineData
f377b406 1/* TUI display source/assembly window.
f33c6cbf 2
0fb0cc75
JB
3 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008,
4 2009 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
362c05fe 117 sal.line = line_or_addr.u.line_no +
6d012f14 118 (win_info->generic.content_size - 2);
52575520
EZ
119 sal.symtab = s;
120 set_current_source_symtab_and_line (&sal);
ef5eab5a
MS
121 /* If the focus was in the asm win, put it in the src win if
122 we don't have a split layout. */
e5908723
MS
123 if (tui_win_with_focus () == TUI_DISASM_WIN
124 && tui_current_layout () != SRC_DISASSEM_COMMAND)
6d012f14 125 tui_set_win_focus_to (TUI_SRC_WIN);
c906108c
SS
126 }
127 }
128
129
130 return;
f80bda8e 131}
c906108c
SS
132
133
f80bda8e
AC
134/* Function to ensure that the source and/or disassemly windows
135 reflect the input address. */
c906108c 136void
13274fc3 137tui_update_source_windows_with_addr (struct gdbarch *gdbarch, CORE_ADDR addr)
c906108c 138{
c774cec6 139 if (addr != 0)
c906108c
SS
140 {
141 struct symtab_and_line sal;
362c05fe 142 struct tui_line_or_address l;
a4b99e53 143
dd1abb8c 144 switch (tui_current_layout ())
c906108c
SS
145 {
146 case DISASSEM_COMMAND:
147 case DISASSEM_DATA_COMMAND:
13274fc3 148 tui_show_disassem (gdbarch, addr);
c906108c
SS
149 break;
150 case SRC_DISASSEM_COMMAND:
13274fc3 151 tui_show_disassem_and_update_source (gdbarch, addr);
c906108c
SS
152 break;
153 default:
c774cec6 154 sal = find_pc_line (addr, 0);
362c05fe
AS
155 l.loa = LOA_LINE;
156 l.u.line_no = sal.line;
13274fc3 157 tui_show_symtab_source (gdbarch, sal.symtab, l, FALSE);
c906108c
SS
158 break;
159 }
160 }
161 else
162 {
163 int i;
164
dd1abb8c 165 for (i = 0; i < (tui_source_windows ())->count; i++)
c906108c 166 {
5b6fe301 167 struct tui_win_info *win_info = (tui_source_windows ())->list[i];
c906108c 168
6d012f14
AC
169 tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT);
170 tui_clear_exec_info_content (win_info);
c906108c
SS
171 }
172 }
6ba8e26f 173}
c906108c 174
f80bda8e
AC
175/* Function to ensure that the source and/or disassemly windows
176 reflect the input address. */
c906108c 177void
f80bda8e 178tui_update_source_windows_with_line (struct symtab *s, int line)
c906108c 179{
13274fc3 180 struct gdbarch *gdbarch;
84b1e7c7 181 CORE_ADDR pc;
362c05fe 182 struct tui_line_or_address l;
13274fc3
UW
183
184 if (!s)
185 return;
186
187 gdbarch = get_objfile_arch (s->objfile);
188
dd1abb8c 189 switch (tui_current_layout ())
c906108c
SS
190 {
191 case DISASSEM_COMMAND:
192 case DISASSEM_DATA_COMMAND:
84b1e7c7 193 find_line_pc (s, line, &pc);
13274fc3 194 tui_update_source_windows_with_addr (gdbarch, pc);
c906108c
SS
195 break;
196 default:
362c05fe
AS
197 l.loa = LOA_LINE;
198 l.u.line_no = line;
13274fc3 199 tui_show_symtab_source (gdbarch, s, l, FALSE);
dd1abb8c 200 if (tui_current_layout () == SRC_DISASSEM_COMMAND)
84b1e7c7
SC
201 {
202 find_line_pc (s, line, &pc);
13274fc3 203 tui_show_disassem (gdbarch, pc);
84b1e7c7 204 }
c906108c
SS
205 break;
206 }
207
208 return;
f80bda8e 209}
c906108c 210
c906108c 211void
08ef48c5
MS
212tui_clear_source_content (struct tui_win_info *win_info,
213 int display_prompt)
c906108c 214{
6d012f14 215 if (win_info != NULL)
c906108c 216 {
d02c80cd 217 int i;
c906108c 218
6d012f14 219 win_info->generic.content_in_use = FALSE;
6ba8e26f 220 tui_erase_source_content (win_info, display_prompt);
6d012f14 221 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 222 {
5b6fe301 223 struct tui_win_element *element =
6d012f14
AC
224 (struct tui_win_element *) win_info->generic.content[i];
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 {
330 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
331 if (cursal.symtab == NULL)
332 s = find_pc_symtab (get_frame_pc (get_selected_frame (NULL)));
333 else
334 s = cursal.symtab;
335 }
c906108c
SS
336
337 if (direction == LEFT_SCROLL)
6ba8e26f 338 offset = win_info->detail.source_info.horizontal_offset + num_to_scroll;
c906108c
SS
339 else
340 {
341 if ((offset =
6ba8e26f 342 win_info->detail.source_info.horizontal_offset - num_to_scroll) < 0)
c906108c
SS
343 offset = 0;
344 }
6d012f14 345 win_info->detail.source_info.horizontal_offset = offset;
13274fc3 346 tui_update_source_window_as_is (win_info, gdbarch, s,
2a8854a7 347 ((struct tui_win_element *)
6d012f14 348 win_info->generic.content[0])->which_element.source.line_or_addr,
f80bda8e 349 FALSE);
c906108c
SS
350 }
351
352 return;
6ba8e26f 353}
c906108c
SS
354
355
1cc6d956
MS
356/* Set or clear the has_break flag in the line whose line is
357 line_no. */
358
c906108c 359void
08ef48c5
MS
360tui_set_is_exec_point_at (struct tui_line_or_address l,
361 struct tui_win_info *win_info)
c906108c 362{
00b90ae2 363 int changed = 0;
c906108c 364 int i;
6d012f14 365 tui_win_content content = (tui_win_content) win_info->generic.content;
c906108c
SS
366
367 i = 0;
6d012f14 368 while (i < win_info->generic.content_size)
c906108c 369 {
6ba8e26f 370 int new_state;
362c05fe
AS
371 struct tui_line_or_address content_loa =
372 content[i]->which_element.source.line_or_addr;
373
374 gdb_assert (l.loa == LOA_ADDRESS || l.loa == LOA_LINE);
375 gdb_assert (content_loa.loa == LOA_LINE
376 || content_loa.loa == LOA_ADDRESS);
377 if (content_loa.loa == l.loa
378 && ((l.loa == LOA_LINE && content_loa.u.line_no == l.u.line_no)
379 || (content_loa.u.addr == l.u.addr)))
6ba8e26f 380 new_state = TRUE;
c906108c 381 else
6ba8e26f
AC
382 new_state = FALSE;
383 if (new_state != content[i]->which_element.source.is_exec_point)
00b90ae2
SC
384 {
385 changed++;
6ba8e26f 386 content[i]->which_element.source.is_exec_point = new_state;
6d012f14 387 tui_show_source_line (win_info, i + 1);
00b90ae2 388 }
c906108c
SS
389 i++;
390 }
00b90ae2 391 if (changed)
6d012f14 392 tui_refresh_win (&win_info->generic);
00b90ae2 393}
c906108c 394
00b2bad4
SC
395/* Update the execution windows to show the active breakpoints.
396 This is called whenever a breakpoint is inserted, removed or
397 has its state changed. */
c906108c 398void
d02c80cd 399tui_update_all_breakpoint_info (void)
c906108c 400{
2a8854a7 401 struct tui_list *list = tui_source_windows ();
c906108c 402 int i;
c906108c 403
00b2bad4 404 for (i = 0; i < list->count; i++)
c906108c 405 {
5b6fe301 406 struct tui_win_info *win = list->list[i];
c906108c 407
00b2bad4
SC
408 if (tui_update_breakpoint_info (win, FALSE))
409 {
f80bda8e 410 tui_update_exec_info (win);
00b2bad4 411 }
c906108c 412 }
00b2bad4 413}
c906108c
SS
414
415
1cc6d956
MS
416/* Scan the source window and the breakpoints to update the has_break
417 information for each line.
418
419 Returns 1 if something changed and the execution window must be
420 refreshed. */
421
00b2bad4 422int
08ef48c5
MS
423tui_update_breakpoint_info (struct tui_win_info *win,
424 int current_only)
c906108c
SS
425{
426 int i;
00b2bad4 427 int need_refresh = 0;
5b6fe301 428 struct tui_source_info *src = &win->detail.source_info;
c906108c 429
6d012f14 430 for (i = 0; i < win->generic.content_size; i++)
00b2bad4
SC
431 {
432 struct breakpoint *bp;
433 extern struct breakpoint *breakpoint_chain;
434 int mode;
5b6fe301 435 struct tui_source_element *line;
00b2bad4 436
6d012f14
AC
437 line = &((struct tui_win_element *) win->generic.content[i])->which_element.source;
438 if (current_only && !line->is_exec_point)
00b2bad4
SC
439 continue;
440
441 /* Scan each breakpoint to see if the current line has something to
442 do with it. Identify enable/disabled breakpoints as well as
443 those that we already hit. */
444 mode = 0;
445 for (bp = breakpoint_chain;
446 bp != (struct breakpoint *) NULL;
447 bp = bp->next)
448 {
362c05fe
AS
449 gdb_assert (line->line_or_addr.loa == LOA_LINE
450 || line->line_or_addr.loa == LOA_ADDRESS);
6d012f14 451 if ((win == TUI_SRC_WIN
00b2bad4
SC
452 && bp->source_file
453 && (strcmp (src->filename, bp->source_file) == 0)
362c05fe
AS
454 && line->line_or_addr.loa == LOA_LINE
455 && bp->line_number == line->line_or_addr.u.line_no)
6d012f14 456 || (win == TUI_DISASM_WIN
362c05fe 457 && line->line_or_addr.loa == LOA_ADDRESS
e7243d73 458 && bp->loc != NULL
362c05fe 459 && bp->loc->address == line->line_or_addr.u.addr))
00b2bad4
SC
460 {
461 if (bp->enable_state == bp_disabled)
462 mode |= TUI_BP_DISABLED;
463 else
464 mode |= TUI_BP_ENABLED;
465 if (bp->hit_count)
466 mode |= TUI_BP_HIT;
511a6cd4 467 if (bp->loc->cond)
00b2bad4
SC
468 mode |= TUI_BP_CONDITIONAL;
469 if (bp->type == bp_hardware_breakpoint)
470 mode |= TUI_BP_HARDWARE;
471 }
472 }
6d012f14 473 if (line->has_break != mode)
00b2bad4 474 {
6d012f14 475 line->has_break = mode;
00b2bad4
SC
476 need_refresh = 1;
477 }
478 }
479 return need_refresh;
480}
c906108c 481
c906108c 482
6ba8e26f
AC
483/* Function to initialize the content of the execution info window,
484 based upon the input window which is either the source or
485 disassembly window. */
22940a24 486enum tui_status
5b6fe301 487tui_set_exec_info_content (struct tui_win_info *win_info)
c906108c 488{
22940a24 489 enum tui_status ret = TUI_SUCCESS;
c906108c 490
6d012f14 491 if (win_info->detail.source_info.execution_info != (struct tui_gen_win_info *) NULL)
c906108c 492 {
5b6fe301 493 struct tui_gen_win_info *exec_info_ptr = win_info->detail.source_info.execution_info;
c906108c 494
6ba8e26f
AC
495 if (exec_info_ptr->content == NULL)
496 exec_info_ptr->content =
6d012f14 497 (void **) tui_alloc_content (win_info->generic.height,
6ba8e26f
AC
498 exec_info_ptr->type);
499 if (exec_info_ptr->content != NULL)
c906108c
SS
500 {
501 int i;
502
6d012f14
AC
503 tui_update_breakpoint_info (win_info, 1);
504 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 505 {
5b6fe301
MS
506 struct tui_win_element *element;
507 struct tui_win_element *src_element;
00b2bad4 508 int mode;
c906108c 509
6ba8e26f
AC
510 element = (struct tui_win_element *) exec_info_ptr->content[i];
511 src_element = (struct tui_win_element *) win_info->generic.content[i];
00b2bad4 512
6d012f14
AC
513 memset(element->which_element.simple_string, ' ',
514 sizeof(element->which_element.simple_string));
515 element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
00b2bad4
SC
516
517 /* Now update the exec info content based upon the state
518 of each line as indicated by the source content. */
6ba8e26f 519 mode = src_element->which_element.source.has_break;
00b2bad4 520 if (mode & TUI_BP_HIT)
6d012f14 521 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
522 (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
523 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
6d012f14 524 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
525 (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
526
527 if (mode & TUI_BP_ENABLED)
6d012f14 528 element->which_element.simple_string[TUI_BP_BREAK_POS] = '+';
00b2bad4 529 else if (mode & TUI_BP_DISABLED)
6d012f14 530 element->which_element.simple_string[TUI_BP_BREAK_POS] = '-';
00b2bad4 531
6ba8e26f 532 if (src_element->which_element.source.is_exec_point)
6d012f14 533 element->which_element.simple_string[TUI_EXEC_POS] = '>';
c906108c 534 }
6ba8e26f 535 exec_info_ptr->content_size = win_info->generic.content_size;
c906108c
SS
536 }
537 else
538 ret = TUI_FAILURE;
539 }
540
541 return ret;
00b2bad4 542}
c906108c
SS
543
544
c906108c 545void
5b6fe301 546tui_show_exec_info_content (struct tui_win_info *win_info)
c906108c 547{
5b6fe301 548 struct tui_gen_win_info *exec_info = win_info->detail.source_info.execution_info;
6ba8e26f
AC
549 int cur_line;
550
551 werase (exec_info->handle);
552 tui_refresh_win (exec_info);
553 for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++)
554 mvwaddstr (exec_info->handle,
555 cur_line,
c906108c 556 0,
2a8854a7 557 ((struct tui_win_element *)
6ba8e26f
AC
558 exec_info->content[cur_line - 1])->which_element.simple_string);
559 tui_refresh_win (exec_info);
560 exec_info->content_in_use = TRUE;
f80bda8e 561}
c906108c
SS
562
563
c906108c 564void
5b6fe301 565tui_erase_exec_info_content (struct tui_win_info *win_info)
c906108c 566{
5b6fe301 567 struct tui_gen_win_info *exec_info = win_info->detail.source_info.execution_info;
c906108c 568
6ba8e26f
AC
569 werase (exec_info->handle);
570 tui_refresh_win (exec_info);
f80bda8e 571}
c906108c 572
c906108c 573void
5b6fe301 574tui_clear_exec_info_content (struct tui_win_info *win_info)
c906108c 575{
6d012f14
AC
576 win_info->detail.source_info.execution_info->content_in_use = FALSE;
577 tui_erase_exec_info_content (win_info);
c906108c
SS
578
579 return;
f80bda8e 580}
c906108c 581
f80bda8e 582/* Function to update the execution info window. */
c906108c 583void
5b6fe301 584tui_update_exec_info (struct tui_win_info *win_info)
c906108c 585{
6ba8e26f
AC
586 tui_set_exec_info_content (win_info);
587 tui_show_exec_info_content (win_info);
588}
c906108c 589
f80bda8e 590enum tui_status
6d012f14 591tui_alloc_source_buffer (struct tui_win_info *win_info)
c906108c 592{
d02c80cd
AC
593 char *src_line_buf;
594 int i, line_width, max_lines;
c906108c 595
1cc6d956 596 max_lines = win_info->generic.height; /* Less the highlight box. */
6ba8e26f 597 line_width = win_info->generic.width - 1;
c906108c 598 /*
81b7c67a
MS
599 * Allocate the buffer for the source lines. Do this only once
600 * since they will be re-used for all source displays. The only
601 * other time this will be done is when a window's size changes.
c5aa993b 602 */
6d012f14 603 if (win_info->generic.content == NULL)
c906108c 604 {
81b7c67a
MS
605 src_line_buf = (char *)
606 xmalloc ((max_lines * line_width) * sizeof (char));
6ba8e26f 607 if (src_line_buf == (char *) NULL)
c906108c 608 {
81b7c67a
MS
609 fputs_unfiltered ("Unable to Allocate Memory for Source or Disassembly Display.\n",
610 gdb_stderr);
611 return TUI_FAILURE;
612 }
1cc6d956 613 /* Allocate the content list. */
81b7c67a
MS
614 if ((win_info->generic.content =
615 (void **) tui_alloc_content (max_lines, SRC_WIN)) == NULL)
616 {
617 xfree (src_line_buf);
618 fputs_unfiltered ("Unable to Allocate Memory for Source or Disassembly Display.\n",
619 gdb_stderr);
620 return TUI_FAILURE;
c906108c 621 }
6ba8e26f 622 for (i = 0; i < max_lines; i++)
2a8854a7 623 ((struct tui_win_element *)
6d012f14 624 win_info->generic.content[i])->which_element.source.line =
6ba8e26f 625 src_line_buf + (line_width * i);
c906108c 626 }
c906108c 627
81b7c67a 628 return TUI_SUCCESS;
6ba8e26f 629}
c906108c
SS
630
631
f80bda8e
AC
632/* Answer whether the a particular line number or address is displayed
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 {
6ba8e26f 650 is_displayed = (((struct tui_win_element *)
e5908723 651 win_info->generic.content[i])->which_element.source.line_or_addr.loa
362c05fe 652 == LOA_LINE)
e5908723
MS
653 && (((struct tui_win_element *)
654 win_info->generic.content[i])->which_element.source.line_or_addr.u.line_no
655 == (int) line);
c906108c
SS
656 i++;
657 }
658
6ba8e26f 659 return is_displayed;
f80bda8e 660}
c906108c
SS
661
662
f80bda8e
AC
663/* Answer whether the a particular line number or address is displayed
664 in the current source window. */
a4b99e53 665int
08ef48c5
MS
666tui_addr_is_displayed (CORE_ADDR addr,
667 struct tui_win_info *win_info,
668 int check_threshold)
a4b99e53 669{
6ba8e26f 670 int is_displayed = FALSE;
a4b99e53
SC
671 int i, threshold;
672
6ba8e26f 673 if (check_threshold)
a4b99e53
SC
674 threshold = SCROLL_THRESHOLD;
675 else
676 threshold = 0;
677 i = 0;
e5908723
MS
678 while (i < win_info->generic.content_size - threshold
679 && !is_displayed)
a4b99e53 680 {
6ba8e26f 681 is_displayed = (((struct tui_win_element *)
e5908723 682 win_info->generic.content[i])->which_element.source.line_or_addr.loa
362c05fe 683 == LOA_ADDRESS)
e5908723
MS
684 && (((struct tui_win_element *)
685 win_info->generic.content[i])->which_element.source.line_or_addr.u.addr
686 == addr);
a4b99e53
SC
687 i++;
688 }
689
6ba8e26f 690 return is_displayed;
a4b99e53
SC
691}
692
693
c906108c
SS
694/*****************************************
695** STATIC LOCAL FUNCTIONS **
696******************************************/
This page took 1.29753 seconds and 4 git commands to generate.