OLD | NEW |
1 /* TUI display source window. | 1 /* TUI display source window. |
2 | 2 |
3 Copyright (C) 1998-2004, 2007-2012 Free Software Foundation, Inc. | 3 Copyright (C) 1998-2013 Free Software Foundation, Inc. |
4 | 4 |
5 Contributed by Hewlett-Packard Company. | 5 Contributed by Hewlett-Packard Company. |
6 | 6 |
7 This file is part of GDB. | 7 This file is part of GDB. |
8 | 8 |
9 This program is free software; you can redistribute it and/or modify | 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 | 10 it under the terms of the GNU General Public License as published by |
11 the Free Software Foundation; either version 3 of the License, or | 11 the Free Software Foundation; either version 3 of the License, or |
12 (at your option) any later version. | 12 (at your option) any later version. |
13 | 13 |
(...skipping 14 matching lines...) Expand all Loading... |
28 #include "symtab.h" | 28 #include "symtab.h" |
29 #include "objfiles.h" | 29 #include "objfiles.h" |
30 #include "filenames.h" | 30 #include "filenames.h" |
31 | 31 |
32 #include "tui/tui.h" | 32 #include "tui/tui.h" |
33 #include "tui/tui-data.h" | 33 #include "tui/tui-data.h" |
34 #include "tui/tui-stack.h" | 34 #include "tui/tui-stack.h" |
35 #include "tui/tui-winsource.h" | 35 #include "tui/tui-winsource.h" |
36 #include "tui/tui-source.h" | 36 #include "tui/tui-source.h" |
37 | 37 |
38 #include "gdb_string.h" | 38 #include <string.h> |
39 #include "gdb_curses.h" | 39 #include "gdb_curses.h" |
40 | 40 |
41 /* Function to display source in the source window. */ | 41 /* Function to display source in the source window. */ |
42 enum tui_status | 42 enum tui_status |
43 tui_set_source_content (struct symtab *s, | 43 tui_set_source_content (struct symtab *s, |
44 int line_no, | 44 int line_no, |
45 int noerror) | 45 int noerror) |
46 { | 46 { |
47 enum tui_status ret = TUI_FAILURE; | 47 enum tui_status ret = TUI_FAILURE; |
48 | 48 |
49 if (s != (struct symtab *) NULL && s->filename != (char *) NULL) | 49 if (s != (struct symtab *) NULL) |
50 { | 50 { |
51 FILE *stream; | 51 FILE *stream; |
52 int i, desc, c, line_width, nlines; | 52 int i, desc, c, line_width, nlines; |
53 char *src_line = 0; | 53 char *src_line = 0; |
54 | 54 |
55 if ((ret = tui_alloc_source_buffer (TUI_SRC_WIN)) == TUI_SUCCESS) | 55 if ((ret = tui_alloc_source_buffer (TUI_SRC_WIN)) == TUI_SUCCESS) |
56 { | 56 { |
57 line_width = TUI_SRC_WIN->generic.width - 1; | 57 line_width = TUI_SRC_WIN->generic.width - 1; |
58 /* Take hilite (window border) into account, when | 58 /* Take hilite (window border) into account, when |
59 calculating the number of lines. */ | 59 calculating the number of lines. */ |
60 nlines = (line_no + (TUI_SRC_WIN->generic.height - 2)) - line_no; | 60 nlines = (line_no + (TUI_SRC_WIN->generic.height - 2)) - line_no; |
61 desc = open_source_file (s); | 61 desc = open_source_file (s); |
62 if (desc < 0) | 62 if (desc < 0) |
63 { | 63 { |
64 if (!noerror) | 64 if (!noerror) |
65 { | 65 { |
66 » » char *name = alloca (strlen (s->filename) + 100); | 66 » » const char *filename = symtab_to_filename_for_display (s); |
| 67 » » char *name = alloca (strlen (filename) + 100); |
67 | 68 |
68 » » sprintf (name, "%s:%d", s->filename, line_no); | 69 » » sprintf (name, "%s:%d", filename, line_no); |
69 print_sys_errmsg (name, errno); | 70 print_sys_errmsg (name, errno); |
70 } | 71 } |
71 ret = TUI_FAILURE; | 72 ret = TUI_FAILURE; |
72 } | 73 } |
73 else | 74 else |
74 { | 75 { |
75 if (s->line_charpos == 0) | 76 if (s->line_charpos == 0) |
76 find_source_lines (s, desc); | 77 find_source_lines (s, desc); |
77 | 78 |
78 if (line_no < 1 || line_no > s->nlines) | 79 if (line_no < 1 || line_no > s->nlines) |
79 { | 80 { |
80 close (desc); | 81 close (desc); |
81 » » printf_unfiltered ( | 82 » » printf_unfiltered ("Line number %d out of range; " |
82 » » » "Line number %d out of range; %s has %d lines.\n", | 83 » » » » "%s has %d lines.\n", |
83 » » » » line_no, s->filename, s->nlines); | 84 » » » » line_no, |
| 85 » » » » symtab_to_filename_for_display (s), |
| 86 » » » » s->nlines); |
84 } | 87 } |
85 else if (lseek (desc, s->line_charpos[line_no - 1], 0) < 0) | 88 else if (lseek (desc, s->line_charpos[line_no - 1], 0) < 0) |
86 { | 89 { |
87 close (desc); | 90 close (desc); |
88 » » perror_with_name (s->filename); | 91 » » perror_with_name (symtab_to_filename_for_display (s)); |
89 } | 92 } |
90 else | 93 else |
91 { | 94 { |
92 int offset, cur_line_no, cur_line, cur_len, threshold; | 95 int offset, cur_line_no, cur_line, cur_len, threshold; |
93 struct tui_gen_win_info *locator | 96 struct tui_gen_win_info *locator |
94 = tui_locator_win_info_ptr (); | 97 = tui_locator_win_info_ptr (); |
95 struct tui_source_info *src | 98 struct tui_source_info *src |
96 = &TUI_SRC_WIN->detail.source_info; | 99 = &TUI_SRC_WIN->detail.source_info; |
| 100 const char *s_filename = symtab_to_filename_for_display (s); |
97 | 101 |
98 if (TUI_SRC_WIN->generic.title) | 102 if (TUI_SRC_WIN->generic.title) |
99 xfree (TUI_SRC_WIN->generic.title); | 103 xfree (TUI_SRC_WIN->generic.title); |
100 TUI_SRC_WIN->generic.title = xstrdup (s->filename); | 104 TUI_SRC_WIN->generic.title = xstrdup (s_filename); |
101 | 105 |
102 if (src->filename) | 106 » » xfree (src->fullname); |
103 xfree (src->filename); | 107 » » src->fullname = xstrdup (symtab_to_fullname (s)); |
104 src->filename = xstrdup (s->filename); | |
105 | 108 |
106 /* Determine the threshold for the length of the | 109 /* Determine the threshold for the length of the |
107 line and the offset to start the display. */ | 110 line and the offset to start the display. */ |
108 offset = src->horizontal_offset; | 111 offset = src->horizontal_offset; |
109 threshold = (line_width - 1) + offset; | 112 threshold = (line_width - 1) + offset; |
110 stream = fdopen (desc, FOPEN_RT); | 113 stream = fdopen (desc, FOPEN_RT); |
111 clearerr (stream); | 114 clearerr (stream); |
112 cur_line = 0; | 115 cur_line = 0; |
113 src->gdbarch = get_objfile_arch (s->objfile); | 116 src->gdbarch = get_objfile_arch (s->objfile); |
114 src->start_line_or_addr.loa = LOA_LINE; | 117 src->start_line_or_addr.loa = LOA_LINE; |
(...skipping 28 matching lines...) Expand all Loading... |
143 src_line[cur_len] = (char) 0; | 146 src_line[cur_len] = (char) 0; |
144 | 147 |
145 /* Set whether element is the execution point | 148 /* Set whether element is the execution point |
146 and whether there is a break point on it. */ | 149 and whether there is a break point on it. */ |
147 element->which_element.source.line_or_addr.loa = | 150 element->which_element.source.line_or_addr.loa = |
148 LOA_LINE; | 151 LOA_LINE; |
149 element->which_element.source.line_or_addr.u.line_no = | 152 element->which_element.source.line_or_addr.u.line_no = |
150 cur_line_no; | 153 cur_line_no; |
151 element->which_element.source.is_exec_point = | 154 element->which_element.source.is_exec_point = |
152 (filename_cmp (((struct tui_win_element *) | 155 (filename_cmp (((struct tui_win_element *) |
153 » » » » locator->content[0])->which_element.locat
or.file_name, | 156 » » » » locator->content[0])->which_element.locat
or.full_name, |
154 » » » » s->filename) == 0 | 157 » » » » symtab_to_fullname (s)) == 0 |
155 && cur_line_no == ((struct tui_win_element *) | 158 && cur_line_no == ((struct tui_win_element *) |
156 locator->content[0])->which_element.
locator.line_no); | 159 locator->content[0])->which_element.
locator.line_no); |
157 if (c != EOF) | 160 if (c != EOF) |
158 { | 161 { |
159 i = strlen (src_line) - 1; | 162 i = strlen (src_line) - 1; |
160 do | 163 do |
161 { | 164 { |
162 if ((c != '\n') && (c != '\r') | 165 if ((c != '\n') && (c != '\r') |
163 && (++i < threshold)) | 166 && (++i < threshold)) |
164 { | 167 { |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 int noerror) | 328 int noerror) |
326 { | 329 { |
327 TUI_SRC_WIN->detail.source_info.horizontal_offset = 0; | 330 TUI_SRC_WIN->detail.source_info.horizontal_offset = 0; |
328 tui_update_source_window_as_is (TUI_SRC_WIN, gdbarch, s, line, noerror); | 331 tui_update_source_window_as_is (TUI_SRC_WIN, gdbarch, s, line, noerror); |
329 } | 332 } |
330 | 333 |
331 | 334 |
332 /* Answer whether the source is currently displayed in the source | 335 /* Answer whether the source is currently displayed in the source |
333 window. */ | 336 window. */ |
334 int | 337 int |
335 tui_source_is_displayed (char *fname) | 338 tui_source_is_displayed (const char *fullname) |
336 { | 339 { |
337 return (TUI_SRC_WIN->generic.content_in_use | 340 return (TUI_SRC_WIN != NULL |
| 341 » && TUI_SRC_WIN->generic.content_in_use |
338 && (filename_cmp (((struct tui_win_element *) | 342 && (filename_cmp (((struct tui_win_element *) |
339 (tui_locator_win_info_ptr ())-> | 343 (tui_locator_win_info_ptr ())-> |
340 » » » content[0])->which_element.locator.file_name, | 344 » » » content[0])->which_element.locator.full_name, |
341 » » » fname) == 0)); | 345 » » » fullname) == 0)); |
342 } | 346 } |
343 | 347 |
344 | 348 |
345 /* Scroll the source forward or backward vertically. */ | 349 /* Scroll the source forward or backward vertically. */ |
346 void | 350 void |
347 tui_vertical_source_scroll (enum tui_scroll_direction scroll_direction, | 351 tui_vertical_source_scroll (enum tui_scroll_direction scroll_direction, |
348 int num_to_scroll) | 352 int num_to_scroll) |
349 { | 353 { |
350 if (TUI_SRC_WIN->generic.content != NULL) | 354 if (TUI_SRC_WIN->generic.content != NULL) |
351 { | 355 { |
(...skipping 22 matching lines...) Expand all Loading... |
374 { | 378 { |
375 l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no | 379 l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no |
376 - num_to_scroll; | 380 - num_to_scroll; |
377 if (l.u.line_no <= 0) | 381 if (l.u.line_no <= 0) |
378 l.u.line_no = 1; | 382 l.u.line_no = 1; |
379 } | 383 } |
380 | 384 |
381 print_source_lines (s, l.u.line_no, l.u.line_no + 1, 0); | 385 print_source_lines (s, l.u.line_no, l.u.line_no + 1, 0); |
382 } | 386 } |
383 } | 387 } |
OLD | NEW |