diff options
Diffstat (limited to 'usr/klibc/bsearch.c')
-rw-r--r-- | usr/klibc/bsearch.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/usr/klibc/bsearch.c b/usr/klibc/bsearch.c new file mode 100644 index 0000000..1c8b07f --- /dev/null +++ b/usr/klibc/bsearch.c @@ -0,0 +1,26 @@ +/* + * bsearch.c + */ + +#include <stdlib.h> + +void *bsearch(const void *key, const void *base, size_t nmemb, + size_t size, int (*cmp) (const void *, const void *)) +{ + while (nmemb) { + size_t mididx = nmemb / 2; + const void *midobj = base + mididx * size; + int diff = cmp(key, midobj); + + if (diff == 0) + return (void *)midobj; + + if (diff > 0) { + base = midobj + size; + nmemb -= mididx + 1; + } else + nmemb = mididx; + } + + return NULL; +} |