summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/bsearch.c
blob: d2f5c74b2a32bb2e077f81c055b9ebc54c591eff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdlib.h>

void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) {
  const char *v, *r;
  int res;
  r=base+(nmemb-1)*size;
  do {
    register int num=nmemb/2;
    v=base+num*size;
    if ((res=compar(key,v))<0) {
      r=v-size;
      nmemb=num;
    } else {
      if (res==0) return (void*)v;
      base=v+size;
      nmemb-=num;
    }
  } while ((char*)base<=r);
  return 0;
}