turbonss/src/vstack.c

80 lines
1.6 KiB
C
Raw Normal View History

2004-12-23 15:16:30 +02:00
#include "vstack.h"
#include <stdlib.h>
#include <assert.h>
//#define DEBUG
#include "debug.h"
2005-01-18 23:06:08 +02:00
struct cmph__vstack_t
2004-12-23 15:16:30 +02:00
{
2005-01-18 23:06:08 +02:00
cmph_uint32 pointer;
cmph_uint32 *values;
cmph_uint32 capacity;
2004-12-23 15:16:30 +02:00
};
2005-01-18 23:06:08 +02:00
cmph_vstack_t *cmph_vstack_new()
2004-12-23 15:16:30 +02:00
{
2005-01-18 23:06:08 +02:00
cmph_vstack_t *stack = (cmph_vstack_t *)malloc(sizeof(cmph_vstack_t));
2004-12-23 15:16:30 +02:00
assert(stack);
stack->pointer = 0;
stack->values = NULL;
stack->capacity = 0;
return stack;
}
2005-01-18 23:06:08 +02:00
void cmph_vstack_destroy(cmph_vstack_t *stack)
2004-12-23 15:16:30 +02:00
{
assert(stack);
free(stack->values);
free(stack);
}
2005-01-18 23:06:08 +02:00
void cmph_vstack_push(cmph_vstack_t *stack, cmph_uint32 val)
2004-12-23 15:16:30 +02:00
{
assert(stack);
2005-01-18 23:06:08 +02:00
cmph_vstack_reserve(stack, stack->pointer + 1);
2004-12-23 15:16:30 +02:00
stack->values[stack->pointer] = val;
++(stack->pointer);
}
2005-01-18 23:06:08 +02:00
void cmph_vstack_pop(cmph_vstack_t *stack)
2004-12-23 15:16:30 +02:00
{
assert(stack);
assert(stack->pointer > 0);
--(stack->pointer);
}
2005-01-18 23:06:08 +02:00
cmph_uint32 cmph_vstack_top(cmph_vstack_t *stack)
2004-12-23 15:16:30 +02:00
{
assert(stack);
assert(stack->pointer > 0);
return stack->values[(stack->pointer - 1)];
}
2005-01-18 23:06:08 +02:00
int cmph_vstack_empty(cmph_vstack_t *stack)
2004-12-23 15:16:30 +02:00
{
assert(stack);
return stack->pointer == 0;
}
2005-01-18 23:06:08 +02:00
cmph_uint32 cmph_vstack_size(cmph_vstack_t *stack)
2004-12-23 15:16:30 +02:00
{
return stack->pointer;
}
2005-01-18 23:06:08 +02:00
void cmph_vstack_reserve(cmph_vstack_t *stack, cmph_uint32 size)
2004-12-23 15:16:30 +02:00
{
assert(stack);
if (stack->capacity < size)
{
2005-01-18 23:06:08 +02:00
cmph_uint32 new_capacity = stack->capacity + 1;
2004-12-23 15:16:30 +02:00
DEBUGP("Increasing current capacity %u to %u\n", stack->capacity, size);
while (new_capacity < size)
{
new_capacity *= 2;
}
2005-01-18 23:06:08 +02:00
stack->values = (cmph_uint32 *)realloc(stack->values, sizeof(cmph_uint32)*new_capacity);
2004-12-23 15:16:30 +02:00
assert(stack->values);
stack->capacity = new_capacity;
DEBUGP("Increased\n");
}
}