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

Reply via email to