feat: all merged

This commit is contained in:
Matteo Flebus 2026-01-22 12:05:01 +01:00
commit 8f5733be19
5 changed files with 98 additions and 1 deletions

1
.gitignore vendored
View file

@ -177,3 +177,4 @@ m4/ltversion.m4
m4/lt~obsolete.m4 m4/lt~obsolete.m4
Makefile Makefile
*.svg

View file

@ -76,6 +76,14 @@ int main(int argc, char **argv)
// Retrieve and build first AST // Retrieve and build first AST
struct ast *command_ast = get_ast(ctx); struct ast *command_ast = get_ast(ctx);
if (options.pretty_print)
{
ast_print_dot(command_ast);
}
// Call the executor with the AST
return_code = execution(command_ast);
// Main parse-execute loop // Main parse-execute loop
while (command_ast != NULL && command_ast->type != AST_END) while (command_ast != NULL && command_ast->type != AST_END)
{ {

View file

@ -1,6 +1,89 @@
#define _POSIX_C_SOURCE 12344
#include "ast.h" #include "ast.h"
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
static void ast_print_dot_recursive(struct ast *node, FILE *out)
{
if (!node)
return;
switch (node->type)
{
case AST_IF: {
struct ast_if *if_data = ast_get_if(node);
fprintf(out, " node%p [label=\"IF\"];\n", (void *)node);
if (if_data->condition)
{
fprintf(out, " node%p -> node%p;\n", (void *)node,
(void *)if_data->condition);
fprintf(out,
" node%p [fillcolor=\"lightyellow\", style=\"filled\"];\n",
(void *)if_data->condition);
ast_print_dot_recursive(if_data->condition, out);
if (if_data->then_clause)
{
fprintf(out, " node%p -> node%p [label=\"true\"];\n",
(void *)if_data->condition,
(void *)if_data->then_clause);
ast_print_dot_recursive(if_data->then_clause, out);
}
if (if_data->else_clause)
{
fprintf(out, " node%p -> node%p [label=\"false\"];\n",
(void *)if_data->condition,
(void *)if_data->else_clause);
ast_print_dot_recursive(if_data->else_clause, out);
}
}
break;
}
case AST_CMD: {
struct ast_command *command_data = ast_get_command(node);
fprintf(out, " node%p [label=\"", (void *)node);
struct list *l = command_data->command;
while (l)
{
fprintf(out, "%s", (char *)l->data);
if (l->next)
fprintf(out, " ");
l = l->next;
}
fprintf(out, "\"];\n");
break;
}
case AST_END:
fprintf(out, " node%p [label=\"END\"];\n", (void *)node);
break;
default:
break;
}
}
void ast_print_dot(struct ast *ast)
{
if (!ast)
return;
FILE *dot_pipe = popen("dot -Tsvg -o ast.svg", "w");
if (!dot_pipe)
{
return;
}
fprintf(dot_pipe, "digraph AST {\n");
ast_print_dot_recursive(ast, dot_pipe);
fprintf(dot_pipe, "}\n");
pclose(dot_pipe);
system("open ast.svg");
}
void ast_free(struct ast **node) void ast_free(struct ast **node)
{ {

View file

@ -10,4 +10,9 @@
#include "ast_redir.h" #include "ast_redir.h"
#include "ast_void.h" #include "ast_void.h"
/**
* Prints the Graphviz DOT representation of the given AST to stdout.
*/
void ast_print_dot(struct ast *ast);
#endif /* ! AST_H */ #endif /* ! AST_H */