feat(redirections): ast commands now have a field for the list of redirections + redirections implemented in parser

This commit is contained in:
Matteo Flebus 2026-01-27 21:06:36 +01:00 committed by matteo
parent f1310b7b09
commit 1e4b3fb0a8
3 changed files with 13 additions and 6 deletions

View file

@ -171,6 +171,7 @@ struct ast *parse_command(struct lexer_context *ctx)
struct ast *parse_simple_command(struct lexer_context *ctx) struct ast *parse_simple_command(struct lexer_context *ctx)
{ {
struct list *command_elements = NULL; struct list *command_elements = NULL;
struct list *redirections = NULL; // list of redirection ASTs
// WORD // WORD
struct token *token = POP_TOKEN(); struct token *token = POP_TOKEN();
@ -204,15 +205,15 @@ struct ast *parse_simple_command(struct lexer_context *ctx)
} }
else if (ast_is_redir(element)) else if (ast_is_redir(element))
{ {
// TODO // append redirections to the list of redirections
perror("NOT IMPLEMENTED"); redirections = list_append(redirections, element);
return NULL;
} }
else else
{ {
perror("Internal error: unexpected return value from parse_element " perror("Internal error: unexpected return value from parse_element "
"in parse_simple_command"); "in parse_simple_command");
list_deep_destroy(command_elements); list_deep_destroy(command_elements);
list_deep_destroy(redirections);
return NULL; return NULL;
} }
@ -221,10 +222,11 @@ struct ast *parse_simple_command(struct lexer_context *ctx)
} }
// Result // Result
struct ast *result = ast_create_command(command_elements); struct ast *result = ast_create_command(command_elements, redirections);
if (result == NULL) if (result == NULL)
{ {
list_deep_destroy(command_elements); list_deep_destroy(command_elements);
list_deep_destroy(redirections);
return NULL; return NULL;
} }
return result; return result;

View file

@ -5,13 +5,15 @@
#include "../lists/lists.h" #include "../lists/lists.h"
struct ast *ast_create_command(struct list *command) struct ast *ast_create_command(struct list *command,
struct list *redirections)
{ {
struct ast_command *command_data = malloc(sizeof(struct ast_command)); struct ast_command *command_data = malloc(sizeof(struct ast_command));
if (!command_data) if (!command_data)
return NULL; return NULL;
command_data->command = command; command_data->command = command;
command_data->redirections = redirections;
return ast_create(AST_CMD, command_data); return ast_create(AST_CMD, command_data);
} }
@ -33,5 +35,6 @@ void ast_free_command(struct ast_command *command_data)
if (command_data == NULL) if (command_data == NULL)
return; return;
list_deep_destroy(command_data->command); list_deep_destroy(command_data->command);
ast_list_deep_destroy(command_data->redirections);
free(command_data); free(command_data);
} }

View file

@ -7,6 +7,7 @@
struct ast_command struct ast_command
{ {
struct list *command; // A list of words (char*) struct list *command; // A list of words (char*)
struct ast_list *redirections; // A list of ASTs, all ast_redir
}; };
/** /**
@ -23,7 +24,8 @@ struct ast_command *ast_get_command(struct ast *node);
/** /**
* Creates a new AST node representing a command. * Creates a new AST node representing a command.
*/ */
struct ast *ast_create_command(struct list *command); struct ast *ast_create_command(struct list *command,
struct list *redirections);
/* /*
* @brief: frees the given ast_command and sets the pointer to NULL. * @brief: frees the given ast_command and sets the pointer to NULL.