]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/sort-util.c
util: split out sorting related calls to new sort-util.[ch]
[thirdparty/systemd.git] / src / basic / sort-util.c
1 #include "sort-util.h"
2 #include "alloc-util.h"
3
4 /* hey glibc, APIs with callbacks without a user pointer are so useless */
5 void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
6 __compar_d_fn_t compar, void *arg) {
7 size_t l, u, idx;
8 const void *p;
9 int comparison;
10
11 assert(!size_multiply_overflow(nmemb, size));
12
13 l = 0;
14 u = nmemb;
15 while (l < u) {
16 idx = (l + u) / 2;
17 p = (const uint8_t*) base + idx * size;
18 comparison = compar(key, p, arg);
19 if (comparison < 0)
20 u = idx;
21 else if (comparison > 0)
22 l = idx + 1;
23 else
24 return (void *)p;
25 }
26 return NULL;
27 }