| Index: third_party/re2/re2/filtered_re2.cc
|
| diff --git a/third_party/re2/re2/filtered_re2.cc b/third_party/re2/re2/filtered_re2.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9269cee105826e605ec181f8cbe6b45b81ee3d26
|
| --- /dev/null
|
| +++ b/third_party/re2/re2/filtered_re2.cc
|
| @@ -0,0 +1,100 @@
|
| +// Copyright 2009 The RE2 Authors. All Rights Reserved.
|
| +// Use of this source code is governed by a BSD-style
|
| +// license that can be found in the LICENSE file.
|
| +
|
| +#include <string>
|
| +#include "util/util.h"
|
| +#include "re2/filtered_re2.h"
|
| +#include "re2/prefilter.h"
|
| +#include "re2/prefilter_tree.h"
|
| +
|
| +namespace re2 {
|
| +
|
| +FilteredRE2::FilteredRE2()
|
| + : compiled_(false),
|
| + prefilter_tree_(new PrefilterTree()) {
|
| +}
|
| +
|
| +FilteredRE2::~FilteredRE2() {
|
| + for (int i = 0; i < re2_vec_.size(); i++)
|
| + delete re2_vec_[i];
|
| + delete prefilter_tree_;
|
| +}
|
| +
|
| +RE2::ErrorCode FilteredRE2::Add(const StringPiece& pattern,
|
| + const RE2::Options& options, int* id) {
|
| + RE2* re = new RE2(pattern, options);
|
| + RE2::ErrorCode code = re->error_code();
|
| +
|
| + if (!re->ok()) {
|
| + LOG(ERROR) << "Couldn't compile regular expression, skipping: "
|
| + << re << " due to error " << re->error();
|
| + delete re;
|
| + } else {
|
| + *id = re2_vec_.size();
|
| + re2_vec_.push_back(re);
|
| + }
|
| +
|
| + return code;
|
| +}
|
| +
|
| +void FilteredRE2::Compile(vector<string>* atoms) {
|
| + if (compiled_ || re2_vec_.size() == 0) {
|
| + LOG(INFO) << "C: " << compiled_ << " S:" << re2_vec_.size();
|
| + return;
|
| + }
|
| +
|
| + for (int i = 0; i < re2_vec_.size(); i++) {
|
| + Prefilter* prefilter = Prefilter::FromRE2(re2_vec_[i]);
|
| + prefilter_tree_->Add(prefilter);
|
| + }
|
| + atoms->clear();
|
| + prefilter_tree_->Compile(atoms);
|
| + compiled_ = true;
|
| +}
|
| +
|
| +int FilteredRE2::SlowFirstMatch(const StringPiece& text) const {
|
| + for (int i = 0; i < re2_vec_.size(); i++)
|
| + if (RE2::PartialMatch(text, *re2_vec_[i]))
|
| + return i;
|
| + return -1;
|
| +}
|
| +
|
| +int FilteredRE2::FirstMatch(const StringPiece& text,
|
| + const vector<int>& atoms) const {
|
| + if (!compiled_) {
|
| + LOG(DFATAL) << "FirstMatch called before Compile";
|
| + return -1;
|
| + }
|
| + vector<int> regexps;
|
| + prefilter_tree_->RegexpsGivenStrings(atoms, ®exps);
|
| + for (int i = 0; i < regexps.size(); i++)
|
| + if (RE2::PartialMatch(text, *re2_vec_[regexps[i]]))
|
| + return regexps[i];
|
| + return -1;
|
| +}
|
| +
|
| +bool FilteredRE2::AllMatches(
|
| + const StringPiece& text,
|
| + const vector<int>& atoms,
|
| + vector<int>* matching_regexps) const {
|
| + matching_regexps->clear();
|
| + vector<int> regexps;
|
| + prefilter_tree_->RegexpsGivenStrings(atoms, ®exps);
|
| + for (int i = 0; i < regexps.size(); i++)
|
| + if (RE2::PartialMatch(text, *re2_vec_[regexps[i]]))
|
| + matching_regexps->push_back(regexps[i]);
|
| + return !matching_regexps->empty();
|
| +}
|
| +
|
| +void FilteredRE2::RegexpsGivenStrings(const vector<int>& matched_atoms,
|
| + vector<int>* passed_regexps) {
|
| + prefilter_tree_->RegexpsGivenStrings(matched_atoms, passed_regexps);
|
| +}
|
| +
|
| +
|
| +void FilteredRE2::PrintPrefilter(int regexpid) {
|
| + prefilter_tree_->PrintPrefilter(regexpid);
|
| +}
|
| +
|
| +} // namespace re2
|
|
|