From 2b7a3a815fb5d0b5155deec5f613730e898e4100 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Thu, 24 Apr 2025 17:08:08 -0400 Subject: Update Documentation --- src/include/engine/utils.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/include/engine/utils.c (limited to 'src/include/engine/utils.c') diff --git a/src/include/engine/utils.c b/src/include/engine/utils.c new file mode 100644 index 0000000..909c123 --- /dev/null +++ b/src/include/engine/utils.c @@ -0,0 +1,71 @@ +#include +#include + +#include "utils.h" + +static int delkey(tablist_t *, int, char *); + +void dellist(tablist_t *list) +{ + for (int i = 0; i < list[0].len; ++i) { + tablist_t *indexes = getkeys(list, i, NULL, 0); + for (int j = 0; indexes[0].tab[j].flag; ++j) + delkey(list, i, indexes[0].tab[j].key); + free(indexes); + } +} + +int hash(char *key) +{ + unsigned long h = 5381; + for (int i = 0; i < strlen(key); ++i) + h = ((h << 5) + h) + key[i]; + return h % TABLEN; +} + +tablist_t *copytab(tablist_t *dst, tablist_t *src) +{ + if (dst == NULL) + return NULL; + dst[0].len = src[0].len; + for (int i = 0; i < src[0].len; ++i) { + for (int j = 0; j < TABLEN; ++j) { + dst[i].tab[j] = (tabidx_t) { NULL, 0, { 0 } }; + if (src[i].tab[j].flag) { + switch (src[i].tab[j].flag) { + case 3: + dst[i].tab[j].value.str = + calloc(strlen(src[i].tab[j].value.str) + 1, sizeof(char)); + strcpy(dst[i].tab[j].value.str, src[i].tab[j].value.str); + break; + default: + dst[i].tab[j].value = src[i].tab[j].value; + break; + } + dst[i].tab[j].flag = src[i].tab[j].flag; + dst[i].tab[j].key = calloc(strlen(src[i].tab[j].key) + 1, sizeof(char)); + strcpy(dst[i].tab[j].key, src[i].tab[j].key); + } + } + } + return dst; +} + +static int delkey(tablist_t *list, int id, char *key) +{ + int idx = hash(key); + if (list[id].tab[idx].key == NULL) + return 1; + while (strcmp(list[id].tab[idx].key, key) && idx < TABLEN) + idx++; + if (idx >= TABLEN) + return 2; + free(list[id].tab[idx].key); + list[id].tab[idx].key = NULL; + if (list[id].tab[idx].flag == 3) { + free(list[id].tab[idx].value.str); + list[id].tab[idx].value.str = NULL; + } + list[id].tab[idx].flag = 0; + return 0; +} -- cgit v1.2.3