Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=366c54873595b9432352339e9da0234f956925e9
commit 366c54873595b9432352339e9da0234f956925e9 Author: Michel Hermier <[email protected]> Date: Fri Aug 15 15:22:14 2014 +0200 libpacman: Make Database::find(const FMatcher *packagestrmatcher) able to find regular find before provide ones. diff --git a/lib/libpacman/db.cpp b/lib/libpacman/db.cpp index 4040812..8ec3f37 100644 --- a/lib/libpacman/db.cpp +++ b/lib/libpacman/db.cpp @@ -155,17 +155,22 @@ FPtrList *Database::filter(const char *target, int packagestrmatcher_flags, int Package *Database::find(const FMatcher *packagestrmatcher) { - // FIXME: search for provide in the same pass ? + Package *ret = NULL; pmlist_t *i; for(i = _pacman_db_get_pkgcache(this); i; i = i->next) { Package *pkg = i->data; if(f_match(pkg, packagestrmatcher)) { - return pkg; + if(_pacman_packagestrmatcher_match(packagestrmatcher, pkg, ~PM_PACKAGE_FLAG_PROVIDES)) { + return pkg; + } else if (ret == NULL) { + /* Store provide match */ + ret = pkg; + } } } - return NULL; + return ret; } Package *Database::find(const FStrMatcher *strmatcher, int packagestrmatcher_flags) diff --git a/lib/libpacman/package.cpp b/lib/libpacman/package.cpp index 8836d11..269c667 100644 --- a/lib/libpacman/package.cpp +++ b/lib/libpacman/package.cpp @@ -319,12 +319,8 @@ struct FPackageStrMatcher }; static -int _pacman_packagestrmatcher_match(const void *ptr, const void *matcher_data) { - Package *pkg = (void *)ptr; /* FIXME: Make const when const accessors are available */ - const FPackageStrMatcher *data = matcher_data; - const int flags = data->flags; - const FStrMatcher *strmatcher = data->strmatcher; - +int _pacman_strmatcher_match(const FStrMatcher *strmatcher, Package *pkg, int flags) { + /* FIXME: Make const when const accessors are available */ if(((flags & PM_PACKAGE_FLAG_NAME) && f_str_match(pkg->name(), strmatcher)) || ((flags & PM_PACKAGE_FLAG_VERSION) && f_str_match(pkg->version(), strmatcher)) || ((flags & PM_PACKAGE_FLAG_DESCRIPTION) && f_str_match(pkg->description(), strmatcher)) || @@ -351,6 +347,13 @@ int _pacman_packagestrmatcher_match(const void *ptr, const void *matcher_data) { return 0; } +static +int _pacman_packagestrmatcher_match_cb(const void *ptr, const void *matcher_data) { + const FPackageStrMatcher *data = matcher_data; + + return _pacman_strmatcher_match(data->strmatcher, (const Package *)ptr, data->flags); +} + int _pacman_packagestrmatcher_init(FMatcher *matcher, const FStrMatcher *strmatcher, int flags) { FPackageStrMatcher *data = NULL; @@ -359,10 +362,11 @@ int _pacman_packagestrmatcher_init(FMatcher *matcher, const FStrMatcher *strmatc ASSERT(strmatcher != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); ASSERT((data = (FPackageStrMatcher *)f_zalloc(sizeof(*data))) != NULL, return -1); - matcher->fn = _pacman_packagestrmatcher_match; + matcher->fn = _pacman_packagestrmatcher_match_cb; matcher->data = data; data->strmatcher = strmatcher; - return _pacman_packagestrmatcher_set_flags(matcher, flags); + data->flags = flags; + return 0; } int _pacman_packagestrmatcher_fini(FMatcher *matcher) @@ -370,23 +374,22 @@ int _pacman_packagestrmatcher_fini(FMatcher *matcher) FPackageStrMatcher *data = NULL; ASSERT(matcher != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); - ASSERT(matcher->fn == _pacman_packagestrmatcher_match, RET_ERR(PM_ERR_WRONG_ARGS, -1)); + ASSERT(matcher->fn == _pacman_packagestrmatcher_match_cb, RET_ERR(PM_ERR_WRONG_ARGS, -1)); ASSERT((data = (FPackageStrMatcher *)matcher->data) != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); free(data); return 0; } -int _pacman_packagestrmatcher_set_flags(FMatcher *matcher, int flags) +int _pacman_packagestrmatcher_match(const FMatcher *matcher, const Package *package, int mask) { FPackageStrMatcher *data = NULL; ASSERT(matcher != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); - ASSERT(matcher->fn == _pacman_packagestrmatcher_match, RET_ERR(PM_ERR_WRONG_ARGS, -1)); + ASSERT(matcher->fn == _pacman_packagestrmatcher_match_cb, RET_ERR(PM_ERR_WRONG_ARGS, -1)); ASSERT((data = (FPackageStrMatcher *)matcher->data) != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); - data->flags = flags; - return 0; + return _pacman_strmatcher_match(data->strmatcher, package, data->flags & mask); } /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libpacman/package.h b/lib/libpacman/package.h index 801a019..62e1b21 100644 --- a/lib/libpacman/package.h +++ b/lib/libpacman/package.h @@ -178,7 +178,7 @@ libpacman::Package *_pacman_pkg_isin(const char *needle, pmlist_t *haystack); int _pacman_packagestrmatcher_init(FMatcher *matcher, const FStrMatcher *strmatcher, int flags); int _pacman_packagestrmatcher_fini(FMatcher *matcher); -int _pacman_packagestrmatcher_set_flags(FMatcher *matcher, int flags); +int _pacman_packagestrmatcher_match(const FMatcher *matcher, const libpacman::Package *package, int mask = ~0); #endif /* _PACMAN_PACKAGE_H */ _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
