Tree builder not crashing, need to check functional correctness.
This commit is contained in:
@@ -117,8 +117,12 @@ void asserts(void)
|
||||
assert(sizeof(Bytef) == sizeof(char));
|
||||
}
|
||||
|
||||
void espr_walk(char *data, size_t size, struct walker_callbacks cb)
|
||||
{
|
||||
void espr_walk(
|
||||
char *data,
|
||||
size_t size,
|
||||
struct walker_callbacks cb,
|
||||
void *from_parent
|
||||
) {
|
||||
// check assertions that cannot be checked at compile time
|
||||
asserts();
|
||||
|
||||
@@ -128,7 +132,7 @@ void espr_walk(char *data, size_t size, struct walker_callbacks cb)
|
||||
const Type4 type = *(const Type4 *)data;
|
||||
assert(type.uint == rt[TES4]);
|
||||
|
||||
data = walk_concat(data, size, cb, NULL);
|
||||
data = walk_concat(data, size, cb, from_parent);
|
||||
assert(data == data_start + size);
|
||||
}
|
||||
|
||||
@@ -236,7 +240,7 @@ char *walk_record(char *data, struct walker_callbacks cb, void *from_parent)
|
||||
void espr_print(char *data, size_t size)
|
||||
{
|
||||
struct walker_callbacks cb = { .pre = print_cb };
|
||||
espr_walk(data, size, cb);
|
||||
espr_walk(data, size, cb, NULL);
|
||||
}
|
||||
|
||||
void print_cb(
|
||||
@@ -266,7 +270,7 @@ struct esp_stats espr_stats(char *data, size_t size)
|
||||
{
|
||||
struct esp_stats stats = { 0 };
|
||||
struct walker_callbacks cb = { .pre = stats_cb, .data = &stats };
|
||||
espr_walk(data, size, cb);
|
||||
espr_walk(data, size, cb, NULL);
|
||||
return stats;
|
||||
}
|
||||
|
||||
@@ -320,7 +324,7 @@ void espr_decompress(char *data, size_t size, char *buf, size_t buf_size)
|
||||
.post = decompress_post,
|
||||
.data = &s
|
||||
};
|
||||
espr_walk(data, size, cb);
|
||||
espr_walk(data, size, cb, NULL);
|
||||
}
|
||||
|
||||
/* Handles the copying of groups and records, and the decompression of
|
||||
@@ -639,10 +643,18 @@ Timestamp convert_ts(uint16_t ts)
|
||||
|
||||
MetaNode *espr_create_tree(struct sized_buf in, struct sized_buf tree)
|
||||
{
|
||||
const struct sized_buf tree_pre = tree;
|
||||
// create root node
|
||||
MetaNode *root = (MetaNode *)tree.data;
|
||||
*root = (MetaNode){ 0 };
|
||||
|
||||
// update tree
|
||||
sized_buf_update(&tree, sizeof(MetaNode));
|
||||
|
||||
// walk
|
||||
struct walker_callbacks cb = { .pre = create_tree_cb, .data = &tree };
|
||||
espr_walk(in.data, in.size, cb);
|
||||
return (MetaNode *)tree_pre.data;
|
||||
espr_walk(in.data, in.size, cb, root);
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
void create_tree_cb(
|
||||
@@ -656,18 +668,22 @@ void create_tree_cb(
|
||||
|
||||
// add new metanode to tree
|
||||
struct sized_buf *tree = data;
|
||||
assert(tree->size >= sizeof(MetaNode));
|
||||
MetaNode *m = (MetaNode *)tree->data;
|
||||
tree->data += sizeof(MetaNode);
|
||||
tree->size -= sizeof(MetaNode);
|
||||
sized_buf_update(tree, sizeof(MetaNode));
|
||||
|
||||
// parent passes their MetaNode to children
|
||||
MetaNode *p = from_parent;
|
||||
|
||||
// construct new node
|
||||
*m = (MetaNode){ 0 }; // zero/null unused
|
||||
m->n = n;
|
||||
m->parent = p;
|
||||
m->prev = p->last_child;
|
||||
p->last_child->next = m;
|
||||
// the linked list of children may not already exist
|
||||
if (p->last_child)
|
||||
p->last_child->next = m;
|
||||
else
|
||||
p->first_child = m;
|
||||
p->last_child = m;
|
||||
|
||||
// send self to children
|
||||
|
||||
Reference in New Issue
Block a user