diff options
| author | Xavier Del Campo Romero <xavi92@disroot.org> | 2025-07-12 17:05:57 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi92@disroot.org> | 2025-07-26 00:27:56 +0200 |
| commit | 18194dbd09a81e2993cf03153e1d810aa8abe4cc (patch) | |
| tree | b60ed8a3d8a51b2ea10d32ec28a84644b5c16064 | |
| parent | b60fcd7a351dea8a51f3ec95b19fc0d0d2e4dcd9 (diff) | |
Implement ta_realloc
| -rw-r--r-- | tinyalloc.c | 39 | ||||
| -rw-r--r-- | tinyalloc.h | 1 |
2 files changed, 40 insertions, 0 deletions
diff --git a/tinyalloc.c b/tinyalloc.c index eb9fa3f..67e6220 100644 --- a/tinyalloc.c +++ b/tinyalloc.c @@ -253,6 +253,45 @@ static size_t count_blocks(Block *ptr) { return num; } +static Block *find(void *ptr) +{ + Block *block = heap->used; + while (block != NULL) { + if (ptr == block->addr) + return block; + block = block->next; + } + + return NULL; +} + +void *ta_realloc(void *ptr, size_t n) { + if (!ptr) + return ta_alloc(n); + + Block *prev = find(ptr); + + if (!ptr) + return NULL; + else if (n <= prev->size) + { + prev->size = n; + return prev->addr; + } + + char *const new = ta_alloc(n), *p = new; + const char *src = prev->addr; + + if (!new) + return NULL; + + for (size_t i = 0; i < prev->size; i++) + *p++ = *src++; + + ta_free(prev->addr); + return new; +} + size_t ta_num_free() { return count_blocks(heap->free); } diff --git a/tinyalloc.h b/tinyalloc.h index 113f147..628b4d8 100644 --- a/tinyalloc.h +++ b/tinyalloc.h @@ -7,6 +7,7 @@ extern "C" { bool ta_init(const void *base, const void *limit, const size_t heap_blocks, const size_t split_thresh, const size_t alignment); void *ta_alloc(size_t num); +void *ta_realloc(void *ptr, size_t n); void *ta_calloc(size_t num, size_t size); bool ta_free(void *ptr); |
