summaryrefslogtreecommitdiff
path: root/src/file.c
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-03-10 15:26:32 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-03-10 15:26:32 -0400
commitde52acd37ea5634712ed78c624f77566e3ac634e (patch)
treee09c9fd6980a9d81dbfe50b2e7aed86566c07654 /src/file.c
parent7c8e83f655e41b11e970fd0abad5a96a3fb73e47 (diff)
Removed need for parser and revised readdb to return struct keytablist *
Diffstat (limited to 'src/file.c')
-rw-r--r--src/file.c75
1 files changed, 57 insertions, 18 deletions
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 <stdio.h>
#include <stdlib.h>
-#include <stdint.h>
#include <string.h>
#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;
}