aboutsummaryrefslogtreecommitdiff
path: root/tinyalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'tinyalloc.c')
-rw-r--r--tinyalloc.c39
1 files changed, 39 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);
}