-RUN: echo "\"" | FileCheck %s
-CHECK: {{^"$}}
+RUN: echo "\"" | FileCheck %s --check-prefix=CHECK1
+RUN: echo '"' | FileCheck %s --check-prefix=CHECK1
+RUN: echo 'a[b\c' | FileCheck %s --check-prefix=CHECK2
+RUN: echo "a[b\\c" | FileCheck %s --check-prefix=CHECK2
+RUN: echo 'a\b\\c\\\\d' | FileCheck %s --check-prefix=CHECK3
+RUN: echo "a\\b\\\\c\\\\\\\\d" | FileCheck %s --check-prefix=CHECK3
+RUN: not not echo "\"" | FileCheck %s --check-prefix=CHECK1
+RUN: not not echo '"' | FileCheck %s --check-prefix=CHECK1
+RUN: not not echo 'a[b\c' | FileCheck %s --check-prefix=CHECK2
+RUN: not not echo "a[b\\c" | FileCheck %s --check-prefix=CHECK2
+RUN: not not echo 'a\b\\c\\\\d' | FileCheck %s --check-prefix=CHECK3
+RUN: not not echo "a\\b\\\\c\\\\\\\\d" | FileCheck %s --check-prefix=CHECK3
+CHECK1: {{^"$}}
+CHECK2: {{^a\[b\\c$}}
+CHECK3: {{^a\\b\\\\c\\\\\\\\d$}}
+
+On Windows, with MSYS based tools, the following commands fail though:
+RUNX: echo 'a[b\c\\d' | FileCheck %s --check-prefix=CHECK4
+RUNX: echo "a[b\\c\\\\d" | FileCheck %s --check-prefix=CHECK4
+CHECK4: {{^a\[b\\c\\\\d$}}
We use the same algorithm from MSDN as CPython
(http://msdn.microsoft.com/en-us/library/17w5ykft.aspx), but we treat more
- characters as needing quoting, such as double quotes themselves.
+ characters as needing quoting, such as double quotes themselves, and square
+ brackets.
+
+ For MSys based tools, this is very brittle though, because quoting an
+ argument makes the MSys based tool unescape backslashes where it shouldn't
+ (e.g. "a\b\\c\\\\d" becomes "a\b\c\\d" where it should stay as it was,
+ according to regular win32 command line parsing rules).
"""
result = []
needquote = False
result.append(' ')
# This logic differs from upstream list2cmdline.
- needquote = (" " in arg) or ("\t" in arg) or ("\"" in arg) or not arg
+ needquote = (" " in arg) or ("\t" in arg) or ("\"" in arg) or ("[" in arg) or not arg
if needquote:
result.append('"')