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