From: Eli Zaretskii Date: Tue, 12 Jun 2012 16:36:42 +0000 (+0000) Subject: Fix quoting of special characters for the MinGW build. X-Git-Tag: sid-snapshot-20120701~209 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5d60742e2dd3c9b475dce54b56043a358751bbb8;p=thirdparty%2Fbinutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1cbe08685f5..8228aba8624 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2012-06-12 Eli Zaretskii + + * 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 * ui-out.h: Remove #if 0 declarations. diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 5accd285524..b7770ccfb90 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';