#include "./parse_private.h" int ft_args_parse(t_data *data, char *cmd_str, t_cmd *cmd) { char **tab; char *str; size_t i; tab = ft_split_quoted(cmd_str, ' '); if (tab == NULL) return (1); i = 0; while (tab[i] != NULL) { str = ft_env_filler(data, tab[i]); if (str == NULL) { ft_freer_tab_ultimate(1, tab); return (1); } ft_quote_remover(str); free(tab[i]); tab[i] = str; i++; } cmd->args = tab; return (0); } 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->env, cmd->args[0]); cmd->own_cmd = own; cmd->executable = path; return (own); } 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 (1); } if (ft_args_parse(data, cmd_str, cmd)) { ft_cmddel(cmd); return (1); } ft_executable_parse(data, cmd); 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 (((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); }