From a5dd924bea37a0786dcf2b95690452f7714043f6 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Mon, 8 Jul 2024 17:30:58 +0200 Subject: [PATCH] Add most of parse_cmd --- src/free_token.c | 4 +- src/parse_cmd.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/parse_cmd.c diff --git a/src/free_token.c b/src/free_token.c index 7be6b0e..083484c 100644 --- a/src/free_token.c +++ b/src/free_token.c @@ -6,7 +6,7 @@ /* By: dkaiser type == STRING_TOKEN) - free(token->content.string); if (token->previous != NULL) token->previous->next = NULL; if (token->next != NULL) diff --git a/src/parse_cmd.c b/src/parse_cmd.c new file mode 100644 index 0000000..981bbbb --- /dev/null +++ b/src/parse_cmd.c @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parse_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser +#include + +static t_redirection **collect_redirs(t_token **tokens); +static t_assign **collect_assigns(t_token **tokens); +static char **collect_args(t_token **tokens); +static t_assign *to_assign(char *str); + +t_node *parse_cmd(t_token *tokens) +{ + char **args; + t_assign **assigns; + t_redirection redirs[2]; + + redirs = collect_redirs(&tokens); + assigns = collect_assigns(&tokens); + args = collect_args(&tokens); + return (new_cmd_node(args, assigns, redirs)); +} + +static t_redirection **collect_redirs(t_token **tokens) +{ + return (NULL); +} + +static t_assign **collect_assigns(t_token **tokens) +{ + int i; + t_assign **result; + + i = 0; + while (ft_strchr(tokens[i]->content.string, '=') != NULL) + { + i++; + } + result = malloc(sizeof(t_assign *) * (i + 1)); + if (result == NULL) + { + // free everything + return (NULL); + } + result[i] = NULL; + i--; + while (i >= 0) + { + result[i] = to_assign(tokens[i]->content.string); + i--; + } + return (result); +} + +static char **collect_args(t_token **tokens) +{ + int i; + char **result; + + i = 0; + while (tokens[i] != NULL) + { + i++; + } + result = malloc(sizeof(char *) * (i + 1)); + if (result == NULL) + { + // free everything in the token + return (NULL); + } + i = 0; + while (tokens[i] != NULL) + { + result[i] = tokens[i]->content.string; + free_token(tokens[i]); + i++; + } + result[i] = NULL; + return (result); +} + +static t_assign *to_assign(char *str) +{ + t_assign *result; + char *split; + + result = malloc(sizeof(t_assign)); + if (result == NULL) + return (NULL); + split = ft_strchr(str, '='); + if (split == NULL) + return (NULL); + *split = '\0'; + result->var = str; + result->value = split + 1; + return (result); +} -- 2.47.2