+
+// VersionMatch::Find - Locate the best match for the select type /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool pkgVersionMatch::VersionMatches(pkgCache::VerIterator Ver)
+{
+ if (Type == Version)
+ {
+ if (MatchVer(Ver.VerStr(),VerStr,VerPrefixMatch) == true)
+ return true;
+ if (ExpressionMatches(VerStr, Ver.VerStr()) == true)
+ return true;
+ return false;
+ }
+
+ for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; ++VF)
+ if (FileMatch(VF.File()) == true)
+ return true;
+
+ return false;
+}
+ /*}}}*/
+
+#ifndef FNM_CASEFOLD
+#define FNM_CASEFOLD 0
+#endif
+
+bool pkgVersionMatch::ExpressionMatches(const char *pattern, const char *string)/*{{{*/
+{
+ if (pattern == NULL || string == NULL)
+ return false;
+ if (pattern[0] == '/') {
+ size_t length = strlen(pattern);
+ if (pattern[length - 1] == '/') {
+ bool res = false;
+ regex_t preg;
+ char *regex = strdup(pattern + 1);
+ regex[length - 2] = '\0';
+ if (regcomp(&preg, regex, REG_EXTENDED | REG_ICASE) != 0) {
+ _error->Warning("Invalid regular expression: %s", regex);
+ } else if (regexec(&preg, string, 0, NULL, 0) == 0) {
+ res = true;
+ }
+ free(regex);
+ regfree(&preg);
+ return res;
+ }
+ }
+ return fnmatch(pattern, string, FNM_CASEFOLD) == 0;
+}
+bool pkgVersionMatch::ExpressionMatches(const std::string& pattern, const char *string)
+{
+ return ExpressionMatches(pattern.c_str(), string);
+}
+ /*}}}*/