diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/exec.c | 1 | ||||
-rw-r--r-- | src/system.c | 23 | ||||
-rw-r--r-- | src/system.h | 5 |
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 |