This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / gdb / source.c
index d8ca4a0134217f581024f2c1402386958c0d247c..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
@@ -142,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;
@@ -181,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;
@@ -251,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)
@@ -268,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)
@@ -382,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
@@ -401,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';
@@ -487,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);
@@ -563,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);
@@ -580,7 +599,7 @@ add_path (char *dirname, char **which_path, int parse_separators)
       }
     skip_dup:;
     }
-  while (*dirname != '\0');
+  while (arg != NULL);
 }
 
 
@@ -771,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);
        }
@@ -1641,7 +1660,7 @@ The matching line number is also stored as the value of \"$_\"."));
       add_com_alias ("?", "reverse-search", class_files, 0);
     }
 
-  add_setshow_uinteger_cmd ("listsize", class_support, &lines_to_list, _("\
+  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,
This page took 0.027605 seconds and 4 git commands to generate.