#include #include #include #define HEAP_SIZE (256 * 4096) uint8_t* global_heap_data[HEAP_SIZE]; struct Heap_Metadata global_heap; void heap_init() { global_heap.size = HEAP_SIZE; global_heap.start = (struct Heap_Block*) global_heap_data; struct Heap_Block* start = global_heap.start; start->size = HEAP_SIZE; start->used = false; start->data = start + 1; start->next = 0; } void* malloc(size_t size) { struct Heap_Block* current = global_heap.start; while (true) { if (current->used || current->size < size) { current = current->next; continue; } if (current == 0) { return 0; } struct Heap_Block* next = current->data + size; next->next = current->next; next->size = current->size - size - sizeof(struct Heap_Block); next->data = next + 1; current->next = next; current->size = size; current->used = true; return current->data; } } void free(void *ptr) { struct Heap_Block* current = global_heap.start; while (current->data != ptr) { current = current->next; } struct Heap_Block* start = current; current->used = false; while (current->used == false) { current = current->next; } start->next = current; start->size = (uint32_t)start->next - (uint32_t)start->data; }