feat(redirections): ast commands now have a field for the list of redirections + redirections implemented in parser
This commit is contained in:
parent
f1310b7b09
commit
1e4b3fb0a8
3 changed files with 13 additions and 6 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue