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