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