OSDN Git Service

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