summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-05-22 14:07:29 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-05-22 14:07:29 -0400
commit175c04f2972c2a65e29ba2456ba5d058c35dcf87 (patch)
tree6eb27a6c74a1ef0f89e8e109bf8225c4ce9d39a4
parenta08b44e1c6fbd8b56011a969f8c11bcc630e1ee0 (diff)
Improve file formatting
-rw-r--r--.clangd7
-rw-r--r--Makefile4
-rw-r--r--src/include/engine/file.c33
-rw-r--r--src/include/engine/setkeys.c2
-rw-r--r--src/include/engine/utils.c2
-rw-r--r--src/include/xml/decode.c31
-rw-r--r--src/test.c43
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 <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);
diff --git a/src/test.c b/src/test.c
index 12cac0d..aa6c2e9 100644
--- a/src/test.c
+++ b/src/test.c
@@ -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);
}