aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);