From 50ce870e5dc74279d9747413441fe4dd705a1f96 Mon Sep 17 00:00:00 2001 From: Loic Deridder Date: Mon, 17 Feb 2025 15:38:21 +0100 Subject: [PATCH] expander et signal --- srcs/execution/exec.c | 2 ++ srcs/execution/exec_subsh.c | 2 ++ srcs/expander/expand_var.c | 28 ++++++++++++++++++++++++++++ srcs/main.c | 21 +++++++++++++++++---- 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/srcs/execution/exec.c b/srcs/execution/exec.c index 79403d5..6adb188 100644 --- a/srcs/execution/exec.c +++ b/srcs/execution/exec.c @@ -43,5 +43,7 @@ int execute_command(t_ast_n *node) node->msh->ex_code = exec_subsh(node->left); if (node->state == _CMD) reset_redir(node); + if (node->state == _CMD) + set_var_env("_", node->args[count_args(node->args) - 1], node->msh); return (node->msh->ex_code); } diff --git a/srcs/execution/exec_subsh.c b/srcs/execution/exec_subsh.c index eb7f721..b881d66 100644 --- a/srcs/execution/exec_subsh.c +++ b/srcs/execution/exec_subsh.c @@ -67,6 +67,8 @@ int execute_shcommand(t_ast_n *node) node->msh->ex_code = exec_subsh(node->left); if (node->state == _CMD) reset_redir(node); + if (node->state == _CMD) + set_var_env("_", node->args[count_args(node->args) - 1], node->msh); return (node->msh->ex_code); } diff --git a/srcs/expander/expand_var.c b/srcs/expander/expand_var.c index 3ced7d1..5ffb482 100644 --- a/srcs/expander/expand_var.c +++ b/srcs/expander/expand_var.c @@ -47,6 +47,32 @@ static char *extract_env(char *str, char **envp) return (var); } +int expand_exit(t_ast_n *node, int j, int i) +{ + int k; + char *new; + char *ret; + int len; + + k = -1; + if (node->args[j][i + 1] && node->args[j][i + 1] == '?') + { + len = ft_strlen(ft_itoa(node->msh->ex_code)); + new = ft_calloc(ft_strlen(node->args[j]) + len + 1, 1); + if (!new) + return (0); + ret = new; + while (++k < i) + *new++ = node->args[j][k]; + ft_strlcat(new, ft_itoa(node->msh->ex_code), -1); + ft_strlcat(new, &node->args[j][i + 2], -1); + ft_free(&node->args[j]); + node->args[j] = ret; + return (1); + } + return (0); +} + void expander_var(t_ast_n *nd, int j, int i) { char *new; @@ -56,6 +82,8 @@ void expander_var(t_ast_n *nd, int j, int i) int l; k = i; + if (expand_exit(nd, j , i)) + return ; new = ft_calloc(ft_strlen(nd->args[j]) + get_var_len(nd, j, &k), 1); if (!new) return ; diff --git a/srcs/main.c b/srcs/main.c index 6750cef..874fbda 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -13,7 +13,9 @@ #include "../includes/minishell.h" #include #include +#include #include +#include int g_sig = 0; @@ -36,10 +38,21 @@ static void add_prevhistory(t_msh *msh) void handle_sigint(int sig) { (void)sig; - write(2, "\n\n", 2); - rl_on_new_line(); - rl_replace_line("", 0); - rl_redisplay(); + int status; + pid_t pid; + + pid = waitpid(-1, &status, 0); + if (pid > 0 && (WIFSIGNALED(status) && WTERMSIG(status) == SIGINT)) + { + write(2, "\n", 2); + } + else + { + write(2, "\n\n", 2); + rl_on_new_line(); + rl_replace_line("", 0); + rl_redisplay(); + } g_sig = sig; }