diff options
| author | 0scar <qgt268@alumni.ku.dk> | 2020-09-29 06:51:02 +0000 |
|---|---|---|
| committer | 0scar <qgt268@alumni.ku.dk> | 2023-07-28 09:48:17 +0000 |
| commit | 6c16f339224a4736f4ed57d15bb3e5f968a635ab (patch) | |
| tree | ab13afea4b6f9acfb4a139a3125f265c90bc9d80 /src/stack.c | |
Initial independent commit
Diffstat (limited to 'src/stack.c')
| -rw-r--r-- | src/stack.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/stack.c b/src/stack.c new file mode 100644 index 0000000..edc2d9f --- /dev/null +++ b/src/stack.c @@ -0,0 +1,88 @@ +#include <stdlib.h> +#include <engine/logging.h> +#include <engine/stack.h> + + +Stack stack_new_ex(const usize element_size, const usize size) { + Stack s = { + .head = 0, + .elem_size = element_size, + .size = element_size * size, + .chunk_size = element_size * size, + .data = NULL, + }; + + s.data = (void*)calloc(element_size, size); + return s; +} + + +Stack stack_new(const usize element_size) { + return stack_new_ex(element_size, 512); +} + + +void stack_free(Stack *s) { + if (s->data == NULL) return; + free(s->data); + s->data = NULL; +} + + +void *stack_pop(Stack *s) { + if (s->head == 0) return NULL; /* Empty stack */ + return (u8*)s->data + (--(s->head) * s->elem_size); +} + + +void stack_push(Stack *s, void *elem) { + if (elem == NULL) {WARN("%s received a nullptr", __func__); return;} + if (s->head > 0 && s->head * s->elem_size >= s->size) { + WARN("Allocating more stack memory"); + /* Reallocate more memory and update size */ + void* ptr = realloc(s->data, s->size + s->chunk_size); + if (ptr == NULL) { + ERROR("Failed to resize memory for stack"); + exit(EXIT_FAILURE); + } + s->data = ptr; + //memset((void*)((u64)s->data + (s->size - s->elem_size)), 0, s->chunk_size); + s->size += s->chunk_size; + } + memcpy((u8*)s->data + s->head * s->elem_size, elem, s->elem_size); + s->head++; +} + + +void *stack_peek(Stack *s) { + if (s->head <= 0) return NULL; /* Empty stack */ + return (u8*)s->data + ((s->head - 1) * s->elem_size); +} + + +isize stack_size(const Stack *s) { + return s->head; +} + + +void stack_swap(Stack *s, Stack *t) { + if (s->size > t->size) { + t->data = realloc(t->data, s->size); + } else if (t->size > s->size) { + s->data = realloc(s->data, t->size); + } + void* tmp = malloc(s->size); + if (tmp == NULL) { + ERROR("Failed to allocate memory for stack swapping!"); + exit(EXIT_FAILURE); + } + isize shead = s->head; + + memcpy(tmp, s->data, s->size); + memcpy(s->data, t->data, t->size); + memcpy(t->data, tmp, s->size); + + s->head = t->head; + t->head = shead; + free(tmp); +} |
