diff options
Diffstat (limited to 'tinyalloc.c')
| -rw-r--r-- | tinyalloc.c | 39 |
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); } |
