/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* parse.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cchauvet args = tab; return (0); } static int ft_executable_parse(t_data *data, t_cmd *cmd) { bool own; char *path; path = cmd->args[0]; own = 0; if (cmd->args[0] == NULL) { ft_closer(cmd->fd_in); ft_closer(cmd->fd_out); } else if (ft_strcmp(cmd->args[0], "env") == 0 || (ft_strcmp(cmd->args[0], "export") == 0) || (ft_strcmp(cmd->args[0], "echo") == 0) || (ft_strcmp(cmd->args[0], "unset") == 0) || (ft_strcmp(cmd->args[0], "exit") == 0) || (ft_strcmp(cmd->args[0], "pwd") == 0) || (ft_strcmp(cmd->args[0], "cd") == 0)) own = 1; else { path = ft_get_executable(data, cmd->args[0]); if (path == NULL) return (1); } cmd->own_cmd = own; cmd->executable = path; return (0); } int ft_cmd_adder(t_data *data, t_cmd *cmd) { t_list *element; element = ft_lstnew(cmd); if (element == NULL) { ft_cmddel(cmd); return (1); } ft_lstadd_back(data->cmds, element); return (0); } int ft_cmd_parser(t_data *data, char *cmd_str) { t_cmd *cmd; cmd = ft_calloc(sizeof(t_cmd), 1); if (cmd == NULL) { ft_eprintf("minishell: malloc failed\n"); return (1); } ft_redirection(data, cmd, cmd_str); if (ft_args_parse(cmd_str, cmd)) { ft_cmddel(cmd); return (1); } if (ft_executable_parse(data, cmd)) { ft_cmddel(cmd); return (1); } return (ft_cmd_adder(data, cmd)); } int ft_cmds_parser(t_data *data, const char *line) { char **tab; ssize_t i; tab = ft_split_quoted(line, '|'); if (tab == NULL) { ft_eprintf("minishell: malloc failed\n"); return (1); } i = -1; while (tab[++i] != NULL) { if (ft_cmd_parser(data, tab[i])) { ft_freer_tab_ultimate(1, tab); return (1); } } if (*data->cmds != NULL) { ft_add_fd(((t_cmd *)(*data->cmds)->content)->fd_in, 0); ft_add_fd(((t_cmd *)(ft_lstlast(*data->cmds))->content)->fd_out, 1); } ft_freer_tab_ultimate(1, tab); return (0); }