diff --git a/42sh/Makefile b/42sh/Makefile index 008572f3..2af77340 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -65,38 +65,37 @@ exec/exec_ampersand.c\ exec/exec_and_if.c\ exec/exec_case_branch.c\ exec/exec_command.c\ -exec/exec_default.c\ exec/exec_elif.c\ exec/exec_else.c\ -exec/exec_func.c\ exec/exec_leaf.c\ exec/exec_math.c\ exec/exec_or_if.c\ exec/exec_pipe.c\ exec/exec_semi.c\ -exec/exec_until.c\ exec/exec_var.c\ exec/fd_is_valid.c\ exec/ft_exec.c\ exec/ft_findexec.c\ +exec/is_function.c\ exec/launch_builtin.c\ exec/launch_case.c\ exec/launch_file.c\ exec/launch_for.c\ +exec/launch_function.c\ exec/launch_if.c\ exec/launch_process.c\ exec/launch_subshell.c\ exec/launch_until.c\ exec/launch_while.c\ exec/mark_process_status.c\ +exec/node_copy.c\ exec/process_redirect.c\ exec/process_reset.c\ exec/process_setexec.c\ exec/process_setgroup.c\ exec/process_setsig.c\ -exec/redir_free.c\ exec/redir_copy.c\ -exec/node_copy.c\ +exec/redir_free.c\ exec/redirect_dgreat.c\ exec/redirect_dless.c\ exec/redirect_great.c\ diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index ea85b168..372c4ef0 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */ -/* Updated: 2017/03/08 03:05:38 by ariard ### ########.fr */ +/* Updated: 2017/03/08 03:25:53 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -74,6 +74,7 @@ union u_process_data { struct s_data_cmd cmd; struct s_data_subshell subshell; + struct s_data_subshell function; struct s_data_cond d_while; struct s_data_cond d_until; struct s_data_cond d_if; @@ -130,31 +131,6 @@ extern t_itof g_execmap[]; extern t_itof g_redirmap[]; extern t_itof g_launchmap[]; -int ft_exec(t_btree **ast); - -int exec_default(t_btree **ast); - -int exec_semi(t_btree **ast); -int exec_ampersand(t_btree **ast); -int exec_or_if(t_btree **ast); -int exec_and_if(t_btree **ast); -int exec_pipe(t_btree **ast); -/* int exec_redir(t_btree **ast); */ -//int exec_cmd(t_btree **ast); -int exec_leaf(t_btree **ast); - -//int exec_while(t_btree **ast); -//int exec_if(t_btree **ast); -int exec_elif(t_btree **ast); -int exec_else(t_btree **ast); -//int exec_until(t_btree **ast); -//int exec_default(t_btree **ast); -int exec_var(t_btree **ast); -//int exec_for(t_btree **ast); -//int exec_case(t_btree **ast); -int exec_case_branch(t_btree **ast); -int exec_math(t_btree **ast); - int process_setexec(t_process *p); int process_setgroup(t_process *p, pid_t pid); void process_setsig(void); @@ -186,6 +162,7 @@ char **token_to_argv(t_ld *ld, int do_match); int add_new_job(t_job *job); int error_badidentifier(char *name); +t_btree *is_function(t_process *p); /* ** Mapping pour free les process @@ -208,6 +185,7 @@ int launch_case(t_process *p); int launch_file(t_process *p); int launch_builtin(t_process *p); int launch_subshell(t_process *p); +int launch_function(t_process *p); /* ** Mapping pour set les process @@ -222,4 +200,20 @@ int set_process_for(t_process *p, t_btree *ast, t_cmd *cmd); int set_process_case(t_process *p, t_btree *ast, t_cmd *cmd); int set_process_subshell(t_process *p, t_btree *ast, t_cmd *cmd); +/* +** Mapping pour exec les process +*/ +int ft_exec(t_btree **ast); +int exec_leaf(t_btree **ast); +int exec_semi(t_btree **ast); +int exec_ampersand(t_btree **ast); +int exec_or_if(t_btree **ast); +int exec_and_if(t_btree **ast); +int exec_pipe(t_btree **ast); +int exec_elif(t_btree **ast); +int exec_else(t_btree **ast); +int exec_var(t_btree **ast); +int exec_case_branch(t_btree **ast); +int exec_math(t_btree **ast); + #endif diff --git a/42sh/libft b/42sh/libft index 4a36b1a5..73c28532 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit 4a36b1a5e650ada2f66034d13312367694a6481a +Subproject commit 73c28532404e437d670607c909fbe56d717e9683 diff --git a/42sh/src/exec/exec_default.c b/42sh/src/exec/exec_default.c deleted file mode 100644 index 796a10a7..00000000 --- a/42sh/src/exec/exec_default.c +++ /dev/null @@ -1,21 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* exec_default.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: ariard +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/31 19:29:59 by ariard #+# #+# */ -/* Updated: 2017/02/05 22:18:50 by ariard ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -int exec_default(t_btree **ast) -{ - - (void)ast; -// btree_delone(ast, &ast_free); - return (0); -} diff --git a/42sh/src/exec/exec_func.c b/42sh/src/exec/exec_func.c deleted file mode 100644 index 7255d850..00000000 --- a/42sh/src/exec/exec_func.c +++ /dev/null @@ -1,15 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* exec_while.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: ariard +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/30 17:33:53 by ariard #+# #+# */ -/* Updated: 2017/02/06 22:05:35 by ariard ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - - diff --git a/42sh/src/exec/exec_leaf.c b/42sh/src/exec/exec_leaf.c index 9a0ae4fd..2fafa04c 100644 --- a/42sh/src/exec/exec_leaf.c +++ b/42sh/src/exec/exec_leaf.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/07 15:47:30 by wescande #+# #+# */ -/* Updated: 2017/03/07 21:30:29 by wescande ### ########.fr */ +/* Updated: 2017/03/08 03:25:23 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,11 +17,9 @@ int exec_leaf(t_btree **ast) t_process p; t_job *job; - DG("in exec leaf"); job = &data_singleton()->exec.job; if (set_process(&p, *ast)) return (1); - DG("set_process done"); if (!(launch_process(&p))) { job_addprocess(&p); diff --git a/42sh/src/exec/exec_until.c b/42sh/src/exec/exec_until.c deleted file mode 100644 index a26563e9..00000000 --- a/42sh/src/exec/exec_until.c +++ /dev/null @@ -1,26 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* exec_until.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: ariard +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/06 20:42:20 by ariard #+# #+# */ -/* Updated: 2017/03/08 02:09:21 by ariard ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -int exec_until(t_btree **ast) -{ - ft_exec(&(*ast)->left); - while (ft_strcmp(ft_getenv(data_singleton()->env, "?"), "1") == 0) - { - DG("before right"); - ft_exec(&(*ast)->right); - DG("before left"); - ft_exec(&(*ast)->left); - } - return (0); -} diff --git a/42sh/src/exec/ft_exec.c b/42sh/src/exec/ft_exec.c index 87b37ab5..c3cb73dc 100644 --- a/42sh/src/exec/ft_exec.c +++ b/42sh/src/exec/ft_exec.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */ -/* Updated: 2017/03/08 01:48:55 by ariard ### ########.fr */ +/* Updated: 2017/03/08 03:34:10 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,7 +44,6 @@ int ft_exec(t_btree **ast) if (!*ast) return (0); item = (*ast)->item; - DG("COMPARE : %d vs %d (SUBSHEELLL)", item->type, SUBSHELL); while (g_execmap[i].id) { if (item->type == g_execmap[i].id) diff --git a/42sh/src/exec/is_function.c b/42sh/src/exec/is_function.c index 227acb3c..36bdcd5a 100644 --- a/42sh/src/exec/is_function.c +++ b/42sh/src/exec/is_function.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/08 02:45:15 by wescande #+# #+# */ -/* Updated: 2017/03/08 03:10:25 by wescande ### ########.fr */ +/* Updated: 2017/03/08 03:22:34 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ t_btree *is_function(t_process *p) while (tmp) { if (!ft_strcmp(((t_astnode *)tmp->content)->data.str, p->data.cmd.av[0])) - btree_map(p->data.subshell.content, node_copy); + return (btree_map(p->data.subshell.content, node_copy)); tmp = tmp->next; } return (NULL); diff --git a/42sh/src/exec/launch_function.c b/42sh/src/exec/launch_function.c new file mode 100644 index 00000000..cd5c08d4 --- /dev/null +++ b/42sh/src/exec/launch_function.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 03:23:59 by wescande #+# #+# */ +/* Updated: 2017/03/08 03:24:53 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int do_function(t_process *p) +{ + ft_exec(&p->data.function.content); + return (ft_atoi(ft_getenv(data_singleton()->env, "?"))); +} + +int launch_function(t_process *p) +{ + pid_t pid; + + if (SH_IS_INTERACTIVE(data_singleton()->opts)) + { + pid = fork(); + if (pid == 0) + { + data_singleton()->opts &= ~SH_INTERACTIVE; + data_singleton()->opts &= ~SH_OPTS_JOBC; + exit(do_function(p)); + } + else if (pid > 0) + return (pid); + } + else + do_function(p); + return (0); +} diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index 72f080fd..080c92e1 100644 --- a/42sh/src/exec/launch_process.c +++ b/42sh/src/exec/launch_process.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */ -/* Updated: 2017/03/08 00:11:15 by wescande ### ########.fr */ +/* Updated: 2017/03/08 03:23:16 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ t_itof g_launchmap[] = { - {PROCESS_FUNCTION, NULL}, + {PROCESS_FUNCTION, launch_function}, {PROCESS_BUILTIN, launch_builtin}, {PROCESS_FILE, launch_file}, {PROCESS_SUBSHELL, launch_subshell}, diff --git a/42sh/src/exec/node_copy.c b/42sh/src/exec/node_copy.c index 23c4fd13..790102fd 100644 --- a/42sh/src/exec/node_copy.c +++ b/42sh/src/exec/node_copy.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ast_copy.c :+: :+: :+: */ +/* node_copy.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2017/03/07 20:44:42 by wescande #+# #+# */ -/* Updated: 2017/03/08 01:00:05 by ariard ### ########.fr */ +/* Created: 2017/03/08 03:38:36 by wescande #+# #+# */ +/* Updated: 2017/03/08 04:40:50 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,13 +20,13 @@ void *node_copy(void *data) if (!data) return (NULL); old = data; - ft_bzero((void *)&new, sizeof(t_astdata)); + new = (t_astnode *)ft_memalloc(sizeof(t_astnode)); new->nest = old->nest; new->full = old->full; new->type = old->type; new->pattern = old->pattern; if (old->type == CMD || old->type == TK_ASSIGNEMENT_WORD) - { + { new->data.cmd.redir = ft_lstdup(&old->data.cmd.redir, &redir_copy); new->data.cmd.token = ft_ld_copy(old->data.cmd.token, &tab_esc_copy); } diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c index 5f27ecf0..08964e53 100644 --- a/42sh/src/exec/process_setexec.c +++ b/42sh/src/exec/process_setexec.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:07:10 by jhalford #+# #+# */ -/* Updated: 2017/03/08 03:08:30 by wescande ### ########.fr */ +/* Updated: 2017/03/08 03:32:49 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,10 +14,14 @@ int process_setexec(t_process *p) { + t_btree *func; p->data.cmd.path = NULL; p->data.cmd.execf = NULL; - if ((p->data.subshell.content = is_function(p))) + if ((func = is_function(p))) + { + p->data.subshell.content = func; p->type = PROCESS_FUNCTION; + } else if ((p->data.cmd.execf = is_builtin(p))) p->type = PROCESS_BUILTIN; else if (ft_strchr(p->data.cmd.av[0], '/')) diff --git a/42sh/src/job-control/process_free.c b/42sh/src/job-control/process_free.c index 23471c08..6cb3f743 100644 --- a/42sh/src/job-control/process_free.c +++ b/42sh/src/job-control/process_free.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 12:41:11 by jhalford #+# #+# */ -/* Updated: 2017/03/08 03:07:01 by ariard ### ########.fr */ +/* Updated: 2017/03/08 03:26:28 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ t_itof g_freemap[] = { - {PROCESS_FUNCTION, NULL}, + {PROCESS_FUNCTION, process_free_subshell}, {PROCESS_BUILTIN, NULL}, {PROCESS_FILE, process_free_cmd}, {PROCESS_SUBSHELL, process_free_subshell}, diff --git a/42sh/src/parser/add_func.c b/42sh/src/parser/add_func.c index 66041625..e417bcbf 100644 --- a/42sh/src/parser/add_func.c +++ b/42sh/src/parser/add_func.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/24 23:43:07 by ariard #+# #+# */ -/* Updated: 2017/03/08 03:04:45 by wescande ### ########.fr */ +/* Updated: 2017/03/08 03:21:13 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -88,6 +88,7 @@ int add_one_func(t_btree **ast, t_list **lst) { t_btree *func_ast; + (void)lst; func_ast = btree_map(*ast, node_copy); ft_lsteadd(&data_singleton()->lst_func, ft_lstnew(&func_ast, sizeof(*ast))); DG("arbre ajoute");