]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/gdb/gdb/source.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / gdb / gdb / source.c
1 /* List lines of source files for GDB, the GNU debugger.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
3    1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4    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 2 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, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22
23 #include "defs.h"
24 #include "symtab.h"
25 #include "expression.h"
26 #include "language.h"
27 #include "command.h"
28 #include "source.h"
29 #include "gdbcmd.h"
30 #include "frame.h"
31 #include "value.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 #ifdef CRLF_SOURCE_FILES
50
51 /* Define CRLF_SOURCE_FILES in an xm-*.h file if source files on the
52    host use \r\n rather than just \n.  Defining CRLF_SOURCE_FILES is
53    much faster than defining LSEEK_NOT_LINEAR.  */
54
55 #ifndef O_BINARY
56 #define O_BINARY 0
57 #endif
58
59 #define OPEN_MODE (O_RDONLY | O_BINARY)
60 #define FDOPEN_MODE FOPEN_RB
61
62 #else /* ! defined (CRLF_SOURCE_FILES) */
63
64 #define OPEN_MODE O_RDONLY
65 #define FDOPEN_MODE FOPEN_RT
66
67 #endif /* ! defined (CRLF_SOURCE_FILES) */
68
69 /* Prototypes for exported functions. */
70
71 void _initialize_source (void);
72
73 /* Prototypes for local functions. */
74
75 static int get_filename_and_charpos (struct symtab *, char **);
76
77 static void reverse_search_command (char *, int);
78
79 static void forward_search_command (char *, int);
80
81 static void line_info (char *, int);
82
83 static void source_info (char *, int);
84
85 static void show_directories (char *, int);
86
87 /* Path of directories to search for source files.
88    Same format as the PATH environment variable's value.  */
89
90 char *source_path;
91
92 /* Symtab of default file for listing lines of.  */
93
94 static struct symtab *current_source_symtab;
95
96 /* Default next line to list.  */
97
98 static int current_source_line;
99
100 /* Default number of lines to print with commands like "list".
101    This is based on guessing how many long (i.e. more than chars_per_line
102    characters) lines there will be.  To be completely correct, "list"
103    and friends should be rewritten to count characters and see where
104    things are wrapping, but that would be a fair amount of work.  */
105
106 int lines_to_list = 10;
107
108 /* Line number of last line printed.  Default for various commands.
109    current_source_line is usually, but not always, the same as this.  */
110
111 static int last_line_listed;
112
113 /* First line number listed by last listing command.  */
114
115 static int first_line_listed;
116
117 /* Saves the name of the last source file visited and a possible error code.
118    Used to prevent repeating annoying "No such file or directories" msgs */
119
120 static struct symtab *last_source_visited = NULL;
121 static int last_source_error = 0;
122 \f
123 /* Return the first line listed by print_source_lines.
124    Used by command interpreters to request listing from
125    a previous point. */
126
127 int
128 get_first_line_listed (void)
129 {
130   return first_line_listed;
131 }
132
133 /* Return the default number of lines to print with commands like the
134    cli "list".  The caller of print_source_lines must use this to
135    calculate the end line and use it in the call to print_source_lines
136    as it does not automatically use this value. */
137
138 int
139 get_lines_to_list (void)
140 {
141   return lines_to_list;
142 }
143
144 /* Return the current source file for listing and next line to list.
145    NOTE: The returned sal pc and end fields are not valid. */
146    
147 struct symtab_and_line
148 get_current_source_symtab_and_line (void)
149 {
150   struct symtab_and_line cursal;
151
152   cursal.symtab = current_source_symtab;
153   cursal.line = current_source_line;
154   cursal.pc = 0;
155   cursal.end = 0;
156   
157   return cursal;
158 }
159
160 /* If the current source file for listing is not set, try and get a default.
161    Usually called before get_current_source_symtab_and_line() is called.
162    It may err out if a default cannot be determined.
163    We must be cautious about where it is called, as it can recurse as the
164    process of determining a new default may call the caller!
165    Use get_current_source_symtab_and_line only to get whatever
166    we have without erroring out or trying to get a default. */
167    
168 void
169 set_default_source_symtab_and_line (void)
170 {
171   struct symtab_and_line cursal;
172
173   if (!have_full_symbols () && !have_partial_symbols ())
174     error ("No symbol table is loaded.  Use the \"file\" command.");
175
176   /* Pull in a current source symtab if necessary */
177   if (current_source_symtab == 0)
178     select_source_symtab (0);
179 }
180
181 /* Return the current default file for listing and next line to list
182    (the returned sal pc and end fields are not valid.)
183    and set the current default to whatever is in SAL.
184    NOTE: The returned sal pc and end fields are not valid. */
185    
186 struct symtab_and_line
187 set_current_source_symtab_and_line (const struct symtab_and_line *sal)
188 {
189   struct symtab_and_line cursal;
190   
191   cursal.symtab = current_source_symtab;
192   cursal.line = current_source_line;
193
194   current_source_symtab = sal->symtab;
195   current_source_line = sal->line;
196   cursal.pc = 0;
197   cursal.end = 0;
198   
199   return cursal;
200 }
201
202 /* Reset any information stored about a default file and line to print. */
203
204 void
205 clear_current_source_symtab_and_line (void)
206 {
207   current_source_symtab = 0;
208   current_source_line = 0;
209 }
210
211 /* Set the source file default for the "list" command to be S.
212
213    If S is NULL, and we don't have a default, find one.  This
214    should only be called when the user actually tries to use the
215    default, since we produce an error if we can't find a reasonable
216    default.  Also, since this can cause symbols to be read, doing it
217    before we need to would make things slower than necessary.  */
218
219 void
220 select_source_symtab (struct symtab *s)
221 {
222   struct symtabs_and_lines sals;
223   struct symtab_and_line sal;
224   struct partial_symtab *ps;
225   struct partial_symtab *cs_pst = 0;
226   struct objfile *ofp;
227
228   if (s)
229     {
230       current_source_symtab = s;
231       current_source_line = 1;
232       return;
233     }
234
235   if (current_source_symtab)
236     return;
237
238   /* Make the default place to list be the function `main'
239      if one exists.  */
240   if (lookup_symbol (main_name (), 0, VAR_DOMAIN, 0, NULL))
241     {
242       sals = decode_line_spec (main_name (), 1);
243       sal = sals.sals[0];
244       xfree (sals.sals);
245       current_source_symtab = sal.symtab;
246       current_source_line = max (sal.line - (lines_to_list - 1), 1);
247       if (current_source_symtab)
248         return;
249     }
250
251   /* All right; find the last file in the symtab list (ignoring .h's).  */
252
253   current_source_line = 1;
254
255   for (ofp = object_files; ofp != NULL; ofp = ofp->next)
256     {
257       for (s = ofp->symtabs; s; s = s->next)
258         {
259           char *name = s->filename;
260           int len = strlen (name);
261           if (!(len > 2 && (DEPRECATED_STREQ (&name[len - 2], ".h"))))
262             {
263               current_source_symtab = s;
264             }
265         }
266     }
267   if (current_source_symtab)
268     return;
269
270   /* Howabout the partial symbol tables? */
271
272   for (ofp = object_files; ofp != NULL; ofp = ofp->next)
273     {
274       for (ps = ofp->psymtabs; ps != NULL; ps = ps->next)
275         {
276           char *name = ps->filename;
277           int len = strlen (name);
278           if (!(len > 2 && (DEPRECATED_STREQ (&name[len - 2], ".h"))))
279             {
280               cs_pst = ps;
281             }
282         }
283     }
284   if (cs_pst)
285     {
286       if (cs_pst->readin)
287         {
288           internal_error (__FILE__, __LINE__,
289                           "select_source_symtab: "
290                           "readin pst found and no symtabs.");
291         }
292       else
293         {
294           current_source_symtab = PSYMTAB_TO_SYMTAB (cs_pst);
295         }
296     }
297   if (current_source_symtab)
298     return;
299
300   error ("Can't find a default source file");
301 }
302 \f
303 static void
304 show_directories (char *ignore, int from_tty)
305 {
306   puts_filtered ("Source directories searched: ");
307   puts_filtered (source_path);
308   puts_filtered ("\n");
309 }
310
311 /* Forget what we learned about line positions in source files, and
312    which directories contain them; must check again now since files
313    may be found in a different directory now.  */
314
315 void
316 forget_cached_source_info (void)
317 {
318   struct symtab *s;
319   struct objfile *objfile;
320   struct partial_symtab *pst;
321
322   for (objfile = object_files; objfile != NULL; objfile = objfile->next)
323     {
324       for (s = objfile->symtabs; s != NULL; s = s->next)
325         {
326           if (s->line_charpos != NULL)
327             {
328               xmfree (objfile->md, s->line_charpos);
329               s->line_charpos = NULL;
330             }
331           if (s->fullname != NULL)
332             {
333               xmfree (objfile->md, s->fullname);
334               s->fullname = NULL;
335             }
336         }
337
338       ALL_OBJFILE_PSYMTABS (objfile, pst)
339       {
340         if (pst->fullname != NULL)
341           {
342             xfree (pst->fullname);
343             pst->fullname = NULL;
344           }
345       }
346     }
347 }
348
349 void
350 init_source_path (void)
351 {
352   char buf[20];
353
354   sprintf (buf, "$cdir%c$cwd", DIRNAME_SEPARATOR);
355   source_path = xstrdup (buf);
356   forget_cached_source_info ();
357 }
358
359 void
360 init_last_source_visited (void)
361 {
362   last_source_visited = NULL;
363 }
364
365 /* Add zero or more directories to the front of the source path.  */
366
367 void
368 directory_command (char *dirname, int from_tty)
369 {
370   dont_repeat ();
371   /* FIXME, this goes to "delete dir"... */
372   if (dirname == 0)
373     {
374       if (from_tty && query ("Reinitialize source path to empty? "))
375         {
376           xfree (source_path);
377           init_source_path ();
378         }
379     }
380   else
381     {
382       mod_path (dirname, &source_path);
383       last_source_visited = NULL;
384     }
385   if (from_tty)
386     show_directories ((char *) 0, from_tty);
387   forget_cached_source_info ();
388 }
389
390 /* Add zero or more directories to the front of an arbitrary path.  */
391
392 void
393 mod_path (char *dirname, char **which_path)
394 {
395   add_path (dirname, which_path, 1);
396 }
397
398 /* Workhorse of mod_path.  Takes an extra argument to determine
399    if dirname should be parsed for separators that indicate multiple
400    directories.  This allows for interfaces that pre-parse the dirname
401    and allow specification of traditional separator characters such
402    as space or tab. */
403
404 void
405 add_path (char *dirname, char **which_path, int parse_separators)
406 {
407   char *old = *which_path;
408   int prefix = 0;
409
410   if (dirname == 0)
411     return;
412
413   dirname = xstrdup (dirname);
414   make_cleanup (xfree, dirname);
415
416   do
417     {
418       char *name = dirname;
419       char *p;
420       struct stat st;
421
422       {
423         char *separator = NULL;
424         char *space = NULL;
425         char *tab = NULL;
426
427         if (parse_separators)
428           {
429             separator = strchr (name, DIRNAME_SEPARATOR);
430             space = strchr (name, ' ');
431             tab = strchr (name, '\t');
432           }
433
434         if (separator == 0 && space == 0 && tab == 0)
435           p = dirname = name + strlen (name);
436         else
437           {
438             p = 0;
439             if (separator != 0 && (p == 0 || separator < p))
440               p = separator;
441             if (space != 0 && (p == 0 || space < p))
442               p = space;
443             if (tab != 0 && (p == 0 || tab < p))
444               p = tab;
445             dirname = p + 1;
446             while (*dirname == DIRNAME_SEPARATOR
447                    || *dirname == ' '
448                    || *dirname == '\t')
449               ++dirname;
450           }
451       }
452
453       if (!(IS_DIR_SEPARATOR (*name) && p <= name + 1)   /* "/" */
454 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
455       /* On MS-DOS and MS-Windows, h:\ is different from h: */
456           && !(p == name + 3 && name[1] == ':')          /* "d:/" */
457 #endif
458           && IS_DIR_SEPARATOR (p[-1]))
459         /* Sigh. "foo/" => "foo" */
460         --p;
461       *p = '\0';
462
463       while (p > name && p[-1] == '.')
464         {
465           if (p - name == 1)
466             {
467               /* "." => getwd ().  */
468               name = current_directory;
469               goto append;
470             }
471           else if (p > name + 1 && IS_DIR_SEPARATOR (p[-2]))
472             {
473               if (p - name == 2)
474                 {
475                   /* "/." => "/".  */
476                   *--p = '\0';
477                   goto append;
478                 }
479               else
480                 {
481                   /* "...foo/." => "...foo".  */
482                   p -= 2;
483                   *p = '\0';
484                   continue;
485                 }
486             }
487           else
488             break;
489         }
490
491       if (name[0] == '~')
492         name = tilde_expand (name);
493 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
494       else if (IS_ABSOLUTE_PATH (name) && p == name + 2) /* "d:" => "d:." */
495         name = concat (name, ".", NULL);
496 #endif
497       else if (!IS_ABSOLUTE_PATH (name) && name[0] != '$')
498         name = concat (current_directory, SLASH_STRING, name, NULL);
499       else
500         name = savestring (name, p - name);
501       make_cleanup (xfree, name);
502
503       /* Unless it's a variable, check existence.  */
504       if (name[0] != '$')
505         {
506           /* These are warnings, not errors, since we don't want a
507              non-existent directory in a .gdbinit file to stop processing
508              of the .gdbinit file.
509
510              Whether they get added to the path is more debatable.  Current
511              answer is yes, in case the user wants to go make the directory
512              or whatever.  If the directory continues to not exist/not be
513              a directory/etc, then having them in the path should be
514              harmless.  */
515           if (stat (name, &st) < 0)
516             {
517               int save_errno = errno;
518               fprintf_unfiltered (gdb_stderr, "Warning: ");
519               print_sys_errmsg (name, save_errno);
520             }
521           else if ((st.st_mode & S_IFMT) != S_IFDIR)
522             warning ("%s is not a directory.", name);
523         }
524
525     append:
526       {
527         unsigned int len = strlen (name);
528
529         p = *which_path;
530         while (1)
531           {
532             /* FIXME: strncmp loses in interesting ways on MS-DOS and
533                MS-Windows because of case-insensitivity and two different
534                but functionally identical slash characters.  We need a
535                special filesystem-dependent file-name comparison function.
536
537                Actually, even on Unix I would use realpath() or its work-
538                alike before comparing.  Then all the code above which
539                removes excess slashes and dots could simply go away.  */
540             if (!strncmp (p, name, len)
541                 && (p[len] == '\0' || p[len] == DIRNAME_SEPARATOR))
542               {
543                 /* Found it in the search path, remove old copy */
544                 if (p > *which_path)
545                   p--;          /* Back over leading separator */
546                 if (prefix > p - *which_path)
547                   goto skip_dup;        /* Same dir twice in one cmd */
548                 strcpy (p, &p[len + 1]);        /* Copy from next \0 or  : */
549               }
550             p = strchr (p, DIRNAME_SEPARATOR);
551             if (p != 0)
552               ++p;
553             else
554               break;
555           }
556         if (p == 0)
557           {
558             char tinybuf[2];
559
560             tinybuf[0] = DIRNAME_SEPARATOR;
561             tinybuf[1] = '\0';
562
563             /* If we have already tacked on a name(s) in this command, be sure they stay 
564                on the front as we tack on some more.  */
565             if (prefix)
566               {
567                 char *temp, c;
568
569                 c = old[prefix];
570                 old[prefix] = '\0';
571                 temp = concat (old, tinybuf, name, NULL);
572                 old[prefix] = c;
573                 *which_path = concat (temp, "", &old[prefix], NULL);
574                 prefix = strlen (temp);
575                 xfree (temp);
576               }
577             else
578               {
579                 *which_path = concat (name, (old[0] ? tinybuf : old), old, NULL);
580                 prefix = strlen (name);
581               }
582             xfree (old);
583             old = *which_path;
584           }
585       }
586     skip_dup:;
587     }
588   while (*dirname != '\0');
589 }
590
591
592 static void
593 source_info (char *ignore, int from_tty)
594 {
595   struct symtab *s = current_source_symtab;
596
597   if (!s)
598     {
599       printf_filtered ("No current source file.\n");
600       return;
601     }
602   printf_filtered ("Current source file is %s\n", s->filename);
603   if (s->dirname)
604     printf_filtered ("Compilation directory is %s\n", s->dirname);
605   if (s->fullname)
606     printf_filtered ("Located in %s\n", s->fullname);
607   if (s->nlines)
608     printf_filtered ("Contains %d line%s.\n", s->nlines,
609                      s->nlines == 1 ? "" : "s");
610
611   printf_filtered ("Source language is %s.\n", language_str (s->language));
612   printf_filtered ("Compiled with %s debugging format.\n", s->debugformat);
613   printf_filtered ("%s preprocessor macro info.\n",
614                    s->macro_table ? "Includes" : "Does not include");
615 }
616 \f
617
618 /* Return True if the file NAME exists and is a regular file */
619 static int
620 is_regular_file (const char *name)
621 {
622   struct stat st;
623   const int status = stat (name, &st);
624
625   /* Stat should never fail except when the file does not exist.
626      If stat fails, analyze the source of error and return True
627      unless the file does not exist, to avoid returning false results
628      on obscure systems where stat does not work as expected.
629    */
630   if (status != 0)
631     return (errno != ENOENT);
632
633   return S_ISREG (st.st_mode);
634 }
635
636 /* Open a file named STRING, searching path PATH (dir names sep by some char)
637    using mode MODE and protection bits PROT in the calls to open.
638
639    If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
640    (ie pretend the first element of PATH is ".").  This also indicates
641    that a slash in STRING disables searching of the path (this is
642    so that "exec-file ./foo" or "symbol-file ./foo" insures that you
643    get that particular version of foo or an error message).
644
645    If FILENAME_OPENED is non-null, set it to a newly allocated string naming
646    the actual file opened (this string will always start with a "/").  We
647    have to take special pains to avoid doubling the "/" between the directory
648    and the file, sigh!  Emacs gets confuzzed by this when we print the
649    source file name!!! 
650
651    If a file is found, return the descriptor.
652    Otherwise, return -1, with errno set for the last name we tried to open.  */
653
654 /*  >>>> This should only allow files of certain types,
655     >>>>  eg executable, non-directory */
656 int
657 openp (const char *path, int try_cwd_first, const char *string,
658        int mode, int prot,
659        char **filename_opened)
660 {
661   int fd;
662   char *filename;
663   const char *p;
664   const char *p1;
665   int len;
666   int alloclen;
667
668   if (!path)
669     path = ".";
670
671 #if defined(_WIN32) || defined(__CYGWIN__)
672   mode |= O_BINARY;
673 #endif
674
675   if (try_cwd_first || IS_ABSOLUTE_PATH (string))
676     {
677       int i;
678
679       if (is_regular_file (string))
680         {
681           filename = alloca (strlen (string) + 1);
682           strcpy (filename, string);
683           fd = open (filename, mode, prot);
684           if (fd >= 0)
685             goto done;
686         }
687       else
688         {
689           filename = NULL;
690           fd = -1;
691         }
692
693       for (i = 0; string[i]; i++)
694         if (IS_DIR_SEPARATOR (string[i]))
695           goto done;
696     }
697
698   /* ./foo => foo */
699   while (string[0] == '.' && IS_DIR_SEPARATOR (string[1]))
700     string += 2;
701
702   alloclen = strlen (path) + strlen (string) + 2;
703   filename = alloca (alloclen);
704   fd = -1;
705   for (p = path; p; p = p1 ? p1 + 1 : 0)
706     {
707       p1 = strchr (p, DIRNAME_SEPARATOR);
708       if (p1)
709         len = p1 - p;
710       else
711         len = strlen (p);
712
713       if (len == 4 && p[0] == '$' && p[1] == 'c'
714           && p[2] == 'w' && p[3] == 'd')
715         {
716           /* Name is $cwd -- insert current directory name instead.  */
717           int newlen;
718
719           /* First, realloc the filename buffer if too short. */
720           len = strlen (current_directory);
721           newlen = len + strlen (string) + 2;
722           if (newlen > alloclen)
723             {
724               alloclen = newlen;
725               filename = alloca (alloclen);
726             }
727           strcpy (filename, current_directory);
728         }
729       else
730         {
731           /* Normal file name in path -- just use it.  */
732           strncpy (filename, p, len);
733           filename[len] = 0;
734         }
735
736       /* Remove trailing slashes */
737       while (len > 0 && IS_DIR_SEPARATOR (filename[len - 1]))
738         filename[--len] = 0;
739
740       strcat (filename + len, SLASH_STRING);
741       strcat (filename, string);
742
743       if (is_regular_file (filename))
744       {
745         fd = open (filename, mode);
746         if (fd >= 0)
747           break;
748       }
749     }
750
751 done:
752   if (filename_opened)
753     {
754       /* If a file was opened, canonicalize its filename. Use xfullpath
755          rather than gdb_realpath to avoid resolving the basename part
756          of filenames when the associated file is a symbolic link. This
757          fixes a potential inconsistency between the filenames known to
758          GDB and the filenames it prints in the annotations.  */
759       if (fd < 0)
760         *filename_opened = NULL;
761       else if (IS_ABSOLUTE_PATH (filename))
762         *filename_opened = xfullpath (filename);
763       else
764         {
765           /* Beware the // my son, the Emacs barfs, the botch that catch... */
766
767           char *f = concat (current_directory,
768            IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
769                                      ? "" : SLASH_STRING,
770                                      filename, NULL);
771           *filename_opened = xfullpath (f);
772           xfree (f);
773         }
774     }
775
776   return fd;
777 }
778
779
780 /* This is essentially a convenience, for clients that want the behaviour
781    of openp, using source_path, but that really don't want the file to be
782    opened but want instead just to know what the full pathname is (as
783    qualified against source_path).
784
785    The current working directory is searched first.
786
787    If the file was found, this function returns 1, and FULL_PATHNAME is
788    set to the fully-qualified pathname.
789
790    Else, this functions returns 0, and FULL_PATHNAME is set to NULL.
791  */
792 int
793 source_full_path_of (char *filename, char **full_pathname)
794 {
795   int fd;
796
797   fd = openp (source_path, 1, filename, O_RDONLY, 0, full_pathname);
798   if (fd < 0)
799     {
800       *full_pathname = NULL;
801       return 0;
802     }
803
804   close (fd);
805   return 1;
806 }
807
808
809 /* Open a source file given a symtab S.  Returns a file descriptor or
810    negative number for error.  */
811
812 int
813 open_source_file (struct symtab *s)
814 {
815   char *path = source_path;
816   const char *p;
817   int result;
818   char *fullname;
819
820   /* Quick way out if we already know its full name */
821   if (s->fullname)
822     {
823       result = open (s->fullname, OPEN_MODE);
824       if (result >= 0)
825         return result;
826       /* Didn't work -- free old one, try again. */
827       xmfree (s->objfile->md, s->fullname);
828       s->fullname = NULL;
829     }
830
831   if (s->dirname != NULL)
832     {
833       /* Replace a path entry of  $cdir  with the compilation directory name */
834 #define cdir_len        5
835       /* We cast strstr's result in case an ANSIhole has made it const,
836          which produces a "required warning" when assigned to a nonconst. */
837       p = (char *) strstr (source_path, "$cdir");
838       if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
839           && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
840         {
841           int len;
842
843           path = (char *)
844             alloca (strlen (source_path) + 1 + strlen (s->dirname) + 1);
845           len = p - source_path;
846           strncpy (path, source_path, len);     /* Before $cdir */
847           strcpy (path + len, s->dirname);      /* new stuff */
848           strcat (path + len, source_path + len + cdir_len);    /* After $cdir */
849         }
850     }
851
852   result = openp (path, 0, s->filename, OPEN_MODE, 0, &s->fullname);
853   if (result < 0)
854     {
855       /* Didn't work.  Try using just the basename. */
856       p = lbasename (s->filename);
857       if (p != s->filename)
858         result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
859     }
860
861   if (result >= 0)
862     {
863       fullname = s->fullname;
864       s->fullname = mstrsave (s->objfile->md, s->fullname);
865       xfree (fullname);
866     }
867   return result;
868 }
869
870 /* Return the path to the source file associated with symtab.  Returns NULL
871    if no symtab.  */
872
873 char *
874 symtab_to_filename (struct symtab *s)
875 {
876   int fd;
877
878   if (!s)
879     return NULL;
880
881   /* If we've seen the file before, just return fullname. */
882
883   if (s->fullname)
884     return s->fullname;
885
886   /* Try opening the file to setup fullname */
887
888   fd = open_source_file (s);
889   if (fd < 0)
890     return s->filename;         /* File not found.  Just use short name */
891
892   /* Found the file.  Cleanup and return the full name */
893
894   close (fd);
895   return s->fullname;
896 }
897 \f
898
899 /* Create and initialize the table S->line_charpos that records
900    the positions of the lines in the source file, which is assumed
901    to be open on descriptor DESC.
902    All set S->nlines to the number of such lines.  */
903
904 void
905 find_source_lines (struct symtab *s, int desc)
906 {
907   struct stat st;
908   char *data, *p, *end;
909   int nlines = 0;
910   int lines_allocated = 1000;
911   int *line_charpos;
912   long mtime = 0;
913   int size;
914
915   line_charpos = (int *) xmmalloc (s->objfile->md,
916                                    lines_allocated * sizeof (int));
917   if (fstat (desc, &st) < 0)
918     perror_with_name (s->filename);
919
920   if (s && s->objfile && s->objfile->obfd)
921     mtime = bfd_get_mtime (s->objfile->obfd);
922   else if (exec_bfd)
923     mtime = bfd_get_mtime (exec_bfd);
924
925   if (mtime && mtime < st.st_mtime)
926     {
927       warning ("Source file is more recent than executable.\n");
928     }
929
930 #ifdef LSEEK_NOT_LINEAR
931   {
932     char c;
933
934     /* Have to read it byte by byte to find out where the chars live */
935
936     line_charpos[0] = lseek (desc, 0, SEEK_CUR);
937     nlines = 1;
938     while (myread (desc, &c, 1) > 0)
939       {
940         if (c == '\n')
941           {
942             if (nlines == lines_allocated)
943               {
944                 lines_allocated *= 2;
945                 line_charpos =
946                   (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
947                                      sizeof (int) * lines_allocated);
948               }
949             line_charpos[nlines++] = lseek (desc, 0, SEEK_CUR);
950           }
951       }
952   }
953 #else /* lseek linear.  */
954   {
955     struct cleanup *old_cleanups;
956
957     /* st_size might be a large type, but we only support source files whose 
958        size fits in an int.  */
959     size = (int) st.st_size;
960
961     /* Use malloc, not alloca, because this may be pretty large, and we may
962        run into various kinds of limits on stack size.  */
963     data = (char *) xmalloc (size);
964     old_cleanups = make_cleanup (xfree, data);
965
966     /* Reassign `size' to result of read for systems where \r\n -> \n.  */
967     size = myread (desc, data, size);
968     if (size < 0)
969       perror_with_name (s->filename);
970     end = data + size;
971     p = data;
972     line_charpos[0] = 0;
973     nlines = 1;
974     while (p != end)
975       {
976         if (*p++ == '\n'
977         /* A newline at the end does not start a new line.  */
978             && p != end)
979           {
980             if (nlines == lines_allocated)
981               {
982                 lines_allocated *= 2;
983                 line_charpos =
984                   (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
985                                      sizeof (int) * lines_allocated);
986               }
987             line_charpos[nlines++] = p - data;
988           }
989       }
990     do_cleanups (old_cleanups);
991   }
992 #endif /* lseek linear.  */
993   s->nlines = nlines;
994   s->line_charpos =
995     (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
996                        nlines * sizeof (int));
997
998 }
999
1000 /* Return the character position of a line LINE in symtab S.
1001    Return 0 if anything is invalid.  */
1002
1003 #if 0                           /* Currently unused */
1004
1005 int
1006 source_line_charpos (struct symtab *s, int line)
1007 {
1008   if (!s)
1009     return 0;
1010   if (!s->line_charpos || line <= 0)
1011     return 0;
1012   if (line > s->nlines)
1013     line = s->nlines;
1014   return s->line_charpos[line - 1];
1015 }
1016
1017 /* Return the line number of character position POS in symtab S.  */
1018
1019 int
1020 source_charpos_line (struct symtab *s, int chr)
1021 {
1022   int line = 0;
1023   int *lnp;
1024
1025   if (s == 0 || s->line_charpos == 0)
1026     return 0;
1027   lnp = s->line_charpos;
1028   /* Files are usually short, so sequential search is Ok */
1029   while (line < s->nlines && *lnp <= chr)
1030     {
1031       line++;
1032       lnp++;
1033     }
1034   if (line >= s->nlines)
1035     line = s->nlines;
1036   return line;
1037 }
1038
1039 #endif /* 0 */
1040 \f
1041
1042 /* Get full pathname and line number positions for a symtab.
1043    Return nonzero if line numbers may have changed.
1044    Set *FULLNAME to actual name of the file as found by `openp',
1045    or to 0 if the file is not found.  */
1046
1047 static int
1048 get_filename_and_charpos (struct symtab *s, char **fullname)
1049 {
1050   int desc, linenums_changed = 0;
1051
1052   desc = open_source_file (s);
1053   if (desc < 0)
1054     {
1055       if (fullname)
1056         *fullname = NULL;
1057       return 0;
1058     }
1059   if (fullname)
1060     *fullname = s->fullname;
1061   if (s->line_charpos == 0)
1062     linenums_changed = 1;
1063   if (linenums_changed)
1064     find_source_lines (s, desc);
1065   close (desc);
1066   return linenums_changed;
1067 }
1068
1069 /* Print text describing the full name of the source file S
1070    and the line number LINE and its corresponding character position.
1071    The text starts with two Ctrl-z so that the Emacs-GDB interface
1072    can easily find it.
1073
1074    MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
1075
1076    Return 1 if successful, 0 if could not find the file.  */
1077
1078 int
1079 identify_source_line (struct symtab *s, int line, int mid_statement,
1080                       CORE_ADDR pc)
1081 {
1082   if (s->line_charpos == 0)
1083     get_filename_and_charpos (s, (char **) NULL);
1084   if (s->fullname == 0)
1085     return 0;
1086   if (line > s->nlines)
1087     /* Don't index off the end of the line_charpos array.  */
1088     return 0;
1089   annotate_source (s->fullname, line, s->line_charpos[line - 1],
1090                    mid_statement, pc);
1091
1092   current_source_line = line;
1093   first_line_listed = line;
1094   last_line_listed = line;
1095   current_source_symtab = s;
1096   return 1;
1097 }
1098 \f
1099
1100 /* Print source lines from the file of symtab S,
1101    starting with line number LINE and stopping before line number STOPLINE. */
1102
1103 static void print_source_lines_base (struct symtab *s, int line, int stopline,
1104                                      int noerror);
1105 static void
1106 print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
1107 {
1108   int c;
1109   int desc;
1110   FILE *stream;
1111   int nlines = stopline - line;
1112
1113   /* Regardless of whether we can open the file, set current_source_symtab. */
1114   current_source_symtab = s;
1115   current_source_line = line;
1116   first_line_listed = line;
1117
1118   /* If printing of source lines is disabled, just print file and line number */
1119   if (ui_out_test_flags (uiout, ui_source_list))
1120     {
1121       /* Only prints "No such file or directory" once */
1122       if ((s != last_source_visited) || (!last_source_error))
1123         {
1124           last_source_visited = s;
1125           desc = open_source_file (s);
1126         }
1127       else
1128         {
1129           desc = last_source_error;
1130           noerror = 1;
1131         }
1132     }
1133   else
1134     {
1135       desc = -1;
1136       noerror = 1;
1137     }
1138
1139   if (desc < 0)
1140     {
1141       last_source_error = desc;
1142
1143       if (!noerror)
1144         {
1145           char *name = alloca (strlen (s->filename) + 100);
1146           sprintf (name, "%d\t%s", line, s->filename);
1147           print_sys_errmsg (name, errno);
1148         }
1149       else
1150         ui_out_field_int (uiout, "line", line);
1151       ui_out_text (uiout, "\tin ");
1152       ui_out_field_string (uiout, "file", s->filename);
1153       ui_out_text (uiout, "\n");
1154
1155       return;
1156     }
1157
1158   last_source_error = 0;
1159
1160   if (s->line_charpos == 0)
1161     find_source_lines (s, desc);
1162
1163   if (line < 1 || line > s->nlines)
1164     {
1165       close (desc);
1166       error ("Line number %d out of range; %s has %d lines.",
1167              line, s->filename, s->nlines);
1168     }
1169
1170   if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
1171     {
1172       close (desc);
1173       perror_with_name (s->filename);
1174     }
1175
1176   stream = fdopen (desc, FDOPEN_MODE);
1177   clearerr (stream);
1178
1179   while (nlines-- > 0)
1180     {
1181       char buf[20];
1182
1183       c = fgetc (stream);
1184       if (c == EOF)
1185         break;
1186       last_line_listed = current_source_line;
1187       sprintf (buf, "%d\t", current_source_line++);
1188       ui_out_text (uiout, buf);
1189       do
1190         {
1191           if (c < 040 && c != '\t' && c != '\n' && c != '\r')
1192             {
1193               sprintf (buf, "^%c", c + 0100);
1194               ui_out_text (uiout, buf);
1195             }
1196           else if (c == 0177)
1197             ui_out_text (uiout, "^?");
1198 #ifdef CRLF_SOURCE_FILES
1199           else if (c == '\r')
1200             {
1201               /* Skip a \r character, but only before a \n.  */
1202               int c1 = fgetc (stream);
1203
1204               if (c1 != '\n')
1205                 printf_filtered ("^%c", c + 0100);
1206               if (c1 != EOF)
1207                 ungetc (c1, stream);
1208             }
1209 #endif
1210           else
1211             {
1212               sprintf (buf, "%c", c);
1213               ui_out_text (uiout, buf);
1214             }
1215         }
1216       while (c != '\n' && (c = fgetc (stream)) >= 0);
1217     }
1218
1219   fclose (stream);
1220 }
1221 \f
1222 /* Show source lines from the file of symtab S, starting with line
1223    number LINE and stopping before line number STOPLINE.  If this is the
1224    not the command line version, then the source is shown in the source
1225    window otherwise it is simply printed */
1226
1227 void
1228 print_source_lines (struct symtab *s, int line, int stopline, int noerror)
1229 {
1230   print_source_lines_base (s, line, stopline, noerror);
1231 }
1232 \f
1233 /* Print info on range of pc's in a specified line.  */
1234
1235 static void
1236 line_info (char *arg, int from_tty)
1237 {
1238   struct symtabs_and_lines sals;
1239   struct symtab_and_line sal;
1240   CORE_ADDR start_pc, end_pc;
1241   int i;
1242
1243   init_sal (&sal);              /* initialize to zeroes */
1244
1245   if (arg == 0)
1246     {
1247       sal.symtab = current_source_symtab;
1248       sal.line = last_line_listed;
1249       sals.nelts = 1;
1250       sals.sals = (struct symtab_and_line *)
1251         xmalloc (sizeof (struct symtab_and_line));
1252       sals.sals[0] = sal;
1253     }
1254   else
1255     {
1256       sals = decode_line_spec_1 (arg, 0);
1257
1258       dont_repeat ();
1259     }
1260
1261   /* C++  More than one line may have been specified, as when the user
1262      specifies an overloaded function name. Print info on them all. */
1263   for (i = 0; i < sals.nelts; i++)
1264     {
1265       sal = sals.sals[i];
1266
1267       if (sal.symtab == 0)
1268         {
1269           printf_filtered ("No line number information available");
1270           if (sal.pc != 0)
1271             {
1272               /* This is useful for "info line *0x7f34".  If we can't tell the
1273                  user about a source line, at least let them have the symbolic
1274                  address.  */
1275               printf_filtered (" for address ");
1276               wrap_here ("  ");
1277               print_address (sal.pc, gdb_stdout);
1278             }
1279           else
1280             printf_filtered (".");
1281           printf_filtered ("\n");
1282         }
1283       else if (sal.line > 0
1284                && find_line_pc_range (sal, &start_pc, &end_pc))
1285         {
1286           if (start_pc == end_pc)
1287             {
1288               printf_filtered ("Line %d of \"%s\"",
1289                                sal.line, sal.symtab->filename);
1290               wrap_here ("  ");
1291               printf_filtered (" is at address ");
1292               print_address (start_pc, gdb_stdout);
1293               wrap_here ("  ");
1294               printf_filtered (" but contains no code.\n");
1295             }
1296           else
1297             {
1298               printf_filtered ("Line %d of \"%s\"",
1299                                sal.line, sal.symtab->filename);
1300               wrap_here ("  ");
1301               printf_filtered (" starts at address ");
1302               print_address (start_pc, gdb_stdout);
1303               wrap_here ("  ");
1304               printf_filtered (" and ends at ");
1305               print_address (end_pc, gdb_stdout);
1306               printf_filtered (".\n");
1307             }
1308
1309           /* x/i should display this line's code.  */
1310           set_next_address (start_pc);
1311
1312           /* Repeating "info line" should do the following line.  */
1313           last_line_listed = sal.line + 1;
1314
1315           /* If this is the only line, show the source code.  If it could
1316              not find the file, don't do anything special.  */
1317           if (annotation_level && sals.nelts == 1)
1318             identify_source_line (sal.symtab, sal.line, 0, start_pc);
1319         }
1320       else
1321         /* Is there any case in which we get here, and have an address
1322            which the user would want to see?  If we have debugging symbols
1323            and no line numbers?  */
1324         printf_filtered ("Line number %d is out of range for \"%s\".\n",
1325                          sal.line, sal.symtab->filename);
1326     }
1327   xfree (sals.sals);
1328 }
1329 \f
1330 /* Commands to search the source file for a regexp.  */
1331
1332 static void
1333 forward_search_command (char *regex, int from_tty)
1334 {
1335   int c;
1336   int desc;
1337   FILE *stream;
1338   int line;
1339   char *msg;
1340
1341   line = last_line_listed + 1;
1342
1343   msg = (char *) re_comp (regex);
1344   if (msg)
1345     error ("%s", msg);
1346
1347   if (current_source_symtab == 0)
1348     select_source_symtab (0);
1349
1350   desc = open_source_file (current_source_symtab);
1351   if (desc < 0)
1352     perror_with_name (current_source_symtab->filename);
1353
1354   if (current_source_symtab->line_charpos == 0)
1355     find_source_lines (current_source_symtab, desc);
1356
1357   if (line < 1 || line > current_source_symtab->nlines)
1358     {
1359       close (desc);
1360       error ("Expression not found");
1361     }
1362
1363   if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1364     {
1365       close (desc);
1366       perror_with_name (current_source_symtab->filename);
1367     }
1368
1369   stream = fdopen (desc, FDOPEN_MODE);
1370   clearerr (stream);
1371   while (1)
1372     {
1373       static char *buf = NULL;
1374       char *p;
1375       int cursize, newsize;
1376
1377       cursize = 256;
1378       buf = xmalloc (cursize);
1379       p = buf;
1380
1381       c = getc (stream);
1382       if (c == EOF)
1383         break;
1384       do
1385         {
1386           *p++ = c;
1387           if (p - buf == cursize)
1388             {
1389               newsize = cursize + cursize / 2;
1390               buf = xrealloc (buf, newsize);
1391               p = buf + cursize;
1392               cursize = newsize;
1393             }
1394         }
1395       while (c != '\n' && (c = getc (stream)) >= 0);
1396
1397 #ifdef CRLF_SOURCE_FILES
1398       /* Remove the \r, if any, at the end of the line, otherwise
1399          regular expressions that end with $ or \n won't work.  */
1400       if (p - buf > 1 && p[-2] == '\r')
1401         {
1402           p--;
1403           p[-1] = '\n';
1404         }
1405 #endif
1406
1407       /* we now have a source line in buf, null terminate and match */
1408       *p = 0;
1409       if (re_exec (buf) > 0)
1410         {
1411           /* Match! */
1412           fclose (stream);
1413           print_source_lines (current_source_symtab, line, line + 1, 0);
1414           set_internalvar (lookup_internalvar ("_"),
1415                            value_from_longest (builtin_type_int,
1416                                                (LONGEST) line));
1417           current_source_line = max (line - lines_to_list / 2, 1);
1418           return;
1419         }
1420       line++;
1421     }
1422
1423   printf_filtered ("Expression not found\n");
1424   fclose (stream);
1425 }
1426
1427 static void
1428 reverse_search_command (char *regex, int from_tty)
1429 {
1430   int c;
1431   int desc;
1432   FILE *stream;
1433   int line;
1434   char *msg;
1435
1436   line = last_line_listed - 1;
1437
1438   msg = (char *) re_comp (regex);
1439   if (msg)
1440     error ("%s", msg);
1441
1442   if (current_source_symtab == 0)
1443     select_source_symtab (0);
1444
1445   desc = open_source_file (current_source_symtab);
1446   if (desc < 0)
1447     perror_with_name (current_source_symtab->filename);
1448
1449   if (current_source_symtab->line_charpos == 0)
1450     find_source_lines (current_source_symtab, desc);
1451
1452   if (line < 1 || line > current_source_symtab->nlines)
1453     {
1454       close (desc);
1455       error ("Expression not found");
1456     }
1457
1458   if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1459     {
1460       close (desc);
1461       perror_with_name (current_source_symtab->filename);
1462     }
1463
1464   stream = fdopen (desc, FDOPEN_MODE);
1465   clearerr (stream);
1466   while (line > 1)
1467     {
1468 /* FIXME!!!  We walk right off the end of buf if we get a long line!!! */
1469       char buf[4096];           /* Should be reasonable??? */
1470       char *p = buf;
1471
1472       c = getc (stream);
1473       if (c == EOF)
1474         break;
1475       do
1476         {
1477           *p++ = c;
1478         }
1479       while (c != '\n' && (c = getc (stream)) >= 0);
1480
1481 #ifdef CRLF_SOURCE_FILES
1482       /* Remove the \r, if any, at the end of the line, otherwise
1483          regular expressions that end with $ or \n won't work.  */
1484       if (p - buf > 1 && p[-2] == '\r')
1485         {
1486           p--;
1487           p[-1] = '\n';
1488         }
1489 #endif
1490
1491       /* We now have a source line in buf; null terminate and match.  */
1492       *p = 0;
1493       if (re_exec (buf) > 0)
1494         {
1495           /* Match! */
1496           fclose (stream);
1497           print_source_lines (current_source_symtab, line, line + 1, 0);
1498           set_internalvar (lookup_internalvar ("_"),
1499                            value_from_longest (builtin_type_int,
1500                                                (LONGEST) line));
1501           current_source_line = max (line - lines_to_list / 2, 1);
1502           return;
1503         }
1504       line--;
1505       if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1506         {
1507           fclose (stream);
1508           perror_with_name (current_source_symtab->filename);
1509         }
1510     }
1511
1512   printf_filtered ("Expression not found\n");
1513   fclose (stream);
1514   return;
1515 }
1516 \f
1517 void
1518 _initialize_source (void)
1519 {
1520   struct cmd_list_element *c;
1521   current_source_symtab = 0;
1522   init_source_path ();
1523
1524   /* The intention is to use POSIX Basic Regular Expressions.
1525      Always use the GNU regex routine for consistency across all hosts.
1526      Our current GNU regex.c does not have all the POSIX features, so this is
1527      just an approximation.  */
1528   re_set_syntax (RE_SYNTAX_GREP);
1529
1530   c = add_cmd ("directory", class_files, directory_command,
1531                "Add directory DIR to beginning of search path for source files.\n\
1532 Forget cached info on source file locations and line positions.\n\
1533 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1534 directory in which the source file was compiled into object code.\n\
1535 With no argument, reset the search path to $cdir:$cwd, the default.",
1536                &cmdlist);
1537
1538   if (dbx_commands)
1539     add_com_alias ("use", "directory", class_files, 0);
1540
1541   set_cmd_completer (c, filename_completer);
1542
1543   add_cmd ("directories", no_class, show_directories,
1544            "Current search path for finding source files.\n\
1545 $cwd in the path means the current working directory.\n\
1546 $cdir in the path means the compilation directory of the source file.",
1547            &showlist);
1548
1549   if (xdb_commands)
1550     {
1551       add_com_alias ("D", "directory", class_files, 0);
1552       add_cmd ("ld", no_class, show_directories,
1553                "Current search path for finding source files.\n\
1554 $cwd in the path means the current working directory.\n\
1555 $cdir in the path means the compilation directory of the source file.",
1556                &cmdlist);
1557     }
1558
1559   add_info ("source", source_info,
1560             "Information about the current source file.");
1561
1562   add_info ("line", line_info,
1563             concat ("Core addresses of the code for a source line.\n\
1564 Line can be specified as\n\
1565   LINENUM, to list around that line in current file,\n\
1566   FILE:LINENUM, to list around that line in that file,\n\
1567   FUNCTION, to list around beginning of that function,\n\
1568   FILE:FUNCTION, to distinguish among like-named static functions.\n\
1569 ", "\
1570 Default is to describe the last source line that was listed.\n\n\
1571 This sets the default address for \"x\" to the line's first instruction\n\
1572 so that \"x/i\" suffices to start examining the machine code.\n\
1573 The address is also stored as the value of \"$_\".", NULL));
1574
1575   add_com ("forward-search", class_files, forward_search_command,
1576            "Search for regular expression (see regex(3)) from last line listed.\n\
1577 The matching line number is also stored as the value of \"$_\".");
1578   add_com_alias ("search", "forward-search", class_files, 0);
1579
1580   add_com ("reverse-search", class_files, reverse_search_command,
1581            "Search backward for regular expression (see regex(3)) from last line listed.\n\
1582 The matching line number is also stored as the value of \"$_\".");
1583
1584   if (xdb_commands)
1585     {
1586       add_com_alias ("/", "forward-search", class_files, 0);
1587       add_com_alias ("?", "reverse-search", class_files, 0);
1588     }
1589
1590   add_show_from_set
1591     (add_set_cmd ("listsize", class_support, var_uinteger,
1592                   (char *) &lines_to_list,
1593                   "Set number of source lines gdb will list by default.",
1594                   &setlist),
1595      &showlist);
1596 }