From a34cf81386868591117d95da85a2aacf5b8938bd Mon Sep 17 00:00:00 2001 From: c Date: Mon, 20 May 2024 18:33:21 -0400 Subject: Broken. --- src/tree.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'src/tree.c') 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). */ -- cgit v1.2.3