aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-09-08 15:49:40 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-09-08 15:49:40 +0000
commitf04b8eea689980cb25233317c84775dfed3c4aa6 (patch)
treec4df0d1ccb51146052be55d50010795c1b932ead
parent62cc58a2589b136176d4bb49ba19cab7fa76f8f8 (diff)
downloadskalibs-f04b8eea689980cb25233317c84775dfed3c4aa6.tar.gz
Add bsearchr
-rw-r--r--NEWS2
-rw-r--r--doc/upgrade.html2
-rw-r--r--package/deps.mak1
-rw-r--r--src/include/skalibs/posixplz.h1
-rw-r--r--src/libposixplz/bsearchr.c17
5 files changed, 21 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 4a52d3b..bf99ddb 100644
--- a/NEWS
+++ b/NEWS
@@ -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 ;
+}