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