blob: 52dc75b4069d16f09358bd651f5a1067b3f9aba5 [file] [log] [blame]
// 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_