diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index d43904a2..4fc79d2b 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/06 19:16:30 by ariard ### ########.fr */ +/* Updated: 2017/03/07 14:41:58 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,15 +48,60 @@ # define EXEC_IS_IF_BRANCH(j) (j & EXEC_IF_BRANCH) # define EXEC_IS_CASE_BRANCH(j) (j & EXEC_CASE_BRANCH) -# include "libft.h" +# include "../libft/includes/libft.h" # include "types.h" # include "job_control.h" +struct s_data_cmd +{ + char **av; + char *path; + t_execf *execf; +}; + +struct s_data_cond +{ + t_btree *condition; + t_btree *content; +}; + +struct s_data_list +{ + char *word; + t_ld *list_word; + t_btree *content; +}; + +union u_process_data +{ + struct s_data_cmd cmd; + struct s_data_cond d_while; + struct s_data_cond d_if; + struct s_data_cond d_else; + struct s_data_cond d_elif; + struct s_data_list d_for; +// struct s_data_cond case; +}; + +typedef union u_process_data t_pdata; +typedef struct s_data_cond t_data_while; +typedef struct s_data_cond t_data_if; struct s_process { - char **av; - char *path; - t_execf *execf; + //normal_cmd +// char **av; +// char *path; +// t_execf *execf; + //while, if, elif .... +// t_btree *condition; +// t_btree *content; + //for => utilisation du av et du content +// char **av; +// t_btree *content; + + + t_pdata data; + pid_t pid; int fdin; int fdout; diff --git a/42sh/src/builtin/is_builtin.c b/42sh/src/builtin/is_builtin.c index 43a9aa27..9c1216f0 100644 --- a/42sh/src/builtin/is_builtin.c +++ b/42sh/src/builtin/is_builtin.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 13:09:57 by jhalford #+# #+# */ -/* Updated: 2017/03/07 11:05:55 by gwojda ### ########.fr */ +/* Updated: 2017/03/07 14:39:17 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,7 +38,7 @@ t_execf *is_builtin(t_process *p) i = -1; while (g_builtin[++i].name) { - if (ft_strcmp(g_builtin[i].name, p->av[0]) == 0) + if (ft_strcmp(g_builtin[i].name, p->data.cmd.av[0]) == 0) return (g_builtin[i].f); } return (NULL); diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index 6bbed2be..6a6d04be 100644 --- a/42sh/src/exec/exec_command.c +++ b/42sh/src/exec/exec_command.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */ -/* Updated: 2017/03/06 18:51:58 by ariard ### ########.fr */ +/* Updated: 2017/03/07 15:03:54 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/exec/exec_while.c b/42sh/src/exec/exec_while.c index e634687a..a2cf6932 100644 --- a/42sh/src/exec/exec_while.c +++ b/42sh/src/exec/exec_while.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/30 17:33:53 by ariard #+# #+# */ -/* Updated: 2017/03/06 12:27:23 by wescande ### ########.fr */ +/* Updated: 2017/03/07 14:33:10 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/exec/ft_exec.c b/42sh/src/exec/ft_exec.c index b24b7612..cfb28bde 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/06 18:08:06 by ariard ### ########.fr */ +/* Updated: 2017/03/07 14:33:06 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index c1029d29..e3c006fc 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/06 16:20:54 by wescande ### ########.fr */ +/* Updated: 2017/03/07 14:43:48 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,15 +23,15 @@ int launch_process(t_process *p) { if (process_redirect(p)) return (1); - set_exitstatus((*p->execf)(p->path, p->av, data_singleton()->env), 1); + set_exitstatus((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env), 1); return (1); } p->attrs &= ~PROCESS_STATE_MASK; p->attrs |= PROCESS_RUNNING; if (p->attrs & (PROCESS_BINARY | PROCESS_SCRIPT) - && access(p->path, X_OK) == -1) + && access(p->data.cmd.path, X_OK) == -1) { - ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->av[0]); + ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]); set_exitstatus(126, 1); return (1); } @@ -40,7 +40,7 @@ int launch_process(t_process *p) { if (p->attrs & PROCESS_UNKNOWN) { - ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]); + ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]); exit(127); } process_setgroup(p, 0); @@ -48,9 +48,9 @@ int launch_process(t_process *p) if (process_redirect(p)) exit (1); if (p->attrs & PROCESS_BUILTIN) - exit((*p->execf)(p->path, p->av, data_singleton()->env)); - (*p->execf)(p->path, p->av, data_singleton()->env); - ft_dprintf(2, "{red}%s: internal execve error on %s{eoc}\n", SHELL_NAME, p->av[0]); + exit((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env)); + (*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env); + ft_dprintf(2, "{red}%s: internal execve error on %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]); } else if (pid > 0) { diff --git a/42sh/src/exec/process_reset.c b/42sh/src/exec/process_reset.c index 7ab34d1d..a3a85852 100644 --- a/42sh/src/exec/process_reset.c +++ b/42sh/src/exec/process_reset.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/07 17:44:22 by jhalford #+# #+# */ -/* Updated: 2017/03/06 12:29:17 by wescande ### ########.fr */ +/* Updated: 2017/03/07 14:36:21 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,9 +14,9 @@ void process_reset(t_process *p) { - p->av = NULL; - p->path = NULL; - p->execf = NULL; +// p->av = NULL; +// p->path = NULL; +// p->execf = NULL; p->pid = 0; /* p->fdin = STDIN; */ /* p->fdout = STDOUT; */ @@ -24,4 +24,6 @@ void process_reset(t_process *p) p->redirs = NULL; p->status = -1; p->attrs = 0; +// p->condition = NULL; +// p->content = NULL; } diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c index 0971a463..46f381c6 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/06 12:26:01 by wescande ### ########.fr */ +/* Updated: 2017/03/07 14:42:01 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,23 +14,23 @@ int process_setexec(t_process *p) { - p->path = NULL; - if ((p->execf = is_builtin(p))) + p->data.cmd.path = NULL; + if ((p->data.cmd.execf = is_builtin(p))) p->attrs |= PROCESS_BUILTIN; - else if (ft_strchr(p->av[0], '/')) + else if (ft_strchr(p->data.cmd.av[0], '/')) { - p->execf = &execve; + p->data.cmd.execf = &execve; p->attrs |= PROCESS_SCRIPT; - p->path = ft_strdup(p->av[0]); + p->data.cmd.path = ft_strdup(p->data.cmd.av[0]); } else if (ft_hash(p)) { - p->execf = &execve; + p->data.cmd.execf = &execve; p->attrs |= PROCESS_BINARY; } else { - p->execf = NULL; + p->data.cmd.execf = NULL; p->attrs |= PROCESS_UNKNOWN; return (1); } diff --git a/42sh/src/exec/set_process.c b/42sh/src/exec/set_process.c index 3be94f58..8dedbcb0 100644 --- a/42sh/src/exec/set_process.c +++ b/42sh/src/exec/set_process.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/05 14:54:45 by jhalford #+# #+# */ -/* Updated: 2017/03/06 18:41:01 by ariard ### ########.fr */ +/* Updated: 2017/03/07 15:07:44 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,8 +28,6 @@ int set_process(t_process *p, t_btree *ast) || (EXEC_IS_OR_IF(exec->attrs) && ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0") == 0)) return (1); - if (!(p->av = token_to_argv(cmd->token, 1))) - return (1); fds[PIPE_WRITE] = STDOUT; fds[PIPE_READ] = STDIN; if (op == TK_AMP) @@ -41,14 +39,8 @@ int set_process(t_process *p, t_btree *ast) p->fdout = fds[PIPE_WRITE]; exec->fdin = fds[PIPE_READ]; p->redirs = ft_lstmap(cmd->redir, ft_id); - t_list *tmp = p->redirs; - while (tmp) - { - t_redir *toto = tmp->content; - printf("IIIIIIIIIIIIIIIIIIIIIII%lld |%d| {%s}\n", toto->type, toto->n, toto->word); - tmp= tmp->next; - } - process_setexec(p); + if (set_process_map(p, ast, cmd)) + return (1); if (exec->control_count) p->attrs |= PROCESS_CONTROL; return (0); diff --git a/42sh/src/exec/set_process_cmd.c b/42sh/src/exec/set_process_cmd.c new file mode 100644 index 00000000..869f5e8f --- /dev/null +++ b/42sh/src/exec/set_process_cmd.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 15:06:05 by wescande #+# #+# */ +/* Updated: 2017/03/07 15:07:39 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "exec.h" + +int set_process_cmd(t_process *p, t_btree *ast, t_cmd *cmd) +{ + if (!(p->data.cmd.av = token_to_argv(cmd->token, 1))) + return (1); + process_setexec(p); + return (0); +} diff --git a/42sh/src/exec/set_process_map.c b/42sh/src/exec/set_process_map.c new file mode 100644 index 00000000..7959c7ea --- /dev/null +++ b/42sh/src/exec/set_process_map.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 15:08:12 by wescande #+# #+# */ +/* Updated: 2017/03/07 15:11:17 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "exec.h" + +t_setprocessmap g_setprocessmap[] = +{ + {TK_NEWLINE, &exec_semi}, + {TK_SEMI, &exec_semi}, + {TK_AMP, &exec_ampersand}, + {TK_AND_IF, &exec_and_if}, + {TK_OR_IF, &exec_or_if}, + {TK_PIPE, &exec_pipe}, + {TK_WHILE, &exec_while}, + {TK_IF, &exec_if}, + {TK_ELIF, &exec_elif}, + {TK_ELSE, &exec_else}, + {TK_UNTIL, &exec_until}, + {TK_FOR, &exec_for}, + {TK_CASE, &exec_case}, + {TK_PAREN_OPEN, &exec_case_branch}, + {TK_ASSIGNEMENT_WORD, &exec_var}, + /* {TK_SUBSHELL, &exec_}, */ + {CMD, &exec_cmd}, + {0, 0}, +}; + +int set_process_map(t_process *p, t_btree *ast, t_cmd *cmd) +{ + int i; + + i = 0; + if (!ast) + return (0); + while (g_execmap[i].type) + { + if (p->type == g_setprocessmap[i].type) + return ((*g_setprocessmap[i].f)(p, ast, cmd)); + i++; + } + return (0); +} diff --git a/42sh/src/hash_table/ft_add_hash.c b/42sh/src/hash_table/ft_add_hash.c index 055d7654..659d126d 100644 --- a/42sh/src/hash_table/ft_add_hash.c +++ b/42sh/src/hash_table/ft_add_hash.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/18 11:20:11 by gwojda #+# #+# */ -/* Updated: 2017/03/04 18:51:01 by ariard ### ########.fr */ +/* Updated: 2017/03/07 14:44:52 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,11 +18,11 @@ int ft_add_hash(t_process *p) t_hash hash; if (!(hash.path = ft_findexec( - ft_getenv(data_singleton()->env, "PATH"), p->av[0]))) + ft_getenv(data_singleton()->env, "PATH"), p->data.cmd.av[0]))) return (0); - hash.key = ft_strdup(p->av[0]); - id = ft_hash_str(p->av[0]); + hash.key = ft_strdup(p->data.cmd.av[0]); + id = ft_hash_str(p->data.cmd.av[0]); ft_lsteadd(&(g_hash[id]), ft_lstnew(&hash, sizeof(t_hash))); - p->path = ft_strdup(hash.path); + p->data.cmd.path = ft_strdup(hash.path); return (1); } diff --git a/42sh/src/hash_table/is_hash.c b/42sh/src/hash_table/is_hash.c index 03fdf717..385401e3 100644 --- a/42sh/src/hash_table/is_hash.c +++ b/42sh/src/hash_table/is_hash.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/18 11:08:40 by gwojda #+# #+# */ -/* Updated: 2017/02/18 16:42:12 by gwojda ### ########.fr */ +/* Updated: 2017/03/07 14:45:20 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,12 +18,12 @@ int ft_is_hash(t_process *p) t_list *ref; int id; - id = ft_hash_str(p->av[0]); + id = ft_hash_str(p->data.cmd.av[0]); list = g_hash[id]; ref = list; while (list) { - if (!ft_strcmp(((t_hash *)list->content)->key, p->av[0])) + if (!ft_strcmp(((t_hash *)list->content)->key, p->data.cmd.av[0])) { if (access(((t_hash *)list->content)->path, X_OK)) { @@ -31,7 +31,7 @@ int ft_is_hash(t_process *p) ft_lstdelone(&list, &ft_hash_free); return (0); } - p->path = ft_strdup(((t_hash *)list->content)->path); + p->data.cmd.path = ft_strdup(((t_hash *)list->content)->path); return (1); } ref = list; diff --git a/42sh/src/job-control/process_format.c b/42sh/src/job-control/process_format.c index 9e0f9d62..c8cad1a0 100644 --- a/42sh/src/job-control/process_format.c +++ b/42sh/src/job-control/process_format.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/09 13:05:55 by jhalford #+# #+# */ -/* Updated: 2017/03/06 12:32:05 by wescande ### ########.fr */ +/* Updated: 2017/03/07 14:46:12 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,11 +47,11 @@ static void process_format_com_long(t_list **plist) else if (p->attrs & PROCESS_SUBSHELL) { ft_putstr("( "); - ft_putstr(p->av[2]); +// ft_putstr(p->data.cmd.av[2]); ft_putstr(" )"); } else - ft_sstrprint(p->av, ' '); + ft_sstrprint(p->data.cmd.av, ' '); if ((*plist)->next) ft_putstr(" |"); (*plist) = (*plist)->next; @@ -77,11 +77,11 @@ static void process_format_com_short(t_list **plist, t_flag state) else if (p->attrs & PROCESS_SUBSHELL) { ft_putstr("( "); - ft_putstr(p->av[2]); + ft_putstr(p->data.cmd.av[2]); ft_putstr(" )"); } else - ft_sstrprint(p->av, ' '); + ft_sstrprint(p->data.cmd.av, ' '); if ((*plist)->next) ft_putstr(" | "); (*plist) = (*plist)->next; diff --git a/42sh/src/job-control/process_free.c b/42sh/src/job-control/process_free.c index ea62d4bf..d7348c90 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/05 16:00:27 by jhalford ### ########.fr */ +/* Updated: 2017/03/07 14:46:41 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,8 @@ void process_free(void *content, size_t content_size) (void)content_size; p = content; - ft_strdel(&p->path); - ft_sstrfree(p->av); - /* ft_lstdel(&p->redirs, ft_lst_cfree); */ + ft_strdel(&p->data.cmd.path); + ft_sstrfree(p->data.cmd.av); + ft_lstdel(&p->redirs, ft_lst_cfree); free(p); } diff --git a/42sh/src/lexer/lexer_number.c b/42sh/src/lexer/lexer_number.c index b7eb03b4..910dbd7b 100644 --- a/42sh/src/lexer/lexer_number.c +++ b/42sh/src/lexer/lexer_number.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:45 by jhalford #+# #+# */ -/* Updated: 2017/03/05 18:03:34 by ariard ### ########.fr */ +/* Updated: 2017/03/07 13:55:25 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,7 @@ int lexer_number(t_list **alst, t_lexer *lexer) else if (ft_isdigit(lexer->str[lexer->pos]) && ft_isdigit(lexer->str[lexer->pos + 1])) { + DG(); token_append(token, lexer, 0, 0); lexer->pos++; return (lexer_number(alst, lexer)); @@ -36,13 +37,16 @@ int lexer_number(t_list **alst, t_lexer *lexer) && (lexer->str[lexer->pos + 1] == '>' || lexer->str[lexer->pos + 1] == '<')) { + DG(); token_append(token, lexer, 0, 0); lexer->pos++; return (lexer_lex(&(*alst)->next, lexer)); } else { + DG(); token->type = TK_WORD; + lexer->state = DEFAULT; token_append(token, lexer, 0, 0); lexer->pos++; return (lexer_lex(alst, lexer));