From dfdf245b1ab526c14ecb12863e2943f139b04db6 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Thu, 12 Jan 2017 18:09:16 +0100 Subject: [PATCH] backquote work, still some segfaults, end of day commit --- 42sh/includes/exec.h | 2 +- 42sh/includes/lexer.h | 5 +- 42sh/libft | 2 +- 42sh/src/exec/exec_command.c | 2 +- 42sh/src/job-control/job_is_completed.c | 2 +- 42sh/src/job-control/job_remove.c | 8 +-- 42sh/src/job-control/job_wait.c | 2 +- 42sh/src/job-control/process_format.c | 20 +++++-- 42sh/src/job-control/process_mark_status.c | 6 +-- 42sh/src/job-control/put_job_in_foreground.c | 2 +- 42sh/src/lexer/command_getoutput.c | 56 ++++++++++++++++++++ 42sh/src/lexer/ft_post_tokenize.c | 15 ++++-- 42sh/src/lexer/reduce_bquotes.c | 39 +++++++------- 42sh/src/lexer/reduce_parens.c | 21 +++----- 42sh/src/lexer/token_free.c | 5 +- 42sh/src/lexer/token_print.c | 3 +- 42sh/src/main/main.c | 16 +++--- 42sh/src/parser/ft_parse.c | 2 +- 42sh/src/parser/parse_subshell.c | 2 +- 19 files changed, 142 insertions(+), 68 deletions(-) create mode 100644 42sh/src/lexer/command_getoutput.c diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index ba43eb7c..ea6efda7 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/11 17:59:52 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 13:18:27 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index 2c1c0163..03276719 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/11 17:08:20 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 14:57:41 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -82,7 +82,8 @@ 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 reduce_bquotes(t_list **alst, char **str); +char *command_getoutput(char *command); int ft_is_delim(char c); diff --git a/42sh/libft b/42sh/libft index 5cfe1790..ab92f0e5 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit 5cfe17901496443664e5b7be7fd87310f854030c +Subproject commit ab92f0e5d817c9d726a8ccf2f11c084ba446bbdf diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index 7e70093f..6b2c2562 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/11 17:51:08 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 13:14:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/job_is_completed.c b/42sh/src/job-control/job_is_completed.c index c061b505..1895291c 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/11 17:53:45 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 15:15:21 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/job_remove.c b/42sh/src/job-control/job_remove.c index ffeb3933..afcfa110 100644 --- a/42sh/src/job-control/job_remove.c +++ b/42sh/src/job-control/job_remove.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 12:51:08 by jhalford #+# #+# */ -/* Updated: 2017/01/10 12:31:00 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 15:16:05 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,11 +19,11 @@ void job_remove(int id) jobc = &data_singleton()->jobc; if (job_is_completed(id)) { - /* DG("job_remove"); */ + DG("job_remove"); if (id < data_singleton()->jobc.current_id) data_singleton()->jobc.current_id = id; ft_lst_delif(&jobc->first_job, &id, job_cmp_id, job_free); } - /* else */ - /* DG("job_remove failed (not completed)"); */ + else + DG("job_remove failed (not completed)"); } diff --git a/42sh/src/job-control/job_wait.c b/42sh/src/job-control/job_wait.c index 9f7a343b..89268b18 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/11 17:55:30 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 15:14:38 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/process_format.c b/42sh/src/job-control/process_format.c index df2a2070..7391dba4 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/11 16:49:50 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 13:16:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,7 +43,14 @@ void process_format(t_list **plist, int firstp, int opts) ft_putchar('\t'); if (opts & JOBS_OPTS_L) { - ft_sstrprint(p->av, ' '); + if (p->attributes & PROCESS_SUBSHELL) + { + ft_putstr("( "); + ft_putstr(p->av[2]); + ft_putstr(" )"); + } + else + ft_sstrprint(p->av, ' '); if ((*plist)->next) ft_putstr(" |"); (*plist) = (*plist)->next; @@ -61,7 +68,14 @@ void process_format(t_list **plist, int firstp, int opts) p->attributes &= ~PROCESS_STATE_MASK; p->attributes &= ~PROCESS_RUNNING; } - ft_sstrprint(p->av, ' '); + if (p->attributes & PROCESS_SUBSHELL) + { + ft_putstr("( "); + ft_putstr(p->av[2]); + ft_putstr(" )"); + } + else + ft_sstrprint(p->av, ' '); if ((*plist)->next) ft_putstr(" | "); (*plist) = (*plist)->next; diff --git a/42sh/src/job-control/process_mark_status.c b/42sh/src/job-control/process_mark_status.c index 5ce4e3a9..566e95e1 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/11 17:54:22 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 15:14:28 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,13 +23,13 @@ int process_mark_status(pid_t pid, int status) p->status = status; if (WIFSTOPPED(status)) { - /* DG("marking: pid=%i, status=%i (stopped sig %i)", pid, status, WTERMSIG(status)); */ + DG("marking: pid=%i, status=%i (stopped sig %i)", pid, status, WTERMSIG(status)); p->attributes &= ~PROCESS_STATE_MASK; p->attributes |= PROCESS_SUSPENDED; } else { - /* DG("marking: pid=%i, status=%i (completed sig %i)", pid, status, WTERMSIG(status)); */ + DG("marking: pid=%i, status=%i (completed sig %i)", pid, status, WTERMSIG(status)); p->attributes &= ~PROCESS_STATE_MASK; p->attributes |= PROCESS_COMPLETED; if (WIFSIGNALED(status)) diff --git a/42sh/src/job-control/put_job_in_foreground.c b/42sh/src/job-control/put_job_in_foreground.c index c3bc3f50..3b0f05d6 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/11 17:54:29 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 13:16:48 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/lexer/command_getoutput.c b/42sh/src/lexer/command_getoutput.c new file mode 100644 index 00000000..ec2d5349 --- /dev/null +++ b/42sh/src/lexer/command_getoutput.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* command_getoutput.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/12 14:01:59 by jhalford #+# #+# */ +/* Updated: 2017/01/12 15:31:34 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" +#define BUF_SIZE 10 + +char *command_getoutput(char *command) +{ + int fds[2]; + t_btree *ast; + t_astnode item; + char *output; + char *buf; + int ret; + + output = NULL; + buf = NULL; + item.type = TK_SUBSHELL; + item.data.sstr = malloc(4 * sizeof(char *)); + item.data.sstr[0] = ft_strdup(data_singleton()->argv[0]); + item.data.sstr[1] = ft_strdup("-c"); + item.data.sstr[2] = ft_strdup(command); + item.data.sstr[3] = NULL; + ast = btree_create_node(&item, sizeof(item)); + pipe(fds); + dup2(fds[PIPE_WRITE], 1); + close(fds[PIPE_WRITE]); + ft_exec(&ast); + /* DG("gonna parse"); */ + /* token_print(token); */ + /* if (ft_parse(&ast, &token)) */ + /* return (NULL); */ + /* DG("gonna exec"); */ + /* if (ft_exec(&ast)) */ + /* return (NULL); */ + + DG("gonna read from pipe"); + while ((ret = read(fds[PIPE_READ], buf, BUF_SIZE))) + { + buf[ret] = 0; + DG("read '%s' from pipe", buf); + ft_strappend(&output, buf); + } + DG("finished reading from pipe"); + close(fds[PIPE_READ]); + return (output); +} diff --git a/42sh/src/lexer/ft_post_tokenize.c b/42sh/src/lexer/ft_post_tokenize.c index db6a3629..a3de30d2 100644 --- a/42sh/src/lexer/ft_post_tokenize.c +++ b/42sh/src/lexer/ft_post_tokenize.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 16:11:11 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:07:39 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 13:58:20 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,9 +14,14 @@ int ft_post_tokenize(t_list **alst, char *str) { - if (reduce_parens(alst, str)) - return (1); - if (reduce_bquotes(alst, str)) - return (1); + int ret; + + while ((ret = reduce_parens(alst, str))) + if (ret == -1) + return (-1); + while ((ret = reduce_bquotes(alst, &str))) + if (ret == -1) + return (-1); + DG("new command from bquotes: '%s'", str); return (0); } diff --git a/42sh/src/lexer/reduce_bquotes.c b/42sh/src/lexer/reduce_bquotes.c index f91eff05..c50e9613 100644 --- a/42sh/src/lexer/reduce_bquotes.c +++ b/42sh/src/lexer/reduce_bquotes.c @@ -6,43 +6,44 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 16:46:27 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:56:40 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 15:10:16 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int reduce_bquotes(t_list **alst, char *str) +int reduce_bquotes(t_list **alst, char **str) { t_list *start; - t_list *end; + t_list **end; t_token *token; int tk; + char *new; + char *fit; + char *bq_start; + char *bq_end; - (void)str; tk = TK_BQUOTE; if ((start = ft_lst_find(*alst, &tk, token_cmp_type))) { - end = start->next; + end = &start->next; while (end) { - token = end->content; + 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); + end = &(*end)->next; } + if (!*end) + return (-1); + bq_start = ((t_token*)start->content)->data; + bq_end = ((t_token*)(*end)->content)->data; + ft_lstdel(end, token_free); + fit = command_getoutput(ft_strbetween(bq_start + 1, bq_end)); + new = ft_strreplace(str, bq_start, bq_end, fit); + ft_strdel(str); + *str = new; + ft_lstdel(alst, token_free); return (1); } return (0); diff --git a/42sh/src/lexer/reduce_parens.c b/42sh/src/lexer/reduce_parens.c index b838f59c..dfad6686 100644 --- a/42sh/src/lexer/reduce_parens.c +++ b/42sh/src/lexer/reduce_parens.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 16:13:31 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:06:51 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 13:50:10 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,19 +36,14 @@ int reduce_parens(t_list **alst, char *str) 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); + ft_lst_delif(alst, token, ft_addrcmp, token_free); } + if (!end) + return (-1); + 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, token_free); return (1); } return (0); diff --git a/42sh/src/lexer/token_free.c b/42sh/src/lexer/token_free.c index 08cebb6a..50ef0d0f 100644 --- a/42sh/src/lexer/token_free.c +++ b/42sh/src/lexer/token_free.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:07:30 by jhalford #+# #+# */ -/* Updated: 2016/12/05 13:17:56 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 13:18:46 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,7 @@ void token_free(void *data, size_t size) (void)size; token = data; - ft_strdel(&token->data); + if (!(token->type & TK_NON_FREEABLE)) + ft_strdel(&token->data); free(token); } diff --git a/42sh/src/lexer/token_print.c b/42sh/src/lexer/token_print.c index aedfeecf..d720e73d 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/11 16:28:42 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 14:48:33 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,7 @@ void token_print(t_list *lst) while (lst) { i = -1; + DG("lst at %p", lst); token = lst->content; type = token->type; while (type >> (i++ + 2)) diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 762ee117..e552f3c6 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:48:10 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 14:02:30 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,13 +31,13 @@ int shell_single_command(char *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); + /* if (ft_parse(&ast, &token)) */ + /* return (1); */ + /* btree_print(STDBUG, ast, &ft_putast); */ + /* /1* ft_dprintf(STDBUG, "\n--- INFIX BREAKDOWN ---\n"); *1/ */ + /* /1* btree_apply_infix(ast, &ft_putast2); *1/ */ + /* if (ft_exec(&ast)) */ + /* return (1); */ return (0); } diff --git a/42sh/src/parser/ft_parse.c b/42sh/src/parser/ft_parse.c index fb530419..2dbdbb5d 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/11 16:52:25 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 15:07:31 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/parse_subshell.c b/42sh/src/parser/parse_subshell.c index 0bcc2c59..bcb38158 100644 --- a/42sh/src/parser/parse_subshell.c +++ b/42sh/src/parser/parse_subshell.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 16:52:44 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:50:54 by jhalford ### ########.fr */ +/* Updated: 2017/01/12 15:10:24 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */