| #include "vstack.h" |
| |
| #include <stdlib.h> |
| #include <assert.h> |
| |
| //#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"); |
| } |
| } |
| |