summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/exec.c1
-rw-r--r--src/system.c23
-rw-r--r--src/system.h5
3 files changed, 29 insertions, 0 deletions
diff --git a/src/exec.c b/src/exec.c
index 9b1a8bf..417ba8a 100644
--- a/src/exec.c
+++ b/src/exec.c
@@ -67,6 +67,7 @@
 #include "show.h"
 #include "jobs.h"
 #include "alias.h"
+#include "system.h"
 
 
 #define CMDTABLESIZE 31		/* should be prime */
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
diff --git a/src/system.h b/src/system.h
index cc64b79..d686024 100644
--- a/src/system.h
+++ b/src/system.h
@@ -58,3 +58,8 @@ char *strchrnul(const char *, int);
 #ifndef HAVE_STRTOUMAX
 #define strtoumax strtoull
 #endif
+
+#ifndef HAVE_BSEARCH
+void *bsearch(const void *, const void *, size_t, size_t,
+	      int (*)(const void *, const void *));
+#endif