Record objfile->original_name as an absolute path
[external/binutils.git] / gdb / source.c
1 /* List lines of source files for GDB, the GNU debugger.
2    Copyright (C) 1986-2013 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
53 void _initialize_source (void);
54
55 /* Prototypes for local functions.  */
56
57 static int get_filename_and_charpos (struct symtab *, char **);
58
59 static void reverse_search_command (char *, int);
60
61 static void forward_search_command (char *, int);
62
63 static void line_info (char *, int);
64
65 static 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
70 char *source_path;
71
72 /* Support for source path substitution commands.  */
73
74 struct substitute_path_rule
75 {
76   char *from;
77   char *to;
78   struct substitute_path_rule *next;
79 };
80
81 static struct substitute_path_rule *substitute_path_rules = NULL;
82
83 /* Symtab of default file for listing lines of.  */
84
85 static struct symtab *current_source_symtab;
86
87 /* Default next line to list.  */
88
89 static int current_source_line;
90
91 static 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
99 int lines_to_list = 10;
100 static void
101 show_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'.  */
111 static const char filename_display_basename[] = "basename";
112 static const char filename_display_relative[] = "relative";
113 static const char filename_display_absolute[] = "absolute";
114
115 static const char *const filename_display_kind_names[] = {
116   filename_display_basename,
117   filename_display_relative,
118   filename_display_absolute,
119   NULL
120 };
121
122 static const char *filename_display_string = filename_display_relative;
123
124 static void
125 show_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
134 static int last_line_listed;
135
136 /* First line number listed by last listing command.  */
137
138 static 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
143 static struct symtab *last_source_visited = NULL;
144 static 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
150 int
151 get_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
161 int
162 get_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    
170 struct symtab_and_line
171 get_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    
192 void
193 set_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    
208 struct symtab_and_line
209 set_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
228 void
229 clear_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
243 void
244 select_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
317 static void
318 set_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
339 static void
340 show_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
349 static void
350 show_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
359 void
360 forget_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
386 void
387 forget_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
401 void
402 init_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
413 static void
414 directory_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
438 void
439 directory_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
446 void
447 mod_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
458 void
459 add_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         /* FIXME: we should use realpath() or its work-alike
578            before comparing.  Then all the code above which
579            removes excess slashes and dots could simply go away.  */
580         if (!filename_cmp (p, name))
581           {
582             /* Found it in the search path, remove old copy.  */
583             if (p > *which_path)
584               p--;              /* Back over leading separator.  */
585             if (prefix > p - *which_path)
586               goto skip_dup;    /* Same dir twice in one cmd.  */
587             memmove (p, &p[len + 1], strlen (&p[len + 1]) + 1); /* Copy from next \0 or  : */
588           }
589
590         tinybuf[0] = DIRNAME_SEPARATOR;
591         tinybuf[1] = '\0';
592
593         /* If we have already tacked on a name(s) in this command,
594            be sure they stay on the front as we tack on some
595            more.  */
596         if (prefix)
597           {
598             char *temp, c;
599
600             c = old[prefix];
601             old[prefix] = '\0';
602             temp = concat (old, tinybuf, name, (char *)NULL);
603             old[prefix] = c;
604             *which_path = concat (temp, "", &old[prefix], (char *) NULL);
605             prefix = strlen (temp);
606             xfree (temp);
607           }
608         else
609           {
610             *which_path = concat (name, (old[0] ? tinybuf : old),
611                                   old, (char *)NULL);
612             prefix = strlen (name);
613           }
614         xfree (old);
615         old = *which_path;
616       }
617     skip_dup:
618       ;
619     }
620
621   do_cleanups (back_to);
622 }
623
624
625 static void
626 source_info (char *ignore, int from_tty)
627 {
628   struct symtab *s = current_source_symtab;
629
630   if (!s)
631     {
632       printf_filtered (_("No current source file.\n"));
633       return;
634     }
635   printf_filtered (_("Current source file is %s\n"), s->filename);
636   if (s->dirname)
637     printf_filtered (_("Compilation directory is %s\n"), s->dirname);
638   if (s->fullname)
639     printf_filtered (_("Located in %s\n"), s->fullname);
640   if (s->nlines)
641     printf_filtered (_("Contains %d line%s.\n"), s->nlines,
642                      s->nlines == 1 ? "" : "s");
643
644   printf_filtered (_("Source language is %s.\n"), language_str (s->language));
645   printf_filtered (_("Compiled with %s debugging format.\n"), s->debugformat);
646   printf_filtered (_("%s preprocessor macro info.\n"),
647                    s->macro_table ? "Includes" : "Does not include");
648 }
649 \f
650
651 /* Return True if the file NAME exists and is a regular file.  */
652 static int
653 is_regular_file (const char *name)
654 {
655   struct stat st;
656   const int status = stat (name, &st);
657
658   /* Stat should never fail except when the file does not exist.
659      If stat fails, analyze the source of error and return True
660      unless the file does not exist, to avoid returning false results
661      on obscure systems where stat does not work as expected.  */
662
663   if (status != 0)
664     return (errno != ENOENT);
665
666   return S_ISREG (st.st_mode);
667 }
668
669 /* Open a file named STRING, searching path PATH (dir names sep by some char)
670    using mode MODE in the calls to open.  You cannot use this function to
671    create files (O_CREAT).
672
673    OPTS specifies the function behaviour in specific cases.
674
675    If OPF_TRY_CWD_FIRST, try to open ./STRING before searching PATH.
676    (ie pretend the first element of PATH is ".").  This also indicates
677    that, unless OPF_SEARCH_IN_PATH is also specified, a slash in STRING
678    disables searching of the path (this is so that "exec-file ./foo" or
679    "symbol-file ./foo" insures that you get that particular version of
680    foo or an error message).
681
682    If OPTS has OPF_SEARCH_IN_PATH set, absolute names will also be
683    searched in path (we usually want this for source files but not for
684    executables).
685
686    If FILENAME_OPENED is non-null, set it to a newly allocated string naming
687    the actual file opened (this string will always start with a "/").  We
688    have to take special pains to avoid doubling the "/" between the directory
689    and the file, sigh!  Emacs gets confuzzed by this when we print the
690    source file name!!! 
691
692    If OPTS has OPF_RETURN_REALPATH set return FILENAME_OPENED resolved by
693    gdb_realpath.  Even without OPF_RETURN_REALPATH this function still returns
694    filename starting with "/".  If FILENAME_OPENED is NULL this option has no
695    effect.
696
697    If a file is found, return the descriptor.
698    Otherwise, return -1, with errno set for the last name we tried to open.  */
699
700 /*  >>>> This should only allow files of certain types,
701     >>>>  eg executable, non-directory.  */
702 int
703 openp (const char *path, int opts, const char *string,
704        int mode, char **filename_opened)
705 {
706   int fd;
707   char *filename;
708   int alloclen;
709   VEC (char_ptr) *dir_vec;
710   struct cleanup *back_to;
711   int ix;
712   char *dir;
713
714   /* The open syscall MODE parameter is not specified.  */
715   gdb_assert ((mode & O_CREAT) == 0);
716   gdb_assert (string != NULL);
717
718   /* A file with an empty name cannot possibly exist.  Report a failure
719      without further checking.
720
721      This is an optimization which also defends us against buggy
722      implementations of the "stat" function.  For instance, we have
723      noticed that a MinGW debugger built on Windows XP 32bits crashes
724      when the debugger is started with an empty argument.  */
725   if (string[0] == '\0')
726     {
727       errno = ENOENT;
728       return -1;
729     }
730
731   if (!path)
732     path = ".";
733
734   mode |= O_BINARY;
735
736   if ((opts & OPF_TRY_CWD_FIRST) || IS_ABSOLUTE_PATH (string))
737     {
738       int i;
739
740       if (is_regular_file (string))
741         {
742           filename = alloca (strlen (string) + 1);
743           strcpy (filename, string);
744           fd = gdb_open_cloexec (filename, mode, 0);
745           if (fd >= 0)
746             goto done;
747         }
748       else
749         {
750           filename = NULL;
751           fd = -1;
752         }
753
754       if (!(opts & OPF_SEARCH_IN_PATH))
755         for (i = 0; string[i]; i++)
756           if (IS_DIR_SEPARATOR (string[i]))
757             goto done;
758     }
759
760   /* For dos paths, d:/foo -> /foo, and d:foo -> foo.  */
761   if (HAS_DRIVE_SPEC (string))
762     string = STRIP_DRIVE_SPEC (string);
763
764   /* /foo => foo, to avoid multiple slashes that Emacs doesn't like.  */
765   while (IS_DIR_SEPARATOR(string[0]))
766     string++;
767
768   /* ./foo => foo */
769   while (string[0] == '.' && IS_DIR_SEPARATOR (string[1]))
770     string += 2;
771
772   alloclen = strlen (path) + strlen (string) + 2;
773   filename = alloca (alloclen);
774   fd = -1;
775
776   dir_vec = dirnames_to_char_ptr_vec (path);
777   back_to = make_cleanup_free_char_ptr_vec (dir_vec);
778
779   for (ix = 0; VEC_iterate (char_ptr, dir_vec, ix, dir); ++ix)
780     {
781       size_t len = strlen (dir);
782
783       if (strcmp (dir, "$cwd") == 0)
784         {
785           /* Name is $cwd -- insert current directory name instead.  */
786           int newlen;
787
788           /* First, realloc the filename buffer if too short.  */
789           len = strlen (current_directory);
790           newlen = len + strlen (string) + 2;
791           if (newlen > alloclen)
792             {
793               alloclen = newlen;
794               filename = alloca (alloclen);
795             }
796           strcpy (filename, current_directory);
797         }
798       else if (strchr(dir, '~'))
799         {
800          /* See whether we need to expand the tilde.  */
801           int newlen;
802           char *tilde_expanded;
803
804           tilde_expanded  = tilde_expand (dir);
805
806           /* First, realloc the filename buffer if too short.  */
807           len = strlen (tilde_expanded);
808           newlen = len + strlen (string) + 2;
809           if (newlen > alloclen)
810             {
811               alloclen = newlen;
812               filename = alloca (alloclen);
813             }
814           strcpy (filename, tilde_expanded);
815           xfree (tilde_expanded);
816         }
817       else
818         {
819           /* Normal file name in path -- just use it.  */
820           strcpy (filename, dir);
821
822           /* Don't search $cdir.  It's also a magic path like $cwd, but we
823              don't have enough information to expand it.  The user *could*
824              have an actual directory named '$cdir' but handling that would
825              be confusing, it would mean different things in different
826              contexts.  If the user really has '$cdir' one can use './$cdir'.
827              We can get $cdir when loading scripts.  When loading source files
828              $cdir must have already been expanded to the correct value.  */
829           if (strcmp (dir, "$cdir") == 0)
830             continue;
831         }
832
833       /* Remove trailing slashes.  */
834       while (len > 0 && IS_DIR_SEPARATOR (filename[len - 1]))
835         filename[--len] = 0;
836
837       strcat (filename + len, SLASH_STRING);
838       strcat (filename, string);
839
840       if (is_regular_file (filename))
841         {
842           fd = gdb_open_cloexec (filename, mode, 0);
843           if (fd >= 0)
844             break;
845         }
846     }
847
848   do_cleanups (back_to);
849
850 done:
851   if (filename_opened)
852     {
853       /* If a file was opened, canonicalize its filename.  */
854       if (fd < 0)
855         *filename_opened = NULL;
856       else if ((opts & OPF_RETURN_REALPATH) != 0)
857         *filename_opened = gdb_realpath (filename);
858       else
859         *filename_opened = gdb_abspath (filename);
860     }
861
862   return fd;
863 }
864
865
866 /* This is essentially a convenience, for clients that want the behaviour
867    of openp, using source_path, but that really don't want the file to be
868    opened but want instead just to know what the full pathname is (as
869    qualified against source_path).
870
871    The current working directory is searched first.
872
873    If the file was found, this function returns 1, and FULL_PATHNAME is
874    set to the fully-qualified pathname.
875
876    Else, this functions returns 0, and FULL_PATHNAME is set to NULL.  */
877 int
878 source_full_path_of (const char *filename, char **full_pathname)
879 {
880   int fd;
881
882   fd = openp (source_path,
883               OPF_TRY_CWD_FIRST | OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH,
884               filename, O_RDONLY, full_pathname);
885   if (fd < 0)
886     {
887       *full_pathname = NULL;
888       return 0;
889     }
890
891   close (fd);
892   return 1;
893 }
894
895 /* Return non-zero if RULE matches PATH, that is if the rule can be
896    applied to PATH.  */
897
898 static int
899 substitute_path_rule_matches (const struct substitute_path_rule *rule,
900                               const char *path)
901 {
902   const int from_len = strlen (rule->from);
903   const int path_len = strlen (path);
904   char *path_start;
905
906   if (path_len < from_len)
907     return 0;
908
909   /* The substitution rules are anchored at the start of the path,
910      so the path should start with rule->from.  There is no filename
911      comparison routine, so we need to extract the first FROM_LEN
912      characters from PATH first and use that to do the comparison.  */
913
914   path_start = alloca (from_len + 1);
915   strncpy (path_start, path, from_len);
916   path_start[from_len] = '\0';
917
918   if (FILENAME_CMP (path_start, rule->from) != 0)
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).  */
924   
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
934 static struct substitute_path_rule *
935 get_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
946    to PATH, then apply it and return the new path.  This new path must
947    be deallocated afterwards.
948    
949    Return NULL if no substitution rule was specified by the user,
950    or if no rule applied to the given PATH.  */
951    
952 char *
953 rewrite_source_path (const char *path)
954 {
955   const struct substitute_path_rule *rule = get_substitute_path_rule (path);
956   char *new_path;
957   int from_len;
958   
959   if (rule == NULL)
960     return NULL;
961
962   from_len = strlen (rule->from);
963
964   /* Compute the rewritten path and return it.  */
965
966   new_path =
967     (char *) xmalloc (strlen (path) + 1 + strlen (rule->to) - from_len);
968   strcpy (new_path, rule->to);
969   strcat (new_path, path + from_len);
970
971   return new_path;
972 }
973
974 int
975 find_and_open_source (const char *filename,
976                       const char *dirname,
977                       char **fullname)
978 {
979   char *path = source_path;
980   const char *p;
981   int result;
982   struct cleanup *cleanup;
983
984   /* Quick way out if we already know its full name.  */
985
986   if (*fullname)
987     {
988       /* The user may have requested that source paths be rewritten
989          according to substitution rules he provided.  If a substitution
990          rule applies to this path, then apply it.  */
991       char *rewritten_fullname = rewrite_source_path (*fullname);
992
993       if (rewritten_fullname != NULL)
994         {
995           xfree (*fullname);
996           *fullname = rewritten_fullname;
997         }
998
999       result = gdb_open_cloexec (*fullname, OPEN_MODE, 0);
1000       if (result >= 0)
1001         {
1002           char *lpath = gdb_realpath (*fullname);
1003
1004           xfree (*fullname);
1005           *fullname = lpath;
1006           return result;
1007         }
1008
1009       /* Didn't work -- free old one, try again.  */
1010       xfree (*fullname);
1011       *fullname = NULL;
1012     }
1013
1014   cleanup = make_cleanup (null_cleanup, NULL);
1015
1016   if (dirname != NULL)
1017     {
1018       /* If necessary, rewrite the compilation directory name according
1019          to the source path substitution rules specified by the user.  */
1020
1021       char *rewritten_dirname = rewrite_source_path (dirname);
1022
1023       if (rewritten_dirname != NULL)
1024         {
1025           make_cleanup (xfree, rewritten_dirname);
1026           dirname = rewritten_dirname;
1027         }
1028       
1029       /* Replace a path entry of $cdir with the compilation directory
1030          name.  */
1031 #define cdir_len        5
1032       /* We cast strstr's result in case an ANSIhole has made it const,
1033          which produces a "required warning" when assigned to a nonconst.  */
1034       p = (char *) strstr (source_path, "$cdir");
1035       if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
1036           && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
1037         {
1038           int len;
1039
1040           path = (char *)
1041             alloca (strlen (source_path) + 1 + strlen (dirname) + 1);
1042           len = p - source_path;
1043           strncpy (path, source_path, len);     /* Before $cdir */
1044           strcpy (path + len, dirname);         /* new stuff */
1045           strcat (path + len, source_path + len + cdir_len);    /* After
1046                                                                    $cdir */
1047         }
1048     }
1049
1050   if (IS_ABSOLUTE_PATH (filename))
1051     {
1052       /* If filename is absolute path, try the source path
1053          substitution on it.  */
1054       char *rewritten_filename = rewrite_source_path (filename);
1055
1056       if (rewritten_filename != NULL)
1057         {
1058           make_cleanup (xfree, rewritten_filename);
1059           filename = rewritten_filename;
1060         }
1061     }
1062
1063   result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename,
1064                   OPEN_MODE, fullname);
1065   if (result < 0)
1066     {
1067       /* Didn't work.  Try using just the basename.  */
1068       p = lbasename (filename);
1069       if (p != filename)
1070         result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, p,
1071                         OPEN_MODE, fullname);
1072     }
1073
1074   do_cleanups (cleanup);
1075   return result;
1076 }
1077
1078 /* Open a source file given a symtab S.  Returns a file descriptor or
1079    negative number for error.  
1080    
1081    This function is a convience function to find_and_open_source.  */
1082
1083 int
1084 open_source_file (struct symtab *s)
1085 {
1086   if (!s)
1087     return -1;
1088
1089   return find_and_open_source (s->filename, s->dirname, &s->fullname);
1090 }
1091
1092 /* Finds the fullname that a symtab represents.
1093
1094    This functions finds the fullname and saves it in s->fullname.
1095    It will also return the value.
1096
1097    If this function fails to find the file that this symtab represents,
1098    the expected fullname is used.  Therefore the files does not have to
1099    exist.  */
1100
1101 const char *
1102 symtab_to_fullname (struct symtab *s)
1103 {
1104   /* Use cached copy if we have it.
1105      We rely on forget_cached_source_info being called appropriately
1106      to handle cases like the file being moved.  */
1107   if (s->fullname == NULL)
1108     {
1109       int fd = find_and_open_source (s->filename, s->dirname, &s->fullname);
1110
1111       if (fd >= 0)
1112         close (fd);
1113       else
1114         {
1115           char *fullname;
1116           struct cleanup *back_to;
1117
1118           /* rewrite_source_path would be applied by find_and_open_source, we
1119              should report the pathname where GDB tried to find the file.  */
1120
1121           if (s->dirname == NULL || IS_ABSOLUTE_PATH (s->filename))
1122             fullname = xstrdup (s->filename);
1123           else
1124             fullname = concat (s->dirname, SLASH_STRING, s->filename, NULL);
1125
1126           back_to = make_cleanup (xfree, fullname);
1127           s->fullname = rewrite_source_path (fullname);
1128           if (s->fullname == NULL)
1129             s->fullname = xstrdup (fullname);
1130           do_cleanups (back_to);
1131         }
1132     } 
1133
1134   return s->fullname;
1135 }
1136
1137 /* See commentary in source.h.  */
1138
1139 const char *
1140 symtab_to_filename_for_display (struct symtab *symtab)
1141 {
1142   if (filename_display_string == filename_display_basename)
1143     return lbasename (symtab->filename);
1144   else if (filename_display_string == filename_display_absolute)
1145     return symtab_to_fullname (symtab);
1146   else if (filename_display_string == filename_display_relative)
1147     return symtab->filename;
1148   else
1149     internal_error (__FILE__, __LINE__, _("invalid filename_display_string"));
1150 }
1151 \f
1152 /* Create and initialize the table S->line_charpos that records
1153    the positions of the lines in the source file, which is assumed
1154    to be open on descriptor DESC.
1155    All set S->nlines to the number of such lines.  */
1156
1157 void
1158 find_source_lines (struct symtab *s, int desc)
1159 {
1160   struct stat st;
1161   char *data, *p, *end;
1162   int nlines = 0;
1163   int lines_allocated = 1000;
1164   int *line_charpos;
1165   long mtime = 0;
1166   int size;
1167
1168   gdb_assert (s);
1169   line_charpos = (int *) xmalloc (lines_allocated * sizeof (int));
1170   if (fstat (desc, &st) < 0)
1171     perror_with_name (symtab_to_filename_for_display (s));
1172
1173   if (s->objfile && s->objfile->obfd)
1174     mtime = s->objfile->mtime;
1175   else if (exec_bfd)
1176     mtime = exec_bfd_mtime;
1177
1178   if (mtime && mtime < st.st_mtime)
1179     warning (_("Source file is more recent than executable."));
1180
1181   {
1182     struct cleanup *old_cleanups;
1183
1184     /* st_size might be a large type, but we only support source files whose 
1185        size fits in an int.  */
1186     size = (int) st.st_size;
1187
1188     /* Use malloc, not alloca, because this may be pretty large, and we may
1189        run into various kinds of limits on stack size.  */
1190     data = (char *) xmalloc (size);
1191     old_cleanups = make_cleanup (xfree, data);
1192
1193     /* Reassign `size' to result of read for systems where \r\n -> \n.  */
1194     size = myread (desc, data, size);
1195     if (size < 0)
1196       perror_with_name (symtab_to_filename_for_display (s));
1197     end = data + size;
1198     p = data;
1199     line_charpos[0] = 0;
1200     nlines = 1;
1201     while (p != end)
1202       {
1203         if (*p++ == '\n'
1204         /* A newline at the end does not start a new line.  */
1205             && p != end)
1206           {
1207             if (nlines == lines_allocated)
1208               {
1209                 lines_allocated *= 2;
1210                 line_charpos =
1211                   (int *) xrealloc ((char *) line_charpos,
1212                                     sizeof (int) * lines_allocated);
1213               }
1214             line_charpos[nlines++] = p - data;
1215           }
1216       }
1217     do_cleanups (old_cleanups);
1218   }
1219
1220   s->nlines = nlines;
1221   s->line_charpos =
1222     (int *) xrealloc ((char *) line_charpos, nlines * sizeof (int));
1223
1224 }
1225
1226 \f
1227
1228 /* Get full pathname and line number positions for a symtab.
1229    Return nonzero if line numbers may have changed.
1230    Set *FULLNAME to actual name of the file as found by `openp',
1231    or to 0 if the file is not found.  */
1232
1233 static int
1234 get_filename_and_charpos (struct symtab *s, char **fullname)
1235 {
1236   int desc, linenums_changed = 0;
1237   struct cleanup *cleanups;
1238
1239   desc = open_source_file (s);
1240   if (desc < 0)
1241     {
1242       if (fullname)
1243         *fullname = NULL;
1244       return 0;
1245     }
1246   cleanups = make_cleanup_close (desc);
1247   if (fullname)
1248     *fullname = s->fullname;
1249   if (s->line_charpos == 0)
1250     linenums_changed = 1;
1251   if (linenums_changed)
1252     find_source_lines (s, desc);
1253   do_cleanups (cleanups);
1254   return linenums_changed;
1255 }
1256
1257 /* Print text describing the full name of the source file S
1258    and the line number LINE and its corresponding character position.
1259    The text starts with two Ctrl-z so that the Emacs-GDB interface
1260    can easily find it.
1261
1262    MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
1263
1264    Return 1 if successful, 0 if could not find the file.  */
1265
1266 int
1267 identify_source_line (struct symtab *s, int line, int mid_statement,
1268                       CORE_ADDR pc)
1269 {
1270   if (s->line_charpos == 0)
1271     get_filename_and_charpos (s, (char **) NULL);
1272   if (s->fullname == 0)
1273     return 0;
1274   if (line > s->nlines)
1275     /* Don't index off the end of the line_charpos array.  */
1276     return 0;
1277   annotate_source (s->fullname, line, s->line_charpos[line - 1],
1278                    mid_statement, get_objfile_arch (s->objfile), pc);
1279
1280   current_source_line = line;
1281   first_line_listed = line;
1282   last_line_listed = line;
1283   current_source_symtab = s;
1284   return 1;
1285 }
1286 \f
1287
1288 /* Print source lines from the file of symtab S,
1289    starting with line number LINE and stopping before line number STOPLINE.  */
1290
1291 static void
1292 print_source_lines_base (struct symtab *s, int line, int stopline,
1293                          enum print_source_lines_flags flags)
1294 {
1295   int c;
1296   int desc;
1297   int noprint = 0;
1298   FILE *stream;
1299   int nlines = stopline - line;
1300   struct cleanup *cleanup;
1301   struct ui_out *uiout = current_uiout;
1302
1303   /* Regardless of whether we can open the file, set current_source_symtab.  */
1304   current_source_symtab = s;
1305   current_source_line = line;
1306   first_line_listed = line;
1307
1308   /* If printing of source lines is disabled, just print file and line
1309      number.  */
1310   if (ui_out_test_flags (uiout, ui_source_list))
1311     {
1312       /* Only prints "No such file or directory" once.  */
1313       if ((s != last_source_visited) || (!last_source_error))
1314         {
1315           last_source_visited = s;
1316           desc = open_source_file (s);
1317         }
1318       else
1319         {
1320           desc = last_source_error;
1321           flags |= PRINT_SOURCE_LINES_NOERROR;
1322         }
1323     }
1324   else
1325     {
1326       desc = last_source_error;
1327           flags |= PRINT_SOURCE_LINES_NOERROR;
1328       noprint = 1;
1329     }
1330
1331   if (desc < 0 || noprint)
1332     {
1333       last_source_error = desc;
1334
1335       if (!(flags & PRINT_SOURCE_LINES_NOERROR))
1336         {
1337           const char *filename = symtab_to_filename_for_display (s);
1338           int len = strlen (filename) + 100;
1339           char *name = alloca (len);
1340
1341           xsnprintf (name, len, "%d\t%s", line, filename);
1342           print_sys_errmsg (name, errno);
1343         }
1344       else
1345         {
1346           ui_out_field_int (uiout, "line", line);
1347           ui_out_text (uiout, "\tin ");
1348
1349           /* CLI expects only the "file" field.  TUI expects only the
1350              "fullname" field (and TUI does break if "file" is printed).
1351              MI expects both fields.  ui_source_list is set only for CLI,
1352              not for TUI.  */
1353           if (ui_out_is_mi_like_p (uiout)
1354               || ui_out_test_flags (uiout, ui_source_list))
1355             ui_out_field_string (uiout, "file",
1356                                  symtab_to_filename_for_display (s));
1357           if (ui_out_is_mi_like_p (uiout)
1358               || !ui_out_test_flags (uiout, ui_source_list))
1359             {
1360               const char *s_fullname = symtab_to_fullname (s);
1361               char *local_fullname;
1362
1363               /* ui_out_field_string may free S_FULLNAME by calling
1364                  open_source_file for it again.  See e.g.,
1365                  tui_field_string->tui_show_source.  */
1366               local_fullname = alloca (strlen (s_fullname) + 1);
1367               strcpy (local_fullname, s_fullname);
1368
1369               ui_out_field_string (uiout, "fullname", local_fullname);
1370             }
1371
1372           ui_out_text (uiout, "\n");
1373         }
1374
1375       return;
1376     }
1377
1378   last_source_error = 0;
1379
1380   if (s->line_charpos == 0)
1381     find_source_lines (s, desc);
1382
1383   if (line < 1 || line > s->nlines)
1384     {
1385       close (desc);
1386       error (_("Line number %d out of range; %s has %d lines."),
1387              line, symtab_to_filename_for_display (s), s->nlines);
1388     }
1389
1390   if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
1391     {
1392       close (desc);
1393       perror_with_name (symtab_to_filename_for_display (s));
1394     }
1395
1396   stream = fdopen (desc, FDOPEN_MODE);
1397   clearerr (stream);
1398   cleanup = make_cleanup_fclose (stream);
1399
1400   while (nlines-- > 0)
1401     {
1402       char buf[20];
1403
1404       c = fgetc (stream);
1405       if (c == EOF)
1406         break;
1407       last_line_listed = current_source_line;
1408       if (flags & PRINT_SOURCE_LINES_FILENAME)
1409         {
1410           ui_out_text (uiout, symtab_to_filename_for_display (s));
1411           ui_out_text (uiout, ":");
1412         }
1413       xsnprintf (buf, sizeof (buf), "%d\t", current_source_line++);
1414       ui_out_text (uiout, buf);
1415       do
1416         {
1417           if (c < 040 && c != '\t' && c != '\n' && c != '\r')
1418             {
1419               xsnprintf (buf, sizeof (buf), "^%c", c + 0100);
1420               ui_out_text (uiout, buf);
1421             }
1422           else if (c == 0177)
1423             ui_out_text (uiout, "^?");
1424           else if (c == '\r')
1425             {
1426               /* Skip a \r character, but only before a \n.  */
1427               int c1 = fgetc (stream);
1428
1429               if (c1 != '\n')
1430                 printf_filtered ("^%c", c + 0100);
1431               if (c1 != EOF)
1432                 ungetc (c1, stream);
1433             }
1434           else
1435             {
1436               xsnprintf (buf, sizeof (buf), "%c", c);
1437               ui_out_text (uiout, buf);
1438             }
1439         }
1440       while (c != '\n' && (c = fgetc (stream)) >= 0);
1441     }
1442
1443   do_cleanups (cleanup);
1444 }
1445 \f
1446 /* Show source lines from the file of symtab S, starting with line
1447    number LINE and stopping before line number STOPLINE.  If this is
1448    not the command line version, then the source is shown in the source
1449    window otherwise it is simply printed.  */
1450
1451 void
1452 print_source_lines (struct symtab *s, int line, int stopline,
1453                     enum print_source_lines_flags flags)
1454 {
1455   print_source_lines_base (s, line, stopline, flags);
1456 }
1457 \f
1458 /* Print info on range of pc's in a specified line.  */
1459
1460 static void
1461 line_info (char *arg, int from_tty)
1462 {
1463   struct symtabs_and_lines sals;
1464   struct symtab_and_line sal;
1465   CORE_ADDR start_pc, end_pc;
1466   int i;
1467   struct cleanup *cleanups;
1468
1469   init_sal (&sal);              /* initialize to zeroes */
1470
1471   if (arg == 0)
1472     {
1473       sal.symtab = current_source_symtab;
1474       sal.pspace = current_program_space;
1475       sal.line = last_line_listed;
1476       sals.nelts = 1;
1477       sals.sals = (struct symtab_and_line *)
1478         xmalloc (sizeof (struct symtab_and_line));
1479       sals.sals[0] = sal;
1480     }
1481   else
1482     {
1483       sals = decode_line_with_last_displayed (arg, DECODE_LINE_LIST_MODE);
1484
1485       dont_repeat ();
1486     }
1487
1488   cleanups = make_cleanup (xfree, sals.sals);
1489
1490   /* C++  More than one line may have been specified, as when the user
1491      specifies an overloaded function name.  Print info on them all.  */
1492   for (i = 0; i < sals.nelts; i++)
1493     {
1494       sal = sals.sals[i];
1495       if (sal.pspace != current_program_space)
1496         continue;
1497
1498       if (sal.symtab == 0)
1499         {
1500           struct gdbarch *gdbarch = get_current_arch ();
1501
1502           printf_filtered (_("No line number information available"));
1503           if (sal.pc != 0)
1504             {
1505               /* This is useful for "info line *0x7f34".  If we can't tell the
1506                  user about a source line, at least let them have the symbolic
1507                  address.  */
1508               printf_filtered (" for address ");
1509               wrap_here ("  ");
1510               print_address (gdbarch, sal.pc, gdb_stdout);
1511             }
1512           else
1513             printf_filtered (".");
1514           printf_filtered ("\n");
1515         }
1516       else if (sal.line > 0
1517                && find_line_pc_range (sal, &start_pc, &end_pc))
1518         {
1519           struct gdbarch *gdbarch = get_objfile_arch (sal.symtab->objfile);
1520
1521           if (start_pc == end_pc)
1522             {
1523               printf_filtered ("Line %d of \"%s\"",
1524                                sal.line,
1525                                symtab_to_filename_for_display (sal.symtab));
1526               wrap_here ("  ");
1527               printf_filtered (" is at address ");
1528               print_address (gdbarch, start_pc, gdb_stdout);
1529               wrap_here ("  ");
1530               printf_filtered (" but contains no code.\n");
1531             }
1532           else
1533             {
1534               printf_filtered ("Line %d of \"%s\"",
1535                                sal.line,
1536                                symtab_to_filename_for_display (sal.symtab));
1537               wrap_here ("  ");
1538               printf_filtered (" starts at address ");
1539               print_address (gdbarch, start_pc, gdb_stdout);
1540               wrap_here ("  ");
1541               printf_filtered (" and ends at ");
1542               print_address (gdbarch, end_pc, gdb_stdout);
1543               printf_filtered (".\n");
1544             }
1545
1546           /* x/i should display this line's code.  */
1547           set_next_address (gdbarch, start_pc);
1548
1549           /* Repeating "info line" should do the following line.  */
1550           last_line_listed = sal.line + 1;
1551
1552           /* If this is the only line, show the source code.  If it could
1553              not find the file, don't do anything special.  */
1554           if (annotation_level && sals.nelts == 1)
1555             identify_source_line (sal.symtab, sal.line, 0, start_pc);
1556         }
1557       else
1558         /* Is there any case in which we get here, and have an address
1559            which the user would want to see?  If we have debugging symbols
1560            and no line numbers?  */
1561         printf_filtered (_("Line number %d is out of range for \"%s\".\n"),
1562                          sal.line, symtab_to_filename_for_display (sal.symtab));
1563     }
1564   do_cleanups (cleanups);
1565 }
1566 \f
1567 /* Commands to search the source file for a regexp.  */
1568
1569 static void
1570 forward_search_command (char *regex, int from_tty)
1571 {
1572   int c;
1573   int desc;
1574   FILE *stream;
1575   int line;
1576   char *msg;
1577   struct cleanup *cleanups;
1578
1579   line = last_line_listed + 1;
1580
1581   msg = (char *) re_comp (regex);
1582   if (msg)
1583     error (("%s"), msg);
1584
1585   if (current_source_symtab == 0)
1586     select_source_symtab (0);
1587
1588   desc = open_source_file (current_source_symtab);
1589   if (desc < 0)
1590     perror_with_name (symtab_to_filename_for_display (current_source_symtab));
1591   cleanups = make_cleanup_close (desc);
1592
1593   if (current_source_symtab->line_charpos == 0)
1594     find_source_lines (current_source_symtab, desc);
1595
1596   if (line < 1 || line > current_source_symtab->nlines)
1597     error (_("Expression not found"));
1598
1599   if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1600     perror_with_name (symtab_to_filename_for_display (current_source_symtab));
1601
1602   discard_cleanups (cleanups);
1603   stream = fdopen (desc, FDOPEN_MODE);
1604   clearerr (stream);
1605   cleanups = make_cleanup_fclose (stream);
1606   while (1)
1607     {
1608       static char *buf = NULL;
1609       char *p;
1610       int cursize, newsize;
1611
1612       cursize = 256;
1613       buf = xmalloc (cursize);
1614       p = buf;
1615
1616       c = fgetc (stream);
1617       if (c == EOF)
1618         break;
1619       do
1620         {
1621           *p++ = c;
1622           if (p - buf == cursize)
1623             {
1624               newsize = cursize + cursize / 2;
1625               buf = xrealloc (buf, newsize);
1626               p = buf + cursize;
1627               cursize = newsize;
1628             }
1629         }
1630       while (c != '\n' && (c = fgetc (stream)) >= 0);
1631
1632       /* Remove the \r, if any, at the end of the line, otherwise
1633          regular expressions that end with $ or \n won't work.  */
1634       if (p - buf > 1 && p[-2] == '\r')
1635         {
1636           p--;
1637           p[-1] = '\n';
1638         }
1639
1640       /* We now have a source line in buf, null terminate and match.  */
1641       *p = 0;
1642       if (re_exec (buf) > 0)
1643         {
1644           /* Match!  */
1645           do_cleanups (cleanups);
1646           print_source_lines (current_source_symtab, line, line + 1, 0);
1647           set_internalvar_integer (lookup_internalvar ("_"), line);
1648           current_source_line = max (line - lines_to_list / 2, 1);
1649           return;
1650         }
1651       line++;
1652     }
1653
1654   printf_filtered (_("Expression not found\n"));
1655   do_cleanups (cleanups);
1656 }
1657
1658 static void
1659 reverse_search_command (char *regex, int from_tty)
1660 {
1661   int c;
1662   int desc;
1663   FILE *stream;
1664   int line;
1665   char *msg;
1666   struct cleanup *cleanups;
1667
1668   line = last_line_listed - 1;
1669
1670   msg = (char *) re_comp (regex);
1671   if (msg)
1672     error (("%s"), msg);
1673
1674   if (current_source_symtab == 0)
1675     select_source_symtab (0);
1676
1677   desc = open_source_file (current_source_symtab);
1678   if (desc < 0)
1679     perror_with_name (symtab_to_filename_for_display (current_source_symtab));
1680   cleanups = make_cleanup_close (desc);
1681
1682   if (current_source_symtab->line_charpos == 0)
1683     find_source_lines (current_source_symtab, desc);
1684
1685   if (line < 1 || line > current_source_symtab->nlines)
1686     error (_("Expression not found"));
1687
1688   if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1689     perror_with_name (symtab_to_filename_for_display (current_source_symtab));
1690
1691   discard_cleanups (cleanups);
1692   stream = fdopen (desc, FDOPEN_MODE);
1693   clearerr (stream);
1694   cleanups = make_cleanup_fclose (stream);
1695   while (line > 1)
1696     {
1697 /* FIXME!!!  We walk right off the end of buf if we get a long line!!!  */
1698       char buf[4096];           /* Should be reasonable???  */
1699       char *p = buf;
1700
1701       c = fgetc (stream);
1702       if (c == EOF)
1703         break;
1704       do
1705         {
1706           *p++ = c;
1707         }
1708       while (c != '\n' && (c = fgetc (stream)) >= 0);
1709
1710       /* Remove the \r, if any, at the end of the line, otherwise
1711          regular expressions that end with $ or \n won't work.  */
1712       if (p - buf > 1 && p[-2] == '\r')
1713         {
1714           p--;
1715           p[-1] = '\n';
1716         }
1717
1718       /* We now have a source line in buf; null terminate and match.  */
1719       *p = 0;
1720       if (re_exec (buf) > 0)
1721         {
1722           /* Match!  */
1723           do_cleanups (cleanups);
1724           print_source_lines (current_source_symtab, line, line + 1, 0);
1725           set_internalvar_integer (lookup_internalvar ("_"), line);
1726           current_source_line = max (line - lines_to_list / 2, 1);
1727           return;
1728         }
1729       line--;
1730       if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1731         {
1732           const char *filename;
1733
1734           do_cleanups (cleanups);
1735           filename = symtab_to_filename_for_display (current_source_symtab);
1736           perror_with_name (filename);
1737         }
1738     }
1739
1740   printf_filtered (_("Expression not found\n"));
1741   do_cleanups (cleanups);
1742   return;
1743 }
1744
1745 /* If the last character of PATH is a directory separator, then strip it.  */
1746
1747 static void
1748 strip_trailing_directory_separator (char *path)
1749 {
1750   const int last = strlen (path) - 1;
1751
1752   if (last < 0)
1753     return;  /* No stripping is needed if PATH is the empty string.  */
1754
1755   if (IS_DIR_SEPARATOR (path[last]))
1756     path[last] = '\0';
1757 }
1758
1759 /* Return the path substitution rule that matches FROM.
1760    Return NULL if no rule matches.  */
1761
1762 static struct substitute_path_rule *
1763 find_substitute_path_rule (const char *from)
1764 {
1765   struct substitute_path_rule *rule = substitute_path_rules;
1766
1767   while (rule != NULL)
1768     {
1769       if (FILENAME_CMP (rule->from, from) == 0)
1770         return rule;
1771       rule = rule->next;
1772     }
1773
1774   return NULL;
1775 }
1776
1777 /* Add a new substitute-path rule at the end of the current list of rules.
1778    The new rule will replace FROM into TO.  */
1779
1780 void
1781 add_substitute_path_rule (char *from, char *to)
1782 {
1783   struct substitute_path_rule *rule;
1784   struct substitute_path_rule *new_rule;
1785
1786   new_rule = xmalloc (sizeof (struct substitute_path_rule));
1787   new_rule->from = xstrdup (from);
1788   new_rule->to = xstrdup (to);
1789   new_rule->next = NULL;
1790
1791   /* If the list of rules are empty, then insert the new rule
1792      at the head of the list.  */
1793
1794   if (substitute_path_rules == NULL)
1795     {
1796       substitute_path_rules = new_rule;
1797       return;
1798     }
1799
1800   /* Otherwise, skip to the last rule in our list and then append
1801      the new rule.  */
1802
1803   rule = substitute_path_rules;
1804   while (rule->next != NULL)
1805     rule = rule->next;
1806
1807   rule->next = new_rule;
1808 }
1809
1810 /* Remove the given source path substitution rule from the current list
1811    of rules.  The memory allocated for that rule is also deallocated.  */
1812
1813 static void
1814 delete_substitute_path_rule (struct substitute_path_rule *rule)
1815 {
1816   if (rule == substitute_path_rules)
1817     substitute_path_rules = rule->next;
1818   else
1819     {
1820       struct substitute_path_rule *prev = substitute_path_rules;
1821
1822       while (prev != NULL && prev->next != rule)
1823         prev = prev->next;
1824
1825       gdb_assert (prev != NULL);
1826
1827       prev->next = rule->next;
1828     }
1829
1830   xfree (rule->from);
1831   xfree (rule->to);
1832   xfree (rule);
1833 }
1834
1835 /* Implement the "show substitute-path" command.  */
1836
1837 static void
1838 show_substitute_path_command (char *args, int from_tty)
1839 {
1840   struct substitute_path_rule *rule = substitute_path_rules;
1841   char **argv;
1842   char *from = NULL;
1843   struct cleanup *cleanup;
1844   
1845   argv = gdb_buildargv (args);
1846   cleanup = make_cleanup_freeargv (argv);
1847
1848   /* We expect zero or one argument.  */
1849
1850   if (argv != NULL && argv[0] != NULL && argv[1] != NULL)
1851     error (_("Too many arguments in command"));
1852
1853   if (argv != NULL && argv[0] != NULL)
1854     from = argv[0];
1855
1856   /* Print the substitution rules.  */
1857
1858   if (from != NULL)
1859     printf_filtered
1860       (_("Source path substitution rule matching `%s':\n"), from);
1861   else
1862     printf_filtered (_("List of all source path substitution rules:\n"));
1863
1864   while (rule != NULL)
1865     {
1866       if (from == NULL || FILENAME_CMP (rule->from, from) == 0)
1867         printf_filtered ("  `%s' -> `%s'.\n", rule->from, rule->to);
1868       rule = rule->next;
1869     }
1870
1871   do_cleanups (cleanup);
1872 }
1873
1874 /* Implement the "unset substitute-path" command.  */
1875
1876 static void
1877 unset_substitute_path_command (char *args, int from_tty)
1878 {
1879   struct substitute_path_rule *rule = substitute_path_rules;
1880   char **argv = gdb_buildargv (args);
1881   char *from = NULL;
1882   int rule_found = 0;
1883   struct cleanup *cleanup;
1884
1885   /* This function takes either 0 or 1 argument.  */
1886
1887   cleanup = make_cleanup_freeargv (argv);
1888   if (argv != NULL && argv[0] != NULL && argv[1] != NULL)
1889     error (_("Incorrect usage, too many arguments in command"));
1890
1891   if (argv != NULL && argv[0] != NULL)
1892     from = argv[0];
1893
1894   /* If the user asked for all the rules to be deleted, ask him
1895      to confirm and give him a chance to abort before the action
1896      is performed.  */
1897
1898   if (from == NULL
1899       && !query (_("Delete all source path substitution rules? ")))
1900     error (_("Canceled"));
1901
1902   /* Delete the rule matching the argument.  No argument means that
1903      all rules should be deleted.  */
1904
1905   while (rule != NULL)
1906     {
1907       struct substitute_path_rule *next = rule->next;
1908
1909       if (from == NULL || FILENAME_CMP (from, rule->from) == 0)
1910         {
1911           delete_substitute_path_rule (rule);
1912           rule_found = 1;
1913         }
1914
1915       rule = next;
1916     }
1917   
1918   /* If the user asked for a specific rule to be deleted but
1919      we could not find it, then report an error.  */
1920
1921   if (from != NULL && !rule_found)
1922     error (_("No substitution rule defined for `%s'"), from);
1923
1924   forget_cached_source_info ();
1925
1926   do_cleanups (cleanup);
1927 }
1928
1929 /* Add a new source path substitution rule.  */
1930
1931 static void
1932 set_substitute_path_command (char *args, int from_tty)
1933 {
1934   char **argv;
1935   struct substitute_path_rule *rule;
1936   struct cleanup *cleanup;
1937   
1938   argv = gdb_buildargv (args);
1939   cleanup = make_cleanup_freeargv (argv);
1940
1941   if (argv == NULL || argv[0] == NULL || argv [1] == NULL)
1942     error (_("Incorrect usage, too few arguments in command"));
1943
1944   if (argv[2] != NULL)
1945     error (_("Incorrect usage, too many arguments in command"));
1946
1947   if (*(argv[0]) == '\0')
1948     error (_("First argument must be at least one character long"));
1949
1950   /* Strip any trailing directory separator character in either FROM
1951      or TO.  The substitution rule already implicitly contains them.  */
1952   strip_trailing_directory_separator (argv[0]);
1953   strip_trailing_directory_separator (argv[1]);
1954
1955   /* If a rule with the same "from" was previously defined, then
1956      delete it.  This new rule replaces it.  */
1957
1958   rule = find_substitute_path_rule (argv[0]);
1959   if (rule != NULL)
1960     delete_substitute_path_rule (rule);
1961       
1962   /* Insert the new substitution rule.  */
1963
1964   add_substitute_path_rule (argv[0], argv[1]);
1965   forget_cached_source_info ();
1966
1967   do_cleanups (cleanup);
1968 }
1969
1970 \f
1971 void
1972 _initialize_source (void)
1973 {
1974   struct cmd_list_element *c;
1975
1976   current_source_symtab = 0;
1977   init_source_path ();
1978
1979   /* The intention is to use POSIX Basic Regular Expressions.
1980      Always use the GNU regex routine for consistency across all hosts.
1981      Our current GNU regex.c does not have all the POSIX features, so this is
1982      just an approximation.  */
1983   re_set_syntax (RE_SYNTAX_GREP);
1984
1985   c = add_cmd ("directory", class_files, directory_command, _("\
1986 Add directory DIR to beginning of search path for source files.\n\
1987 Forget cached info on source file locations and line positions.\n\
1988 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1989 directory in which the source file was compiled into object code.\n\
1990 With no argument, reset the search path to $cdir:$cwd, the default."),
1991                &cmdlist);
1992
1993   if (dbx_commands)
1994     add_com_alias ("use", "directory", class_files, 0);
1995
1996   set_cmd_completer (c, filename_completer);
1997
1998   add_setshow_optional_filename_cmd ("directories",
1999                                      class_files,
2000                                      &source_path,
2001                                      _("\
2002 Set the search path for finding source files."),
2003                                      _("\
2004 Show the search path for finding source files."),
2005                                      _("\
2006 $cwd in the path means the current working directory.\n\
2007 $cdir in the path means the compilation directory of the source file.\n\
2008 GDB ensures the search path always ends with $cdir:$cwd by\n\
2009 appending these directories if necessary.\n\
2010 Setting the value to an empty string sets it to $cdir:$cwd, the default."),
2011                             set_directories_command,
2012                             show_directories_command,
2013                             &setlist, &showlist);
2014
2015   if (xdb_commands)
2016     {
2017       add_com_alias ("D", "directory", class_files, 0);
2018       add_cmd ("ld", no_class, show_directories_1, _("\
2019 Current search path for finding source files.\n\
2020 $cwd in the path means the current working directory.\n\
2021 $cdir in the path means the compilation directory of the source file."),
2022                &cmdlist);
2023     }
2024
2025   add_info ("source", source_info,
2026             _("Information about the current source file."));
2027
2028   add_info ("line", line_info, _("\
2029 Core addresses of the code for a source line.\n\
2030 Line can be specified as\n\
2031   LINENUM, to list around that line in current file,\n\
2032   FILE:LINENUM, to list around that line in that file,\n\
2033   FUNCTION, to list around beginning of that function,\n\
2034   FILE:FUNCTION, to distinguish among like-named static functions.\n\
2035 Default is to describe the last source line that was listed.\n\n\
2036 This sets the default address for \"x\" to the line's first instruction\n\
2037 so that \"x/i\" suffices to start examining the machine code.\n\
2038 The address is also stored as the value of \"$_\"."));
2039
2040   add_com ("forward-search", class_files, forward_search_command, _("\
2041 Search for regular expression (see regex(3)) from last line listed.\n\
2042 The matching line number is also stored as the value of \"$_\"."));
2043   add_com_alias ("search", "forward-search", class_files, 0);
2044   add_com_alias ("fo", "forward-search", class_files, 1);
2045
2046   add_com ("reverse-search", class_files, reverse_search_command, _("\
2047 Search backward for regular expression (see regex(3)) from last line listed.\n\
2048 The matching line number is also stored as the value of \"$_\"."));
2049   add_com_alias ("rev", "reverse-search", class_files, 1);
2050
2051   if (xdb_commands)
2052     {
2053       add_com_alias ("/", "forward-search", class_files, 0);
2054       add_com_alias ("?", "reverse-search", class_files, 0);
2055     }
2056
2057   add_setshow_integer_cmd ("listsize", class_support, &lines_to_list, _("\
2058 Set number of source lines gdb will list by default."), _("\
2059 Show number of source lines gdb will list by default."), _("\
2060 Use this to choose how many source lines the \"list\" displays (unless\n\
2061 the \"list\" argument explicitly specifies some other number).\n\
2062 A value of \"unlimited\", or zero, means there's no limit."),
2063                             NULL,
2064                             show_lines_to_list,
2065                             &setlist, &showlist);
2066
2067   add_cmd ("substitute-path", class_files, set_substitute_path_command,
2068            _("\
2069 Usage: set substitute-path FROM TO\n\
2070 Add a substitution rule replacing FROM into TO in source file names.\n\
2071 If a substitution rule was previously set for FROM, the old rule\n\
2072 is replaced by the new one."),
2073            &setlist);
2074
2075   add_cmd ("substitute-path", class_files, unset_substitute_path_command,
2076            _("\
2077 Usage: unset substitute-path [FROM]\n\
2078 Delete the rule for substituting FROM in source file names.  If FROM\n\
2079 is not specified, all substituting rules are deleted.\n\
2080 If the debugger cannot find a rule for FROM, it will display a warning."),
2081            &unsetlist);
2082
2083   add_cmd ("substitute-path", class_files, show_substitute_path_command,
2084            _("\
2085 Usage: show substitute-path [FROM]\n\
2086 Print the rule for substituting FROM in source file names. If FROM\n\
2087 is not specified, print all substitution rules."),
2088            &showlist);
2089
2090   add_setshow_enum_cmd ("filename-display", class_files,
2091                         filename_display_kind_names,
2092                         &filename_display_string, _("\
2093 Set how to display filenames."), _("\
2094 Show how to display filenames."), _("\
2095 filename-display can be:\n\
2096   basename - display only basename of a filename\n\
2097   relative - display a filename relative to the compilation directory\n\
2098   absolute - display an absolute filename\n\
2099 By default, relative filenames are displayed."),
2100                         NULL,
2101                         show_filename_display_string,
2102                         &setlist, &showlist);
2103
2104 }