bsearch

2章の最後は、NetBSDのCライブラリのbsearch関数。
整列してある配列(開始base0、長さnmemb)からkeyの位置を検索する関数。

void *
bsearch(key, base0, nmemb, size, compar)
    register const void *key;
    const void *base0;
    size_t nmemb;
    register size_t size;
    register int (*compar) __P((const void *, const void *));
{
    register const char *base = base0;
    register int lim, cmp;
    register 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) {
            base = (char *) p + size;
            lim--;
        }
    }
    return (NULL);
}

このコードはvariant、invariantの説明で使っています。
いままでのなかでは一番短い(ライブラリ関数だし)。
演算lim >> 1は1/2にする処理。