--- bsearch.c.orig 2009-05-12 11:21:33.000000000 -0700 +++ bsearch.c 2009-05-20 13:11:05.000000000 -0700 @@ -81,3 +81,31 @@ bsearch(key, base0, nmemb, size, compar) } return (NULL); } + +#ifdef __BLOCKS__ +void * +bsearch_b(key, base0, nmemb, size, compar) + const void *key; + const void *base0; + size_t nmemb; + size_t size; + int (^compar)(const void *, const void *); +{ + const char *base = base0; + size_t lim; + int cmp; + const void *p; + + for (lim = nmemb; lim != 0; lim >>= 1) { + p = base + (lim >> 1) * size; + cmp = compar(key, p); + if (cmp == 0) + return ((void *)p); + if (cmp > 0) { /* key > p: move right */ + base = (char *)p + size; + lim--; + } /* else move left */ + } + return (NULL); +} +#endif /* __BLOCKS__ */