diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2026-05-24 18:00:38 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2026-05-28 15:34:29 +0800 |
| commit | 95428c41f0ee3ac108cf1a4acfaa67157ad954dc (patch) | |
| tree | 8565027758cd931f49ebe78738fb41126254b253 /vec.c | |
| parent | 7aea09077aad335ac32bfd9858ded60ffd4d8a5b (diff) | |
| download | glacier-95428c41f0ee3ac108cf1a4acfaa67157ad954dc.tar.gz | |
Build DOM.
Diffstat (limited to 'vec.c')
| -rw-r--r-- | vec.c | 51 |
1 files changed, 51 insertions, 0 deletions
@@ -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; +} + |
