/* * Copyright (c) 2019 Balaji Kulkarni * * SPDX-License-Identifier: Apache-2.0 */ #include #include /** * @brief Generic implementation of Binary Search * * @param key pointer to first element to search * @param array pointer to item being searched for * @param count number of elements * @param size size of each element * @param cmp pointer to comparison function * * @return pointer to key if present in the array, or NULL otherwise */ void *bsearch(const void *key, const void *array, size_t count, size_t size, int (*cmp)(const void *key, const void *element)) { size_t low = 0; size_t high = count; size_t index; int result; const char *pivot; while (low < high) { index = low + (high - low) / 2; pivot = (const char *)array + index * size; result = cmp(key, pivot); if (result == 0) { return (void *)pivot; } else if (result > 0) { low = index + 1; } else { high = index; } } return NULL; }