summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--configure.ac2
-rw-r--r--src/exec.c1
-rw-r--r--src/system.c23
-rw-r--r--src/system.h5
5 files changed, 31 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 17c4f1d..59f81ff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,7 @@
 	* Use bsd_signal if it exists and signal does not.
 	* Stop using sysexits.h in commandcmd.
 	* Use stat if stat64 does not exist.
+	* Added default implementation of bsearch.
 
 2005-10-26  Herbert Xu <herbert@gondor.apana.org.au>
 
diff --git a/configure.ac b/configure.ac
index 5c2c2d2..bb0e815 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@ dnl Checks for libraries.
 dnl Checks for header files.
 
 dnl Checks for library functions.
-AC_CHECK_FUNCS(mempcpy sigsetmask stpcpy strchrnul strtoimax strtoumax)
+AC_CHECK_FUNCS(bsearch mempcpy sigsetmask stpcpy strchrnul strtoimax strtoumax)
 
 dnl Check for klibc signal.
 AC_CHECK_FUNC(signal)
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