shithub: scc

ref: 994751d39485e086ef623f202fb1b84729fd5d19
dir: /src/libc/stdlib/bsearch.c/

View raw version
#include <stdint.h>
#include <stdlib.h>

void *
bsearch(const void *key, const void *ary, size_t n, size_t size,
        int (*cmp)(const void *, const void *))
{
	int t;
	size_t mid, low, high;
	char *cur, *base = ary;

	low = 0;
	high = n - 1;
	while (low <= high) {
		mid = low + (high - low) / 2;
		cur = base + mid*size;

		if ((t = (*cmp)(key, cur)) == 0)
			return cur;
		else if (t > 0 && mid < SIZE_MAX)
			low = mid + 1;
		else if (t < 0 && mid > 0)
			high = mid - 1;
		else
			break;
	}

	return NULL;
}