summaryrefslogtreecommitdiff
path: root/apt-pkg/cachefilter-patterns.cc
diff options
context:
space:
mode:
authorJulian Andres Klode <julian.klode@canonical.com>2020-01-28 21:46:10 +0100
committerJulian Andres Klode <julian.klode@canonical.com>2020-02-03 12:55:54 +0100
commit8d4967d3a187dd66cf14b070a9db63f8ea21b21f (patch)
tree12b7f35d7ec901dc9feeb5cc3c060432c5a65bf9 /apt-pkg/cachefilter-patterns.cc
parentfd43b1694f1382a3a47f5dc546ebe3d39fcd6e7d (diff)
patterns: Implement unary !
Diffstat (limited to 'apt-pkg/cachefilter-patterns.cc')
-rw-r--r--apt-pkg/cachefilter-patterns.cc28
1 files changed, 27 insertions, 1 deletions
diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc
index 11ad5d723..9fab0281d 100644
--- a/apt-pkg/cachefilter-patterns.cc
+++ b/apt-pkg/cachefilter-patterns.cc
@@ -67,6 +67,32 @@ std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parseTop()
// Parse any pattern
std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parse()
{
+ return parseUnary();
+}
+
+std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parseUnary()
+{
+
+ if (sentence[state.offset] != '!')
+ return parsePrimary();
+
+ auto start = ++state.offset;
+ auto primary = parsePrimary();
+
+ if (primary == nullptr)
+ throw Error{Node{start, sentence.size()}, "Expected pattern"};
+
+ auto node = std::make_unique<PatternNode>();
+ node->start = start;
+ node->end = primary->end;
+ node->term = "?not";
+ node->arguments.push_back(std::move(primary));
+ node->haveArgumentList = true;
+ return node;
+}
+
+std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parsePrimary()
+{
std::unique_ptr<Node> node;
if ((node = parseShortPattern()) != nullptr)
return node;
@@ -198,7 +224,7 @@ std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parseQuotedWord()
// Parse a bare word atom
std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parseWord()
{
- static const constexpr auto DISALLOWED_START = "?~,()\0"_sv;
+ static const constexpr auto DISALLOWED_START = "!?~,()\0"_sv;
static const constexpr auto DISALLOWED = ",()\0"_sv;
if (DISALLOWED_START.find(sentence[state.offset]) != APT::StringView::npos)
return nullptr;