diff options
author | Eli Zaretskii <eliz@gnu.org> | 2012-06-12 16:36:42 +0000 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2012-06-12 16:36:42 +0000 |
commit | 5d60742e2dd3c9b475dce54b56043a358751bbb8 (patch) | |
tree | 7eeecc01631d0a1d7091255ef8c0ca7766e00f49 /gdb/infcmd.c | |
parent | 0c9070b30af40e837ae05cdbaf6f486690fffaf8 (diff) | |
download | fsf-binutils-gdb-5d60742e2dd3c9b475dce54b56043a358751bbb8.zip fsf-binutils-gdb-5d60742e2dd3c9b475dce54b56043a358751bbb8.tar.gz fsf-binutils-gdb-5d60742e2dd3c9b475dce54b56043a358751bbb8.tar.bz2 |
Fix quoting of special characters for the MinGW build.
infcmd.c (construct_inferior_arguments) [__MINGW32__]: Quote
special characters correctly for the Windows shells. See
http://sourceware.org/ml/gdb/2012-06/msg00047.html for the bug
report.
[!__MINGW32__]: Remove extra double quote character from special
characters.
Diffstat (limited to 'gdb/infcmd.c')
-rw-r--r-- | gdb/infcmd.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 5accd28..b7770cc 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -275,10 +275,18 @@ construct_inferior_arguments (int argc, char **argv) if (STARTUP_WITH_SHELL) { +#ifdef __MINGW32__ + /* This holds all the characters considered special to the + Windows shells. */ + char *special = "\"!&*|[]{}<>?`~^=;, \t\n"; + const char quote = '"'; +#else /* This holds all the characters considered special to the typical Unix shells. We include `^' because the SunOS /bin/sh treats it as a synonym for `|'. */ - char *special = "\"!#$&*()\\|[]{}<>?'\"`~^; \t\n"; + char *special = "\"!#$&*()\\|[]{}<>?'`~^; \t\n"; + const char quote = '\''; +#endif int i; int length = 0; char *out, *cp; @@ -298,11 +306,20 @@ construct_inferior_arguments (int argc, char **argv) /* Need to handle empty arguments specially. */ if (argv[i][0] == '\0') { - *out++ = '\''; - *out++ = '\''; + *out++ = quote; + *out++ = quote; } else { +#ifdef __MINGW32__ + int quoted = 0; + + if (strpbrk (argv[i], special)) + { + quoted = 1; + *out++ = quote; + } +#endif for (cp = argv[i]; *cp; ++cp) { if (*cp == '\n') @@ -310,17 +327,25 @@ construct_inferior_arguments (int argc, char **argv) /* A newline cannot be quoted with a backslash (it just disappears), only by putting it inside quotes. */ - *out++ = '\''; + *out++ = quote; *out++ = '\n'; - *out++ = '\''; + *out++ = quote; } else { +#ifdef __MINGW32__ + if (*cp == quote) +#else if (strchr (special, *cp) != NULL) +#endif *out++ = '\\'; *out++ = *cp; } } +#ifdef __MINGW32__ + if (quoted) + *out++ = quote; +#endif } } *out = '\0'; |