diff options
author | Julian Andres Klode <julian.klode@canonical.com> | 2020-01-28 23:06:08 +0100 |
---|---|---|
committer | Julian Andres Klode <julian.klode@canonical.com> | 2020-02-03 12:55:54 +0100 |
commit | ebe5f39bfbb64921d5d31e0a6e49287356a5e6e2 (patch) | |
tree | 67f72466337eb422af4a850e4eb4f48e0da330a0 /apt-pkg/cachefilter-patterns.cc | |
parent | 8d4967d3a187dd66cf14b070a9db63f8ea21b21f (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.cc | 18 |
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(); } |