This commit is contained in:
mcolonna 2024-06-21 16:06:20 +02:00
parent 92759513e8
commit 1091ddf32f
4 changed files with 29 additions and 18 deletions

View file

@ -1,9 +1,6 @@
- finding commands
- built-in commands
- signals
- ^C, ^D, ^\
- variables
- $?
- uses $PATH in env.variables instead of envp
- builtins:
- echo (with option -n)
@ -17,6 +14,7 @@
- empty variables aren't freed
- need to free value returned by readline
- the builtins should get all arguments and check if they're good
- command `echo "hello` with unclosed quotes
(unnecessary part)
- working history (rl_* functions?)

View file

@ -6,7 +6,7 @@
/* By: jschaft <cecile.schaft@orange.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/24 13:48:00 by jschaft #+# #+# */
/* Updated: 2024/06/13 13:56:21 by mcolonna ### ########.fr */
/* Updated: 2024/06/21 15:57:28 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
@ -118,6 +118,7 @@ int execute_command(t_env *env, t_command command)
t_exec_command_global global;
int r;
r = 0;
global.mc = env->mc_command;
global.nb_calls = 0;
while (command.calls[global.nb_calls].program != NULL)
@ -127,11 +128,11 @@ int execute_command(t_env *env, t_command command)
r = create_pipes(&global, command);
if (r)
return (r);
exec_each_call(&global, command, env->envp);
r = exec_each_call(&global, command, env->envp);
close_all_pipes(&global);
while (wait(NULL) != -1)
;
if (errno != ECHILD)
return (minishell_error("errno"), errno);
return (0);
return (r);
}

View file

@ -6,7 +6,7 @@
/* By: jschaft <cecile.schaft@orange.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/23 14:33:45 by mcolonna #+# #+# */
/* Updated: 2024/06/21 14:44:16 by mcolonna ### ########.fr */
/* Updated: 2024/06/21 15:48:48 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
@ -66,7 +66,7 @@ static void prompt_command(t_env *env)
else
{
add_history(command_str);
do_command(env, command_str);
env->errorstatus = do_command(env, command_str);
}
mem_freeall(env->mc_command);
env->mc_command = NULL;

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/24 13:47:40 by mcolonna #+# #+# */
/* Updated: 2024/06/18 13:41:04 by mcolonna ### ########.fr */
/* Updated: 2024/06/21 15:44:51 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
@ -99,6 +99,7 @@ typedef struct s_parsing_args
bool got_first_call; // already got at least the first program call?
const char *heredoc; // EOF line for heredoc. NULL if no heredoc
t_list *variables; // list of current variables
t_env *env;
} t_parsing_args;
// Skip blank characters
@ -150,17 +151,27 @@ static void read_variable_value(t_parsing_args *args, const char **dest)
const char *value;
const char *tmp;
name = str_dup(fatal_error, args->mc, "");
read_only(args, &name, SYMBOL_CHARS);
if (str_eq(name, ""))
name = NULL;
tmp = NULL;
if (stream_read(&args->stream) == '?')
{
args->r.error = parse_error("variable name expected");
return ;
stream_pop(&args->stream);
value = str_inttostr(fatal_error, args->mc, args->env->errorstatus);
}
else
{
name = str_dup(fatal_error, args->mc, "");
read_only(args, &name, SYMBOL_CHARS);
if (str_eq(name, ""))
{
args->r.error = parse_error("variable name expected");
return ;
}
value = variables_get(args->variables, name);
}
value = variables_get(args->variables, name);
mem_free((char *)name);
tmp = *dest;
*dest = str_join(fatal_error, args->mc, *dest, value);
mem_free((char *)name);
mem_free((char *)tmp);
}
@ -443,7 +454,7 @@ static void read_command(t_parsing_args *args)
// Create a t_parsing_args shared between all the parse_command subfunctions.
// Define every fields but .stream
static t_parsing_args init_parsing_args(const t_memclass mc,
static t_parsing_args init_parsing_args(t_env *env, const t_memclass mc,
t_list *variables)
{
const t_parsing_args r = {
@ -458,6 +469,7 @@ static t_parsing_args init_parsing_args(const t_memclass mc,
.got_first_call = false,
.heredoc = NULL,
.variables = variables,
.env = env,
};
return (r);
@ -473,7 +485,7 @@ t_command parse_command(t_env *env, const char *command)
{
t_parsing_args args;
args = init_parsing_args(env->mc_command, env->variables);
args = init_parsing_args(env, env->mc_command, env->variables);
if (parse_variable_set_command(&args, command, env->variables))
{
args.r.empty = true;