Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=30627f71db4064525c306535c71275d782fa5d96

commit 30627f71db4064525c306535c71275d782fa5d96
Author: Michel Hermier <herm...@frugalware.org>
Date:   Mon May 20 14:05:00 2013 +0200

libpacman: Add FCompareDetector.

diff --git a/lib/libflib/fcallbacks.c b/lib/libflib/fcallbacks.c
index 6e22d69..07d9ac8 100644
--- a/lib/libflib/fcallbacks.c
+++ b/lib/libflib/fcallbacks.c
@@ -33,6 +33,10 @@ void f_visit (void *ptr, FVisitor *visitor) {
}
}

+int f_comparedetect (const void *ptr, FCompareDetector *comparedetector) {
+       return comparedetector->fn (ptr, comparedetector->ptr, 
comparedetector->user_data);
+}
+
void f_detectvisit (void *ptr, FDetectVisitor *detectvisitor) {
if (detectvisitor != NULL) {
f_visit (ptr, f_detect (ptr, detectvisitor->detect) == 0 ?
diff --git a/lib/libflib/fcallbacks.h b/lib/libflib/fcallbacks.h
index 47157a8..41a9bc2 100644
--- a/lib/libflib/fcallbacks.h
+++ b/lib/libflib/fcallbacks.h
@@ -54,6 +54,16 @@ struct FVisitor {

void f_visit (void *ptr, FVisitor *visitor);

+typedef struct FCompareDetector FCompareDetector;
+
+struct FCompareDetector {
+       FCompareFunc fn;
+       const void *ptr;
+       void *user_data;
+};
+
+int f_comparedetect (const void *ptr, FCompareDetector *comparedetector);
+
typedef struct FDetectVisitor FDetectVisitor;

struct FDetectVisitor {
diff --git a/lib/libflib/flist.c b/lib/libflib/flist.c
index 936132b..1ace41f 100644
--- a/lib/libflib/flist.c
+++ b/lib/libflib/flist.c
@@ -307,14 +307,13 @@ FListItem *f_list_find (FList *list, const void *data) {
}

FListItem *f_list_find_custom (FList *list, const void *data, FCompareFunc cfn, 
void *user_data) {
-       FListItem *it = f_list_begin (list), *end = f_list_end (list);
+       FCompareDetector comparedetector = {
+               .fn = cfn,
+               .ptr = data,
+               .user_data = user_data
+       };

-       for (; it != end; it = it->next) {
-               if (cfn (it->data, data, user_data) == 0) {
-                       break;
-               }
-       }
-       return it;
+       return f_list_detect (list, f_comparedetect, &comparedetector);
}

void f_list_foreach (FList *list, FVisitorFunc fn, void *user_data) {
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to