7 #include <system/stacktrace.h>
16 void destroy_stack(Stack stack)
22 void stack_grow(Stack *stack, size_t new_capacity)
25 trace_assert(stack->capacity < new_capacity);
27 stack->bottom = realloc(stack->bottom, new_capacity);
28 stack->capacity = new_capacity;
32 void stack_push(Stack *stack, const void *element, size_t element_size)
35 trace_assert(element);
36 trace_assert(element_size > 0);
38 size_t frame_size = element_size + sizeof(element_size);
40 if (frame_size >= (stack->capacity - stack->size)) {
41 stack_grow(stack, stack->capacity * 2 + frame_size);
44 trace_assert(stack->bottom);
46 memcpy(stack->bottom + stack->size, element, element_size);
47 stack->size += element_size;
48 memcpy(stack->bottom + stack->size, &element_size, sizeof(element_size));
49 stack->size += sizeof(element_size);
53 size_t stack_top_size(const Stack *stack)
56 trace_assert(stack->size > 0);
57 trace_assert(stack->bottom);
58 size_t stack_size = 0;
59 memcpy(&stack_size, stack->bottom + stack->size - sizeof(size_t), sizeof(size_t));
64 void *stack_top_element(const Stack *stack)
67 trace_assert(stack->size > 0);
68 trace_assert(stack->bottom);
69 size_t element_size = stack_top_size(stack);
70 return stack->bottom + stack->size - element_size - sizeof(size_t);
74 void stack_pop(Stack *stack)
77 trace_assert(stack->size > 0);
78 size_t element_size = stack_top_size(stack);
79 stack->size -= element_size + sizeof(size_t);
83 int stack_empty(Stack *stack)
86 return stack->size > 0;