| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // The separator placeholder '^' symbol is used in subpatterns to match any |
| // separator character, which is any ASCII symbol except letters, digits, and |
| // the following: '_', '-', '.', '%'. Note that the separator placeholder |
| // character '^' is itself a separator, as well as '\0'. |
| // TODO(pkalinnikov): In addition, a separator placeholder at the end of the |
| // pattern can be matched by the end of |text|. |
| // |
| // We define a fuzzy occurrence as an occurrence of a |subpattern| in |text| |
| // such that all its non-placeholder characters are equal to the corresponding |
| // characters of the |text|, whereas each '^' placeholder can correspond to any |
| // type of separator in |text|. |
| |
| #ifndef COMPONENTS_URL_PATTERN_INDEX_FUZZY_PATTERN_MATCHING_H_ |
| #define COMPONENTS_URL_PATTERN_INDEX_FUZZY_PATTERN_MATCHING_H_ |
| |
| #include <stddef.h> |
| |
| #include "base/strings/string_piece.h" |
| |
| namespace url_pattern_index { |
| |
| constexpr char kSeparatorPlaceholder = '^'; |
| |
| inline bool IsAscii(char c) { |
| return !(c & ~0x7F); |
| } |
| |
| inline bool IsAlphaNumericAscii(char c) { |
| if (c <= '9') |
| return c >= '0'; |
| c |= 0x20; // Puts all alphabetics (and only them) into the 'a'-'z' range. |
| return c >= 'a' && c <= 'z'; |
| } |
| |
| // Returns whether |c| is a separator. |
| inline bool IsSeparator(char c) { |
| switch (c) { |
| case '_': |
| case '-': |
| case '.': |
| case '%': |
| return false; |
| case kSeparatorPlaceholder: |
| return true; |
| default: |
| return !IsAlphaNumericAscii(c) && IsAscii(c); |
| } |
| } |
| |
| // Returns whether |text| starts with a fuzzy occurrence of |subpattern|. |
| bool StartsWithFuzzy(base::StringPiece text, base::StringPiece subpattern); |
| |
| // Returns whether |text| ends with a fuzzy occurrence of |subpattern|. |
| bool EndsWithFuzzy(base::StringPiece text, base::StringPiece subpattern); |
| |
| // Returns the position of the leftmost fuzzy occurrence of a |subpattern| in |
| // the |text| starting no earlier than |from| the specified position. |
| size_t FindFuzzy(base::StringPiece text, |
| base::StringPiece subpattern, |
| size_t from = 0); |
| |
| } // namespace url_pattern_index |
| |
| #endif // COMPONENTS_URL_PATTERN_INDEX_FUZZY_PATTERN_MATCHING_H_ |