X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fasearch%2Fasearch.h;h=68ecebdb28f5a756908c333dbb2eca0d4e957ea6;hb=2581e470853736444e23e8ccef97a0a38c6236d3;hp=8e317b47cf4d110a88d57815e7cce83bc18fb5fe;hpb=b1c867121f379d76dc7fb7d99bae77e2b7d99841;p=ccan diff --git a/ccan/asearch/asearch.h b/ccan/asearch/asearch.h index 8e317b47..68ecebdb 100644 --- a/ccan/asearch/asearch.h +++ b/ccan/asearch/asearch.h @@ -1,9 +1,12 @@ +/* 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 * @base: pointer to data to sort @@ -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), \ - 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 */