libdvec-c

C memory vector library
git clone https://git.sinitax.com/sinitax/libdvec-c
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

commit c07f674f77a21bed3c1ed4a8569b82cd92f8af28
parent b20f5583df6f044656eee78beea4bb4f6165ef7b
Author: Louis Burda <quent.burda@gmail.com>
Date:   Mon, 13 Mar 2023 20:59:26 +0100

Return errno directly for thread-safety

Diffstat:
Minclude/vec.h | 24++++++++++++++----------
Mlibvec.api | 2--
Mlibvec.lds | 4+---
Msrc/test.c | 12++++++------
Msrc/vec.c | 47++++++++++++++++-------------------------------
5 files changed, 37 insertions(+), 52 deletions(-)

diff --git a/include/vec.h b/include/vec.h @@ -13,7 +13,7 @@ struct vec { int vec_init(struct vec *vec, size_t dsize, size_t cap); void vec_deinit(struct vec *vec); -struct vec *vec_alloc(size_t dsize, size_t cap); +int vec_alloc(struct vec **vec, size_t dsize, size_t cap); void vec_free(struct vec *vec); void vec_clear(struct vec *vec); @@ -27,8 +27,6 @@ void vec_replace(struct vec *vec, size_t index, const void *data, size_t count); bool vec_iter_fwd(struct vec *vec, void **p); bool vec_iter_bwd(struct vec *vec, void **p); -extern int libvec_errno; - static inline void * vec_at(struct vec *vec, size_t index) { @@ -53,17 +51,23 @@ vec_empty(struct vec *vec) return !vec->len; } -static inline void * -vec_alloc_slots(struct vec *vec, size_t count) +static inline int +vec_alloc_slots(struct vec *vec, void **out, size_t count) { - vec_reserve(vec, vec->len, count); - return vec->data + (vec->len - count) * vec->dsize; + int ret; + + ret = vec_reserve(vec, vec->len, count); + if (ret) return ret; + + *out = vec->data + (vec->len - count) * vec->dsize; + + return 0; } -static inline void * -vec_alloc_slot(struct vec *vec) +static inline int +vec_alloc_slot(struct vec *vec, void **out) { - return vec_alloc_slots(vec, 1); + return vec_alloc_slots(vec, out, 1); } static inline void diff --git a/libvec.api b/libvec.api @@ -1,5 +1,3 @@ -libvec_errno - vec_init vec_deinit diff --git a/libvec.lds b/libvec.lds @@ -1,7 +1,5 @@ -LIBVEC_1.2 { +LIBVEC_1.3 { global: - libvec_errno; - vec_init; vec_deinit; diff --git a/src/test.c b/src/test.c @@ -5,21 +5,21 @@ #include <string.h> #include <stdlib.h> -#define LIBVEC_ERR() errx(1, "test: libvec: %s", strerror(libvec_errno)) +#define LIBVEC_ERR(rc) errx(1, "libvec: %s", strerror(rc)) int main(int argc, const char **argv) { struct vec vec; - int i, ret; + int i, rc; int *val; - ret = vec_init(&vec, sizeof(int), 10); - if (ret) LIBVEC_ERR(); + rc = vec_init(&vec, sizeof(int), 10); + if (rc) LIBVEC_ERR(rc); for (i = 1; i < argc; i++) { - val = vec_alloc_slot(&vec); - if (!val) LIBVEC_ERR(); + rc = vec_alloc_slot(&vec, (void **)&val); + if (rc) LIBVEC_ERR(rc); *val = atoi(argv[i]); } diff --git a/src/vec.c b/src/vec.c @@ -11,8 +11,6 @@ #define LIBVEC_CHECK(x) #endif -int libvec_errno = 0; - static inline void libvec_assert(int cond, const char *file, int line, const char *condstr) { @@ -35,10 +33,7 @@ vec_init(struct vec *vec, size_t dsize, size_t cap) vec->data = NULL; if (vec->cap) { vec->data = calloc(cap, dsize); - if (!vec->data) { - libvec_errno = errno; - return libvec_errno; - } + if (!vec->data) return errno; } return 0; @@ -52,25 +47,23 @@ vec_deinit(struct vec *vec) free(vec->data); } -struct vec * -vec_alloc(size_t dsize, size_t cap) +int +vec_alloc(struct vec **vec, size_t dsize, size_t cap) { - struct vec *vec; + int rc; - LIBVEC_CHECK(dsize > 0 && cap > 0); + LIBVEC_CHECK(vec != NULL && dsize > 0 && cap > 0); - vec = malloc(sizeof(struct vec)); - if (!vec) { - libvec_errno = errno; - return NULL; - } + *vec = malloc(sizeof(struct vec)); + if (!*vec) return errno; - if (!vec_init(vec, dsize, cap)) { + rc = vec_init(*vec, dsize, cap); + if (rc) { free(vec); - return NULL; + return rc; } - return vec; + return 0; } void @@ -82,6 +75,7 @@ vec_free(struct vec *vec) free(vec); } + void vec_clear(struct vec *vec) { @@ -99,10 +93,7 @@ vec_resize(struct vec *vec, size_t cap) vec->cap = cap; alloc = realloc(vec->data, vec->cap * vec->dsize); - if (!alloc) { - libvec_errno = errno; - return libvec_errno; - } + if (!alloc) return errno; vec->data = alloc; return 0; @@ -122,10 +113,7 @@ vec_shrink(struct vec *vec) } alloc = realloc(vec->data, vec->cap * vec->dsize); - if (!alloc) { - libvec_errno = errno; - return libvec_errno; - } + if (!alloc) return errno; vec->data = alloc; return 0; @@ -143,10 +131,7 @@ vec_reserve(struct vec *vec, size_t index, size_t len) if (vec->len + len > vec->cap) vec->cap = vec->len + len; alloc = realloc(vec->data, vec->cap * vec->dsize); - if (!alloc) { - libvec_errno = errno; - return errno; - } + if (!alloc) return errno; vec->data = alloc; } @@ -158,7 +143,7 @@ vec_reserve(struct vec *vec, size_t index, size_t len) vec->len += len; - return true; + return 0; } void