diff --git a/bshell.runtime/ast/ast.c b/bshell.runtime/ast/ast.c index 80a0b8a..73be680 100644 --- a/bshell.runtime/ast/ast.c +++ b/bshell.runtime/ast/ast.c @@ -154,10 +154,8 @@ struct bshell_ast_node *bshell_ast_iterator_dequeue( return NULL; } - struct bshell_ast_node *node = fx_unbox( - struct bshell_ast_node, - cur, - n_it.e_entry); + struct bshell_ast_node *node + = fx_unbox(struct bshell_ast_node, cur, n_it.e_entry); const struct bshell_ast_node_definition *def = bshell_ast_node_definitions[node->n_type]; @@ -178,10 +176,8 @@ void bshell_ast_iterator_enqueue( fx_queue_entry *cur = fx_queue_first(&it->it_queue); if (cur) { - struct bshell_ast_node *cur_node = fx_unbox( - struct bshell_ast_node, - cur, - n_it.e_entry); + struct bshell_ast_node *cur_node + = fx_unbox(struct bshell_ast_node, cur, n_it.e_entry); new_depth = cur_node->n_it.e_depth + 1; } @@ -222,11 +218,8 @@ enum bshell_status bshell_ast_node_iterate( return BSHELL_ERR_INTERNAL_FAILURE; } - struct bshell_ast_iterate_result result = callback( - node, - BSHELL_AST_ITERATION_PRE, - it, - arg); + struct bshell_ast_iterate_result result + = callback(node, BSHELL_AST_ITERATION_PRE, it, arg); if (result.r_status != BSHELL_SUCCESS || result.r_flags & BSHELL_AST_ITERATE_STOP) { return result.r_status; @@ -258,11 +251,8 @@ enum bshell_status bshell_ast_node_iterate( return BSHELL_ERR_INTERNAL_FAILURE; } - struct bshell_ast_iterate_result result = callback( - node, - BSHELL_AST_ITERATION_POST, - it, - arg); + struct bshell_ast_iterate_result result + = callback(node, BSHELL_AST_ITERATION_POST, it, arg); if (result.r_status != BSHELL_SUCCESS || result.r_flags & BSHELL_AST_ITERATE_STOP) { return result.r_status; diff --git a/bshell.runtime/ast/double.c b/bshell.runtime/ast/double.c index 854c372..4980c89 100644 --- a/bshell.runtime/ast/double.c +++ b/bshell.runtime/ast/double.c @@ -4,13 +4,22 @@ static void to_string(const struct bshell_ast_node *node, fx_bstr *out) { - struct bshell_double_ast_node *i = (struct bshell_double_ast_node *) - node; + struct bshell_double_ast_node *i + = (struct bshell_double_ast_node *)node; fx_value_to_string(&i->n_value->tok_number, (fx_stream *)out, NULL); } +static enum bshell_status cleanup(struct bshell_ast_node *node) +{ + struct bshell_double_ast_node *d + = (struct bshell_double_ast_node *)node; + bshell_lex_token_destroy(d->n_value); + return BSHELL_SUCCESS; +} + struct bshell_ast_node_definition double_bshell_ast_node = { .def_id = BSHELL_AST_DOUBLE, .def_node_size = sizeof(struct bshell_double_ast_node), .def_to_string = to_string, + .def_cleanup = cleanup, }; diff --git a/bshell.runtime/ast/func.c b/bshell.runtime/ast/func.c index 6564ddc..b1e303f 100644 --- a/bshell.runtime/ast/func.c +++ b/bshell.runtime/ast/func.c @@ -9,10 +9,8 @@ static enum bshell_status collect_children( fx_queue_entry *cur = fx_queue_first(&func->n_params); while (cur) { - struct bshell_ast_node *child = fx_unbox( - struct bshell_ast_node, - cur, - n_entry); + struct bshell_ast_node *child + = fx_unbox(struct bshell_ast_node, cur, n_entry); bshell_ast_iterator_enqueue(it, child); cur = fx_queue_next(cur); } @@ -26,14 +24,22 @@ static enum bshell_status collect_children( static void to_string(const struct bshell_ast_node *node, fx_bstr *out) { - const struct bshell_func_ast_node *func = (const struct - bshell_func_ast_node *)node; + const struct bshell_func_ast_node *func + = (const struct bshell_func_ast_node *)node; fx_bstr_write_fmt(out, NULL, "%s", func->n_name->tok_str); } +static enum bshell_status cleanup(struct bshell_ast_node *node) +{ + struct bshell_func_ast_node *d = (struct bshell_func_ast_node *)node; + bshell_lex_token_destroy(d->n_name); + return BSHELL_SUCCESS; +} + struct bshell_ast_node_definition func_bshell_ast_node = { .def_id = BSHELL_AST_FUNC, .def_node_size = sizeof(struct bshell_func_ast_node), .def_collect_children = collect_children, .def_to_string = to_string, + .def_cleanup = cleanup, }; diff --git a/bshell.runtime/ast/int.c b/bshell.runtime/ast/int.c index b3daf45..164bedc 100644 --- a/bshell.runtime/ast/int.c +++ b/bshell.runtime/ast/int.c @@ -8,8 +8,16 @@ static void to_string(const struct bshell_ast_node *node, fx_bstr *out) fx_value_to_string(&i->n_value->tok_number, (fx_stream *)out, NULL); } +static enum bshell_status cleanup(struct bshell_ast_node *node) +{ + struct bshell_int_ast_node *i = (struct bshell_int_ast_node *)node; + bshell_lex_token_destroy(i->n_value); + return BSHELL_SUCCESS; +} + struct bshell_ast_node_definition int_bshell_ast_node = { .def_id = BSHELL_AST_INT, .def_node_size = sizeof(struct bshell_int_ast_node), .def_to_string = to_string, + .def_cleanup = cleanup, }; diff --git a/bshell.runtime/ast/redirection.c b/bshell.runtime/ast/redirection.c index d5ba3fd..d3e37ac 100644 --- a/bshell.runtime/ast/redirection.c +++ b/bshell.runtime/ast/redirection.c @@ -1,4 +1,5 @@ #include +#include static enum bshell_status collect_children( struct bshell_ast_node *node, @@ -41,9 +42,20 @@ static void to_string(const struct bshell_ast_node *node, fx_bstr *out) } } +static enum bshell_status cleanup(struct bshell_ast_node *node) +{ + struct bshell_redirection_ast_node *v + = (struct bshell_redirection_ast_node *)node; + if (v->n_out_tok) { + bshell_lex_token_destroy(v->n_out_tok); + } + return BSHELL_SUCCESS; +} + struct bshell_ast_node_definition redirection_bshell_ast_node = { .def_id = BSHELL_AST_REDIRECTION, .def_node_size = sizeof(struct bshell_redirection_ast_node), .def_collect_children = collect_children, .def_to_string = to_string, + .def_cleanup = cleanup, }; diff --git a/bshell.runtime/ast/string.c b/bshell.runtime/ast/string.c index e3e46a9..a68f665 100644 --- a/bshell.runtime/ast/string.c +++ b/bshell.runtime/ast/string.c @@ -3,14 +3,22 @@ static void to_string(const struct bshell_ast_node *node, fx_bstr *out) { - const struct bshell_string_ast_node *string = (const struct - bshell_string_ast_node *) - node; + const struct bshell_string_ast_node *string + = (const struct bshell_string_ast_node *)node; fx_bstr_write_fmt(out, NULL, "%s", string->n_value->tok_str); } +static enum bshell_status cleanup(struct bshell_ast_node *node) +{ + struct bshell_string_ast_node *string + = (struct bshell_string_ast_node *)node; + bshell_lex_token_destroy(string->n_value); + return BSHELL_SUCCESS; +} + struct bshell_ast_node_definition string_bshell_ast_node = { .def_id = BSHELL_AST_STRING, .def_node_size = sizeof(struct bshell_string_ast_node), .def_to_string = to_string, + .def_cleanup = cleanup, }; diff --git a/bshell.runtime/ast/var.c b/bshell.runtime/ast/var.c index 80269ca..23b8675 100644 --- a/bshell.runtime/ast/var.c +++ b/bshell.runtime/ast/var.c @@ -3,13 +3,21 @@ static void to_string(const struct bshell_ast_node *node, fx_bstr *out) { - const struct bshell_var_ast_node *var = (const struct - bshell_var_ast_node *)node; + const struct bshell_var_ast_node *var + = (const struct bshell_var_ast_node *)node; fx_bstr_write_fmt(out, NULL, "%s", var->n_ident->tok_str); } +static enum bshell_status cleanup(struct bshell_ast_node *node) +{ + struct bshell_var_ast_node *v = (struct bshell_var_ast_node *)node; + bshell_lex_token_destroy(v->n_ident); + return BSHELL_SUCCESS; +} + struct bshell_ast_node_definition var_bshell_ast_node = { .def_id = BSHELL_AST_VAR, .def_node_size = sizeof(struct bshell_var_ast_node), .def_to_string = to_string, + .def_cleanup = cleanup, }; diff --git a/bshell.runtime/ast/word.c b/bshell.runtime/ast/word.c index f62a5d1..173e349 100644 --- a/bshell.runtime/ast/word.c +++ b/bshell.runtime/ast/word.c @@ -3,13 +3,21 @@ static void to_string(const struct bshell_ast_node *node, fx_bstr *out) { - const struct bshell_word_ast_node *word = (const struct - bshell_word_ast_node *)node; + const struct bshell_word_ast_node *word + = (const struct bshell_word_ast_node *)node; fx_bstr_write_fmt(out, NULL, "%s", word->n_value->tok_str); } +static enum bshell_status cleanup(struct bshell_ast_node *node) +{ + struct bshell_word_ast_node *w = (struct bshell_word_ast_node *)node; + bshell_lex_token_destroy(w->n_value); + return BSHELL_SUCCESS; +} + struct bshell_ast_node_definition word_bshell_ast_node = { .def_id = BSHELL_AST_WORD, .def_node_size = sizeof(struct bshell_word_ast_node), .def_to_string = to_string, + .def_cleanup = cleanup, };