From 175c04f2972c2a65e29ba2456ba5d058c35dcf87 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Thu, 22 May 2025 14:07:29 -0400 Subject: Improve file formatting --- .clangd | 7 ++++++- Makefile | 4 ++-- src/include/engine/file.c | 33 ++++++++++++++++++++++++--------- src/include/engine/setkeys.c | 2 +- src/include/engine/utils.c | 2 +- src/include/xml/decode.c | 31 +++++++++++++++++-------------- src/test.c | 43 +++++++++++++++++++++++++------------------ 7 files changed, 76 insertions(+), 46 deletions(-) diff --git a/.clangd b/.clangd index 2065b4b..a47d05f 100644 --- a/.clangd +++ b/.clangd @@ -1,5 +1,10 @@ CompileFlags: - Add: [-Wall] + Add: [ + -Wall, + -Wextra, + -std=c11, + -Isrc/include + ] InlayHints: Enabled: Yes diff --git a/Makefile b/Makefile index 8d539db..ec39896 100644 --- a/Makefile +++ b/Makefile @@ -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 #include #include #include #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, "