diff --git a/Makefile b/Makefile index c43bc18..56750a8 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ SRCS = main.c init.c free.c generic.c \ signals.c terminal.c \ shell_loop.c shell_script.c \ lexing.c fill_token.c check_operators.c \ - parsing.c alloc_cmd_array.c \ + parsing.c cmd_array.c \ valid_syntax.c valid_pipeline.c valid_command.c valid_io_redirect.c \ words_expansions.c expand_token.c rejoin_after_expand.c new_token_for_each_field.c \ ft_split_quotes.c ft_strdup_quotes.c \ diff --git a/headers/minishell_prototypes.h b/headers/minishell_prototypes.h index 04f2b62..667b29e 100644 --- a/headers/minishell_prototypes.h +++ b/headers/minishell_prototypes.h @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/08 02:59:58 by lperrey #+# #+# */ -/* Updated: 2021/11/14 10:12:30 by lperrey ### ########.fr */ +/* Updated: 2021/11/14 12:23:38 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,11 +33,12 @@ t_cmd **parsing(t_token *token_list); int valid_syntax(t_token *token_list); int valid_token(t_token **token_list, enum e_token_id token_id); int valid_command_separator(const t_token *token_list); -size_t count_pipes(t_token *token); -t_cmd **alloc_cmd_array(size_t cmd_nbr); +size_t count_pipes(t_token *token_list); +t_cmd **cmd_array_alloc(size_t cmd_nbr); +int cmd_array_fill_argv(t_token *token_list, t_cmd **cmd_arr); int words_expansions(t_token *token_list); int token_expansions(t_token **t); -int redirections(t_token *t, t_cmd **cmd_arr); +int redirections(t_token *token_list, t_cmd **cmd_arr); // Builtins int builtin_env(int argc, char *argv[], t_all *c); diff --git a/srcs/parsing/alloc_cmd_array.c b/srcs/parsing/cmd_array.c similarity index 52% rename from srcs/parsing/alloc_cmd_array.c rename to srcs/parsing/cmd_array.c index b5b3c45..b57386c 100644 --- a/srcs/parsing/alloc_cmd_array.c +++ b/srcs/parsing/cmd_array.c @@ -1,39 +1,41 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* alloc_cmd_array.c :+: :+: :+: */ +/* cmd_array.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/11/02 22:46:23 by lperrey #+# #+# */ -/* Updated: 2021/11/11 08:47:46 by lperrey ### ########.fr */ +/* Updated: 2021/11/14 12:24:39 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -size_t count_pipes(t_token *token) +static size_t cmd_words_count(t_token *t); + +size_t count_pipes(t_token *t) { size_t count; count = 0; - while (token) + while (t) { - if (token->id == T_PIPE) + if (t->id == T_PIPE) count++; - token = token->next; + t = t->next; } return (count); } -t_cmd **alloc_cmd_array(size_t cmd_nbr) +t_cmd **cmd_array_alloc(size_t cmd_nbr) { t_cmd **cmd_arr; size_t i; cmd_arr = ft_calloc(cmd_nbr + 1, sizeof (void *)); if (!cmd_arr) - return (ft_retp_perror(NULL, "alloc_cmd()")); + return (ft_retp_perror(NULL, "cmd_array_alloc()")); i = 0; while (i < cmd_nbr) { @@ -41,7 +43,7 @@ t_cmd **alloc_cmd_array(size_t cmd_nbr) if (!cmd_arr[i]) { ft_free_2d_arr(cmd_arr); - return (ft_retp_perror(NULL, "alloc_cmd()")); + return (ft_retp_perror(NULL, "cmd_array_alloc()")); } cmd_arr[i]->fd_in = STDIN_FILENO; cmd_arr[i]->fd_out = STDOUT_FILENO; @@ -49,3 +51,45 @@ t_cmd **alloc_cmd_array(size_t cmd_nbr) } return (cmd_arr); } + +int cmd_array_fill_argv(t_token *t, t_cmd **cmd_arr) +{ + size_t i; + size_t arg_i; + + i = 0; + while (cmd_arr[i]) + { + cmd_arr[i]->argv = ft_calloc(cmd_words_count(t) + 1, sizeof (char *)); + if (!cmd_arr[i]->argv) + return (ft_reti_perror(0, "cmd_array_fill_argv()")); + arg_i = 0; + while (t && t->id != '|') + { + if (t->id == T_WORD) + { + cmd_arr[i]->argv[arg_i++] = t->content; + t->content = NULL; + } + t = t->next; + } + if (t && t->id == '|') + t = t->next; + i++; + } + return (1); +} + +static size_t cmd_words_count(t_token *t) +{ + size_t count; + + count = 0; + while (t && t->id != '|') + { + if (t->id == T_WORD) + count++; + t = t->next; + } + return (count); +} diff --git a/srcs/parsing/parsing.c b/srcs/parsing/parsing.c index 0b3da2d..d97c3ce 100644 --- a/srcs/parsing/parsing.c +++ b/srcs/parsing/parsing.c @@ -6,23 +6,17 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/24 10:52:40 by lperrey #+# #+# */ -/* Updated: 2021/11/14 11:00:39 by lperrey ### ########.fr */ +/* Updated: 2021/11/14 12:53:40 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" // HUGO WIP -void handle_argv(t_token *token, t_cmd **cmd, size_t cmd_nbr); void handle_path(t_cmd **cmd_arr, char **envp); -void handle_fd(t_token *token, t_cmd **cmd_arr); -void fd_heredoc(t_token *token, t_cmd *cmd); -void fd_redirection(t_token *token, t_cmd *cmd); void find_path(char **argv, char **envp); int handle_builtin(t_cmd *cmd); int fill_builtin(t_cmd *cmd, int (*builtin)(int, char **, t_all *)); -int next_cmd(t_token *token); -int is_redirection(enum e_token_id id); // HUGO WIP void save_redirections_words(t_token *t) @@ -38,6 +32,21 @@ void save_redirections_words(t_token *t) t = t->next; } } +void print_cmd_array(t_cmd **cmd_arr) +{ + int i; + + i = 0; + while (cmd_arr[i]) + { + printf("CMD %i, fd_in=%i, fd_out=%i\n", i, cmd_arr[i]->fd_in, cmd_arr[i]->fd_out); + ft_putstr_fd(" |", 1); + print_matrix(cmd_arr[i]->argv, "|\n |"); + i++; + if (cmd_arr[i]) + ft_putstr_fd("----------------\n", 1); + } +} t_cmd **parsing(t_token *token_list) { @@ -51,8 +60,8 @@ t_cmd **parsing(t_token *token_list) // 2.9.1 - 2) Expansion // TEST TOKENS PRINT - ft_putstr_fd("TOKENS LIST :\n-----------\n", 1); - ft_lstprint((t_list *)token_list, 1); + //ft_putstr_fd("TOKENS LIST :\n-----------\n", 1); + //ft_lstprint((t_list *)token_list, 1); // // getenv() ne va pas fonctionner avec le changement d'environnement prévu jusqu'ici. // TODO : Revoir le changement d'environnement (avec extern char **environ ?) @@ -60,11 +69,11 @@ t_cmd **parsing(t_token *token_list) if (!words_expansions(token_list)) return (NULL); // - ft_putstr_fd("TOKENS LIST EXPANDED :\n-----------\n", 1); - ft_lstprint((t_list *)token_list, 1); + //ft_putstr_fd("TOKENS LIST EXPANDED :\n-----------\n", 1); + //ft_lstprint((t_list *)token_list, 1); // Struct CMD alloc - cmd_arr = alloc_cmd_array(1 + count_pipes(token_list)); + cmd_arr = cmd_array_alloc(1 + count_pipes(token_list)); if (!cmd_arr) return (NULL); @@ -73,12 +82,12 @@ t_cmd **parsing(t_token *token_list) return (ft_retp_free(NULL, cmd_arr, (void(*)(void *))ft_free_cmd_arr)); // Struct CMD fill - + if (!cmd_array_fill_argv(token_list, cmd_arr)) + return (ft_retp_free(NULL, cmd_arr, (void(*)(void *))ft_free_cmd_arr)); + print_cmd_array(cmd_arr); + // HUGO WIP -// cmd_expansion(cmd_arr, envp); -// handle_argv(token_list, cmd_arr, cmd_nbr); // handle_path(cmd_arr, envp); -// handle_fd(token_list, cmd_arr); return (cmd_arr); }