96 lines
2.6 KiB
C
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);
|
|
}
|