diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/infcmd.c | 35 |
2 files changed, 39 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1cbe086..8228aba 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2012-06-12 Eli Zaretskii <eliz@gnu.org> + + * 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. + 2012-06-11 Stan Shebs <stan@codesourcery.com> * ui-out.h: Remove #if 0 declarations. 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'; |