From d5d8687d16bf9b780c2de57a2f3f9d5a2cfe1545 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 21 Sep 2006 14:46:40 -0400 Subject: [PATCH] BUG: Windows_ShellArgument: need to escape if the string contains one of a set of special characters as well as spaces. Moved test for needing escapes to a separate method kwsysSystemWindowsShellArgumentNeedsEscape. --- Source/kwsys/System.c | 53 +++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/Source/kwsys/System.c b/Source/kwsys/System.c index 17626aa30..3b8e5a5a6 100644 --- a/Source/kwsys/System.c +++ b/Source/kwsys/System.c @@ -22,6 +22,25 @@ #include /* strlen */ +/*--------------------------------------------------------------------------*/ +static int kwsysSystemWindowsShellArgumentNeedsEscape(const char* in) +{ + /* Scan the string for characters that need escaping. Note that + single quotes seem to need escaping for some windows shell + environments (mingw32-make shell for example). Single quotes do + not actually need backslash escapes but must be in a + double-quoted argument. */ + const char* c; + for(c=in; *c; ++c) + { + if(*c == ' ' || *c == '\t' || *c == '"' || *c == '\'') + { + return 1; + } + } + return 0; +} + /*--------------------------------------------------------------------------*/ int kwsysSystem_Windows_ShellArgumentSize(const char* in) { @@ -29,21 +48,14 @@ int kwsysSystem_Windows_ShellArgumentSize(const char* in) either a terminating null or a separating space. */ int length = (int)strlen(in) + 1; + /* String iterator. */ + const char* c; + /* Keep track of how many backslashes have been encountered in a row. */ int backslashes = 0; - /* Scan the string for spaces. */ - const char* c; - for(c=in; *c; ++c) - { - if(*c == ' ' || *c == '\t') - { - break; - } - } - - /* If there are no spaces, we do not need any extra length. */ - if(!*c) + /* If nothing needs escaping, we do not need any extra length. */ + if(!kwsysSystemWindowsShellArgumentNeedsEscape(in)) { return length; } @@ -84,21 +96,14 @@ int kwsysSystem_Windows_ShellArgumentSize(const char* in) /*--------------------------------------------------------------------------*/ char* kwsysSystem_Windows_ShellArgument(const char* in, char* out) { + /* String iterator. */ + const char* c; + /* Keep track of how many backslashes have been encountered in a row. */ int backslashes = 0; - /* Scan the string for spaces. */ - const char* c; - for(c=in; *c; ++c) - { - if(*c == ' ' || *c == '\t') - { - break; - } - } - - /* If there are no spaces, we can pass the argument verbatim. */ - if(!*c) + /* If nothing needs escaping, we can pass the argument verbatim. */ + if(!kwsysSystemWindowsShellArgumentNeedsEscape(in)) { /* Just copy the string. */ for(c=in; *c; ++c)