diff options
author | Tyler Murphy <tylerm@tylerm.dev> | 2023-05-06 00:39:44 -0400 |
---|---|---|
committer | Tyler Murphy <tylerm@tylerm.dev> | 2023-05-06 00:39:44 -0400 |
commit | d8f2c10b7108fff6b7e437291093a1cadc15ab9f (patch) | |
tree | 3fc50a19d6fbb9c94a8fe147cd2a6c4ba7f59b8d /lib/stack.c | |
parent | ansii c (diff) | |
download | lazysphere-d8f2c10b7108fff6b7e437291093a1cadc15ab9f.tar.gz lazysphere-d8f2c10b7108fff6b7e437291093a1cadc15ab9f.tar.bz2 lazysphere-d8f2c10b7108fff6b7e437291093a1cadc15ab9f.zip |
refactor
Diffstat (limited to 'lib/stack.c')
-rw-r--r-- | lib/stack.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/stack.c b/lib/stack.c new file mode 100644 index 0000000..acffc1a --- /dev/null +++ b/lib/stack.c @@ -0,0 +1,43 @@ +#include "stack.h" + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +void stack_init(struct Stack* stack, size_t size) { + stack->size = 0; + stack->capacity = size; + stack->data = malloc(size); +} + +void stack_push(struct Stack* stack, void* data, size_t len) { + size_t new_size = stack->size + len; + if (new_size >= stack->capacity) { + stack->capacity = new_size * 2; + stack->data = realloc(stack->data, stack->capacity); + } + memcpy((uint8_t*)stack->data + stack->size, data, len); + stack->size += len; +} + +void* stack_pop(struct Stack* stack, size_t len) { + if (stack->size < len) return NULL; + stack->size -= len; + return (uint8_t*)stack->data + stack->size; +} + +void stack_free(struct Stack *stack) { + free(stack->data); +} + +void stack_push_int(struct Stack *stack, int value) { + stack_push(stack, &value, sizeof(int)); +} + +bool stack_pop_int(struct Stack *stack, int* value) { + void* d = stack_pop(stack, sizeof(int)); + if (d == NULL) return false; + *value = *(int*)(d); + return true; +} |