From 5d60742e2dd3c9b475dce54b56043a358751bbb8 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 12 Jun 2012 16:36:42 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 9 +++++++++ gdb/infcmd.c | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1cbe08685f..8228aba862 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 5accd28552..b7770ccfb9 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'; -- 2.34.1