From 1a823dde55147405813500d9cc4b7fbe5288e3bf Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Mon, 17 Mar 2025 11:51:09 -0400 Subject: more refactoring --- Makefile | 1 + src/lib/keytab.c | 45 +++++++++++++++++++++++++++++++-------------- src/main.c | 50 ++++++++++++++++++++++++++++++-------------------- 3 files changed, 62 insertions(+), 34 deletions(-) diff --git a/Makefile b/Makefile index c81978d..a1e08eb 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ install: lib mv $(BUILD)/libmdb.so /usr/lib/libmdb.so ldconfig $(CC) src/*.c $(C_FLAGS) -o /usr/bin/mdb + rm -rf $(BUILD) uninstall: rm /usr/bin/mdb diff --git a/src/lib/keytab.c b/src/lib/keytab.c index 35d8b59..e63cfc2 100644 --- a/src/lib/keytab.c +++ b/src/lib/keytab.c @@ -6,6 +6,7 @@ #include "mdb.h" 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) @@ -50,36 +51,37 @@ int setkey(tablist_t **list, int id, char *pair) } (*list)[0].len = id + 1; } - char *tok = strtok(pair, ":"); - char *key = calloc(strlen(tok) + 1, sizeof(char)); - strcpy(key, tok); - if (!(tok = strtok(NULL, ":"))) + char **kv = getkv(pair); + if (kv == NULL) return 1; - int idx = hash(key); + int idx = hash(kv[0]); while ((*list)[id].tab[idx].key != NULL && - strcmp((*list)[id].tab[idx].key, key) && + strcmp((*list)[id].tab[idx].key, kv[0]) && idx < TABLEN) idx++; if (idx >= TABLEN) return 2; if (!(*list)[id].tab[idx].key) - (*list)[id].tab[idx].key = key; + (*list)[id].tab[idx].key = kv[0]; else { - free(key); + free(kv[0]); if ((*list)[id].tab[idx].flag == 3) free((*list)[id].tab[idx].value.str); } - if (isdigit(*tok)) { + if (isdigit(kv[1][0])) { (*list)[id].tab[idx].flag = 1; - (*list)[id].tab[idx].value.num = atof(tok); - } else if (!strcmp(tok, "true") || !strcmp(tok, "false")) { + // TODO: Implement parsenum function + (*list)[id].tab[idx].value.num = atof(kv[1]); + } else if (!strcmp(kv[1], "true") || !strcmp(kv[1], "false")) { (*list)[id].tab[idx].flag = 2; - (*list)[id].tab[idx].value.boolean = !strcmp(tok, "true"); + (*list)[id].tab[idx].value.boolean = !strcmp(kv[1], "true"); } else { (*list)[id].tab[idx].flag = 3; - (*list)[id].tab[idx].value.str = calloc(strlen(tok) + 1, sizeof(char)); - strcpy((*list)[id].tab[idx].value.str, tok); + (*list)[id].tab[idx].value.str = calloc(strlen(kv[1]) + 1, sizeof(char)); + strcpy((*list)[id].tab[idx].value.str, kv[1]); } + free(kv[1]); + free(kv); return 0; } @@ -110,3 +112,18 @@ static int hash(char *key) h = ((h << 5) + h) + key[i]; return h % TABLEN; } + +static char **getkv(char *pair) +{ + char **kv = calloc(2, sizeof(char *)); + int i = 0; + while (pair[i] != ':' && i < strlen(pair)) + i++; + if (i >= strlen(pair)) + return NULL; + kv[0] = calloc(i + 1, sizeof(char)); + strncpy(kv[0], pair, i); + kv[1] = calloc(strlen(pair) - i, sizeof(char)); + strcpy(kv[1], pair + i + 1); + return kv; +} diff --git a/src/main.c b/src/main.c index 28516a1..95d93d2 100644 --- a/src/main.c +++ b/src/main.c @@ -7,11 +7,11 @@ #include "cmd.h" int getid(char *selector); -void printkeys(tablist_t **list, int id, char **keys, int klen); +int printkeys(tablist_t **list, int id, char **keys, int klen); void printkey(tabidx_t idx); -void setkeys(tablist_t **list, int id, char **pairs, int plen); -void delkeys(tablist_t **list, int id, char **keys, int klen); -void exec(void (*tabop)(tablist_t **, int, char **, int), +int setkeys(tablist_t **list, int id, char **pairs, int plen); +int delkeys(tablist_t **list, int id, char **keys, int klen); +int exec(int (*tabop)(tablist_t **, int, char **, int), tablist_t **list, int id, char **keys, int klen); int main(int argc, char **argv) @@ -37,10 +37,11 @@ int main(int argc, char **argv) exec(printkeys, &list, id, evaled.params, evaled.plen); break; case SET: - exec(setkeys, &list, id, evaled.params, evaled.plen); - break; case DEL: - exec(delkeys, &list, id, evaled.params, evaled.plen); + id = exec(evaled.type == SET ? setkeys : delkeys, + &list, id, evaled.params, evaled.plen); + if (!id && filename) + writedb(filename, list); break; case ERR: fprintf(stderr, "Unkown command: %s\n", cmd); @@ -55,8 +56,7 @@ int main(int argc, char **argv) } free(cmd); - if (filename != NULL) - writedb(filename, list); + for (int i = 0; i < list[0].len; ++i) { int *indexes = getkeys(list, i); for (int j = 0; indexes[j]; ++j) @@ -80,7 +80,7 @@ int getid(char *selector) { return -2; } -void printkeys(tablist_t **list, int id, char **keys, int klen) +int printkeys(tablist_t **list, int id, char **keys, int klen) { if (keys == NULL) { int *indexes = getkeys(*list, id); @@ -99,6 +99,7 @@ void printkeys(tablist_t **list, int id, char **keys, int klen) } printf("}\n"); } + return 0; } void printkey(tabidx_t idx) @@ -117,39 +118,48 @@ void printkey(tabidx_t idx) } } -void setkeys(tablist_t **list, int id, char **pairs, int plen) +int setkeys(tablist_t **list, int id, char **pairs, int plen) { if (pairs == NULL) - return; + return 1; for (int i = 0; i < plen; ++i) { char *tmp = calloc(strlen(pairs[i]) + 1, sizeof(char)); strcpy(tmp, pairs[i]); - setkey(list, id, tmp); + if (setkey(list, id, tmp)) + return 1; free(tmp); } + return 0; } -void delkeys(tablist_t **list, int id, char **keys, int klen) +int delkeys(tablist_t **list, int id, char **keys, int klen) { if (keys == NULL) { int *indexes = getkeys(*list, id); for (int i = 0; indexes[i]; ++i) - delkey(*list, id, (*list)[id].tab[indexes[i]].key); + if (delkey(*list, id, (*list)[id].tab[indexes[i]].key)) + return 1; free(indexes); } else { for (int i = 0; i < klen; ++i) - delkey(*list, id, keys[i]); + if (delkey(*list, id, keys[i])) + return 1; } + return 0; } -void exec(void (*tabop)(tablist_t **, int, char **, int), +int exec(int (*tabop)(tablist_t **, int, char **, int), tablist_t **list, int id, char **keys, int klen) { if (id >= 0) - tabop(list, id, keys, klen); + return tabop(list, id, keys, klen); else if (id == -1) { for (int i = 0; i < (*list)[0].len; ++i) - tabop(list, i, keys, klen); - } else + if (tabop(list, i, keys, klen)) + return 1; + return 0; + } else { fprintf(stderr, "Invalid id\n"); + return 1; + } } -- cgit v1.2.3