Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=9eeb4f495ed1d10f92f0015ae68bc8b6e3b7fb0a
commit 9eeb4f495ed1d10f92f0015ae68bc8b6e3b7fb0a Author: Michel Hermier <[email protected]> Date: Sat Aug 16 12:00:21 2014 +0200 libpacman: Partially move package matcher to c++. diff --git a/lib/libpacman/db.cpp b/lib/libpacman/db.cpp index 8ec3f37..a3963e6 100644 --- a/lib/libpacman/db.cpp +++ b/lib/libpacman/db.cpp @@ -85,14 +85,14 @@ Database::~Database() free(path); } -pmlist_t *Database::filter(const FMatcher *packagestrmatcher) +pmlist_t *Database::filter(const PackageMatcher &packagematcher) { pmlist_t *i, *ret = NULL; for(i = _pacman_db_get_pkgcache(this); i; i = i->next) { Package *pkg = i->data; - if(f_match(pkg, packagestrmatcher)) { + if(packagematcher.match(pkg)) { ret = f_ptrlist_append(ret, pkg); } } @@ -101,14 +101,7 @@ pmlist_t *Database::filter(const FMatcher *packagestrmatcher) pmlist_t *Database::filter(const FStrMatcher *strmatcher, int packagestrmatcher_flags) { - pmlist_t *ret = NULL; - FMatcher packagestrmatcher; - - if(_pacman_packagestrmatcher_init(&packagestrmatcher, strmatcher, packagestrmatcher_flags) == 0) { - ret = filter(&packagestrmatcher); - _pacman_packagestrmatcher_fini(&packagestrmatcher); - } - return ret; + return filter(PackageMatcher(strmatcher, packagestrmatcher_flags)); } FPtrList *Database::filter(const FStringList *needles, int packagestrmatcher_flags, int strmatcher_flags) @@ -153,7 +146,7 @@ FPtrList *Database::filter(const char *target, int packagestrmatcher_flags, int return(ret); } -Package *Database::find(const FMatcher *packagestrmatcher) +Package *Database::find(const PackageMatcher &packagematcher) { Package *ret = NULL; pmlist_t *i; @@ -161,8 +154,8 @@ Package *Database::find(const FMatcher *packagestrmatcher) for(i = _pacman_db_get_pkgcache(this); i; i = i->next) { Package *pkg = i->data; - if(f_match(pkg, packagestrmatcher)) { - if(_pacman_packagestrmatcher_match(packagestrmatcher, pkg, ~PM_PACKAGE_FLAG_PROVIDES)) { + if(packagematcher.match(pkg)) { + if(packagematcher.match(pkg, ~PM_PACKAGE_FLAG_PROVIDES)) { return pkg; } else if (ret == NULL) { /* Store provide match */ @@ -175,14 +168,7 @@ Package *Database::find(const FMatcher *packagestrmatcher) Package *Database::find(const FStrMatcher *strmatcher, int packagestrmatcher_flags) { - Package *ret = NULL; - FMatcher packagestrmatcher; - - if(_pacman_packagestrmatcher_init(&packagestrmatcher, strmatcher, packagestrmatcher_flags) == 0) { - ret = find(&packagestrmatcher); - _pacman_packagestrmatcher_fini(&packagestrmatcher); - } - return ret; + return find(PackageMatcher(strmatcher, packagestrmatcher_flags)); } Package *Database::find(const char *target, int packagestrmatcher_flags, int strmatcher_flags) diff --git a/lib/libpacman/db.h b/lib/libpacman/db.h index ac6e46e..5d68b60 100644 --- a/lib/libpacman/db.h +++ b/lib/libpacman/db.h @@ -67,11 +67,11 @@ public: virtual int write(libpacman::Package *info, unsigned int inforeq); // Cache operations - pmlist_t *filter(const FMatcher *packagestrmatcher); + pmlist_t *filter(const libpacman::PackageMatcher &packagematcher); pmlist_t *filter(const FStrMatcher *strmatcher, int packagestrmatcher_flags); FPtrList *filter(const FStringList *needles, int packagestrmatcher_flags, int strmatcher_flags = F_STRMATCHER_EQUAL); FPtrList *filter(const char *target, int packagestrmatcher_flags, int strmatcher_flags = F_STRMATCHER_EQUAL); - libpacman::Package *find(const FMatcher *packagestrmatcher); + libpacman::Package *find(const libpacman::PackageMatcher &packagematcher); libpacman::Package *find(const FStrMatcher *strmatcher, int packagestrmatcher_flags); libpacman::Package *find(const char *target, int packagestrmatcher_flags = PM_PACKAGE_FLAG_NAME, diff --git a/lib/libpacman/package.cpp b/lib/libpacman/package.cpp index 269c667..7cfa3d9 100644 --- a/lib/libpacman/package.cpp +++ b/lib/libpacman/package.cpp @@ -392,4 +392,33 @@ int _pacman_packagestrmatcher_match(const FMatcher *matcher, const Package *pack return _pacman_strmatcher_match(data->strmatcher, package, data->flags & mask); } +static +int PackageMatcher_match_cb(const void *ptr, const void *matcher_data) +{ + return ((const PackageMatcher *)matcher_data)->match((const Package *)ptr); +} + +PackageMatcher::PackageMatcher(const FStrMatcher *strmatcher, int flags) + : m_strmatcher(strmatcher), m_flags(flags) +{ + fn = PackageMatcher_match_cb; + data = this; +} + +PackageMatcher::~PackageMatcher() +{ +} + +#if 0 +bool PackageMatcher::match(const libpacman::Package *package) const +{ + return match(package, ~0); +} +#endif + +bool PackageMatcher::match(const Package *package, int mask = ~0) const +{ + return _pacman_strmatcher_match(m_strmatcher, package, m_flags & mask); +} + /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libpacman/package.h b/lib/libpacman/package.h index 62e1b21..62044a2 100644 --- a/lib/libpacman/package.h +++ b/lib/libpacman/package.h @@ -166,6 +166,23 @@ public: char *m_path; }; +class PackageMatcher + : FMatcher +{ +public: + PackageMatcher(const FStrMatcher *strmatcher, int flags); + ~PackageMatcher(); + +#if 0 + virtual bool match(const libpacman::Package *package) const override; +#endif + bool match(const libpacman::Package *package, int mask = ~0) const; + +private: + const FStrMatcher *m_strmatcher; + int m_flags; +}; + } #define FREELISTPKGS(p) _FREELIST(p, _pacman_pkg_delete) _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
