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