summaryrefslogtreecommitdiff
path: root/src/include/engine/utils.c
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-04-24 17:08:08 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-04-24 17:08:08 -0400
commit2b7a3a815fb5d0b5155deec5f613730e898e4100 (patch)
tree00db87ef554335e1c9871330703d86d0247a4ee8 /src/include/engine/utils.c
parent5b0d930e9e2605add559a70591573ffaa2fd8404 (diff)
Update Documentation
Diffstat (limited to 'src/include/engine/utils.c')
-rw-r--r--src/include/engine/utils.c71
1 files changed, 71 insertions, 0 deletions
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 <stdlib.h>
+#include <string.h>
+
+#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;
+}