]> git.ozlabs.org Git - ccan/blobdiff - ccan/asearch/asearch.h
tal: allow notifiers on NULL.
[ccan] / ccan / asearch / asearch.h
index 84625d986d6adef3848dbcdcc71dfa3bfe826afb..68ecebdb28f5a756908c333dbb2eca0d4e957ea6 100644 (file)
@@ -1,8 +1,11 @@
+/* Licensed under LGPLv2.1+ - see LICENSE file for details */
 #ifndef CCAN_ASEARCH_H
 #define CCAN_ASEARCH_H
 #include <stdlib.h>
 #include <ccan/typesafe_cb/typesafe_cb.h>
 
+typedef int (*asearch_cmp)(const void *, const void *, void *);
+
 /**
  * asearch - search an array of elements
  * @key: pointer to item being searched for
  * the same comparison function for both sort() and asearch().
  */
 #if HAVE_TYPEOF
-#define asearch(key, base, num, cmp)                                   \
-       ((__typeof__(*(base))*)(bsearch((key), (base), (num), sizeof(*(base)), \
-               cast_if_type(int (*)(const void *, const void *),       \
-                            (cmp), &*(cmp),                            \
-                            int (*)(const __typeof__(*(key)) *,        \
-                                    const __typeof__(*(base)) *)))))
+#define asearch(key, base, num, cmp, ctx)                              \
+       ((__typeof__(*(base))*)(_asearch((key), (base), (num), sizeof(*(base)), \
+               typesafe_cb_cast(asearch_cmp,                           \
+                                int (*)(const __typeof__(*(key)) *,    \
+                                        const __typeof__(*(base)) *,   \
+                                        __typeof__(*(ctx)) *),         \
+                                (cmp)), (ctx))))
+
 #else
-#define asearch(key, base, num, cmp)                           \
-       (bsearch((key), (base), (num), sizeof(*(base)),         \
-                (int (*)(const void *, const void *))(cmp)))
+#define asearch(key, base, num, cmp, ctx)                              \
+       (_asearch((key), (base), (num), sizeof(*(base)),                \
+                 (int (*)(const void *, const void *, void *))(cmp), (ctx)))
 #endif
 
+void *_asearch(const void *key, const void *base,
+              size_t nmemb, size_t size,
+              asearch_cmp compar, void *ctx);
+
 #endif /* CCAN_ASEARCH_H */