aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-17 18:12:46 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-18 11:25:45 +0900
commit00cc658846e0a980a1a6cfa25c3fda3662b4b912 (patch)
tree8ffeca9545fb10489c7b9d29fa9fb967fb19faa9
parent682b91cc45e3873ce74461a7590d9c75fe4f2a51 (diff)
downloadkati-00cc658846e0a980a1a6cfa25c3fda3662b4b912.tar.gz
[C++] Implement findstring, filter, and filter-out
-rw-r--r--func.cc48
-rw-r--r--strutil.cc7
-rw-r--r--strutil.h2
3 files changed, 51 insertions, 6 deletions
diff --git a/func.cc b/func.cc
index e9fa0d7..e7f304b 100644
--- a/func.cc
+++ b/func.cc
@@ -45,16 +45,52 @@ void SubstFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
AppendString(StringPiece(*str).substr(index), s);
}
-void FindstringFunc(const vector<Value*>&, Evaluator*, string*) {
- printf("TODO(findstring)");
+void FindstringFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
+ shared_ptr<string> find = args[0]->Eval(ev);
+ shared_ptr<string> in = args[1]->Eval(ev);
+ if (in->find(*find) != string::npos)
+ AppendString(*find, s);
}
-void FilterFunc(const vector<Value*>&, Evaluator*, string*) {
- printf("TODO(filter)");
+static void GetPats(const string& pat, vector<StringPiece>* pats) {
+ for (StringPiece tok : WordScanner(pat)) {
+ pats->push_back(tok);
+ }
}
-void FilterOutFunc(const vector<Value*>&, Evaluator*, string*) {
- printf("TODO(filter-out)");
+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;
+ GetPats(*pat_buf, &pats);
+ WordWriter ww(s);
+ for (StringPiece tok : WordScanner(*text)) {
+ for (StringPiece pat : pats) {
+ if (MatchPattern(tok, pat)) {
+ ww.Write(tok);
+ break;
+ }
+ }
+ }
+}
+
+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;
+ GetPats(*pat_buf, &pats);
+ WordWriter ww(s);
+ for (StringPiece tok : WordScanner(*text)) {
+ bool matched = false;
+ for (StringPiece pat : pats) {
+ if (MatchPattern(tok, pat)) {
+ matched = true;
+ break;
+ }
+ }
+ if (!matched)
+ ww.Write(tok);
+ }
}
void SortFunc(const vector<Value*>&, Evaluator*, string*) {
diff --git a/strutil.cc b/strutil.cc
index bc08d9c..1c9805d 100644
--- a/strutil.cc
+++ b/strutil.cc
@@ -155,6 +155,13 @@ void AppendSubstRef(StringPiece str, StringPiece pat, StringPiece subst,
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 b7d1147..66224e7 100644
--- a/strutil.h
+++ b/strutil.h
@@ -72,6 +72,8 @@ void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst,
void AppendSubstRef(StringPiece str, StringPiece pat, StringPiece subst,
string* out);
+bool MatchPattern(StringPiece str, StringPiece pat);
+
string NoLineBreak(const string& s);
StringPiece TrimLeftSpace(StringPiece s);