Skip to content

Commit 2518166

Browse files
committed
Revert [support] GlobPattern: add support for \ and [!...], and allow ] in more places
This reverts r375051 (git commit a409afa) The patch does not work on Windows due to `\` in filenames being interpreted as escaping rather than literal path separators when used by lld linker scripts. llvm-svn: 375052
1 parent a409afa commit 2518166

File tree

3 files changed

+46
-113
lines changed

3 files changed

+46
-113
lines changed

llvm/include/llvm/Support/GlobPattern.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
#include <vector>
2222

2323
// This class represents a glob pattern. Supported metacharacters
24-
// are "*", "?", "\", "[<chars>]", "[^<chars>]", and "[!<chars>]".
24+
// are "*", "?", "[<chars>]" and "[^<chars>]".
2525
namespace llvm {
2626
class BitVector;
2727
template <typename T> class ArrayRef;

llvm/lib/Support/GlobPattern.cpp

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
using namespace llvm;
2020

2121
static bool hasWildcard(StringRef S) {
22-
return S.find_first_of("?*[\\") != StringRef::npos;
22+
return S.find_first_of("?*[") != StringRef::npos;
2323
}
2424

2525
// Expands character ranges and returns a bitmap.
@@ -60,9 +60,8 @@ static Expected<BitVector> expand(StringRef S, StringRef Original) {
6060
}
6161

6262
// This is a scanner for the glob pattern.
63-
// A glob pattern token is one of "*", "?", "\", "[<chars>]", "[^<chars>]"
64-
// (which is a negative form of "[<chars>]"), "[!<chars>]" (which is
65-
// equivalent to "[^<chars>]"), or a non-meta character.
63+
// A glob pattern token is one of "*", "?", "[<chars>]", "[^<chars>]"
64+
// (which is a negative form of "[<chars>]"), or a non-meta character.
6665
// This function returns the first token in S.
6766
static Expected<BitVector> scan(StringRef &S, StringRef Original) {
6867
switch (S[0]) {
@@ -75,28 +74,21 @@ static Expected<BitVector> scan(StringRef &S, StringRef Original) {
7574
S = S.substr(1);
7675
return BitVector(256, true);
7776
case '[': {
78-
// ']' is allowed as the first character of a character class. '[]' is
79-
// invalid. So, just skip the first character.
80-
size_t End = S.find(']', 2);
77+
size_t End = S.find(']', 1);
8178
if (End == StringRef::npos)
8279
return make_error<StringError>("invalid glob pattern: " + Original,
8380
errc::invalid_argument);
8481

8582
StringRef Chars = S.substr(1, End - 1);
8683
S = S.substr(End + 1);
87-
if (Chars.startswith("^") || Chars.startswith("!")) {
84+
if (Chars.startswith("^")) {
8885
Expected<BitVector> BV = expand(Chars.substr(1), Original);
8986
if (!BV)
9087
return BV.takeError();
9188
return BV->flip();
9289
}
9390
return expand(Chars, Original);
9491
}
95-
case '\\':
96-
// Eat this character and fall through below to treat it like a non-meta
97-
// character.
98-
S = S.substr(1);
99-
LLVM_FALLTHROUGH;
10092
default:
10193
BitVector BV(256, false);
10294
BV[(uint8_t)S[0]] = true;
@@ -115,9 +107,8 @@ Expected<GlobPattern> GlobPattern::create(StringRef S) {
115107
return Pat;
116108
}
117109

118-
// S is something like "foo*", and the "* is not escaped. We can use
119-
// startswith().
120-
if (S.endswith("*") && !S.endswith("\\*") && !hasWildcard(S.drop_back())) {
110+
// S is something like "foo*". We can use startswith().
111+
if (S.endswith("*") && !hasWildcard(S.drop_back())) {
121112
Pat.Prefix = S.drop_back();
122113
return Pat;
123114
}

llvm/unittests/Support/GlobPatternTest.cpp

Lines changed: 38 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -14,115 +14,57 @@ namespace {
1414

1515
class GlobPatternTest : public ::testing::Test {};
1616

17-
TEST_F(GlobPatternTest, Empty) {
17+
TEST_F(GlobPatternTest, Basics) {
1818
Expected<GlobPattern> Pat1 = GlobPattern::create("");
1919
EXPECT_TRUE((bool)Pat1);
2020
EXPECT_TRUE(Pat1->match(""));
2121
EXPECT_FALSE(Pat1->match("a"));
22-
}
23-
24-
TEST_F(GlobPatternTest, Glob) {
25-
Expected<GlobPattern> Pat1 = GlobPattern::create("ab*c*def");
26-
EXPECT_TRUE((bool)Pat1);
27-
EXPECT_TRUE(Pat1->match("abcdef"));
28-
EXPECT_TRUE(Pat1->match("abxcxdef"));
29-
EXPECT_FALSE(Pat1->match(""));
30-
EXPECT_FALSE(Pat1->match("xabcdef"));
31-
EXPECT_FALSE(Pat1->match("abcdefx"));
32-
}
33-
34-
TEST_F(GlobPatternTest, Wildcard) {
35-
Expected<GlobPattern> Pat1 = GlobPattern::create("a??c");
36-
EXPECT_TRUE((bool)Pat1);
37-
EXPECT_TRUE(Pat1->match("axxc"));
38-
EXPECT_FALSE(Pat1->match("axxx"));
39-
EXPECT_FALSE(Pat1->match(""));
40-
}
4122

42-
TEST_F(GlobPatternTest, Escape) {
43-
Expected<GlobPattern> Pat1 = GlobPattern::create("\\*");
44-
EXPECT_TRUE((bool)Pat1);
45-
EXPECT_TRUE(Pat1->match("*"));
46-
EXPECT_FALSE(Pat1->match("\\*"));
47-
EXPECT_FALSE(Pat1->match("a"));
48-
49-
Expected<GlobPattern> Pat2 = GlobPattern::create("a?\\?c");
23+
Expected<GlobPattern> Pat2 = GlobPattern::create("ab*c*def");
5024
EXPECT_TRUE((bool)Pat2);
51-
EXPECT_TRUE(Pat2->match("ax?c"));
52-
EXPECT_FALSE(Pat2->match("axxc"));
25+
EXPECT_TRUE(Pat2->match("abcdef"));
26+
EXPECT_TRUE(Pat2->match("abxcxdef"));
5327
EXPECT_FALSE(Pat2->match(""));
54-
}
55-
56-
TEST_F(GlobPatternTest, BasicCharacterClass) {
57-
Expected<GlobPattern> Pat1 = GlobPattern::create("[abc-fy-z]");
58-
EXPECT_TRUE((bool)Pat1);
59-
EXPECT_TRUE(Pat1->match("a"));
60-
EXPECT_TRUE(Pat1->match("b"));
61-
EXPECT_TRUE(Pat1->match("c"));
62-
EXPECT_TRUE(Pat1->match("d"));
63-
EXPECT_TRUE(Pat1->match("e"));
64-
EXPECT_TRUE(Pat1->match("f"));
65-
EXPECT_TRUE(Pat1->match("y"));
66-
EXPECT_TRUE(Pat1->match("z"));
67-
EXPECT_FALSE(Pat1->match("g"));
68-
EXPECT_FALSE(Pat1->match(""));
69-
}
70-
71-
TEST_F(GlobPatternTest, NegatedCharacterClass) {
72-
Expected<GlobPattern> Pat1 = GlobPattern::create("[^abc-fy-z]");
73-
EXPECT_TRUE((bool)Pat1);
74-
EXPECT_TRUE(Pat1->match("g"));
75-
EXPECT_FALSE(Pat1->match("a"));
76-
EXPECT_FALSE(Pat1->match("b"));
77-
EXPECT_FALSE(Pat1->match("c"));
78-
EXPECT_FALSE(Pat1->match("d"));
79-
EXPECT_FALSE(Pat1->match("e"));
80-
EXPECT_FALSE(Pat1->match("f"));
81-
EXPECT_FALSE(Pat1->match("y"));
82-
EXPECT_FALSE(Pat1->match("z"));
83-
EXPECT_FALSE(Pat1->match(""));
84-
85-
Expected<GlobPattern> Pat2 = GlobPattern::create("[!abc-fy-z]");
86-
EXPECT_TRUE((bool)Pat2);
87-
EXPECT_TRUE(Pat2->match("g"));
88-
EXPECT_FALSE(Pat2->match("a"));
89-
EXPECT_FALSE(Pat2->match("b"));
90-
EXPECT_FALSE(Pat2->match("c"));
91-
EXPECT_FALSE(Pat2->match("d"));
92-
EXPECT_FALSE(Pat2->match("e"));
93-
EXPECT_FALSE(Pat2->match("f"));
94-
EXPECT_FALSE(Pat2->match("y"));
95-
EXPECT_FALSE(Pat2->match("z"));
96-
EXPECT_FALSE(Pat2->match(""));
97-
}
98-
99-
TEST_F(GlobPatternTest, BracketFrontOfCharacterClass) {
100-
Expected<GlobPattern> Pat1 = GlobPattern::create("[]a]x");
101-
EXPECT_TRUE((bool)Pat1);
102-
EXPECT_TRUE(Pat1->match("]x"));
103-
EXPECT_TRUE(Pat1->match("ax"));
104-
EXPECT_FALSE(Pat1->match("a]x"));
105-
EXPECT_FALSE(Pat1->match(""));
106-
}
107-
108-
TEST_F(GlobPatternTest, SpecialCharsInCharacterClass) {
109-
Expected<GlobPattern> Pat1 = GlobPattern::create("[*?^]");
110-
EXPECT_TRUE((bool)Pat1);
111-
EXPECT_TRUE(Pat1->match("*"));
112-
EXPECT_TRUE(Pat1->match("?"));
113-
EXPECT_TRUE(Pat1->match("^"));
114-
EXPECT_FALSE(Pat1->match("*?^"));
115-
EXPECT_FALSE(Pat1->match(""));
28+
EXPECT_FALSE(Pat2->match("xabcdef"));
29+
EXPECT_FALSE(Pat2->match("abcdefx"));
30+
31+
Expected<GlobPattern> Pat3 = GlobPattern::create("a??c");
32+
EXPECT_TRUE((bool)Pat3);
33+
EXPECT_TRUE(Pat3->match("axxc"));
34+
EXPECT_FALSE(Pat3->match("axxx"));
35+
EXPECT_FALSE(Pat3->match(""));
36+
37+
Expected<GlobPattern> Pat4 = GlobPattern::create("[abc-fy-z]");
38+
EXPECT_TRUE((bool)Pat4);
39+
EXPECT_TRUE(Pat4->match("a"));
40+
EXPECT_TRUE(Pat4->match("b"));
41+
EXPECT_TRUE(Pat4->match("c"));
42+
EXPECT_TRUE(Pat4->match("d"));
43+
EXPECT_TRUE(Pat4->match("e"));
44+
EXPECT_TRUE(Pat4->match("f"));
45+
EXPECT_TRUE(Pat4->match("y"));
46+
EXPECT_TRUE(Pat4->match("z"));
47+
EXPECT_FALSE(Pat4->match("g"));
48+
EXPECT_FALSE(Pat4->match(""));
49+
50+
Expected<GlobPattern> Pat5 = GlobPattern::create("[^abc-fy-z]");
51+
EXPECT_TRUE((bool)Pat5);
52+
EXPECT_TRUE(Pat5->match("g"));
53+
EXPECT_FALSE(Pat5->match("a"));
54+
EXPECT_FALSE(Pat5->match("b"));
55+
EXPECT_FALSE(Pat5->match("c"));
56+
EXPECT_FALSE(Pat5->match("d"));
57+
EXPECT_FALSE(Pat5->match("e"));
58+
EXPECT_FALSE(Pat5->match("f"));
59+
EXPECT_FALSE(Pat5->match("y"));
60+
EXPECT_FALSE(Pat5->match("z"));
61+
EXPECT_FALSE(Pat5->match(""));
11662
}
11763

11864
TEST_F(GlobPatternTest, Invalid) {
11965
Expected<GlobPattern> Pat1 = GlobPattern::create("[");
12066
EXPECT_FALSE((bool)Pat1);
12167
handleAllErrors(Pat1.takeError(), [&](ErrorInfoBase &EIB) {});
122-
123-
Expected<GlobPattern> Pat2 = GlobPattern::create("[]");
124-
EXPECT_FALSE((bool)Pat2);
125-
handleAllErrors(Pat2.takeError(), [&](ErrorInfoBase &EIB) {});
12668
}
12769

12870
TEST_F(GlobPatternTest, ExtSym) {

0 commit comments

Comments
 (0)