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:
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) {}