aboutsummaryrefslogtreecommitdiff
path: root/lib/arena.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/arena.c')
-rw-r--r--lib/arena.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/arena.c b/lib/arena.c
index dd12d0c..8cd1748 100644
--- a/lib/arena.c
+++ b/lib/arena.c
@@ -10,12 +10,18 @@ region *new_region(size_t cap) {
return r;
}
+arena arena_init_cap(size_t cap) {
+ arena a = {0};
+ a.region_cap = cap;
+ return a;
+}
+
void *arena_alloc(arena *a, size_t size_bytes) {
size_t size = (size_bytes + sizeof(uintptr_t)-1)/sizeof(uintptr_t);
if (a->end == NULL) {
assert(a->beg == NULL);
- size_t capacity = ARENA_REGION_DEFAULT_CAPACITY;
+ size_t capacity = a->region_cap ? a->region_cap : ARENA_REGION_DEFAULT_CAPACITY;
if (capacity < size) capacity = size;
a->beg = new_region(capacity);
a->end = a->beg;
@@ -26,7 +32,7 @@ void *arena_alloc(arena *a, size_t size_bytes) {
}
if (a->end->len + size > a->end->cap) {
- size_t capacity = ARENA_REGION_DEFAULT_CAPACITY;
+ size_t capacity = a->region_cap ? a->region_cap : ARENA_REGION_DEFAULT_CAPACITY;
if (capacity < size) capacity = size;
a->beg = new_region(capacity);
a->end->next = new_region(capacity);
@@ -47,6 +53,17 @@ void arena_free(arena *a) {
}
}
+void *arena_realloc(arena *a, void *oldptr, size_t oldsz, size_t newsz) {
+ if (newsz <= oldsz) return oldptr;
+ void *newptr = arena_alloc(a, newsz);
+ char *newptr_char = (char*)newptr;
+ char *oldptr_char = (char*)oldptr;
+ for (size_t i = 0; i < oldsz; ++i) {
+ newptr_char[i] = oldptr_char[i];
+ }
+ return newptr;
+}
+
void grow_da(void *slice, size_t size, arena *arena) {
struct {
void *data;