summaryrefslogtreecommitdiffstats
path: root/vec.c
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2026-05-24 18:00:38 +0800
committerSadeep Madurange <sadeep@asciimx.com>2026-05-28 15:34:29 +0800
commit95428c41f0ee3ac108cf1a4acfaa67157ad954dc (patch)
tree8565027758cd931f49ebe78738fb41126254b253 /vec.c
parent7aea09077aad335ac32bfd9858ded60ffd4d8a5b (diff)
downloadglacier-95428c41f0ee3ac108cf1a4acfaa67157ad954dc.tar.gz
Build DOM.
Diffstat (limited to 'vec.c')
-rw-r--r--vec.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/vec.c b/vec.c
new file mode 100644
index 0000000..719344e
--- /dev/null
+++ b/vec.c
@@ -0,0 +1,51 @@
+#include <string.h>
+
+#include "mem.h"
+#include "vec.h"
+
+#define DEFAULT_LEN 8
+
+void vec_init(struct vec *v, size_t unit_size)
+{
+ v->data = NULL;
+ v->len = 0;
+ v->cap = 0;
+ v->unit_size = unit_size;
+}
+
+void vec_push(struct vec *v, const void *item)
+{
+ void *target;
+
+ if (v->len == v->cap) {
+ v->cap = (v->cap == 0) ? DEFAULT_LEN : v->cap * 2;
+ v->data = REALLOC(v->data, v->cap * v->unit_size);
+ }
+
+ target = (char *)v->data + (v->len * v->unit_size);
+ memcpy(target, item, v->unit_size);
+ v->len++;
+}
+
+void *vec_pop(struct vec *v)
+{
+ if (v->len == 0)
+ return NULL;
+ v->len--;
+ return (char *)v->data + (v->len * v->unit_size);
+}
+
+void *vec_top(struct vec *v)
+{
+ if (v->len == 0)
+ return NULL;
+ return (char *)v->data + ((v->len - 1) * v->unit_size);
+}
+
+void vec_free(struct vec *v)
+{
+ free(v->data);
+ v->data = NULL;
+ v->len = v->cap = 0;
+}
+