X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fasearch%2Fasearch.h;h=68ecebdb28f5a756908c333dbb2eca0d4e957ea6;hb=fedf515165bfafaf4fb98252ecda1abe050c8da5;hp=aae6eeda959acd9a18695f7f9707fa83c3170392;hpb=74257cee33ae3033f961d5f22a0313b8cb1b18d4;p=ccan diff --git a/ccan/asearch/asearch.h b/ccan/asearch/asearch.h index aae6eeda..68ecebdb 100644 --- a/ccan/asearch/asearch.h +++ b/ccan/asearch/asearch.h @@ -4,6 +4,8 @@ #include #include +typedef int (*asearch_cmp)(const void *, const void *, void *); + /** * asearch - search an array of elements * @key: pointer to item being searched for @@ -22,17 +24,22 @@ * 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 */