/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* minishell.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: narnaud +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/02 12:14:09 by narnaud #+# #+# */ /* Updated: 2022/05/02 17:43:27 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ # include "minishell.h" t_command *parser(t_token *tok) { int i; t_command *cmd; t_command *ret; cmd = ft_calloc(1, sizeof(t_command)); ret = cmd; while (tok->value) { i = 0; cmd->argv = ft_calloc(count_arguments(tok) + 1, sizeof(char *)); while(tok->type != PIPE) { if (tok->type) update_redir(cmd, tok); else cmd->argv[i++] = tok->value; if (!tok->next) break ; tok = tok->next; } //printf("Input : %d\n", cmd->input); //printf("Output : %d\n", cmd->output); cmd->argv[i] = NULL; if (tok->next) tok = tok->next; else break ; cmd->next = ft_calloc(1, sizeof(t_command)); cmd->next->prev = cmd; cmd = cmd->next; } return (ret); } t_token *lexer(char *line) { t_lexer *lex; char *tmp; int tmp_i; lex = ft_calloc(1, sizeof *ret); lex->state = IN_ROOT; tmp = ft_calloc(1024, sizeof *tmp); tmp_i = 0; while (*line) { if (check_state(lex, &line) == 0) continue; if (lex->state != S_QUOTE_ST && *line == '$') tmp_i = replace_var(&line, tmp, tmp_i); if (check_register(lex, &line, tmp)) { i = 0; ft_bzero(tmp, 1024); continue ; } tmp[tmp_i] = *line; line++; tmp_i++; } create_token(lex, tmp); return (lex->tokens); } int launcher(t_env env) { char *line; int ret; line = readline("$ "); if (line == NULL) halt(EXIT_FAILURE); if (is_empty(line)) return (EXIT_FAILURE); ret = piper(parser(lexer(line))); add_history(line); return (ret); } int main(int argc, char **argv, char**envp) { if (argc < 2) (void)argv; (void)envp; t_env env; while (1) launcher(env); clear_history(); return (EXIT_SUCCESS); }