aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar S. Christoffer Eliesen <christoffer@eliesen.no>2015-11-18 21:12:20 +0100
committerLibravatar S. Christoffer Eliesen <christoffer@eliesen.no>2015-11-21 22:22:08 +0100
commita33e3badad7fbfa7e229f009c5c1b78c552a935b (patch)
tree660f28b1a065ede1be4d7b652954dcc07db9f47a
parentUpdate header for default config (diff)
downloadsway-a33e3badad7fbfa7e229f009c5c1b78c552a935b.tar.gz
sway-a33e3badad7fbfa7e229f009c5c1b78c552a935b.tar.zst
sway-a33e3badad7fbfa7e229f009c5c1b78c552a935b.zip
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) {
53void list_sort(list_t *list, int compare(const void *left, const void *right)) { 53void list_sort(list_t *list, int compare(const void *left, const void *right)) {
54 qsort(list->items, list->length, sizeof(void *), compare); 54 qsort(list->items, list->length, sizeof(void *), compare);
55} 55}
56
57int list_seq_find(list_t *list, int (*cmp)(const void *item, const void *data), const void *data) {
58 for (int i = 0; i < list->length; i++) {
59 void *item = list->items[i];
60 if ((cmp)(item, data) == 0) {
61 return i;
62 }
63 }
64 return -1;
65}
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);
15void list_cat(list_t *list, list_t *source); 15void list_cat(list_t *list, list_t *source);
16// See qsort 16// See qsort
17void list_sort(list_t *list, int compare(const void *left, const void *right)); 17void list_sort(list_t *list, int compare(const void *left, const void *right));
18// Return index for first item in list that returns 0 for given compare
19// function or -1 if none matches.
20int list_seq_find(list_t *list, int compare(const void *item, const void *cmp_to), const void *cmp_to);
18 21
19#endif 22#endif