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