diff options
Diffstat (limited to 'src/include')
-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 |
4 files changed, 43 insertions, 25 deletions
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); |