/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   main.c                                             :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: mmoussou <mmoussou@student.42angouleme.fr  +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2024/04/24 11:18:04 by adjoly            #+#    #+#             */
/*   Updated: 2024/08/10 13:16:30 by adjoly           ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "minishell.h"
#include "parsing.h"

int	free_end(char *rl, t_env *env_l, int exit_code, bool print)
{
	free(rl);
	rl_clear_history();
	ft_envclear(&env_l, free);
	if (print == true)
		ft_putendl_fd("exit", STDOUT_FILENO);
	return (get_exit_code(exit_code));
}

void	__parse(char *rl, t_env *env_l)
{
	t_list	*token;

	token = tokenizer(rl, env_l);
	if (!token)
		return ;
	exec_split_cmd(token, env_l);
	ft_lstclear(&token, free_cmd);
	return ;
}

char	*__rl(t_env *env_l)
{
	char	*rl;
	char	*prompt;

	signal(SIGINT, &sig_c);
	signal(SIGQUIT, SIG_IGN);
	prompt = get_prompt(env_l);
	rl = readline(prompt);
	free(prompt);
	return (rl);
}

int	main(int ac, char **av, char **env)
{
	char	*rl;
	t_env	*env_l;

	(void)ac;
	get_program_name(av[0]);
	env_l = env_init(env);
	if (!env_l)
		return (EXIT_FAILURE);
	get_env(&env_l);
	get_exit_code(0);
	while (1)
	{
		rl = __rl(env_l);
		if (!rl)
			return (free_end(rl, env_l, -1, true));
		if (run_checks(rl))
		{
			free(rl);
			continue ;
		}
		__parse(rl, env_l);
	}
	return (free_end(rl, env_l, -1, false));
}