]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tui/tui-winsource.c
remove gdb_string.h
[thirdparty/binutils-gdb.git] / gdb / tui / tui-winsource.c
CommitLineData
f377b406 1/* TUI display source/assembly window.
f33c6cbf 2
8acc9f48 3 Copyright (C) 1998-2013 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
0e9f083f 41#include <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)
56d397a3 62 tui_update_locator_fullname (symtab_to_fullname (sal.symtab));
2e17b763 63 else
56d397a3 64 tui_update_locator_fullname ("??");
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
2f202fde 465 && loc->symtab != NULL
aa079c93
JK
466 && filename_cmp (src->fullname,
467 symtab_to_fullname (loc->symtab)) == 0
f8eba3c6
TT
468 && line->line_or_addr.loa == LOA_LINE
469 && loc->line_number == line->line_or_addr.u.line_no)
470 || (win == TUI_DISASM_WIN
471 && line->line_or_addr.loa == LOA_ADDRESS
472 && loc->address == line->line_or_addr.u.addr))
473 {
474 if (bp->enable_state == bp_disabled)
475 mode |= TUI_BP_DISABLED;
476 else
477 mode |= TUI_BP_ENABLED;
478 if (bp->hit_count)
479 mode |= TUI_BP_HIT;
480 if (bp->loc->cond)
481 mode |= TUI_BP_CONDITIONAL;
482 if (bp->type == bp_hardware_breakpoint)
483 mode |= TUI_BP_HARDWARE;
484 }
485 }
00b2bad4 486 }
6d012f14 487 if (line->has_break != mode)
00b2bad4 488 {
6d012f14 489 line->has_break = mode;
00b2bad4
SC
490 need_refresh = 1;
491 }
492 }
493 return need_refresh;
494}
c906108c 495
c906108c 496
6ba8e26f
AC
497/* Function to initialize the content of the execution info window,
498 based upon the input window which is either the source or
499 disassembly window. */
22940a24 500enum tui_status
5b6fe301 501tui_set_exec_info_content (struct tui_win_info *win_info)
c906108c 502{
22940a24 503 enum tui_status ret = TUI_SUCCESS;
c906108c 504
9a2b4c1b
MS
505 if (win_info->detail.source_info.execution_info
506 != (struct tui_gen_win_info *) NULL)
c906108c 507 {
9a2b4c1b
MS
508 struct tui_gen_win_info *exec_info_ptr
509 = win_info->detail.source_info.execution_info;
c906108c 510
6ba8e26f
AC
511 if (exec_info_ptr->content == NULL)
512 exec_info_ptr->content =
6d012f14 513 (void **) tui_alloc_content (win_info->generic.height,
6ba8e26f
AC
514 exec_info_ptr->type);
515 if (exec_info_ptr->content != NULL)
c906108c
SS
516 {
517 int i;
518
6d012f14
AC
519 tui_update_breakpoint_info (win_info, 1);
520 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 521 {
5b6fe301
MS
522 struct tui_win_element *element;
523 struct tui_win_element *src_element;
00b2bad4 524 int mode;
c906108c 525
6ba8e26f 526 element = (struct tui_win_element *) exec_info_ptr->content[i];
9a2b4c1b
MS
527 src_element = (struct tui_win_element *)
528 win_info->generic.content[i];
00b2bad4 529
6d012f14
AC
530 memset(element->which_element.simple_string, ' ',
531 sizeof(element->which_element.simple_string));
532 element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
00b2bad4
SC
533
534 /* Now update the exec info content based upon the state
535 of each line as indicated by the source content. */
6ba8e26f 536 mode = src_element->which_element.source.has_break;
00b2bad4 537 if (mode & TUI_BP_HIT)
6d012f14 538 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
539 (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
540 else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
6d012f14 541 element->which_element.simple_string[TUI_BP_HIT_POS] =
00b2bad4
SC
542 (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
543
544 if (mode & TUI_BP_ENABLED)
6d012f14 545 element->which_element.simple_string[TUI_BP_BREAK_POS] = '+';
00b2bad4 546 else if (mode & TUI_BP_DISABLED)
6d012f14 547 element->which_element.simple_string[TUI_BP_BREAK_POS] = '-';
00b2bad4 548
6ba8e26f 549 if (src_element->which_element.source.is_exec_point)
6d012f14 550 element->which_element.simple_string[TUI_EXEC_POS] = '>';
c906108c 551 }
6ba8e26f 552 exec_info_ptr->content_size = win_info->generic.content_size;
c906108c
SS
553 }
554 else
555 ret = TUI_FAILURE;
556 }
557
558 return ret;
00b2bad4 559}
c906108c
SS
560
561
c906108c 562void
5b6fe301 563tui_show_exec_info_content (struct tui_win_info *win_info)
c906108c 564{
9a2b4c1b
MS
565 struct tui_gen_win_info *exec_info
566 = win_info->detail.source_info.execution_info;
6ba8e26f
AC
567 int cur_line;
568
569 werase (exec_info->handle);
570 tui_refresh_win (exec_info);
571 for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++)
572 mvwaddstr (exec_info->handle,
573 cur_line,
c906108c 574 0,
2a8854a7 575 ((struct tui_win_element *)
6ba8e26f
AC
576 exec_info->content[cur_line - 1])->which_element.simple_string);
577 tui_refresh_win (exec_info);
578 exec_info->content_in_use = TRUE;
f80bda8e 579}
c906108c
SS
580
581
c906108c 582void
5b6fe301 583tui_erase_exec_info_content (struct tui_win_info *win_info)
c906108c 584{
9a2b4c1b
MS
585 struct tui_gen_win_info *exec_info
586 = win_info->detail.source_info.execution_info;
c906108c 587
6ba8e26f
AC
588 werase (exec_info->handle);
589 tui_refresh_win (exec_info);
f80bda8e 590}
c906108c 591
c906108c 592void
5b6fe301 593tui_clear_exec_info_content (struct tui_win_info *win_info)
c906108c 594{
6d012f14
AC
595 win_info->detail.source_info.execution_info->content_in_use = FALSE;
596 tui_erase_exec_info_content (win_info);
c906108c
SS
597
598 return;
f80bda8e 599}
c906108c 600
f80bda8e 601/* Function to update the execution info window. */
c906108c 602void
5b6fe301 603tui_update_exec_info (struct tui_win_info *win_info)
c906108c 604{
6ba8e26f
AC
605 tui_set_exec_info_content (win_info);
606 tui_show_exec_info_content (win_info);
607}
c906108c 608
f80bda8e 609enum tui_status
6d012f14 610tui_alloc_source_buffer (struct tui_win_info *win_info)
c906108c 611{
d02c80cd
AC
612 char *src_line_buf;
613 int i, line_width, max_lines;
c906108c 614
1cc6d956 615 max_lines = win_info->generic.height; /* Less the highlight box. */
6ba8e26f 616 line_width = win_info->generic.width - 1;
c906108c 617 /*
81b7c67a
MS
618 * Allocate the buffer for the source lines. Do this only once
619 * since they will be re-used for all source displays. The only
620 * other time this will be done is when a window's size changes.
c5aa993b 621 */
6d012f14 622 if (win_info->generic.content == NULL)
c906108c 623 {
81b7c67a
MS
624 src_line_buf = (char *)
625 xmalloc ((max_lines * line_width) * sizeof (char));
6ba8e26f 626 if (src_line_buf == (char *) NULL)
c906108c 627 {
9a2b4c1b
MS
628 fputs_unfiltered ("Unable to Allocate Memory for "
629 "Source or Disassembly Display.\n",
81b7c67a
MS
630 gdb_stderr);
631 return TUI_FAILURE;
632 }
1cc6d956 633 /* Allocate the content list. */
81b7c67a
MS
634 if ((win_info->generic.content =
635 (void **) tui_alloc_content (max_lines, SRC_WIN)) == NULL)
636 {
637 xfree (src_line_buf);
9a2b4c1b
MS
638 fputs_unfiltered ("Unable to Allocate Memory for "
639 "Source or Disassembly Display.\n",
81b7c67a
MS
640 gdb_stderr);
641 return TUI_FAILURE;
c906108c 642 }
6ba8e26f 643 for (i = 0; i < max_lines; i++)
2a8854a7 644 ((struct tui_win_element *)
6d012f14 645 win_info->generic.content[i])->which_element.source.line =
6ba8e26f 646 src_line_buf + (line_width * i);
c906108c 647 }
c906108c 648
81b7c67a 649 return TUI_SUCCESS;
6ba8e26f 650}
c906108c
SS
651
652
766062f6 653/* Answer whether a particular line number or address is displayed
f80bda8e 654 in the current source window. */
c906108c 655int
08ef48c5
MS
656tui_line_is_displayed (int line,
657 struct tui_win_info *win_info,
6ba8e26f 658 int check_threshold)
c906108c 659{
6ba8e26f 660 int is_displayed = FALSE;
c906108c
SS
661 int i, threshold;
662
6ba8e26f 663 if (check_threshold)
c906108c
SS
664 threshold = SCROLL_THRESHOLD;
665 else
666 threshold = 0;
667 i = 0;
e5908723
MS
668 while (i < win_info->generic.content_size - threshold
669 && !is_displayed)
c906108c 670 {
6ba8e26f 671 is_displayed = (((struct tui_win_element *)
e5908723 672 win_info->generic.content[i])->which_element.source.line_or_addr.loa
362c05fe 673 == LOA_LINE)
e5908723
MS
674 && (((struct tui_win_element *)
675 win_info->generic.content[i])->which_element.source.line_or_addr.u.line_no
676 == (int) line);
c906108c
SS
677 i++;
678 }
679
6ba8e26f 680 return is_displayed;
f80bda8e 681}
c906108c
SS
682
683
766062f6 684/* Answer whether a particular line number or address is displayed
f80bda8e 685 in the current source window. */
a4b99e53 686int
08ef48c5
MS
687tui_addr_is_displayed (CORE_ADDR addr,
688 struct tui_win_info *win_info,
689 int check_threshold)
a4b99e53 690{
6ba8e26f 691 int is_displayed = FALSE;
a4b99e53
SC
692 int i, threshold;
693
6ba8e26f 694 if (check_threshold)
a4b99e53
SC
695 threshold = SCROLL_THRESHOLD;
696 else
697 threshold = 0;
698 i = 0;
e5908723
MS
699 while (i < win_info->generic.content_size - threshold
700 && !is_displayed)
a4b99e53 701 {
6ba8e26f 702 is_displayed = (((struct tui_win_element *)
e5908723 703 win_info->generic.content[i])->which_element.source.line_or_addr.loa
362c05fe 704 == LOA_ADDRESS)
e5908723
MS
705 && (((struct tui_win_element *)
706 win_info->generic.content[i])->which_element.source.line_or_addr.u.addr
707 == addr);
a4b99e53
SC
708 i++;
709 }
710
6ba8e26f 711 return is_displayed;
a4b99e53
SC
712}
713
714
c906108c
SS
715/*****************************************
716** STATIC LOCAL FUNCTIONS **
717******************************************/