From 01b699825d984fad297301d47784f69ff7f87044 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Thu, 13 Mar 2025 13:38:33 -0400 Subject: Added DEL command --- src/lib/file.c | 3 ++- src/lib/keytab.c | 15 +++++++++------ src/lib/mdb.h | 2 +- src/main.c | 17 ++++++++++++++++- 4 files changed, 28 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/lib/file.c b/src/lib/file.c index 5011e45..c5eabb2 100644 --- a/src/lib/file.c +++ b/src/lib/file.c @@ -10,6 +10,7 @@ struct keytablist *readdb(char *filename) { int len = 2; struct keytablist *list = calloc(len, sizeof(struct keytablist)); + list[0].len = len; FILE *fp = fopen(filename, "rb"); if (fp == NULL) return list; @@ -24,7 +25,7 @@ struct keytablist *readdb(char *filename) fprintf(stderr, "missing pair closing byte!\n"); return NULL; } - setkey(&list, &len, i, p); + setkey(&list, i, p); free(p); break; case 251: diff --git a/src/lib/keytab.c b/src/lib/keytab.c index 61f94af..5d0c7dd 100644 --- a/src/lib/keytab.c +++ b/src/lib/keytab.c @@ -37,14 +37,15 @@ struct keytab getkey(struct keytablist *list, int id, char *key) return list[id].tab[idx]; } -int setkey(struct keytablist **list, int *len, int id, char *pair) +int setkey(struct keytablist **list, int id, char *pair) { - if (id >= *len) { + if (id >= (*list)[0].len) { *list = realloc(*list, (id + 1) * sizeof(struct keytablist)); - for (int i = *len; i <= id; ++i) - (*list)[i] = empty; - *len = id + 1; - (*list)[0].len = *len; + for (int i = (*list)[0].len; i <= id; ++i) { + for (int j = 0; j < TABLEN; ++j) + (*list)[i].tab[j] = (struct keytab) {NULL, 0, {0}}; + } + (*list)[0].len = id + 1; } char *tok = strtok(pair, ":"); char *key = calloc(strlen(tok) + 1, sizeof(char)); @@ -89,6 +90,8 @@ int setkey(struct keytablist **list, int *len, int id, char *pair) void delkey(struct keytablist *list, int id, char *key) { int idx = hash(key); + if (list[id].tab[idx].key == NULL) + return; while (strcmp(list[id].tab[idx].key, key) && idx < TABLEN) idx++; if (idx >= TABLEN) { diff --git a/src/lib/mdb.h b/src/lib/mdb.h index 49f5903..aafacf0 100644 --- a/src/lib/mdb.h +++ b/src/lib/mdb.h @@ -22,7 +22,7 @@ struct keytablist { int *getkeys(struct keytablist *list, int id); struct keytab getkey(struct keytablist *list, int id, char *key); -int setkey(struct keytablist **list, int *len, int id, char *pair); +int setkey(struct keytablist **list, int id, char *pair); void delkey(struct keytablist *list, int id, char *key); struct keytablist *readdb(char *filename); diff --git a/src/main.c b/src/main.c index 921eacd..168c54a 100644 --- a/src/main.c +++ b/src/main.c @@ -8,6 +8,7 @@ int getrange(char *selector); void printkeys(struct keytablist *list, int id, char **keys, int klen); void setkeys(struct keytablist **list, int id, char **pairs, int plen); +void delkeys(struct keytablist *list, int id, char **keys, int klen); int main(int argc, char **argv) { @@ -41,6 +42,12 @@ int main(int argc, char **argv) } break; case DEL: + if (range >= 0) + delkeys(list, range, evaled.params, evaled.plen); + else if (range == -1) { + for (int i = 0; i < list[0].len; ++i) + delkeys(list, i, evaled.params, evaled.plen); + } break; case ERR: fprintf(stderr, "Unkown command: %s\n", cmd); @@ -129,7 +136,15 @@ void setkeys(struct keytablist **list, int id, char **pairs, int plen) for (int i = 0; i < plen; ++i) { char *tmp = calloc(strlen(pairs[i]) + 1, sizeof(char)); strcpy(tmp, pairs[i]); - setkey(list, &(list[0]->len), id, tmp); + setkey(list, id, tmp); free(tmp); } } + +void delkeys(struct keytablist *list, int id, char **keys, int klen) +{ + if (keys == NULL) + return; + for (int i = 0; i < klen; ++i) + delkey(list, id, keys[i]); +} -- cgit v1.2.3