#include "./parse_private.h" static int ft_args_parse(char *cmd_str, t_cmd *cmd) { char **tab; size_t i; tab = ft_split_quoted(cmd_str, ' '); if (tab == NULL) return (1); i = 0; while (tab[i] != NULL) { ft_quote_remover(tab[i]); i++; } cmd->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) own = 1; else if (ft_strcmp(cmd->args[0], "export") == 0) own = 1; else if (ft_strcmp(cmd->args[0], "echo") == 0) own = 1; else if (ft_strcmp(cmd->args[0], "unset") == 0) own = 1; else if (ft_strcmp(cmd->args[0], "exit") == 0) own = 1; else if (ft_strcmp(cmd->args[0], "pwd") == 0) own = 1; else if (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_parser(t_data *data, char *cmd_str) { t_cmd *cmd; t_list *element; cmd = ft_calloc(sizeof(t_cmd), 1); if (cmd == NULL) { ft_eprintf("minishell: malloc failed\n"); return (1); } if (ft_redirection(data, cmd, cmd_str)) { ft_cmddel(cmd); return (0); } if (ft_args_parse(cmd_str, cmd)) { ft_cmddel(cmd); return (1); } if (ft_executable_parse(data, cmd)) { ft_cmddel(cmd); return (1); } element = ft_lstnew(cmd); if (element == NULL) { ft_cmddel(cmd); return (1); } ft_lstadd_back(data->cmds, element); return (0); } int ft_cmds_parser(t_data *data, const char *line) { char **tab; size_t i; tab = ft_split_quoted(line, '|'); if (tab == NULL) { ft_freer_tab_ultimate(1, tab); ft_eprintf("minishell: malloc failed\n"); return (1); } i = 0; while (tab[i] != NULL) { if (ft_cmd_parser(data, tab[i])) { ft_freer_tab_ultimate(1, tab); return (1); } i++; } if (*data->cmds != NULL) { if (((t_cmd *) (*data->cmds)->content)->fd_in[0] == -1) ((t_cmd *) (*data->cmds)->content)->fd_in[0] = 0; if (((t_cmd *) (ft_lstlast(*data->cmds))->content)->fd_out[0] == -1) (((t_cmd *) (ft_lstlast(*data->cmds))->content)->fd_out[0] = 1); } ft_freer_tab_ultimate(1, tab); return (0); }