diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2005-10-29 15:17:47 +1000 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2005-10-29 15:17:47 +1000 |
commit | 95325feb5a9ef900e1f6ea5233bc3dfa40354ce0 (patch) | |
tree | 22d60ffffbdb5d4ba2d5fbc864c574303de9a0e2 /src/system.c | |
parent | Use stat if stat64 does not exist (diff) | |
download | dash-95325feb5a9ef900e1f6ea5233bc3dfa40354ce0.tar.gz dash-95325feb5a9ef900e1f6ea5233bc3dfa40354ce0.zip |
[SYSTEM] Added default implementation of bsearch
Added impelmentation of bsearch since klibc doesn't have it yet.
Diffstat (limited to 'src/system.c')
-rw-r--r-- | src/system.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/system.c b/src/system.c index 7804b29..d375de0 100644 --- a/src/system.c +++ b/src/system.c @@ -52,3 +52,26 @@ char *strchrnul(const char *s, int c) return p; } #endif + +#ifndef HAVE_BSEARCH +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 0; +} +#endif |