This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / gdb / source.c
index 1539b6c2cf27f4423903972d90ca169555fe31bd..927601d3df328f023c2d7d46b1a6005b74652dd2 100644 (file)
@@ -1,6 +1,6 @@
 /* List lines of source files for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -17,8 +17,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "symtab.h"
@@ -46,9 +46,6 @@
 #include "ui-out.h"
 #include "readline/readline.h"
 
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
 
 #define OPEN_MODE (O_RDONLY | O_BINARY)
 #define FDOPEN_MODE FOPEN_RB
@@ -91,6 +88,14 @@ static int current_source_line;
    things are wrapping, but that would be a fair amount of work.  */
 
 int lines_to_list = 10;
+static void
+show_lines_to_list (struct ui_file *file, int from_tty,
+                   struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Number of source lines gdb will list by default is %s.\n"),
+                   value);
+}
 
 /* Line number of last line printed.  Default for various commands.
    current_source_line is usually, but not always, the same as this.  */
@@ -134,7 +139,7 @@ get_lines_to_list (void)
 struct symtab_and_line
 get_current_source_symtab_and_line (void)
 {
-  struct symtab_and_line cursal;
+  struct symtab_and_line cursal = { };
 
   cursal.symtab = current_source_symtab;
   cursal.line = current_source_line;
@@ -173,7 +178,7 @@ set_default_source_symtab_and_line (void)
 struct symtab_and_line
 set_current_source_symtab_and_line (const struct symtab_and_line *sal)
 {
-  struct symtab_and_line cursal;
+  struct symtab_and_line cursal = { };
   
   cursal.symtab = current_source_symtab;
   cursal.line = current_source_line;
@@ -243,12 +248,10 @@ select_source_symtab (struct symtab *s)
     {
       for (s = ofp->symtabs; s; s = s->next)
        {
-         char *name = s->filename;
+         const char *name = s->filename;
          int len = strlen (name);
-         if (!(len > 2 && (DEPRECATED_STREQ (&name[len - 2], ".h"))))
-           {
-             current_source_symtab = s;
-           }
+         if (!(len > 2 && strcmp(&name[len - 2], ".h") == 0))
+           current_source_symtab = s;
        }
     }
   if (current_source_symtab)
@@ -260,12 +263,10 @@ select_source_symtab (struct symtab *s)
     {
       for (ps = ofp->psymtabs; ps != NULL; ps = ps->next)
        {
-         char *name = ps->filename;
+         const char *name = ps->filename;
          int len = strlen (name);
-         if (!(len > 2 && (DEPRECATED_STREQ (&name[len - 2], ".h"))))
-           {
-             cs_pst = ps;
-           }
+         if (!(len > 2 && strcmp (&name[len - 2], ".h") == 0))
+           cs_pst = ps;
        }
     }
   if (cs_pst)
@@ -374,6 +375,15 @@ directory_command (char *dirname, int from_tty)
   forget_cached_source_info ();
 }
 
+/* Add a path given with the -d command line switch.
+   This will not be quoted so we must not treat spaces as separators.  */
+
+void
+directory_switch (char *dirname, int from_tty)
+{
+  add_path (dirname, &source_path, 0);
+}
+
 /* Add zero or more directories to the front of an arbitrary path.  */
 
 void
@@ -393,56 +403,72 @@ add_path (char *dirname, char **which_path, int parse_separators)
 {
   char *old = *which_path;
   int prefix = 0;
+  char **argv = NULL;
+  char *arg;
+  int argv_index = 0;
 
   if (dirname == 0)
     return;
 
-  dirname = xstrdup (dirname);
-  make_cleanup (xfree, dirname);
+  if (parse_separators)
+    {
+      /* This will properly parse the space and tab separators
+        and any quotes that may exist. DIRNAME_SEPARATOR will
+        be dealt with later.  */
+      argv = buildargv (dirname);
+      make_cleanup_freeargv (argv);
+
+      if (argv == NULL)
+       nomem (0);
+
+      arg = argv[0];
+    }
+  else
+    {
+      arg = xstrdup (dirname);
+      make_cleanup (xfree, arg);
+    }
 
   do
     {
-      char *name = dirname;
+      char *name = arg;
       char *p;
       struct stat st;
 
       {
        char *separator = NULL;
-       char *space = NULL;
-       char *tab = NULL;
 
+       /* Spaces and tabs will have been removed by buildargv().
+          The directories will there be split into a list but
+          each entry may still contain DIRNAME_SEPARATOR.  */
        if (parse_separators)
-         {
-           separator = strchr (name, DIRNAME_SEPARATOR);
-           space = strchr (name, ' ');
-           tab = strchr (name, '\t');
-         }
+         separator = strchr (name, DIRNAME_SEPARATOR);
 
-       if (separator == 0 && space == 0 && tab == 0)
-         p = dirname = name + strlen (name);
+       if (separator == 0)
+         p = arg = name + strlen (name);
        else
          {
-           p = 0;
-           if (separator != 0 && (p == 0 || separator < p))
-             p = separator;
-           if (space != 0 && (p == 0 || space < p))
-             p = space;
-           if (tab != 0 && (p == 0 || tab < p))
-             p = tab;
-           dirname = p + 1;
-           while (*dirname == DIRNAME_SEPARATOR
-                  || *dirname == ' '
-                  || *dirname == '\t')
-             ++dirname;
+           p = separator;
+           arg = p + 1;
+           while (*arg == DIRNAME_SEPARATOR)
+             ++arg;
          }
+
+       /* If there are no more directories in this argument then start
+          on the next argument next time round the loop (if any).  */
+       if (*arg == '\0')
+         arg = parse_separators ? argv[++argv_index] : NULL;
       }
 
-      if (!(IS_DIR_SEPARATOR (*name) && p <= name + 1)  /* "/" */
+      /* name is the start of the directory.
+        p is the separator (or null) following the end.  */
+
+      while (!(IS_DIR_SEPARATOR (*name) && p <= name + 1)      /* "/" */
 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
       /* On MS-DOS and MS-Windows, h:\ is different from h: */
-         && !(p == name + 3 && name[1] == ':')          /* "d:/" */
+            && !(p == name + 3 && name[1] == ':')              /* "d:/" */
 #endif
-         && IS_DIR_SEPARATOR (p[-1]))
+            && IS_DIR_SEPARATOR (p[-1]))
        /* Sigh. "foo/" => "foo" */
        --p;
       *p = '\0';
@@ -479,10 +505,10 @@ add_path (char *dirname, char **which_path, int parse_separators)
        name = tilde_expand (name);
 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
       else if (IS_ABSOLUTE_PATH (name) && p == name + 2) /* "d:" => "d:." */
-       name = concat (name, ".", NULL);
+       name = concat (name, ".", (char *)NULL);
 #endif
       else if (!IS_ABSOLUTE_PATH (name) && name[0] != '$')
-       name = concat (current_directory, SLASH_STRING, name, NULL);
+       name = concat (current_directory, SLASH_STRING, name, (char *)NULL);
       else
        name = savestring (name, p - name);
       make_cleanup (xfree, name);
@@ -555,15 +581,16 @@ add_path (char *dirname, char **which_path, int parse_separators)
 
                c = old[prefix];
                old[prefix] = '\0';
-               temp = concat (old, tinybuf, name, NULL);
+               temp = concat (old, tinybuf, name, (char *)NULL);
                old[prefix] = c;
-               *which_path = concat (temp, "", &old[prefix], NULL);
+               *which_path = concat (temp, "", &old[prefix], (char *)NULL);
                prefix = strlen (temp);
                xfree (temp);
              }
            else
              {
-               *which_path = concat (name, (old[0] ? tinybuf : old), old, NULL);
+               *which_path = concat (name, (old[0] ? tinybuf : old),
+                                     old, (char *)NULL);
                prefix = strlen (name);
              }
            xfree (old);
@@ -572,7 +599,7 @@ add_path (char *dirname, char **which_path, int parse_separators)
       }
     skip_dup:;
     }
-  while (*dirname != '\0');
+  while (arg != NULL);
 }
 
 
@@ -763,7 +790,7 @@ done:
          char *f = concat (current_directory,
                            IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
                            ? "" : SLASH_STRING,
-                           filename, NULL);
+                           filename, (char *)NULL);
          *filename_opened = xfullpath (f);
          xfree (f);
        }
@@ -1604,29 +1631,28 @@ $cdir in the path means the compilation directory of the source file."),
     }
 
   add_info ("source", source_info,
-           "Information about the current source file.");
+           _("Information about the current source file."));
 
-  add_info ("line", line_info,
-           concat ("Core addresses of the code for a source line.\n\
+  add_info ("line", line_info, _("\
+Core addresses of the code for a source line.\n\
 Line can be specified as\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\
-", "\
 Default is to describe the last source line that was listed.\n\n\
 This sets the default address for \"x\" to the line's first instruction\n\
 so that \"x/i\" suffices to start examining the machine code.\n\
-The address is also stored as the value of \"$_\".", NULL));
+The address is also stored as the value of \"$_\"."));
 
-  add_com ("forward-search", class_files, forward_search_command,
-          "Search for regular expression (see regex(3)) from last line listed.\n\
-The matching line number is also stored as the value of \"$_\".");
+  add_com ("forward-search", class_files, forward_search_command, _("\
+Search for regular expression (see regex(3)) from last line listed.\n\
+The matching line number is also stored as the value of \"$_\"."));
   add_com_alias ("search", "forward-search", class_files, 0);
 
-  add_com ("reverse-search", class_files, reverse_search_command,
-          "Search backward for regular expression (see regex(3)) from last line listed.\n\
-The matching line number is also stored as the value of \"$_\".");
+  add_com ("reverse-search", class_files, reverse_search_command, _("\
+Search backward for regular expression (see regex(3)) from last line listed.\n\
+The matching line number is also stored as the value of \"$_\"."));
 
   if (xdb_commands)
     {
@@ -1634,10 +1660,10 @@ The matching line number is also stored as the value of \"$_\".");
       add_com_alias ("?", "reverse-search", class_files, 0);
     }
 
-  deprecated_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);
+  add_setshow_integer_cmd ("listsize", class_support, &lines_to_list, _("\
+Set number of source lines gdb will list by default."), _("\
+Show number of source lines gdb will list by default."), NULL,
+                           NULL,
+                           show_lines_to_list,
+                           &setlist, &showlist);
 }
This page took 0.028106 seconds and 4 git commands to generate.