summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-03-13 13:38:33 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-03-13 13:38:33 -0400
commit01b699825d984fad297301d47784f69ff7f87044 (patch)
treec97c1b4a496c248e58b562dc64ba4b1112ab1d0c
parent82c5e54243a971c94da6e57976ffe7d43147af2a (diff)
Added DEL command
-rw-r--r--src/lib/file.c3
-rw-r--r--src/lib/keytab.c15
-rw-r--r--src/lib/mdb.h2
-rw-r--r--src/main.c17
4 files changed, 28 insertions, 9 deletions
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]);
+}