From 941099778b59da6b904c284e8a82affe4766124b Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 30 Mar 2020 22:27:16 +0200 Subject: Added doc --- src/parse/ast.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/parse/ast.c (limited to 'src/parse/ast.c') diff --git a/src/parse/ast.c b/src/parse/ast.c new file mode 100644 index 0000000..f566832 --- /dev/null +++ b/src/parse/ast.c @@ -0,0 +1,63 @@ +/** +** \file ast.c +** \brief AST manipulation +*/ + +#include "ms_parse.h" + +/** +** \brief Create a new AST node with default values +** \param tag Tag of the node +** \return The allocated node +*/ + +t_ast *ms_ast_new(t_tag tag) +{ + t_ast *ast; + + if ((ast = (t_ast*)malloc(sizeof(t_ast))) == NULL) + return (NULL); + ast->tag = tag; + ast->content = NULL; + ast->children_num = 0; + ast->children = NULL; + return (ast); +} + +/** +** \brief Destroy an allocated AST +** \warning Assumes that `content`, `children` and the node itself have been malloc'd +** \param ast AST to destroy +*/ + +void ms_ast_destroy(t_ast *ast) +{ + int i; + + if (ast == NULL) + return ; + i = -1; + while (++i < ast->children_num) + ms_ast_destroy(ast->children[i]); + free(ast->children); + free(ast->content); + free(ast); +} + +/** +** \brief Iterate over an AST node's childs +** \param f Function applied to each child, take `arg` has his first argument. +** \param arg Pointer that will be passed to `f`, to keep information between iterations +*/ + +void ms_ast_iter( + t_ast *ast, + void (*f)(void *f_arg, t_ast *children), + void *arg) +{ + int i; + + i = -1; + while (++i < ast->children_num) + f(arg, ast->children[i]); +} -- cgit