void *bsearch(const void *key, const void *base, size_t nmembers,
       size_t size, int (*compar)(const void *, const void *))
{
 if (nmembers == 0) {
  return NULL;
 } else {
  size_t half = nmembers / 2;
  void *mid = (char *)base + size * half;
  int r = compar(key, mid);

  if (r == 0) {
   return mid;
  } else if (r < 0) {
   return bsearch(key, base, half, size, compar);
  } else {
   return bsearch(key, mid + size, nmembers - half - 1, size, compar);
  }
 }
}