summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/file.c22
-rw-r--r--src/lib/keytab.c67
-rw-r--r--src/lib/mdb.h34
-rw-r--r--src/main.c72
4 files changed, 86 insertions, 109 deletions
diff --git a/src/lib/file.c b/src/lib/file.c
index 34086e0..693d0e5 100644
--- a/src/lib/file.c
+++ b/src/lib/file.c
@@ -9,10 +9,10 @@ static char *getpair(int *c, FILE *fp);
// readdb - reads the given file into a key table list
// if fp returns NULL it will return the empty list
// if readdb fails it will return NULL
-struct keytablist *readdb(char *filename)
+tablist_t *readdb(char *filename)
{
int len = 2;
- struct keytablist *list = calloc(len, sizeof(struct keytablist));
+ tablist_t *list = calloc(len, sizeof(tablist_t));
list[0].len = len;
FILE *fp = fopen(filename, "rb");
if (fp == NULL)
@@ -24,18 +24,14 @@ struct keytablist *readdb(char *filename)
switch (c) {
case 250:
p = getpair(&c, fp);
- if (p == NULL) {
- fprintf(stderr, "missing pair closing byte!\n");
+ if (p == NULL)
return NULL;
- }
setkey(&list, i, p);
free(p);
break;
case 251:
- if (open == 1) {
- fprintf(stderr, "missing object closing byte!\n");
+ if (open == 1)
return NULL;
- }
open = 1;
break;
case 254:
@@ -43,7 +39,6 @@ struct keytablist *readdb(char *filename)
i++;
break;
default:
- fprintf(stderr, "Unknown byte: %d\n", c);
return NULL;
}
}
@@ -52,7 +47,7 @@ struct keytablist *readdb(char *filename)
}
// writedb - writes a keytablist to a given file
-void writedb(char *filename, struct keytablist *list)
+void writedb(char *filename, tablist_t *list)
{
FILE *fp = fopen(filename, "wb");
for (int i = 0; i < list[0].len; ++i) {
@@ -62,13 +57,14 @@ void writedb(char *filename, struct keytablist *list)
fprintf(fp, "\xfa%s:", list[i].tab[indexes[j]].key);
switch (list[i].tab[indexes[j]].flag) {
case 1:
- fprintf(fp, "%.2lf\xfc", list[i].tab[indexes[j]].v.num);
+ fprintf(fp, "%.2lf\xfc", list[i].tab[indexes[j]].value.num);
break;
case 2:
- fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].v.b == 1 ? "true" : "false");
+ fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].value.boolean ?
+ "true" : "false");
break;
case 3:
- fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].v.str);
+ fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].value.str);
break;
}
}
diff --git a/src/lib/keytab.c b/src/lib/keytab.c
index ed61264..35d8b59 100644
--- a/src/lib/keytab.c
+++ b/src/lib/keytab.c
@@ -8,7 +8,7 @@
static int hash(char *key);
// getkeys - gets every single key in a key table
-int *getkeys(struct keytablist *list, int id)
+int *getkeys(tablist_t *list, int id)
{
int len = 2;
int *indexes = calloc(len, sizeof(int));
@@ -25,93 +25,82 @@ int *getkeys(struct keytablist *list, int id)
// getkey - gets a single key from a keytable
// if it can't find the key it will return an empty table index
-struct keytab getkey(struct keytablist *list, int id, char *key)
+tabidx_t getkey(tablist_t *list, int id, char *key)
{
int idx = hash(key);
if (list[id].tab[idx].key == NULL)
- return (struct keytab) { .key = NULL, .flag = 0, .v = { 0 } };
+ return (tabidx_t) { .key = NULL, .flag = 0, .value = { 0 } };
while (strcmp(list[id].tab[idx].key, key) && idx < TABLEN)
idx++;
if (idx >= TABLEN)
- return (struct keytab) { .key = NULL, .flag = 0, .v = { 0 } };
+ return (tabidx_t) { .key = NULL, .flag = 0, .value = { 0 } };
return list[id].tab[idx];
}
// setkey - adds the given pair to the given key table
// if setkey fails it will return 1 otherwise 0
-int setkey(struct keytablist **list, int id, char *pair)
+int setkey(tablist_t **list, int id, char *pair)
{
if (id >= (*list)[0].len) {
- *list = realloc(*list, (id + 1) * sizeof(struct keytablist));
+ *list = realloc(*list, (id + 1) * sizeof(tablist_t));
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)[i].tab[j] = (tabidx_t) { NULL, 0, { 0 } };
}
(*list)[0].len = id + 1;
}
char *tok = strtok(pair, ":");
char *key = calloc(strlen(tok) + 1, sizeof(char));
strcpy(key, tok);
-
- tok = strtok(NULL, ":");
- if (tok == NULL) {
- fprintf(stderr, "Invalid key-value pair\n");
+ if (!(tok = strtok(NULL, ":")))
return 1;
- }
- union value v;
- int flag;
- if (isdigit(*tok)) {
- flag = 1;
- v.num = atof(tok);
- } else if (!strcmp(tok, "true") || !strcmp(tok, "false")) {
- flag = 2;
- v.b = !strcmp(tok, "true");
- } else {
- flag = 3;
- v.str = calloc(strlen(tok) + 1, sizeof(char));
- strcpy(v.str, tok);
- }
int idx = hash(key);
while ((*list)[id].tab[idx].key != NULL &&
strcmp((*list)[id].tab[idx].key, key) &&
idx < TABLEN) idx++;
- if (idx >= TABLEN) {
- fprintf(stderr, "No more room in table\n");
+ if (idx >= TABLEN)
return 2;
- }
if (!(*list)[id].tab[idx].key)
(*list)[id].tab[idx].key = key;
else {
free(key);
if ((*list)[id].tab[idx].flag == 3)
- free((*list)[id].tab[idx].v.str);
+ free((*list)[id].tab[idx].value.str);
+ }
+ if (isdigit(*tok)) {
+ (*list)[id].tab[idx].flag = 1;
+ (*list)[id].tab[idx].value.num = atof(tok);
+ } else if (!strcmp(tok, "true") || !strcmp(tok, "false")) {
+ (*list)[id].tab[idx].flag = 2;
+ (*list)[id].tab[idx].value.boolean = !strcmp(tok, "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].v = v;
- (*list)[id].tab[idx].flag = flag;
return 0;
}
// delkey - removes the given key from the given key table
-void delkey(struct keytablist *list, int id, char *key)
+int delkey(tablist_t *list, int id, char *key)
{
int idx = hash(key);
if (list[id].tab[idx].key == NULL)
- return;
+ return 1;
while (strcmp(list[id].tab[idx].key, key) && idx < TABLEN)
idx++;
- if (idx >= TABLEN) {
- fprintf(stderr, "Invalid key: %s\n", key);
- return;
- }
+ if (idx >= TABLEN)
+ return 2;
free(list[id].tab[idx].key);
list[id].tab[idx].key = NULL;
if (list[id].tab[idx].flag == 3) {
- free(list[id].tab[idx].v.str);
- list[id].tab[idx].v.str = NULL;
+ free(list[id].tab[idx].value.str);
+ list[id].tab[idx].value.str = NULL;
}
list[id].tab[idx].flag = 0;
+ return 0;
}
static int hash(char *key)
diff --git a/src/lib/mdb.h b/src/lib/mdb.h
index 7408dc7..bd4554b 100644
--- a/src/lib/mdb.h
+++ b/src/lib/mdb.h
@@ -3,31 +3,29 @@
#define TABLEN 1024
-union value {
- char *str;
- double num;
- unsigned int b : 1;
-};
-
-struct keytab {
+typedef struct {
char *key;
int flag;
- union value v;
-};
+ union {
+ char *str;
+ double num;
+ unsigned int boolean : 1;
+ } value;
+} tabidx_t;
-struct keytablist {
+typedef struct {
int len;
- struct keytab tab[TABLEN];
-};
+ tabidx_t tab[TABLEN];
+} tablist_t;
// Table operations
-int *getkeys(struct keytablist *list, int id);
-struct keytab getkey(struct keytablist *list, int id, char *key);
-int setkey(struct keytablist **list, int id, char *pair);
-void delkey(struct keytablist *list, int id, char *key);
+int *getkeys(tablist_t *list, int id);
+tabidx_t getkey(tablist_t *list, int id, char *key);
+int setkey(tablist_t **list, int id, char *pair);
+int delkey(tablist_t *list, int id, char *key);
// file operations
-struct keytablist *readdb(char *filename);
-void writedb(char *filename, struct keytablist *list);
+tablist_t *readdb(char *filename);
+void writedb(char *filename, tablist_t *list);
#endif
diff --git a/src/main.c b/src/main.c
index 9399c96..28516a1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -7,11 +7,12 @@
#include "cmd.h"
int getid(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);
-void exec(void (*tabop)(struct keytablist **, int, char **, int),
- struct keytablist **list, int id, char **keys, int klen);
+void 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),
+ tablist_t **list, int id, char **keys, int klen);
int main(int argc, char **argv)
{
@@ -22,7 +23,7 @@ int main(int argc, char **argv)
char *filename = NULL;
if (argc == 2)
filename = argv[1];
- struct keytablist *list = readdb(filename);
+ tablist_t *list = readdb(filename);
char *cmd = calloc(1024, sizeof(char));
while (fgets(cmd, 1024, stdin) != NULL) {
@@ -79,51 +80,44 @@ int getid(char *selector) {
return -2;
}
-void printkeys(struct keytablist **list, int id, char **keys, int klen)
+void printkeys(tablist_t **list, int id, char **keys, int klen)
{
if (keys == NULL) {
int *indexes = getkeys(*list, id);
printf("{ id: %d ", id);
- for (int i = 0; indexes[i]; ++i) {
- printf("%s: ", (*list)[id].tab[indexes[i]].key);
- switch ((*list)[id].tab[indexes[i]].flag) {
- case 1:
- printf("%.2lf ", (*list)[id].tab[indexes[i]].v.num);
- break;
- case 2:
- printf("%s ", (*list)[id].tab[indexes[i]].v.b ? "true" : "false");
- break;
- case 3:
- printf("%s ", (*list)[id].tab[indexes[i]].v.str);
- break;
- }
- }
+ for (int i = 0; indexes[i]; ++i)
+ printkey((*list)[id].tab[indexes[i]]);
free(indexes);
printf("}\n");
} else {
printf("{ id: %d ", id);
for (int i = 0; i < klen; ++i) {
- struct keytab tabidx = getkey(*list, id, keys[i]);
- if (tabidx.flag == 0)
+ tabidx_t idx = getkey(*list, id, keys[i]);
+ if (idx.flag == 0)
continue;
- printf ("%s: ", keys[i]);
- switch (tabidx.flag) {
- case 1:
- printf("%.2lf ", tabidx.v.num);
- break;
- case 2:
- printf("%s ", tabidx.v.b ? "true" : "false");
- break;
- case 3:
- printf("%s ", tabidx.v.str);
- break;
- }
+ printkey(idx);
}
printf("}\n");
}
}
-void setkeys(struct keytablist **list, int id, char **pairs, int plen)
+void printkey(tabidx_t idx)
+{
+ printf("%s: ", idx.key);
+ switch (idx.flag) {
+ case 1:
+ printf("%.2lf ", idx.value.num);
+ break;
+ case 2:
+ printf("%s ", idx.value.boolean ? "true" : "false");
+ break;
+ case 3:
+ printf("%s ", idx.value.str);
+ break;
+ }
+}
+
+void setkeys(tablist_t **list, int id, char **pairs, int plen)
{
if (pairs == NULL)
return;
@@ -135,7 +129,7 @@ void setkeys(struct keytablist **list, int id, char **pairs, int plen)
}
}
-void delkeys(struct keytablist **list, int id, char **keys, int klen)
+void delkeys(tablist_t **list, int id, char **keys, int klen)
{
if (keys == NULL) {
int *indexes = getkeys(*list, id);
@@ -148,8 +142,8 @@ void delkeys(struct keytablist **list, int id, char **keys, int klen)
}
}
-void exec(void (*tabop)(struct keytablist **, int, char **, int),
- struct keytablist **list, int id, char **keys, int klen)
+void exec(void (*tabop)(tablist_t **, int, char **, int),
+ tablist_t **list, int id, char **keys, int klen)
{
if (id >= 0)
tabop(list, id, keys, klen);