summaryrefslogtreecommitdiff
path: root/girepository/cmph/vstack.c
diff options
context:
space:
mode:
Diffstat (limited to 'girepository/cmph/vstack.c')
-rw-r--r--girepository/cmph/vstack.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/girepository/cmph/vstack.c b/girepository/cmph/vstack.c
new file mode 100644
index 00000000..24555cd6
--- /dev/null
+++ b/girepository/cmph/vstack.c
@@ -0,0 +1,79 @@
+#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()
+{
+ 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");
+ }
+}
+