diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index 4146a16e..ba43eb7c 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/01/10 10:23:55 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:59:52 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,16 +19,17 @@ # define PROCESS_BUILTIN (1 << 0) # define PROCESS_BINARY (1 << 1) # define PROCESS_SCRIPT (1 << 2) -# define PROCESS_UNKNOWN (1 << 3) -# define PROCESS_PIPESTART (1 << 4) -# define PROCESS_PIPEEND (1 << 5) -# define PROCESS_COMPLETED (1 << 6) -# define PROCESS_SUSPENDED (1 << 7) -# define PROCESS_RUNNING (1 << 8) -# define PROCESS_CONTINUED (1 << 9) +# define PROCESS_SUBSHELL (1 << 3) +# define PROCESS_UNKNOWN (1 << 4) +# define PROCESS_PIPESTART (1 << 5) +# define PROCESS_PIPEEND (1 << 6) +# define PROCESS_COMPLETED (1 << 7) +# define PROCESS_SUSPENDED (1 << 8) +# define PROCESS_RUNNING (1 << 9) +# define PROCESS_CONTINUED (1 << 10) -# define PROCESS_TYPE_MASK (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3) -# define PROCESS_STATE_MASK (1 << 6 | 1 << 7 | 1 << 8 | 1 << 9) +# define PROCESS_TYPE_MASK (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4) +# define PROCESS_STATE_MASK (1 << 7 | 1 << 8 | 1 << 9 | 1 << 10) # define IS_PIPESTART(a) (a & PROCESS_PIPESTART) # define IS_PIPEEND(a) (a & PROCESS_PIPEEND) @@ -81,7 +82,7 @@ int exec_dgreat(t_btree **ast); int exec_command(t_btree **ast); int launch_process(t_process *p); -int process_setexec(t_process *p); +int process_setexec(t_type type, t_process *p); int process_setgroup(t_process *p); int process_redirect(t_process *p); void process_free(void *content, size_t content_size); diff --git a/42sh/includes/ft_readline.h b/42sh/includes/ft_readline.h index eb6b08f2..f8aeb60e 100644 --- a/42sh/includes/ft_readline.h +++ b/42sh/includes/ft_readline.h @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 18:02:25 by sbenning #+# #+# */ -/* Updated: 2017/01/10 17:59:30 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:31:09 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -209,6 +209,6 @@ int rl_cut_function(t_line *line, long int input); /* Cut selected area or cu int rl_paste_function(t_line *line, long int input); /* Paste copied/cuted area */ int rl_insert_function(t_line *line, long int input); /* Toogle insert-mode/replacement-mode */ -int ft_readline(t_line *line); +int ft_readline(); #endif diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index e0d43963..2c1c0163 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 12:15:50 by jhalford #+# #+# */ -/* Updated: 2017/01/10 16:49:13 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:08:20 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,13 +28,18 @@ typedef long long t_type; # define TK_AND_IF (1 << 8) # define TK_OR_IF (1 << 9) # define TK_AMP (1 << 10) -# define TK_N_WORD (1 << 11) -# define TK_Q_WORD (1 << 12) -# define TK_DQ_WORD (1 << 13) -# define TK_COMMAND (1 << 14) +# define TK_PAREN_OPEN (1 << 11) +# define TK_PAREN_CLOSE (1 << 12) +# define TK_BQUOTE (1 << 13) +# define TK_N_WORD (1 << 14) +# define TK_Q_WORD (1 << 15) +# define TK_DQ_WORD (1 << 16) +# define TK_COMMAND (1 << 17) +# define TK_SUBSHELL (1 << 18) -# define TK_WORD (TK_N_WORD | TK_Q_WORD | TK_DQ_WORD) -# define TK_REDIR (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) +# define TK_WORD (TK_N_WORD | TK_Q_WORD | TK_DQ_WORD) +# define TK_REDIR (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) +# define TK_NON_FREEABLE (TK_PAREN_OPEN | TK_PAREN_CLOSE | TK_BQUOTE) enum e_lexstate { @@ -51,6 +56,7 @@ enum e_lexstate DQUOTE, BACKSLASH, VAR, + SPECIAL, }; struct s_token @@ -68,12 +74,16 @@ extern int (*g_lexer[])(t_list **alst, char *str); t_token *token_init(); int ft_tokenize(t_list **alst, char *str, t_lexstate state); +int ft_post_tokenize(t_list **alst, char *str); int token_append(t_token *token, char c); void token_free(void *data, size_t size); int token_cmp_type(t_token *token, t_type *ref); void token_print(t_list *lst); void token_expand_var(t_token *token); +int reduce_parens(t_list **alst, char *str); +int reduce_bquotes(t_list **alst, char *str); + int ft_is_delim(char c); t_lexstate get_lexer_state(char *str); @@ -90,5 +100,6 @@ int lexer_quote(t_list **alst, char *str); int lexer_dquote(t_list **alst, char *str); int lexer_backslash(t_list **alst, char *str); int lexer_var(t_list **alst, char *str); +int lexer_special(t_list **alst, char *str); #endif diff --git a/42sh/includes/minishell.h b/42sh/includes/minishell.h index 271b8312..02b05202 100644 --- a/42sh/includes/minishell.h +++ b/42sh/includes/minishell.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 13:07:44 by jhalford #+# #+# */ -/* Updated: 2017/01/10 17:59:41 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:17:16 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,21 +31,27 @@ # include # include -enum e_mode -{ - MODE_INPUT, - MODE_EXEC, -}; - struct s_comp { int a; }; +# define SHELL_OPTS_JOBC (1 << 0) +# define SHELL_OPTS_LC (1 << 1) +# define SHELL_MODE_INPUT (1 << 2) +# define SHELL_MODE_EXEC (1 << 3) + +# define SHELL_MODE_MASK (SHELL_MODE_INPUT | SHELL_MODE_EXEC) +# define SHELL_HAS_JOBC(b) (b & SHELL_OPTS_JOBC) + +# define SHELL_MSG_NOJOBC "no job-control" + struct s_data { char **env; - t_mode mode; + int argc; + char **argv; + t_flag opts; t_line line; t_comp comp; t_exec exec; @@ -54,11 +60,15 @@ struct s_data extern t_stof g_builtins[]; -void shell_init(void); +void shell_get_opts(int ac, char **av); +char *shell_get_avdata(); +void shell_init(int ac, char **av); void shell_exit(void); int data_init(void); void data_exit(void); +int shell_single_command(char *command); + void ft_expand_dollar(char **av, char **env); char *ft_findexec(char *path, char *file); diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index ce4b8458..3c8a7fed 100644 --- a/42sh/includes/parser.h +++ b/42sh/includes/parser.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 12:15:54 by jhalford #+# #+# */ -/* Updated: 2016/12/05 12:33:54 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:06:17 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,6 +45,7 @@ union u_astdata { t_redir redir; char **sstr; + char *str; }; struct s_astnode @@ -64,5 +65,6 @@ int parse_dgreat(t_btree **ast, t_list **start, t_list **lst); int parse_lessand(t_btree **ast, t_list **start, t_list **lst); int parse_greatand(t_btree **ast, t_list **start, t_list **lst); int parse_word(t_btree **ast, t_list **start, t_list **lst); +int parse_subshell(t_btree **ast, t_list **start, t_list **lst); #endif diff --git a/42sh/libft b/42sh/libft index af71e8b8..5cfe1790 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit af71e8b8de26051cd63fde8ab82c90801bd835d8 +Subproject commit 5cfe17901496443664e5b7be7fd87310f854030c diff --git a/42sh/src/builtin/builtin_cd.c b/42sh/src/builtin/builtin_cd.c index 96278410..b973bf53 100644 --- a/42sh/src/builtin/builtin_cd.c +++ b/42sh/src/builtin/builtin_cd.c @@ -6,14 +6,14 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:57:53 by jhalford #+# #+# */ -/* Updated: 2016/12/15 17:50:04 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 14:29:14 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "builtin.h" -#define CDOPT_L 0x001 -#define CDOPT_P 0x002 +#define CDOPT_L (1 << 0) +#define CDOPT_P (1 << 2) #define HAS_CDOPT_P(x) (x & CD_OPT_P) #define HAS_CDOPT_L(x) (x & CD_OPT_L) #define CDERR_1 "cd: no such file or directory: %s\n" diff --git a/42sh/src/exec/ast_free.c b/42sh/src/exec/ast_free.c index 3a8b03a6..b0b3f592 100644 --- a/42sh/src/exec/ast_free.c +++ b/42sh/src/exec/ast_free.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/05 11:50:51 by jhalford #+# #+# */ -/* Updated: 2016/12/15 13:28:36 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:50:03 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/exec/exec_ampersand.c b/42sh/src/exec/exec_ampersand.c index 395785dd..ad4123d8 100644 --- a/42sh/src/exec/exec_ampersand.c +++ b/42sh/src/exec/exec_ampersand.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/10 16:01:30 by jhalford #+# #+# */ -/* Updated: 2016/12/15 13:40:11 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 14:41:54 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,9 +14,11 @@ int exec_ampersand(t_btree **ast) { - data_singleton()->exec.job.attributes |= JOB_BG; + if (SHELL_HAS_JOBC(data_singleton()->opts)) + data_singleton()->exec.job.attributes |= JOB_BG; ft_exec(&(*ast)->left); - data_singleton()->exec.job.attributes &= ~JOB_BG; + if (SHELL_HAS_JOBC(data_singleton()->opts)) + data_singleton()->exec.job.attributes &= ~JOB_BG; ft_exec(&(*ast)->right); btree_delone(ast, &ast_free); return (0); diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index 417a1a25..7e70093f 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/01/10 13:16:51 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:51:08 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ int exec_command(t_btree **ast) p = &data_singleton()->exec.process; job = &data_singleton()->exec.job; p->av = ft_sstrdup(node->data.sstr); - process_setexec(p); + process_setexec(node->type, p); if (!(launch_process(p))) { job_addprocess(p); diff --git a/42sh/src/exec/ft_exec.c b/42sh/src/exec/ft_exec.c index a553c73f..2f18bdc8 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/01/08 11:03:09 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 18:01:05 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ t_execmap g_execmap[] = {TK_LESS, &exec_less}, {TK_GREAT, &exec_great}, {TK_DGREAT, &exec_dgreat}, - {TK_COMMAND, &exec_command}, + {TK_COMMAND | TK_SUBSHELL, &exec_command}, {0, 0}, }; @@ -37,7 +37,7 @@ int ft_exec(t_btree **ast) item = (*ast)->item; while (g_execmap[i].type) { - if (item->type == g_execmap[i].type) + if (item->type & g_execmap[i].type) /* return ((*g_execmap[i].f)(ast)); */ (*g_execmap[i].f)(ast); i++; diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index f3426bc8..fb3a463a 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/01/10 17:47:21 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 18:01:10 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,9 +28,9 @@ int launch_process(t_process *p) set_exitstatus((*p->execf)(p->path, p->av, data_singleton()->env)); else { - /* DG("process is to be forked, %i->[]->%i, attr=%b", p->fdin, p->fdout, p->attributes); */ p->attributes &= ~PROCESS_STATE_MASK; p->attributes |= PROCESS_RUNNING; + DG("process is to be forked, %i->[]->%i, attr=%b", p->fdin, p->fdout, p->attributes); if (p->attributes & (PROCESS_BINARY | PROCESS_SCRIPT) && access(p->path, X_OK) == -1) { @@ -43,7 +43,7 @@ int launch_process(t_process *p) process_setgroup(p); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); - signal(SIGTSTP, sigtstp_handler); + signal(SIGTSTP, SIG_DFL); signal(SIGTTIN, sigttin_handler); signal(SIGTTOU, sigttou_handler); signal(SIGCHLD, SIG_DFL); diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c index 0baefd94..2ce1d0a3 100644 --- a/42sh/src/exec/process_setexec.c +++ b/42sh/src/exec/process_setexec.c @@ -6,18 +6,22 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:07:10 by jhalford #+# #+# */ -/* Updated: 2017/01/10 13:17:23 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 18:01:36 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int process_setexec(t_process *p) +int process_setexec(t_type type, t_process *p) { - if ((p->execf = is_builtin(p))) + if (type == TK_SUBSHELL) { - p->attributes |= PROCESS_BUILTIN; + p->execf = &execve; + p->attributes |= PROCESS_SUBSHELL; + p->path = ft_strdup(p->av[0]); } + else if ((p->execf = is_builtin(p))) + p->attributes |= PROCESS_BUILTIN; else if (ft_strchr(p->av[0], '/')) { p->execf = &execve; diff --git a/42sh/src/exec/process_setgroup.c b/42sh/src/exec/process_setgroup.c index 4dcdeda3..4cf1e1c4 100644 --- a/42sh/src/exec/process_setgroup.c +++ b/42sh/src/exec/process_setgroup.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:48:10 by jhalford #+# #+# */ -/* Updated: 2017/01/09 15:58:32 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 14:45:36 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/builtin_bg.c b/42sh/src/job-control/builtin_bg.c index 9e98b5e6..1f34dcdb 100644 --- a/42sh/src/job-control/builtin_bg.c +++ b/42sh/src/job-control/builtin_bg.c @@ -6,11 +6,10 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/09 16:54:18 by jhalford #+# #+# */ -/* Updated: 2017/01/10 11:11:21 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 14:37:23 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ - #include "job_control.h" int builtin_bg(const char *path, char *const av[], char *const envp[]) @@ -24,11 +23,14 @@ int builtin_bg(const char *path, char *const av[], char *const envp[]) (void)path; (void)envp; (void)av; + if (!SHELL_HAS_JOBC(data_singleton()->opts)) + { + ft_dprintf(2, "{red}bg: %s{eoc}\n", SHELL_MSG_NOJOBC); + return (-1); + } jobc = &data_singleton()->jobc; job_getrank(&rank); id = av[1] ? ft_atoi(av[1]) : rank[0]; - if (id == 0 && !av[1]) - return (0); jlist = ft_lst_find(jobc->first_job, &id, job_cmp_id); if (jlist) { @@ -36,8 +38,11 @@ int builtin_bg(const char *path, char *const av[], char *const envp[]) mark_job_as_running(job); job_format(job, rank, JOBS_OPTS_L); put_job_in_background(job, 1); + return (0); } - else + else if (av[1]) ft_dprintf(2, "{red}bg: job not found: %i{eoc}\n", id); - return (0); + else + ft_dprintf(2, "{red}bg: no current job{eoc}\n"); + return (1); } diff --git a/42sh/src/job-control/builtin_fg.c b/42sh/src/job-control/builtin_fg.c index c594df80..5e6c53b4 100644 --- a/42sh/src/job-control/builtin_fg.c +++ b/42sh/src/job-control/builtin_fg.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/08 14:30:07 by jhalford #+# #+# */ -/* Updated: 2017/01/10 11:16:03 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 14:42:04 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,19 +23,25 @@ int builtin_fg(const char *path, char *const av[], char *const envp[]) (void)path; (void)envp; (void)av; + if (!SHELL_HAS_JOBC(data_singleton()->opts)) + { + ft_dprintf(2, "{red}fg: %s{eoc}\n", SHELL_MSG_NOJOBC); + return (-1); + } jobc = &data_singleton()->jobc; job_getrank(&rank); id = av[1] ? ft_atoi(av[1]) : rank[0]; - if (id == 0 && !av[1]) - return (0); jlist = ft_lst_find(jobc->first_job, &id, job_cmp_id); if (jlist) { job = jlist->content; mark_job_as_running(job); put_job_in_foreground(job, 1); + return (0); } - else + else if (av[1]) ft_dprintf(2, "{red}fg: job not found: [%i]{eoc}\n", id); - return (0); + else + ft_dprintf(2, "{red}fg: no current job{eoc}\n"); + return (1); } diff --git a/42sh/src/job-control/builtin_jobs.c b/42sh/src/job-control/builtin_jobs.c index 46b73513..4009347e 100644 --- a/42sh/src/job-control/builtin_jobs.c +++ b/42sh/src/job-control/builtin_jobs.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 17:43:01 by jhalford #+# #+# */ -/* Updated: 2017/01/10 11:16:16 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 14:38:50 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,6 +24,11 @@ int builtin_jobs(const char *path, char *const av[], char *const envp[]) (void)path; (void)envp; (void)av; + if (!SHELL_HAS_JOBC(data_singleton()->opts)) + { + ft_dprintf(2, "{red}jobs: %s{eoc}\n", SHELL_MSG_NOJOBC); + return (-1); + } jobc = &data_singleton()->jobc; jlist = jobc->first_job; job_getrank(&rank); diff --git a/42sh/src/job-control/do_job_notification.c b/42sh/src/job-control/do_job_notification.c index 00dcc021..c748bd3f 100644 --- a/42sh/src/job-control/do_job_notification.c +++ b/42sh/src/job-control/do_job_notification.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 13:01:19 by jhalford #+# #+# */ -/* Updated: 2017/01/10 17:05:31 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:35:15 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/job_addprocess.c b/42sh/src/job-control/job_addprocess.c index 0215844a..7bd9f659 100644 --- a/42sh/src/job-control/job_addprocess.c +++ b/42sh/src/job-control/job_addprocess.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 13:54:51 by jhalford #+# #+# */ -/* Updated: 2017/01/10 12:30:12 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 14:40:34 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/job_is_completed.c b/42sh/src/job-control/job_is_completed.c index ba1837a2..c061b505 100644 --- a/42sh/src/job-control/job_is_completed.c +++ b/42sh/src/job-control/job_is_completed.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 15:10:20 by jhalford #+# #+# */ -/* Updated: 2017/01/10 16:41:15 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:53:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/job_is_stopped.c b/42sh/src/job-control/job_is_stopped.c index 7b4b5b85..e6b2c80a 100644 --- a/42sh/src/job-control/job_is_stopped.c +++ b/42sh/src/job-control/job_is_stopped.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 15:06:45 by jhalford #+# #+# */ -/* Updated: 2017/01/10 12:30:05 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:54:33 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/job_wait.c b/42sh/src/job-control/job_wait.c index 8e3f6bca..9f7a343b 100644 --- a/42sh/src/job-control/job_wait.c +++ b/42sh/src/job-control/job_wait.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 11:49:05 by jhalford #+# #+# */ -/* Updated: 2017/01/10 17:58:27 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:55:30 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,8 +24,8 @@ int job_wait(int id) pid = waitpid(WAIT_ANY, &status, WUNTRACED); DG("waitpid done"); while (!process_mark_status(pid, status) - && !job_is_stopped(id) - && !job_is_completed(id)) + && !job_is_completed(id) + && !job_is_stopped(id)) { DG("waitpid now"); pid = waitpid(WAIT_ANY, &status, WUNTRACED); diff --git a/42sh/src/job-control/process_format.c b/42sh/src/job-control/process_format.c index 92ad7d88..df2a2070 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/01/10 12:27:47 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 16:49:50 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/process_mark_status.c b/42sh/src/job-control/process_mark_status.c index 49784124..5ce4e3a9 100644 --- a/42sh/src/job-control/process_mark_status.c +++ b/42sh/src/job-control/process_mark_status.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 12:41:11 by jhalford #+# #+# */ -/* Updated: 2017/01/10 12:28:22 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:54:22 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/put_job_in_foreground.c b/42sh/src/job-control/put_job_in_foreground.c index f49216e4..c3bc3f50 100644 --- a/42sh/src/job-control/put_job_in_foreground.c +++ b/42sh/src/job-control/put_job_in_foreground.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 14:58:36 by jhalford #+# #+# */ -/* Updated: 2017/01/10 17:47:41 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:54:29 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/sigtstp_handler.c b/42sh/src/job-control/sigtstp_handler.c index 93b796f4..ecae88cb 100644 --- a/42sh/src/job-control/sigtstp_handler.c +++ b/42sh/src/job-control/sigtstp_handler.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/10 15:14:53 by jhalford #+# #+# */ -/* Updated: 2017/01/10 18:02:54 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 14:51:27 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/lexer/ft_post_tokenize.c b/42sh/src/lexer/ft_post_tokenize.c new file mode 100644 index 00000000..db6a3629 --- /dev/null +++ b/42sh/src/lexer/ft_post_tokenize.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_post_tokenize.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/11 16:11:11 by jhalford #+# #+# */ +/* Updated: 2017/01/11 17:07:39 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lexer.h" + +int ft_post_tokenize(t_list **alst, char *str) +{ + if (reduce_parens(alst, str)) + return (1); + if (reduce_bquotes(alst, str)) + return (1); + return (0); +} diff --git a/42sh/src/lexer/ft_tokenize.c b/42sh/src/lexer/ft_tokenize.c index 2d446de8..3955993f 100644 --- a/42sh/src/lexer/ft_tokenize.c +++ b/42sh/src/lexer/ft_tokenize.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 13:37:11 by jhalford #+# #+# */ -/* Updated: 2017/01/10 16:37:30 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 16:11:02 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,6 +27,7 @@ int (*g_lexer[])(t_list **alst, char *str) = &lexer_dquote, &lexer_backslash, &lexer_var, + &lexer_special, }; int ft_is_delim(char c) diff --git a/42sh/src/lexer/get_lexer_state.c b/42sh/src/lexer/get_lexer_state.c index 4464f969..37ae772b 100644 --- a/42sh/src/lexer/get_lexer_state.c +++ b/42sh/src/lexer/get_lexer_state.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/10 13:45:46 by jhalford #+# #+# */ -/* Updated: 2017/01/10 15:18:01 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 15:48:13 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,5 +26,7 @@ t_lexstate get_lexer_state(char *str) return (QUOTE); else if (*str == '\"') return (DQUOTE); + else if (*str == '(' || *str == ')' || *str == '`') + return (SPECIAL); return (0); } diff --git a/42sh/src/lexer/lexer_default.c b/42sh/src/lexer/lexer_default.c index bdc32a58..04c87fca 100644 --- a/42sh/src/lexer/lexer_default.c +++ b/42sh/src/lexer/lexer_default.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 18:36:21 by jhalford #+# #+# */ -/* Updated: 2017/01/10 14:50:37 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 16:10:53 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,6 @@ int lexer_default(t_list **alst, char *str) t_lexstate state; t_token *token; - state = DEFAULT; if ((state = get_lexer_state(str))) return (ft_tokenize(alst, str, state)); if (*str == '>') diff --git a/42sh/src/lexer/lexer_delim.c b/42sh/src/lexer/lexer_delim.c index 278210dd..7542b57c 100644 --- a/42sh/src/lexer/lexer_delim.c +++ b/42sh/src/lexer/lexer_delim.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:58:44 by jhalford #+# #+# */ -/* Updated: 2017/01/10 13:49:23 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 15:45:53 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ int lexer_delim(t_list **alst, char *str) token = (*alst)->content; while (ft_is_delim(*str)) str++; - if (*token->data) + if (token->type) return (ft_tokenize(&(*alst)->next, str, DEFAULT)); else return (ft_tokenize(alst, str, DEFAULT)); diff --git a/42sh/src/lexer/lexer_special.c b/42sh/src/lexer/lexer_special.c new file mode 100644 index 00000000..7d3d7800 --- /dev/null +++ b/42sh/src/lexer/lexer_special.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_special.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/11 15:35:38 by jhalford #+# #+# */ +/* Updated: 2017/01/11 17:36:10 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lexer.h" + +int lexer_special(t_list **alst, char *str) +{ + t_token *token; + t_list **lst; + + lst = alst; + if (*alst) + { + token = (*alst)->content; + if (token->type) + lst = &(*alst)->next; + } + token = token_init(); + *lst = ft_lstnew(token, sizeof(*token)); + token = (*lst)->content; + if (*str == '(') + token->type = TK_PAREN_OPEN; + else if (*str == ')') + token->type = TK_PAREN_CLOSE; + else if (*str == '`') + token->type = TK_BQUOTE; + token->data = str; + return (ft_tokenize(&(*lst)->next, str + 1, DEFAULT)); +} diff --git a/42sh/src/lexer/lexer_word.c b/42sh/src/lexer/lexer_word.c index 7ed43aff..53ed4746 100644 --- a/42sh/src/lexer/lexer_word.c +++ b/42sh/src/lexer/lexer_word.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:07:11 by jhalford #+# #+# */ -/* Updated: 2017/01/10 15:09:27 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 15:38:03 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/lexer/reduce_bquotes.c b/42sh/src/lexer/reduce_bquotes.c new file mode 100644 index 00000000..f91eff05 --- /dev/null +++ b/42sh/src/lexer/reduce_bquotes.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* reduce_bquotes.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/11 16:46:27 by jhalford #+# #+# */ +/* Updated: 2017/01/11 17:56:40 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lexer.h" + +int reduce_bquotes(t_list **alst, char *str) +{ + t_list *start; + t_list *end; + t_token *token; + int tk; + + (void)str; + tk = TK_BQUOTE; + if ((start = ft_lst_find(*alst, &tk, token_cmp_type))) + { + end = start->next; + while (end) + { + token = end->content; + if (token->type == TK_BQUOTE) + break ; + end = end->next; + if (token->type & TK_NON_FREEABLE) + ft_lst_delif(alst, token, ft_addrcmp, ft_lst_cfree); + else + ft_lst_delif(alst, token, ft_addrcmp, token_free); + } + if (end) + { + token = start->content; + token->type = TK_SUBSHELL; + token->data = ft_strbetween(token->data + 1, ((t_token*)end->content)->data); + ft_lst_delif(alst, end->content, ft_addrcmp, ft_lst_cfree); + return (0); + } + return (1); + } + return (0); +} + diff --git a/42sh/src/lexer/reduce_parens.c b/42sh/src/lexer/reduce_parens.c new file mode 100644 index 00000000..b838f59c --- /dev/null +++ b/42sh/src/lexer/reduce_parens.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* reduce_parens.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/11 16:13:31 by jhalford #+# #+# */ +/* Updated: 2017/01/11 17:06:51 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lexer.h" + +int reduce_parens(t_list **alst, char *str) +{ + t_list *start; + t_list *end; + t_token *token; + int num_p; + int tk; + + (void)str; + tk = TK_PAREN_OPEN; + if ((start = ft_lst_find(*alst, &tk, token_cmp_type))) + { + end = start->next; + num_p = 1; + while (end) + { + token = end->content; + if (token->type == TK_PAREN_OPEN) + num_p++; + else if (token->type == TK_PAREN_CLOSE) + num_p--; + if (num_p == 0) + break ; + end = end->next; + if (token->type & TK_NON_FREEABLE) + ft_lst_delif(alst, token, ft_addrcmp, ft_lst_cfree); + else + ft_lst_delif(alst, token, ft_addrcmp, token_free); + } + if (end) + { + token = start->content; + token->type = TK_SUBSHELL; + token->data = ft_strbetween(token->data + 1, ((t_token*)end->content)->data); + ft_lst_delif(alst, end->content, ft_addrcmp, ft_lst_cfree); + return (0); + } + return (1); + } + return (0); +} diff --git a/42sh/src/lexer/token_init.c b/42sh/src/lexer/token_init.c index e762eb1a..cf9fe1b7 100644 --- a/42sh/src/lexer/token_init.c +++ b/42sh/src/lexer/token_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 15:30:25 by jhalford #+# #+# */ -/* Updated: 2016/12/05 13:41:34 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 15:45:10 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/lexer/token_print.c b/42sh/src/lexer/token_print.c index 949700b7..aedfeecf 100644 --- a/42sh/src/lexer/token_print.c +++ b/42sh/src/lexer/token_print.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 14:39:01 by jhalford #+# #+# */ -/* Updated: 2017/01/10 14:39:44 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 16:28:42 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ void token_print(t_list *lst) while (lst) { - i = 0; + i = -1; token = lst->content; type = token->type; while (type >> (i++ + 2)) diff --git a/42sh/src/line-editing/curs_setup.c b/42sh/src/line-editing/curs_setup.c index c8a0184a..c9842a54 100644 --- a/42sh/src/line-editing/curs_setup.c +++ b/42sh/src/line-editing/curs_setup.c @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 16:36:43 by sbenning #+# #+# */ -/* Updated: 2017/01/10 18:03:01 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 13:55:42 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/line-editing/curs_term_setup.c b/42sh/src/line-editing/curs_term_setup.c index 38e7f992..9a18bc72 100644 --- a/42sh/src/line-editing/curs_term_setup.c +++ b/42sh/src/line-editing/curs_term_setup.c @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 16:50:26 by sbenning #+# #+# */ -/* Updated: 2017/01/10 18:04:56 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 13:55:40 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/line-editing/ft_readline.c b/42sh/src/line-editing/ft_readline.c index 5c936c5e..90620a39 100644 --- a/42sh/src/line-editing/ft_readline.c +++ b/42sh/src/line-editing/ft_readline.c @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 18:03:48 by sbenning #+# #+# */ -/* Updated: 2017/01/10 16:59:00 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:35:14 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -88,8 +88,11 @@ static int rl_loop(t_line *line) return ((ret < 0 ? -1 : 0)); } -int ft_readline(t_line *line) +int ft_readline() { + t_line *line; + + line = &data_singleton()->line; if (rl_setup(line) < 0) return (-1); if (rl_loop(line) < 0) diff --git a/42sh/src/line-editing/rl_setup.c b/42sh/src/line-editing/rl_setup.c index d878f42c..3e68d63a 100644 --- a/42sh/src/line-editing/rl_setup.c +++ b/42sh/src/line-editing/rl_setup.c @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 18:07:47 by sbenning #+# #+# */ -/* Updated: 2017/01/10 18:02:59 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:35:12 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,10 @@ int rl_setup(t_line *line) { - do_job_notification(); - data_singleton()->mode = MODE_INPUT; + if (SHELL_HAS_JOBC(data_singleton()->opts)) + do_job_notification(); + data_singleton()->opts &= ~SHELL_MODE_MASK; + data_singleton()->opts |= SHELL_MODE_INPUT; ft_bzero(line, sizeof(t_line)); if (curs_setup(&line->curs) < 0) return (-1); @@ -26,7 +28,8 @@ int rl_setup(t_line *line) int rl_cleanup(t_line *line) { - data_singleton()->mode = MODE_EXEC; + data_singleton()->opts &= ~SHELL_MODE_MASK; + data_singleton()->opts |= SHELL_MODE_EXEC; if (curs_cleanup(&line->curs) < 0) return (-1); if (rl_merge_line(line) < 0) diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index d32470ee..1829cbd1 100644 --- a/42sh/src/main/data_init.c +++ b/42sh/src/main/data_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 19:26:32 by jhalford #+# #+# */ -/* Updated: 2017/01/10 16:49:28 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 14:03:16 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ int data_init(void) data = data_singleton(); data->line.input = NULL; data->env = ft_sstrdup(environ); + data->opts = SHELL_OPTS_JOBC; data->exec.process.path = NULL; data->exec.process.av = NULL; diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index dfa083cd..762ee117 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,38 +6,56 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/01/10 16:50:35 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:48:10 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int main(void) +int shell_single_command(char *command) { t_list *token; t_btree *ast; token = NULL; ast = NULL; - shell_init(); + if (!command) + return (0); + DG("{inv}{mag}got command '%s'", command); + if (ft_tokenize(&token, command, DEFAULT)) + return (1); + if (!token) + return (0); + token_print(token); + if (ft_post_tokenize(&token, command)) + return (1); + DG("after post_tokenize"); + token_print(token); + if (ft_parse(&ast, &token)) + return (1); + btree_print(STDBUG, ast, &ft_putast); + /* ft_dprintf(STDBUG, "\n--- INFIX BREAKDOWN ---\n"); */ + /* btree_apply_infix(ast, &ft_putast2); */ + if (ft_exec(&ast)) + return (1); + return (0); +} + +int main(int ac, char **av) +{ DG("{inv}{bol}{gre}start of shell"); + shell_init(ac, av); + DG("job_control is %s", data_singleton()->opts & SHELL_OPTS_JOBC ? "ON" : "OFF"); + if (data_singleton()->opts & SHELL_OPTS_LC) + { + shell_single_command(shell_get_avdata()); + return (0); + } while (1) { - if (ft_readline(&data_singleton()->line)) + if (ft_readline()) return (1); - DG("{inv}{mag}got command '%s'", data_singleton()->line.input); - token = NULL; - if (ft_tokenize(&token, data_singleton()->line.input, DEFAULT)) - return (1); - if (!token) - continue ; - token_print(token); - if (ft_parse(&ast, &token)) - return (1); - btree_print(STDBUG, ast, &ft_putast); - /* ft_dprintf(STDBUG, "\n--- INFIX BREAKDOWN ---\n"); */ - /* btree_apply_infix(ast, &ft_putast2); */ - if (ft_exec(&ast)) + if (shell_single_command(data_singleton()->line.input)) return (1); } return (0); diff --git a/42sh/src/main/shell_get_avdata.c b/42sh/src/main/shell_get_avdata.c new file mode 100644 index 00000000..eecb524c --- /dev/null +++ b/42sh/src/main/shell_get_avdata.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shell_get_avdata.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/11 17:14:52 by jhalford #+# #+# */ +/* Updated: 2017/01/11 17:26:32 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *shell_get_avdata() +{ + t_data *data; + char **av; + int i; + + data = data_singleton(); + av = data->argv; + i = 1; + while (av[i][0] == '-') + { + if (ft_strcmp(av[i], "--") == 0) + { + i++; + break ; + } + i++; + } + return(av[i]); +} diff --git a/42sh/src/main/shell_get_opts.c b/42sh/src/main/shell_get_opts.c new file mode 100644 index 00000000..d91fce50 --- /dev/null +++ b/42sh/src/main/shell_get_opts.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shell_get_opts.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/11 14:04:48 by jhalford #+# #+# */ +/* Updated: 2017/01/11 17:14:35 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static void shell_parse_long_opt(char *str) +{ + if (ft_strcmp("no-jobcontrol", str) == 0) + data_singleton()->opts &= ~SHELL_OPTS_JOBC; +} + +static void shell_parse_short_opt(char *str) +{ + int i; + + i = 0; + while (str[i]) + { + if (*str == 'c') + { + data_singleton()->opts |= SHELL_OPTS_LC; + data_singleton()->opts &= ~SHELL_OPTS_JOBC; + } + i++; + } +} + +void shell_get_opts(int ac, char **av) +{ + int i; + + i = 1; + while (i < ac && av[i][0] == '-') + { + if (ft_strcmp(av[i], "--") == 0) + { + i++; + break ; + } + if (av[i][1] == '-') + shell_parse_long_opt(av[i] + 2); + else + shell_parse_short_opt(av[i] + 1); + i++; + } +} diff --git a/42sh/src/main/shell_init.c b/42sh/src/main/shell_init.c index 2ef606fe..b540d564 100644 --- a/42sh/src/main/shell_init.c +++ b/42sh/src/main/shell_init.c @@ -6,26 +6,29 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 17:23:59 by jhalford #+# #+# */ -/* Updated: 2017/01/10 17:10:36 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:07:38 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void shell_init(void) +void shell_init(int ac, char **av) { int *shell_pgid; - shell_pgid = &data_singleton()->jobc.shell_pgid; data_init(); + data_singleton()->argc = ac; + data_singleton()->argv = ft_sstrdup(av); atexit(&shell_exit); if (isatty(STDIN)) { + shell_pgid = &data_singleton()->jobc.shell_pgid; while (tcgetpgrp(STDIN) != (*shell_pgid = getpgrp())) kill(-*shell_pgid, SIGTTIN); signal(SIGINT, sigint_handler); signal(SIGQUIT, SIG_IGN); signal(SIGTSTP, sigtstp_handler); + /* signal(SIGTSTP, SIG_IGN); */ signal(SIGTTIN, sigttin_handler); signal(SIGTTOU, sigttou_handler); signal(SIGCHLD, sigchld_handler); @@ -38,4 +41,5 @@ void shell_init(void) tcsetpgrp(STDIN, *shell_pgid); tcgetattr(STDIN, &data_singleton()->jobc.shell_tmodes); } + shell_get_opts(ac, av); } diff --git a/42sh/src/parser/ft_parse.c b/42sh/src/parser/ft_parse.c index 7b70ab63..fb530419 100644 --- a/42sh/src/parser/ft_parse.c +++ b/42sh/src/parser/ft_parse.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 17:14:58 by jhalford #+# #+# */ -/* Updated: 2017/01/10 14:20:14 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 16:52:25 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,6 +24,7 @@ t_parser g_parser[] = {TK_DGREAT, &parse_dgreat}, {TK_LESSAND, &parse_lessand}, {TK_GREATAND, &parse_greatand}, + {TK_SUBSHELL, &parse_subshell}, {TK_WORD, &parse_word}, {0, 0}, }; diff --git a/42sh/src/parser/parse_subshell.c b/42sh/src/parser/parse_subshell.c new file mode 100644 index 00000000..0bcc2c59 --- /dev/null +++ b/42sh/src/parser/parse_subshell.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parse_subshell.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/11 16:52:44 by jhalford #+# #+# */ +/* Updated: 2017/01/11 17:50:54 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parser.h" + +int parse_subshell(t_btree **ast, t_list **start, t_list **lst) +{ + t_astnode *node; + t_token *token; + + (void)start; + token = (*lst)->content; + node = (*ast)->item; + node->type = TK_SUBSHELL; + node->data.sstr = malloc(4 * sizeof(char *)); + node->data.sstr[0] = ft_strdup(data_singleton()->argv[0]); + node->data.sstr[1] = ft_strdup("-c"); + node->data.sstr[2] = ft_strdup(token->data); + node->data.sstr[3] = NULL; + ft_parse(ast, &(*lst)->next); + ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); + return (0); +} diff --git a/42sh/src/parser/parse_word.c b/42sh/src/parser/parse_word.c index 9593f3ba..45c64039 100644 --- a/42sh/src/parser/parse_word.c +++ b/42sh/src/parser/parse_word.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/14 12:49:45 by jhalford #+# #+# */ -/* Updated: 2016/12/07 17:37:08 by jhalford ### ########.fr */ +/* Updated: 2017/01/11 17:24:55 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */