skalibs

Mirror/fork of https://skarnet.org/software/skalibs/
git clone https://ccx.te2000.cz/git/skalibs
Log | Files | Refs | README | LICENSE

commit 193a7be520502f24e995b71768dd89c37b3776eb
parent 8fac1ec21fc54a050822258d8873b9a87a2bd2fe
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date:   Tue, 13 Jun 2023 22:19:05 +0000

 Fix iter_func type; add tain_earliest

Signed-off-by: Laurent Bercot <ska@appnovation.com>

Diffstat:
Mpackage/deps.mak | 4+++-
Msrc/include/skalibs/functypes.h | 2+-
Msrc/include/skalibs/tai.h | 6++++++
Msrc/libdatastruct/genset_deepfree.c | 4++--
Msrc/libdatastruct/genset_iter_nocancel.c | 2++
Msrc/libdatastruct/genset_iter_withcancel.c | 1+
Msrc/libdatastruct/gensetdyn_deepfree.c | 4++--
Dsrc/libdatastruct/gensetdyn_iter.c | 27---------------------------
Asrc/libdatastruct/gensetdyn_iter_nocancel.c | 29+++++++++++++++++++++++++++++
Msrc/libdatastruct/gensetdyn_iter_withcancel.c | 1+
Asrc/libstddjb/tain_earliest1.c | 8++++++++
Asrc/libstddjb/tain_earliestv.c | 9+++++++++
12 files changed, 64 insertions(+), 33 deletions(-)

diff --git a/package/deps.mak b/package/deps.mak @@ -107,7 +107,7 @@ src/libdatastruct/gensetdyn_deepfree.o src/libdatastruct/gensetdyn_deepfree.lo: src/libdatastruct/gensetdyn_delete.o src/libdatastruct/gensetdyn_delete.lo: src/libdatastruct/gensetdyn_delete.c src/include/skalibs/genalloc.h src/include/skalibs/gensetdyn.h src/libdatastruct/gensetdyn_free.o src/libdatastruct/gensetdyn_free.lo: src/libdatastruct/gensetdyn_free.c src/include/skalibs/genalloc.h src/include/skalibs/gensetdyn.h src/include/skalibs/stralloc.h src/libdatastruct/gensetdyn_init.o src/libdatastruct/gensetdyn_init.lo: src/libdatastruct/gensetdyn_init.c src/include/skalibs/genalloc.h src/include/skalibs/gensetdyn.h src/include/skalibs/stralloc.h -src/libdatastruct/gensetdyn_iter.o src/libdatastruct/gensetdyn_iter.lo: src/libdatastruct/gensetdyn_iter.c src/include/skalibs/bitarray.h src/include/skalibs/gensetdyn.h +src/libdatastruct/gensetdyn_iter_nocancel.o src/libdatastruct/gensetdyn_iter_nocancel.lo: src/libdatastruct/gensetdyn_iter_nocancel.c src/include/skalibs/bitarray.h src/include/skalibs/gensetdyn.h src/libdatastruct/gensetdyn_iter_withcancel.o src/libdatastruct/gensetdyn_iter_withcancel.lo: src/libdatastruct/gensetdyn_iter_withcancel.c src/include/skalibs/gensetdyn.h src/libdatastruct/gensetdyn_new.o src/libdatastruct/gensetdyn_new.lo: src/libdatastruct/gensetdyn_new.c src/include/skalibs/genalloc.h src/include/skalibs/gensetdyn.h src/libdatastruct/gensetdyn_ready.o src/libdatastruct/gensetdyn_ready.lo: src/libdatastruct/gensetdyn_ready.c src/include/skalibs/genalloc.h src/include/skalibs/gensetdyn.h src/include/skalibs/stralloc.h @@ -599,6 +599,8 @@ src/libstddjb/tai_unpack_little.o src/libstddjb/tai_unpack_little.lo: src/libstd src/libstddjb/tain_add.o src/libstddjb/tain_add.lo: src/libstddjb/tain_add.c src/include/skalibs/tai.h src/libstddjb/tain_addsec.o src/libstddjb/tain_addsec.lo: src/libstddjb/tain_addsec.c src/include/skalibs/tai.h src/include/skalibs/uint64.h src/libstddjb/tain_approx.o src/libstddjb/tain_approx.lo: src/libstddjb/tain_approx.c src/include/skalibs/tai.h +src/libstddjb/tain_earliest1.o src/libstddjb/tain_earliest1.lo: src/libstddjb/tain_earliest1.c src/include/skalibs/tai.h +src/libstddjb/tain_earliestv.o src/libstddjb/tain_earliestv.lo: src/libstddjb/tain_earliestv.c src/include/skalibs/tai.h src/libstddjb/tain_fmt.o src/libstddjb/tain_fmt.lo: src/libstddjb/tain_fmt.c src/include/skalibs/fmtscan.h src/include/skalibs/tai.h src/libstddjb/tain_frac.o src/libstddjb/tain_frac.lo: src/libstddjb/tain_frac.c src/include/skalibs/tai.h src/libstddjb/tain_from_localtmn.o src/libstddjb/tain_from_localtmn.lo: src/libstddjb/tain_from_localtmn.c src/include/skalibs/djbtime.h diff --git a/src/include/skalibs/functypes.h b/src/include/skalibs/functypes.h @@ -19,7 +19,7 @@ typedef cmp_func *cmp_func_ref ; typedef void *dtok_func (uint32_t, void *) ; typedef dtok_func *dtok_func_ref ; -typedef int iter_func (char *, void *) ; +typedef int iter_func (void *, void *) ; typedef iter_func *iter_func_ref ; typedef void free_func (void *) ; diff --git a/src/include/skalibs/tai.h b/src/include/skalibs/tai.h @@ -125,6 +125,12 @@ extern int tain_sub (tain *, tain const *, tain const *) ; extern int tain_less (tain const *, tain const *) gccattr_pure ; #define tain_future(deadline) tain_less(&STAMP, (deadline)) +extern void tain_earliest1 (tain *, tain const *) ; +extern void tain_earliestv (tain *, tain const *const *, unsigned int) ; +#define tain_array(...) ((tain const *const[]){__VA_ARGS__}) +#define tain_earliestn(t, n, ...) tain_earliestv(t, tain_array(__VA_ARGS__), (n)) +#define tain_earliest(t, ...) tain_earliestn(t, sizeof(tain_array(__VA_ARGS__))/sizeof(tain const *), __VA_ARGS__) + #define TAIN_PACK 12 extern void tain_pack (char *, tain const *) ; extern void tain_unpack (char const *, tain *) ; diff --git a/src/libdatastruct/genset_deepfree.c b/src/libdatastruct/genset_deepfree.c @@ -3,10 +3,10 @@ #include <skalibs/functypes.h> #include <skalibs/genset.h> -static int freeiter (char *s, void *aux) +static int freeiter (void *s, void *aux) { free_func_ref f = aux ; - (*f)((void *)s) ; + (*f)(s) ; return 1 ; } diff --git a/src/libdatastruct/genset_iter_nocancel.c b/src/libdatastruct/genset_iter_nocancel.c @@ -1,5 +1,7 @@ /* ISC license. */ +#include <stdint.h> + #include <skalibs/bitarray.h> #include <skalibs/genset.h> diff --git a/src/libdatastruct/genset_iter_withcancel.c b/src/libdatastruct/genset_iter_withcancel.c @@ -2,6 +2,7 @@ #include <stdint.h> #include <errno.h> + #include <skalibs/genset.h> int genset_iter_withcancel (genset *g, iter_func_ref f, iter_func_ref cancelf, void *stuff) diff --git a/src/libdatastruct/gensetdyn_deepfree.c b/src/libdatastruct/gensetdyn_deepfree.c @@ -3,10 +3,10 @@ #include <skalibs/functypes.h> #include <skalibs/gensetdyn.h> -static int freeiter (char *s, void *aux) +static int freeiter (void *s, void *aux) { free_func_ref f = aux ; - (*f)((void *)s) ; + (*f)(s) ; return 1 ; } diff --git a/src/libdatastruct/gensetdyn_iter.c b/src/libdatastruct/gensetdyn_iter.c @@ -1,27 +0,0 @@ -/* ISC license. */ - -#include <sys/types.h> -#include <skalibs/bitarray.h> -#include <skalibs/gensetdyn.h> - -uint32_t gensetdyn_iter_nocancel (gensetdyn *g, uint32_t n, iter_func_ref f, void *stuff) -{ - /* - XXX: we may be called by a freeing function, so we cannot alloc - - XXX: so pray that the bitarray fits in the stack. - */ - unsigned char bits[bitarray_div8(g->storage.len) ? bitarray_div8(g->storage.len) : 1] ; - size_t i = 0 ; - uint32_t j = 0 ; - uint32_t *fl = genalloc_s(uint32_t, &g->freelist) ; - size_t sp = genalloc_len(uint32_t, &g->freelist) ; - bitarray_setn(bits, 0, g->storage.len) ; - - for (; i < sp ; i++) if (fl[i] < g->storage.len) bitarray_clear(bits, fl[i]) ; - for (i = 0 ; (i < g->storage.len) && (j < n) ; i++) if (bitarray_peek(bits, i)) - { - j++ ; - if (!(*f)(gensetdyn_p(g, i), stuff)) break ; - } - return j ; -} diff --git a/src/libdatastruct/gensetdyn_iter_nocancel.c b/src/libdatastruct/gensetdyn_iter_nocancel.c @@ -0,0 +1,29 @@ +/* ISC license. */ + +#include <stddef.h> +#include <stdint.h> + +#include <skalibs/bitarray.h> +#include <skalibs/gensetdyn.h> + +uint32_t gensetdyn_iter_nocancel (gensetdyn *g, uint32_t n, iter_func_ref f, void *stuff) +{ + /* + XXX: we may be called by a freeing function, so we cannot alloc - + XXX: so pray that the bitarray fits in the stack. + */ + unsigned char bits[bitarray_div8(g->storage.len) ? bitarray_div8(g->storage.len) : 1] ; + size_t i = 0 ; + uint32_t j = 0 ; + uint32_t *fl = genalloc_s(uint32_t, &g->freelist) ; + size_t sp = genalloc_len(uint32_t, &g->freelist) ; + bitarray_setn(bits, 0, g->storage.len) ; + + for (; i < sp ; i++) if (fl[i] < g->storage.len) bitarray_clear(bits, fl[i]) ; + for (i = 0 ; (i < g->storage.len) && (j < n) ; i++) if (bitarray_peek(bits, i)) + { + j++ ; + if (!(*f)(gensetdyn_p(g, i), stuff)) break ; + } + return j ; +} diff --git a/src/libdatastruct/gensetdyn_iter_withcancel.c b/src/libdatastruct/gensetdyn_iter_withcancel.c @@ -2,6 +2,7 @@ #include <stdint.h> #include <errno.h> + #include <skalibs/gensetdyn.h> int gensetdyn_iter_withcancel (gensetdyn *g, iter_func_ref f, iter_func_ref cancelf, void *stuff) diff --git a/src/libstddjb/tain_earliest1.c b/src/libstddjb/tain_earliest1.c @@ -0,0 +1,8 @@ +/* ISC license. */ + +#include <skalibs/tai.h> + +void tain_earliest1 (tain *t, tain const *u) +{ + if (tain_less(u, t)) *t = *u ; +} diff --git a/src/libstddjb/tain_earliestv.c b/src/libstddjb/tain_earliestv.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include <skalibs/tai.h> + +void tain_earliestv (tain *t, tain const *const *v, unsigned int n) +{ + for (unsigned int i = 0 ; i < n ; i++) + if (tain_less(v[i], t)) *t = *v[i] ; +}