From c7e0401455a2eae5d1092bf1add3be52ffb0fb5a Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Mon, 24 Mar 2025 14:26:32 -0400 Subject: Added copytab function in batch.c --- src/lib/batch.c | 86 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 38 deletions(-) (limited to 'src') diff --git a/src/lib/batch.c b/src/lib/batch.c index 15b349c..3991973 100644 --- a/src/lib/batch.c +++ b/src/lib/batch.c @@ -8,6 +8,8 @@ static int setkey_helper(void *thr_data); static int delkey_helper(void *thr_data); static int *clone(int n); +static tablist_t *copytab(tablist_t *dst, tablist_t *src); +static void dellist(tablist_t *list); tablist_t *setkey_copy; char *setkey_str; @@ -17,7 +19,7 @@ int setkeys(tablist_t **list, char *pair) { int rc = 0; setkey_copy = calloc(list[0]->len, sizeof(tablist_t)); - memcpy(setkey_copy, *list, list[0]->len * sizeof(tablist_t)); + copytab(setkey_copy, *list); setkey_str = pair; thrd_t *thrds = calloc(list[0]->len, sizeof(thrd_t)); @@ -32,8 +34,11 @@ int setkeys(tablist_t **list, char *pair) else thrd_join(thrds[i], &rc); } - if (!rc) + if (!rc) { + dellist(*list); memcpy(*list, setkey_copy, setkey_copy[0].len * sizeof(tablist_t)); + } else + dellist(setkey_copy); free(thrds); free(setkey_copy); return rc; @@ -43,32 +48,11 @@ tablist_t *delkey_copy; char *delkey_str; mtx_t delkey_mtx; -// TODO: make copy_init function int delkeys(tablist_t *list, char *key) { int rc = 0; delkey_copy = calloc(list[0].len, sizeof(tablist_t)); - for (int i = 0; i < list[0].len; ++i) { - for (int j = 0; j < TABLEN; ++j) { - if (list[i].tab[j].flag) { - delkey_copy[i].tab[j].key = - calloc(strlen(list[i].tab[j].key) + 1, sizeof(char)); - strcpy(delkey_copy[i].tab[j].key, list[i].tab[j].key); - delkey_copy[i].tab[j].flag = list[i].tab[j].flag; - switch(list[i].tab[j].flag) { - case 3: - delkey_copy[i].tab[j].value.str = - calloc(strlen(list[i].tab[j].value.str) + 1, sizeof(char)); - strcpy(delkey_copy[i].tab[j].value.str, list[i].tab[j].value.str); - break; - default: - delkey_copy[i].tab[j].value = list[i].tab[j].value; - break; - } - } - } - } - delkey_copy[0].len = list[0].len; + copytab(delkey_copy, list); delkey_str = key; thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t)); @@ -84,21 +68,10 @@ int delkeys(tablist_t *list, char *key) thrd_join(thrds[i], &rc); } if (!rc) { - for (int i = 0; i < list[0].len; ++i) { - int *indexes = getkeys(list, i); - for (int j = 0; indexes[j]; ++j) - delkey(list, i, list[i].tab[indexes[j]].key); - free(indexes); - } + dellist(list); memmove(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t)); - } else { - for (int i = 0; i < delkey_copy[0].len; ++i) { - int *indexes = getkeys(delkey_copy, i); - for (int j = 0; indexes[j]; ++j) - delkey(delkey_copy, i, delkey_copy[i].tab[indexes[j]].key); - free(indexes); - } - } + } else + dellist(delkey_copy); free(thrds); free(delkey_copy); return rc; @@ -136,3 +109,40 @@ static int *clone(int n) *c = n; return c; } + +static 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) { + 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 void dellist(tablist_t *list) +{ + for (int i = 0; i < list[0].len; ++i) { + int *indexes = getkeys(list, i); + for (int j = 0; indexes[j]; ++j) + delkey(list, i, list[i].tab[indexes[j]].key); + free(indexes); + } +} -- cgit v1.2.3