diff options
author | bpc2003 <wpesfriendnva@gmail.com> | 2025-05-22 14:07:29 -0400 |
---|---|---|
committer | bpc2003 <wpesfriendnva@gmail.com> | 2025-05-22 14:07:29 -0400 |
commit | 175c04f2972c2a65e29ba2456ba5d058c35dcf87 (patch) | |
tree | 6eb27a6c74a1ef0f89e8e109bf8225c4ce9d39a4 | |
parent | a08b44e1c6fbd8b56011a969f8c11bcc630e1ee0 (diff) |
Improve file formatting
-rw-r--r-- | .clangd | 7 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | src/include/engine/file.c | 33 | ||||
-rw-r--r-- | src/include/engine/setkeys.c | 2 | ||||
-rw-r--r-- | src/include/engine/utils.c | 2 | ||||
-rw-r--r-- | src/include/xml/decode.c | 31 | ||||
-rw-r--r-- | src/test.c | 43 |
7 files changed, 76 insertions, 46 deletions
@@ -1,5 +1,10 @@ CompileFlags: - Add: [-Wall] + Add: [ + -Wall, + -Wextra, + -std=c11, + -Isrc/include + ] InlayHints: Enabled: Yes @@ -2,7 +2,7 @@ CC = clang BUILD = target C_FLAGS = -Wall -lmdb -std=c11 D_FLAGS = -L$(BUILD) -Wl,-rpath=$(BUILD) -O0 -L_FLAGS = -c -fPIC -Wall +L_FLAGS = -c -fPIC -Wall -Wextra all: mdb mdb: lib @@ -14,7 +14,7 @@ lib: $(BUILD) test: dev_lib $(CC) src/test.c $(D_FLAGS) -g $(C_FLAGS) -o $(BUILD)/test.out - valgrind --tool=memcheck --leak-check=full --log-file="mem_dbg" ./$(BUILD)/test.out + valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --log-file="mem_dbg" ./$(BUILD)/test.out valgrind --tool=drd -s --log-file="thrd_dbg" ./$(BUILD)/test.out rm -rf $(BUILD) dev: dev_lib diff --git a/src/include/engine/file.c b/src/include/engine/file.c index ab77010..4ff7263 100644 --- a/src/include/engine/file.c +++ b/src/include/engine/file.c @@ -1,9 +1,15 @@ +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "engine.h" +static const uint32_t ND_MARK = 0xffffffff; +static const uint32_t V_MARK = 0xfeffffff; + +static const char *HEAD = "XDBF"; + static int check(char **known, int len, char *str); static void freeknown(char ***known, int len); @@ -23,13 +29,19 @@ tablist_t *readdb(char *filename) { fread(buf, sizeof(char), sz, fp); fclose(fp); + if (strncmp(buf, HEAD, 4)) { + free(buf); + free(list); + return NULL; + } + int tlen, vlen, t = 0, v = 0, l = -1; char **ktags = calloc((tlen = 2), sizeof(char *)); char **kvalues = calloc((vlen = 2), sizeof(char *)); char *key, *value; - for (int i = 0; i < sz; ++i) { - if (buf[i] == ':') { - ++i; + for (int i = 4; i < sz; ++i) { + if (checkmark(buf, i) == 2) { + i += 4; value = readidx(buf, &i, &kvalues, &vlen, &v); char *pair = calloc(strlen(key) + strlen(value) + 2, sizeof(char)); sprintf(pair, "%s:%s", key, value); @@ -50,7 +62,7 @@ tablist_t *readdb(char *filename) { static char *readidx(char *buf, int *i, char ***known, int *len, int *pos) { char *r = NULL; - if (checkmark(buf, *i)) { + if (checkmark(buf, *i) == 1) { if (*len >= *pos) { *len *= 2; *known = realloc(*known, *len * sizeof(char *)); @@ -75,8 +87,11 @@ static char *readidx(char *buf, int *i, char ***known, int *len, int *pos) { } static int checkmark(char *buf, int pos) { - int marker = 0xffffffff; - return !memcmp(buf + pos, &marker, sizeof(int)); + if (!memcmp(buf + pos, &ND_MARK, sizeof(uint32_t))) + return 1; + else if (!memcmp(buf + pos, &V_MARK, sizeof(uint32_t))) + return 2; + return 0; } static long getsz(FILE *fp) { @@ -93,6 +108,7 @@ void writedb(char *filename, tablist_t *list) { FILE *fp = fopen(filename, "wb"); if (fp == NULL) return; + fwrite(HEAD, sizeof(char), 4, fp); int tlen, vlen, t = 0, v = 0; char **ktags = calloc((tlen = 2), sizeof(char *)); writeidx(&ktags, &tlen, &t, "documents", fp); @@ -106,7 +122,7 @@ void writedb(char *filename, tablist_t *list) { writeidx(&ktags, &tlen, &t, "document", fp); for (int j = 0; indexes[i].tab[j].flag; ++j) { writeidx(&ktags, &tlen, &t, indexes[i].tab[j].key, fp); - fputc(':', fp); + fwrite(&V_MARK, sizeof(uint32_t), 1, fp); switch (indexes[i].tab[j].flag) { case 1: snprintf(buf, 64, "%g", indexes[i].tab[j].value.num); @@ -131,8 +147,7 @@ void writedb(char *filename, tablist_t *list) { static void newtag(char *tag, FILE *fp) { int len = strlen(tag); - int marker = 0xffffffff; - fwrite(&marker, sizeof(int), 1, fp); + fwrite(&ND_MARK, sizeof(uint32_t), 1, fp); fwrite(&len, sizeof(int), 1, fp); fwrite(tag, sizeof(char), len, fp); } diff --git a/src/include/engine/setkeys.c b/src/include/engine/setkeys.c index f8797e6..fd9e8f9 100644 --- a/src/include/engine/setkeys.c +++ b/src/include/engine/setkeys.c @@ -120,7 +120,7 @@ static int setkey(tablist_t **list, int id, char *pair) { static char **getkv(char *pair) { char **kv = calloc(2, sizeof(char *)); - int i = 0; + unsigned long i = 0; while (pair[i] != ':' && i < strlen(pair)) i++; if (i >= strlen(pair)) { diff --git a/src/include/engine/utils.c b/src/include/engine/utils.c index f8ef7f0..134ace0 100644 --- a/src/include/engine/utils.c +++ b/src/include/engine/utils.c @@ -16,7 +16,7 @@ void dellist(tablist_t *list) { int hash(char *key) { unsigned long h = 5381; - for (int i = 0; i < strlen(key); ++i) + for (unsigned long i = 0; i < strlen(key); ++i) h = ((h << 5) + h) + key[i]; return h % TABLEN; } diff --git a/src/include/xml/decode.c b/src/include/xml/decode.c index dccbc2f..1962f7e 100644 --- a/src/include/xml/decode.c +++ b/src/include/xml/decode.c @@ -3,21 +3,22 @@ #include "xml.h" -static char *get_tag(char *xml, int *pos); +static char *get_tag(char *xml, unsigned long *pos); static attr_t *get_attrs(char *parsed, char **tag, int *n_attrs); -static int check_closing_tag(char *xml, int *pos, char *tag, int *err); -static void set_tag(char *xml, map_t **map, int *closed, int *pos); -static void set_value(char *xml, int *pos, map_t **map); +static int check_closing_tag(char *xml, unsigned long *pos, char *tag, int *err); +static void set_tag(char *xml, map_t **map, int *closed, unsigned long *pos); +static void set_value(char *xml, unsigned long *pos, map_t **map); -static map_t *decode_helper(char *xml, int *pos, int *len); +static map_t *decode_helper(char *xml, unsigned long *pos, int *len); map_t *decode(char *xml) { - int start = 0, len = 0; + int len = 0; + unsigned long start = 0; return decode_helper(xml, &start, &len); } -static map_t *decode_helper(char *xml, int *pos, int *len) { +static map_t *decode_helper(char *xml, unsigned long *pos, int *len) { if (*len) ++(*len); else @@ -25,7 +26,7 @@ static map_t *decode_helper(char *xml, int *pos, int *len) { map_t *decoded = calloc(1, sizeof(map_t)); int err = 0, closed = 1; - for (int i = *pos; i < strlen(xml); ++i) { + for (unsigned long i = *pos; i < strlen(xml); ++i) { if (check_closing_tag(xml, &i, decoded->tag, &err)) { if (!err) *pos = i; @@ -52,8 +53,9 @@ static map_t *decode_helper(char *xml, int *pos, int *len) { return decoded; } -static char *get_tag(char *xml, int *pos) { - int len, i; +static char *get_tag(char *xml, unsigned long *pos) { + int len; + unsigned long i; for (i = *pos, len = 0; xml[i] != '>' && i < strlen(xml); ++i, ++len) ; if (i >= strlen(xml)) @@ -64,8 +66,9 @@ static char *get_tag(char *xml, int *pos) { return title; } -static void set_value(char *xml, int *pos, map_t **map) { - int len, i; +static void set_value(char *xml, unsigned long *pos, map_t **map) { + int len; + unsigned long i; for (i = *pos, len = 0; xml[i] != '<' && i < strlen(xml); ++i, ++len) ; if (i >= strlen(xml)) @@ -122,14 +125,14 @@ static attr_t *get_attrs(char *parsed, char **tag, int *n_attrs) { return attrs; } -static void set_tag(char *xml, map_t **map, int *closed, int *pos) { +static void set_tag(char *xml, map_t **map, int *closed, unsigned long *pos) { (*pos)++; (*map)->attrs = get_attrs(get_tag(xml, pos), &((*map)->tag), &((*map)->n_attrs)); *closed = 0; } -static int check_closing_tag(char *xml, int *pos, char *tag, int *err) { +static int check_closing_tag(char *xml, unsigned long *pos, char *tag, int *err) { if (!strncmp(xml + *pos, "</", 2)) { *pos += 2; char *tmp = get_tag(xml, pos); @@ -6,14 +6,14 @@ #include "include/xml/xml.h" void test_writedb(void) { - tablist_t *list = readdb("dbs/test.db"); - writedb("dbs/test.db", list); + tablist_t *list = readdb("dbs/test.xdb"); + writedb("dbs/test.xdb", list); delkeys(list, -1, NULL, 0); free(list); } void test_readdb(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); tablist_t *indices = getkeys(list, -1, NULL, 0); for (int i = 0; i < indices[0].len; ++i) { printf("id: %d\n", i); @@ -25,8 +25,14 @@ void test_readdb(void) { free(list); } +void test_readdb_fail(void) { + tablist_t *list = readdb("dbs/bad.xdb"); + if (list != NULL) + fprintf(stderr, "test_readdb_fail: failed\n"); +} + void test_setkeys(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *pairs[] = {"name:John"}; if (setkeys(&list, -1, pairs, 1)) { fprintf(stderr, "test_setkeys: failed\n"); @@ -44,7 +50,7 @@ void test_setkeys(void) { } void test_setkeys_fail(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *pairs[] = {"namejohn"}; if (!setkeys(&list, -1, pairs, 1)) { fprintf(stderr, "test_setkeys_fail: failed\n"); @@ -55,7 +61,7 @@ void test_setkeys_fail(void) { } void test_setkeys_multi_fail(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *pairs[] = {"name:John", NULL}; if (!setkeys(&list, -1, pairs, 2)) { fprintf(stderr, "test_setkeys_multi_fail: failed\n"); @@ -66,7 +72,7 @@ void test_setkeys_multi_fail(void) { } void test_setkeys_single(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *pairs[] = {"name:Alice"}; if (setkeys(&list, 101, pairs, 1)) { fprintf(stderr, "test_setkeys_single: failed\n"); @@ -77,7 +83,7 @@ void test_setkeys_single(void) { } void test_setkeys_multipairs(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *pairs[] = {"name:Bob", "active:true"}; if (setkeys(&list, 0, pairs, 2)) { fprintf(stderr, "test_setkeys_multipairs: failed\n"); @@ -88,7 +94,7 @@ void test_setkeys_multipairs(void) { } void test_delkeys(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *keys[] = {"Row_1"}; if (delkeys(list, -1, keys, 1)) { fprintf(stderr, "test_delkeys: failed\n"); @@ -106,7 +112,7 @@ void test_delkeys(void) { } void test_delkeys_all(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); if (delkeys(list, -1, NULL, 0)) { fprintf(stderr, "test_delkeys_all: failed\n"); return; @@ -115,7 +121,7 @@ void test_delkeys_all(void) { } void test_delkeys_fail(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *keys[] = {"Row_4"}; if (!delkeys(list, -1, keys, 1)) { fprintf(stderr, "test_delkeys_fail: failed\n"); @@ -126,7 +132,7 @@ void test_delkeys_fail(void) { } void test_delkeys_single(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); if (delkeys(list, 0, NULL, 0)) { fprintf(stderr, "test_delkeys_single: failed\n"); return; @@ -136,7 +142,7 @@ void test_delkeys_single(void) { } void test_delkeys_multi(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *keys[] = {"Row_1", "Row_2"}; if (delkeys(list, -1, keys, 2)) { fprintf(stderr, "test_delkeys_multi: failed\n"); @@ -147,7 +153,7 @@ void test_delkeys_multi(void) { } void test_getkeys_multi(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *keys[] = {"Row_1", "Row_2"}; tablist_t *ret = getkeys(list, 0, keys, 2); if (ret == NULL) { @@ -162,7 +168,7 @@ void test_getkeys_multi(void) { } void test_getkeys_multi_fail(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); char *keys[] = {"Row_1", "Row_4"}; tablist_t *ret = getkeys(list, 0, keys, 2); if (ret) { @@ -174,7 +180,7 @@ void test_getkeys_multi_fail(void) { } void test_getkeys(void) { - tablist_t *list = readdb("dbs/test.db"); + tablist_t *list = readdb("dbs/test.xdb"); tablist_t *ret = getkeys(list, -1, NULL, 0); if (!ret) { fprintf(stderr, "test_getkeys: failed\n"); @@ -237,6 +243,7 @@ void test_decode(void) { int main(void) { // test_writedb(); // test_readdb(); + // test_readdb_fail(); // test_getkeys(); // test_getkeys_multi(); // test_getkeys_multi_fail(); @@ -252,8 +259,8 @@ int main(void) { // test_delkeys_fail(); // test_delkeys_single(); // test_delkeys_multi(); - test_encode(); - test_decode(); + // test_encode(); + // test_decode(); exit(0); } |