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