42_minishell/src/main.c
2024-06-21 16:06:20 +02:00

96 lines
2.6 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* main.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jschaft <cecile.schaft@orange.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/23 14:33:45 by mcolonna #+# #+# */
/* Updated: 2024/06/21 15:48:48 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
#include "include.h"
static t_list variables_from_envp(t_env env, char *const envp[])
{
t_list r;
char **splitted;
t_variable *var;
int i;
r = list_createempty(env.mc_global);
i = 0;
while (envp[i])
{
splitted = str_split(fatal_error, env.mc_global, envp[i], "=");
var = mem_alloc(fatal_error, env.mc_global, sizeof(t_variable));
var->name = splitted[0];
var->value = splitted[1];
list_add(fatal_error, &r, var);
i++;
}
return (r);
}
// Execute a command from a string.
static int do_command(t_env *env, const char *str)
{
t_command command;
int r;
command = parse_command(env, str);
if (command.error || command.empty)
return (command.error);
r = execute_command(env, command);
return (r);
}
static void start(t_env *env)
{
env->mc_command = mem_subclass(fatal_error, env->mc_global);
do_command(env, "cat ./header");
do_command(env, "echo");
mem_freeall(env->mc_command);
env->mc_command = NULL;
}
static void prompt_command(t_env *env)
{
const char *command_str;
env->mc_command = mem_subclass(fatal_error, env->mc_global);
command_str = ask_command(env);
if (!command_str)
env->exit = true;
else
{
add_history(command_str);
env->errorstatus = do_command(env, command_str);
}
mem_freeall(env->mc_command);
env->mc_command = NULL;
}
int main(const int argc, const char *argv[], char *const envp[])
{
t_env env;
t_list variables;
(void)argc;
(void)argv;
env.exit = false;
env.mc_global = mem_newclass(fatal_error);
set_global_mc(env.mc_global);
env.mc_command = NULL;
env.errorstatus = 0;
env.envp = envp;
variables = variables_from_envp(env, envp);
env.variables = &variables;
handle_signals();
start(&env);
while (!env.exit)
prompt_command(&env);
mem_freeall(env.mc_global);
return (env.errorstatus);
}