diff options
author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-17 18:12:46 +0900 |
---|---|---|
committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-18 11:25:45 +0900 |
commit | 00cc658846e0a980a1a6cfa25c3fda3662b4b912 (patch) | |
tree | 8ffeca9545fb10489c7b9d29fa9fb967fb19faa9 | |
parent | 682b91cc45e3873ce74461a7590d9c75fe4f2a51 (diff) | |
download | kati-00cc658846e0a980a1a6cfa25c3fda3662b4b912.tar.gz |
[C++] Implement findstring, filter, and filter-out
-rw-r--r-- | func.cc | 48 | ||||
-rw-r--r-- | strutil.cc | 7 | ||||
-rw-r--r-- | strutil.h | 2 |
3 files changed, 51 insertions, 6 deletions
@@ -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*) { @@ -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) @@ -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); |