* config/tc-xtensa.c (xtensa_mark_literal_pool_location): Remove
[deliverable/binutils-gdb.git] / gdb / source.c
index 4a64c5529dd4681633b1d2e07658e50f5100d404..749617bb5781491926ab77fd5f8d54bf0efb8bbd 100644 (file)
@@ -1,5 +1,7 @@
 /* List lines of source files for GDB, the GNU debugger.
-   Copyright 1986-1989, 1991-1999, 2001 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "annotate.h"
 #include "gdbtypes.h"
 #include "linespec.h"
+#include "filenames.h"         /* for DOSish file names */
 #include "completer.h"
-#ifdef UI_OUT
 #include "ui-out.h"
-#endif
+#include <readline/readline.h>
 
 #ifdef CRLF_SOURCE_FILES
 
@@ -78,8 +80,6 @@ static void forward_search_command (char *, int);
 
 static void line_info (char *, int);
 
-static void list_command (char *, int);
-
 static void ambiguous_line_spec (struct symtabs_and_lines *);
 
 static void source_info (char *, int);
@@ -93,11 +93,11 @@ char *source_path;
 
 /* Symtab of default file for listing lines of.  */
 
-struct symtab *current_source_symtab;
+static struct symtab *current_source_symtab;
 
 /* Default next line to list.  */
 
-int current_source_line;
+static int current_source_line;
 
 /* Default number of lines to print with commands like "list".
    This is based on guessing how many long (i.e. more than chars_per_line
@@ -122,6 +122,93 @@ static int first_line_listed;
 static struct symtab *last_source_visited = NULL;
 static int last_source_error = 0;
 \f
+/* Return the first line listed by print_source_lines.
+   Used by command interpreters to request listing from
+   a previous point. */
+
+int
+get_first_line_listed (void)
+{
+  return first_line_listed;
+}
+
+/* Return the default number of lines to print with commands like the
+   cli "list".  The caller of print_source_lines must use this to
+   calculate the end line and use it in the call to print_source_lines
+   as it does not automatically use this value. */
+
+int
+get_lines_to_list (void)
+{
+  return lines_to_list;
+}
+
+/* Return the current source file for listing and next line to list.
+   NOTE: The returned sal pc and end fields are not valid. */
+   
+struct symtab_and_line
+get_current_source_symtab_and_line (void)
+{
+  struct symtab_and_line cursal;
+
+  cursal.symtab = current_source_symtab;
+  cursal.line = current_source_line;
+  cursal.pc = 0;
+  cursal.end = 0;
+  
+  return cursal;
+}
+
+/* If the current source file for listing is not set, try and get a default.
+   Usually called before get_current_source_symtab_and_line() is called.
+   It may err out if a default cannot be determined.
+   We must be cautious about where it is called, as it can recurse as the
+   process of determining a new default may call the caller!
+   Use get_current_source_symtab_and_line only to get whatever
+   we have without erroring out or trying to get a default. */
+   
+void
+set_default_source_symtab_and_line (void)
+{
+  struct symtab_and_line cursal;
+
+  if (!have_full_symbols () && !have_partial_symbols ())
+    error ("No symbol table is loaded.  Use the \"file\" command.");
+
+  /* Pull in a current source symtab if necessary */
+  if (current_source_symtab == 0)
+    select_source_symtab (0);
+}
+
+/* Return the current default file for listing and next line to list
+   (the returned sal pc and end fields are not valid.)
+   and set the current default to whatever is in SAL.
+   NOTE: The returned sal pc and end fields are not valid. */
+   
+struct symtab_and_line
+set_current_source_symtab_and_line (const struct symtab_and_line *sal)
+{
+  struct symtab_and_line cursal;
+  
+  cursal.symtab = current_source_symtab;
+  cursal.line = current_source_line;
+
+  current_source_symtab = sal->symtab;
+  current_source_line = sal->line;
+  cursal.pc = 0;
+  cursal.end = 0;
+  
+  return cursal;
+}
+
+/* Reset any information stored about a default file and line to print. */
+
+void
+clear_current_source_symtab_and_line (void)
+{
+  current_source_symtab = 0;
+  current_source_line = 0;
+}
 
 /* Set the source file default for the "list" command to be S.
 
@@ -152,9 +239,9 @@ select_source_symtab (register struct symtab *s)
 
   /* Make the default place to list be the function `main'
      if one exists.  */
-  if (lookup_symbol ("main", 0, VAR_NAMESPACE, 0, NULL))
+  if (lookup_symbol (main_name (), 0, VAR_DOMAIN, 0, NULL))
     {
-      sals = decode_line_spec ("main", 1);
+      sals = decode_line_spec (main_name (), 1);
       sal = sals.sals[0];
       xfree (sals.sals);
       current_source_symtab = sal.symtab;
@@ -232,6 +319,7 @@ forget_cached_source_info (void)
 {
   register struct symtab *s;
   register struct objfile *objfile;
+  struct partial_symtab *pst;
 
   for (objfile = object_files; objfile != NULL; objfile = objfile->next)
     {
@@ -239,15 +327,24 @@ forget_cached_source_info (void)
        {
          if (s->line_charpos != NULL)
            {
-             mfree (objfile->md, s->line_charpos);
+             xmfree (objfile->md, s->line_charpos);
              s->line_charpos = NULL;
            }
          if (s->fullname != NULL)
            {
-             mfree (objfile->md, s->fullname);
+             xmfree (objfile->md, s->fullname);
              s->fullname = NULL;
            }
        }
+
+      ALL_OBJFILE_PSYMTABS (objfile, pst)
+      {
+       if (pst->fullname != NULL)
+         {
+           xfree (pst->fullname);
+           pst->fullname = NULL;
+         }
+      }
     }
 }
 
@@ -261,6 +358,12 @@ init_source_path (void)
   forget_cached_source_info ();
 }
 
+void
+init_last_source_visited (void)
+{
+  last_source_visited = NULL;
+}
+
 /* Add zero or more directories to the front of the source path.  */
 
 void
@@ -290,6 +393,18 @@ directory_command (char *dirname, int from_tty)
 
 void
 mod_path (char *dirname, char **which_path)
+{
+  add_path (dirname, which_path, 1);
+}
+
+/* Workhorse of mod_path.  Takes an extra argument to determine
+   if dirname should be parsed for separators that indicate multiple
+   directories.  This allows for interfaces that pre-parse the dirname
+   and allow specification of traditional separator characters such
+   as space or tab. */
+
+void
+add_path (char *dirname, char **which_path, int parse_separators)
 {
   char *old = *which_path;
   int prefix = 0;
@@ -307,9 +422,16 @@ mod_path (char *dirname, char **which_path)
       struct stat st;
 
       {
-       char *separator = strchr (name, DIRNAME_SEPARATOR);
-       char *space = strchr (name, ' ');
-       char *tab = strchr (name, '\t');
+       char *separator = NULL;
+       char *space = NULL;
+       char *tab = NULL;
+
+       if (parse_separators)
+         {
+           separator = strchr (name, DIRNAME_SEPARATOR);
+           space = strchr (name, ' ');
+           tab = strchr (name, '\t');
+         }
 
        if (separator == 0 && space == 0 && tab == 0)
          p = dirname = name + strlen (name);
@@ -330,12 +452,12 @@ mod_path (char *dirname, char **which_path)
          }
       }
 
-      if (!(SLASH_P (*name) && p <= name + 1)  /* "/" */
-#if defined(_WIN32) || defined(__MSDOS__)
+      if (!(IS_DIR_SEPARATOR (*name) && p <= name + 1)  /* "/" */
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
       /* On MS-DOS and MS-Windows, h:\ is different from h: */
-         && !(!SLASH_P (*name) && ROOTED_P (name) && p <= name + 3)    /* d:/ */
+         && !(p == name + 3 && name[1] == ':')          /* "d:/" */
 #endif
-         && SLASH_P (p[-1]))
+         && IS_DIR_SEPARATOR (p[-1]))
        /* Sigh. "foo/" => "foo" */
        --p;
       *p = '\0';
@@ -348,7 +470,7 @@ mod_path (char *dirname, char **which_path)
              name = current_directory;
              goto append;
            }
-         else if (p > name + 1 && SLASH_P (p[-2]))
+         else if (p > name + 1 && IS_DIR_SEPARATOR (p[-2]))
            {
              if (p - name == 2)
                {
@@ -370,11 +492,11 @@ mod_path (char *dirname, char **which_path)
 
       if (name[0] == '~')
        name = tilde_expand (name);
-#if defined(_WIN32) || defined(__MSDOS__)
-      else if (ROOTED_P (name) && p == name + 2)       /* "d:" => "d:." */
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+      else if (IS_ABSOLUTE_PATH (name) && p == name + 2) /* "d:" => "d:." */
        name = concat (name, ".", NULL);
 #endif
-      else if (!ROOTED_P (name) && name[0] != '$')
+      else if (!IS_ABSOLUTE_PATH (name) && name[0] != '$')
        name = concat (current_directory, SLASH_STRING, name, NULL);
       else
        name = savestring (name, p - name);
@@ -440,7 +562,8 @@ mod_path (char *dirname, char **which_path)
            tinybuf[0] = DIRNAME_SEPARATOR;
            tinybuf[1] = '\0';
 
-           /* If we have already tacked on a name(s) in this command,                     be sure they stay on the front as we tack on some more.  */
+           /* If we have already tacked on a name(s) in this command, be sure they stay 
+              on the front as we tack on some more.  */
            if (prefix)
              {
                char *temp, c;
@@ -489,9 +612,28 @@ source_info (char *ignore, int from_tty)
 
   printf_filtered ("Source language is %s.\n", language_str (s->language));
   printf_filtered ("Compiled with %s debugging format.\n", s->debugformat);
+  printf_filtered ("%s preprocessor macro info.\n",
+                   s->macro_table ? "Includes" : "Does not include");
 }
 \f
 
+/* Return True if the file NAME exists and is a regular file */
+static int
+is_regular_file (const char *name)
+{
+  struct stat st;
+  const int status = stat (name, &st);
+
+  /* Stat should never fail except when the file does not exist.
+     If stat fails, analyze the source of error and return True
+     unless the file does not exist, to avoid returning false results
+     on obscure systems where stat does not work as expected.
+   */
+  if (status != 0)
+    return (errno != ENOENT);
+
+  return S_ISREG (st.st_mode);
+}
 
 /* Open a file named STRING, searching path PATH (dir names sep by some char)
    using mode MODE and protection bits PROT in the calls to open.
@@ -503,7 +645,7 @@ source_info (char *ignore, int from_tty)
    get that particular version of foo or an error message).
 
    If FILENAME_OPENED is non-null, set it to a newly allocated string naming
-   the actual file opened (this string will always start with a "/".  We
+   the actual file opened (this string will always start with a "/").  We
    have to take special pains to avoid doubling the "/" between the directory
    and the file, sigh!  Emacs gets confuzzed by this when we print the
    source file name!!! 
@@ -512,46 +654,59 @@ source_info (char *ignore, int from_tty)
    Otherwise, return -1, with errno set for the last name we tried to open.  */
 
 /*  >>>> This should only allow files of certain types,
-   >>>>  eg executable, non-directory */
+    >>>>  eg executable, non-directory */
 int
-openp (char *path, int try_cwd_first, char *string, int mode, int prot,
+openp (const char *path, int try_cwd_first, const char *string,
+       int mode, int prot,
        char **filename_opened)
 {
   register int fd;
   register char *filename;
-  register char *p, *p1;
+  const char *p;
+  const char *p1;
   register int len;
   int alloclen;
 
   if (!path)
     path = ".";
 
-#ifdef _WIN32
+#if defined(_WIN32) || defined(__CYGWIN__)
   mode |= O_BINARY;
 #endif
 
-  if (try_cwd_first || ROOTED_P (string))
+  if (try_cwd_first || IS_ABSOLUTE_PATH (string))
     {
       int i;
-      filename = string;
-      fd = open (filename, mode, prot);
-      if (fd >= 0)
-       goto done;
+
+      if (is_regular_file (string))
+       {
+         filename = alloca (strlen (string) + 1);
+         strcpy (filename, string);
+         fd = open (filename, mode, prot);
+         if (fd >= 0)
+           goto done;
+       }
+      else
+       {
+         filename = NULL;
+         fd = -1;
+       }
+
       for (i = 0; string[i]; i++)
-       if (SLASH_P (string[i]))
+       if (IS_DIR_SEPARATOR (string[i]))
          goto done;
     }
 
   /* ./foo => foo */
-  while (string[0] == '.' && SLASH_P (string[1]))
+  while (string[0] == '.' && IS_DIR_SEPARATOR (string[1]))
     string += 2;
 
   alloclen = strlen (path) + strlen (string) + 2;
-  filename = (char *) alloca (alloclen);
+  filename = alloca (alloclen);
   fd = -1;
   for (p = path; p; p = p1 ? p1 + 1 : 0)
     {
-      p1 = (char *) strchr (p, DIRNAME_SEPARATOR);
+      p1 = strchr (p, DIRNAME_SEPARATOR);
       if (p1)
        len = p1 - p;
       else
@@ -569,7 +724,7 @@ openp (char *path, int try_cwd_first, char *string, int mode, int prot,
          if (newlen > alloclen)
            {
              alloclen = newlen;
-             filename = (char *) alloca (alloclen);
+             filename = alloca (alloclen);
            }
          strcpy (filename, current_directory);
        }
@@ -581,50 +736,44 @@ openp (char *path, int try_cwd_first, char *string, int mode, int prot,
        }
 
       /* Remove trailing slashes */
-      while (len > 0 && SLASH_P (filename[len - 1]))
+      while (len > 0 && IS_DIR_SEPARATOR (filename[len - 1]))
        filename[--len] = 0;
 
       strcat (filename + len, SLASH_STRING);
       strcat (filename, string);
 
-      fd = open (filename, mode);
-      if (fd >= 0)
-       break;
+      if (is_regular_file (filename))
+      {
+        fd = open (filename, mode);
+        if (fd >= 0)
+          break;
+      }
     }
 
 done:
   if (filename_opened)
     {
+      /* If a file was opened, canonicalize its filename. Use xfullpath
+         rather than gdb_realpath to avoid resolving the basename part
+         of filenames when the associated file is a symbolic link. This
+         fixes a potential inconsistency between the filenames known to
+         GDB and the filenames it prints in the annotations.  */
       if (fd < 0)
-       *filename_opened = (char *) 0;
-      else if (ROOTED_P (filename))
-       *filename_opened = savestring (filename, strlen (filename));
+       *filename_opened = NULL;
+      else if (IS_ABSOLUTE_PATH (filename))
+       *filename_opened = xfullpath (filename);
       else
        {
          /* Beware the // my son, the Emacs barfs, the botch that catch... */
 
-         *filename_opened = concat (current_directory,
-                SLASH_P (current_directory[strlen (current_directory) - 1])
+         char *f = concat (current_directory,
+           IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
                                     ? "" : SLASH_STRING,
                                     filename, NULL);
+         *filename_opened = xfullpath (f);
+         xfree (f);
        }
     }
-#ifdef MPW
-  /* This is a debugging hack that can go away when all combinations
-     of Mac and Unix names are handled reasonably.  */
-  {
-    extern int debug_openp;
-
-    if (debug_openp)
-      {
-       printf ("openp on %s, path %s mode %d prot %d\n  returned %d",
-               string, path, mode, prot, fd);
-       if (*filename_opened)
-         printf (" (filename is %s)", *filename_opened);
-       printf ("\n");
-      }
-  }
-#endif /* MPW */
 
   return fd;
 }
@@ -666,7 +815,7 @@ int
 open_source_file (struct symtab *s)
 {
   char *path = source_path;
-  char *p;
+  const char *p;
   int result;
   char *fullname;
 
@@ -677,7 +826,7 @@ open_source_file (struct symtab *s)
       if (result >= 0)
        return result;
       /* Didn't work -- free old one, try again. */
-      mfree (s->objfile->md, s->fullname);
+      xmfree (s->objfile->md, s->fullname);
       s->fullname = NULL;
     }
 
@@ -706,26 +855,10 @@ open_source_file (struct symtab *s)
   if (result < 0)
     {
       /* Didn't work.  Try using just the basename. */
-      p = basename (s->filename);
-      if (p != s->filename)
-       result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
-    }
-#ifdef MPW
-  if (result < 0)
-    {
-      /* Didn't work.  Try using just the MPW basename. */
-      p = (char *) mpw_basename (s->filename);
+      p = lbasename (s->filename);
       if (p != s->filename)
        result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
     }
-  if (result < 0)
-    {
-      /* Didn't work.  Try using the mixed Unix/MPW basename. */
-      p = (char *) mpw_mixed_basename (s->filename);
-      if (p != s->filename)
-       result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
-    }
-#endif /* MPW */
 
   if (result >= 0)
     {
@@ -793,8 +926,6 @@ find_source_lines (struct symtab *s, int desc)
 
   if (mtime && mtime < st.st_mtime)
     {
-      if (tui_version)
-       printf_filtered ("\n");
       warning ("Source file is more recent than executable.\n");
     }
 
@@ -986,11 +1117,9 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
   current_source_line = line;
   first_line_listed = line;
 
-#ifdef UI_OUT
   /* If printing of source lines is disabled, just print file and line number */
   if (ui_out_test_flags (uiout, ui_source_list))
     {
-#endif
       /* Only prints "No such file or directory" once */
       if ((s != last_source_visited) || (!last_source_error))
        {
@@ -1002,14 +1131,12 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
          desc = last_source_error;
          noerror = 1;
        }
-#ifdef UI_OUT
     }
   else
     {
       desc = -1;
       noerror = 1;
     }
-#endif
 
   if (desc < 0)
     {
@@ -1022,14 +1149,10 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
          print_sys_errmsg (name, errno);
        }
       else
-#ifdef UI_OUT
        ui_out_field_int (uiout, "line", line);
       ui_out_text (uiout, "\tin ");
       ui_out_field_string (uiout, "file", s->filename);
       ui_out_text (uiout, "\n");
-#else
-       printf_filtered ("%d\tin %s\n", line, s->filename);
-#endif
 
       return;
     }
@@ -1057,7 +1180,6 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
 
   while (nlines-- > 0)
     {
-#ifdef UI_OUT
       char buf[20];
 
       c = fgetc (stream);
@@ -1094,29 +1216,6 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
            }
        }
       while (c != '\n' && (c = fgetc (stream)) >= 0);
-#else
-      c = fgetc (stream);
-      if (c == EOF)
-       break;
-      last_line_listed = current_source_line;
-      printf_filtered ("%d\t", current_source_line++);
-      do
-       {
-         if (c < 040 && c != '\t' && c != '\n' && c != '\r')
-           printf_filtered ("^%c", c + 0100);
-         else if (c == 0177)
-           printf_filtered ("^?");
-#ifdef CRLF_SOURCE_FILES
-         else if (c == '\r')
-           {
-             /* Just skip \r characters.  */
-           }
-#endif
-         else
-           printf_filtered ("%c", c);
-       }
-      while (c != '\n' && (c = fgetc (stream)) >= 0);
-#endif
     }
 
   fclose (stream);
@@ -1130,39 +1229,14 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
 void
 print_source_lines (struct symtab *s, int line, int stopline, int noerror)
 {
-#if defined(TUI)
-  if (!tui_version ||
-      m_winPtrIsNull (srcWin) || !srcWin->generic.isVisible)
-    print_source_lines_base (s, line, stopline, noerror);
-  else
-    {
-      TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
-extern void tui_vAddWinToLayout (va_list);
-extern void tui_vUpdateSourceWindowsWithLine (va_list);
-
-      /* Regardless of whether we can open the file,
-         set current_source_symtab. */
-      current_source_symtab = s;
-      current_source_line = line;
-      first_line_listed = line;
-
-      /* make sure that the source window is displayed */
-      tuiDo ((TuiOpaqueFuncPtr) tui_vAddWinToLayout, SRC_WIN);
-
-      tuiDo ((TuiOpaqueFuncPtr) tui_vUpdateSourceWindowsWithLine, s, line);
-      tuiDo ((TuiOpaqueFuncPtr) tui_vUpdateLocatorFilename, s->filename);
-    }
-#else
   print_source_lines_base (s, line, stopline, noerror);
-#endif
 }
 \f
-
-
 /* Print a list of files and line numbers which a user may choose from
    in order to list a function which was specified ambiguously (as with
-   `list classname::overloadedfuncname', for example).  The vector in
-   SALS provides the filenames and line numbers.  */
+   `list classname::overloadedfuncname', or 'list objectiveCSelector:).
+   The vector in SALS provides the filenames and line numbers.
+   NOTE: some of the SALS may have no filename or line information! */
 
 static void
 ambiguous_line_spec (struct symtabs_and_lines *sals)
@@ -1173,182 +1247,6 @@ ambiguous_line_spec (struct symtabs_and_lines *sals)
     printf_filtered ("file: \"%s\", line number: %d\n",
                     sals->sals[i].symtab->filename, sals->sals[i].line);
 }
-
-static void
-list_command (char *arg, int from_tty)
-{
-  struct symtabs_and_lines sals, sals_end;
-  struct symtab_and_line sal, sal_end;
-  struct symbol *sym;
-  char *arg1;
-  int no_end = 1;
-  int dummy_end = 0;
-  int dummy_beg = 0;
-  int linenum_beg = 0;
-  char *p;
-
-  if (!have_full_symbols () && !have_partial_symbols ())
-    error ("No symbol table is loaded.  Use the \"file\" command.");
-
-  /* Pull in a current source symtab if necessary */
-  if (current_source_symtab == 0 &&
-      (arg == 0 || arg[0] == '+' || arg[0] == '-'))
-    select_source_symtab (0);
-
-  /* "l" or "l +" lists next ten lines.  */
-
-  if (arg == 0 || STREQ (arg, "+"))
-    {
-      if (current_source_symtab == 0)
-       error ("No default source file yet.  Do \"help list\".");
-      print_source_lines (current_source_symtab, current_source_line,
-                         current_source_line + lines_to_list, 0);
-      return;
-    }
-
-  /* "l -" lists previous ten lines, the ones before the ten just listed.  */
-  if (STREQ (arg, "-"))
-    {
-      if (current_source_symtab == 0)
-       error ("No default source file yet.  Do \"help list\".");
-      print_source_lines (current_source_symtab,
-                         max (first_line_listed - lines_to_list, 1),
-                         first_line_listed, 0);
-      return;
-    }
-
-  /* Now if there is only one argument, decode it in SAL
-     and set NO_END.
-     If there are two arguments, decode them in SAL and SAL_END
-     and clear NO_END; however, if one of the arguments is blank,
-     set DUMMY_BEG or DUMMY_END to record that fact.  */
-
-  arg1 = arg;
-  if (*arg1 == ',')
-    dummy_beg = 1;
-  else
-    {
-      sals = decode_line_1 (&arg1, 0, 0, 0, 0);
-
-      if (!sals.nelts)
-       return;                 /*  C++  */
-      if (sals.nelts > 1)
-       {
-         ambiguous_line_spec (&sals);
-         xfree (sals.sals);
-         return;
-       }
-
-      sal = sals.sals[0];
-      xfree (sals.sals);
-    }
-
-  /* Record whether the BEG arg is all digits.  */
-
-  for (p = arg; p != arg1 && *p >= '0' && *p <= '9'; p++);
-  linenum_beg = (p == arg1);
-
-  while (*arg1 == ' ' || *arg1 == '\t')
-    arg1++;
-  if (*arg1 == ',')
-    {
-      no_end = 0;
-      arg1++;
-      while (*arg1 == ' ' || *arg1 == '\t')
-       arg1++;
-      if (*arg1 == 0)
-       dummy_end = 1;
-      else
-       {
-         if (dummy_beg)
-           sals_end = decode_line_1 (&arg1, 0, 0, 0, 0);
-         else
-           sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0);
-         if (sals_end.nelts == 0)
-           return;
-         if (sals_end.nelts > 1)
-           {
-             ambiguous_line_spec (&sals_end);
-             xfree (sals_end.sals);
-             return;
-           }
-         sal_end = sals_end.sals[0];
-         xfree (sals_end.sals);
-       }
-    }
-
-  if (*arg1)
-    error ("Junk at end of line specification.");
-
-  if (!no_end && !dummy_beg && !dummy_end
-      && sal.symtab != sal_end.symtab)
-    error ("Specified start and end are in different files.");
-  if (dummy_beg && dummy_end)
-    error ("Two empty args do not say what lines to list.");
-
-  /* if line was specified by address,
-     first print exactly which line, and which file.
-     In this case, sal.symtab == 0 means address is outside
-     of all known source files, not that user failed to give a filename.  */
-  if (*arg == '*')
-    {
-      if (sal.symtab == 0)
-       /* FIXME-32x64--assumes sal.pc fits in long.  */
-       error ("No source file for address %s.",
-              local_hex_string ((unsigned long) sal.pc));
-      sym = find_pc_function (sal.pc);
-      if (sym)
-       {
-         print_address_numeric (sal.pc, 1, gdb_stdout);
-         printf_filtered (" is in ");
-         fputs_filtered (SYMBOL_SOURCE_NAME (sym), gdb_stdout);
-         printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
-       }
-      else
-       {
-         print_address_numeric (sal.pc, 1, gdb_stdout);
-         printf_filtered (" is at %s:%d.\n",
-                          sal.symtab->filename, sal.line);
-       }
-    }
-
-  /* If line was not specified by just a line number,
-     and it does not imply a symtab, it must be an undebuggable symbol
-     which means no source code.  */
-
-  if (!linenum_beg && sal.symtab == 0)
-    error ("No line number known for %s.", arg);
-
-  /* If this command is repeated with RET,
-     turn it into the no-arg variant.  */
-
-  if (from_tty)
-    *arg = 0;
-
-  if (dummy_beg && sal_end.symtab == 0)
-    error ("No default source file yet.  Do \"help list\".");
-  if (dummy_beg)
-    print_source_lines (sal_end.symtab,
-                       max (sal_end.line - (lines_to_list - 1), 1),
-                       sal_end.line + 1, 0);
-  else if (sal.symtab == 0)
-    error ("No default source file yet.  Do \"help list\".");
-  else if (no_end)
-    {
-      int first_line = sal.line - lines_to_list / 2;
-
-      if (first_line < 1) first_line = 1;
-
-      print_source_lines (sal.symtab, first_line, first_line + lines_to_list,
-                         0);
-    }
-  else
-    print_source_lines (sal.symtab, sal.line,
-                       (dummy_end
-                        ? sal.line + lines_to_list
-                        : sal_end.line + 1),
-                       0);
-}
 \f
 /* Print info on range of pc's in a specified line.  */
 
@@ -1360,7 +1258,7 @@ line_info (char *arg, int from_tty)
   CORE_ADDR start_pc, end_pc;
   int i;
 
-  INIT_SAL (&sal);             /* initialize to zeroes */
+  init_sal (&sal);             /* initialize to zeroes */
 
   if (arg == 0)
     {
@@ -1459,33 +1357,11 @@ forward_search_command (char *regex, int from_tty)
   int line;
   char *msg;
 
-#if defined(TUI)
-  /* 
-     ** If this is the TUI, search from the first line displayed in 
-     ** the source window, otherwise, search from last_line_listed+1 
-     ** in current_source_symtab 
-   */
-  if (!tui_version)
-    line = last_line_listed;
-  else
-    {
-      if (srcWin->generic.isVisible && srcWin->generic.contentSize > 0)
-       line = ((TuiWinContent)
-        srcWin->generic.content)[0]->whichElement.source.lineOrAddr.lineNo;
-      else
-       {
-         printf_filtered ("No source displayed.\nExpression not found.\n");
-         return;
-       }
-    }
-  line++;
-#else
   line = last_line_listed + 1;
-#endif
 
   msg = (char *) re_comp (regex);
   if (msg)
-    error (msg);
+    error ("%s", msg);
 
   if (current_source_symtab == 0)
     select_source_symtab (0);
@@ -1553,8 +1429,6 @@ forward_search_command (char *regex, int from_tty)
        {
          /* Match! */
          fclose (stream);
-         if (tui_version)
-           print_source_lines_base (current_source_symtab, line, line + 1, 0);
          print_source_lines (current_source_symtab, line, line + 1, 0);
          set_internalvar (lookup_internalvar ("_"),
                           value_from_longest (builtin_type_int,
@@ -1578,33 +1452,12 @@ reverse_search_command (char *regex, int from_tty)
   register FILE *stream;
   int line;
   char *msg;
-#if defined(TUI)
-  /*
-     ** If this is the TUI, search from the first line displayed in
-     ** the source window, otherwise, search from last_line_listed-1
-     ** in current_source_symtab
-   */
-  if (!tui_version)
-    line = last_line_listed;
-  else
-    {
-      if (srcWin->generic.isVisible && srcWin->generic.contentSize > 0)
-       line = ((TuiWinContent)
-        srcWin->generic.content)[0]->whichElement.source.lineOrAddr.lineNo;
-      else
-       {
-         printf_filtered ("No source displayed.\nExpression not found.\n");
-         return;
-       }
-    }
-  line--;
-#else
+
   line = last_line_listed - 1;
-#endif
 
   msg = (char *) re_comp (regex);
   if (msg)
-    error (msg);
+    error ("%s", msg);
 
   if (current_source_symtab == 0)
     select_source_symtab (0);
@@ -1661,8 +1514,6 @@ reverse_search_command (char *regex, int from_tty)
        {
          /* Match! */
          fclose (stream);
-         if (tui_version)
-           print_source_lines_base (current_source_symtab, line, line + 1, 0);
          print_source_lines (current_source_symtab, line, line + 1, 0);
          set_internalvar (lookup_internalvar ("_"),
                           value_from_longest (builtin_type_int,
@@ -1707,7 +1558,7 @@ With no argument, reset the search path to $cdir:$cwd, the default.",
   if (dbx_commands)
     add_com_alias ("use", "directory", class_files, 0);
 
-  c->completer = filename_completer;
+  set_cmd_completer (c, filename_completer);
 
   add_cmd ("directories", no_class, show_directories,
           "Current search path for finding source files.\n\
@@ -1756,29 +1607,6 @@ The matching line number is also stored as the value of \"$_\".");
       add_com_alias ("?", "reverse-search", class_files, 0);
     }
 
-  add_com ("list", class_files, list_command,
-          concat ("List specified function or line.\n\
-With no argument, lists ten more lines after or around previous listing.\n\
-\"list -\" lists the ten lines before a previous ten-line listing.\n\
-One argument specifies a line, and ten lines are listed around that line.\n\
-Two arguments with comma between specify starting and ending lines to list.\n\
-", "\
-Lines can be specified in these ways:\n\
-  LINENUM, to list around that line in current file,\n\
-  FILE:LINENUM, to list around that line in that file,\n\
-  FUNCTION, to list around beginning of that function,\n\
-  FILE:FUNCTION, to distinguish among like-named static functions.\n\
-  *ADDRESS, to list around the line containing that address.\n\
-With two args if one is empty it stands for ten lines away from the other arg.", NULL));
-
-  if (!xdb_commands)
-    add_com_alias ("l", "list", class_files, 1);
-  else
-    add_com_alias ("v", "list", class_files, 1);
-
-  if (dbx_commands)
-    add_com_alias ("file", "list", class_files, 1);
-
   add_show_from_set
     (add_set_cmd ("listsize", class_support, var_uinteger,
                  (char *) &lines_to_list,
This page took 0.037886 seconds and 4 git commands to generate.