Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=b54aaa4e597d13ad2ce17f540755a32222f3eae1
commit b54aaa4e597d13ad2ce17f540755a32222f3eae1 Author: Michel Hermier <[email protected]> Date: Sun Aug 17 09:43:39 2014 +0200 libpacman: Allow package matcher to match directely from package/pattern name whithout the need of an external FStrMatcher. diff --git a/lib/libpacman/db.cpp b/lib/libpacman/db.cpp index d009730..e45d4a4 100644 --- a/lib/libpacman/db.cpp +++ b/lib/libpacman/db.cpp @@ -109,40 +109,32 @@ FPtrList *Database::filter(const FStringList *needles, int packagestrmatcher_fla pmlist_t *i, *j, *ret = NULL; for(i = needles; i; i = i->next) { - FStrMatcher strmatcher = { NULL }; - const char *targ = f_stringlistitem_to_str(i); + const char *pattern = f_stringlistitem_to_str(i); - if(f_strempty(targ)) { + if(f_strempty(pattern)) { continue; } - _pacman_log(PM_LOG_DEBUG, "searching for target '%s'\n", targ); - if(f_strmatcher_init(&strmatcher, targ, strmatcher_flags) == 0) { - PackageMatcher packagematcher(&strmatcher, packagestrmatcher_flags); + _pacman_log(PM_LOG_DEBUG, "searching for target '%s'\n", pattern); - for(j = _pacman_db_get_pkgcache(this); j; j = j->next) { - Package *pkg = j->data; + PackageMatcher packagematcher(pattern, packagestrmatcher_flags, strmatcher_flags); - if(packagematcher.match(pkg)) { - ret = f_ptrlist_append(ret, pkg); - } + for(j = _pacman_db_get_pkgcache(this); j; j = j->next) { + Package *pkg = j->data; + + if(packagematcher.match(pkg)) { + ret = f_ptrlist_append(ret, pkg); } } - f_strmatcher_fini(&strmatcher); } return(ret); } -FPtrList *Database::filter(const char *target, int packagestrmatcher_flags, int strmatcher_flags) +FPtrList *Database::filter(const char *pattern, int packagestrmatcher_flags, int strmatcher_flags) { - FPtrList *ret = NULL; - FStrMatcher strmatcher = { NULL }; - - if(!f_strempty(target) && - f_strmatcher_init(&strmatcher, target, strmatcher_flags) == 0) { - ret = filter(&strmatcher, packagestrmatcher_flags); - f_strmatcher_fini(&strmatcher); + if(!f_strempty(pattern)) { + return filter(PackageMatcher(pattern, packagestrmatcher_flags, strmatcher_flags)); } - return(ret); + return NULL; } Package *Database::find(const PackageMatcher &packagematcher) @@ -170,21 +162,12 @@ Package *Database::find(const FStrMatcher *strmatcher, int packagestrmatcher_fla return find(PackageMatcher(strmatcher, packagestrmatcher_flags)); } -Package *Database::find(const char *target, int packagestrmatcher_flags, int strmatcher_flags) +Package *Database::find(const char *pattern, int packagestrmatcher_flags, int strmatcher_flags) { - Package *ret = NULL; - FStrMatcher strmatcher = { NULL }; - - if(!_pacman_strempty(target)) { - if (packagestrmatcher_flags == PM_PACKAGE_FLAG_NAME && - strmatcher_flags == F_STRMATCHER_EQUAL) { - ret = _pacman_pkg_isin(target, _pacman_db_get_pkgcache(this)); - } else if (f_strmatcher_init(&strmatcher, target, strmatcher_flags) == 0) { - ret = find(&strmatcher, packagestrmatcher_flags); - f_strmatcher_fini(&strmatcher); - } + if(!_pacman_strempty(pattern)) { + return find(PackageMatcher(pattern, packagestrmatcher_flags, strmatcher_flags)); } - return ret; + return NULL; } FPtrList *Database::whatPackagesProvide(const char *target) diff --git a/lib/libpacman/db.h b/lib/libpacman/db.h index 5d68b60..6b9bc8e 100644 --- a/lib/libpacman/db.h +++ b/lib/libpacman/db.h @@ -70,7 +70,7 @@ public: 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); + FPtrList *filter(const char *pattern, int packagestrmatcher_flags, int strmatcher_flags = F_STRMATCHER_EQUAL); libpacman::Package *find(const libpacman::PackageMatcher &packagematcher); libpacman::Package *find(const FStrMatcher *strmatcher, int packagestrmatcher_flags); libpacman::Package *find(const char *target, diff --git a/lib/libpacman/package.cpp b/lib/libpacman/package.cpp index 0fff5b6..f7c454a 100644 --- a/lib/libpacman/package.cpp +++ b/lib/libpacman/package.cpp @@ -353,6 +353,12 @@ int PackageMatcher_match_cb(const void *ptr, const void *matcher_data) return ((const PackageMatcher *)matcher_data)->match((const Package *)ptr); } +PackageMatcher::PackageMatcher(const char *pattern, int flags = PM_PACKAGE_FLAG_NAME, int strmatcher_flags = F_STRMATCHER_EQUAL) + : m_strmatcher(&m_strmatcher_internal), m_flags(flags) +{ + f_strmatcher_init(m_strmatcher, pattern, strmatcher_flags); +} + PackageMatcher::PackageMatcher(const FStrMatcher *strmatcher, int flags) : m_strmatcher(strmatcher), m_flags(flags) { @@ -362,6 +368,9 @@ PackageMatcher::PackageMatcher(const FStrMatcher *strmatcher, int flags) PackageMatcher::~PackageMatcher() { + if(m_strmatcher == &m_strmatcher_internal) { + f_strmatcher_fini(m_strmatcher); + } } #if 0 diff --git a/lib/libpacman/package.h b/lib/libpacman/package.h index 7ee6d18..a50921d 100644 --- a/lib/libpacman/package.h +++ b/lib/libpacman/package.h @@ -170,6 +170,7 @@ class PackageMatcher : FMatcher { public: + PackageMatcher(const char *str, int flags = PM_PACKAGE_FLAG_NAME, int strmatcher_flags = F_STRMATCHER_EQUAL); PackageMatcher(const FStrMatcher *strmatcher, int flags); ~PackageMatcher(); @@ -181,6 +182,7 @@ public: private: const FStrMatcher *m_strmatcher; int m_flags; + FStrMatcher m_strmatcher_internal; }; } _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
