1 #include "vstack.h" 2 3 #include <stdlib.h> 4 #include <assert.h> 5 6 //#define DEBUG 7 #include "debug.h" 8 9 struct __vstack_t 10 { 11 cmph_uint32 pointer; 12 cmph_uint32 *values; 13 cmph_uint32 capacity; 14 }; 15 vstack_new(void)16vstack_t *vstack_new(void) 17 { 18 vstack_t *stack = (vstack_t *)malloc(sizeof(vstack_t)); 19 assert(stack); 20 stack->pointer = 0; 21 stack->values = NULL; 22 stack->capacity = 0; 23 return stack; 24 } 25 vstack_destroy(vstack_t * stack)26void vstack_destroy(vstack_t *stack) 27 { 28 assert(stack); 29 free(stack->values); 30 free(stack); 31 } 32 vstack_push(vstack_t * stack,cmph_uint32 val)33void vstack_push(vstack_t *stack, cmph_uint32 val) 34 { 35 assert(stack); 36 vstack_reserve(stack, stack->pointer + 1); 37 stack->values[stack->pointer] = val; 38 ++(stack->pointer); 39 } vstack_pop(vstack_t * stack)40void vstack_pop(vstack_t *stack) 41 { 42 assert(stack); 43 assert(stack->pointer > 0); 44 --(stack->pointer); 45 } 46 vstack_top(vstack_t * stack)47cmph_uint32 vstack_top(vstack_t *stack) 48 { 49 assert(stack); 50 assert(stack->pointer > 0); 51 return stack->values[(stack->pointer - 1)]; 52 } vstack_empty(vstack_t * stack)53int vstack_empty(vstack_t *stack) 54 { 55 assert(stack); 56 return stack->pointer == 0; 57 } vstack_size(vstack_t * stack)58cmph_uint32 vstack_size(vstack_t *stack) 59 { 60 return stack->pointer; 61 } vstack_reserve(vstack_t * stack,cmph_uint32 size)62void vstack_reserve(vstack_t *stack, cmph_uint32 size) 63 { 64 assert(stack); 65 if (stack->capacity < size) 66 { 67 cmph_uint32 new_capacity = stack->capacity + 1; 68 DEBUGP("Increasing current capacity %u to %u\n", stack->capacity, size); 69 while (new_capacity < size) 70 { 71 new_capacity *= 2; 72 } 73 stack->values = (cmph_uint32 *)realloc(stack->values, sizeof(cmph_uint32)*new_capacity); 74 assert(stack->values); 75 stack->capacity = new_capacity; 76 DEBUGP("Increased\n"); 77 } 78 } 79