#include "vstack.h" #include #include //#define DEBUG #include "debug.h" struct __vstack_t { cmph_uint32 pointer; cmph_uint32 *values; cmph_uint32 capacity; }; vstack_t *vstack_new(void) { vstack_t *stack = (vstack_t *)malloc(sizeof(vstack_t)); assert(stack); stack->pointer = 0; stack->values = NULL; stack->capacity = 0; return stack; } void vstack_destroy(vstack_t *stack) { assert(stack); free(stack->values); free(stack); } void vstack_push(vstack_t *stack, cmph_uint32 val) { assert(stack); vstack_reserve(stack, stack->pointer + 1); stack->values[stack->pointer] = val; ++(stack->pointer); } void vstack_pop(vstack_t *stack) { assert(stack); assert(stack->pointer > 0); --(stack->pointer); } cmph_uint32 vstack_top(vstack_t *stack) { assert(stack); assert(stack->pointer > 0); return stack->values[(stack->pointer - 1)]; } int vstack_empty(vstack_t *stack) { assert(stack); return stack->pointer == 0; } cmph_uint32 vstack_size(vstack_t *stack) { return stack->pointer; } void vstack_reserve(vstack_t *stack, cmph_uint32 size) { assert(stack); if (stack->capacity < size) { cmph_uint32 new_capacity = stack->capacity + 1; DEBUGP("Increasing current capacity %u to %u\n", stack->capacity, size); while (new_capacity < size) { new_capacity *= 2; } stack->values = (cmph_uint32 *)realloc(stack->values, sizeof(cmph_uint32)*new_capacity); assert(stack->values); stack->capacity = new_capacity; DEBUGP("Increased\n"); } }