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