blob: 3feb7701706c7468ea05e60760690772798bc45c [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'.
// In addition, a separator placeholder at the end of the pattern can be matched
// by the end of |text|. This should be handled by the clients using the
// following utility functions.
// 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|.
#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;
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