Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: third_party/re2/re2/set.cc

Issue 10575037: Include RE2 library (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Less intrusive fix for Android Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/re2/re2/set.h ('k') | third_party/re2/re2/simplify.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/re2/re2/set.cc
diff --git a/third_party/re2/re2/set.cc b/third_party/re2/re2/set.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2bcd30acb486dc379b7dd3d04ca831402ceae3ed
--- /dev/null
+++ b/third_party/re2/re2/set.cc
@@ -0,0 +1,113 @@
+// Copyright 2010 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 "re2/set.h"
+
+#include "util/util.h"
+#include "re2/stringpiece.h"
+#include "re2/prog.h"
+#include "re2/re2.h"
+#include "re2/regexp.h"
+
+using namespace re2;
+
+RE2::Set::Set(const RE2::Options& options, RE2::Anchor anchor) {
+ options_.Copy(options);
+ anchor_ = anchor;
+ prog_ = NULL;
+ compiled_ = false;
+}
+
+RE2::Set::~Set() {
+ for (int i = 0; i < re_.size(); i++)
+ re_[i]->Decref();
+ delete prog_;
+}
+
+int RE2::Set::Add(const StringPiece& pattern, string* error) {
+ if (compiled_) {
+ LOG(DFATAL) << "RE2::Set::Add after Compile";
+ return -1;
+ }
+
+ Regexp::ParseFlags pf = static_cast<Regexp::ParseFlags>(
+ options_.ParseFlags());
+
+ RegexpStatus status;
+ re2::Regexp* re = Regexp::Parse(pattern, pf, &status);
+ if (re == NULL) {
+ if (error != NULL)
+ *error = status.Text();
+ if (options_.log_errors())
+ LOG(ERROR) << "Error parsing '" << pattern << "': " << status.Text();
+ return -1;
+ }
+
+ // Concatenate with match index and push on vector.
+ int n = re_.size();
+ re2::Regexp* m = re2::Regexp::HaveMatch(n, pf);
+ if (re->op() == kRegexpConcat) {
+ int nsub = re->nsub();
+ re2::Regexp** sub = new re2::Regexp*[nsub + 1];
+ for (int i = 0; i < nsub; i++)
+ sub[i] = re->sub()[i]->Incref();
+ sub[nsub] = m;
+ re->Decref();
+ re = re2::Regexp::Concat(sub, nsub + 1, pf);
+ delete[] sub;
+ } else {
+ re2::Regexp* sub[2];
+ sub[0] = re;
+ sub[1] = m;
+ re = re2::Regexp::Concat(sub, 2, pf);
+ }
+ re_.push_back(re);
+ return n;
+}
+
+bool RE2::Set::Compile() {
+ if (compiled_) {
+ LOG(DFATAL) << "RE2::Set::Compile multiple times";
+ return false;
+ }
+ compiled_ = true;
+
+ Regexp::ParseFlags pf = static_cast<Regexp::ParseFlags>(
+ options_.ParseFlags());
+ re2::Regexp* re = re2::Regexp::Alternate(const_cast<re2::Regexp**>(&re_[0]),
+ re_.size(), pf);
+ re_.clear();
+ re2::Regexp* sre = re->Simplify();
+ re->Decref();
+ re = sre;
+ if (re == NULL) {
+ if (options_.log_errors())
+ LOG(ERROR) << "Error simplifying during Compile.";
+ return false;
+ }
+
+ prog_ = Prog::CompileSet(options_, anchor_, re);
+ return prog_ != NULL;
+}
+
+bool RE2::Set::Match(const StringPiece& text, vector<int>* v) const {
+ if (!compiled_) {
+ LOG(DFATAL) << "RE2::Set::Match without Compile";
+ return false;
+ }
+ v->clear();
+ bool failed;
+ bool ret = prog_->SearchDFA(text, text, Prog::kAnchored,
+ Prog::kManyMatch, NULL, &failed, v);
+ if (failed)
+ LOG(DFATAL) << "RE2::Set::Match: DFA ran out of cache space";
+
+ if (ret == false)
+ return false;
+ if (v->size() == 0) {
+ LOG(DFATAL) << "RE2::Set::Match: match but unknown regexp set";
+ return false;
+ }
+ return true;
+}
« no previous file with comments | « third_party/re2/re2/set.h ('k') | third_party/re2/re2/simplify.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698