summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Stubbs <andrew.stubbs@st.com>2006-02-21 19:46:48 +0000
committerAndrew Stubbs <andrew.stubbs@st.com>2006-02-21 19:46:48 +0000
commit13d35ae5ce3671e55dbb4b2bd8edd7344f0bd3d9 (patch)
treeb460eea81f76a8386a5cdda56e8188f222ce577a
parent5b96932ba38475227c261557a886e1dff1948ce6 (diff)
downloadbinutils-gdb-13d35ae5ce3671e55dbb4b2bd8edd7344f0bd3d9.tar.gz
2006-02-21 Andrew Stubbs <andrew.stubbs@st.com>
* defs.h (directory_switch): Add prototype. * main.c (captured_main): Use directory_switch() instead of directory_command() to add directories from the -d switch. * source.c (directory_switch): New function. (add_path): Use buildargv() to parse spaces in filenames properly. Strip multiple trailing '/' rather than just one.
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/defs.h2
-rw-r--r--gdb/main.c2
-rw-r--r--gdb/source.c81
4 files changed, 65 insertions, 29 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e5111186b30..514026f51f7 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,14 @@
2006-02-21 Andrew Stubbs <andrew.stubbs@st.com>
+ * defs.h (directory_switch): Add prototype.
+ * main.c (captured_main): Use directory_switch() instead of
+ directory_command() to add directories from the -d switch.
+ * source.c (directory_switch): New function.
+ (add_path): Use buildargv() to parse spaces in filenames properly.
+ Strip multiple trailing '/' rather than just one.
+
+2006-02-21 Andrew Stubbs <andrew.stubbs@st.com>
+
* symfile.c (add_symbol_file_command): Use buildargv(), instead of
hand decoding the command line, to allow use of quotes and spaces.
(_initialize_symfile): Reorganize the help message for add-symbol-file
diff --git a/gdb/defs.h b/gdb/defs.h
index f5f8e354849..d983dfc195e 100644
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -611,6 +611,8 @@ extern void add_path (char *, char **, int);
extern void directory_command (char *, int);
+extern void directory_switch (char *, int);
+
extern char *source_path;
extern void init_source_path (void);
diff --git a/gdb/main.c b/gdb/main.c
index b21ae993edc..8a11f176b75 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -667,7 +667,7 @@ extern int gdbtk_test (char *);
}
for (i = 0; i < ndir; i++)
- catch_command_errors (directory_command, dirarg[i], 0, RETURN_MASK_ALL);
+ catch_command_errors (directory_switch, dirarg[i], 0, RETURN_MASK_ALL);
xfree (dirarg);
if (execarg != NULL
diff --git a/gdb/source.c b/gdb/source.c
index f9f7dd1914e..3b93362b5e3 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -378,6 +378,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
@@ -397,56 +406,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';
@@ -577,7 +602,7 @@ add_path (char *dirname, char **which_path, int parse_separators)
}
skip_dup:;
}
- while (*dirname != '\0');
+ while (arg != NULL);
}