| 5075 | /****************************************************************************/ |
| 5076 | |
| 5077 | static void *bsearch(const void *key, const void *base0, size_t nmemb, |
| 5078 | size_t size, int (*compare)(const void *, const void *)) |
| 5079 | { |
| 5080 | if (nmemb == 0) |
| 5081 | return NULL; |
| 5082 | const uint8_t *base = (uint8_t *)base0; |
| 5083 | ssize_t lo = 0, hi = (ssize_t)nmemb-1; |
| 5084 | while (lo <= hi) |
| 5085 | { |
| 5086 | ssize_t mid = lo + (hi - lo) / 2; |
| 5087 | int cmp = compare(key, base + mid * size); |
| 5088 | if (cmp < 0) |
| 5089 | hi = mid - 1; |
| 5090 | else if (cmp > 0) |
| 5091 | lo = mid + 1; |
| 5092 | else |
| 5093 | return (void *)(base + mid * size); |
| 5094 | } |
| 5095 | return NULL; |
| 5096 | } |
| 5097 | |
| 5098 | /* |
| 5099 | * This is an implementation of the POSIX tree-search (tsearch) family of |