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
71void _initialize_source (void);
72
73/* Prototypes for local functions. */
74
75static int get_filename_and_charpos (struct symtab *, char **);
76
77static void reverse_search_command (char *, int);
78
79static void forward_search_command (char *, int);
80
81static void line_info (char *, int);
82
83static void source_info (char *, int);
84
85static 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
90char *source_path;
91
92/* Symtab of default file for listing lines of.  */
93
94static struct symtab *current_source_symtab;
95
96/* Default next line to list.  */
97
98static 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
106int 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
111static int last_line_listed;
112
113/* First line number listed by last listing command.  */
114
115static 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
120static struct symtab *last_source_visited = NULL;
121static 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
127int
128get_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
138int
139get_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
147struct symtab_and_line
148get_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
168void
169set_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
186struct symtab_and_line
187set_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
204void
205clear_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
219void
220select_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
303static void
304show_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
315void
316forget_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
349void
350init_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
359void
360init_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
367void
368directory_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
392void
393mod_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
404void
405add_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
592static void
593source_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 */
619static int
620is_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 */
656int
657openp (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
751done:
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 */
792int
793source_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
812int
813open_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
873char *
874symtab_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
904void
905find_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
1005int
1006source_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
1019int
1020source_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
1047static int
1048get_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
1078int
1079identify_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
1103static void print_source_lines_base (struct symtab *s, int line, int stopline,
1104				     int noerror);
1105static void
1106print_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
1227void
1228print_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
1235static void
1236line_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
1332static void
1333forward_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
1427static void
1428reverse_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
1517void
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\
1532Forget cached info on source file locations and line positions.\n\
1533DIR can also be $cwd for the current working directory, or $cdir for the\n\
1534directory in which the source file was compiled into object code.\n\
1535With 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\
1564Line 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", "\
1570Default is to describe the last source line that was listed.\n\n\
1571This sets the default address for \"x\" to the line's first instruction\n\
1572so that \"x/i\" suffices to start examining the machine code.\n\
1573The 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\
1577The 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\
1582The 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