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