diff options
Diffstat (limited to 'src/include/engine/file.c')
-rw-r--r-- | src/include/engine/file.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/include/engine/file.c b/src/include/engine/file.c new file mode 100644 index 0000000..4da8b2d --- /dev/null +++ b/src/include/engine/file.c @@ -0,0 +1,98 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "engine.h" + +static char *getpair(int *c, FILE *fp); + +// TODO: reimplement this to read file in FI format +tablist_t *readdb(char *filename) +{ + int len = 2; + tablist_t *list = calloc(len, sizeof(tablist_t)); + list[0].len = len; + FILE *fp; + if (filename == NULL || + (fp = fopen(filename, "rb")) == NULL) + return list; + + int c, i = 0, open = 0; + char *p; + while ((c = fgetc(fp)) != EOF) { + switch (c) { + case 250: + p = getpair(&c, fp); + if (p == NULL) goto fail; + setkeys(&list, i, &p, 1); + free(p); + break; + case 251: + if (open == 1) goto fail; + open = 1; + break; + case 254: + open = 0; + i++; + break; + default: + goto fail; + } + } + fclose(fp); + return list; + +fail: + fclose(fp); + delkeys(list, -1, NULL, 0); + free(list); + return NULL; +} + +// TODO: rewrite this function to write data in FI format +void writedb(char *filename, tablist_t *list) +{ + FILE *fp = fopen(filename, "wb"); + if (fp == NULL) + return; + for (int i = 0; i < list[0].len; ++i) { + fputc(0xFB, fp); + tablist_t *indexes = getkeys(list, i, NULL, 0); + for (int j = 0; indexes[0].tab[j].flag; ++j) { + fprintf(fp, "\xfa%s:", indexes[0].tab[j].key); + switch (indexes[0].tab[j].flag) { + case 1: + fprintf(fp, "%.2lf\xfc", indexes[0].tab[j].value.num); + break; + case 2: + fprintf(fp, "%s\xfc", indexes[0].tab[j].value.boolean ? + "true" : "false"); + break; + case 3: + fprintf(fp, "%s\xfc", indexes[0].tab[j].value.str); + break; + } + } + free(indexes); + fputc(0xFE, fp); + } + fclose(fp); +} + +static char *getpair(int *c, FILE *fp) +{ + char *pair = calloc(3, sizeof(char)); + int i = 0, len = 3; + while ((*c = fgetc(fp)) != 252 && *c != EOF) { + if (i >= len) + pair = realloc(pair, ++len * sizeof(char)); + pair[i++] = *c; + } + pair = realloc(pair, ++len * sizeof(char)); + pair[i] = '\0'; + if (*c != 252) { + free(pair); + return NULL; + } + return pair; +} |