commit f9faaa737978d3ae0e1c73f950630bf982009950
parent 29d8214bd5107fee78ef75e5830d608ac04777fe
Author: Louis Burda <quent.burda@gmail.com>
Date: Sat, 13 May 2023 18:19:43 +0200
Update liballoc
Diffstat:
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;