From 3445a36a7c89ee561e304497bc2eb74f31221c70 Mon Sep 17 00:00:00 2001 From: Jean Herail Date: Thu, 22 Jan 2026 16:46:33 +0100 Subject: [PATCH] Pretty_print --- src/main.c | 5 ++ src/utils/ast/ast.c | 165 ++++++++++++++++++++++++++------------------ 2 files changed, 103 insertions(+), 67 deletions(-) diff --git a/src/main.c b/src/main.c index f9c4407..b86a9a7 100644 --- a/src/main.c +++ b/src/main.c @@ -76,6 +76,11 @@ int main(int argc, char **argv) // Retrieve and build first AST struct ast *command_ast = get_ast(ctx); + if (options.pretty_print) + { + ast_print_dot(command_ast); + } + // Main parse-execute loop while (command_ast != NULL && command_ast->type != AST_END) { diff --git a/src/utils/ast/ast.c b/src/utils/ast/ast.c index cd875e7..910fd10 100644 --- a/src/utils/ast/ast.c +++ b/src/utils/ast/ast.c @@ -2,9 +2,91 @@ #include #include +#include #include #include +void ast_free(struct ast **node) +{ + if (!node) + if (*node == NULL) + return; + // ast void does not need to be freed. + if (ast_is_if(*node)) + ast_free_if(ast_get_if(*node)); + else if (ast_is_command(*node)) + ast_free_command(ast_get_command(*node)); + else if (ast_is_list(*node)) + ast_free_list(ast_get_list(*node)); + else if (ast_is_and_or(*node)) + ast_free_and_or(ast_get_and_or(*node)); + else if (ast_is_redir(*node)) + ast_free_redir(ast_get_redir(*node)); +} + +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); +} */ +/* +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 void ast_print_dot_recursive(struct ast *node, FILE *out) { if (!node) @@ -12,6 +94,20 @@ static void ast_print_dot_recursive(struct ast *node, FILE *out) switch (node->type) { + case AST_LIST: { + struct ast_list *ast_list = ast_get_list(node); + fprintf(out, " node%p [label=\"LIST\"];\n", (void *)node); + + struct list *elt = ast_list->children; + while (elt != NULL) + { + struct ast *child = (struct ast *)elt->data; + fprintf(out, " node%p -> node%p;\n", (void *)node, (void *)child); + ast_print_dot_recursive(child, out); + elt = elt->next; + } + break; + } case AST_IF: { struct ast_if *if_data = ast_get_if(node); fprintf(out, " node%p [label=\"IF\"];\n", (void *)node); @@ -44,9 +140,9 @@ static void ast_print_dot_recursive(struct ast *node, FILE *out) break; } case AST_CMD: { - struct ast_cmd *cmd_data = ast_get_cmd(node); + struct ast_command *command_data = ast_get_command(node); fprintf(out, " node%p [label=\"", (void *)node); - struct list *l = cmd_data->cmd; + struct list *l = command_data->command; while (l) { fprintf(out, "%s", (char *)l->data); @@ -80,69 +176,4 @@ void ast_print_dot(struct ast *ast) ast_print_dot_recursive(ast, dot_pipe); fprintf(dot_pipe, "}\n"); pclose(dot_pipe); - - system("open ast.svg"); -} - -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); }