diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/batch.c | 14 | ||||
-rw-r--r-- | src/lib/file.c | 14 | ||||
-rw-r--r-- | src/lib/keytab.c | 30 | ||||
-rw-r--r-- | src/lib/mdb.h | 4 |
4 files changed, 37 insertions, 25 deletions
diff --git a/src/lib/batch.c b/src/lib/batch.c index a56ff2d..eb53631 100644 --- a/src/lib/batch.c +++ b/src/lib/batch.c @@ -116,16 +116,16 @@ static int delkey_helper(void *thr_data) int *id = (int *) thr_data; mtx_lock(&delkey_mtx); - if (keys_len > 0) + if (keys_len > 0 && delkeys_keys != NULL) for (int i = 0; i < keys_len; ++i) { if (delkeys_keys[i] == NULL) return -3; rc = delkey(delkey_copy, *id, delkeys_keys[i]); } else { - int *indexes = getkeys(delkey_copy, *id); - for (int i = 0; indexes[i]; ++i) - rc = delkey(delkey_copy, *id, delkey_copy[*id].tab[indexes[i]].key); + tabidx_t *indexes = getkeys(delkey_copy, *id, NULL, 0); + for (int i = 0; indexes[i].flag; ++i) + rc = delkey(delkey_copy, *id, indexes[i].key); free(indexes); } mtx_unlock(&delkey_mtx); @@ -172,9 +172,9 @@ static tablist_t *copytab(tablist_t *dst, tablist_t *src) 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); + tabidx_t *indexes = getkeys(list, i, NULL, 0); + for (int j = 0; indexes[j].flag; ++j) + delkey(list, i, indexes[j].key); free(indexes); } } diff --git a/src/lib/file.c b/src/lib/file.c index f8a4db6..0204e4e 100644 --- a/src/lib/file.c +++ b/src/lib/file.c @@ -59,19 +59,19 @@ void writedb(char *filename, tablist_t *list) return; for (int i = 0; i < list[0].len; ++i) { fputc(0xFB, fp); - int *indexes = getkeys(list, i); - for (int j = 0; indexes[j]; ++j) { - fprintf(fp, "\xfa%s:", list[i].tab[indexes[j]].key); - switch (list[i].tab[indexes[j]].flag) { + tabidx_t *indexes = getkeys(list, i, NULL, 0); + for (int j = 0; indexes[j].flag; ++j) { + fprintf(fp, "\xfa%s:", indexes[j].key); + switch (indexes[j].flag) { case 1: - fprintf(fp, "%.2lf\xfc", list[i].tab[indexes[j]].value.num); + fprintf(fp, "%.2lf\xfc", indexes[j].value.num); break; case 2: - fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].value.boolean ? + fprintf(fp, "%s\xfc", indexes[j].value.boolean ? "true" : "false"); break; case 3: - fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].value.str); + fprintf(fp, "%s\xfc", indexes[j].value.str); break; } } diff --git a/src/lib/keytab.c b/src/lib/keytab.c index c8b1f75..425b0e1 100644 --- a/src/lib/keytab.c +++ b/src/lib/keytab.c @@ -8,19 +8,31 @@ static int hash(char *key); static char **getkv(char *pair); // getkeys - gets every single key in a key table -int *getkeys(tablist_t *list, int id) +tabidx_t *getkeys(tablist_t *list, int id, char **keys, int klen) { - int len = 2; + int len = 1; if (id >= list[0].len) return NULL; - int *indexes = calloc(len, sizeof(int)); - for (int i = 0, j = 0; i < TABLEN; ++i) { - if (j >= len) { - indexes = realloc(indexes, ++len * sizeof(int)); - indexes[len - 1] = 0; + tabidx_t *indexes = calloc(len, sizeof(tabidx_t)); + if (klen == 0) { + for (int i = 0, j = 0; i < TABLEN; ++i) { + if (j >= len) { + indexes = realloc(indexes, ++len * sizeof(tabidx_t)); + indexes[len - 1] = (tabidx_t) { NULL, 0, { 0 } }; + } + if (list[id].tab[i].flag) + indexes[j++] = list[id].tab[i]; + } + } else { + for (int i = 0, j = 0; i < klen; ++i) { + tabidx_t idx = getkey(list, id, keys[i]); + if (idx.flag == 0) + return NULL; + if (j >= len) { + indexes = realloc(indexes, ++len * sizeof(tabidx_t)); + } + indexes[j++] = idx; } - if (list[id].tab[i].key) - indexes[j++] = i; } return indexes; } diff --git a/src/lib/mdb.h b/src/lib/mdb.h index a53f4b5..9038aef 100644 --- a/src/lib/mdb.h +++ b/src/lib/mdb.h @@ -19,11 +19,11 @@ typedef struct { } tablist_t; // Table operations +// TODO: Make this private tabidx_t getkey(tablist_t *list, int id, char *key); // Batch Operations -// TODO: make setkeys and delkeys take char ** and int -int *getkeys(tablist_t *list, int id); // TODO: Reimplement getkeys +tabidx_t *getkeys(tablist_t *list, int id, char **keys, int len); // TODO: Reimplement getkeys int setkeys(tablist_t **list, int id, char **pairs, int len); int delkeys(tablist_t *list, int id, char **keys, int len); |