diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-10-17 20:55:48 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2025-10-17 20:55:48 +0000 |
| commit | 1d769dd630932b265cd15bb2e5b97459766e3125 (patch) | |
| tree | d76bd3467c5b0388b6fecfcf435f85897b8a27aa /src | |
| parent | 96b537f42695da1b865588baf591fdfcae76bd41 (diff) | |
| download | skalibs-1d769dd630932b265cd15bb2e5b97459766e3125.tar.gz | |
Add string qsort/bsearch cmp functions and avltreeb wrappers
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/skalibs/avltreen.h | 30 | ||||
| -rw-r--r-- | src/include/skalibs/bytestr.h | 5 | ||||
| -rw-r--r-- | src/libdatastruct/avltreeb_init.c | 14 | ||||
| -rw-r--r-- | src/libstddjb/bytestr-internal.h | 11 | ||||
| -rw-r--r-- | src/libstddjb/fd_unlock.c | 2 | ||||
| -rw-r--r-- | src/libstddjb/gol_main.c | 2 | ||||
| -rw-r--r-- | src/libstddjb/str_bcmp.c | 10 | ||||
| -rw-r--r-- | src/libstddjb/str_cmp.c | 10 | ||||
| -rw-r--r-- | src/libstddjb/stringkey_bcmp.c | 12 | ||||
| -rw-r--r-- | src/libstddjb/stringkey_cmp.c | 13 |
10 files changed, 107 insertions, 2 deletions
diff --git a/src/include/skalibs/avltreen.h b/src/include/skalibs/avltreen.h index 511452d..96eb284 100644 --- a/src/include/skalibs/avltreen.h +++ b/src/include/skalibs/avltreen.h @@ -64,4 +64,34 @@ extern int avltreen_delete (avltreen *, void const *) ; #define avltreen_iter_nocancel(t, cut, f, p) avlnode_iter_nocancel(avltreen_nodes(t), avltreen_totalsize(t), cut, avltreen_root(t), f, p) #define avltreen_iter_withcancel(t, f, cancelf, p) avlnode_iter_withcancel(avltreen_nodes(t), avltreen_totalsize(t), avltreen_root(t), f, cancelf, p) + +#define AVLTREEB_SPACE(n) (sizeof(avltreen) + (n)*sizeof(avlnode) + ((n)+1)*sizeof(uint32_t)) +#define avltreeb_totalsize(t) avltreen_totalsize((avltreen const *)(t)) +#define avltreeb_len(t) avltreen_len((avltreen const *)(t)) +#define avltreeb_nodes(t) avltreen_nodes((avltreen const *)(t)) +#define avltreeb_data(t, d) avltreen_data((avltreen const *)(t), d) +#define avltreeb_root(t) avltreen_root((avltreen const *)(t)) +#define avltreeb_setroot(t, r) avltreen_setroot((avltreen *)(t), r) + +extern void avltreeb_init (void *, uint32_t, dtok_func_ref, cmp_func_ref, void *) ; +#define avltreeb_searchnode(t, k) avltreen_searchnode((avltreen const *)(t), k) +#define avltreeb_search(t, k, data) avltreen_search((avltreen const *)(t), k, data) +#define avltreeb_height(t) avltreen_height((avltreen const *)(t)) +#define avltreeb_extremenode(t, h) avltreen_extremenode((avltreen const *)(t), h) +#define avltreeb_minnode(t) avltreen_minnode((avltreen const *)(t)) +#define avltreeb_maxnode(t) avltreen_maxnode((avltreen const *)(t)) +#define avltreeb_extreme(t, h, data) avltreen_extreme((avltreen const *)(t), h, data) +#define avltreeb_min(t, data) avltreen_min((avltreen const *)(t), data) +#define avltreeb_max(t, data) avltreen_max((avltreen const *)(t), data) + +#define avltreeb_newnode(t, i) avltreen_newnode((avltreen *)(t), d) +#define avltreeb_insertnode(t, i) avltreen_insertnode((avltreen *)(t), i) +#define avltreeb_insert(t, d) avltreen_insert((avltreen *)(t), d) +#define avltreeb_delete(t, k) avltreen_delete((avltreen *)(t), k) + +#define avltreeb_iter(t, f, p) avltreen_iter((avltreen *)(t), f, p) +#define avltreeb_iter_nocancel(t, cut, f, p) avltreen_iter_nocancel((avltreen *)(t), cut, f, p) +#define avltreeb_iter_withcancel(t, f, cancelf, p) avltreen_iter_withcancel((avltreen *)(t), f, cancelf, p) + + #endif diff --git a/src/include/skalibs/bytestr.h b/src/include/skalibs/bytestr.h index 30695f8..c99a94b 100644 --- a/src/include/skalibs/bytestr.h +++ b/src/include/skalibs/bytestr.h @@ -50,4 +50,9 @@ extern void case_upperb (char *, size_t) ; #define case_starts(s, t) case_startb(s, strlen(s), t) extern int case_startb (char const *, size_t, char const *) gccattr_pure ; +extern int str_cmp (void const *, void const *) gccattr_pure ; +extern int str_bcmp (void const *, void const *) gccattr_pure ; +extern int stringkey_cmp (void const *, void const *) gccattr_pure ; +extern int stringkey_bcmp (void const *, void const *) gccattr_pure ; + #endif diff --git a/src/libdatastruct/avltreeb_init.c b/src/libdatastruct/avltreeb_init.c new file mode 100644 index 0000000..a641848 --- /dev/null +++ b/src/libdatastruct/avltreeb_init.c @@ -0,0 +1,14 @@ +/* ISC license. */ + +#include <stdint.h> + +#include <skalibs/avlnode.h> +#include <skalibs/avltreen.h> + +void avltreeb_init (void *blob, uint32_t size, dtok_func_ref dtok, cmp_func_ref f, void *p) +{ + avltreen *t = blob ; + avlnode *storage = (avlnode *)(t + 1) ; + uint32_t *freelist = (uint32_t *)(storage + size) ; + avltreen_init(t, storage, freelist, size, dtok, f, p) ; +} diff --git a/src/libstddjb/bytestr-internal.h b/src/libstddjb/bytestr-internal.h new file mode 100644 index 0000000..effb0c5 --- /dev/null +++ b/src/libstddjb/bytestr-internal.h @@ -0,0 +1,11 @@ +/* ISC license. */ + +#ifndef BYTESTR_INTERNAL_H +#define BYTESTR_INTERNAL_H + +struct stringkey_s +{ + char const *s ; +} ; + +#endif diff --git a/src/libstddjb/fd_unlock.c b/src/libstddjb/fd_unlock.c index 64984b9..f9758b5 100644 --- a/src/libstddjb/fd_unlock.c +++ b/src/libstddjb/fd_unlock.c @@ -8,7 +8,7 @@ void fd_unlock (int fd) { - struct flock fl = + static struct flock const fl = { .l_type = F_UNLCK, .l_whence = SEEK_SET, diff --git a/src/libstddjb/gol_main.c b/src/libstddjb/gol_main.c index 1915fca..d7b1026 100644 --- a/src/libstddjb/gol_main.c +++ b/src/libstddjb/gol_main.c @@ -7,7 +7,7 @@ unsigned int gol_main (int argc, char const *const *argv, gol_bool const *b, unsigned int bn, gol_arg const *a, unsigned int an, uint64_t *br, char const **ar) { - if (argc < 1 || argv[argc]) strerr_diefu1x(100, "gol: invalid argc/argv") ; + if (argc < 1 || argv[argc]) strerr_diefu1x(103, "gol: invalid argc/argv") ; if (argc == 1) return 1 ; return 1 + gol_argv(argv + 1, b, bn, a, an, br, ar) ; } diff --git a/src/libstddjb/str_bcmp.c b/src/libstddjb/str_bcmp.c new file mode 100644 index 0000000..e2248e1 --- /dev/null +++ b/src/libstddjb/str_bcmp.c @@ -0,0 +1,10 @@ +/* ISC license. */ + +#include <string.h> + +#include <skalibs/bytestr.h> + +int str_bcmp (void const *a, void const *b) +{ + return strcmp((char const *)a, *(char const *const *)b) ; +} diff --git a/src/libstddjb/str_cmp.c b/src/libstddjb/str_cmp.c new file mode 100644 index 0000000..b19b834 --- /dev/null +++ b/src/libstddjb/str_cmp.c @@ -0,0 +1,10 @@ +/* ISC license. */ + +#include <string.h> + +#include <skalibs/bytestr.h> + +int str_cmp (void const *a, void const *b) +{ + return strcmp(*(char const *const *)a, *(char const *const *)b) ; +} diff --git a/src/libstddjb/stringkey_bcmp.c b/src/libstddjb/stringkey_bcmp.c new file mode 100644 index 0000000..e77c35e --- /dev/null +++ b/src/libstddjb/stringkey_bcmp.c @@ -0,0 +1,12 @@ +/* ISC license. */ + +#include <string.h> + +#include <skalibs/bytestr.h> +#include "bytestr-internal.h" + +int stringkey_bcmp (void const *a, void const *b) +{ + struct stringkey_s const *bb = b ; + return strcmp((char const *)a, bb->s) ; +} diff --git a/src/libstddjb/stringkey_cmp.c b/src/libstddjb/stringkey_cmp.c new file mode 100644 index 0000000..5c683c1 --- /dev/null +++ b/src/libstddjb/stringkey_cmp.c @@ -0,0 +1,13 @@ +/* ISC license. */ + +#include <string.h> + +#include <skalibs/bytestr.h> +#include "bytestr-internal.h" + +int stringkey_cmp (void const *a, void const *b) +{ + struct stringkey_s const *aa = a ; + struct stringkey_s const *bb = b ; + return strcmp(aa->s, bb->s) ; +} |
