libdvec-c

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

commit f9faaa737978d3ae0e1c73f950630bf982009950
parent 29d8214bd5107fee78ef75e5830d608ac04777fe
Author: Louis Burda <quent.burda@gmail.com>
Date:   Sat, 13 May 2023 18:19:43 +0200

Update liballoc

Diffstat:
M.gitmodules | 2+-
Minclude/dvec.h | 4++--
Msrc/dvec.c | 62++++++++++++++++++++++++++++++++++++++++----------------------
3 files changed, 43 insertions(+), 25 deletions(-)

diff --git a/.gitmodules b/.gitmodules @@ -1,3 +1,3 @@ [submodule "lib/liballoc"] path = lib/liballoc - url = git@sinitax.com:snx/liballoc + url = git@sinitax.com:sinitax/liballoc diff --git a/include/dvec.h b/include/dvec.h @@ -42,8 +42,8 @@ int dvec_init(struct dvec *dvec, size_t dsize, size_t cap, const struct allocator *allocator); int dvec_deinit(struct dvec *dvec); -int dvec_alloc(struct dvec **dvec, size_t dsize, size_t cap, - const struct allocator *allocator); +struct dvec *dvec_alloc(size_t dsize, size_t cap, + const struct allocator *allocator, int *rc); int dvec_free(struct dvec *dvec); int dvec_copy(struct dvec *dst, struct dvec *src); diff --git a/src/dvec.c b/src/dvec.c @@ -29,9 +29,9 @@ dvec_init(struct dvec *dvec, size_t dsize, size_t cap, dvec->len = 0; dvec->data = NULL; if (dvec->cap) { - rc = allocator->alloc(&dvec->data, cap * dsize); - LIBDVEC_ABORT_ON_ALLOC(rc); - if (rc) return -rc; + dvec->data = allocator->alloc(cap * dsize, &rc); + LIBDVEC_ABORT_ON_ALLOC(!dvec->data); + if (!dvec->data) return -rc; } return 0; @@ -50,22 +50,31 @@ dvec_deinit(struct dvec *dvec) return -rc; } -int -dvec_alloc(struct dvec **dvec, size_t dsize, size_t cap, - const struct allocator *allocator) +struct dvec * +dvec_alloc(size_t dsize, size_t cap, + const struct allocator *allocator, int *_rc) { - int rc; + struct dvec *dvec; + int *rc, stub; LIBDVEC_ABORT_ON_ARGS(!allocator); - rc = allocator->alloc((void **)dvec, sizeof(struct dvec)); - LIBDVEC_ABORT_ON_ALLOC(rc); - if (rc) return -rc; + rc = _rc ? _rc : &stub; - rc = dvec_init(*dvec, dsize, cap, allocator); - if (rc) return rc; + dvec = allocator->alloc(sizeof(struct dvec), rc); + LIBDVEC_ABORT_ON_ALLOC(!dvec); + if (!dvec) { + *rc = -*rc; + return NULL; + } - return 0; + *rc = dvec_init(dvec, dsize, cap, allocator); + if (*rc) { + allocator->free(dvec); + return NULL; + } + + return dvec; } int @@ -128,18 +137,22 @@ dvec_clear(struct dvec *dvec) int dvec_reserve(struct dvec *dvec, size_t len) { + void *data; + size_t cap; int rc; LIBDVEC_ABORT_ON_ARGS(!dvec); if (len <= dvec->cap) return 0; - dvec->cap *= 2; - if (len > dvec->cap) dvec->cap = len; + cap = 2 * dvec->cap; + if (len > cap) cap = len; - rc = dvec->allocator->realloc(&dvec->data, dvec->cap * dvec->dsize); - LIBDVEC_ABORT_ON_ALLOC(rc); - if (rc) return -rc; + data = dvec->allocator->realloc(dvec->data, cap * dvec->dsize, &rc); + LIBDVEC_ABORT_ON_ALLOC(!data); + if (!data) return -rc; + dvec->data = data; + dvec->cap = cap; return 0; } @@ -147,6 +160,8 @@ dvec_reserve(struct dvec *dvec, size_t len) int dvec_shrink(struct dvec *dvec) { + void *data; + size_t cap; int rc; LIBDVEC_ABORT_ON_ARGS(!dvec); @@ -157,10 +172,13 @@ dvec_shrink(struct dvec *dvec) LIBDVEC_ABORT_ON_ALLOC(rc); if (rc) return -rc; } else { - dvec->cap = dvec->len; - rc = dvec->allocator->realloc(&dvec->data, dvec->cap * dvec->dsize); - LIBDVEC_ABORT_ON_ALLOC(rc); - if (rc) return -rc; + cap = dvec->len; + data = dvec->allocator->realloc(&dvec->data, + cap * dvec->dsize, &rc); + LIBDVEC_ABORT_ON_ALLOC(!data); + if (!data) return -rc; + dvec->data = data; + dvec->cap = cap; } return 0;