11767c5feSopenharmony_ci/*
21767c5feSopenharmony_ci * Copyright (C) 2014 The Libphonenumber Authors
31767c5feSopenharmony_ci *
41767c5feSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
51767c5feSopenharmony_ci * you may not use this file except in compliance with the License.
61767c5feSopenharmony_ci * You may obtain a copy of the License at
71767c5feSopenharmony_ci *
81767c5feSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
91767c5feSopenharmony_ci *
101767c5feSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
111767c5feSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
121767c5feSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131767c5feSopenharmony_ci * See the License for the specific language governing permissions and
141767c5feSopenharmony_ci * limitations under the License.
151767c5feSopenharmony_ci */
161767c5feSopenharmony_ci
171767c5feSopenharmony_ci#include "phonenumbers/regex_based_matcher.h"
181767c5feSopenharmony_ci
191767c5feSopenharmony_ci#include <string>
201767c5feSopenharmony_ci
211767c5feSopenharmony_ci#include "phonenumbers/base/memory/scoped_ptr.h"
221767c5feSopenharmony_ci#include "phonenumbers/phonemetadata.pb.h"
231767c5feSopenharmony_ci#include "phonenumbers/regexp_adapter.h"
241767c5feSopenharmony_ci#include "phonenumbers/regexp_cache.h"
251767c5feSopenharmony_ci#include "phonenumbers/regexp_factory.h"
261767c5feSopenharmony_ci
271767c5feSopenharmony_cinamespace i18n {
281767c5feSopenharmony_cinamespace phonenumbers {
291767c5feSopenharmony_ci
301767c5feSopenharmony_ci// Same implementations of AbstractRegExpFactory and RegExpCache in
311767c5feSopenharmony_ci// PhoneNumberUtil (copy from phonenumberutil.cc).
321767c5feSopenharmony_ciRegexBasedMatcher::RegexBasedMatcher()
331767c5feSopenharmony_ci    : regexp_factory_(new RegExpFactory()),
341767c5feSopenharmony_ci      regexp_cache_(new RegExpCache(*regexp_factory_, 128)) {}
351767c5feSopenharmony_ci
361767c5feSopenharmony_ciRegexBasedMatcher::~RegexBasedMatcher() {}
371767c5feSopenharmony_ci
381767c5feSopenharmony_cibool RegexBasedMatcher::MatchNationalNumber(
391767c5feSopenharmony_ci    const string& number,
401767c5feSopenharmony_ci    const PhoneNumberDesc& number_desc,
411767c5feSopenharmony_ci    bool allow_prefix_match) const {
421767c5feSopenharmony_ci  const string& national_number_pattern = number_desc.national_number_pattern();
431767c5feSopenharmony_ci  // We don't want to consider it a prefix match when matching non-empty input
441767c5feSopenharmony_ci  // against an empty pattern.
451767c5feSopenharmony_ci  if (national_number_pattern.empty()) {
461767c5feSopenharmony_ci    return false;
471767c5feSopenharmony_ci  }
481767c5feSopenharmony_ci  return Match(number, national_number_pattern, allow_prefix_match);
491767c5feSopenharmony_ci}
501767c5feSopenharmony_ci
511767c5feSopenharmony_cibool RegexBasedMatcher::Match(
521767c5feSopenharmony_ci    const string& number,
531767c5feSopenharmony_ci    const string& number_pattern,
541767c5feSopenharmony_ci    bool allow_prefix_match) const {
551767c5feSopenharmony_ci  const RegExp& regexp(regexp_cache_->GetRegExp(number_pattern));
561767c5feSopenharmony_ci
571767c5feSopenharmony_ci  if (regexp.FullMatch(number)) {
581767c5feSopenharmony_ci    return true;
591767c5feSopenharmony_ci  }
601767c5feSopenharmony_ci  const scoped_ptr<RegExpInput> normalized_number_input(
611767c5feSopenharmony_ci      regexp_factory_->CreateInput(number));
621767c5feSopenharmony_ci  return regexp.Consume(normalized_number_input.get())
631767c5feSopenharmony_ci      ? allow_prefix_match
641767c5feSopenharmony_ci      : false;
651767c5feSopenharmony_ci}
661767c5feSopenharmony_ci
671767c5feSopenharmony_ci}  // namespace phonenumbers
681767c5feSopenharmony_ci}  // namespace i18n
69