From: Kay Sievers Date: Mon, 22 Oct 2012 12:31:46 +0000 (+0200) Subject: util: add (x)bsearch_r(), the missing counterpart of qsort_r() X-Git-Tag: v195~17 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=a9e12476ed32256690eb801099c41526834b6390;hp=1d870ac769c70bae86fed63d9c5a1c42d2af9da3 util: add (x)bsearch_r(), the missing counterpart of qsort_r() --- diff --git a/src/shared/util.c b/src/shared/util.c index 42a2e2730..2f0aba88a 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -6069,3 +6069,27 @@ finish: return 0; } + +/* 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, + int (*compar) (const void *, const void *, void *), + void *arg) { + size_t l, u, idx; + const void *p; + int comparison; + + l = 0; + u = nmemb; + while (l < u) { + idx = (l + u) / 2; + p = (void *)(((const char *) 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; +} diff --git a/src/shared/util.h b/src/shared/util.h index 77d28751f..a9c39b867 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -563,3 +563,7 @@ bool filename_is_safe(const char *p); bool string_is_safe(const char *p); int parse_timestamp(const char *t, usec_t *usec); + +void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, + int (*compar) (const void *, const void *, void *), + void *arg);