diff --git a/src/utils/ast/ast.c b/src/utils/ast/ast.c index 93fa402..40b42d7 100644 --- a/src/utils/ast/ast.c +++ b/src/utils/ast/ast.c @@ -1,23 +1,68 @@ #include "ast.h" +#include #include +#include bool ast_is_if(struct ast *node) { + assert(node != NULL); return node->type == AST_IF; } bool ast_is_cmd(struct ast *node) { + assert(node != NULL); return node->type == AST_CMD; } struct ast_if *ast_get_if(struct ast *node) { + assert(node != NULL); + assert(node->type == AST_IF); return (struct ast_if *)node->data; } struct ast_cmd *ast_get_cmd(struct ast *node) { + assert(node != NULL); + assert(node->type == AST_CMD); return (struct ast_cmd *)node->data; } + +static struct ast *ast_create(enum ast_type type, void *data) +{ + struct ast *node = malloc(sizeof(struct ast)); + if (!node) + return NULL; + + node->type = type; + node->data = data; + + return node; +} + +struct ast *ast_create_if(struct ast *condition, struct ast *then_clause, + struct ast *else_clause) +{ + struct ast_if *if_data = malloc(sizeof(struct ast_if)); + if (!if_data) + return NULL; + + if_data->condition = condition; + if_data->then_clause = then_clause; + if_data->else_clause = else_clause; + + return ast_create(AST_IF, if_data); +} + +struct ast *ast_create_cmd(struct list *cmd) +{ + struct ast_cmd *cmd_data = malloc(sizeof(struct ast_cmd)); + if (!cmd_data) + return NULL; + + cmd_data->cmd = cmd; + + return ast_create(AST_CMD, cmd_data); +} diff --git a/src/utils/ast/ast.h b/src/utils/ast/ast.h index c68b143..3247ba5 100644 --- a/src/utils/ast/ast.h +++ b/src/utils/ast/ast.h @@ -1,6 +1,8 @@ #ifndef AST_H #define AST_H +#include + #include "../lists/lists.h" enum ast_type @@ -35,4 +37,37 @@ struct ast void *data; }; +/** + * Checks if the given AST node is an if statement. + */ +bool ast_is_if(struct ast *node); + +/** + * Checks if the given AST node is a command. + */ +bool ast_is_cmd(struct ast *node); + +/** + * Retrieves the if statement data from the given AST node. + * Assumes that the node is of type AST_IF. + */ +struct ast_if *ast_get_if(struct ast *node); + +/** + * Retrieves the command data from the given AST node. + * Assumes that the node is of type AST_CMD. + */ +struct ast_cmd *ast_get_cmd(struct ast *node); + +/** + * Creates a new AST node representing an if statement. + */ +struct ast *ast_create_if(struct ast *condition, struct ast *then_clause, + struct ast *else_clause); + +/** + * Creates a new AST node representing a command. + */ +struct ast *ast_create_cmd(struct list *cmd); + #endif /* ! AST_H */