#include "sort-util.h" #include "alloc-util.h" /* hey glibc, APIs with callbacks without a user pointer are so useless */ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, __compar_d_fn_t compar, void *arg) { size_t l, u, idx; const void *p; int comparison; assert(!size_multiply_overflow(nmemb, size)); l = 0; u = nmemb; while (l < u) { idx = (l + u) / 2; p = (const uint8_t*) base + idx * size; comparison = compar(key, p, arg); if (comparison < 0) u = idx; else if (comparison > 0) l = idx + 1; else return (void *)p; } return NULL; }