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