]> git.ozlabs.org Git - ccan/blobdiff - ccan/asearch/asearch.h
asearch: Add context pointer to asearch comparison callback
[ccan] / ccan / asearch / asearch.h
index aae6eeda959acd9a18695f7f9707fa83c3170392..68ecebdb28f5a756908c333dbb2eca0d4e957ea6 100644 (file)
@@ -4,6 +4,8 @@
 #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)), \
-               typesafe_cb_cast(int (*)(const void *, const void *),   \
+#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)) *),  \
-                                (cmp)))))
+                                        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 */