aboutsummaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/tree.c b/src/tree.c
index 8876e47..4729200 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -90,6 +90,49 @@ void tree_destroy(tree_t* tree) {
free(tree);
}
+int tree_cmp(tree_t* tree_0, tree_t* tree_1) {
+ if ((tree_0 && !tree_1) || (!tree_0 && tree_1)) { return 0; } /* Only 1 is defined (failure). */
+ if (!tree_0 && !tree_1) { return 1; } /* Both are undefined (success). */
+ if (tree_0->type != tree_1->type) { return 0; } /* Types do not match (failure). */
+
+ switch (tree_0->type) {
+ case TREE_TYPE_BLOCK:
+ return tree_cmp(tree_0->data.block.val, tree_1->data.block.val) &&
+ tree_cmp(tree_0->data.block.val, tree_1->data.block.val);
+ break;
+ case TREE_TYPE_EXPR:
+ return tree_cmp(tree_0->data.expr.val, tree_1->data.expr.val);
+ break;
+ case TREE_TYPE_LINT:
+ return tree_0->data.lint.val == tree_1->data.lint.val;
+ break;
+ case TREE_TYPE_LSTR:
+ return strcmp(tree_0->data.lstr.val, tree_1->data.lstr.val) == 0;
+ break;
+ case TREE_TYPE_TAG:
+ return (strcmp(tree_0->data.tag.val, tree_1->data.tag.val) == 0) &&
+ tree_cmp(tree_0->data.tag.nxt, tree_1->data.tag.nxt);
+ break;
+ case TREE_TYPE_DARG:
+ return tree_cmp(tree_0->data.darg.tag, tree_1->data.darg.tag) &&
+ tree_cmp(tree_0->data.darg.nxt, tree_1->data.darg.nxt);
+ break;
+ case TREE_TYPE_CARG:
+ return tree_cmp(tree_0->data.carg.val, tree_1->data.carg.val) &&
+ tree_cmp(tree_0->data.carg.nxt, tree_1->data.carg.nxt);
+ break;
+ case TREE_TYPE_DEF:
+ return tree_cmp(tree_0->data.def.tag, tree_1->data.def.tag) &&
+ tree_cmp(tree_0->data.def.arg, tree_1->data.def.arg) &&
+ tree_cmp(tree_0->data.def.val, tree_1->data.def.val);
+ break;
+ case TREE_TYPE_CALL:
+ return (strcmp(tree_0->data.call.target, tree_1->data.call.target) == 0) &&
+ tree_cmp(tree_0->data.call.arg, tree_1->data.call.arg);
+ break;
+ }
+}
+
/*
Every time I think there's a problem with the parser, it turns out it's
just this stupid tree print function.