diff options
Diffstat (limited to 'src/code/gamealloc.c')
| -rw-r--r-- | src/code/gamealloc.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/code/gamealloc.c b/src/code/gamealloc.c new file mode 100644 index 0000000..f953028 --- /dev/null +++ b/src/code/gamealloc.c @@ -0,0 +1,60 @@ +#include "gamealloc.h" +#include "malloc.h" +#include "libc/stdint.h" + +void func_800D3720_jp(GameAlloc* this) { + GameAllocEntry* iter = this->base.next; + + while (&this->base != iter) { + iter = iter->next; + } +} + +void* gamealloc_malloc(GameAlloc* this, size_t size) { + GameAllocEntry* ptr = malloc(size + sizeof(GameAllocEntry)); + + if (ptr != NULL) { + ptr->size = size; + ptr->prev = this->head; + this->head->next = ptr; + this->head = ptr; + ptr->next = &this->base; + this->base.prev = this->head; + + return ptr + 1; + } + + return NULL; +} + +void gamealloc_free(GameAlloc* this, void* ptr) { + if (ptr != NULL) { + GameAllocEntry* entry = (GameAllocEntry*)ptr - 1; + + entry->prev->next = entry->next; + entry->next->prev = entry->prev; + this->head = this->base.prev; + free(entry); + } +} + +void gamealloc_cleanup(GameAlloc* this) { + GameAllocEntry* iter = this->base.next; + + while (&this->base != iter) { + GameAllocEntry* cur = iter; + + iter = iter->next; + free(cur); + } + + this->head = &this->base; + this->base.next = &this->base; + this->base.prev = &this->base; +} + +void gamealloc_init(GameAlloc* this) { + this->head = &this->base; + this->base.next = &this->base; + this->base.prev = &this->base; +} |
