* infrun.c (wait_for_inferior): Don't check if the PC is in a
[deliverable/binutils-gdb.git] / gdb / source.c
index ebc7041bf98154b94cee2b9d36add1ebac489057..369788fbef0297b9969f4e7aee7abd522e7dab9f 100644 (file)
@@ -3,25 +3,27 @@
 
 This file is part of GDB.
 
-GDB is free software; you can redistribute it and/or modify
+This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-GDB is distributed in the hope that it will be useful,
+This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GDB; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include <stdio.h>
 #include "defs.h"
 #include "symtab.h"
 #include "param.h"
+#include "language.h"
 #include "command.h"
+#include "gdbcmd.h"
 #include "frame.h"
 
 #ifdef USG
@@ -33,13 +35,15 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <sys/stat.h>
 #include <fcntl.h>
 #include "gdbcore.h"
+#include "regex.h"
 
-extern char *strstr();
+/* If we use this declaration, it breaks because of fucking ANSI "const" stuff
+   on some systems.  We just have to not declare it at all, have it default
+   to int, and possibly botch on a few systems.  Thanks, ANSIholes... */
+/* extern char *strstr(); */
 
 extern void set_next_address ();
 
-void mod_path ();
-
 /* Path of directories to search for source files.
    Same format as the PATH environment variable's value.  */
 
@@ -53,6 +57,14 @@ struct symtab *current_source_symtab;
 
 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
+   characters) lines there will be.  To be completely correct, "list"
+   and friends should be rewritten to count characters and see where
+   things are wrapping, but that would be a fair amount of work.  */
+
+unsigned lines_to_list = 10;
+
 /* Line number of last line printed.  Default for various commands.
    current_source_line is usually, but not always, the same as this.  */
 
@@ -95,26 +107,28 @@ select_source_symtab (s)
       sal = sals.sals[0];
       free (sals.sals);
       current_source_symtab = sal.symtab;
-      current_source_line = max (sal.line - (lines_to_list () - 1), 1);
-      return;
+      current_source_line = max (sal.line - (lines_to_list - 1), 1);
+      if (current_source_symtab)
+        return;
     }
   
   /* All right; find the last file in the symtab list (ignoring .h's).  */
 
-  if (s = symtab_list)
+  current_source_line = 1;
+
+  for (s = symtab_list; s; s = s->next)
     {
-      do
-       {
-         char *name = s->filename;
-         int len = strlen (name);
-         if (! (len > 2 && !strcmp (&name[len - 2], ".h")))
-           current_source_symtab = s;
-         s = s->next;
-       }
-      while (s);
-      current_source_line = 1;
+      char *name = s->filename;
+      int len = strlen (name);
+      if (! (len > 2 && !strcmp (&name[len - 2], ".h")))
+       current_source_symtab = s;
     }
-  else if (partial_symtab_list)
+  if (current_source_symtab)
+    return;
+
+  /* Howabout the partial symtab list?  */
+
+  if (partial_symtab_list)
     {
       ps = partial_symtab_list;
       while (ps)
@@ -130,14 +144,15 @@ select_source_symtab (s)
          fatal ("Internal: select_source_symtab: readin pst found and no symtabs.");
        else
          current_source_symtab = PSYMTAB_TO_SYMTAB (cs_pst);
-      else
-       current_source_symtab = 0;
-      current_source_line = 1;
     }
+  if (current_source_symtab)
+    return;
+
+  error ("Can't find a default source file");
 }
 \f
 static void
-directories_info ()
+show_directories ()
 {
   printf ("Source directories searched: %s\n", source_path);
 }
@@ -192,18 +207,17 @@ directory_command (dirname, from_tty)
        }
     }
   else
-    mod_path (dirname, from_tty, &source_path);
+    mod_path (dirname, &source_path);
   if (from_tty)
-    directories_info ();
+    show_directories ();
   forget_cached_source_info ();
 }
 
 /* Add zero or more directories to the front of an arbitrary path.  */
 
 void
-mod_path (dirname, from_tty, which_path)
+mod_path (dirname, which_path)
      char *dirname;
-     int from_tty;
      char **which_path;
 {
   char *old = *which_path;
@@ -362,13 +376,7 @@ source_info ()
   if (s->nlines)
     printf ("Contains %d lines\n", s->nlines);
 
-  switch (s->language) {
-  case language_c:
-    printf("Written in the C language.\n");
-  /* Add more cases here when -Wswitch complains... */
-  case language_unknown:
-    break;
-  }
+  printf("Source language %s.\n", language_str (s->language));
 }
 
 
@@ -501,7 +509,9 @@ open_source_file (s)
     {
       /* Replace a path entry of  $cdir  with the compilation directory name */
 #define        cdir_len        5
-      p = strstr (source_path, "$cdir");
+      /* We cast strstr's result in case an ANSIhole has made it const,
+        which produces a "required warning" when assigned to a nonconst. */
+      p = (char *)strstr (source_path, "$cdir");
       if (p && (p == path || p[-1] == ':')
            && (p[cdir_len] == ':' || p[cdir_len] == '\0')) {
        int len;
@@ -540,7 +550,7 @@ find_source_lines (s, desc)
   if (exec_bfd && bfd_get_mtime(exec_bfd) < st.st_mtime)
     printf ("Source file is more recent than executable.\n");
 
-#if defined (BROKEN_LARGE_ALLOCA)
+#ifdef BROKEN_LARGE_ALLOCA
   data = (char *) xmalloc (st.st_size);
   make_cleanup (free, data);
 #else
@@ -772,7 +782,7 @@ list_command (arg, from_tty)
   char *p;
 
   if (symtab_list == 0 && partial_symtab_list == 0)
-    error ("No symbol table is loaded.  Use the \"symbol-file\" command.");
+    error ("No symbol table is loaded.  Use the \"file\" command.");
 
   /* Pull in a current source symtab if necessary */
   if (current_source_symtab == 0 &&
@@ -786,7 +796,7 @@ list_command (arg, from_tty)
       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);
+                         current_source_line + lines_to_list, 0);
       return;
     }
 
@@ -796,7 +806,7 @@ list_command (arg, from_tty)
       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),
+                         max (first_line_listed - lines_to_list, 1),
                          first_line_listed, 0);
       return;
     }
@@ -876,14 +886,16 @@ list_command (arg, from_tty)
   if (*arg == '*')
     {
       if (sal.symtab == 0)
-       error ("No source file for address 0x%x.", sal.pc);
+       error ("No source file for address %s.", local_hex_string(sal.pc));
       sym = find_pc_function (sal.pc);
       if (sym)
-       printf ("0x%x is in %s (%s, line %d).\n",
-               sal.pc, SYMBOL_NAME (sym), sal.symtab->filename, sal.line);
+       printf ("%s is in %s (%s, line %d).\n",
+               local_hex_string(sal.pc), 
+               SYMBOL_NAME (sym), sal.symtab->filename, sal.line);
       else
-       printf ("0x%x is in %s, line %d.\n",
-               sal.pc, sal.symtab->filename, sal.line);
+       printf ("%s is in %s, line %d.\n",
+               local_hex_string(sal.pc), 
+               sal.symtab->filename, sal.line);
     }
 
   /* If line was not specified by just a line number,
@@ -903,18 +915,18 @@ list_command (arg, from_tty)
     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),
+                       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)
     print_source_lines (sal.symtab,
-                       max (sal.line - (lines_to_list () / 2), 1),
-                       sal.line + 5, 0);
+                       max (sal.line - (lines_to_list / 2), 1),
+                       sal.line + (lines_to_list / 2), 0);
   else
     print_source_lines (sal.symtab, sal.line,
                        (dummy_end
-                        ? sal.line + lines_to_list ()
+                        ? sal.line + lines_to_list
                         : sal_end.line + 1),
                        0);
 }
@@ -963,11 +975,14 @@ line_info (arg, from_tty)
          && find_line_pc_range (sal.symtab, sal.line, &start_pc, &end_pc))
        {
          if (start_pc == end_pc)
-           printf ("Line %d of \"%s\" is at pc 0x%x but contains no code.\n",
-                   sal.line, sal.symtab->filename, start_pc);
+           printf ("Line %d of \"%s\" is at pc %s but contains no code.\n",
+                   sal.line, sal.symtab->filename, local_hex_string(start_pc));
          else
-           printf ("Line %d of \"%s\" starts at pc 0x%x and ends at 0x%x.\n",
-                   sal.line, sal.symtab->filename, start_pc, end_pc);
+           printf ("Line %d of \"%s\" starts at pc %s",
+                   sal.line, sal.symtab->filename, 
+                   local_hex_string(start_pc));
+           printf (" and ends at %s.\n",
+                   local_hex_string(end_pc));
          /* x/i should display this line's code.  */
          set_next_address (start_pc);
          /* Repeating "info line" should do the following line.  */
@@ -981,6 +996,7 @@ line_info (arg, from_tty)
 \f
 /* Commands to search the source file for a regexp.  */
 
+/* ARGSUSED */
 static void
 forward_search_command (regex, from_tty)
      char *regex;
@@ -1023,15 +1039,16 @@ forward_search_command (regex, from_tty)
   stream = fdopen (desc, "r");
   clearerr (stream);
   while (1) {
+/* FIXME!!!  We walk right off the end of buf if we get a long line!!! */
     char buf[4096];            /* Should be reasonable??? */
     register char *p = buf;
 
-    c = fgetc (stream);
+    c = getc (stream);
     if (c == EOF)
       break;
     do {
       *p++ = c;
-    } while (c != '\n' && (c = fgetc (stream)) >= 0);
+    } while (c != '\n' && (c = getc (stream)) >= 0);
 
     /* we now have a source line in buf, null terminate and match */
     *p = 0;
@@ -1041,7 +1058,7 @@ forward_search_command (regex, from_tty)
        fclose (stream);
        print_source_lines (current_source_symtab,
                           line, line+1, 0);
-       current_source_line = max (line - lines_to_list () / 2, 1);
+       current_source_line = max (line - lines_to_list / 2, 1);
        return;
       }
     line++;
@@ -1051,6 +1068,7 @@ forward_search_command (regex, from_tty)
   fclose (stream);
 }
 
+/* ARGSUSED */
 static void
 reverse_search_command (regex, from_tty)
      char *regex;
@@ -1094,15 +1112,16 @@ reverse_search_command (regex, from_tty)
   clearerr (stream);
   while (line > 1)
     {
+/* FIXME!!!  We walk right off the end of buf if we get a long line!!! */
       char buf[4096];          /* Should be reasonable??? */
       register char *p = buf;
 
-      c = fgetc (stream);
+      c = getc (stream);
       if (c == EOF)
        break;
       do {
        *p++ = c;
-      } while (c != '\n' && (c = fgetc (stream)) >= 0);
+      } while (c != '\n' && (c = getc (stream)) >= 0);
 
       /* We now have a source line in buf; null terminate and match.  */
       *p = 0;
@@ -1112,7 +1131,7 @@ reverse_search_command (regex, from_tty)
          fclose (stream);
          print_source_lines (current_source_symtab,
                              line, line+1, 0);
-         current_source_line = max (line - lines_to_list () / 2, 1);
+         current_source_line = max (line - lines_to_list / 2, 1);
          return;
        }
       line--;
@@ -1141,10 +1160,11 @@ DIR can also be $cwd for the current working directory, or $cdir for the\n\
 directory in which the source file was compiled into object code.\n\
 With no argument, reset the search path to $cdir:$cwd, the default.");
 
-  add_info ("directories", directories_info,
-           "Current search path for finding source files.\n\
+  add_cmd ("directories", no_class, show_directories,
+          "Current search path for finding source files.\n\
 $cwd in the path means the current working directory.\n\
-$cdir in the path means the compilation directory of the source file.");
+$cdir in the path means the compilation directory of the source file.",
+          &showlist);
 
   add_info ("source", source_info,
            "Information about the current source file.");
@@ -1182,5 +1202,11 @@ Lines can be specified in these ways:\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.");
   add_com_alias ("l", "list", class_files, 0);
-}
 
+  add_show_from_set
+    (add_set_cmd ("listsize", class_support, var_uinteger,
+                 (char *)&lines_to_list,
+       "Set number of source lines gdb will list by default.",
+                 &setlist),
+     &showlist);
+}
This page took 0.028262 seconds and 4 git commands to generate.