Skip to content

Commit b632294

Browse files
author
Joel Johnson
committed
Make isValidGlobPattern recognize '**'
1 parent 0b4c55a commit b632294

2 files changed

Lines changed: 45 additions & 9 deletions

File tree

lib/utils.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,19 @@ int caseInsensitiveStringCompare(const std::string &lhs, const std::string &rhs)
4040

4141
bool isValidGlobPattern(const std::string& pattern)
4242
{
43+
int consecutiveAsterisks = 0;
4344
for (auto i = pattern.cbegin(); i != pattern.cend(); ++i) {
44-
if (*i == '*' || *i == '?') {
45-
const auto j = i + 1;
46-
if (j != pattern.cend() && (*j == '*' || *j == '?')) {
45+
if (*i == '*') {
46+
++consecutiveAsterisks;
47+
if ( consecutiveAsterisks > 2 ) {
4748
return false;
4849
}
50+
} else if (*i == '?') {
51+
if (consecutiveAsterisks > 0) {
52+
return false;
53+
}
54+
} else {
55+
consecutiveAsterisks = 0;
4956
}
5057
}
5158
return true;

test/testutils.cpp

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,32 @@ class TestUtils : public TestFixture {
5252
ASSERT_EQUALS(true, ::isValidGlobPattern("x*"));
5353
ASSERT_EQUALS(true, ::isValidGlobPattern("*/x/*"));
5454
ASSERT_EQUALS(true, ::isValidGlobPattern("x/*/z"));
55-
ASSERT_EQUALS(false, ::isValidGlobPattern("**"));
56-
ASSERT_EQUALS(false, ::isValidGlobPattern("**x"));
57-
ASSERT_EQUALS(false, ::isValidGlobPattern("x**"));
55+
ASSERT_EQUALS(true, ::isValidGlobPattern("**"));
56+
ASSERT_EQUALS(true, ::isValidGlobPattern("**x"));
57+
ASSERT_EQUALS(true, ::isValidGlobPattern("x**"));
5858

5959
ASSERT_EQUALS(true, ::isValidGlobPattern("?"));
6060
ASSERT_EQUALS(true, ::isValidGlobPattern("?x"));
6161
ASSERT_EQUALS(true, ::isValidGlobPattern("x?"));
6262
ASSERT_EQUALS(true, ::isValidGlobPattern("?/x/?"));
6363
ASSERT_EQUALS(true, ::isValidGlobPattern("x/?/z"));
64-
ASSERT_EQUALS(false, ::isValidGlobPattern("??"));
65-
ASSERT_EQUALS(false, ::isValidGlobPattern("??x"));
66-
ASSERT_EQUALS(false, ::isValidGlobPattern("x??"));
64+
ASSERT_EQUALS(true, ::isValidGlobPattern("??"));
65+
ASSERT_EQUALS(true, ::isValidGlobPattern("????"));
66+
ASSERT_EQUALS(true, ::isValidGlobPattern("??x"));
67+
ASSERT_EQUALS(true, ::isValidGlobPattern("x??"));
68+
69+
ASSERT_EQUALS(true, ::isValidGlobPattern("?*"));
70+
ASSERT_EQUALS(true, ::isValidGlobPattern("?**"));
71+
ASSERT_EQUALS(false, ::isValidGlobPattern("?***"));
72+
ASSERT_EQUALS(true, ::isValidGlobPattern("???*"));
73+
ASSERT_EQUALS(true, ::isValidGlobPattern("???**"));
74+
ASSERT_EQUALS(false, ::isValidGlobPattern("???***"));
75+
76+
ASSERT_EQUALS(false, ::isValidGlobPattern("*?"));
77+
ASSERT_EQUALS(true, ::isValidGlobPattern("*x?"));
78+
ASSERT_EQUALS(false, ::isValidGlobPattern("**?"));
79+
ASSERT_EQUALS(false, ::isValidGlobPattern("***"));
80+
ASSERT_EQUALS(true, ::isValidGlobPattern("**x*"));
6781
}
6882

6983
void matchglob() const {
@@ -76,11 +90,26 @@ class TestUtils : public TestFixture {
7690
ASSERT_EQUALS(true, ::matchglob("*", "x/y/z"));
7791
ASSERT_EQUALS(true, ::matchglob("*/y/z", "x/y/z"));
7892

93+
ASSERT_EQUALS(true, ::matchglob("**", ""));
94+
ASSERT_EQUALS(true, ::matchglob("**", "abcdefg"));
95+
ASSERT_EQUALS(true, ::matchglob("**", "abcde/foo/bar"));
96+
ASSERT_EQUALS(false, ::matchglob("*/**", "abcde"));
97+
ASSERT_EQUALS(true, ::matchglob("*/**", "abcde/foo"));
98+
ASSERT_EQUALS(true, ::matchglob("*/**", "abcde/foo/bar"));
99+
79100
ASSERT_EQUALS(false, ::matchglob("?", "xyz"));
80101
ASSERT_EQUALS(false, ::matchglob("x?", "xyz"));
81102
ASSERT_EQUALS(false, ::matchglob("?z", "xyz"));
82103
ASSERT_EQUALS(true, ::matchglob("?y?", "xyz"));
83104
ASSERT_EQUALS(true, ::matchglob("?/?/?", "x/y/z"));
105+
106+
ASSERT_EQUALS(true, ::matchglob("??", "xy"));
107+
ASSERT_EQUALS(false, ::matchglob("??", "x"));
108+
ASSERT_EQUALS(false, ::matchglob("??", "xyz"));
109+
110+
ASSERT_EQUALS(true, ::matchglob("????", "wxyz"));
111+
ASSERT_EQUALS(false, ::matchglob("????", "xyz"));
112+
ASSERT_EQUALS(false, ::matchglob("????", "vwxyz"));
84113
}
85114

86115
void isStringLiteral() const {

0 commit comments

Comments
 (0)