/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* minishell.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: narnaud +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/02 12:14:09 by narnaud #+# #+# */ /* Updated: 2022/05/03 10:39:02 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ # include "minishell.h" t_command *parser(t_token *tok, t_command *prev) { int i; t_command *cmd; if (!tok) return (NULL); cmd = ft_calloc(1, sizeof(t_command)); if (prev) cmd->prev = prev; i = 0; cmd->argv = ft_calloc(count_arguments(tok) + 1, sizeof(char *)); while(tok && tok->type != PIPE) { if (tok->type) update_redir(cmd, tok); else cmd->argv[i++] = tok->value; if (DEBUG) printf("token : %s, type: %d\n", tok->value, tok->type); tok = tok->next; } cmd->argv[i] = NULL; if (tok && tok->type == PIPE) cmd->next = parser(tok->next, cmd); return (cmd); } t_token *lexer(char *line) { t_lexer *lex; char *tmp; int tmp_i; lex = ft_calloc(1, sizeof *lex); lex->state = ROOT_ST; tmp = ft_calloc(1024, sizeof *tmp); tmp_i = 0; while (*line) { if (DEBUG) printf("%c\n", *line); if (check_state(lex, &line)) continue; if (lex->state != S_QUOTE_ST && *line == '$') tmp_i = replace_var(&line, tmp, tmp_i); if (check_register(lex, &line, tmp)) { 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; (void)env; // TODO: handle ret line = readline("$ "); if (line == NULL) halt(EXIT_FAILURE); if (is_empty(line)) return (EXIT_FAILURE); parser(lexer(line), NULL); add_history(line); return (0); } int main(int argc, char **argv, char**envp) { if (argc < 2) (void)argv; (void)envp; t_env env; env.null = 0; while (1) launcher(env); clear_history(); return (EXIT_SUCCESS); }