From a926a817daa1e2b424ccaa9f0e735e20cf5615e1 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Tue, 2 Nov 2021 13:38:52 +0100 Subject: [PATCH] parsing et execution partielle de hugo --- Makefile | 1 - file.txt | 15 ---- fille.txt | 17 ---- srcs/parsing/cmd_expansion.c | 28 ------ srcs/parsing/fill_cmd.c | 159 ----------------------------------- srcs/parsing/parsing.c | 60 +++++++------ srcs/shell_loop.c | 137 +++++++++++------------------- 7 files changed, 78 insertions(+), 339 deletions(-) delete mode 100755 file.txt delete mode 100755 fille.txt delete mode 100644 srcs/parsing/cmd_expansion.c delete mode 100644 srcs/parsing/fill_cmd.c diff --git a/Makefile b/Makefile index eddb3c6..b239c10 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,6 @@ SRCS = main.c init.c free.c generic.c \ lexing.c \ parsing.c \ valid_syntax.c valid_pipeline.c valid_command.c valid_io_redirect.c \ - fill_cmd.c cmd_expansion.c \ env.c exit.c echo.c DIR_OBJS = builds diff --git a/file.txt b/file.txt deleted file mode 100755 index 680d3ea..0000000 --- a/file.txt +++ /dev/null @@ -1,15 +0,0 @@ -builds -cat -echo -file.txt -headers -libft -Makefile -minishell -minishell.en.subject.pdf -parsing.txt -README.md -ressources -srcs -tests -valgrind_readline.supp diff --git a/fille.txt b/fille.txt deleted file mode 100755 index 9d5dd50..0000000 --- a/fille.txt +++ /dev/null @@ -1,17 +0,0 @@ -total 1376 -drwxrwxr-x 2 simplonco simplonco 4096 oct. 30 15:32 builds --rw-rw-r-- 1 simplonco simplonco 0 oct. 28 21:00 cat --rw-rw-r-- 1 simplonco simplonco 125 oct. 28 21:00 echo --rwxrwxr-x 1 simplonco simplonco 150 oct. 28 21:03 file.txt --rwx------ 1 simplonco simplonco 0 oct. 30 15:33 fille.txt -drwxrwxr-x 2 simplonco simplonco 4096 oct. 28 21:10 headers -drwxrwxr-x 8 simplonco simplonco 4096 oct. 23 20:48 libft --rw-rw-r-- 1 simplonco simplonco 1412 oct. 29 12:32 Makefile --rwxrwxr-x 1 simplonco simplonco 72256 oct. 30 15:32 minishell --rw-rw-r-- 1 simplonco simplonco 1273353 oct. 7 21:29 minishell.en.subject.pdf --rw-rw-r-- 1 simplonco simplonco 3365 oct. 27 14:47 parsing.txt --rw-rw-r-- 1 simplonco simplonco 15216 oct. 28 21:00 README.md -drwxrwxr-x 2 simplonco simplonco 4096 oct. 28 21:00 ressources -drwxrwxr-x 4 simplonco simplonco 4096 oct. 30 15:32 srcs -drwxrwxr-x 2 simplonco simplonco 4096 oct. 27 14:47 tests --rw-rw-r-- 1 simplonco simplonco 58 oct. 13 17:38 valgrind_readline.supp diff --git a/srcs/parsing/cmd_expansion.c b/srcs/parsing/cmd_expansion.c deleted file mode 100644 index de464db..0000000 --- a/srcs/parsing/cmd_expansion.c +++ /dev/null @@ -1,28 +0,0 @@ - -#include "minishell.h" - -void cmd_expansion(t_cmd **cmd_arr, char **envp) -{ - char **str; - char *var; - int i; - int j; - - (void)envp; - i = 0; - while (cmd_arr[i]) - { - j = 0; - str = cmd_arr[i]->argv; - while (str[j]) - { - var = ft_strchr(str[j], '$'); - if (var != NULL) - { - printf("%s\n", var); - } - j++; - } - i++; - } -} diff --git a/srcs/parsing/fill_cmd.c b/srcs/parsing/fill_cmd.c deleted file mode 100644 index e354814..0000000 --- a/srcs/parsing/fill_cmd.c +++ /dev/null @@ -1,159 +0,0 @@ - -#include "minishell.h" - -int nbr_pipes(t_token *token) -{ - int nb; - - nb = 0; - while (token) - { - if (token->id == T_PIPE) - nb++; - token = token->next; - } - return (nb); -} - -int nbr_argv(t_token *token) -{ - int i; - - i = 0; - while (token && token->id != T_PIPE) - { - token = token->next; - i++; - } - return (i); -} - -//void handle_argv(t_token **token, t_cmd *cmd) -//{ -// int argc; -// int i; -// -// argc = nbr_argv(*token); -// cmd->argv = calloc(argc + 1, sizeof(char *)); -// cmd->argv[argc] = NULL; -// i = 0; -// while (*token && (*token)->id != T_PIPE) -// { -// if ((*token)->id == T_WORD) -// { -// cmd->argv[i] = ft_strdup((*token)->content); -// i++; -// } -// *token = (*token)->next; -// } -// if (*token && (*token)->id == T_PIPE) -// *token = (*token)->next; -//} - -//void handle_fd(t_token *token, t_cmd **cmd) -//{ -// int *pipes_fd; -// -// (*cmd)->fd_out = 1; -// while (token && token->id != T_PIPE) -// { -// // T_LESS : '<', -// if (token->id == T_LESS) -// { -// if ((*cmd)->fd_in != 0) -// close((*cmd)->fd_in); -// (*cmd)->fd_in = open(token->next->content, O_RDONLY | O_CREAT); -// token->id = T_TOKEN; -// token->next->id = T_TOKEN; -// } -// // T_GREAT : '>', -// if (token->id == T_GREAT) -// { -// (*cmd)->fd_out = open(token->next->content, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU); -// token->id = T_TOKEN; -// token->next->id = T_TOKEN; -// } -// // T_DGREAT : '>>' -// if (token->id == T_DGREAT) -// { -// (*cmd)->fd_out = open(token->next->content, O_WRONLY | O_CREAT | O_APPEND, S_IRWXU); -// token->id = T_TOKEN; -// token->next->id = T_TOKEN; -// } -// // T_DLESS : '<<' (heredoc) -// // if (token->id == T_DGREAT) -// // { -// // cmd->fd_out = open(token->next->content, O_WRONLY | O_TMPFILE | O_APPEND, S_IRWXU); -// // token->out = T_TOKEN; -// // token->next->id = T_TOKEN; -// // } -// token = token->next; -// } -// if (token && token->id == T_PIPE) -// { -// pipes_fd = calloc(2, sizeof(int)); -// pipe(pipes_fd); -// if ((*cmd)->fd_out == 1) -// (*cmd)->fd_out = pipes_fd[1]; -// else -// close(pipes_fd[1]); -// cmd[1]->fd_in = pipes_fd[0]; -// } -//} - -//int handle_builtin(t_token *token, t_cmd *cmd) -//{ -// (void)token; -// (void)cmd; -// return (0); -//} -// -//void handle_cmd(char **argv, char **envp) -//{ -// int i; -// char **path; -// char *cmd; -// -// i = 0; -// while (envp[i] && ft_strncmp(envp[i], "PATH=", 5)) -// i++; -// path = ft_split(envp[i] + 5, ':'); // 5 = lentgh of "PATH=" -// i = -1; -// while (*path && i != 0) -// { -// cmd = ft_strjoin(path[0], "/"); -// cmd = ft_strjoin(cmd, argv[0]); -// i = access(cmd, X_OK); -// path++; -// } -// argv[0] = cmd; -//} - -/* -t_cmd **fill_cmd(t_token *token, char **envp) -{ - t_cmd **cmd; - int pipes; - int i; - -// pipes = nbr_pipes(token); -// cmd = ft_calloc(pipes + 2, sizeof(t_cmd*)); -// cmd[pipes + 1] = NULL; -// i = -1; -// while (++i <= pipes) -// { -// cmd[i] = ft_calloc(1, sizeof(t_cmd)); -// ft_bzero(cmd[i], sizeof(t_cmd)); -// } - i = 0; - while (i <= pipes) - { - handle_fd(token, cmd + i); - handle_argv(&token, cmd[i]); - if (!handle_builtin(token, cmd[i])) - handle_cmd(cmd[i]->argv, envp); - i++; - } - return(cmd); -} -*/ diff --git a/srcs/parsing/parsing.c b/srcs/parsing/parsing.c index d961b5a..bbbd9db 100644 --- a/srcs/parsing/parsing.c +++ b/srcs/parsing/parsing.c @@ -1,6 +1,35 @@ #include "minishell.h" +size_t count_pipes(t_token *token); +t_cmd **create_cmd(t_token *token_list, size_t cmd_nbr); +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); + +t_cmd **parsing(t_token *token_list, char **envp) +{ + t_cmd **cmd_arr; + size_t cmd_nbr; + + if (!valid_syntax(token_list)) + return (NULL); + cmd_nbr = count_pipes(token_list); + cmd_arr = create_cmd(token_list, cmd_nbr); +// 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); +} + size_t count_pipes(t_token *token) { size_t nb; @@ -186,12 +215,6 @@ void fd_heredoc(t_token *token, t_cmd *cmd) { (void)token; (void)cmd; - // if (token->id == T_DGREAT) // << - // { - // cmd->fd_out = open(token->next->content, O_WRONLY | O_TMPFILE | O_APPEND, S_IRWXU); - // token->out = T_TOKEN; - // token->next->id = T_TOKEN; - // } } void handle_fd(t_token *token, t_cmd **cmd_arr) @@ -226,31 +249,6 @@ void handle_fd(t_token *token, t_cmd **cmd_arr) } } -t_cmd **parsing(t_token *token_list, char **envp) -{ - t_cmd **cmd_arr; - size_t cmd_nbr; - - if (!valid_syntax(token_list)) - return (NULL); - cmd_nbr = count_pipes(token_list); - cmd_arr = create_cmd(token_list, cmd_nbr); -// cmd_expansion(cmd_arr, envp); - handle_argv(token_list, cmd_arr, cmd_nbr); - handle_path(cmd_arr, envp); - handle_fd(token_list, cmd_arr); - -//int j; -//j = 0; -//while (cmd_arr[j]) -//{ -// printf("%i\n", j); -// print_matrix(cmd_arr[j]->argv, " ; "); -// j++; -//} - - return (cmd_arr); -} /* ------------------------------------------------------- The grammar symbols diff --git a/srcs/shell_loop.c b/srcs/shell_loop.c index 4283afd..f0fb765 100644 --- a/srcs/shell_loop.c +++ b/srcs/shell_loop.c @@ -6,13 +6,60 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/04 05:59:26 by lperrey #+# #+# */ -/* Updated: 2021/10/30 15:32:49 by hulamy ### ########.fr */ +/* Updated: 2021/11/02 13:37:12 by hulamy ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -static char **tokens_list_to_argv(t_token *t); // temp test +void close_fd(t_cmd *cmd); +void execute_cmd(char **envp, t_cmd **cmd_arr); + +void shell_loop(t_all *c) +{ + char *line_input; + + line_input = NULL; + while (1) + { + if (line_input) + free(line_input); + line_input = readline(c->prompt); + if (line_input && *line_input) + { + add_history(line_input); + c->token_list = input_to_tokens(line_input); + c->cmd_arr = parsing(c->token_list, c->envp); + execute_cmd(c->envp, c->cmd_arr); + ft_lstclear((t_list **)&c->token_list, free); + } + } +} + +void wip_test() +{ + char term_desc[2048]; + char *term_type; + int term_width; + int term_height; + int ret; + + term_type = getenv("TERM"); + if (term_type == 0) + ft_putstr_fd("Specify a terminal type with `setenv TERM '.\n", 2); + ret = tgetent(term_desc, term_type); + if (ret < 0) + ft_putstr_fd("Could not access the termcap data base.\n", 2); + if (ret == 0) + ft_putstr_fd("Terminal type `%s' is not defined.\n", 2); + term_height = tgetnum ("li"); + term_width = tgetnum ("co"); + /* Extract information that termcap functions use. */ +/* temp = tgetstr ("pc", BUFFADDR); + PC = temp ? *temp : 0; + BC = tgetstr ("le", BUFFADDR); + UP = tgetstr ("up", BUFFADDR); */ +} void close_fd(t_cmd *cmd) { @@ -49,89 +96,3 @@ void execute_cmd(char **envp, t_cmd **cmd_arr) // waitpid pour la derniere commande (pour '$?') while ((wpid = wait(&status)) > 0); } - -void shell_loop(t_all *c) -{ - char *line_input; - - line_input = NULL; - while (1) - { - if (line_input) - free(line_input); - line_input = readline(c->prompt); - if (line_input && *line_input) - { - add_history(line_input); - c->token_list = input_to_tokens(line_input); - - // EXEC_PIPES_AND_CO() - - // temp placeholder - (void)tokens_list_to_argv; - // if (ft_strncmp(c->token_list->content, "env", 4) == 0) - // builtin_env(0, NULL, c); - // else if (ft_strncmp(c->token_list->content, "exit", 5) == 0) - // builtin_exit(0, NULL, c); - // else if (ft_strncmp(c->token_list->content, "echo", 5) == 0) - // builtin_echo(ft_lstsize((t_list *)c->token_list) + 1, tokens_list_to_argv(c->token_list), c); - // else - // { - - c->cmd_arr = parsing(c->token_list, c->envp); - - if (c->cmd_arr == NULL) - ft_putstr_fd("Syntax KO:\n-----------\n", 1); - // else - // ft_putstr_fd("Syntax OK:\n-----------\n", 1); - // ft_putstr_fd("TOKENS LIST :\n-----------\n", 1); - // ft_lstprint((t_list *)c->token_list, 1); - - execute_cmd(c->envp, c->cmd_arr); - ft_lstclear((t_list **)&c->token_list, free); - // } - } - } -} - -static char **tokens_list_to_argv(t_token *t) // temp test -{ - size_t i; - char **argv; - - i = ft_lstsize((t_list *)t); - argv = ft_calloc(i + 1, sizeof(char*)); - i = 0; - while (t) - { - argv[i] = t->content; - i++; - t = t->next; - } - return (argv); -} - -void wip_test() -{ - char term_desc[2048]; - char *term_type; - int term_width; - int term_height; - int ret; - - term_type = getenv("TERM"); - if (term_type == 0) - ft_putstr_fd("Specify a terminal type with `setenv TERM '.\n", 2); - ret = tgetent(term_desc, term_type); - if (ret < 0) - ft_putstr_fd("Could not access the termcap data base.\n", 2); - if (ret == 0) - ft_putstr_fd("Terminal type `%s' is not defined.\n", 2); - term_height = tgetnum ("li"); - term_width = tgetnum ("co"); - /* Extract information that termcap functions use. */ -/* temp = tgetstr ("pc", BUFFADDR); - PC = temp ? *temp : 0; - BC = tgetstr ("le", BUFFADDR); - UP = tgetstr ("up", BUFFADDR); */ -}