X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fasearch%2Fasearch.h;h=68ecebdb28f5a756908c333dbb2eca0d4e957ea6;hp=84625d986d6adef3848dbcdcc71dfa3bfe826afb;hb=a8722345053b7cd860499aa31fd6bb414c120cc8;hpb=d707abbb2ff707dd34aa77c9028f23f2266f8d5f diff --git a/ccan/asearch/asearch.h b/ccan/asearch/asearch.h index 84625d98..68ecebdb 100644 --- a/ccan/asearch/asearch.h +++ b/ccan/asearch/asearch.h @@ -1,8 +1,11 @@ +/* Licensed under LGPLv2.1+ - see LICENSE file for details */ #ifndef CCAN_ASEARCH_H #define CCAN_ASEARCH_H #include #include +typedef int (*asearch_cmp)(const void *, const void *, void *); + /** * asearch - search an array of elements * @key: pointer to item being searched for @@ -21,16 +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)), \ - 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 */