From 01ddd6285284716325bd4b1c9bc5a8a0b9590f66 Mon Sep 17 00:00:00 2001 From: javalsai Date: Fri, 18 Oct 2024 21:54:39 +0200 Subject: [PATCH] chore: make specific vector (heap stack) impl --- include/util.h | 16 ++++++++++++++ src/util.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/include/util.h b/include/util.h index fcfca0c..cd191d9 100644 --- a/include/util.h +++ b/include/util.h @@ -3,6 +3,7 @@ #include #include +#include #include enum keys find_keyname(char *); @@ -10,4 +11,19 @@ enum keys find_ansi(char *); void read_press(u_char *, char *); void strcln(char **dest, const char *source); +struct Vector { + uint32_t length; + uint32_t alloc_len; + uint16_t alloc_size; + void** pages; +}; + +struct Vector vec_new(); +int vec_push(struct Vector*, void* item); +void vec_free(struct Vector*); +void vec_clear(struct Vector*); +void vec_reset(struct Vector*); +void* vec_pop(struct Vector*); // wont free it, nor shrink vec list space +void* vec_get(struct Vector*, uint32_t index); + #endif diff --git a/src/util.c b/src/util.c index a15ce80..1b44127 100644 --- a/src/util.c +++ b/src/util.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -66,3 +67,59 @@ static int selret_magic() { timeout.tv_usec = 0; return select(1, &set, NULL, NULL, &timeout); } + + +// Vector shii +struct Vector vec_new() { + struct Vector vec; + vec_clear(&vec); + return vec; +} + +int vec_push(struct Vector* vec, void* item) { + if (vec->length >= vec->alloc_len) { + uint32_t new_size = vec->alloc_len + vec->alloc_size; + void **new_location = realloc(vec->pages, vec->alloc_size); + if (new_location != NULL) { + vec->alloc_size = new_size; + vec->pages = new_location; + } else { + return -1; + } + } + + vec->pages[vec->length] = item; + vec->length++; + return 0; +} + +void vec_free(struct Vector* vec) { + for(; vec->length > 0; vec->length--) + free(vec->pages[--vec->length]); + + vec_clear(vec); +} + +void vec_clear(struct Vector* vec) { + free(vec->pages); + vec_reset(vec); +} + +void vec_reset(struct Vector* vec) { + vec->length = 0; + vec->alloc_len = 0; + vec->alloc_size = 4096; // 4KiB page size? + vec->pages = NULL; +} + +void* vec_pop(struct Vector* vec) { + if (vec->length == 0) + return NULL; + + vec->length--; + return vec->pages[vec->length]; +} + +void* vec_get(struct Vector* vec, uint32_t index) { + return vec->pages[index]; +}