| Index: base/strings/string_util.cc
|
| diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc
|
| index e3dcd8542fabcc263cf26f23014669097e9c3ba0..b31eecb3806bb1dc6121ed3f7e7c3c910168461f 100644
|
| --- a/base/strings/string_util.cc
|
| +++ b/base/strings/string_util.cc
|
| @@ -948,161 +948,6 @@ string16 ReplaceStringPlaceholders(const string16& format_string,
|
| return result;
|
| }
|
|
|
| -static bool IsWildcard(base_icu::UChar32 character) {
|
| - return character == '*' || character == '?';
|
| -}
|
| -
|
| -// Move the strings pointers to the point where they start to differ.
|
| -template <typename CHAR, typename NEXT>
|
| -static void EatSameChars(const CHAR** pattern, const CHAR* pattern_end,
|
| - const CHAR** string, const CHAR* string_end,
|
| - NEXT next) {
|
| - const CHAR* escape = NULL;
|
| - while (*pattern != pattern_end && *string != string_end) {
|
| - if (!escape && IsWildcard(**pattern)) {
|
| - // We don't want to match wildcard here, except if it's escaped.
|
| - return;
|
| - }
|
| -
|
| - // Check if the escapement char is found. If so, skip it and move to the
|
| - // next character.
|
| - if (!escape && **pattern == '\\') {
|
| - escape = *pattern;
|
| - next(pattern, pattern_end);
|
| - continue;
|
| - }
|
| -
|
| - // Check if the chars match, if so, increment the ptrs.
|
| - const CHAR* pattern_next = *pattern;
|
| - const CHAR* string_next = *string;
|
| - base_icu::UChar32 pattern_char = next(&pattern_next, pattern_end);
|
| - if (pattern_char == next(&string_next, string_end) &&
|
| - pattern_char != CBU_SENTINEL) {
|
| - *pattern = pattern_next;
|
| - *string = string_next;
|
| - } else {
|
| - // Uh oh, it did not match, we are done. If the last char was an
|
| - // escapement, that means that it was an error to advance the ptr here,
|
| - // let's put it back where it was. This also mean that the MatchPattern
|
| - // function will return false because if we can't match an escape char
|
| - // here, then no one will.
|
| - if (escape) {
|
| - *pattern = escape;
|
| - }
|
| - return;
|
| - }
|
| -
|
| - escape = NULL;
|
| - }
|
| -}
|
| -
|
| -template <typename CHAR, typename NEXT>
|
| -static void EatWildcard(const CHAR** pattern, const CHAR* end, NEXT next) {
|
| - while (*pattern != end) {
|
| - if (!IsWildcard(**pattern))
|
| - return;
|
| - next(pattern, end);
|
| - }
|
| -}
|
| -
|
| -template <typename CHAR, typename NEXT>
|
| -static bool MatchPatternT(const CHAR* eval, const CHAR* eval_end,
|
| - const CHAR* pattern, const CHAR* pattern_end,
|
| - int depth,
|
| - NEXT next) {
|
| - const int kMaxDepth = 16;
|
| - if (depth > kMaxDepth)
|
| - return false;
|
| -
|
| - // Eat all the matching chars.
|
| - EatSameChars(&pattern, pattern_end, &eval, eval_end, next);
|
| -
|
| - // If the string is empty, then the pattern must be empty too, or contains
|
| - // only wildcards.
|
| - if (eval == eval_end) {
|
| - EatWildcard(&pattern, pattern_end, next);
|
| - return pattern == pattern_end;
|
| - }
|
| -
|
| - // Pattern is empty but not string, this is not a match.
|
| - if (pattern == pattern_end)
|
| - return false;
|
| -
|
| - // If this is a question mark, then we need to compare the rest with
|
| - // the current string or the string with one character eaten.
|
| - const CHAR* next_pattern = pattern;
|
| - next(&next_pattern, pattern_end);
|
| - if (pattern[0] == '?') {
|
| - if (MatchPatternT(eval, eval_end, next_pattern, pattern_end,
|
| - depth + 1, next))
|
| - return true;
|
| - const CHAR* next_eval = eval;
|
| - next(&next_eval, eval_end);
|
| - if (MatchPatternT(next_eval, eval_end, next_pattern, pattern_end,
|
| - depth + 1, next))
|
| - return true;
|
| - }
|
| -
|
| - // This is a *, try to match all the possible substrings with the remainder
|
| - // of the pattern.
|
| - if (pattern[0] == '*') {
|
| - // Collapse duplicate wild cards (********** into *) so that the
|
| - // method does not recurse unnecessarily. http://crbug.com/52839
|
| - EatWildcard(&next_pattern, pattern_end, next);
|
| -
|
| - while (eval != eval_end) {
|
| - if (MatchPatternT(eval, eval_end, next_pattern, pattern_end,
|
| - depth + 1, next))
|
| - return true;
|
| - eval++;
|
| - }
|
| -
|
| - // We reached the end of the string, let see if the pattern contains only
|
| - // wildcards.
|
| - if (eval == eval_end) {
|
| - EatWildcard(&pattern, pattern_end, next);
|
| - if (pattern != pattern_end)
|
| - return false;
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -struct NextCharUTF8 {
|
| - base_icu::UChar32 operator()(const char** p, const char* end) {
|
| - base_icu::UChar32 c;
|
| - int offset = 0;
|
| - CBU8_NEXT(*p, offset, end - *p, c);
|
| - *p += offset;
|
| - return c;
|
| - }
|
| -};
|
| -
|
| -struct NextCharUTF16 {
|
| - base_icu::UChar32 operator()(const char16** p, const char16* end) {
|
| - base_icu::UChar32 c;
|
| - int offset = 0;
|
| - CBU16_NEXT(*p, offset, end - *p, c);
|
| - *p += offset;
|
| - return c;
|
| - }
|
| -};
|
| -
|
| -bool MatchPattern(const base::StringPiece& eval,
|
| - const base::StringPiece& pattern) {
|
| - return MatchPatternT(eval.data(), eval.data() + eval.size(),
|
| - pattern.data(), pattern.data() + pattern.size(),
|
| - 0, NextCharUTF8());
|
| -}
|
| -
|
| -bool MatchPattern(const string16& eval, const string16& pattern) {
|
| - return MatchPatternT(eval.c_str(), eval.c_str() + eval.size(),
|
| - pattern.c_str(), pattern.c_str() + pattern.size(),
|
| - 0, NextCharUTF16());
|
| -}
|
| -
|
| // The following code is compatible with the OpenBSD lcpy interface. See:
|
| // http://www.gratisoft.us/todd/papers/strlcpy.html
|
| // ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/{wcs,str}lcpy.c
|
|
|