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