aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi92@disroot.org>2025-07-12 17:05:57 +0200
committerXavier Del Campo Romero <xavi92@disroot.org>2025-07-26 00:27:56 +0200
commit18194dbd09a81e2993cf03153e1d810aa8abe4cc (patch)
treeb60ed8a3d8a51b2ea10d32ec28a84644b5c16064
parentb60fcd7a351dea8a51f3ec95b19fc0d0d2e4dcd9 (diff)
Implement ta_realloc
-rw-r--r--tinyalloc.c39
-rw-r--r--tinyalloc.h1
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);