/* Plug-compatible with standard C library |bsearch()|. */ static void * blp_bsearch (const void *key, const void *array, size_t count, size_t size, int (*compare) (const void *, const void *)) { int min = 0; int max = count; while (max >= min) { int i = (min + max) / 2; void *item = ((char *) array) + size * i; int cmp = compare (key, item); if (cmp < 0) max = i - 1; else if (cmp > 0) min = i + 1; else return item; } return NULL; } /* Compares the |int|s pointed to by |pa| and |pb| and returns positive if |*pa > *pb|, negative if |*pa < *pb|, or zero if |*pa == *pb|. */ static int compare_ints (const void *pa, const void *pb) { const int *a = pa; const int *b = pb; if (*a > *b) return 1; else if (*a < *b) return -1; else return 0; } /* Returns the offset within |array[]| of an element equal to |key|, or |-1| if |key| is not in |array[]|. |array[]| must be an array of |n| |int|s sorted in ascending order. */ static int binary_search_bsearch (int array[], int n, int key) { int *p = blp_bsearch (&key, array, n, sizeof *array, compare_ints); return p != NULL ? p - array : -1; }