From 887b07aa284af75516fbf54e3db88acbf7e51b0c Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Wed, 21 Aug 2019 22:00:35 +0200 Subject: patterns: Add base class for regular expression matching --- apt-pkg/cachefilter-patterns.cc | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'apt-pkg/cachefilter-patterns.cc') diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc index bf6166ee4..42bc2babb 100644 --- a/apt-pkg/cachefilter-patterns.cc +++ b/apt-pkg/cachefilter-patterns.cc @@ -6,8 +6,12 @@ * SPDX-License-Identifier: GPL-2.0+ */ +#include + #include +#include + namespace APT { namespace Internal @@ -272,6 +276,38 @@ std::string PatternParser::aWord(std::unique_ptr &nodeP return node->word.to_string(); } +namespace Patterns +{ + +BaseRegexMatcher::BaseRegexMatcher(std::string const &Pattern) +{ + pattern = new regex_t; + int const Res = regcomp(pattern, Pattern.c_str(), REG_EXTENDED | REG_ICASE | REG_NOSUB); + if (Res == 0) + return; + + delete pattern; + pattern = NULL; + char Error[300]; + regerror(Res, pattern, Error, sizeof(Error)); + _error->Error(_("Regex compilation error - %s"), Error); +} +bool BaseRegexMatcher::operator()(const char *string) +{ + if (unlikely(pattern == NULL)) + return false; + else + return regexec(pattern, string, 0, 0, 0) == 0; +} +BaseRegexMatcher::~BaseRegexMatcher() +{ + if (pattern == NULL) + return; + regfree(pattern); + delete pattern; +} +} // namespace Patterns + } // namespace Internal // The bridge into the public world -- cgit v1.2.3 From 8428114608627fe0a08dcf1589931f6db025f0b4 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Wed, 21 Aug 2019 22:13:27 +0200 Subject: patterns: Add ?version --- apt-pkg/cachefilter-patterns.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'apt-pkg/cachefilter-patterns.cc') diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc index 42bc2babb..ba341df60 100644 --- a/apt-pkg/cachefilter-patterns.cc +++ b/apt-pkg/cachefilter-patterns.cc @@ -240,6 +240,8 @@ std::unique_ptr PatternParser::aPattern(std::unique_p return std::make_unique(); if (node->matches("?upgradable", 0, 0)) return std::make_unique(file); + if (node->matches("?version", 1, 1)) + return std::make_unique(aWord(node->arguments[0])); if (node->matches("?virtual", 0, 0)) return std::make_unique(); if (node->matches("?x-name-fnmatch", 1, 1)) -- cgit v1.2.3 From 7fa292edbe924923cc689721fe58244ca0a40bcd Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Wed, 21 Aug 2019 22:21:30 +0200 Subject: patterns: Add ?source-name and ?source-version --- apt-pkg/cachefilter-patterns.cc | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'apt-pkg/cachefilter-patterns.cc') diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc index ba341df60..4414792cf 100644 --- a/apt-pkg/cachefilter-patterns.cc +++ b/apt-pkg/cachefilter-patterns.cc @@ -236,6 +236,10 @@ std::unique_ptr PatternParser::aPattern(std::unique_p return std::make_unique(aPattern(node->arguments[0]).release()); if (node->matches("?obsolete", 0, 0)) return std::make_unique(); + if (node->matches("?source-package", 1, 1)) + return std::make_unique(aWord(node->arguments[0])); + if (node->matches("?source-version", 1, 1)) + return std::make_unique(aWord(node->arguments[0])); if (node->matches("?true", 0, 0)) return std::make_unique(); if (node->matches("?upgradable", 0, 0)) -- cgit v1.2.3 From 391c9f20208584bf429c7717047a0637d0d670fb Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Wed, 21 Aug 2019 22:31:01 +0200 Subject: patterns: Add ?archive --- apt-pkg/cachefilter-patterns.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'apt-pkg/cachefilter-patterns.cc') diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc index 4414792cf..aeed31263 100644 --- a/apt-pkg/cachefilter-patterns.cc +++ b/apt-pkg/cachefilter-patterns.cc @@ -214,6 +214,8 @@ std::unique_ptr PatternParser::aPattern(std::unique_p if (node->matches("?architecture", 1, 1)) return std::make_unique(aWord(node->arguments[0])); + if (node->matches("?archive", 1, 1)) + return std::make_unique(aWord(node->arguments[0])); if (node->matches("?automatic", 0, 0)) return std::make_unique(file); if (node->matches("?broken", 0, 0)) -- cgit v1.2.3 From 02b0afd5098534eff34a8fa1d44454c7a3e1ff09 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Wed, 21 Aug 2019 22:53:25 +0200 Subject: patterns: Add ?origin --- apt-pkg/cachefilter-patterns.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'apt-pkg/cachefilter-patterns.cc') diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc index aeed31263..2ba89e5d4 100644 --- a/apt-pkg/cachefilter-patterns.cc +++ b/apt-pkg/cachefilter-patterns.cc @@ -238,6 +238,8 @@ std::unique_ptr PatternParser::aPattern(std::unique_p return std::make_unique(aPattern(node->arguments[0]).release()); if (node->matches("?obsolete", 0, 0)) return std::make_unique(); + if (node->matches("?origin", 1, 1)) + return std::make_unique(aWord(node->arguments[0])); if (node->matches("?source-package", 1, 1)) return std::make_unique(aWord(node->arguments[0])); if (node->matches("?source-version", 1, 1)) -- cgit v1.2.3 From 6801e6d2c63d4ff087024fc84a0feb8aef86886b Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 26 Nov 2019 11:34:34 +0100 Subject: patterns: Add ?any-version --- apt-pkg/cachefilter-patterns.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'apt-pkg/cachefilter-patterns.cc') diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc index 2ba89e5d4..8b8695f71 100644 --- a/apt-pkg/cachefilter-patterns.cc +++ b/apt-pkg/cachefilter-patterns.cc @@ -216,6 +216,8 @@ std::unique_ptr PatternParser::aPattern(std::unique_p return std::make_unique(aWord(node->arguments[0])); if (node->matches("?archive", 1, 1)) return std::make_unique(aWord(node->arguments[0])); + if (node->matches("?any-version", 1, 1)) + return std::make_unique(aPattern(node->arguments[0])); if (node->matches("?automatic", 0, 0)) return std::make_unique(file); if (node->matches("?broken", 0, 0)) -- cgit v1.2.3 From 94b185bb738e063bcc387e31b39dcd041f283766 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 26 Nov 2019 11:45:44 +0100 Subject: patterns: Implement ?narrow(...), as ?any-version(?and(...)) This is pure syntactic sugar - ?narrow does not exist in the abstract syntax. --- apt-pkg/cachefilter-patterns.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'apt-pkg/cachefilter-patterns.cc') diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc index 8b8695f71..f202df796 100644 --- a/apt-pkg/cachefilter-patterns.cc +++ b/apt-pkg/cachefilter-patterns.cc @@ -258,11 +258,13 @@ std::unique_ptr PatternParser::aPattern(std::unique_p return std::make_unique(aWord(node->arguments[0])); // Variable argument patterns - if (node->matches("?and", 0, -1)) + if (node->matches("?and", 0, -1) || node->matches("?narrow", 0, -1)) { auto pattern = std::make_unique(); for (auto &arg : node->arguments) pattern->AND(aPattern(arg).release()); + if (node->term == "?narrow") + return std::make_unique(std::move(pattern)); return pattern; } if (node->matches("?or", 0, -1)) -- cgit v1.2.3 From 96f795bce665a1907b885bd2d57d6ab22b0a4199 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 26 Nov 2019 11:56:28 +0100 Subject: patterns: Add ?all-versions --- apt-pkg/cachefilter-patterns.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'apt-pkg/cachefilter-patterns.cc') diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc index f202df796..8214c388a 100644 --- a/apt-pkg/cachefilter-patterns.cc +++ b/apt-pkg/cachefilter-patterns.cc @@ -216,6 +216,8 @@ std::unique_ptr PatternParser::aPattern(std::unique_p return std::make_unique(aWord(node->arguments[0])); if (node->matches("?archive", 1, 1)) return std::make_unique(aWord(node->arguments[0])); + if (node->matches("?all-versions", 1, 1)) + return std::make_unique(aPattern(node->arguments[0])); if (node->matches("?any-version", 1, 1)) return std::make_unique(aPattern(node->arguments[0])); if (node->matches("?automatic", 0, 0)) -- cgit v1.2.3 From a93b4443c18ee211691f7b336b161fea7d1df699 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 26 Nov 2019 12:01:42 +0100 Subject: patterns: Add ?section --- apt-pkg/cachefilter-patterns.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'apt-pkg/cachefilter-patterns.cc') diff --git a/apt-pkg/cachefilter-patterns.cc b/apt-pkg/cachefilter-patterns.cc index 8214c388a..a9f76ff1d 100644 --- a/apt-pkg/cachefilter-patterns.cc +++ b/apt-pkg/cachefilter-patterns.cc @@ -244,6 +244,8 @@ std::unique_ptr PatternParser::aPattern(std::unique_p return std::make_unique(); if (node->matches("?origin", 1, 1)) return std::make_unique(aWord(node->arguments[0])); + if (node->matches("?section", 1, 1)) + return std::make_unique(aWord(node->arguments[0])); if (node->matches("?source-package", 1, 1)) return std::make_unique(aWord(node->arguments[0])); if (node->matches("?source-version", 1, 1)) -- cgit v1.2.3