reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit a5430e2d5db849489162637907161590f02f5a37
parent 1f55438fe975ba4a9085da5f5c8927f61d7f2dbf
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Sun, 26 Jan 2020 21:49:18 -0500

filter: refactor quoted text parsing

Diffstat:
Msrc/filter.cpp | 31++++++++++++++-----------------
Msrc/filter.hpp | 4++--
2 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/src/filter.cpp b/src/filter.cpp @@ -27,35 +27,32 @@ Filter::Filter(const std::string &input) void Filter::set(const std::string &input) { - enum State { Default, DoubleQuote, SingleQuote }; - m_input = input; m_root.clear(); std::string buf; + char quote = 0; int flags = 0; - State state = Default; Group *group = &m_root; for(const char c : input) { - if(c == '"' && state != SingleQuote) { - state = state == Default ? DoubleQuote : Default; - flags |= Node::QuotedFlag; - continue; - } - else if(c == '\'' && state != DoubleQuote) { - state = state == Default ? SingleQuote : Default; - flags |= Node::QuotedFlag; + if((c == '"' || c == '\'') && (!quote || quote == c)) { + if(quote) + quote = 0; + else { + flags |= Node::LiteralFlag | Node::FullWordFlag; + quote = c; + } continue; } else if(c == '\x20') { - if(state == Default) { + if(quote) + flags &= ~Node::FullWordFlag; + else { group = group->push(buf, &flags); buf.clear(); continue; } - else - flags |= Node::PhraseFlag; } buf += c; @@ -82,7 +79,7 @@ Filter::Group *Filter::Group::push(std::string buf, int *flags) if(buf.empty()) return this; - if((*flags & QuotedFlag) == 0) { + if(!(*flags & LiteralFlag)) { if(buf == "NOT") { *flags ^= Token::NotFlag; return this; @@ -119,7 +116,7 @@ Filter::Group *Filter::Group::push(std::string buf, int *flags) if(buf.size() > 1 && buf.front() == '^') { *flags |= Node::StartAnchorFlag; - buf.erase(0, 1); // we need to recheck the size() below, for '$' + buf.erase(0, 1); // we need to recheck the size below, for '$' } if(buf.size() > 1 && buf.back() == '$') { *flags |= Node::EndAnchorFlag; @@ -193,7 +190,7 @@ bool Filter::Token::matchRow(const std::string &str) const return false; if(test(EndAnchorFlag) && !isEnd) return false; - if(test(QuotedFlag) && !test(PhraseFlag)) { + if(test(FullWordFlag)) { return (isStart || !isalnum(str[pos - 1])) && (isEnd || !isalnum(str[pos + m_buf.size()])); diff --git a/src/filter.hpp b/src/filter.hpp @@ -41,9 +41,9 @@ private: enum Flag { StartAnchorFlag = 1<<0, EndAnchorFlag = 1<<1, - QuotedFlag = 1<<2, + LiteralFlag = 1<<2, NotFlag = 1<<3, - PhraseFlag = 1<<4, + FullWordFlag = 1<<4, }; Node(int flags) : m_flags(flags) {}