summary refs log tree commit diff
path: root/src/system.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/system.c')
-rw-r--r--src/system.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/system.c b/src/system.c
index 7804b29..d375de0 100644
--- a/src/system.c
+++ b/src/system.c
@@ -52,3 +52,26 @@ char *strchrnul(const char *s, int c)
 	return p;
 }
 #endif
+
+#ifndef HAVE_BSEARCH
+void *bsearch(const void *key, const void *base, size_t nmemb,
+	      size_t size, int (*cmp)(const void *, const void *))
+{
+	while (nmemb) {
+		size_t mididx = nmemb / 2;
+		const void *midobj = base + mididx * size;
+		int diff = cmp(key, midobj);
+
+		if (diff == 0)
+			return (void *)midobj;
+
+		if (diff > 0) {
+			base = midobj + size;
+			nmemb -= mididx + 1;
+		} else
+			nmemb = mididx;
+	}
+
+	return 0;
+}
+#endif