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