aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-18 20:11:19 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-19 12:49:20 +0900
commita6a17a4a4ae66ecbdc66ee977131360741bdc5b2 (patch)
tree0467dcb09ee513faeafaa2b6ccad2e86417956df
parentfdb56dc43bd5976e201585e69384ed66f8215270 (diff)
downloadandroid_build_kati-a6a17a4a4ae66ecbdc66ee977131360741bdc5b2.tar.gz
android_build_kati-a6a17a4a4ae66ecbdc66ee977131360741bdc5b2.tar.bz2
android_build_kati-a6a17a4a4ae66ecbdc66ee977131360741bdc5b2.zip
[C++] Refactor pattern functions in strutil
-rw-r--r--func.cc25
-rw-r--r--strutil.cc48
-rw-r--r--strutil.h19
-rw-r--r--strutil_test.cc2
-rw-r--r--value.cc5
5 files changed, 60 insertions, 39 deletions
diff --git a/func.cc b/func.cc
index 9e33f35..a47d55f 100644
--- a/func.cc
+++ b/func.cc
@@ -20,13 +20,14 @@
namespace {
void PatsubstFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
- shared_ptr<string> pat = args[0]->Eval(ev);
+ shared_ptr<string> pat_str = args[0]->Eval(ev);
shared_ptr<string> repl = args[1]->Eval(ev);
shared_ptr<string> str = args[2]->Eval(ev);
WordWriter ww(s);
+ Pattern pat(*pat_str);
for (StringPiece tok : WordScanner(*str)) {
ww.MaybeAddWhitespace();
- AppendSubstPattern(tok, *pat, *repl, s);
+ pat.AppendSubst(tok, *repl, s);
}
}
@@ -64,12 +65,14 @@ void FindstringFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
void FilterFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
shared_ptr<string> pat_buf = args[0]->Eval(ev);
shared_ptr<string> text = args[1]->Eval(ev);
- vector<StringPiece> pats;
- WordScanner(*pat_buf).Split(&pats);
+ vector<Pattern> pats;
+ for (StringPiece pat : WordScanner(*pat_buf)) {
+ pats.push_back(Pattern(pat));
+ }
WordWriter ww(s);
for (StringPiece tok : WordScanner(*text)) {
- for (StringPiece pat : pats) {
- if (MatchPattern(tok, pat)) {
+ for (const Pattern& pat : pats) {
+ if (pat.Match(tok)) {
ww.Write(tok);
break;
}
@@ -80,13 +83,15 @@ void FilterFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
void FilterOutFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
shared_ptr<string> pat_buf = args[0]->Eval(ev);
shared_ptr<string> text = args[1]->Eval(ev);
- vector<StringPiece> pats;
- WordScanner(*pat_buf).Split(&pats);
+ vector<Pattern> pats;
+ for (StringPiece pat : WordScanner(*pat_buf)) {
+ pats.push_back(Pattern(pat));
+ }
WordWriter ww(s);
for (StringPiece tok : WordScanner(*text)) {
bool matched = false;
- for (StringPiece pat : pats) {
- if (MatchPattern(tok, pat)) {
+ for (const Pattern& pat : pats) {
+ if (pat.Match(tok)) {
matched = true;
break;
}
diff --git a/strutil.cc b/strutil.cc
index f76a2ab..03eeb49 100644
--- a/strutil.cc
+++ b/strutil.cc
@@ -133,11 +133,25 @@ StringPiece TrimSuffix(StringPiece str, StringPiece suffix) {
return str.substr(0, size_diff);
}
-void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst,
- string* out) {
- size_t pat_percent_index = pat.find('%');
- if (pat_percent_index == string::npos) {
- if (str == pat) {
+Pattern::Pattern(StringPiece pat)
+ : pat_(pat), percent_index_(pat.find('%')) {
+}
+
+bool Pattern::Match(StringPiece str) const {
+ if (percent_index_ == string::npos)
+ return str == pat_;
+ return MatchImpl(str);
+}
+
+bool Pattern::MatchImpl(StringPiece str) const {
+ return (HasPrefix(str, pat_.substr(0, percent_index_)) &&
+ HasSuffix(str, pat_.substr(percent_index_ + 1)));
+}
+
+void Pattern::AppendSubst(StringPiece str, StringPiece subst,
+ string* out) const {
+ if (percent_index_ == string::npos) {
+ if (str == pat_) {
AppendString(subst, out);
return;
} else {
@@ -146,16 +160,15 @@ void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst,
}
}
- if (HasPrefix(str, pat.substr(0, pat_percent_index)) &&
- HasSuffix(str, pat.substr(pat_percent_index + 1))) {
+ if (MatchImpl(str)) {
size_t subst_percent_index = subst.find('%');
if (subst_percent_index == string::npos) {
AppendString(subst, out);
return;
} else {
AppendString(subst.substr(0, subst_percent_index), out);
- AppendString(str.substr(pat_percent_index,
- str.size() - pat.size() + 1), out);
+ AppendString(str.substr(percent_index_,
+ str.size() - pat_.size() + 1), out);
AppendString(subst.substr(subst_percent_index + 1), out);
return;
}
@@ -163,24 +176,17 @@ void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst,
AppendString(str, out);
}
-void AppendSubstRef(StringPiece str, StringPiece pat, StringPiece subst,
- string* out) {
- if (pat.find('%') != string::npos && subst.find('%') != string::npos) {
- AppendSubstPattern(str, pat, subst, out);
+void Pattern::AppendSubstRef(StringPiece str, StringPiece subst,
+ string* out) const {
+ if (percent_index_ != string::npos && subst.find('%') != string::npos) {
+ AppendSubst(str, subst, out);
return;
}
- StringPiece s = TrimSuffix(str, pat);
+ StringPiece s = TrimSuffix(str, pat_);
out->append(s.begin(), s.end());
out->append(subst.begin(), subst.end());
}
-bool MatchPattern(StringPiece str, StringPiece pat) {
- size_t i = pat.find('%');
- if (i == string::npos)
- return str == pat;
- return HasPrefix(str, pat.substr(0, i)) && HasSuffix(str, pat.substr(i+1));
-}
-
string NoLineBreak(const string& s) {
size_t index = s.find('\n');
if (index == string::npos)
diff --git a/strutil.h b/strutil.h
index d7c3785..c0d040f 100644
--- a/strutil.h
+++ b/strutil.h
@@ -79,13 +79,22 @@ bool HasSuffix(StringPiece str, StringPiece suffix);
StringPiece TrimSuffix(StringPiece str, StringPiece suffix);
-void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst,
- string* out);
+class Pattern {
+ public:
+ explicit Pattern(StringPiece pat);
+
+ bool Match(StringPiece str) const;
+
+ void AppendSubst(StringPiece str, StringPiece subst, string* out) const;
-void AppendSubstRef(StringPiece str, StringPiece pat, StringPiece subst,
- string* out);
+ void AppendSubstRef(StringPiece str, StringPiece subst, string* out) const;
-bool MatchPattern(StringPiece str, StringPiece pat);
+ private:
+ bool MatchImpl(StringPiece str) const;
+
+ StringPiece pat_;
+ size_t percent_index_;
+};
string NoLineBreak(const string& s);
diff --git a/strutil_test.cc b/strutil_test.cc
index f08c07d..d014c88 100644
--- a/strutil_test.cc
+++ b/strutil_test.cc
@@ -36,7 +36,7 @@ void TestHasSuffix() {
string SubstPattern(StringPiece str, StringPiece pat, StringPiece subst) {
string r;
- AppendSubstPattern(str, pat, subst, &r);
+ Pattern(pat).AppendSubst(str, subst, &r);
return r;
}
diff --git a/value.cc b/value.cc
index 3dd6e80..bb19fca 100644
--- a/value.cc
+++ b/value.cc
@@ -148,12 +148,13 @@ class VarSubst : public Value {
shared_ptr<string> name = name_->Eval(ev);
Var* v = ev->LookupVar(*name);
shared_ptr<string> value = v->Eval(ev);
- shared_ptr<string> pat = pat_->Eval(ev);
+ shared_ptr<string> pat_str = pat_->Eval(ev);
shared_ptr<string> subst = subst_->Eval(ev);
WordWriter ww(s);
+ Pattern pat(*pat_str);
for (StringPiece tok : WordScanner(*value)) {
ww.MaybeAddWhitespace();
- AppendSubstRef(tok, *pat, *subst, s);
+ pat.AppendSubstRef(tok, *subst, s);
}
}