diff options
author | Brad King <brad.king@kitware.com> | 2006-09-21 18:46:40 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2006-09-21 18:46:40 (GMT) |
commit | d5d8687d16bf9b780c2de57a2f3f9d5a2cfe1545 (patch) | |
tree | 0e8c578b2b62a24d0703b788ef6f8c2120cc8222 /Source/kwsys/System.c | |
parent | f0050269ea6f77591e92195118eabbb6de12c205 (diff) | |
download | CMake-d5d8687d16bf9b780c2de57a2f3f9d5a2cfe1545.zip CMake-d5d8687d16bf9b780c2de57a2f3f9d5a2cfe1545.tar.gz CMake-d5d8687d16bf9b780c2de57a2f3f9d5a2cfe1545.tar.bz2 |
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.
Diffstat (limited to 'Source/kwsys/System.c')
-rw-r--r-- | Source/kwsys/System.c | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/Source/kwsys/System.c b/Source/kwsys/System.c index 17626aa..3b8e5a5 100644 --- a/Source/kwsys/System.c +++ b/Source/kwsys/System.c @@ -23,27 +23,39 @@ #include <string.h> /* 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) { /* Start with the length of the original argument, plus one for 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) |