summaryrefslogtreecommitdiffstats
path: root/Source/kwsys/System.c
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2006-09-21 18:46:40 (GMT)
committerBrad King <brad.king@kitware.com>2006-09-21 18:46:40 (GMT)
commitd5d8687d16bf9b780c2de57a2f3f9d5a2cfe1545 (patch)
tree0e8c578b2b62a24d0703b788ef6f8c2120cc8222 /Source/kwsys/System.c
parentf0050269ea6f77591e92195118eabbb6de12c205 (diff)
downloadCMake-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.c53
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)