diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-08 15:49:40 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-09-08 15:49:40 +0000 |
| commit | f04b8eea689980cb25233317c84775dfed3c4aa6 (patch) | |
| tree | c4df0d1ccb51146052be55d50010795c1b932ead | |
| parent | 62cc58a2589b136176d4bb49ba19cab7fa76f8f8 (diff) | |
| download | skalibs-f04b8eea689980cb25233317c84775dfed3c4aa6.tar.gz | |
Add bsearchr
| -rw-r--r-- | NEWS | 2 | ||||
| -rw-r--r-- | doc/upgrade.html | 2 | ||||
| -rw-r--r-- | package/deps.mak | 1 | ||||
| -rw-r--r-- | src/include/skalibs/posixplz.h | 1 | ||||
| -rw-r--r-- | src/libposixplz/bsearchr.c | 17 |
5 files changed, 21 insertions, 2 deletions
@@ -8,7 +8,7 @@ In 2.14.5.0 - crc32c implementation: skalibs/crc32c.h - new skalibs/prog.h header for PROG modifications - new functions: symlink_at, mkdirp, mkdirp2, mkntemp, - atomic_symlink4, qsortr, env_dump4, socket_tcpdelay + atomic_symlink4, qsortr, bsearchr, env_dump4, socket_tcpdelay In 2.14.4.0 diff --git a/doc/upgrade.html b/doc/upgrade.html index 1536a04..a3ef5e4 100644 --- a/doc/upgrade.html +++ b/doc/upgrade.html @@ -23,7 +23,7 @@ <li> New <tt>skalibs/prog.h</tt> header, for PROG modifications </li> <li> New functions: <tt>crc32c</tt>, <tt>symlink_at</tt>, <tt>mkdirp</tt>, <tt>atomic_symlink4</tt>, <tt>mkdirp2</tt>, <tt>mkntemp</tt>, <tt>qsortr</tt>, -<tt>env_dump4</tt>, <tt>socket_tcpdelay</tt> </li> +<tt>bsearchr</tt>, <tt>env_dump4</tt>, <tt>socket_tcpdelay</tt> </li> </ul> <h2> in 2.14.4.0 </h2> diff --git a/package/deps.mak b/package/deps.mak index dbf3401..e401efa 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -170,6 +170,7 @@ src/libenvexec/xmexec_afn.o src/libenvexec/xmexec_afn.lo: src/libenvexec/xmexec_ src/libenvexec/xmspawn_af.o src/libenvexec/xmspawn_af.lo: src/libenvexec/xmspawn_af.c src/include/skalibs/cspawn.h src/include/skalibs/strerr.h src/libenvexec/xmspawn_afm.o src/libenvexec/xmspawn_afm.lo: src/libenvexec/xmspawn_afm.c src/include/skalibs/cspawn.h src/include/skalibs/strerr.h src/libenvexec/xmspawn_afn.o src/libenvexec/xmspawn_afn.lo: src/libenvexec/xmspawn_afn.c src/include/skalibs/cspawn.h src/include/skalibs/strerr.h +src/libposixplz/bsearchr.o src/libposixplz/bsearchr.lo: src/libposixplz/bsearchr.c src/include/skalibs/functypes.h src/include/skalibs/posixplz.h src/libposixplz/doublefork.o src/libposixplz/doublefork.lo: src/libposixplz/doublefork.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/posixplz.h src/include/skalibs/uint64.h src/libposixplz/execvep.o src/libposixplz/execvep.lo: src/libposixplz/execvep.c src/libposixplz/posixplz-internal.h src/include/skalibs/posixplz.h src/libposixplz/execvep_internal.o src/libposixplz/execvep_internal.lo: src/libposixplz/execvep_internal.c src/include/skalibs/bytestr.h src/include/skalibs/posixplz.h diff --git a/src/include/skalibs/posixplz.h b/src/include/skalibs/posixplz.h index e413739..eee184d 100644 --- a/src/include/skalibs/posixplz.h +++ b/src/include/skalibs/posixplz.h @@ -60,6 +60,7 @@ extern int mkbtemp (char *, mode_t, dev_t) ; */ extern void qsortr (void *, size_t, size_t, cmp_func_ref, void *) ; +extern void *bsearchr (void const *, void const *, size_t, size_t, cmp_func_ref, void *) ; #define skalibs_regcomp(re, s, flags) regcomp(re, (s)[0] ? (s) : ".*", flags) #endif diff --git a/src/libposixplz/bsearchr.c b/src/libposixplz/bsearchr.c new file mode 100644 index 0000000..87b664f --- /dev/null +++ b/src/libposixplz/bsearchr.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include <skalibs/functypes.h> +#include <skalibs/posixplz.h> + +void *bsearchr (void const *key, void const *base, size_t n, size_t width, cmp_func_ref cmp, void *aux) +{ + while (n) + { + void *cur = (char *)base + width * (n >> 1) ; + int h = (*cmp)(key, cur, aux) ; + if (h < 0) n >>= 1 ; + else if (h > 0) { base = (char *)cur + width ; n = (n-1) >> 1 ; } + else return cur ; + } + return 0 ; +} |
