summaryrefslogtreecommitdiff
path: root/apt-pkg/cachefilter-patterns.cc
diff options
context:
space:
mode:
authorJulian Andres Klode <julian.klode@canonical.com>2020-01-28 23:06:08 +0100
committerJulian Andres Klode <julian.klode@canonical.com>2020-02-03 12:55:54 +0100
commitebe5f39bfbb64921d5d31e0a6e49287356a5e6e2 (patch)
tree67f72466337eb422af4a850e4eb4f48e0da330a0 /apt-pkg/cachefilter-patterns.cc
parent8d4967d3a187dd66cf14b070a9db63f8ea21b21f (diff)
patterns: Allow bare words only in arguments
This changes the syntax from approximately expr = unary unary = '!'? primary primary = pattern | short-pattern | word | quoted-word pattern = '?' name [ '(' expr [',' expr]* ')' ] short-pattern = ~ name | ~name expr to: primary = pattern | short-pattern argument = word | quoted-word | expr pattern = '?' name [ '(' argument [',' argument]* ')' ] short-pattern = ~ name | ~name argument
Diffstat (limited to 'apt-pkg/cachefilter-patterns.cc')
-rw-r--r--apt-pkg/cachefilter-patterns.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc
index 9fab0281d..cf3e59ac6 100644
--- a/apt-pkg/cachefilter-patterns.cc
+++ b/apt-pkg/cachefilter-patterns.cc
@@ -58,6 +58,9 @@ std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parseTop()
auto node = parse();
skipSpace();
+ if (node == nullptr)
+ throw Error{Node{0, sentence.size()}, "Expected pattern"};
+
if (node->end != sentence.size())
throw Error{Node{node->end, sentence.size()}, "Expected end of file"};
@@ -98,10 +101,19 @@ std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parsePrimary()
return node;
if ((node = parsePattern()) != nullptr)
return node;
+
+ return nullptr;
+}
+
+std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parseArgument()
+{
+ std::unique_ptr<Node> node;
if ((node = parseQuotedWord()) != nullptr)
return node;
if ((node = parseWord()) != nullptr)
return node;
+ if ((node = parse()) != nullptr)
+ return node;
throw Error{Node{state.offset, sentence.size()},
"Expected pattern, quoted word, or word"};
@@ -125,7 +137,7 @@ std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parseShortPattern()
state.offset += sp.shortName.size() + 1;
if (sp.takesArgument)
{
- node->arguments.push_back(parse());
+ node->arguments.push_back(parseArgument());
node->haveArgumentList = true;
}
node->end = state.offset;
@@ -173,7 +185,7 @@ std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parsePattern()
return node;
}
- node->arguments.push_back(parse());
+ node->arguments.push_back(parseArgument());
skipSpace();
while (sentence[state.offset] == ',')
{
@@ -182,7 +194,7 @@ std::unique_ptr<PatternTreeParser::Node> PatternTreeParser::parsePattern()
// This was a trailing comma - allow it and break the loop
if (sentence[state.offset] == ')')
break;
- node->arguments.push_back(parse());
+ node->arguments.push_back(parseArgument());
skipSpace();
}