From 0b7f4d73d06946545fa9e6950034e2d88edc5cda Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
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.

---
 System.c | 53 +++++++++++++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 24 deletions(-)

diff --git a/System.c b/System.c
index 1f2e6917..ddb89901 100644
--- a/System.c
+++ b/System.c
@@ -22,6 +22,25 @@
 
 #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)
 {
@@ -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)
-- 
GitLab