AK: Make StringUtils::matches() handle escaping correctly

Previously any backslash and the character following it were ignored.
This commit adds a fall through to match the character following the
backslash without checking whether it is "special".
This commit is contained in:
Florian Cramer 2022-12-16 19:20:53 +01:00 committed by Ali Mohammad Pur
parent 0e26f2657e
commit af2ffcaba8
2 changed files with 20 additions and 2 deletions

View file

@ -62,8 +62,11 @@ bool matches(StringView str, StringView mask, CaseSensitivity case_sensitivity,
record_span(string_ptr - string_start, 1);
break;
case '\\':
++mask_ptr;
break;
// if backslash is last character in mask, just treat it as an exact match
// otherwise use it as escape for next character
if (mask_ptr + 1 < mask_end)
++mask_ptr;
[[fallthrough]];
default:
auto p = *mask_ptr;
auto ch = *string_ptr;

View file

@ -76,6 +76,21 @@ TEST_CASE(matches_trailing)
EXPECT(AK::StringUtils::matches("ab"sv, "*ab****"sv));
}
TEST_CASE(match_backslash_escape)
{
EXPECT(AK::StringUtils::matches("ab*"sv, "ab\\*"sv));
EXPECT(!AK::StringUtils::matches("abc"sv, "ab\\*"sv));
EXPECT(!AK::StringUtils::matches("abcd"sv, "ab\\*"sv));
EXPECT(AK::StringUtils::matches("ab?"sv, "ab\\?"sv));
EXPECT(!AK::StringUtils::matches("abc"sv, "ab\\?"sv));
}
TEST_CASE(match_trailing_backslash)
{
EXPECT(AK::StringUtils::matches("x\\"sv, "x\\"sv));
EXPECT(AK::StringUtils::matches("x\\"sv, "x\\\\"sv));
}
TEST_CASE(convert_to_int)
{
auto value = AK::StringUtils::convert_to_int(StringView());