From 58a32dad0be010556b39f8ce4b55aa012c2762d0 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Sun, 9 Mar 2025 18:21:45 -0400 Subject: Added delkey command --- src/keytab.c | 33 +++++++++++++++++++++++---------- src/main.c | 2 +- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/keytab.c b/src/keytab.c index 8d929dc..6186c9d 100644 --- a/src/keytab.c +++ b/src/keytab.c @@ -37,20 +37,15 @@ struct keytab getkey(struct keytab *tab, char *key) void setkey(struct keytab *tab, char *pair) { - char *tmp = calloc(strlen(pair) + 1, sizeof(char)); - strcpy(tmp, pair); char *tok = strtok(pair, ":"); - if (!strcmp(tmp, tok)) { - fprintf(stderr, "Invalid key-value pair: %s\n", tmp); - free(tmp); - return; - } - free(tmp); - char *key = calloc(strlen(tok) + 1, sizeof(char)); strcpy(key, tok); tok = strtok(NULL, ":"); + if (tok == NULL) { + fprintf(stderr, "Invalid key-value pair\n"); + return; + } union value v; int flag; if (isdigit(*tok)) { @@ -80,7 +75,25 @@ void setkey(struct keytab *tab, char *pair) tab[idx].flag = flag; } -int hash(char *key) +void delkey(struct keytab *tab, char *key) +{ + int idx = hash(key); + while (strcmp(tab[idx].key, key) && idx < TABLEN) + idx++; + if (idx >= TABLEN) { + fprintf(stderr, "Invalid key: %s\n", key); + return; + } + free(tab[idx].key); + tab[idx].key = NULL; + if (tab[idx].flag == 3) { + free(tab[idx].v.str); + tab[idx].v.str = NULL; + } + tab[idx].flag = 0; +} + +static int hash(char *key) { unsigned long h = 5381; for (int i = 0; i < strlen(key); ++i) diff --git a/src/main.c b/src/main.c index ead9567..1aaaaa7 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,7 @@ int main(int argc, char **argv) } else if (tab[indexes[i]].flag == 3) { printf("%s\n", tab[indexes[i]].v.str); } - free(tab[indexes[i]].key); + delkey(tab, tab[indexes[i]].key); } free(indexes); free(bytes); -- cgit v1.2.3