xref: /openbsd-src/gnu/usr.bin/binutils/gdb/source.c (revision 0eea0d082377cb9c3ec583313dc4d52b7b6a4d6d)
1 /* List lines of source files for GDB, the GNU debugger.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
3    1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4    Free Software Foundation, Inc.
5 
6    This file is part of GDB.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22 
23 #include "defs.h"
24 #include "symtab.h"
25 #include "expression.h"
26 #include "language.h"
27 #include "command.h"
28 #include "source.h"
29 #include "gdbcmd.h"
30 #include "frame.h"
31 #include "value.h"
32 
33 #include <sys/types.h>
34 #include "gdb_string.h"
35 #include "gdb_stat.h"
36 #include <fcntl.h>
37 #include "gdbcore.h"
38 #include "gdb_regex.h"
39 #include "symfile.h"
40 #include "objfiles.h"
41 #include "annotate.h"
42 #include "gdbtypes.h"
43 #include "linespec.h"
44 #include "filenames.h"		/* for DOSish file names */
45 #include "completer.h"
46 #include "ui-out.h"
47 #include "readline/readline.h"
48 
49 #ifdef CRLF_SOURCE_FILES
50 
51 /* Define CRLF_SOURCE_FILES in an xm-*.h file if source files on the
52    host use \r\n rather than just \n.  Defining CRLF_SOURCE_FILES is
53    much faster than defining LSEEK_NOT_LINEAR.  */
54 
55 #ifndef O_BINARY
56 #define O_BINARY 0
57 #endif
58 
59 #define OPEN_MODE (O_RDONLY | O_BINARY)
60 #define FDOPEN_MODE FOPEN_RB
61 
62 #else /* ! defined (CRLF_SOURCE_FILES) */
63 
64 #define OPEN_MODE O_RDONLY
65 #define FDOPEN_MODE FOPEN_RT
66 
67 #endif /* ! defined (CRLF_SOURCE_FILES) */
68 
69 /* Prototypes for exported functions. */
70 
71 void _initialize_source (void);
72 
73 /* Prototypes for local functions. */
74 
75 static int get_filename_and_charpos (struct symtab *, char **);
76 
77 static void reverse_search_command (char *, int);
78 
79 static void forward_search_command (char *, int);
80 
81 static void line_info (char *, int);
82 
83 static void source_info (char *, int);
84 
85 static void show_directories (char *, int);
86 
87 /* Path of directories to search for source files.
88    Same format as the PATH environment variable's value.  */
89 
90 char *source_path;
91 
92 /* Symtab of default file for listing lines of.  */
93 
94 static struct symtab *current_source_symtab;
95 
96 /* Default next line to list.  */
97 
98 static int current_source_line;
99 
100 /* Default number of lines to print with commands like "list".
101    This is based on guessing how many long (i.e. more than chars_per_line
102    characters) lines there will be.  To be completely correct, "list"
103    and friends should be rewritten to count characters and see where
104    things are wrapping, but that would be a fair amount of work.  */
105 
106 int lines_to_list = 10;
107 
108 /* Line number of last line printed.  Default for various commands.
109    current_source_line is usually, but not always, the same as this.  */
110 
111 static int last_line_listed;
112 
113 /* First line number listed by last listing command.  */
114 
115 static int first_line_listed;
116 
117 /* Saves the name of the last source file visited and a possible error code.
118    Used to prevent repeating annoying "No such file or directories" msgs */
119 
120 static struct symtab *last_source_visited = NULL;
121 static int last_source_error = 0;
122 
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 
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 
617 
618 /* Return True if the file NAME exists and is a regular file */
619 static int
620 is_regular_file (const char *name)
621 {
622   struct stat st;
623   const int status = stat (name, &st);
624 
625   /* Stat should never fail except when the file does not exist.
626      If stat fails, analyze the source of error and return True
627      unless the file does not exist, to avoid returning false results
628      on obscure systems where stat does not work as expected.
629    */
630   if (status != 0)
631     return (errno != ENOENT);
632 
633   return S_ISREG (st.st_mode);
634 }
635 
636 /* Open a file named STRING, searching path PATH (dir names sep by some char)
637    using mode MODE and protection bits PROT in the calls to open.
638 
639    If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
640    (ie pretend the first element of PATH is ".").  This also indicates
641    that a slash in STRING disables searching of the path (this is
642    so that "exec-file ./foo" or "symbol-file ./foo" insures that you
643    get that particular version of foo or an error message).
644 
645    If FILENAME_OPENED is non-null, set it to a newly allocated string naming
646    the actual file opened (this string will always start with a "/").  We
647    have to take special pains to avoid doubling the "/" between the directory
648    and the file, sigh!  Emacs gets confuzzed by this when we print the
649    source file name!!!
650 
651    If a file is found, return the descriptor.
652    Otherwise, return -1, with errno set for the last name we tried to open.  */
653 
654 /*  >>>> This should only allow files of certain types,
655     >>>>  eg executable, non-directory */
656 int
657 openp (const char *path, int try_cwd_first, const char *string,
658        int mode, int prot,
659        char **filename_opened)
660 {
661   int fd;
662   char *filename;
663   const char *p;
664   const char *p1;
665   int len;
666   int alloclen;
667 
668   if (!path)
669     path = ".";
670 
671 #if defined(_WIN32) || defined(__CYGWIN__)
672   mode |= O_BINARY;
673 #endif
674 
675   if (try_cwd_first || IS_ABSOLUTE_PATH (string))
676     {
677       int i;
678 
679       if (is_regular_file (string))
680 	{
681 	  filename = alloca (strlen (string) + 1);
682 	  strcpy (filename, string);
683 	  fd = open (filename, mode, prot);
684 	  if (fd >= 0)
685 	    goto done;
686 	}
687       else
688 	{
689 	  filename = NULL;
690 	  fd = -1;
691 	}
692 
693       for (i = 0; string[i]; i++)
694 	if (IS_DIR_SEPARATOR (string[i]))
695 	  goto done;
696     }
697 
698   /* ./foo => foo */
699   while (string[0] == '.' && IS_DIR_SEPARATOR (string[1]))
700     string += 2;
701 
702   alloclen = strlen (path) + strlen (string) + 2;
703   filename = alloca (alloclen);
704   fd = -1;
705   for (p = path; p; p = p1 ? p1 + 1 : 0)
706     {
707       p1 = strchr (p, DIRNAME_SEPARATOR);
708       if (p1)
709 	len = p1 - p;
710       else
711 	len = strlen (p);
712 
713       if (len == 4 && p[0] == '$' && p[1] == 'c'
714 	  && p[2] == 'w' && p[3] == 'd')
715 	{
716 	  /* Name is $cwd -- insert current directory name instead.  */
717 	  int newlen;
718 
719 	  /* First, realloc the filename buffer if too short. */
720 	  len = strlen (current_directory);
721 	  newlen = len + strlen (string) + 2;
722 	  if (newlen > alloclen)
723 	    {
724 	      alloclen = newlen;
725 	      filename = alloca (alloclen);
726 	    }
727 	  strcpy (filename, current_directory);
728 	}
729       else
730 	{
731 	  /* Normal file name in path -- just use it.  */
732 	  strncpy (filename, p, len);
733 	  filename[len] = 0;
734 	}
735 
736       /* Remove trailing slashes */
737       while (len > 0 && IS_DIR_SEPARATOR (filename[len - 1]))
738 	filename[--len] = 0;
739 
740       strcat (filename + len, SLASH_STRING);
741       strcat (filename, string);
742 
743       if (is_regular_file (filename))
744       {
745         fd = open (filename, mode);
746         if (fd >= 0)
747           break;
748       }
749     }
750 
751 done:
752   if (filename_opened)
753     {
754       /* If a file was opened, canonicalize its filename. Use xfullpath
755          rather than gdb_realpath to avoid resolving the basename part
756          of filenames when the associated file is a symbolic link. This
757          fixes a potential inconsistency between the filenames known to
758          GDB and the filenames it prints in the annotations.  */
759       if (fd < 0)
760 	*filename_opened = NULL;
761       else if (IS_ABSOLUTE_PATH (filename))
762 	*filename_opened = xfullpath (filename);
763       else
764 	{
765 	  /* Beware the // my son, the Emacs barfs, the botch that catch... */
766 
767 	  char *f = concat (current_directory,
768            IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
769 				     ? "" : SLASH_STRING,
770 				     filename, NULL);
771 	  *filename_opened = xfullpath (f);
772 	  xfree (f);
773 	}
774     }
775 
776   return fd;
777 }
778 
779 
780 /* This is essentially a convenience, for clients that want the behaviour
781    of openp, using source_path, but that really don't want the file to be
782    opened but want instead just to know what the full pathname is (as
783    qualified against source_path).
784 
785    The current working directory is searched first.
786 
787    If the file was found, this function returns 1, and FULL_PATHNAME is
788    set to the fully-qualified pathname.
789 
790    Else, this functions returns 0, and FULL_PATHNAME is set to NULL.
791  */
792 int
793 source_full_path_of (char *filename, char **full_pathname)
794 {
795   int fd;
796 
797   fd = openp (source_path, 1, filename, O_RDONLY, 0, full_pathname);
798   if (fd < 0)
799     {
800       *full_pathname = NULL;
801       return 0;
802     }
803 
804   close (fd);
805   return 1;
806 }
807 
808 
809 /* Open a source file given a symtab S.  Returns a file descriptor or
810    negative number for error.  */
811 
812 int
813 open_source_file (struct symtab *s)
814 {
815   char *path = source_path;
816   const char *p;
817   int result;
818   char *fullname;
819 
820   /* Quick way out if we already know its full name */
821   if (s->fullname)
822     {
823       result = open (s->fullname, OPEN_MODE);
824       if (result >= 0)
825 	return result;
826       /* Didn't work -- free old one, try again. */
827       xmfree (s->objfile->md, s->fullname);
828       s->fullname = NULL;
829     }
830 
831   if (s->dirname != NULL)
832     {
833       /* Replace a path entry of  $cdir  with the compilation directory name */
834 #define	cdir_len	5
835       /* We cast strstr's result in case an ANSIhole has made it const,
836          which produces a "required warning" when assigned to a nonconst. */
837       p = (char *) strstr (source_path, "$cdir");
838       if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
839 	  && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
840 	{
841 	  int len;
842 
843 	  path = (char *)
844 	    alloca (strlen (source_path) + 1 + strlen (s->dirname) + 1);
845 	  len = p - source_path;
846 	  strncpy (path, source_path, len);	/* Before $cdir */
847 	  strcpy (path + len, s->dirname);	/* new stuff */
848 	  strcat (path + len, source_path + len + cdir_len);	/* After $cdir */
849 	}
850     }
851 
852   result = openp (path, 0, s->filename, OPEN_MODE, 0, &s->fullname);
853   if (result < 0)
854     {
855       /* Didn't work.  Try using just the basename. */
856       p = lbasename (s->filename);
857       if (p != s->filename)
858 	result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
859     }
860 
861   if (result >= 0)
862     {
863       fullname = s->fullname;
864       s->fullname = mstrsave (s->objfile->md, s->fullname);
865       xfree (fullname);
866     }
867   return result;
868 }
869 
870 /* Return the path to the source file associated with symtab.  Returns NULL
871    if no symtab.  */
872 
873 char *
874 symtab_to_filename (struct symtab *s)
875 {
876   int fd;
877 
878   if (!s)
879     return NULL;
880 
881   /* If we've seen the file before, just return fullname. */
882 
883   if (s->fullname)
884     return s->fullname;
885 
886   /* Try opening the file to setup fullname */
887 
888   fd = open_source_file (s);
889   if (fd < 0)
890     return s->filename;		/* File not found.  Just use short name */
891 
892   /* Found the file.  Cleanup and return the full name */
893 
894   close (fd);
895   return s->fullname;
896 }
897 
898 
899 /* Create and initialize the table S->line_charpos that records
900    the positions of the lines in the source file, which is assumed
901    to be open on descriptor DESC.
902    All set S->nlines to the number of such lines.  */
903 
904 void
905 find_source_lines (struct symtab *s, int desc)
906 {
907   struct stat st;
908   char *data, *p, *end;
909   int nlines = 0;
910   int lines_allocated = 1000;
911   int *line_charpos;
912   long mtime = 0;
913   int size;
914 
915   line_charpos = (int *) xmmalloc (s->objfile->md,
916 				   lines_allocated * sizeof (int));
917   if (fstat (desc, &st) < 0)
918     perror_with_name (s->filename);
919 
920   if (s && s->objfile && s->objfile->obfd)
921     mtime = bfd_get_mtime (s->objfile->obfd);
922   else if (exec_bfd)
923     mtime = bfd_get_mtime (exec_bfd);
924 
925   if (mtime && mtime < st.st_mtime)
926     {
927       warning ("Source file is more recent than executable.\n");
928     }
929 
930 #ifdef LSEEK_NOT_LINEAR
931   {
932     char c;
933 
934     /* Have to read it byte by byte to find out where the chars live */
935 
936     line_charpos[0] = lseek (desc, 0, SEEK_CUR);
937     nlines = 1;
938     while (myread (desc, &c, 1) > 0)
939       {
940 	if (c == '\n')
941 	  {
942 	    if (nlines == lines_allocated)
943 	      {
944 		lines_allocated *= 2;
945 		line_charpos =
946 		  (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
947 				     sizeof (int) * lines_allocated);
948 	      }
949 	    line_charpos[nlines++] = lseek (desc, 0, SEEK_CUR);
950 	  }
951       }
952   }
953 #else /* lseek linear.  */
954   {
955     struct cleanup *old_cleanups;
956 
957     /* st_size might be a large type, but we only support source files whose
958        size fits in an int.  */
959     size = (int) st.st_size;
960 
961     /* Use malloc, not alloca, because this may be pretty large, and we may
962        run into various kinds of limits on stack size.  */
963     data = (char *) xmalloc (size);
964     old_cleanups = make_cleanup (xfree, data);
965 
966     /* Reassign `size' to result of read for systems where \r\n -> \n.  */
967     size = myread (desc, data, size);
968     if (size < 0)
969       perror_with_name (s->filename);
970     end = data + size;
971     p = data;
972     line_charpos[0] = 0;
973     nlines = 1;
974     while (p != end)
975       {
976 	if (*p++ == '\n'
977 	/* A newline at the end does not start a new line.  */
978 	    && p != end)
979 	  {
980 	    if (nlines == lines_allocated)
981 	      {
982 		lines_allocated *= 2;
983 		line_charpos =
984 		  (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
985 				     sizeof (int) * lines_allocated);
986 	      }
987 	    line_charpos[nlines++] = p - data;
988 	  }
989       }
990     do_cleanups (old_cleanups);
991   }
992 #endif /* lseek linear.  */
993   s->nlines = nlines;
994   s->line_charpos =
995     (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
996 		       nlines * sizeof (int));
997 
998 }
999 
1000 /* Return the character position of a line LINE in symtab S.
1001    Return 0 if anything is invalid.  */
1002 
1003 #if 0				/* Currently unused */
1004 
1005 int
1006 source_line_charpos (struct symtab *s, int line)
1007 {
1008   if (!s)
1009     return 0;
1010   if (!s->line_charpos || line <= 0)
1011     return 0;
1012   if (line > s->nlines)
1013     line = s->nlines;
1014   return s->line_charpos[line - 1];
1015 }
1016 
1017 /* Return the line number of character position POS in symtab S.  */
1018 
1019 int
1020 source_charpos_line (struct symtab *s, int chr)
1021 {
1022   int line = 0;
1023   int *lnp;
1024 
1025   if (s == 0 || s->line_charpos == 0)
1026     return 0;
1027   lnp = s->line_charpos;
1028   /* Files are usually short, so sequential search is Ok */
1029   while (line < s->nlines && *lnp <= chr)
1030     {
1031       line++;
1032       lnp++;
1033     }
1034   if (line >= s->nlines)
1035     line = s->nlines;
1036   return line;
1037 }
1038 
1039 #endif /* 0 */
1040 
1041 
1042 /* Get full pathname and line number positions for a symtab.
1043    Return nonzero if line numbers may have changed.
1044    Set *FULLNAME to actual name of the file as found by `openp',
1045    or to 0 if the file is not found.  */
1046 
1047 static int
1048 get_filename_and_charpos (struct symtab *s, char **fullname)
1049 {
1050   int desc, linenums_changed = 0;
1051 
1052   desc = open_source_file (s);
1053   if (desc < 0)
1054     {
1055       if (fullname)
1056 	*fullname = NULL;
1057       return 0;
1058     }
1059   if (fullname)
1060     *fullname = s->fullname;
1061   if (s->line_charpos == 0)
1062     linenums_changed = 1;
1063   if (linenums_changed)
1064     find_source_lines (s, desc);
1065   close (desc);
1066   return linenums_changed;
1067 }
1068 
1069 /* Print text describing the full name of the source file S
1070    and the line number LINE and its corresponding character position.
1071    The text starts with two Ctrl-z so that the Emacs-GDB interface
1072    can easily find it.
1073 
1074    MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
1075 
1076    Return 1 if successful, 0 if could not find the file.  */
1077 
1078 int
1079 identify_source_line (struct symtab *s, int line, int mid_statement,
1080 		      CORE_ADDR pc)
1081 {
1082   if (s->line_charpos == 0)
1083     get_filename_and_charpos (s, (char **) NULL);
1084   if (s->fullname == 0)
1085     return 0;
1086   if (line > s->nlines)
1087     /* Don't index off the end of the line_charpos array.  */
1088     return 0;
1089   annotate_source (s->fullname, line, s->line_charpos[line - 1],
1090 		   mid_statement, pc);
1091 
1092   current_source_line = line;
1093   first_line_listed = line;
1094   last_line_listed = line;
1095   current_source_symtab = s;
1096   return 1;
1097 }
1098 
1099 
1100 /* Print source lines from the file of symtab S,
1101    starting with line number LINE and stopping before line number STOPLINE. */
1102 
1103 static void print_source_lines_base (struct symtab *s, int line, int stopline,
1104 				     int noerror);
1105 static void
1106 print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
1107 {
1108   int c;
1109   int desc;
1110   FILE *stream;
1111   int nlines = stopline - line;
1112 
1113   /* Regardless of whether we can open the file, set current_source_symtab. */
1114   current_source_symtab = s;
1115   current_source_line = line;
1116   first_line_listed = line;
1117 
1118   /* If printing of source lines is disabled, just print file and line number */
1119   if (ui_out_test_flags (uiout, ui_source_list))
1120     {
1121       /* Only prints "No such file or directory" once */
1122       if ((s != last_source_visited) || (!last_source_error))
1123 	{
1124 	  last_source_visited = s;
1125 	  desc = open_source_file (s);
1126 	}
1127       else
1128 	{
1129 	  desc = last_source_error;
1130 	  noerror = 1;
1131 	}
1132     }
1133   else
1134     {
1135       desc = -1;
1136       noerror = 1;
1137     }
1138 
1139   if (desc < 0)
1140     {
1141       last_source_error = desc;
1142 
1143       if (!noerror)
1144 	{
1145 	  char *name = alloca (strlen (s->filename) + 100);
1146 	  sprintf (name, "%d\t%s", line, s->filename);
1147 	  print_sys_errmsg (name, errno);
1148 	}
1149       else
1150 	ui_out_field_int (uiout, "line", line);
1151       ui_out_text (uiout, "\tin ");
1152       ui_out_field_string (uiout, "file", s->filename);
1153       ui_out_text (uiout, "\n");
1154 
1155       return;
1156     }
1157 
1158   last_source_error = 0;
1159 
1160   if (s->line_charpos == 0)
1161     find_source_lines (s, desc);
1162 
1163   if (line < 1 || line > s->nlines)
1164     {
1165       close (desc);
1166       error ("Line number %d out of range; %s has %d lines.",
1167 	     line, s->filename, s->nlines);
1168     }
1169 
1170   if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
1171     {
1172       close (desc);
1173       perror_with_name (s->filename);
1174     }
1175 
1176   stream = fdopen (desc, FDOPEN_MODE);
1177   clearerr (stream);
1178 
1179   while (nlines-- > 0)
1180     {
1181       char buf[20];
1182 
1183       c = fgetc (stream);
1184       if (c == EOF)
1185 	break;
1186       last_line_listed = current_source_line;
1187       sprintf (buf, "%d\t", current_source_line++);
1188       ui_out_text (uiout, buf);
1189       do
1190 	{
1191 	  if (c < 040 && c != '\t' && c != '\n' && c != '\r')
1192 	    {
1193 	      sprintf (buf, "^%c", c + 0100);
1194 	      ui_out_text (uiout, buf);
1195 	    }
1196 	  else if (c == 0177)
1197 	    ui_out_text (uiout, "^?");
1198 #ifdef CRLF_SOURCE_FILES
1199 	  else if (c == '\r')
1200 	    {
1201 	      /* Skip a \r character, but only before a \n.  */
1202 	      int c1 = fgetc (stream);
1203 
1204 	      if (c1 != '\n')
1205 		printf_filtered ("^%c", c + 0100);
1206 	      if (c1 != EOF)
1207 		ungetc (c1, stream);
1208 	    }
1209 #endif
1210 	  else
1211 	    {
1212 	      sprintf (buf, "%c", c);
1213 	      ui_out_text (uiout, buf);
1214 	    }
1215 	}
1216       while (c != '\n' && (c = fgetc (stream)) >= 0);
1217     }
1218 
1219   fclose (stream);
1220 }
1221 
1222 /* Show source lines from the file of symtab S, starting with line
1223    number LINE and stopping before line number STOPLINE.  If this is the
1224    not the command line version, then the source is shown in the source
1225    window otherwise it is simply printed */
1226 
1227 void
1228 print_source_lines (struct symtab *s, int line, int stopline, int noerror)
1229 {
1230   print_source_lines_base (s, line, stopline, noerror);
1231 }
1232 
1233 /* Print info on range of pc's in a specified line.  */
1234 
1235 static void
1236 line_info (char *arg, int from_tty)
1237 {
1238   struct symtabs_and_lines sals;
1239   struct symtab_and_line sal;
1240   CORE_ADDR start_pc, end_pc;
1241   int i;
1242 
1243   init_sal (&sal);		/* initialize to zeroes */
1244 
1245   if (arg == 0)
1246     {
1247       sal.symtab = current_source_symtab;
1248       sal.line = last_line_listed;
1249       sals.nelts = 1;
1250       sals.sals = (struct symtab_and_line *)
1251 	xmalloc (sizeof (struct symtab_and_line));
1252       sals.sals[0] = sal;
1253     }
1254   else
1255     {
1256       sals = decode_line_spec_1 (arg, 0);
1257 
1258       dont_repeat ();
1259     }
1260 
1261   /* C++  More than one line may have been specified, as when the user
1262      specifies an overloaded function name. Print info on them all. */
1263   for (i = 0; i < sals.nelts; i++)
1264     {
1265       sal = sals.sals[i];
1266 
1267       if (sal.symtab == 0)
1268 	{
1269 	  printf_filtered ("No line number information available");
1270 	  if (sal.pc != 0)
1271 	    {
1272 	      /* This is useful for "info line *0x7f34".  If we can't tell the
1273 	         user about a source line, at least let them have the symbolic
1274 	         address.  */
1275 	      printf_filtered (" for address ");
1276 	      wrap_here ("  ");
1277 	      print_address (sal.pc, gdb_stdout);
1278 	    }
1279 	  else
1280 	    printf_filtered (".");
1281 	  printf_filtered ("\n");
1282 	}
1283       else if (sal.line > 0
1284 	       && find_line_pc_range (sal, &start_pc, &end_pc))
1285 	{
1286 	  if (start_pc == end_pc)
1287 	    {
1288 	      printf_filtered ("Line %d of \"%s\"",
1289 			       sal.line, sal.symtab->filename);
1290 	      wrap_here ("  ");
1291 	      printf_filtered (" is at address ");
1292 	      print_address (start_pc, gdb_stdout);
1293 	      wrap_here ("  ");
1294 	      printf_filtered (" but contains no code.\n");
1295 	    }
1296 	  else
1297 	    {
1298 	      printf_filtered ("Line %d of \"%s\"",
1299 			       sal.line, sal.symtab->filename);
1300 	      wrap_here ("  ");
1301 	      printf_filtered (" starts at address ");
1302 	      print_address (start_pc, gdb_stdout);
1303 	      wrap_here ("  ");
1304 	      printf_filtered (" and ends at ");
1305 	      print_address (end_pc, gdb_stdout);
1306 	      printf_filtered (".\n");
1307 	    }
1308 
1309 	  /* x/i should display this line's code.  */
1310 	  set_next_address (start_pc);
1311 
1312 	  /* Repeating "info line" should do the following line.  */
1313 	  last_line_listed = sal.line + 1;
1314 
1315 	  /* If this is the only line, show the source code.  If it could
1316 	     not find the file, don't do anything special.  */
1317 	  if (annotation_level && sals.nelts == 1)
1318 	    identify_source_line (sal.symtab, sal.line, 0, start_pc);
1319 	}
1320       else
1321 	/* Is there any case in which we get here, and have an address
1322 	   which the user would want to see?  If we have debugging symbols
1323 	   and no line numbers?  */
1324 	printf_filtered ("Line number %d is out of range for \"%s\".\n",
1325 			 sal.line, sal.symtab->filename);
1326     }
1327   xfree (sals.sals);
1328 }
1329 
1330 /* Commands to search the source file for a regexp.  */
1331 
1332 static void
1333 forward_search_command (char *regex, int from_tty)
1334 {
1335   int c;
1336   int desc;
1337   FILE *stream;
1338   int line;
1339   char *msg;
1340 
1341   line = last_line_listed + 1;
1342 
1343   msg = (char *) re_comp (regex);
1344   if (msg)
1345     error ("%s", msg);
1346 
1347   if (current_source_symtab == 0)
1348     select_source_symtab (0);
1349 
1350   desc = open_source_file (current_source_symtab);
1351   if (desc < 0)
1352     perror_with_name (current_source_symtab->filename);
1353 
1354   if (current_source_symtab->line_charpos == 0)
1355     find_source_lines (current_source_symtab, desc);
1356 
1357   if (line < 1 || line > current_source_symtab->nlines)
1358     {
1359       close (desc);
1360       error ("Expression not found");
1361     }
1362 
1363   if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1364     {
1365       close (desc);
1366       perror_with_name (current_source_symtab->filename);
1367     }
1368 
1369   stream = fdopen (desc, FDOPEN_MODE);
1370   clearerr (stream);
1371   while (1)
1372     {
1373       static char *buf = NULL;
1374       char *p;
1375       int cursize, newsize;
1376 
1377       cursize = 256;
1378       buf = xmalloc (cursize);
1379       p = buf;
1380 
1381       c = getc (stream);
1382       if (c == EOF)
1383 	break;
1384       do
1385 	{
1386 	  *p++ = c;
1387 	  if (p - buf == cursize)
1388 	    {
1389 	      newsize = cursize + cursize / 2;
1390 	      buf = xrealloc (buf, newsize);
1391 	      p = buf + cursize;
1392 	      cursize = newsize;
1393 	    }
1394 	}
1395       while (c != '\n' && (c = getc (stream)) >= 0);
1396 
1397 #ifdef CRLF_SOURCE_FILES
1398       /* Remove the \r, if any, at the end of the line, otherwise
1399          regular expressions that end with $ or \n won't work.  */
1400       if (p - buf > 1 && p[-2] == '\r')
1401 	{
1402 	  p--;
1403 	  p[-1] = '\n';
1404 	}
1405 #endif
1406 
1407       /* we now have a source line in buf, null terminate and match */
1408       *p = 0;
1409       if (re_exec (buf) > 0)
1410 	{
1411 	  /* Match! */
1412 	  fclose (stream);
1413 	  print_source_lines (current_source_symtab, line, line + 1, 0);
1414 	  set_internalvar (lookup_internalvar ("_"),
1415 			   value_from_longest (builtin_type_int,
1416 					       (LONGEST) line));
1417 	  current_source_line = max (line - lines_to_list / 2, 1);
1418 	  return;
1419 	}
1420       line++;
1421     }
1422 
1423   printf_filtered ("Expression not found\n");
1424   fclose (stream);
1425 }
1426 
1427 static void
1428 reverse_search_command (char *regex, int from_tty)
1429 {
1430   int c;
1431   int desc;
1432   FILE *stream;
1433   int line;
1434   char *msg;
1435 
1436   line = last_line_listed - 1;
1437 
1438   msg = (char *) re_comp (regex);
1439   if (msg)
1440     error ("%s", msg);
1441 
1442   if (current_source_symtab == 0)
1443     select_source_symtab (0);
1444 
1445   desc = open_source_file (current_source_symtab);
1446   if (desc < 0)
1447     perror_with_name (current_source_symtab->filename);
1448 
1449   if (current_source_symtab->line_charpos == 0)
1450     find_source_lines (current_source_symtab, desc);
1451 
1452   if (line < 1 || line > current_source_symtab->nlines)
1453     {
1454       close (desc);
1455       error ("Expression not found");
1456     }
1457 
1458   if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1459     {
1460       close (desc);
1461       perror_with_name (current_source_symtab->filename);
1462     }
1463 
1464   stream = fdopen (desc, FDOPEN_MODE);
1465   clearerr (stream);
1466   while (line > 1)
1467     {
1468 /* FIXME!!!  We walk right off the end of buf if we get a long line!!! */
1469       char buf[4096];		/* Should be reasonable??? */
1470       char *p = buf;
1471 
1472       c = getc (stream);
1473       if (c == EOF)
1474 	break;
1475       do
1476 	{
1477 	  *p++ = c;
1478 	}
1479       while (c != '\n' && (c = getc (stream)) >= 0);
1480 
1481 #ifdef CRLF_SOURCE_FILES
1482       /* Remove the \r, if any, at the end of the line, otherwise
1483          regular expressions that end with $ or \n won't work.  */
1484       if (p - buf > 1 && p[-2] == '\r')
1485 	{
1486 	  p--;
1487 	  p[-1] = '\n';
1488 	}
1489 #endif
1490 
1491       /* We now have a source line in buf; null terminate and match.  */
1492       *p = 0;
1493       if (re_exec (buf) > 0)
1494 	{
1495 	  /* Match! */
1496 	  fclose (stream);
1497 	  print_source_lines (current_source_symtab, line, line + 1, 0);
1498 	  set_internalvar (lookup_internalvar ("_"),
1499 			   value_from_longest (builtin_type_int,
1500 					       (LONGEST) line));
1501 	  current_source_line = max (line - lines_to_list / 2, 1);
1502 	  return;
1503 	}
1504       line--;
1505       if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1506 	{
1507 	  fclose (stream);
1508 	  perror_with_name (current_source_symtab->filename);
1509 	}
1510     }
1511 
1512   printf_filtered ("Expression not found\n");
1513   fclose (stream);
1514   return;
1515 }
1516 
1517 void
1518 _initialize_source (void)
1519 {
1520   struct cmd_list_element *c;
1521   current_source_symtab = 0;
1522   init_source_path ();
1523 
1524   /* The intention is to use POSIX Basic Regular Expressions.
1525      Always use the GNU regex routine for consistency across all hosts.
1526      Our current GNU regex.c does not have all the POSIX features, so this is
1527      just an approximation.  */
1528   re_set_syntax (RE_SYNTAX_GREP);
1529 
1530   c = add_cmd ("directory", class_files, directory_command,
1531 	       "Add directory DIR to beginning of search path for source files.\n\
1532 Forget cached info on source file locations and line positions.\n\
1533 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1534 directory in which the source file was compiled into object code.\n\
1535 With no argument, reset the search path to $cdir:$cwd, the default.",
1536 	       &cmdlist);
1537 
1538   if (dbx_commands)
1539     add_com_alias ("use", "directory", class_files, 0);
1540 
1541   set_cmd_completer (c, filename_completer);
1542 
1543   add_cmd ("directories", no_class, show_directories,
1544 	   "Current search path for finding source files.\n\
1545 $cwd in the path means the current working directory.\n\
1546 $cdir in the path means the compilation directory of the source file.",
1547 	   &showlist);
1548 
1549   if (xdb_commands)
1550     {
1551       add_com_alias ("D", "directory", class_files, 0);
1552       add_cmd ("ld", no_class, show_directories,
1553 	       "Current search path for finding source files.\n\
1554 $cwd in the path means the current working directory.\n\
1555 $cdir in the path means the compilation directory of the source file.",
1556 	       &cmdlist);
1557     }
1558 
1559   add_info ("source", source_info,
1560 	    "Information about the current source file.");
1561 
1562   add_info ("line", line_info,
1563 	    concat ("Core addresses of the code for a source line.\n\
1564 Line can be specified as\n\
1565   LINENUM, to list around that line in current file,\n\
1566   FILE:LINENUM, to list around that line in that file,\n\
1567   FUNCTION, to list around beginning of that function,\n\
1568   FILE:FUNCTION, to distinguish among like-named static functions.\n\
1569 ", "\
1570 Default is to describe the last source line that was listed.\n\n\
1571 This sets the default address for \"x\" to the line's first instruction\n\
1572 so that \"x/i\" suffices to start examining the machine code.\n\
1573 The address is also stored as the value of \"$_\".", NULL));
1574 
1575   add_com ("forward-search", class_files, forward_search_command,
1576 	   "Search for regular expression (see regex(3)) from last line listed.\n\
1577 The matching line number is also stored as the value of \"$_\".");
1578   add_com_alias ("search", "forward-search", class_files, 0);
1579 
1580   add_com ("reverse-search", class_files, reverse_search_command,
1581 	   "Search backward for regular expression (see regex(3)) from last line listed.\n\
1582 The matching line number is also stored as the value of \"$_\".");
1583 
1584   if (xdb_commands)
1585     {
1586       add_com_alias ("/", "forward-search", class_files, 0);
1587       add_com_alias ("?", "reverse-search", class_files, 0);
1588     }
1589 
1590   add_show_from_set
1591     (add_set_cmd ("listsize", class_support, var_uinteger,
1592 		  (char *) &lines_to_list,
1593 		  "Set number of source lines gdb will list by default.",
1594 		  &setlist),
1595      &showlist);
1596 }
1597