| /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| |
| #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; |
| } |