ref: a06125b256611ed9a97f7b1664beff5a6d27c52f
parent: 4eb0595fdcfb5064a5f81b1ffe4fb2de4c6a3dd3
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Wed Dec 6 17:54:06 EST 2017
[lib/c] Add bsearch()
--- a/lib/c/src/Makefile
+++ b/lib/c/src/Makefile
@@ -9,6 +9,7 @@
isalnum.o isalpha.o isascii.o isblank.o iscntrl.o isdigit.o \
isgraph.o islower.o isprint.o ispunct.o isspace.o isupper.o \
isxdigit.o toupper.o tolower.o ctype.o setlocale.o \
+ bsearch.o \
printf.o fprintf.o vfprintf.o \
fgets.o gets.of fgetc.o fputc.o getchar.o putchar.o \
fputs.o puts.o fread.o fwrite.o \
--- /dev/null
+++ b/lib/c/src/bsearch.c
@@ -1,0 +1,27 @@
+
+#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;
+ const 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 (void *) cur;
+ else if (t > 0)
+ low = mid + 1;
+ else
+ high = mid - 1;
+ }
+
+ return NULL;
+}