diff options
author | Julian Andres Klode <julian.klode@canonical.com> | 2020-01-28 21:46:10 +0100 |
---|---|---|
committer | Julian Andres Klode <julian.klode@canonical.com> | 2020-02-03 12:55:54 +0100 |
commit | 8d4967d3a187dd66cf14b070a9db63f8ea21b21f (patch) | |
tree | 12b7f35d7ec901dc9feeb5cc3c060432c5a65bf9 /apt-pkg/cachefilter-patterns.cc | |
parent | fd43b1694f1382a3a47f5dc546ebe3d39fcd6e7d (diff) |
patterns: Implement unary !
Diffstat (limited to 'apt-pkg/cachefilter-patterns.cc')
-rw-r--r-- | apt-pkg/cachefilter-patterns.cc | 28 |
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; |