diff options
author | Max Kellermann <max@musicpd.org> | 2018-07-24 23:24:42 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2018-07-24 23:24:42 +0200 |
commit | 9263d6d07db61cb7fd3e4b132a37c10a9cfa1a37 (patch) | |
tree | 8338f8da12ca7cb8b875d982cec4e7b200fba43c /src/SongFilter.cxx | |
parent | 5271e81ebe7ee88ad89cd49a5ddcd8a5e04ef7ae (diff) |
SongFilter: implement operator "!="
Closes #89
Diffstat (limited to 'src/SongFilter.cxx')
-rw-r--r-- | src/SongFilter.cxx | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/SongFilter.cxx b/src/SongFilter.cxx index 17867a082..1d691fb67 100644 --- a/src/SongFilter.cxx +++ b/src/SongFilter.cxx @@ -81,7 +81,7 @@ SongFilter::Item::ToExpression() const noexcept { switch (tag) { case LOCATE_TAG_FILE_TYPE: - return "(" LOCATE_TAG_FILE_KEY " == \"" + value + "\")"; + return std::string("(" LOCATE_TAG_FILE_KEY " ") + (IsNegated() ? "!=" : "==") + " \"" + value + "\")"; case LOCATE_TAG_BASE_TYPE: return "(base \"" + value + "\")"; @@ -90,10 +90,10 @@ SongFilter::Item::ToExpression() const noexcept return "(modified-since \"" + value + "\")"; case LOCATE_TAG_ANY_TYPE: - return "(" LOCATE_TAG_ANY_KEY " == \"" + value + "\")"; + return std::string("(" LOCATE_TAG_ANY_KEY " ") + (IsNegated() ? "!=" : "==") + " \"" + value + "\")"; default: - return std::string("(") + tag_item_names[tag] + " == \"" + value + "\")"; + return std::string("(") + tag_item_names[tag] + " " + (IsNegated() ? "!=" : "==") + " \"" + value + "\")"; } } @@ -317,8 +317,11 @@ SongFilter::ParseExpression(const char *s, bool fold_case) items.emplace_back(type, std::move(value), fold_case); return StripLeft(s + 1); } else { - if (s[0] != '=' || s[1] != '=') - throw std::runtime_error("'==' expected"); + bool negated = false; + if (s[0] == '!' && s[1] == '=') + negated = true; + else if (s[0] != '=' || s[1] != '=') + throw std::runtime_error("'==' or '!=' expected"); s = StripLeft(s + 2); auto value = ExpectQuoted(s); @@ -326,6 +329,7 @@ SongFilter::ParseExpression(const char *s, bool fold_case) throw std::runtime_error("')' expected"); items.emplace_back(type, std::move(value), fold_case); + items.back().SetNegated(negated); return StripLeft(s + 1); } } |