aboutsummaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/tree.c b/src/tree.c
index 916936d..beef0b7 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -113,11 +113,68 @@ void tree_destroy(tree_t* tree) {
free(tree);
}
+void tree_cpy(tree_t** dest, tree_t* src) {
+ if (!src) { *dest = NULL; return; }
+
+ *dest = malloc(sizeof(tree_t));
+
+ memcpy(&(*dest)->data, &src->data, sizeof(union TREE_DATA));
+
+ switch (src->type) {
+ case TREE_TYPE_BLOCK:
+ tree_cpy(&(*dest)->data.block.val, src->data.block.val);
+ tree_cpy(&(*dest)->data.block.nxt, src->data.block.nxt);
+ break;
+ case TREE_TYPE_EXPR:
+ // TODO: fix.
+ DIE("this shouldn't be here");
+ tree_cpy(&(*dest)->data.expr.val, src->data.expr.val);
+ break;
+ case TREE_TYPE_LINT:
+ break;
+ case TREE_TYPE_LSTR:
+ (*dest)->data.lstr.val = malloc(
+ (src->data.lstr.len + 1) * sizeof(char)
+ );
+
+ strcpy((*dest)->data.lstr.val, src->data.lstr.val);
+ break;
+ case TREE_TYPE_TAG:
+ (*dest)->data.tag.val = malloc(sizeof(src->data.tag.val));
+ strcpy((*dest)->data.tag.val, src->data.tag.val);
+
+ tree_cpy(&(*dest)->data.tag.nxt, src->data.tag.nxt);
+ break;
+ case TREE_TYPE_DARG:
+ tree_cpy(&(*dest)->data.darg.tag, src->data.darg.tag);
+ tree_cpy(&(*dest)->data.darg.nxt, src->data.darg.nxt);
+ break;
+ case TREE_TYPE_CARG:
+ tree_cpy(&(*dest)->data.carg.val, src->data.carg.val);
+ tree_cpy(&(*dest)->data.carg.nxt, src->data.carg.nxt);
+ break;
+ case TREE_TYPE_DEF:
+ tree_cpy(&(*dest)->data.def.tag, src->data.def.tag);
+ tree_cpy(&(*dest)->data.def.arg, src->data.def.arg);
+ tree_cpy(&(*dest)->data.def.val, src->data.def.val);
+ break;
+ case TREE_TYPE_CALL:
+ (*dest)->data.call.target = malloc(sizeof(src->data.call.target));
+ strcpy((*dest)->data.call.target, src->data.call.target);
+
+ tree_cpy(&(*dest)->data.call.arg, src->data.call.arg);
+ break;
+ }
+}
+
+// TODO: Does this function actually do anything??
+#if 0
tree_t* tree_copy_out(tree_t* tree) {
tree_t* newt = tree_init(tree->type, tree->parent);
memcpy(&newt->data, &tree->data, sizeof(newt->data));
return newt;
}
+#endif
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). */