diff options
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/cacheset.cc | 33 | ||||
-rw-r--r-- | apt-pkg/cacheset.h | 23 |
2 files changed, 56 insertions, 0 deletions
diff --git a/apt-pkg/cacheset.cc b/apt-pkg/cacheset.cc index c0b06ba32..43ade4b4e 100644 --- a/apt-pkg/cacheset.cc +++ b/apt-pkg/cacheset.cc @@ -76,6 +76,39 @@ PackageSet PackageSet::FromRegEx(pkgCacheFile &Cache, std::string pattern, std:: return pkgset; } /*}}}*/ +// GroupedFromCommandLine - Return all versions specified on commandline/*{{{*/ +std::map<unsigned short, PackageSet> PackageSet::GroupedFromCommandLine( + pkgCacheFile &Cache, const char **cmdline, + std::list<PackageSet::Modifier> const &mods, + unsigned short const &fallback, std::ostream &out) { + std::map<unsigned short, PackageSet> pkgsets; + for (const char **I = cmdline; *I != 0; ++I) { + unsigned short modID = fallback; + std::string str = *I; + for (std::list<PackageSet::Modifier>::const_iterator mod = mods.begin(); + mod != mods.end(); ++mod) { + size_t const alength = strlen(mod->Alias); + switch(mod->Pos) { + case PackageSet::Modifier::POSTFIX: + if (str.compare(str.length() - alength, alength, + mod->Alias, 0, alength) != 0) + continue; + str.erase(str.length() - alength); + modID = mod->ID; + break; + case PackageSet::Modifier::PREFIX: + continue; + case PackageSet::Modifier::NONE: + continue; + } + break; + } + PackageSet pset = PackageSet::FromString(Cache, str, out); + pkgsets[modID].insert(pset.begin(), pset.end()); + } + return pkgsets; +} + /*}}}*/ // FromCommandLine - Return all packages specified on commandline /*{{{*/ PackageSet PackageSet::FromCommandLine(pkgCacheFile &Cache, const char **cmdline, std::ostream &out) { PackageSet pkgset; diff --git a/apt-pkg/cacheset.h b/apt-pkg/cacheset.h index 0f3a87a3d..c9d121083 100644 --- a/apt-pkg/cacheset.h +++ b/apt-pkg/cacheset.h @@ -11,6 +11,8 @@ // Include Files /*{{{*/ #include <iostream> #include <fstream> +#include <list> +#include <map> #include <set> #include <string> @@ -101,6 +103,27 @@ public: /*{{{*/ std::ostream out (std::ofstream("/dev/null").rdbuf()); return APT::PackageSet::FromCommandLine(Cache, cmdline, out); } + + struct Modifier { + enum Position { NONE, PREFIX, POSTFIX }; + unsigned short ID; + const char * const Alias; + Position Pos; + Modifier (unsigned short const &id, const char * const alias, Position const &pos) : ID(id), Alias(alias), Pos(pos) {}; + }; + + static std::map<unsigned short, PackageSet> GroupedFromCommandLine( + pkgCacheFile &Cache, const char **cmdline, + std::list<PackageSet::Modifier> const &mods, + unsigned short const &fallback, std::ostream &out); + static std::map<unsigned short, PackageSet> GroupedFromCommandLine( + pkgCacheFile &Cache, const char **cmdline, + std::list<PackageSet::Modifier> const &mods, + unsigned short const &fallback) { + std::ostream out (std::ofstream("/dev/null").rdbuf()); + return APT::PackageSet::GroupedFromCommandLine(Cache, cmdline, + mods, fallback, out); + } /*}}}*/ }; /*}}}*/ class VersionSet : public std::set<pkgCache::VerIterator> { /*{{{*/ |