aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurkan Sahin <furkan-dev@proton.me>2015-11-18 21:12:20 +0100
committerFurkan Sahin <furkan-dev@proton.me>2015-11-18 21:12:20 +0100
commit1f294eb9bcf01e95a96af9ee98b2d03e829c5c37 (patch)
tree660f28b1a065ede1be4d7b652954dcc07db9f47a
parentb8d87c93f0a1af044ccbd199c09301796d4d36c1 (diff)
list: Add list_seq_find.
Sometimes one has to traverse a list to find out if some data already exists there in order to avoid dupilcates in the list, and this function facilitates in that without requiring that the data is ordered.
-rw-r--r--common/list.c10
-rw-r--r--include/list.h3
2 files changed, 13 insertions, 0 deletions
diff --git a/common/list.c b/common/list.c
index 45efc16f..ef1cfda8 100644
--- a/common/list.c
+++ b/common/list.c
@@ -53,3 +53,13 @@ void list_cat(list_t *list, list_t *source) {
void list_sort(list_t *list, int compare(const void *left, const void *right)) {
qsort(list->items, list->length, sizeof(void *), compare);
}
+
+int list_seq_find(list_t *list, int (*cmp)(const void *item, const void *data), const void *data) {
+ for (int i = 0; i < list->length; i++) {
+ void *item = list->items[i];
+ if ((cmp)(item, data) == 0) {
+ return i;
+ }
+ }
+ return -1;
+}
diff --git a/include/list.h b/include/list.h
index aff6800f..90d0ad36 100644
--- a/include/list.h
+++ b/include/list.h
@@ -15,5 +15,8 @@ void list_del(list_t *list, int index);
void list_cat(list_t *list, list_t *source);
// See qsort
void list_sort(list_t *list, int compare(const void *left, const void *right));
+// Return index for first item in list that returns 0 for given compare
+// function or -1 if none matches.
+int list_seq_find(list_t *list, int compare(const void *item, const void *cmp_to), const void *cmp_to);
#endif