On mainline/development, also link GDBserver with -lmcheck.
[deliverable/binutils-gdb.git] / gdb / source.c
CommitLineData
c906108c 1/* List lines of source files for GDB, the GNU debugger.
28e7fd62 2 Copyright (C) 1986-2013 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
c5aa993b 9 (at your option) any later version.
c906108c 10
c5aa993b
JM
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
c906108c 15
c5aa993b 16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
18
19#include "defs.h"
5af949e3 20#include "arch-utils.h"
c906108c
SS
21#include "symtab.h"
22#include "expression.h"
23#include "language.h"
24#include "command.h"
c2c6d25f 25#include "source.h"
c906108c
SS
26#include "gdbcmd.h"
27#include "frame.h"
28#include "value.h"
2f61ca93 29#include "gdb_assert.h"
614c279d 30#include "filestuff.h"
c906108c
SS
31
32#include <sys/types.h>
33#include "gdb_string.h"
34#include "gdb_stat.h"
35#include <fcntl.h>
c906108c 36#include "gdbcore.h"
88987551 37#include "gdb_regex.h"
c906108c
SS
38#include "symfile.h"
39#include "objfiles.h"
40#include "annotate.h"
41#include "gdbtypes.h"
c5f0f3d0 42#include "linespec.h"
fe4e3eb8 43#include "filenames.h" /* for DOSish file names */
d75b5104 44#include "completer.h"
8b93c638 45#include "ui-out.h"
dbda9972 46#include "readline/readline.h"
c906108c 47
ccefe4c4
TT
48#include "psymtab.h"
49
3e3a28f1 50
c906108c
SS
51#define OPEN_MODE (O_RDONLY | O_BINARY)
52#define FDOPEN_MODE FOPEN_RB
53
c378eb4e 54/* Prototypes for exported functions. */
c906108c 55
a14ed312 56void _initialize_source (void);
c906108c 57
c378eb4e 58/* Prototypes for local functions. */
c906108c 59
a14ed312 60static int get_filename_and_charpos (struct symtab *, char **);
c906108c 61
a14ed312 62static void reverse_search_command (char *, int);
c906108c 63
a14ed312 64static void forward_search_command (char *, int);
c906108c 65
a14ed312 66static void line_info (char *, int);
c906108c 67
a14ed312 68static void source_info (char *, int);
c906108c 69
c906108c
SS
70/* Path of directories to search for source files.
71 Same format as the PATH environment variable's value. */
72
73char *source_path;
74
2f61ca93
JB
75/* Support for source path substitution commands. */
76
77struct substitute_path_rule
78{
79 char *from;
80 char *to;
81 struct substitute_path_rule *next;
82};
83
84static struct substitute_path_rule *substitute_path_rules = NULL;
85
c906108c
SS
86/* Symtab of default file for listing lines of. */
87
0378c332 88static struct symtab *current_source_symtab;
c906108c
SS
89
90/* Default next line to list. */
91
0378c332 92static int current_source_line;
c906108c 93
6c95b8df
PA
94static struct program_space *current_source_pspace;
95
c906108c
SS
96/* Default number of lines to print with commands like "list".
97 This is based on guessing how many long (i.e. more than chars_per_line
98 characters) lines there will be. To be completely correct, "list"
99 and friends should be rewritten to count characters and see where
100 things are wrapping, but that would be a fair amount of work. */
101
102int lines_to_list = 10;
920d2a44
AC
103static void
104show_lines_to_list (struct ui_file *file, int from_tty,
105 struct cmd_list_element *c, const char *value)
106{
3e43a32a
MS
107 fprintf_filtered (file,
108 _("Number of source lines gdb "
109 "will list by default is %s.\n"),
920d2a44
AC
110 value);
111}
c906108c 112
1b56eb55
JK
113/* Possible values of 'set filename-display'. */
114static const char filename_display_basename[] = "basename";
115static const char filename_display_relative[] = "relative";
116static const char filename_display_absolute[] = "absolute";
117
118static const char *const filename_display_kind_names[] = {
119 filename_display_basename,
120 filename_display_relative,
121 filename_display_absolute,
122 NULL
123};
124
125static const char *filename_display_string = filename_display_relative;
126
127static void
128show_filename_display_string (struct ui_file *file, int from_tty,
129 struct cmd_list_element *c, const char *value)
130{
131 fprintf_filtered (file, _("Filenames are displayed as \"%s\".\n"), value);
132}
133
c906108c
SS
134/* Line number of last line printed. Default for various commands.
135 current_source_line is usually, but not always, the same as this. */
136
137static int last_line_listed;
138
139/* First line number listed by last listing command. */
140
141static int first_line_listed;
142
143/* Saves the name of the last source file visited and a possible error code.
c378eb4e 144 Used to prevent repeating annoying "No such file or directories" msgs. */
c906108c
SS
145
146static struct symtab *last_source_visited = NULL;
147static int last_source_error = 0;
c906108c 148\f
0378c332
FN
149/* Return the first line listed by print_source_lines.
150 Used by command interpreters to request listing from
c378eb4e 151 a previous point. */
0378c332
FN
152
153int
154get_first_line_listed (void)
155{
156 return first_line_listed;
157}
158
159/* Return the default number of lines to print with commands like the
160 cli "list". The caller of print_source_lines must use this to
161 calculate the end line and use it in the call to print_source_lines
c378eb4e 162 as it does not automatically use this value. */
0378c332
FN
163
164int
165get_lines_to_list (void)
166{
167 return lines_to_list;
168}
169
170/* Return the current source file for listing and next line to list.
c378eb4e 171 NOTE: The returned sal pc and end fields are not valid. */
0378c332
FN
172
173struct symtab_and_line
174get_current_source_symtab_and_line (void)
175{
245c7f48 176 struct symtab_and_line cursal = { 0 };
0378c332 177
6c95b8df 178 cursal.pspace = current_source_pspace;
0378c332
FN
179 cursal.symtab = current_source_symtab;
180 cursal.line = current_source_line;
53cb0458
FN
181 cursal.pc = 0;
182 cursal.end = 0;
0378c332
FN
183
184 return cursal;
185}
186
53cb0458
FN
187/* If the current source file for listing is not set, try and get a default.
188 Usually called before get_current_source_symtab_and_line() is called.
0378c332 189 It may err out if a default cannot be determined.
53cb0458
FN
190 We must be cautious about where it is called, as it can recurse as the
191 process of determining a new default may call the caller!
192 Use get_current_source_symtab_and_line only to get whatever
c378eb4e 193 we have without erroring out or trying to get a default. */
0378c332 194
53cb0458
FN
195void
196set_default_source_symtab_and_line (void)
0378c332 197{
0378c332 198 if (!have_full_symbols () && !have_partial_symbols ())
8a3fe4f8 199 error (_("No symbol table is loaded. Use the \"file\" command."));
0378c332 200
c378eb4e 201 /* Pull in a current source symtab if necessary. */
0378c332
FN
202 if (current_source_symtab == 0)
203 select_source_symtab (0);
0378c332
FN
204}
205
206/* Return the current default file for listing and next line to list
207 (the returned sal pc and end fields are not valid.)
53cb0458 208 and set the current default to whatever is in SAL.
c378eb4e 209 NOTE: The returned sal pc and end fields are not valid. */
0378c332
FN
210
211struct symtab_and_line
53cb0458 212set_current_source_symtab_and_line (const struct symtab_and_line *sal)
0378c332 213{
245c7f48 214 struct symtab_and_line cursal = { 0 };
6c95b8df
PA
215
216 cursal.pspace = current_source_pspace;
0378c332
FN
217 cursal.symtab = current_source_symtab;
218 cursal.line = current_source_line;
6c95b8df
PA
219 cursal.pc = 0;
220 cursal.end = 0;
0378c332 221
6c95b8df 222 current_source_pspace = sal->pspace;
0378c332
FN
223 current_source_symtab = sal->symtab;
224 current_source_line = sal->line;
6c95b8df 225
0378c332
FN
226 return cursal;
227}
228
c378eb4e 229/* Reset any information stored about a default file and line to print. */
0378c332
FN
230
231void
232clear_current_source_symtab_and_line (void)
233{
234 current_source_symtab = 0;
235 current_source_line = 0;
236}
c5aa993b 237
c906108c
SS
238/* Set the source file default for the "list" command to be S.
239
240 If S is NULL, and we don't have a default, find one. This
241 should only be called when the user actually tries to use the
242 default, since we produce an error if we can't find a reasonable
243 default. Also, since this can cause symbols to be read, doing it
244 before we need to would make things slower than necessary. */
245
246void
aa1ee363 247select_source_symtab (struct symtab *s)
c906108c
SS
248{
249 struct symtabs_and_lines sals;
250 struct symtab_and_line sal;
c906108c 251 struct objfile *ofp;
c5aa993b 252
c906108c
SS
253 if (s)
254 {
255 current_source_symtab = s;
256 current_source_line = 1;
6c95b8df 257 current_source_pspace = SYMTAB_PSPACE (s);
c906108c
SS
258 return;
259 }
260
261 if (current_source_symtab)
262 return;
263
264 /* Make the default place to list be the function `main'
265 if one exists. */
2570f2b7 266 if (lookup_symbol (main_name (), 0, VAR_DOMAIN, 0))
c906108c 267 {
39cf75f7
DE
268 sals = decode_line_with_current_source (main_name (),
269 DECODE_LINE_FUNFIRSTLINE);
c906108c 270 sal = sals.sals[0];
b8c9b27d 271 xfree (sals.sals);
6c95b8df 272 current_source_pspace = sal.pspace;
c906108c
SS
273 current_source_symtab = sal.symtab;
274 current_source_line = max (sal.line - (lines_to_list - 1), 1);
275 if (current_source_symtab)
c5aa993b 276 return;
c906108c 277 }
c5aa993b 278
8340a3fb
LM
279 /* Alright; find the last file in the symtab list (ignoring .h's
280 and namespace symtabs). */
c906108c
SS
281
282 current_source_line = 1;
283
6c95b8df 284 ALL_OBJFILES (ofp)
c906108c 285 {
c5aa993b 286 for (s = ofp->symtabs; s; s = s->next)
c906108c 287 {
591e78ff 288 const char *name = s->filename;
c906108c 289 int len = strlen (name);
433759f7 290
8340a3fb
LM
291 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
292 || strcmp (name, "<<C++-namespaces>>") == 0)))
6c95b8df
PA
293 {
294 current_source_pspace = current_program_space;
295 current_source_symtab = s;
296 }
c906108c
SS
297 }
298 }
6c95b8df 299
c906108c
SS
300 if (current_source_symtab)
301 return;
302
6c95b8df 303 ALL_OBJFILES (ofp)
ccefe4c4
TT
304 {
305 if (ofp->sf)
306 s = ofp->sf->qf->find_last_source_symtab (ofp);
307 if (s)
308 current_source_symtab = s;
309 }
c906108c
SS
310 if (current_source_symtab)
311 return;
312
8a3fe4f8 313 error (_("Can't find a default source file"));
c906108c
SS
314}
315\f
99e7ae30
DE
316/* Handler for "set directories path-list" command.
317 "set dir mumble" doesn't prepend paths, it resets the entire
318 path list. The theory is that set(show(dir)) should be a no-op. */
319
320static void
321set_directories_command (char *args, int from_tty, struct cmd_list_element *c)
322{
323 /* This is the value that was set.
324 It needs to be processed to maintain $cdir:$cwd and remove dups. */
325 char *set_path = source_path;
326
327 /* We preserve the invariant that $cdir:$cwd begins life at the end of
328 the list by calling init_source_path. If they appear earlier in
329 SET_PATH then mod_path will move them appropriately.
330 mod_path will also remove duplicates. */
331 init_source_path ();
332 if (*set_path != '\0')
333 mod_path (set_path, &source_path);
334
335 xfree (set_path);
336}
337
338/* Print the list of source directories.
339 This is used by the "ld" command, so it has the signature of a command
340 function. */
341
c906108c 342static void
99e7ae30 343show_directories_1 (char *ignore, int from_tty)
c906108c
SS
344{
345 puts_filtered ("Source directories searched: ");
346 puts_filtered (source_path);
347 puts_filtered ("\n");
348}
349
99e7ae30
DE
350/* Handler for "show directories" command. */
351
352static void
353show_directories_command (struct ui_file *file, int from_tty,
354 struct cmd_list_element *c, const char *value)
355{
356 show_directories_1 (NULL, from_tty);
357}
358
00174a86
TT
359/* Forget line positions and file names for the symtabs in a
360 particular objfile. */
361
362void
363forget_cached_source_info_for_objfile (struct objfile *objfile)
364{
365 struct symtab *s;
366
367 ALL_OBJFILE_SYMTABS (objfile, s)
368 {
369 if (s->line_charpos != NULL)
370 {
371 xfree (s->line_charpos);
372 s->line_charpos = NULL;
373 }
374 if (s->fullname != NULL)
375 {
376 xfree (s->fullname);
377 s->fullname = NULL;
378 }
00174a86 379 }
6f809020
DE
380
381 if (objfile->sf)
382 objfile->sf->qf->forget_cached_source_info (objfile);
00174a86
TT
383}
384
c906108c
SS
385/* Forget what we learned about line positions in source files, and
386 which directories contain them; must check again now since files
387 may be found in a different directory now. */
388
389void
fba45db2 390forget_cached_source_info (void)
c906108c 391{
6c95b8df 392 struct program_space *pspace;
52f0bd74 393 struct objfile *objfile;
c906108c 394
6c95b8df
PA
395 ALL_PSPACES (pspace)
396 ALL_PSPACE_OBJFILES (pspace, objfile)
c906108c 397 {
00174a86 398 forget_cached_source_info_for_objfile (objfile);
c906108c 399 }
c4e86dd4
DJ
400
401 last_source_visited = NULL;
c906108c
SS
402}
403
404void
fba45db2 405init_source_path (void)
c906108c
SS
406{
407 char buf[20];
408
08850b56 409 xsnprintf (buf, sizeof (buf), "$cdir%c$cwd", DIRNAME_SEPARATOR);
4fcf66da 410 source_path = xstrdup (buf);
c906108c
SS
411 forget_cached_source_info ();
412}
413
414/* Add zero or more directories to the front of the source path. */
c5aa993b 415
28da1647 416static void
fba45db2 417directory_command (char *dirname, int from_tty)
c906108c
SS
418{
419 dont_repeat ();
c378eb4e 420 /* FIXME, this goes to "delete dir"... */
c906108c
SS
421 if (dirname == 0)
422 {
80618b99 423 if (!from_tty || query (_("Reinitialize source path to empty? ")))
c906108c 424 {
b8c9b27d 425 xfree (source_path);
c906108c
SS
426 init_source_path ();
427 }
428 }
429 else
430 {
431 mod_path (dirname, &source_path);
c4e86dd4 432 forget_cached_source_info ();
c906108c
SS
433 }
434 if (from_tty)
99e7ae30 435 show_directories_1 ((char *) 0, from_tty);
c906108c
SS
436}
437
13d35ae5
AS
438/* Add a path given with the -d command line switch.
439 This will not be quoted so we must not treat spaces as separators. */
440
441void
442directory_switch (char *dirname, int from_tty)
443{
444 add_path (dirname, &source_path, 0);
445}
446
c906108c
SS
447/* Add zero or more directories to the front of an arbitrary path. */
448
449void
fba45db2 450mod_path (char *dirname, char **which_path)
c04e0a08
JJ
451{
452 add_path (dirname, which_path, 1);
453}
454
455/* Workhorse of mod_path. Takes an extra argument to determine
456 if dirname should be parsed for separators that indicate multiple
457 directories. This allows for interfaces that pre-parse the dirname
458 and allow specification of traditional separator characters such
c378eb4e 459 as space or tab. */
c04e0a08
JJ
460
461void
462add_path (char *dirname, char **which_path, int parse_separators)
c906108c
SS
463{
464 char *old = *which_path;
465 int prefix = 0;
e4ab2fad
JK
466 VEC (char_ptr) *dir_vec = NULL;
467 struct cleanup *back_to;
468 int ix;
469 char *name;
c906108c
SS
470
471 if (dirname == 0)
472 return;
473
13d35ae5
AS
474 if (parse_separators)
475 {
e4ab2fad
JK
476 char **argv, **argvp;
477
13d35ae5 478 /* This will properly parse the space and tab separators
e4ab2fad 479 and any quotes that may exist. */
d1a41061 480 argv = gdb_buildargv (dirname);
13d35ae5 481
e4ab2fad
JK
482 for (argvp = argv; *argvp; argvp++)
483 dirnames_to_char_ptr_vec_append (&dir_vec, *argvp);
484
485 freeargv (argv);
13d35ae5
AS
486 }
487 else
e4ab2fad
JK
488 VEC_safe_push (char_ptr, dir_vec, xstrdup (dirname));
489 back_to = make_cleanup_free_char_ptr_vec (dir_vec);
c906108c 490
e4ab2fad 491 for (ix = 0; VEC_iterate (char_ptr, dir_vec, ix, name); ++ix)
c906108c 492 {
aa1ee363 493 char *p;
c906108c
SS
494 struct stat st;
495
e4ab2fad
JK
496 /* Spaces and tabs will have been removed by buildargv().
497 NAME is the start of the directory.
498 P is the '\0' following the end. */
499 p = name + strlen (name);
13d35ae5
AS
500
501 while (!(IS_DIR_SEPARATOR (*name) && p <= name + 1) /* "/" */
c3690141 502#ifdef HAVE_DOS_BASED_FILE_SYSTEM
7be570e7 503 /* On MS-DOS and MS-Windows, h:\ is different from h: */
13d35ae5 504 && !(p == name + 3 && name[1] == ':') /* "d:/" */
7be570e7 505#endif
13d35ae5 506 && IS_DIR_SEPARATOR (p[-1]))
c378eb4e 507 /* Sigh. "foo/" => "foo" */
c906108c 508 --p;
c906108c
SS
509 *p = '\0';
510
7be570e7 511 while (p > name && p[-1] == '.')
c906108c
SS
512 {
513 if (p - name == 1)
514 {
515 /* "." => getwd (). */
516 name = current_directory;
517 goto append;
518 }
fe4e3eb8 519 else if (p > name + 1 && IS_DIR_SEPARATOR (p[-2]))
c906108c
SS
520 {
521 if (p - name == 2)
522 {
523 /* "/." => "/". */
524 *--p = '\0';
525 goto append;
526 }
527 else
528 {
529 /* "...foo/." => "...foo". */
530 p -= 2;
531 *p = '\0';
532 continue;
533 }
534 }
535 else
536 break;
537 }
538
539 if (name[0] == '~')
540 name = tilde_expand (name);
c3690141 541#ifdef HAVE_DOS_BASED_FILE_SYSTEM
fe4e3eb8 542 else if (IS_ABSOLUTE_PATH (name) && p == name + 2) /* "d:" => "d:." */
1754f103 543 name = concat (name, ".", (char *)NULL);
7be570e7 544#endif
fe4e3eb8 545 else if (!IS_ABSOLUTE_PATH (name) && name[0] != '$')
1754f103 546 name = concat (current_directory, SLASH_STRING, name, (char *)NULL);
c906108c
SS
547 else
548 name = savestring (name, p - name);
b8c9b27d 549 make_cleanup (xfree, name);
c906108c
SS
550
551 /* Unless it's a variable, check existence. */
c5aa993b
JM
552 if (name[0] != '$')
553 {
554 /* These are warnings, not errors, since we don't want a
555 non-existent directory in a .gdbinit file to stop processing
556 of the .gdbinit file.
557
558 Whether they get added to the path is more debatable. Current
559 answer is yes, in case the user wants to go make the directory
560 or whatever. If the directory continues to not exist/not be
561 a directory/etc, then having them in the path should be
562 harmless. */
563 if (stat (name, &st) < 0)
564 {
565 int save_errno = errno;
433759f7 566
c5aa993b
JM
567 fprintf_unfiltered (gdb_stderr, "Warning: ");
568 print_sys_errmsg (name, save_errno);
569 }
570 else if ((st.st_mode & S_IFMT) != S_IFDIR)
8a3fe4f8 571 warning (_("%s is not a directory."), name);
c5aa993b 572 }
c906108c
SS
573
574 append:
575 {
aa1ee363 576 unsigned int len = strlen (name);
5ee4ed9f 577 char tinybuf[2];
c906108c
SS
578
579 p = *which_path;
e4ab2fad
JK
580 /* FIXME: we should use realpath() or its work-alike
581 before comparing. Then all the code above which
582 removes excess slashes and dots could simply go away. */
583 if (!filename_cmp (p, name))
c906108c 584 {
e4ab2fad
JK
585 /* Found it in the search path, remove old copy. */
586 if (p > *which_path)
587 p--; /* Back over leading separator. */
588 if (prefix > p - *which_path)
589 goto skip_dup; /* Same dir twice in one cmd. */
590 memmove (p, &p[len + 1], strlen (&p[len + 1]) + 1); /* Copy from next \0 or : */
c906108c 591 }
c906108c 592
5ee4ed9f
JK
593 tinybuf[0] = DIRNAME_SEPARATOR;
594 tinybuf[1] = '\0';
c906108c 595
5ee4ed9f
JK
596 /* If we have already tacked on a name(s) in this command,
597 be sure they stay on the front as we tack on some
598 more. */
599 if (prefix)
600 {
601 char *temp, c;
602
603 c = old[prefix];
604 old[prefix] = '\0';
605 temp = concat (old, tinybuf, name, (char *)NULL);
606 old[prefix] = c;
607 *which_path = concat (temp, "", &old[prefix], (char *) NULL);
608 prefix = strlen (temp);
609 xfree (temp);
610 }
611 else
612 {
613 *which_path = concat (name, (old[0] ? tinybuf : old),
614 old, (char *)NULL);
615 prefix = strlen (name);
c906108c 616 }
5ee4ed9f
JK
617 xfree (old);
618 old = *which_path;
c906108c 619 }
82ae4854 620 skip_dup:
b27cf2b3 621 ;
c5aa993b 622 }
e4ab2fad
JK
623
624 do_cleanups (back_to);
c906108c
SS
625}
626
627
628static void
fba45db2 629source_info (char *ignore, int from_tty)
c906108c 630{
52f0bd74 631 struct symtab *s = current_source_symtab;
c906108c
SS
632
633 if (!s)
634 {
a3f17187 635 printf_filtered (_("No current source file.\n"));
c906108c
SS
636 return;
637 }
a3f17187 638 printf_filtered (_("Current source file is %s\n"), s->filename);
c906108c 639 if (s->dirname)
a3f17187 640 printf_filtered (_("Compilation directory is %s\n"), s->dirname);
c906108c 641 if (s->fullname)
a3f17187 642 printf_filtered (_("Located in %s\n"), s->fullname);
c906108c 643 if (s->nlines)
a3f17187 644 printf_filtered (_("Contains %d line%s.\n"), s->nlines,
c906108c
SS
645 s->nlines == 1 ? "" : "s");
646
a3f17187
AC
647 printf_filtered (_("Source language is %s.\n"), language_str (s->language));
648 printf_filtered (_("Compiled with %s debugging format.\n"), s->debugformat);
649 printf_filtered (_("%s preprocessor macro info.\n"),
919d772c 650 s->macro_table ? "Includes" : "Does not include");
c906108c 651}
c5aa993b 652\f
c906108c 653
c378eb4e 654/* Return True if the file NAME exists and is a regular file. */
1da1a192
JB
655static int
656is_regular_file (const char *name)
657{
658 struct stat st;
659 const int status = stat (name, &st);
660
661 /* Stat should never fail except when the file does not exist.
662 If stat fails, analyze the source of error and return True
663 unless the file does not exist, to avoid returning false results
c378eb4e
MS
664 on obscure systems where stat does not work as expected. */
665
1da1a192
JB
666 if (status != 0)
667 return (errno != ENOENT);
668
669 return S_ISREG (st.st_mode);
670}
c906108c 671
c906108c 672/* Open a file named STRING, searching path PATH (dir names sep by some char)
fbdebf46
JK
673 using mode MODE in the calls to open. You cannot use this function to
674 create files (O_CREAT).
c906108c 675
014d698b
EZ
676 OPTS specifies the function behaviour in specific cases.
677
678 If OPF_TRY_CWD_FIRST, try to open ./STRING before searching PATH.
c906108c 679 (ie pretend the first element of PATH is "."). This also indicates
e3e06db3
DE
680 that, unless OPF_SEARCH_IN_PATH is also specified, a slash in STRING
681 disables searching of the path (this is so that "exec-file ./foo" or
682 "symbol-file ./foo" insures that you get that particular version of
683 foo or an error message).
c906108c 684
014d698b
EZ
685 If OPTS has OPF_SEARCH_IN_PATH set, absolute names will also be
686 searched in path (we usually want this for source files but not for
687 executables).
688
e7a8479f 689 If FILENAME_OPENED is non-null, set it to a newly allocated string naming
a89f66e4 690 the actual file opened (this string will always start with a "/"). We
c906108c
SS
691 have to take special pains to avoid doubling the "/" between the directory
692 and the file, sigh! Emacs gets confuzzed by this when we print the
693 source file name!!!
694
695 If a file is found, return the descriptor.
696 Otherwise, return -1, with errno set for the last name we tried to open. */
697
698/* >>>> This should only allow files of certain types,
c378eb4e 699 >>>> eg executable, non-directory. */
c906108c 700int
014d698b 701openp (const char *path, int opts, const char *string,
fbdebf46 702 int mode, char **filename_opened)
c906108c 703{
52f0bd74
AC
704 int fd;
705 char *filename;
c906108c 706 int alloclen;
e4ab2fad
JK
707 VEC (char_ptr) *dir_vec;
708 struct cleanup *back_to;
709 int ix;
710 char *dir;
c906108c 711
fbdebf46
JK
712 /* The open syscall MODE parameter is not specified. */
713 gdb_assert ((mode & O_CREAT) == 0);
f91e5ac3
JB
714 gdb_assert (string != NULL);
715
716 /* A file with an empty name cannot possibly exist. Report a failure
717 without further checking.
718
719 This is an optimization which also defends us against buggy
720 implementations of the "stat" function. For instance, we have
721 noticed that a MinGW debugger built on Windows XP 32bits crashes
722 when the debugger is started with an empty argument. */
723 if (string[0] == '\0')
724 {
725 errno = ENOENT;
726 return -1;
727 }
fbdebf46 728
c906108c
SS
729 if (!path)
730 path = ".";
731
c906108c 732 mode |= O_BINARY;
c906108c 733
014d698b 734 if ((opts & OPF_TRY_CWD_FIRST) || IS_ABSOLUTE_PATH (string))
c906108c
SS
735 {
736 int i;
072b1022
DJ
737
738 if (is_regular_file (string))
739 {
740 filename = alloca (strlen (string) + 1);
741 strcpy (filename, string);
614c279d 742 fd = gdb_open_cloexec (filename, mode, 0);
072b1022
DJ
743 if (fd >= 0)
744 goto done;
745 }
746 else
3f565f1e
DJ
747 {
748 filename = NULL;
749 fd = -1;
750 }
072b1022 751
014d698b
EZ
752 if (!(opts & OPF_SEARCH_IN_PATH))
753 for (i = 0; string[i]; i++)
754 if (IS_DIR_SEPARATOR (string[i]))
755 goto done;
c906108c
SS
756 }
757
e6d9b9c2
DE
758 /* For dos paths, d:/foo -> /foo, and d:foo -> foo. */
759 if (HAS_DRIVE_SPEC (string))
760 string = STRIP_DRIVE_SPEC (string);
761
c378eb4e 762 /* /foo => foo, to avoid multiple slashes that Emacs doesn't like. */
014d698b
EZ
763 while (IS_DIR_SEPARATOR(string[0]))
764 string++;
765
c906108c 766 /* ./foo => foo */
fe4e3eb8 767 while (string[0] == '.' && IS_DIR_SEPARATOR (string[1]))
c906108c
SS
768 string += 2;
769
770 alloclen = strlen (path) + strlen (string) + 2;
1f8cc6db 771 filename = alloca (alloclen);
c906108c 772 fd = -1;
e4ab2fad
JK
773
774 dir_vec = dirnames_to_char_ptr_vec (path);
775 back_to = make_cleanup_free_char_ptr_vec (dir_vec);
776
777 for (ix = 0; VEC_iterate (char_ptr, dir_vec, ix, dir); ++ix)
c906108c 778 {
e4ab2fad 779 size_t len = strlen (dir);
c906108c 780
e4ab2fad 781 if (strcmp (dir, "$cwd") == 0)
c5aa993b
JM
782 {
783 /* Name is $cwd -- insert current directory name instead. */
784 int newlen;
785
c378eb4e 786 /* First, realloc the filename buffer if too short. */
c5aa993b
JM
787 len = strlen (current_directory);
788 newlen = len + strlen (string) + 2;
789 if (newlen > alloclen)
790 {
791 alloclen = newlen;
1f8cc6db 792 filename = alloca (alloclen);
c5aa993b
JM
793 }
794 strcpy (filename, current_directory);
795 }
ebd86fb5
TJB
796 else if (strchr(dir, '~'))
797 {
798 /* See whether we need to expand the tilde. */
799 int newlen;
800 char *tilde_expanded;
801
802 tilde_expanded = tilde_expand (dir);
803
804 /* First, realloc the filename buffer if too short. */
805 len = strlen (tilde_expanded);
806 newlen = len + strlen (string) + 2;
807 if (newlen > alloclen)
808 {
809 alloclen = newlen;
810 filename = alloca (alloclen);
811 }
812 strcpy (filename, tilde_expanded);
813 xfree (tilde_expanded);
814 }
c5aa993b
JM
815 else
816 {
817 /* Normal file name in path -- just use it. */
e4ab2fad 818 strcpy (filename, dir);
08001717
DE
819
820 /* Don't search $cdir. It's also a magic path like $cwd, but we
821 don't have enough information to expand it. The user *could*
822 have an actual directory named '$cdir' but handling that would
823 be confusing, it would mean different things in different
824 contexts. If the user really has '$cdir' one can use './$cdir'.
825 We can get $cdir when loading scripts. When loading source files
826 $cdir must have already been expanded to the correct value. */
e4ab2fad 827 if (strcmp (dir, "$cdir") == 0)
08001717 828 continue;
c906108c 829 }
c906108c 830
c378eb4e 831 /* Remove trailing slashes. */
fe4e3eb8 832 while (len > 0 && IS_DIR_SEPARATOR (filename[len - 1]))
c906108c
SS
833 filename[--len] = 0;
834
c5aa993b 835 strcat (filename + len, SLASH_STRING);
c906108c
SS
836 strcat (filename, string);
837
1da1a192 838 if (is_regular_file (filename))
5e987968 839 {
614c279d 840 fd = gdb_open_cloexec (filename, mode, 0);
5e987968
AS
841 if (fd >= 0)
842 break;
843 }
c906108c
SS
844 }
845
e4ab2fad
JK
846 do_cleanups (back_to);
847
c5aa993b 848done:
c906108c
SS
849 if (filename_opened)
850 {
f5b95b50 851 /* If a file was opened, canonicalize its filename. */
c906108c 852 if (fd < 0)
1f8cc6db 853 *filename_opened = NULL;
fe4e3eb8 854 else if (IS_ABSOLUTE_PATH (filename))
f5b95b50 855 *filename_opened = gdb_realpath (filename);
c906108c
SS
856 else
857 {
c378eb4e 858 /* Beware the // my son, the Emacs barfs, the botch that catch... */
c5aa993b 859
58d370e0 860 char *f = concat (current_directory,
5e987968
AS
861 IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
862 ? "" : SLASH_STRING,
1754f103 863 filename, (char *)NULL);
433759f7 864
f5b95b50 865 *filename_opened = gdb_realpath (f);
58d370e0 866 xfree (f);
c5aa993b 867 }
c906108c 868 }
c906108c
SS
869
870 return fd;
871}
872
c5aa993b 873
c906108c
SS
874/* This is essentially a convenience, for clients that want the behaviour
875 of openp, using source_path, but that really don't want the file to be
876 opened but want instead just to know what the full pathname is (as
877 qualified against source_path).
878
879 The current working directory is searched first.
880
881 If the file was found, this function returns 1, and FULL_PATHNAME is
882 set to the fully-qualified pathname.
883
5e987968 884 Else, this functions returns 0, and FULL_PATHNAME is set to NULL. */
c906108c 885int
24f81874 886source_full_path_of (const char *filename, char **full_pathname)
c906108c 887{
c5aa993b 888 int fd;
c906108c 889
014d698b 890 fd = openp (source_path, OPF_TRY_CWD_FIRST | OPF_SEARCH_IN_PATH, filename,
fbdebf46 891 O_RDONLY, full_pathname);
c906108c
SS
892 if (fd < 0)
893 {
894 *full_pathname = NULL;
895 return 0;
896 }
897
898 close (fd);
899 return 1;
900}
901
2f61ca93
JB
902/* Return non-zero if RULE matches PATH, that is if the rule can be
903 applied to PATH. */
904
905static int
906substitute_path_rule_matches (const struct substitute_path_rule *rule,
907 const char *path)
908{
909 const int from_len = strlen (rule->from);
910 const int path_len = strlen (path);
911 char *path_start;
912
913 if (path_len < from_len)
914 return 0;
915
916 /* The substitution rules are anchored at the start of the path,
917 so the path should start with rule->from. There is no filename
918 comparison routine, so we need to extract the first FROM_LEN
919 characters from PATH first and use that to do the comparison. */
920
921 path_start = alloca (from_len + 1);
922 strncpy (path_start, path, from_len);
923 path_start[from_len] = '\0';
924
925 if (FILENAME_CMP (path_start, rule->from) != 0)
926 return 0;
927
928 /* Make sure that the region in the path that matches the substitution
929 rule is immediately followed by a directory separator (or the end of
930 string character). */
931
932 if (path[from_len] != '\0' && !IS_DIR_SEPARATOR (path[from_len]))
933 return 0;
934
935 return 1;
936}
937
938/* Find the substitute-path rule that applies to PATH and return it.
939 Return NULL if no rule applies. */
940
941static struct substitute_path_rule *
942get_substitute_path_rule (const char *path)
943{
944 struct substitute_path_rule *rule = substitute_path_rules;
945
946 while (rule != NULL && !substitute_path_rule_matches (rule, path))
947 rule = rule->next;
948
949 return rule;
950}
951
952/* If the user specified a source path substitution rule that applies
953 to PATH, then apply it and return the new path. This new path must
c378eb4e 954 be deallocated afterwards.
2f61ca93
JB
955
956 Return NULL if no substitution rule was specified by the user,
957 or if no rule applied to the given PATH. */
958
fbd9ab74 959char *
2f61ca93
JB
960rewrite_source_path (const char *path)
961{
962 const struct substitute_path_rule *rule = get_substitute_path_rule (path);
963 char *new_path;
964 int from_len;
965
966 if (rule == NULL)
967 return NULL;
968
969 from_len = strlen (rule->from);
970
971 /* Compute the rewritten path and return it. */
972
973 new_path =
974 (char *) xmalloc (strlen (path) + 1 + strlen (rule->to) - from_len);
975 strcpy (new_path, rule->to);
976 strcat (new_path, path + from_len);
977
978 return new_path;
979}
980
ccefe4c4 981int
e2357892 982find_and_open_source (const char *filename,
5e987968
AS
983 const char *dirname,
984 char **fullname)
c906108c
SS
985{
986 char *path = source_path;
31889e00 987 const char *p;
c906108c 988 int result;
795d915c 989 struct cleanup *cleanup;
c906108c 990
c378eb4e 991 /* Quick way out if we already know its full name. */
2f61ca93 992
57c22c6c 993 if (*fullname)
c906108c 994 {
2f61ca93
JB
995 /* The user may have requested that source paths be rewritten
996 according to substitution rules he provided. If a substitution
997 rule applies to this path, then apply it. */
998 char *rewritten_fullname = rewrite_source_path (*fullname);
999
1000 if (rewritten_fullname != NULL)
1001 {
1002 xfree (*fullname);
1003 *fullname = rewritten_fullname;
1004 }
1005
614c279d 1006 result = gdb_open_cloexec (*fullname, OPEN_MODE, 0);
c906108c 1007 if (result >= 0)
bc3aa6c3 1008 {
f5b95b50 1009 char *lpath = gdb_realpath (*fullname);
bc3aa6c3
DE
1010
1011 xfree (*fullname);
1012 *fullname = lpath;
1013 return result;
1014 }
1015
c378eb4e 1016 /* Didn't work -- free old one, try again. */
2dc74dc1 1017 xfree (*fullname);
57c22c6c 1018 *fullname = NULL;
c906108c
SS
1019 }
1020
795d915c
TT
1021 cleanup = make_cleanup (null_cleanup, NULL);
1022
57c22c6c 1023 if (dirname != NULL)
c906108c 1024 {
2f61ca93
JB
1025 /* If necessary, rewrite the compilation directory name according
1026 to the source path substitution rules specified by the user. */
1027
1028 char *rewritten_dirname = rewrite_source_path (dirname);
1029
1030 if (rewritten_dirname != NULL)
1031 {
1032 make_cleanup (xfree, rewritten_dirname);
1033 dirname = rewritten_dirname;
1034 }
1035
c378eb4e
MS
1036 /* Replace a path entry of $cdir with the compilation directory
1037 name. */
c906108c
SS
1038#define cdir_len 5
1039 /* We cast strstr's result in case an ANSIhole has made it const,
c378eb4e 1040 which produces a "required warning" when assigned to a nonconst. */
c5aa993b 1041 p = (char *) strstr (source_path, "$cdir");
c906108c 1042 if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
c5aa993b 1043 && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
c906108c
SS
1044 {
1045 int len;
1046
1047 path = (char *)
57c22c6c 1048 alloca (strlen (source_path) + 1 + strlen (dirname) + 1);
c906108c 1049 len = p - source_path;
c5aa993b 1050 strncpy (path, source_path, len); /* Before $cdir */
3e43a32a
MS
1051 strcpy (path + len, dirname); /* new stuff */
1052 strcat (path + len, source_path + len + cdir_len); /* After
1053 $cdir */
c906108c
SS
1054 }
1055 }
8da2a1df
DJ
1056
1057 if (IS_ABSOLUTE_PATH (filename))
56163ce1 1058 {
8da2a1df
DJ
1059 /* If filename is absolute path, try the source path
1060 substitution on it. */
56163ce1
JB
1061 char *rewritten_filename = rewrite_source_path (filename);
1062
1063 if (rewritten_filename != NULL)
1064 {
1065 make_cleanup (xfree, rewritten_filename);
1066 filename = rewritten_filename;
1067 }
1068 }
c906108c 1069
fbdebf46 1070 result = openp (path, OPF_SEARCH_IN_PATH, filename, OPEN_MODE, fullname);
c906108c
SS
1071 if (result < 0)
1072 {
c378eb4e 1073 /* Didn't work. Try using just the basename. */
57c22c6c
BR
1074 p = lbasename (filename);
1075 if (p != filename)
fbdebf46 1076 result = openp (path, OPF_SEARCH_IN_PATH, p, OPEN_MODE, fullname);
c906108c 1077 }
c906108c 1078
795d915c 1079 do_cleanups (cleanup);
c906108c
SS
1080 return result;
1081}
1082
57c22c6c
BR
1083/* Open a source file given a symtab S. Returns a file descriptor or
1084 negative number for error.
1085
c378eb4e 1086 This function is a convience function to find_and_open_source. */
57c22c6c
BR
1087
1088int
1089open_source_file (struct symtab *s)
1090{
5e987968
AS
1091 if (!s)
1092 return -1;
57c22c6c 1093
e2357892 1094 return find_and_open_source (s->filename, s->dirname, &s->fullname);
57c22c6c
BR
1095}
1096
1097/* Finds the fullname that a symtab represents.
c906108c 1098
f35a17b5
JK
1099 This functions finds the fullname and saves it in s->fullname.
1100 It will also return the value.
57c22c6c
BR
1101
1102 If this function fails to find the file that this symtab represents,
f35a17b5
JK
1103 the expected fullname is used. Therefore the files does not have to
1104 exist. */
256f06f3 1105
0b0865da 1106const char *
57c22c6c 1107symtab_to_fullname (struct symtab *s)
c906108c 1108{
256f06f3
DE
1109 /* Use cached copy if we have it.
1110 We rely on forget_cached_source_info being called appropriately
1111 to handle cases like the file being moved. */
f35a17b5 1112 if (s->fullname == NULL)
5e987968 1113 {
f35a17b5
JK
1114 int fd = find_and_open_source (s->filename, s->dirname, &s->fullname);
1115
1116 if (fd >= 0)
1117 close (fd);
f35a17b5 1118 else
f0a4b570
JK
1119 {
1120 char *fullname;
1121 struct cleanup *back_to;
1122
1123 /* rewrite_source_path would be applied by find_and_open_source, we
1124 should report the pathname where GDB tried to find the file. */
1125
57b3c00c 1126 if (s->dirname == NULL || IS_ABSOLUTE_PATH (s->filename))
f0a4b570
JK
1127 fullname = xstrdup (s->filename);
1128 else
1129 fullname = concat (s->dirname, SLASH_STRING, s->filename, NULL);
1130
1131 back_to = make_cleanup (xfree, fullname);
1132 s->fullname = rewrite_source_path (fullname);
1133 if (s->fullname == NULL)
1134 s->fullname = xstrdup (fullname);
1135 do_cleanups (back_to);
1136 }
f35a17b5 1137 }
c906108c 1138
f35a17b5 1139 return s->fullname;
57c22c6c 1140}
1b56eb55
JK
1141
1142/* See commentary in source.h. */
1143
1144const char *
1145symtab_to_filename_for_display (struct symtab *symtab)
1146{
1147 if (filename_display_string == filename_display_basename)
1148 return lbasename (symtab->filename);
1149 else if (filename_display_string == filename_display_absolute)
1150 return symtab_to_fullname (symtab);
1151 else if (filename_display_string == filename_display_relative)
1152 return symtab->filename;
1153 else
1154 internal_error (__FILE__, __LINE__, _("invalid filename_display_string"));
1155}
5e987968 1156\f
c906108c
SS
1157/* Create and initialize the table S->line_charpos that records
1158 the positions of the lines in the source file, which is assumed
1159 to be open on descriptor DESC.
1160 All set S->nlines to the number of such lines. */
1161
1162void
fba45db2 1163find_source_lines (struct symtab *s, int desc)
c906108c
SS
1164{
1165 struct stat st;
52f0bd74 1166 char *data, *p, *end;
c906108c
SS
1167 int nlines = 0;
1168 int lines_allocated = 1000;
1169 int *line_charpos;
1170 long mtime = 0;
1171 int size;
1172
be8ca11b 1173 gdb_assert (s);
7936743b 1174 line_charpos = (int *) xmalloc (lines_allocated * sizeof (int));
c906108c 1175 if (fstat (desc, &st) < 0)
05cba821 1176 perror_with_name (symtab_to_filename_for_display (s));
c906108c 1177
be8ca11b 1178 if (s->objfile && s->objfile->obfd)
c04ea773 1179 mtime = s->objfile->mtime;
c906108c 1180 else if (exec_bfd)
c04ea773 1181 mtime = exec_bfd_mtime;
c906108c
SS
1182
1183 if (mtime && mtime < st.st_mtime)
8a3fe4f8 1184 warning (_("Source file is more recent than executable."));
c906108c 1185
c906108c
SS
1186 {
1187 struct cleanup *old_cleanups;
1188
1189 /* st_size might be a large type, but we only support source files whose
1190 size fits in an int. */
1191 size = (int) st.st_size;
1192
1193 /* Use malloc, not alloca, because this may be pretty large, and we may
1194 run into various kinds of limits on stack size. */
1195 data = (char *) xmalloc (size);
b8c9b27d 1196 old_cleanups = make_cleanup (xfree, data);
c906108c
SS
1197
1198 /* Reassign `size' to result of read for systems where \r\n -> \n. */
1199 size = myread (desc, data, size);
1200 if (size < 0)
05cba821 1201 perror_with_name (symtab_to_filename_for_display (s));
c906108c
SS
1202 end = data + size;
1203 p = data;
1204 line_charpos[0] = 0;
1205 nlines = 1;
1206 while (p != end)
1207 {
1208 if (*p++ == '\n'
c5aa993b 1209 /* A newline at the end does not start a new line. */
c906108c
SS
1210 && p != end)
1211 {
1212 if (nlines == lines_allocated)
1213 {
1214 lines_allocated *= 2;
1215 line_charpos =
0efffb96
AC
1216 (int *) xrealloc ((char *) line_charpos,
1217 sizeof (int) * lines_allocated);
c906108c
SS
1218 }
1219 line_charpos[nlines++] = p - data;
1220 }
1221 }
1222 do_cleanups (old_cleanups);
1223 }
d4d4db8a 1224
c906108c
SS
1225 s->nlines = nlines;
1226 s->line_charpos =
0efffb96 1227 (int *) xrealloc ((char *) line_charpos, nlines * sizeof (int));
c906108c
SS
1228
1229}
1230
c906108c 1231\f
c5aa993b 1232
c906108c
SS
1233/* Get full pathname and line number positions for a symtab.
1234 Return nonzero if line numbers may have changed.
1235 Set *FULLNAME to actual name of the file as found by `openp',
1236 or to 0 if the file is not found. */
1237
1238static int
fba45db2 1239get_filename_and_charpos (struct symtab *s, char **fullname)
c906108c 1240{
52f0bd74 1241 int desc, linenums_changed = 0;
9fe4a216 1242 struct cleanup *cleanups;
c5aa993b 1243
c906108c
SS
1244 desc = open_source_file (s);
1245 if (desc < 0)
1246 {
1247 if (fullname)
1248 *fullname = NULL;
1249 return 0;
c5aa993b 1250 }
9fe4a216 1251 cleanups = make_cleanup_close (desc);
c906108c
SS
1252 if (fullname)
1253 *fullname = s->fullname;
c5aa993b
JM
1254 if (s->line_charpos == 0)
1255 linenums_changed = 1;
1256 if (linenums_changed)
1257 find_source_lines (s, desc);
9fe4a216 1258 do_cleanups (cleanups);
c906108c
SS
1259 return linenums_changed;
1260}
1261
1262/* Print text describing the full name of the source file S
1263 and the line number LINE and its corresponding character position.
1264 The text starts with two Ctrl-z so that the Emacs-GDB interface
1265 can easily find it.
1266
1267 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
1268
1269 Return 1 if successful, 0 if could not find the file. */
1270
1271int
fba45db2
KB
1272identify_source_line (struct symtab *s, int line, int mid_statement,
1273 CORE_ADDR pc)
c906108c
SS
1274{
1275 if (s->line_charpos == 0)
c5aa993b 1276 get_filename_and_charpos (s, (char **) NULL);
c906108c
SS
1277 if (s->fullname == 0)
1278 return 0;
1279 if (line > s->nlines)
1280 /* Don't index off the end of the line_charpos array. */
1281 return 0;
1282 annotate_source (s->fullname, line, s->line_charpos[line - 1],
5af949e3 1283 mid_statement, get_objfile_arch (s->objfile), pc);
c906108c
SS
1284
1285 current_source_line = line;
1286 first_line_listed = line;
1287 last_line_listed = line;
1288 current_source_symtab = s;
1289 return 1;
1290}
c906108c 1291\f
c5aa993b 1292
c906108c 1293/* Print source lines from the file of symtab S,
c378eb4e 1294 starting with line number LINE and stopping before line number STOPLINE. */
c906108c
SS
1295
1296static void
dfaae886
MM
1297print_source_lines_base (struct symtab *s, int line, int stopline,
1298 enum print_source_lines_flags flags)
c906108c 1299{
52f0bd74
AC
1300 int c;
1301 int desc;
f4dfd9c0 1302 int noprint = 0;
52f0bd74 1303 FILE *stream;
c906108c 1304 int nlines = stopline - line;
7c8a8b04 1305 struct cleanup *cleanup;
79a45e25 1306 struct ui_out *uiout = current_uiout;
c906108c 1307
c378eb4e 1308 /* Regardless of whether we can open the file, set current_source_symtab. */
c906108c
SS
1309 current_source_symtab = s;
1310 current_source_line = line;
1311 first_line_listed = line;
1312
3e43a32a 1313 /* If printing of source lines is disabled, just print file and line
c378eb4e 1314 number. */
8b93c638
JM
1315 if (ui_out_test_flags (uiout, ui_source_list))
1316 {
c378eb4e 1317 /* Only prints "No such file or directory" once. */
c5aa993b
JM
1318 if ((s != last_source_visited) || (!last_source_error))
1319 {
1320 last_source_visited = s;
1321 desc = open_source_file (s);
1322 }
1323 else
1324 {
1325 desc = last_source_error;
dfaae886 1326 flags |= PRINT_SOURCE_LINES_NOERROR;
c5aa993b 1327 }
8b93c638
JM
1328 }
1329 else
1330 {
f4dfd9c0 1331 desc = last_source_error;
dfaae886 1332 flags |= PRINT_SOURCE_LINES_NOERROR;
f4dfd9c0 1333 noprint = 1;
8b93c638 1334 }
c906108c 1335
f4dfd9c0 1336 if (desc < 0 || noprint)
c906108c
SS
1337 {
1338 last_source_error = desc;
1339
dfaae886 1340 if (!(flags & PRINT_SOURCE_LINES_NOERROR))
c5aa993b 1341 {
05cba821
JK
1342 const char *filename = symtab_to_filename_for_display (s);
1343 int len = strlen (filename) + 100;
08850b56
PM
1344 char *name = alloca (len);
1345
05cba821 1346 xsnprintf (name, len, "%d\t%s", line, filename);
c906108c
SS
1347 print_sys_errmsg (name, errno);
1348 }
1349 else
fc0ae648
AB
1350 {
1351 ui_out_field_int (uiout, "line", line);
1352 ui_out_text (uiout, "\tin ");
56d397a3 1353
23eb71e4
JK
1354 /* CLI expects only the "file" field. TUI expects only the
1355 "fullname" field (and TUI does break if "file" is printed).
1356 MI expects both fields. ui_source_list is set only for CLI,
1357 not for TUI. */
1358 if (ui_out_is_mi_like_p (uiout)
1359 || ui_out_test_flags (uiout, ui_source_list))
1360 ui_out_field_string (uiout, "file",
1361 symtab_to_filename_for_display (s));
56d397a3
JK
1362 if (ui_out_is_mi_like_p (uiout)
1363 || !ui_out_test_flags (uiout, ui_source_list))
8f1b8b82
JK
1364 {
1365 const char *s_fullname = symtab_to_fullname (s);
1366 char *local_fullname;
1367
1368 /* ui_out_field_string may free S_FULLNAME by calling
1369 open_source_file for it again. See e.g.,
1370 tui_field_string->tui_show_source. */
1371 local_fullname = alloca (strlen (s_fullname) + 1);
1372 strcpy (local_fullname, s_fullname);
1373
1374 ui_out_field_string (uiout, "fullname", local_fullname);
1375 }
23eb71e4 1376
fc0ae648
AB
1377 ui_out_text (uiout, "\n");
1378 }
c906108c
SS
1379
1380 return;
1381 }
1382
1383 last_source_error = 0;
1384
1385 if (s->line_charpos == 0)
1386 find_source_lines (s, desc);
1387
1388 if (line < 1 || line > s->nlines)
1389 {
1390 close (desc);
8a3fe4f8 1391 error (_("Line number %d out of range; %s has %d lines."),
05cba821 1392 line, symtab_to_filename_for_display (s), s->nlines);
c906108c
SS
1393 }
1394
1395 if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
1396 {
1397 close (desc);
05cba821 1398 perror_with_name (symtab_to_filename_for_display (s));
c906108c
SS
1399 }
1400
1401 stream = fdopen (desc, FDOPEN_MODE);
1402 clearerr (stream);
7c8a8b04 1403 cleanup = make_cleanup_fclose (stream);
c906108c
SS
1404
1405 while (nlines-- > 0)
1406 {
8b93c638
JM
1407 char buf[20];
1408
1409 c = fgetc (stream);
1410 if (c == EOF)
1411 break;
1412 last_line_listed = current_source_line;
4cd29721
MM
1413 if (flags & PRINT_SOURCE_LINES_FILENAME)
1414 {
05cba821 1415 ui_out_text (uiout, symtab_to_filename_for_display (s));
4cd29721
MM
1416 ui_out_text (uiout, ":");
1417 }
08850b56 1418 xsnprintf (buf, sizeof (buf), "%d\t", current_source_line++);
8b93c638
JM
1419 ui_out_text (uiout, buf);
1420 do
1421 {
1422 if (c < 040 && c != '\t' && c != '\n' && c != '\r')
1423 {
08850b56 1424 xsnprintf (buf, sizeof (buf), "^%c", c + 0100);
8b93c638
JM
1425 ui_out_text (uiout, buf);
1426 }
1427 else if (c == 0177)
1428 ui_out_text (uiout, "^?");
8b93c638
JM
1429 else if (c == '\r')
1430 {
1431 /* Skip a \r character, but only before a \n. */
1432 int c1 = fgetc (stream);
1433
1434 if (c1 != '\n')
1435 printf_filtered ("^%c", c + 0100);
1436 if (c1 != EOF)
1437 ungetc (c1, stream);
1438 }
8b93c638
JM
1439 else
1440 {
08850b56 1441 xsnprintf (buf, sizeof (buf), "%c", c);
8b93c638
JM
1442 ui_out_text (uiout, buf);
1443 }
1444 }
1445 while (c != '\n' && (c = fgetc (stream)) >= 0);
c906108c
SS
1446 }
1447
7c8a8b04 1448 do_cleanups (cleanup);
c906108c
SS
1449}
1450\f
1451/* Show source lines from the file of symtab S, starting with line
f132ba9d 1452 number LINE and stopping before line number STOPLINE. If this is
c906108c 1453 not the command line version, then the source is shown in the source
c378eb4e 1454 window otherwise it is simply printed. */
c906108c 1455
c5aa993b 1456void
dfaae886
MM
1457print_source_lines (struct symtab *s, int line, int stopline,
1458 enum print_source_lines_flags flags)
c906108c 1459{
dfaae886 1460 print_source_lines_base (s, line, stopline, flags);
c906108c
SS
1461}
1462\f
c906108c
SS
1463/* Print info on range of pc's in a specified line. */
1464
1465static void
fba45db2 1466line_info (char *arg, int from_tty)
c906108c
SS
1467{
1468 struct symtabs_and_lines sals;
1469 struct symtab_and_line sal;
1470 CORE_ADDR start_pc, end_pc;
1471 int i;
f8eba3c6 1472 struct cleanup *cleanups;
c906108c 1473
fe39c653 1474 init_sal (&sal); /* initialize to zeroes */
c906108c
SS
1475
1476 if (arg == 0)
1477 {
1478 sal.symtab = current_source_symtab;
f8eba3c6 1479 sal.pspace = current_program_space;
c906108c
SS
1480 sal.line = last_line_listed;
1481 sals.nelts = 1;
1482 sals.sals = (struct symtab_and_line *)
1483 xmalloc (sizeof (struct symtab_and_line));
1484 sals.sals[0] = sal;
1485 }
1486 else
1487 {
39cf75f7 1488 sals = decode_line_with_last_displayed (arg, DECODE_LINE_LIST_MODE);
c5aa993b 1489
c906108c
SS
1490 dont_repeat ();
1491 }
1492
f8eba3c6
TT
1493 cleanups = make_cleanup (xfree, sals.sals);
1494
c906108c 1495 /* C++ More than one line may have been specified, as when the user
c378eb4e 1496 specifies an overloaded function name. Print info on them all. */
c906108c
SS
1497 for (i = 0; i < sals.nelts; i++)
1498 {
1499 sal = sals.sals[i];
f8eba3c6
TT
1500 if (sal.pspace != current_program_space)
1501 continue;
c5aa993b 1502
c906108c
SS
1503 if (sal.symtab == 0)
1504 {
5af949e3
UW
1505 struct gdbarch *gdbarch = get_current_arch ();
1506
a3f17187 1507 printf_filtered (_("No line number information available"));
c906108c
SS
1508 if (sal.pc != 0)
1509 {
1510 /* This is useful for "info line *0x7f34". If we can't tell the
c5aa993b
JM
1511 user about a source line, at least let them have the symbolic
1512 address. */
c906108c
SS
1513 printf_filtered (" for address ");
1514 wrap_here (" ");
5af949e3 1515 print_address (gdbarch, sal.pc, gdb_stdout);
c906108c
SS
1516 }
1517 else
1518 printf_filtered (".");
1519 printf_filtered ("\n");
1520 }
1521 else if (sal.line > 0
1522 && find_line_pc_range (sal, &start_pc, &end_pc))
1523 {
5af949e3
UW
1524 struct gdbarch *gdbarch = get_objfile_arch (sal.symtab->objfile);
1525
c906108c
SS
1526 if (start_pc == end_pc)
1527 {
1528 printf_filtered ("Line %d of \"%s\"",
05cba821
JK
1529 sal.line,
1530 symtab_to_filename_for_display (sal.symtab));
c906108c
SS
1531 wrap_here (" ");
1532 printf_filtered (" is at address ");
5af949e3 1533 print_address (gdbarch, start_pc, gdb_stdout);
c906108c
SS
1534 wrap_here (" ");
1535 printf_filtered (" but contains no code.\n");
1536 }
1537 else
1538 {
1539 printf_filtered ("Line %d of \"%s\"",
05cba821
JK
1540 sal.line,
1541 symtab_to_filename_for_display (sal.symtab));
c906108c
SS
1542 wrap_here (" ");
1543 printf_filtered (" starts at address ");
5af949e3 1544 print_address (gdbarch, start_pc, gdb_stdout);
c906108c
SS
1545 wrap_here (" ");
1546 printf_filtered (" and ends at ");
5af949e3 1547 print_address (gdbarch, end_pc, gdb_stdout);
c906108c
SS
1548 printf_filtered (".\n");
1549 }
1550
1551 /* x/i should display this line's code. */
5af949e3 1552 set_next_address (gdbarch, start_pc);
c906108c
SS
1553
1554 /* Repeating "info line" should do the following line. */
1555 last_line_listed = sal.line + 1;
1556
1557 /* If this is the only line, show the source code. If it could
1558 not find the file, don't do anything special. */
1559 if (annotation_level && sals.nelts == 1)
1560 identify_source_line (sal.symtab, sal.line, 0, start_pc);
1561 }
1562 else
1563 /* Is there any case in which we get here, and have an address
1564 which the user would want to see? If we have debugging symbols
1565 and no line numbers? */
a3f17187 1566 printf_filtered (_("Line number %d is out of range for \"%s\".\n"),
05cba821 1567 sal.line, symtab_to_filename_for_display (sal.symtab));
c906108c 1568 }
f8eba3c6 1569 do_cleanups (cleanups);
c906108c
SS
1570}
1571\f
1572/* Commands to search the source file for a regexp. */
1573
c906108c 1574static void
fba45db2 1575forward_search_command (char *regex, int from_tty)
c906108c 1576{
52f0bd74
AC
1577 int c;
1578 int desc;
1579 FILE *stream;
c906108c
SS
1580 int line;
1581 char *msg;
9fe4a216 1582 struct cleanup *cleanups;
c906108c 1583
c906108c 1584 line = last_line_listed + 1;
c906108c
SS
1585
1586 msg = (char *) re_comp (regex);
1587 if (msg)
8a3fe4f8 1588 error (("%s"), msg);
c906108c
SS
1589
1590 if (current_source_symtab == 0)
1591 select_source_symtab (0);
1592
1593 desc = open_source_file (current_source_symtab);
1594 if (desc < 0)
05cba821 1595 perror_with_name (symtab_to_filename_for_display (current_source_symtab));
9fe4a216 1596 cleanups = make_cleanup_close (desc);
c906108c
SS
1597
1598 if (current_source_symtab->line_charpos == 0)
1599 find_source_lines (current_source_symtab, desc);
1600
1601 if (line < 1 || line > current_source_symtab->nlines)
9fe4a216 1602 error (_("Expression not found"));
c906108c
SS
1603
1604 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
05cba821 1605 perror_with_name (symtab_to_filename_for_display (current_source_symtab));
c906108c 1606
9fe4a216 1607 discard_cleanups (cleanups);
c906108c
SS
1608 stream = fdopen (desc, FDOPEN_MODE);
1609 clearerr (stream);
9fe4a216 1610 cleanups = make_cleanup_fclose (stream);
c5aa993b
JM
1611 while (1)
1612 {
1613 static char *buf = NULL;
aa1ee363 1614 char *p;
c5aa993b
JM
1615 int cursize, newsize;
1616
1617 cursize = 256;
1618 buf = xmalloc (cursize);
1619 p = buf;
1620
40aea477 1621 c = fgetc (stream);
c5aa993b
JM
1622 if (c == EOF)
1623 break;
1624 do
c906108c 1625 {
c5aa993b
JM
1626 *p++ = c;
1627 if (p - buf == cursize)
1628 {
1629 newsize = cursize + cursize / 2;
1630 buf = xrealloc (buf, newsize);
1631 p = buf + cursize;
1632 cursize = newsize;
1633 }
c906108c 1634 }
40aea477 1635 while (c != '\n' && (c = fgetc (stream)) >= 0);
c906108c 1636
7be570e7
JM
1637 /* Remove the \r, if any, at the end of the line, otherwise
1638 regular expressions that end with $ or \n won't work. */
1639 if (p - buf > 1 && p[-2] == '\r')
1640 {
1641 p--;
1642 p[-1] = '\n';
1643 }
7be570e7 1644
c378eb4e 1645 /* We now have a source line in buf, null terminate and match. */
c5aa993b
JM
1646 *p = 0;
1647 if (re_exec (buf) > 0)
1648 {
c378eb4e 1649 /* Match! */
e681b284 1650 do_cleanups (cleanups);
c5aa993b 1651 print_source_lines (current_source_symtab, line, line + 1, 0);
4fa62494 1652 set_internalvar_integer (lookup_internalvar ("_"), line);
c5aa993b
JM
1653 current_source_line = max (line - lines_to_list / 2, 1);
1654 return;
1655 }
1656 line++;
1657 }
c906108c 1658
a3f17187 1659 printf_filtered (_("Expression not found\n"));
9fe4a216 1660 do_cleanups (cleanups);
c906108c
SS
1661}
1662
c906108c 1663static void
fba45db2 1664reverse_search_command (char *regex, int from_tty)
c906108c 1665{
52f0bd74
AC
1666 int c;
1667 int desc;
1668 FILE *stream;
c906108c
SS
1669 int line;
1670 char *msg;
9fe4a216 1671 struct cleanup *cleanups;
063190b6 1672
c906108c 1673 line = last_line_listed - 1;
c906108c
SS
1674
1675 msg = (char *) re_comp (regex);
1676 if (msg)
8a3fe4f8 1677 error (("%s"), msg);
c906108c
SS
1678
1679 if (current_source_symtab == 0)
1680 select_source_symtab (0);
1681
1682 desc = open_source_file (current_source_symtab);
1683 if (desc < 0)
05cba821 1684 perror_with_name (symtab_to_filename_for_display (current_source_symtab));
9fe4a216 1685 cleanups = make_cleanup_close (desc);
c906108c
SS
1686
1687 if (current_source_symtab->line_charpos == 0)
1688 find_source_lines (current_source_symtab, desc);
1689
1690 if (line < 1 || line > current_source_symtab->nlines)
9fe4a216 1691 error (_("Expression not found"));
c906108c
SS
1692
1693 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
05cba821 1694 perror_with_name (symtab_to_filename_for_display (current_source_symtab));
c906108c 1695
9fe4a216 1696 discard_cleanups (cleanups);
c906108c
SS
1697 stream = fdopen (desc, FDOPEN_MODE);
1698 clearerr (stream);
9fe4a216 1699 cleanups = make_cleanup_fclose (stream);
c906108c
SS
1700 while (line > 1)
1701 {
c378eb4e
MS
1702/* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1703 char buf[4096]; /* Should be reasonable??? */
aa1ee363 1704 char *p = buf;
c906108c 1705
40aea477 1706 c = fgetc (stream);
c906108c
SS
1707 if (c == EOF)
1708 break;
c5aa993b
JM
1709 do
1710 {
1711 *p++ = c;
1712 }
40aea477 1713 while (c != '\n' && (c = fgetc (stream)) >= 0);
c906108c 1714
7be570e7
JM
1715 /* Remove the \r, if any, at the end of the line, otherwise
1716 regular expressions that end with $ or \n won't work. */
1717 if (p - buf > 1 && p[-2] == '\r')
1718 {
1719 p--;
1720 p[-1] = '\n';
1721 }
7be570e7 1722
c906108c
SS
1723 /* We now have a source line in buf; null terminate and match. */
1724 *p = 0;
1725 if (re_exec (buf) > 0)
1726 {
c378eb4e 1727 /* Match! */
e681b284 1728 do_cleanups (cleanups);
c5aa993b 1729 print_source_lines (current_source_symtab, line, line + 1, 0);
4fa62494 1730 set_internalvar_integer (lookup_internalvar ("_"), line);
c906108c
SS
1731 current_source_line = max (line - lines_to_list / 2, 1);
1732 return;
1733 }
1734 line--;
1735 if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1736 {
05cba821
JK
1737 const char *filename;
1738
e681b284 1739 do_cleanups (cleanups);
05cba821
JK
1740 filename = symtab_to_filename_for_display (current_source_symtab);
1741 perror_with_name (filename);
c906108c
SS
1742 }
1743 }
1744
a3f17187 1745 printf_filtered (_("Expression not found\n"));
9fe4a216 1746 do_cleanups (cleanups);
c906108c
SS
1747 return;
1748}
2f61ca93
JB
1749
1750/* If the last character of PATH is a directory separator, then strip it. */
1751
1752static void
1753strip_trailing_directory_separator (char *path)
1754{
1755 const int last = strlen (path) - 1;
1756
1757 if (last < 0)
1758 return; /* No stripping is needed if PATH is the empty string. */
1759
1760 if (IS_DIR_SEPARATOR (path[last]))
1761 path[last] = '\0';
1762}
1763
1764/* Return the path substitution rule that matches FROM.
1765 Return NULL if no rule matches. */
1766
1767static struct substitute_path_rule *
1768find_substitute_path_rule (const char *from)
1769{
1770 struct substitute_path_rule *rule = substitute_path_rules;
1771
1772 while (rule != NULL)
1773 {
1774 if (FILENAME_CMP (rule->from, from) == 0)
1775 return rule;
1776 rule = rule->next;
1777 }
1778
1779 return NULL;
1780}
1781
1782/* Add a new substitute-path rule at the end of the current list of rules.
1783 The new rule will replace FROM into TO. */
1784
29b0e8a2 1785void
2f61ca93
JB
1786add_substitute_path_rule (char *from, char *to)
1787{
1788 struct substitute_path_rule *rule;
1789 struct substitute_path_rule *new_rule;
1790
1791 new_rule = xmalloc (sizeof (struct substitute_path_rule));
1792 new_rule->from = xstrdup (from);
1793 new_rule->to = xstrdup (to);
1794 new_rule->next = NULL;
1795
1796 /* If the list of rules are empty, then insert the new rule
1797 at the head of the list. */
1798
1799 if (substitute_path_rules == NULL)
1800 {
1801 substitute_path_rules = new_rule;
1802 return;
1803 }
1804
1805 /* Otherwise, skip to the last rule in our list and then append
1806 the new rule. */
1807
1808 rule = substitute_path_rules;
1809 while (rule->next != NULL)
1810 rule = rule->next;
1811
1812 rule->next = new_rule;
1813}
1814
1815/* Remove the given source path substitution rule from the current list
1816 of rules. The memory allocated for that rule is also deallocated. */
1817
1818static void
1819delete_substitute_path_rule (struct substitute_path_rule *rule)
1820{
1821 if (rule == substitute_path_rules)
1822 substitute_path_rules = rule->next;
1823 else
1824 {
1825 struct substitute_path_rule *prev = substitute_path_rules;
1826
1827 while (prev != NULL && prev->next != rule)
1828 prev = prev->next;
1829
1830 gdb_assert (prev != NULL);
1831
1832 prev->next = rule->next;
1833 }
1834
1835 xfree (rule->from);
1836 xfree (rule->to);
1837 xfree (rule);
1838}
1839
1840/* Implement the "show substitute-path" command. */
1841
1842static void
1843show_substitute_path_command (char *args, int from_tty)
1844{
1845 struct substitute_path_rule *rule = substitute_path_rules;
1846 char **argv;
1847 char *from = NULL;
5b3fca71 1848 struct cleanup *cleanup;
2f61ca93 1849
d1a41061 1850 argv = gdb_buildargv (args);
5b3fca71 1851 cleanup = make_cleanup_freeargv (argv);
2f61ca93
JB
1852
1853 /* We expect zero or one argument. */
1854
1855 if (argv != NULL && argv[0] != NULL && argv[1] != NULL)
1856 error (_("Too many arguments in command"));
1857
1858 if (argv != NULL && argv[0] != NULL)
1859 from = argv[0];
1860
1861 /* Print the substitution rules. */
1862
1863 if (from != NULL)
1864 printf_filtered
1865 (_("Source path substitution rule matching `%s':\n"), from);
1866 else
1867 printf_filtered (_("List of all source path substitution rules:\n"));
1868
1869 while (rule != NULL)
1870 {
1871 if (from == NULL || FILENAME_CMP (rule->from, from) == 0)
1872 printf_filtered (" `%s' -> `%s'.\n", rule->from, rule->to);
1873 rule = rule->next;
1874 }
5b3fca71
TT
1875
1876 do_cleanups (cleanup);
2f61ca93
JB
1877}
1878
1879/* Implement the "unset substitute-path" command. */
1880
1881static void
1882unset_substitute_path_command (char *args, int from_tty)
1883{
1884 struct substitute_path_rule *rule = substitute_path_rules;
d1a41061 1885 char **argv = gdb_buildargv (args);
2f61ca93
JB
1886 char *from = NULL;
1887 int rule_found = 0;
5b3fca71 1888 struct cleanup *cleanup;
2f61ca93
JB
1889
1890 /* This function takes either 0 or 1 argument. */
1891
5b3fca71 1892 cleanup = make_cleanup_freeargv (argv);
2f61ca93
JB
1893 if (argv != NULL && argv[0] != NULL && argv[1] != NULL)
1894 error (_("Incorrect usage, too many arguments in command"));
1895
1896 if (argv != NULL && argv[0] != NULL)
1897 from = argv[0];
1898
1899 /* If the user asked for all the rules to be deleted, ask him
1900 to confirm and give him a chance to abort before the action
1901 is performed. */
1902
1903 if (from == NULL
1904 && !query (_("Delete all source path substitution rules? ")))
1905 error (_("Canceled"));
1906
1907 /* Delete the rule matching the argument. No argument means that
1908 all rules should be deleted. */
1909
1910 while (rule != NULL)
1911 {
1912 struct substitute_path_rule *next = rule->next;
1913
1914 if (from == NULL || FILENAME_CMP (from, rule->from) == 0)
1915 {
1916 delete_substitute_path_rule (rule);
1917 rule_found = 1;
1918 }
1919
1920 rule = next;
1921 }
1922
1923 /* If the user asked for a specific rule to be deleted but
1924 we could not find it, then report an error. */
1925
1926 if (from != NULL && !rule_found)
1927 error (_("No substitution rule defined for `%s'"), from);
c4e86dd4
DJ
1928
1929 forget_cached_source_info ();
5b3fca71
TT
1930
1931 do_cleanups (cleanup);
2f61ca93
JB
1932}
1933
1934/* Add a new source path substitution rule. */
1935
1936static void
1937set_substitute_path_command (char *args, int from_tty)
1938{
2f61ca93
JB
1939 char **argv;
1940 struct substitute_path_rule *rule;
5b3fca71 1941 struct cleanup *cleanup;
2f61ca93 1942
d1a41061 1943 argv = gdb_buildargv (args);
5b3fca71 1944 cleanup = make_cleanup_freeargv (argv);
2f61ca93
JB
1945
1946 if (argv == NULL || argv[0] == NULL || argv [1] == NULL)
1947 error (_("Incorrect usage, too few arguments in command"));
1948
1949 if (argv[2] != NULL)
1950 error (_("Incorrect usage, too many arguments in command"));
1951
1952 if (*(argv[0]) == '\0')
1953 error (_("First argument must be at least one character long"));
1954
1955 /* Strip any trailing directory separator character in either FROM
1956 or TO. The substitution rule already implicitly contains them. */
1957 strip_trailing_directory_separator (argv[0]);
1958 strip_trailing_directory_separator (argv[1]);
1959
1960 /* If a rule with the same "from" was previously defined, then
1961 delete it. This new rule replaces it. */
1962
1963 rule = find_substitute_path_rule (argv[0]);
1964 if (rule != NULL)
1965 delete_substitute_path_rule (rule);
1966
1967 /* Insert the new substitution rule. */
1968
1969 add_substitute_path_rule (argv[0], argv[1]);
c4e86dd4 1970 forget_cached_source_info ();
5b3fca71
TT
1971
1972 do_cleanups (cleanup);
2f61ca93
JB
1973}
1974
c906108c
SS
1975\f
1976void
fba45db2 1977_initialize_source (void)
c906108c
SS
1978{
1979 struct cmd_list_element *c;
433759f7 1980
c906108c
SS
1981 current_source_symtab = 0;
1982 init_source_path ();
1983
1984 /* The intention is to use POSIX Basic Regular Expressions.
1985 Always use the GNU regex routine for consistency across all hosts.
1986 Our current GNU regex.c does not have all the POSIX features, so this is
1987 just an approximation. */
1988 re_set_syntax (RE_SYNTAX_GREP);
1989
1a966eab
AC
1990 c = add_cmd ("directory", class_files, directory_command, _("\
1991Add directory DIR to beginning of search path for source files.\n\
c906108c
SS
1992Forget cached info on source file locations and line positions.\n\
1993DIR can also be $cwd for the current working directory, or $cdir for the\n\
1994directory in which the source file was compiled into object code.\n\
1a966eab 1995With no argument, reset the search path to $cdir:$cwd, the default."),
c906108c
SS
1996 &cmdlist);
1997
1998 if (dbx_commands)
c5aa993b 1999 add_com_alias ("use", "directory", class_files, 0);
c906108c 2000
5ba2abeb 2001 set_cmd_completer (c, filename_completer);
c906108c 2002
99e7ae30
DE
2003 add_setshow_optional_filename_cmd ("directories",
2004 class_files,
2005 &source_path,
2006 _("\
2007Set the search path for finding source files."),
2008 _("\
2009Show the search path for finding source files."),
2010 _("\
c906108c 2011$cwd in the path means the current working directory.\n\
99e7ae30
DE
2012$cdir in the path means the compilation directory of the source file.\n\
2013GDB ensures the search path always ends with $cdir:$cwd by\n\
2014appending these directories if necessary.\n\
2015Setting the value to an empty string sets it to $cdir:$cwd, the default."),
2016 set_directories_command,
2017 show_directories_command,
2018 &setlist, &showlist);
c906108c
SS
2019
2020 if (xdb_commands)
2021 {
c5aa993b 2022 add_com_alias ("D", "directory", class_files, 0);
99e7ae30 2023 add_cmd ("ld", no_class, show_directories_1, _("\
1a966eab 2024Current search path for finding source files.\n\
c906108c 2025$cwd in the path means the current working directory.\n\
1a966eab 2026$cdir in the path means the compilation directory of the source file."),
c5aa993b 2027 &cmdlist);
c906108c
SS
2028 }
2029
2030 add_info ("source", source_info,
1bedd215 2031 _("Information about the current source file."));
c906108c 2032
1bedd215
AC
2033 add_info ("line", line_info, _("\
2034Core addresses of the code for a source line.\n\
c906108c
SS
2035Line can be specified as\n\
2036 LINENUM, to list around that line in current file,\n\
2037 FILE:LINENUM, to list around that line in that file,\n\
2038 FUNCTION, to list around beginning of that function,\n\
2039 FILE:FUNCTION, to distinguish among like-named static functions.\n\
c906108c
SS
2040Default is to describe the last source line that was listed.\n\n\
2041This sets the default address for \"x\" to the line's first instruction\n\
2042so that \"x/i\" suffices to start examining the machine code.\n\
1bedd215 2043The address is also stored as the value of \"$_\"."));
c906108c 2044
1bedd215
AC
2045 add_com ("forward-search", class_files, forward_search_command, _("\
2046Search for regular expression (see regex(3)) from last line listed.\n\
2047The matching line number is also stored as the value of \"$_\"."));
c906108c 2048 add_com_alias ("search", "forward-search", class_files, 0);
1e96de83 2049 add_com_alias ("fo", "forward-search", class_files, 1);
c906108c 2050
1bedd215
AC
2051 add_com ("reverse-search", class_files, reverse_search_command, _("\
2052Search backward for regular expression (see regex(3)) from last line listed.\n\
2053The matching line number is also stored as the value of \"$_\"."));
dd304d53 2054 add_com_alias ("rev", "reverse-search", class_files, 1);
c906108c
SS
2055
2056 if (xdb_commands)
2057 {
c5aa993b
JM
2058 add_com_alias ("/", "forward-search", class_files, 0);
2059 add_com_alias ("?", "reverse-search", class_files, 0);
c906108c
SS
2060 }
2061
7f7cc265 2062 add_setshow_integer_cmd ("listsize", class_support, &lines_to_list, _("\
35096d9d 2063Set number of source lines gdb will list by default."), _("\
f81d1120
PA
2064Show number of source lines gdb will list by default."), _("\
2065Use this to choose how many source lines the \"list\" displays (unless\n\
2066the \"list\" argument explicitly specifies some other number).\n\
2067A value of \"unlimited\", or zero, means there's no limit."),
7f7cc265
PA
2068 NULL,
2069 show_lines_to_list,
2070 &setlist, &showlist);
2f61ca93
JB
2071
2072 add_cmd ("substitute-path", class_files, set_substitute_path_command,
2073 _("\
7ef2b397
JB
2074Usage: set substitute-path FROM TO\n\
2075Add a substitution rule replacing FROM into TO in source file names.\n\
2076If a substitution rule was previously set for FROM, the old rule\n\
2077is replaced by the new one."),
2078 &setlist);
2f61ca93
JB
2079
2080 add_cmd ("substitute-path", class_files, unset_substitute_path_command,
2081 _("\
7ef2b397
JB
2082Usage: unset substitute-path [FROM]\n\
2083Delete the rule for substituting FROM in source file names. If FROM\n\
2084is not specified, all substituting rules are deleted.\n\
2085If the debugger cannot find a rule for FROM, it will display a warning."),
2f61ca93
JB
2086 &unsetlist);
2087
2088 add_cmd ("substitute-path", class_files, show_substitute_path_command,
7ef2b397
JB
2089 _("\
2090Usage: show substitute-path [FROM]\n\
2091Print the rule for substituting FROM in source file names. If FROM\n\
2092is not specified, print all substitution rules."),
2f61ca93 2093 &showlist);
1b56eb55
JK
2094
2095 add_setshow_enum_cmd ("filename-display", class_files,
2096 filename_display_kind_names,
2097 &filename_display_string, _("\
2098Set how to display filenames."), _("\
2099Show how to display filenames."), _("\
2100filename-display can be:\n\
2101 basename - display only basename of a filename\n\
2102 relative - display a filename relative to the compilation directory\n\
2103 absolute - display an absolute filename\n\
2104By default, relative filenames are displayed."),
2105 NULL,
2106 show_filename_display_string,
2107 &setlist, &showlist);
2108
c906108c 2109}
This page took 1.451864 seconds and 4 git commands to generate.