* symtab.h (free_symtab): Remove.
[external/binutils.git] / gdb / source.c
1 /* List lines of source files for GDB, the GNU debugger.
2    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
4    2009, 2010, 2011 Free Software Foundation, Inc.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #include "defs.h"
22 #include "arch-utils.h"
23 #include "symtab.h"
24 #include "expression.h"
25 #include "language.h"
26 #include "command.h"
27 #include "source.h"
28 #include "gdbcmd.h"
29 #include "frame.h"
30 #include "value.h"
31 #include "gdb_assert.h"
32
33 #include <sys/types.h>
34 #include "gdb_string.h"
35 #include "gdb_stat.h"
36 #include <fcntl.h>
37 #include "gdbcore.h"
38 #include "gdb_regex.h"
39 #include "symfile.h"
40 #include "objfiles.h"
41 #include "annotate.h"
42 #include "gdbtypes.h"
43 #include "linespec.h"
44 #include "filenames.h"          /* for DOSish file names */
45 #include "completer.h"
46 #include "ui-out.h"
47 #include "readline/readline.h"
48
49 #include "psymtab.h"
50
51
52 #define OPEN_MODE (O_RDONLY | O_BINARY)
53 #define FDOPEN_MODE FOPEN_RB
54
55 /* Prototypes for exported functions.  */
56
57 void _initialize_source (void);
58
59 /* Prototypes for local functions.  */
60
61 static int get_filename_and_charpos (struct symtab *, char **);
62
63 static void reverse_search_command (char *, int);
64
65 static void forward_search_command (char *, int);
66
67 static void line_info (char *, int);
68
69 static void source_info (char *, int);
70
71 /* Path of directories to search for source files.
72    Same format as the PATH environment variable's value.  */
73
74 char *source_path;
75
76 /* Support for source path substitution commands.  */
77
78 struct substitute_path_rule
79 {
80   char *from;
81   char *to;
82   struct substitute_path_rule *next;
83 };
84
85 static struct substitute_path_rule *substitute_path_rules = NULL;
86
87 /* Symtab of default file for listing lines of.  */
88
89 static struct symtab *current_source_symtab;
90
91 /* Default next line to list.  */
92
93 static int current_source_line;
94
95 static struct program_space *current_source_pspace;
96
97 /* Default number of lines to print with commands like "list".
98    This is based on guessing how many long (i.e. more than chars_per_line
99    characters) lines there will be.  To be completely correct, "list"
100    and friends should be rewritten to count characters and see where
101    things are wrapping, but that would be a fair amount of work.  */
102
103 int lines_to_list = 10;
104 static void
105 show_lines_to_list (struct ui_file *file, int from_tty,
106                     struct cmd_list_element *c, const char *value)
107 {
108   fprintf_filtered (file,
109                     _("Number of source lines gdb "
110                       "will list by default is %s.\n"),
111                     value);
112 }
113
114 /* Line number of last line printed.  Default for various commands.
115    current_source_line is usually, but not always, the same as this.  */
116
117 static int last_line_listed;
118
119 /* First line number listed by last listing command.  */
120
121 static int first_line_listed;
122
123 /* Saves the name of the last source file visited and a possible error code.
124    Used to prevent repeating annoying "No such file or directories" msgs.  */
125
126 static struct symtab *last_source_visited = NULL;
127 static int last_source_error = 0;
128 \f
129 /* Return the first line listed by print_source_lines.
130    Used by command interpreters to request listing from
131    a previous point.  */
132
133 int
134 get_first_line_listed (void)
135 {
136   return first_line_listed;
137 }
138
139 /* Return the default number of lines to print with commands like the
140    cli "list".  The caller of print_source_lines must use this to
141    calculate the end line and use it in the call to print_source_lines
142    as it does not automatically use this value.  */
143
144 int
145 get_lines_to_list (void)
146 {
147   return lines_to_list;
148 }
149
150 /* Return the current source file for listing and next line to list.
151    NOTE: The returned sal pc and end fields are not valid.  */
152    
153 struct symtab_and_line
154 get_current_source_symtab_and_line (void)
155 {
156   struct symtab_and_line cursal = { 0 };
157
158   cursal.pspace = current_source_pspace;
159   cursal.symtab = current_source_symtab;
160   cursal.line = current_source_line;
161   cursal.pc = 0;
162   cursal.end = 0;
163   
164   return cursal;
165 }
166
167 /* If the current source file for listing is not set, try and get a default.
168    Usually called before get_current_source_symtab_and_line() is called.
169    It may err out if a default cannot be determined.
170    We must be cautious about where it is called, as it can recurse as the
171    process of determining a new default may call the caller!
172    Use get_current_source_symtab_and_line only to get whatever
173    we have without erroring out or trying to get a default.  */
174    
175 void
176 set_default_source_symtab_and_line (void)
177 {
178   if (!have_full_symbols () && !have_partial_symbols ())
179     error (_("No symbol table is loaded.  Use the \"file\" command."));
180
181   /* Pull in a current source symtab if necessary.  */
182   if (current_source_symtab == 0)
183     select_source_symtab (0);
184 }
185
186 /* Return the current default file for listing and next line to list
187    (the returned sal pc and end fields are not valid.)
188    and set the current default to whatever is in SAL.
189    NOTE: The returned sal pc and end fields are not valid.  */
190    
191 struct symtab_and_line
192 set_current_source_symtab_and_line (const struct symtab_and_line *sal)
193 {
194   struct symtab_and_line cursal = { 0 };
195
196   cursal.pspace = current_source_pspace;
197   cursal.symtab = current_source_symtab;
198   cursal.line = current_source_line;
199   cursal.pc = 0;
200   cursal.end = 0;
201
202   current_source_pspace = sal->pspace;
203   current_source_symtab = sal->symtab;
204   current_source_line = sal->line;
205
206   return cursal;
207 }
208
209 /* Reset any information stored about a default file and line to print.  */
210
211 void
212 clear_current_source_symtab_and_line (void)
213 {
214   current_source_symtab = 0;
215   current_source_line = 0;
216 }
217
218 /* Set the source file default for the "list" command to be S.
219
220    If S is NULL, and we don't have a default, find one.  This
221    should only be called when the user actually tries to use the
222    default, since we produce an error if we can't find a reasonable
223    default.  Also, since this can cause symbols to be read, doing it
224    before we need to would make things slower than necessary.  */
225
226 void
227 select_source_symtab (struct symtab *s)
228 {
229   struct symtabs_and_lines sals;
230   struct symtab_and_line sal;
231   struct objfile *ofp;
232
233   if (s)
234     {
235       current_source_symtab = s;
236       current_source_line = 1;
237       current_source_pspace = SYMTAB_PSPACE (s);
238       return;
239     }
240
241   if (current_source_symtab)
242     return;
243
244   /* Make the default place to list be the function `main'
245      if one exists.  */
246   if (lookup_symbol (main_name (), 0, VAR_DOMAIN, 0))
247     {
248       sals = decode_line_spec (main_name (), 1);
249       sal = sals.sals[0];
250       xfree (sals.sals);
251       current_source_pspace = sal.pspace;
252       current_source_symtab = sal.symtab;
253       current_source_line = max (sal.line - (lines_to_list - 1), 1);
254       if (current_source_symtab)
255         return;
256     }
257
258   /* Alright; find the last file in the symtab list (ignoring .h's
259      and namespace symtabs).  */
260
261   current_source_line = 1;
262
263   ALL_OBJFILES (ofp)
264     {
265       for (s = ofp->symtabs; s; s = s->next)
266         {
267           const char *name = s->filename;
268           int len = strlen (name);
269
270           if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
271               || strcmp (name, "<<C++-namespaces>>") == 0)))
272             {
273               current_source_pspace = current_program_space;
274               current_source_symtab = s;
275             }
276         }
277     }
278
279   if (current_source_symtab)
280     return;
281
282   ALL_OBJFILES (ofp)
283   {
284     if (ofp->sf)
285       s = ofp->sf->qf->find_last_source_symtab (ofp);
286     if (s)
287       current_source_symtab = s;
288   }
289   if (current_source_symtab)
290     return;
291
292   error (_("Can't find a default source file"));
293 }
294 \f
295 /* Handler for "set directories path-list" command.
296    "set dir mumble" doesn't prepend paths, it resets the entire
297    path list.  The theory is that set(show(dir)) should be a no-op.  */
298
299 static void
300 set_directories_command (char *args, int from_tty, struct cmd_list_element *c)
301 {
302   /* This is the value that was set.
303      It needs to be processed to maintain $cdir:$cwd and remove dups.  */
304   char *set_path = source_path;
305
306   /* We preserve the invariant that $cdir:$cwd begins life at the end of
307      the list by calling init_source_path.  If they appear earlier in
308      SET_PATH then mod_path will move them appropriately.
309      mod_path will also remove duplicates.  */
310   init_source_path ();
311   if (*set_path != '\0')
312     mod_path (set_path, &source_path);
313
314   xfree (set_path);
315 }
316
317 /* Print the list of source directories.
318    This is used by the "ld" command, so it has the signature of a command
319    function.  */
320
321 static void
322 show_directories_1 (char *ignore, int from_tty)
323 {
324   puts_filtered ("Source directories searched: ");
325   puts_filtered (source_path);
326   puts_filtered ("\n");
327 }
328
329 /* Handler for "show directories" command.  */
330
331 static void
332 show_directories_command (struct ui_file *file, int from_tty,
333                           struct cmd_list_element *c, const char *value)
334 {
335   show_directories_1 (NULL, from_tty);
336 }
337
338 /* Forget line positions and file names for the symtabs in a
339    particular objfile.  */
340
341 void
342 forget_cached_source_info_for_objfile (struct objfile *objfile)
343 {
344   struct symtab *s;
345
346   ALL_OBJFILE_SYMTABS (objfile, s)
347     {
348       if (s->line_charpos != NULL)
349         {
350           xfree (s->line_charpos);
351           s->line_charpos = NULL;
352         }
353       if (s->fullname != NULL)
354         {
355           xfree (s->fullname);
356           s->fullname = NULL;
357         }
358
359       if (objfile->sf)
360         objfile->sf->qf->forget_cached_source_info (objfile);
361     }
362 }
363
364 /* Forget what we learned about line positions in source files, and
365    which directories contain them; must check again now since files
366    may be found in a different directory now.  */
367
368 void
369 forget_cached_source_info (void)
370 {
371   struct program_space *pspace;
372   struct symtab *s;
373   struct objfile *objfile;
374
375   ALL_PSPACES (pspace)
376     ALL_PSPACE_OBJFILES (pspace, objfile)
377     {
378       forget_cached_source_info_for_objfile (objfile);
379     }
380
381   last_source_visited = NULL;
382 }
383
384 void
385 init_source_path (void)
386 {
387   char buf[20];
388
389   sprintf (buf, "$cdir%c$cwd", DIRNAME_SEPARATOR);
390   source_path = xstrdup (buf);
391   forget_cached_source_info ();
392 }
393
394 /* Add zero or more directories to the front of the source path.  */
395
396 void
397 directory_command (char *dirname, int from_tty)
398 {
399   dont_repeat ();
400   /* FIXME, this goes to "delete dir"...  */
401   if (dirname == 0)
402     {
403       if (!from_tty || query (_("Reinitialize source path to empty? ")))
404         {
405           xfree (source_path);
406           init_source_path ();
407         }
408     }
409   else
410     {
411       mod_path (dirname, &source_path);
412       forget_cached_source_info ();
413     }
414   if (from_tty)
415     show_directories_1 ((char *) 0, from_tty);
416 }
417
418 /* Add a path given with the -d command line switch.
419    This will not be quoted so we must not treat spaces as separators.  */
420
421 void
422 directory_switch (char *dirname, int from_tty)
423 {
424   add_path (dirname, &source_path, 0);
425 }
426
427 /* Add zero or more directories to the front of an arbitrary path.  */
428
429 void
430 mod_path (char *dirname, char **which_path)
431 {
432   add_path (dirname, which_path, 1);
433 }
434
435 /* Workhorse of mod_path.  Takes an extra argument to determine
436    if dirname should be parsed for separators that indicate multiple
437    directories.  This allows for interfaces that pre-parse the dirname
438    and allow specification of traditional separator characters such
439    as space or tab.  */
440
441 void
442 add_path (char *dirname, char **which_path, int parse_separators)
443 {
444   char *old = *which_path;
445   int prefix = 0;
446   char **argv = NULL;
447   char *arg;
448   int argv_index = 0;
449
450   if (dirname == 0)
451     return;
452
453   if (parse_separators)
454     {
455       /* This will properly parse the space and tab separators
456          and any quotes that may exist.  DIRNAME_SEPARATOR will
457          be dealt with later.  */
458       argv = gdb_buildargv (dirname);
459       make_cleanup_freeargv (argv);
460
461       arg = argv[0];
462     }
463   else
464     {
465       arg = xstrdup (dirname);
466       make_cleanup (xfree, arg);
467     }
468
469   do
470     {
471       char *name = arg;
472       char *p;
473       struct stat st;
474
475       {
476         char *separator = NULL;
477
478         /* Spaces and tabs will have been removed by buildargv().
479            The directories will there be split into a list but
480            each entry may still contain DIRNAME_SEPARATOR.  */
481         if (parse_separators)
482           separator = strchr (name, DIRNAME_SEPARATOR);
483
484         if (separator == 0)
485           p = arg = name + strlen (name);
486         else
487           {
488             p = separator;
489             arg = p + 1;
490             while (*arg == DIRNAME_SEPARATOR)
491               ++arg;
492           }
493
494         /* If there are no more directories in this argument then start
495            on the next argument next time round the loop (if any).  */
496         if (*arg == '\0')
497           arg = parse_separators ? argv[++argv_index] : NULL;
498       }
499
500       /* name is the start of the directory.
501          p is the separator (or null) following the end.  */
502
503       while (!(IS_DIR_SEPARATOR (*name) && p <= name + 1)       /* "/" */
504 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
505       /* On MS-DOS and MS-Windows, h:\ is different from h: */
506              && !(p == name + 3 && name[1] == ':')              /* "d:/" */
507 #endif
508              && IS_DIR_SEPARATOR (p[-1]))
509         /* Sigh.  "foo/" => "foo" */
510         --p;
511       *p = '\0';
512
513       while (p > name && p[-1] == '.')
514         {
515           if (p - name == 1)
516             {
517               /* "." => getwd ().  */
518               name = current_directory;
519               goto append;
520             }
521           else if (p > name + 1 && IS_DIR_SEPARATOR (p[-2]))
522             {
523               if (p - name == 2)
524                 {
525                   /* "/." => "/".  */
526                   *--p = '\0';
527                   goto append;
528                 }
529               else
530                 {
531                   /* "...foo/." => "...foo".  */
532                   p -= 2;
533                   *p = '\0';
534                   continue;
535                 }
536             }
537           else
538             break;
539         }
540
541       if (name[0] == '~')
542         name = tilde_expand (name);
543 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
544       else if (IS_ABSOLUTE_PATH (name) && p == name + 2) /* "d:" => "d:." */
545         name = concat (name, ".", (char *)NULL);
546 #endif
547       else if (!IS_ABSOLUTE_PATH (name) && name[0] != '$')
548         name = concat (current_directory, SLASH_STRING, name, (char *)NULL);
549       else
550         name = savestring (name, p - name);
551       make_cleanup (xfree, name);
552
553       /* Unless it's a variable, check existence.  */
554       if (name[0] != '$')
555         {
556           /* These are warnings, not errors, since we don't want a
557              non-existent directory in a .gdbinit file to stop processing
558              of the .gdbinit file.
559
560              Whether they get added to the path is more debatable.  Current
561              answer is yes, in case the user wants to go make the directory
562              or whatever.  If the directory continues to not exist/not be
563              a directory/etc, then having them in the path should be
564              harmless.  */
565           if (stat (name, &st) < 0)
566             {
567               int save_errno = errno;
568
569               fprintf_unfiltered (gdb_stderr, "Warning: ");
570               print_sys_errmsg (name, save_errno);
571             }
572           else if ((st.st_mode & S_IFMT) != S_IFDIR)
573             warning (_("%s is not a directory."), name);
574         }
575
576     append:
577       {
578         unsigned int len = strlen (name);
579
580         p = *which_path;
581         while (1)
582           {
583             /* FIXME: we should use realpath() or its work-alike
584                before comparing.  Then all the code above which
585                removes excess slashes and dots could simply go away.  */
586             if (!filename_ncmp (p, name, len)
587                 && (p[len] == '\0' || p[len] == DIRNAME_SEPARATOR))
588               {
589                 /* Found it in the search path, remove old copy.  */
590                 if (p > *which_path)
591                   p--;          /* Back over leading separator.  */
592                 if (prefix > p - *which_path)
593                   goto skip_dup;        /* Same dir twice in one cmd.  */
594                 strcpy (p, &p[len + 1]);        /* Copy from next \0 or  : */
595               }
596             p = strchr (p, DIRNAME_SEPARATOR);
597             if (p != 0)
598               ++p;
599             else
600               break;
601           }
602         if (p == 0)
603           {
604             char tinybuf[2];
605
606             tinybuf[0] = DIRNAME_SEPARATOR;
607             tinybuf[1] = '\0';
608
609             /* If we have already tacked on a name(s) in this command,
610                be sure they stay on the front as we tack on some
611                more.  */
612             if (prefix)
613               {
614                 char *temp, c;
615
616                 c = old[prefix];
617                 old[prefix] = '\0';
618                 temp = concat (old, tinybuf, name, (char *)NULL);
619                 old[prefix] = c;
620                 *which_path = concat (temp, "", &old[prefix], (char *) NULL);
621                 prefix = strlen (temp);
622                 xfree (temp);
623               }
624             else
625               {
626                 *which_path = concat (name, (old[0] ? tinybuf : old),
627                                       old, (char *)NULL);
628                 prefix = strlen (name);
629               }
630             xfree (old);
631             old = *which_path;
632           }
633       }
634     skip_dup:
635       ;
636     }
637   while (arg != NULL);
638 }
639
640
641 static void
642 source_info (char *ignore, int from_tty)
643 {
644   struct symtab *s = current_source_symtab;
645
646   if (!s)
647     {
648       printf_filtered (_("No current source file.\n"));
649       return;
650     }
651   printf_filtered (_("Current source file is %s\n"), s->filename);
652   if (s->dirname)
653     printf_filtered (_("Compilation directory is %s\n"), s->dirname);
654   if (s->fullname)
655     printf_filtered (_("Located in %s\n"), s->fullname);
656   if (s->nlines)
657     printf_filtered (_("Contains %d line%s.\n"), s->nlines,
658                      s->nlines == 1 ? "" : "s");
659
660   printf_filtered (_("Source language is %s.\n"), language_str (s->language));
661   printf_filtered (_("Compiled with %s debugging format.\n"), s->debugformat);
662   printf_filtered (_("%s preprocessor macro info.\n"),
663                    s->macro_table ? "Includes" : "Does not include");
664 }
665 \f
666
667 /* Return True if the file NAME exists and is a regular file.  */
668 static int
669 is_regular_file (const char *name)
670 {
671   struct stat st;
672   const int status = stat (name, &st);
673
674   /* Stat should never fail except when the file does not exist.
675      If stat fails, analyze the source of error and return True
676      unless the file does not exist, to avoid returning false results
677      on obscure systems where stat does not work as expected.  */
678
679   if (status != 0)
680     return (errno != ENOENT);
681
682   return S_ISREG (st.st_mode);
683 }
684
685 /* Open a file named STRING, searching path PATH (dir names sep by some char)
686    using mode MODE in the calls to open.  You cannot use this function to
687    create files (O_CREAT).
688
689    OPTS specifies the function behaviour in specific cases.
690
691    If OPF_TRY_CWD_FIRST, try to open ./STRING before searching PATH.
692    (ie pretend the first element of PATH is ".").  This also indicates
693    that a slash in STRING disables searching of the path (this is
694    so that "exec-file ./foo" or "symbol-file ./foo" insures that you
695    get that particular version of foo or an error message).
696
697    If OPTS has OPF_SEARCH_IN_PATH set, absolute names will also be
698    searched in path (we usually want this for source files but not for
699    executables).
700
701    If FILENAME_OPENED is non-null, set it to a newly allocated string naming
702    the actual file opened (this string will always start with a "/").  We
703    have to take special pains to avoid doubling the "/" between the directory
704    and the file, sigh!  Emacs gets confuzzed by this when we print the
705    source file name!!! 
706
707    If a file is found, return the descriptor.
708    Otherwise, return -1, with errno set for the last name we tried to open.  */
709
710 /*  >>>> This should only allow files of certain types,
711     >>>>  eg executable, non-directory.  */
712 int
713 openp (const char *path, int opts, const char *string,
714        int mode, char **filename_opened)
715 {
716   int fd;
717   char *filename;
718   const char *p;
719   const char *p1;
720   int len;
721   int alloclen;
722
723   /* The open syscall MODE parameter is not specified.  */
724   gdb_assert ((mode & O_CREAT) == 0);
725   gdb_assert (string != NULL);
726
727   /* A file with an empty name cannot possibly exist.  Report a failure
728      without further checking.
729
730      This is an optimization which also defends us against buggy
731      implementations of the "stat" function.  For instance, we have
732      noticed that a MinGW debugger built on Windows XP 32bits crashes
733      when the debugger is started with an empty argument.  */
734   if (string[0] == '\0')
735     {
736       errno = ENOENT;
737       return -1;
738     }
739
740   if (!path)
741     path = ".";
742
743   mode |= O_BINARY;
744
745   if ((opts & OPF_TRY_CWD_FIRST) || IS_ABSOLUTE_PATH (string))
746     {
747       int i;
748
749       if (is_regular_file (string))
750         {
751           filename = alloca (strlen (string) + 1);
752           strcpy (filename, string);
753           fd = open (filename, mode);
754           if (fd >= 0)
755             goto done;
756         }
757       else
758         {
759           filename = NULL;
760           fd = -1;
761         }
762
763       if (!(opts & OPF_SEARCH_IN_PATH))
764         for (i = 0; string[i]; i++)
765           if (IS_DIR_SEPARATOR (string[i]))
766             goto done;
767     }
768
769   /* For dos paths, d:/foo -> /foo, and d:foo -> foo.  */
770   if (HAS_DRIVE_SPEC (string))
771     string = STRIP_DRIVE_SPEC (string);
772
773   /* /foo => foo, to avoid multiple slashes that Emacs doesn't like.  */
774   while (IS_DIR_SEPARATOR(string[0]))
775     string++;
776
777   /* ./foo => foo */
778   while (string[0] == '.' && IS_DIR_SEPARATOR (string[1]))
779     string += 2;
780
781   alloclen = strlen (path) + strlen (string) + 2;
782   filename = alloca (alloclen);
783   fd = -1;
784   for (p = path; p; p = p1 ? p1 + 1 : 0)
785     {
786       p1 = strchr (p, DIRNAME_SEPARATOR);
787       if (p1)
788         len = p1 - p;
789       else
790         len = strlen (p);
791
792       if (len == 4 && p[0] == '$' && p[1] == 'c'
793           && p[2] == 'w' && p[3] == 'd')
794         {
795           /* Name is $cwd -- insert current directory name instead.  */
796           int newlen;
797
798           /* First, realloc the filename buffer if too short.  */
799           len = strlen (current_directory);
800           newlen = len + strlen (string) + 2;
801           if (newlen > alloclen)
802             {
803               alloclen = newlen;
804               filename = alloca (alloclen);
805             }
806           strcpy (filename, current_directory);
807         }
808       else
809         {
810           /* Normal file name in path -- just use it.  */
811           strncpy (filename, p, len);
812           filename[len] = 0;
813
814           /* Don't search $cdir.  It's also a magic path like $cwd, but we
815              don't have enough information to expand it.  The user *could*
816              have an actual directory named '$cdir' but handling that would
817              be confusing, it would mean different things in different
818              contexts.  If the user really has '$cdir' one can use './$cdir'.
819              We can get $cdir when loading scripts.  When loading source files
820              $cdir must have already been expanded to the correct value.  */
821           if (strcmp (filename, "$cdir") == 0)
822             continue;
823         }
824
825       /* Remove trailing slashes.  */
826       while (len > 0 && IS_DIR_SEPARATOR (filename[len - 1]))
827         filename[--len] = 0;
828
829       strcat (filename + len, SLASH_STRING);
830       strcat (filename, string);
831
832       if (is_regular_file (filename))
833         {
834           fd = open (filename, mode);
835           if (fd >= 0)
836             break;
837         }
838     }
839
840 done:
841   if (filename_opened)
842     {
843       /* If a file was opened, canonicalize its filename.  Use xfullpath
844          rather than gdb_realpath to avoid resolving the basename part
845          of filenames when the associated file is a symbolic link.  This
846          fixes a potential inconsistency between the filenames known to
847          GDB and the filenames it prints in the annotations.  */
848       if (fd < 0)
849         *filename_opened = NULL;
850       else if (IS_ABSOLUTE_PATH (filename))
851         *filename_opened = xfullpath (filename);
852       else
853         {
854           /* Beware the // my son, the Emacs barfs, the botch that catch...  */
855
856           char *f = concat (current_directory,
857                             IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
858                             ? "" : SLASH_STRING,
859                             filename, (char *)NULL);
860
861           *filename_opened = xfullpath (f);
862           xfree (f);
863         }
864     }
865
866   return fd;
867 }
868
869
870 /* This is essentially a convenience, for clients that want the behaviour
871    of openp, using source_path, but that really don't want the file to be
872    opened but want instead just to know what the full pathname is (as
873    qualified against source_path).
874
875    The current working directory is searched first.
876
877    If the file was found, this function returns 1, and FULL_PATHNAME is
878    set to the fully-qualified pathname.
879
880    Else, this functions returns 0, and FULL_PATHNAME is set to NULL.  */
881 int
882 source_full_path_of (const char *filename, char **full_pathname)
883 {
884   int fd;
885
886   fd = openp (source_path, OPF_TRY_CWD_FIRST | OPF_SEARCH_IN_PATH, filename,
887               O_RDONLY, full_pathname);
888   if (fd < 0)
889     {
890       *full_pathname = NULL;
891       return 0;
892     }
893
894   close (fd);
895   return 1;
896 }
897
898 /* Return non-zero if RULE matches PATH, that is if the rule can be
899    applied to PATH.  */
900
901 static int
902 substitute_path_rule_matches (const struct substitute_path_rule *rule,
903                               const char *path)
904 {
905   const int from_len = strlen (rule->from);
906   const int path_len = strlen (path);
907   char *path_start;
908
909   if (path_len < from_len)
910     return 0;
911
912   /* The substitution rules are anchored at the start of the path,
913      so the path should start with rule->from.  There is no filename
914      comparison routine, so we need to extract the first FROM_LEN
915      characters from PATH first and use that to do the comparison.  */
916
917   path_start = alloca (from_len + 1);
918   strncpy (path_start, path, from_len);
919   path_start[from_len] = '\0';
920
921   if (FILENAME_CMP (path_start, rule->from) != 0)
922     return 0;
923
924   /* Make sure that the region in the path that matches the substitution
925      rule is immediately followed by a directory separator (or the end of
926      string character).  */
927   
928   if (path[from_len] != '\0' && !IS_DIR_SEPARATOR (path[from_len]))
929     return 0;
930
931   return 1;
932 }
933
934 /* Find the substitute-path rule that applies to PATH and return it.
935    Return NULL if no rule applies.  */
936
937 static struct substitute_path_rule *
938 get_substitute_path_rule (const char *path)
939 {
940   struct substitute_path_rule *rule = substitute_path_rules;
941
942   while (rule != NULL && !substitute_path_rule_matches (rule, path))
943     rule = rule->next;
944
945   return rule;
946 }
947
948 /* If the user specified a source path substitution rule that applies
949    to PATH, then apply it and return the new path.  This new path must
950    be deallocated afterwards.
951    
952    Return NULL if no substitution rule was specified by the user,
953    or if no rule applied to the given PATH.  */
954    
955 static char *
956 rewrite_source_path (const char *path)
957 {
958   const struct substitute_path_rule *rule = get_substitute_path_rule (path);
959   char *new_path;
960   int from_len;
961   
962   if (rule == NULL)
963     return NULL;
964
965   from_len = strlen (rule->from);
966
967   /* Compute the rewritten path and return it.  */
968
969   new_path =
970     (char *) xmalloc (strlen (path) + 1 + strlen (rule->to) - from_len);
971   strcpy (new_path, rule->to);
972   strcat (new_path, path + from_len);
973
974   return new_path;
975 }
976
977 /* This function is capable of finding the absolute path to a
978    source file, and opening it, provided you give it a FILENAME.  Both the
979    DIRNAME and FULLNAME are only added suggestions on where to find the file.
980
981    FILENAME should be the filename to open.
982    DIRNAME is the compilation directory of a particular source file.
983            Only some debug formats provide this info.
984    FULLNAME can be the last known absolute path to the file in question.
985      Space for the path must have been malloc'd.  If a path substitution
986      is applied we free the old value and set a new one.
987
988    On Success 
989      A valid file descriptor is returned (the return value is positive).
990      FULLNAME is set to the absolute path to the file just opened.
991      The caller is responsible for freeing FULLNAME.
992
993    On Failure
994      An invalid file descriptor is returned (the return value is negative).
995      FULLNAME is set to NULL.  */
996
997 int
998 find_and_open_source (const char *filename,
999                       const char *dirname,
1000                       char **fullname)
1001 {
1002   char *path = source_path;
1003   const char *p;
1004   int result;
1005
1006   /* Quick way out if we already know its full name.  */
1007
1008   if (*fullname)
1009     {
1010       /* The user may have requested that source paths be rewritten
1011          according to substitution rules he provided.  If a substitution
1012          rule applies to this path, then apply it.  */
1013       char *rewritten_fullname = rewrite_source_path (*fullname);
1014
1015       if (rewritten_fullname != NULL)
1016         {
1017           xfree (*fullname);
1018           *fullname = rewritten_fullname;
1019         }
1020
1021       result = open (*fullname, OPEN_MODE);
1022       if (result >= 0)
1023         return result;
1024       /* Didn't work -- free old one, try again.  */
1025       xfree (*fullname);
1026       *fullname = NULL;
1027     }
1028
1029   if (dirname != NULL)
1030     {
1031       /* If necessary, rewrite the compilation directory name according
1032          to the source path substitution rules specified by the user.  */
1033
1034       char *rewritten_dirname = rewrite_source_path (dirname);
1035
1036       if (rewritten_dirname != NULL)
1037         {
1038           make_cleanup (xfree, rewritten_dirname);
1039           dirname = rewritten_dirname;
1040         }
1041       
1042       /* Replace a path entry of $cdir with the compilation directory
1043          name.  */
1044 #define cdir_len        5
1045       /* We cast strstr's result in case an ANSIhole has made it const,
1046          which produces a "required warning" when assigned to a nonconst.  */
1047       p = (char *) strstr (source_path, "$cdir");
1048       if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
1049           && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
1050         {
1051           int len;
1052
1053           path = (char *)
1054             alloca (strlen (source_path) + 1 + strlen (dirname) + 1);
1055           len = p - source_path;
1056           strncpy (path, source_path, len);     /* Before $cdir */
1057           strcpy (path + len, dirname);         /* new stuff */
1058           strcat (path + len, source_path + len + cdir_len);    /* After
1059                                                                    $cdir */
1060         }
1061     }
1062
1063   if (IS_ABSOLUTE_PATH (filename))
1064     {
1065       /* If filename is absolute path, try the source path
1066          substitution on it.  */
1067       char *rewritten_filename = rewrite_source_path (filename);
1068
1069       if (rewritten_filename != NULL)
1070         {
1071           make_cleanup (xfree, rewritten_filename);
1072           filename = rewritten_filename;
1073         }
1074     }
1075
1076   result = openp (path, OPF_SEARCH_IN_PATH, filename, OPEN_MODE, fullname);
1077   if (result < 0)
1078     {
1079       /* Didn't work.  Try using just the basename.  */
1080       p = lbasename (filename);
1081       if (p != filename)
1082         result = openp (path, OPF_SEARCH_IN_PATH, p, OPEN_MODE, fullname);
1083     }
1084
1085   return result;
1086 }
1087
1088 /* Open a source file given a symtab S.  Returns a file descriptor or
1089    negative number for error.  
1090    
1091    This function is a convience function to find_and_open_source.  */
1092
1093 int
1094 open_source_file (struct symtab *s)
1095 {
1096   if (!s)
1097     return -1;
1098
1099   return find_and_open_source (s->filename, s->dirname, &s->fullname);
1100 }
1101
1102 /* Finds the fullname that a symtab represents.
1103
1104    If this functions finds the fullname, it will save it in s->fullname
1105    and it will also return the value.
1106
1107    If this function fails to find the file that this symtab represents,
1108    NULL will be returned and s->fullname will be set to NULL.  */
1109 char *
1110 symtab_to_fullname (struct symtab *s)
1111 {
1112   int r;
1113
1114   if (!s)
1115     return NULL;
1116
1117   /* Don't check s->fullname here, the file could have been 
1118      deleted/moved/..., look for it again.  */
1119   r = find_and_open_source (s->filename, s->dirname, &s->fullname);
1120
1121   if (r >= 0)
1122     {
1123       close (r);
1124       return s->fullname;
1125     }
1126
1127   return NULL;
1128 }
1129 \f
1130 /* Create and initialize the table S->line_charpos that records
1131    the positions of the lines in the source file, which is assumed
1132    to be open on descriptor DESC.
1133    All set S->nlines to the number of such lines.  */
1134
1135 void
1136 find_source_lines (struct symtab *s, int desc)
1137 {
1138   struct stat st;
1139   char *data, *p, *end;
1140   int nlines = 0;
1141   int lines_allocated = 1000;
1142   int *line_charpos;
1143   long mtime = 0;
1144   int size;
1145
1146   gdb_assert (s);
1147   line_charpos = (int *) xmalloc (lines_allocated * sizeof (int));
1148   if (fstat (desc, &st) < 0)
1149     perror_with_name (s->filename);
1150
1151   if (s->objfile && s->objfile->obfd)
1152     mtime = s->objfile->mtime;
1153   else if (exec_bfd)
1154     mtime = exec_bfd_mtime;
1155
1156   if (mtime && mtime < st.st_mtime)
1157     warning (_("Source file is more recent than executable."));
1158
1159   {
1160     struct cleanup *old_cleanups;
1161
1162     /* st_size might be a large type, but we only support source files whose 
1163        size fits in an int.  */
1164     size = (int) st.st_size;
1165
1166     /* Use malloc, not alloca, because this may be pretty large, and we may
1167        run into various kinds of limits on stack size.  */
1168     data = (char *) xmalloc (size);
1169     old_cleanups = make_cleanup (xfree, data);
1170
1171     /* Reassign `size' to result of read for systems where \r\n -> \n.  */
1172     size = myread (desc, data, size);
1173     if (size < 0)
1174       perror_with_name (s->filename);
1175     end = data + size;
1176     p = data;
1177     line_charpos[0] = 0;
1178     nlines = 1;
1179     while (p != end)
1180       {
1181         if (*p++ == '\n'
1182         /* A newline at the end does not start a new line.  */
1183             && p != end)
1184           {
1185             if (nlines == lines_allocated)
1186               {
1187                 lines_allocated *= 2;
1188                 line_charpos =
1189                   (int *) xrealloc ((char *) line_charpos,
1190                                     sizeof (int) * lines_allocated);
1191               }
1192             line_charpos[nlines++] = p - data;
1193           }
1194       }
1195     do_cleanups (old_cleanups);
1196   }
1197
1198   s->nlines = nlines;
1199   s->line_charpos =
1200     (int *) xrealloc ((char *) line_charpos, nlines * sizeof (int));
1201
1202 }
1203
1204 \f
1205
1206 /* Get full pathname and line number positions for a symtab.
1207    Return nonzero if line numbers may have changed.
1208    Set *FULLNAME to actual name of the file as found by `openp',
1209    or to 0 if the file is not found.  */
1210
1211 static int
1212 get_filename_and_charpos (struct symtab *s, char **fullname)
1213 {
1214   int desc, linenums_changed = 0;
1215   struct cleanup *cleanups;
1216
1217   desc = open_source_file (s);
1218   if (desc < 0)
1219     {
1220       if (fullname)
1221         *fullname = NULL;
1222       return 0;
1223     }
1224   cleanups = make_cleanup_close (desc);
1225   if (fullname)
1226     *fullname = s->fullname;
1227   if (s->line_charpos == 0)
1228     linenums_changed = 1;
1229   if (linenums_changed)
1230     find_source_lines (s, desc);
1231   do_cleanups (cleanups);
1232   return linenums_changed;
1233 }
1234
1235 /* Print text describing the full name of the source file S
1236    and the line number LINE and its corresponding character position.
1237    The text starts with two Ctrl-z so that the Emacs-GDB interface
1238    can easily find it.
1239
1240    MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
1241
1242    Return 1 if successful, 0 if could not find the file.  */
1243
1244 int
1245 identify_source_line (struct symtab *s, int line, int mid_statement,
1246                       CORE_ADDR pc)
1247 {
1248   if (s->line_charpos == 0)
1249     get_filename_and_charpos (s, (char **) NULL);
1250   if (s->fullname == 0)
1251     return 0;
1252   if (line > s->nlines)
1253     /* Don't index off the end of the line_charpos array.  */
1254     return 0;
1255   annotate_source (s->fullname, line, s->line_charpos[line - 1],
1256                    mid_statement, get_objfile_arch (s->objfile), pc);
1257
1258   current_source_line = line;
1259   first_line_listed = line;
1260   last_line_listed = line;
1261   current_source_symtab = s;
1262   return 1;
1263 }
1264 \f
1265
1266 /* Print source lines from the file of symtab S,
1267    starting with line number LINE and stopping before line number STOPLINE.  */
1268
1269 static void print_source_lines_base (struct symtab *s, int line, int stopline,
1270                                      int noerror);
1271 static void
1272 print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
1273 {
1274   int c;
1275   int desc;
1276   int noprint = 0;
1277   FILE *stream;
1278   int nlines = stopline - line;
1279   struct cleanup *cleanup;
1280
1281   /* Regardless of whether we can open the file, set current_source_symtab.  */
1282   current_source_symtab = s;
1283   current_source_line = line;
1284   first_line_listed = line;
1285
1286   /* If printing of source lines is disabled, just print file and line
1287      number.  */
1288   if (ui_out_test_flags (uiout, ui_source_list))
1289     {
1290       /* Only prints "No such file or directory" once.  */
1291       if ((s != last_source_visited) || (!last_source_error))
1292         {
1293           last_source_visited = s;
1294           desc = open_source_file (s);
1295         }
1296       else
1297         {
1298           desc = last_source_error;
1299           noerror = 1;
1300         }
1301     }
1302   else
1303     {
1304       desc = last_source_error;
1305       noerror = 1;
1306       noprint = 1;
1307     }
1308
1309   if (desc < 0 || noprint)
1310     {
1311       last_source_error = desc;
1312
1313       if (!noerror)
1314         {
1315           char *name = alloca (strlen (s->filename) + 100);
1316           sprintf (name, "%d\t%s", line, s->filename);
1317           print_sys_errmsg (name, errno);
1318         }
1319       else
1320         ui_out_field_int (uiout, "line", line);
1321       ui_out_text (uiout, "\tin ");
1322       ui_out_field_string (uiout, "file", s->filename);
1323       ui_out_text (uiout, "\n");
1324
1325       return;
1326     }
1327
1328   last_source_error = 0;
1329
1330   if (s->line_charpos == 0)
1331     find_source_lines (s, desc);
1332
1333   if (line < 1 || line > s->nlines)
1334     {
1335       close (desc);
1336       error (_("Line number %d out of range; %s has %d lines."),
1337              line, s->filename, s->nlines);
1338     }
1339
1340   if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
1341     {
1342       close (desc);
1343       perror_with_name (s->filename);
1344     }
1345
1346   stream = fdopen (desc, FDOPEN_MODE);
1347   clearerr (stream);
1348   cleanup = make_cleanup_fclose (stream);
1349
1350   while (nlines-- > 0)
1351     {
1352       char buf[20];
1353
1354       c = fgetc (stream);
1355       if (c == EOF)
1356         break;
1357       last_line_listed = current_source_line;
1358       sprintf (buf, "%d\t", current_source_line++);
1359       ui_out_text (uiout, buf);
1360       do
1361         {
1362           if (c < 040 && c != '\t' && c != '\n' && c != '\r')
1363             {
1364               sprintf (buf, "^%c", c + 0100);
1365               ui_out_text (uiout, buf);
1366             }
1367           else if (c == 0177)
1368             ui_out_text (uiout, "^?");
1369           else if (c == '\r')
1370             {
1371               /* Skip a \r character, but only before a \n.  */
1372               int c1 = fgetc (stream);
1373
1374               if (c1 != '\n')
1375                 printf_filtered ("^%c", c + 0100);
1376               if (c1 != EOF)
1377                 ungetc (c1, stream);
1378             }
1379           else
1380             {
1381               sprintf (buf, "%c", c);
1382               ui_out_text (uiout, buf);
1383             }
1384         }
1385       while (c != '\n' && (c = fgetc (stream)) >= 0);
1386     }
1387
1388   do_cleanups (cleanup);
1389 }
1390 \f
1391 /* Show source lines from the file of symtab S, starting with line
1392    number LINE and stopping before line number STOPLINE.  If this is
1393    not the command line version, then the source is shown in the source
1394    window otherwise it is simply printed.  */
1395
1396 void
1397 print_source_lines (struct symtab *s, int line, int stopline, int noerror)
1398 {
1399   print_source_lines_base (s, line, stopline, noerror);
1400 }
1401 \f
1402 /* Print info on range of pc's in a specified line.  */
1403
1404 static void
1405 line_info (char *arg, int from_tty)
1406 {
1407   struct symtabs_and_lines sals;
1408   struct symtab_and_line sal;
1409   CORE_ADDR start_pc, end_pc;
1410   int i;
1411
1412   init_sal (&sal);              /* initialize to zeroes */
1413
1414   if (arg == 0)
1415     {
1416       sal.symtab = current_source_symtab;
1417       sal.line = last_line_listed;
1418       sals.nelts = 1;
1419       sals.sals = (struct symtab_and_line *)
1420         xmalloc (sizeof (struct symtab_and_line));
1421       sals.sals[0] = sal;
1422     }
1423   else
1424     {
1425       sals = decode_line_spec_1 (arg, 0);
1426
1427       dont_repeat ();
1428     }
1429
1430   /* C++  More than one line may have been specified, as when the user
1431      specifies an overloaded function name.  Print info on them all.  */
1432   for (i = 0; i < sals.nelts; i++)
1433     {
1434       sal = sals.sals[i];
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   xfree (sals.sals);
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 }