From de52acd37ea5634712ed78c624f77566e3ac634e Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Mon, 10 Mar 2025 15:26:32 -0400 Subject: Removed need for parser and revised readdb to return struct keytablist * --- src/file.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 18 deletions(-) (limited to 'src/file.c') diff --git a/src/file.c b/src/file.c index ba24ed3..e3cee9d 100644 --- a/src/file.c +++ b/src/file.c @@ -1,53 +1,92 @@ #include #include -#include #include #include "include/mdb.h" -uint8_t *readdb(char *filename) +static char *getpair(int *c, FILE *fp); + +struct keytablist *readdb(char *filename) { + int len = 2; + struct keytablist *list = calloc(len, sizeof(struct keytablist)); FILE *fp = fopen(filename, "rb"); if (fp == NULL) - return NULL; + return list; - int len = 10; - uint8_t *buf = calloc(len, sizeof(uint8_t)); - int c, i = 0; + int c, i = 0, open = 0; + char *p; while ((c = fgetc(fp)) != EOF) { - if (i >= len) { - len *= 2; - buf = realloc(buf, len * sizeof(uint8_t)); - memset(buf + i, 0, (len - i) * sizeof(uint8_t)); + switch (c) { + case 250: + p = getpair(&c, fp); + if (p == NULL) { + fprintf(stderr, "missing pair closing byte!\n"); + return NULL; + } + setkey(&list, &len, i, p); + free(p); + break; + case 251: + if (open == 1) { + fprintf(stderr, "missing object closing byte!\n"); + return NULL; + } + open = 1; + break; + case 254: + open = 0; + i++; + break; + default: + fprintf(stderr, "Unknown byte: %d\n", c); + return NULL; } - buf[i++] = c; } - fclose(fp); - return buf; + return list; } -void writedb(char *filename, struct keytablist *list, int len) +void writedb(char *filename, struct keytablist *list) { FILE *fp = fopen(filename, "wb"); - for (int i = 0; i < len; ++i) { + for (int i = 0; i < list[0].len; ++i) { fprintf(fp, "\xfb"); int *indexes = getkeys(list, i); for (int j = 0; indexes[j]; ++j) { fprintf(fp, "\xfa%s:", list[i].tab[indexes[j]].key); switch (list[i].tab[indexes[j]].flag) { case 1: - fprintf(fp, "%.2lf", list[i].tab[indexes[j]].v.num); + fprintf(fp, "%.2lf\xfc", list[i].tab[indexes[j]].v.num); break; case 2: - fprintf(fp, "%s", list[i].tab[indexes[j]].v.b == 1 ? "true" : "false"); + fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].v.b == 1 ? "true" : "false"); break; case 3: - fprintf(fp, "%s", list[i].tab[indexes[j]].v.str); + fprintf(fp, "%s\xfc", list[i].tab[indexes[j]].v.str); break; } } free(indexes); fprintf(fp, "\xfe"); } + 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; } -- cgit v1.2.3