ast: implement cleanup callbacks
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include <bshell/ast.h>
|
||||
#include <bshell/parse/lex.h>
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user