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