1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
/* ######################################################################
Simple wrapper around a std::set to provide a similar interface to
a set of packages as to the complete set of all packages in the
pkgCache.
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
#include <apt-pkg/error.h>
#include <apt-pkg/packageset.h>
#include <apt-pkg/strutl.h>
#include <apti18n.h>
#include <regex.h>
/*}}}*/
namespace APT {
// FromRegEx - Return all packages in the cache matching a pattern /*{{{*/
PackageSet PackageSet::FromRegEx(pkgCache &Cache, const char * const pattern, std::ostream &out) {
PackageSet pkgset;
const char * I;
for (I = pattern; *I != 0; I++)
if (*I == '.' || *I == '?' || *I == '+' || *I == '*' ||
*I == '|' || *I == '[' || *I == '^' || *I == '$')
break;
if (*I == 0)
return pkgset;
regex_t Pattern;
int Res;
if ((Res = regcomp(&Pattern, pattern , REG_EXTENDED | REG_ICASE | REG_NOSUB)) != 0) {
char Error[300];
regerror(Res, &Pattern, Error, sizeof(Error));
_error->Error(_("Regex compilation error - %s"), Error);
return pkgset;
}
for (pkgCache::GrpIterator Grp = Cache.GrpBegin(); Grp.end() == false; ++Grp)
{
if (regexec(&Pattern, Grp.Name(), 0, 0, 0) != 0)
continue;
pkgCache::PkgIterator Pkg = Grp.FindPkg("native");
if (unlikely(Pkg.end() == true))
// FIXME: Fallback to different architectures here?
continue;
ioprintf(out, _("Note, selecting %s for regex '%s'\n"),
Pkg.Name(), pattern);
pkgset.insert(Pkg);
}
regfree(&Pattern);
return pkgset;
}
/*}}}*/
}
|