better parsing et exec case , for

This commit is contained in:
Antoine Riard 2017-03-15 01:58:01 +01:00
parent 8f76f7f44f
commit c45cb705b0
17 changed files with 66 additions and 69 deletions

View file

@ -6,7 +6,7 @@
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */ /* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */ /* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */
/* Updated: 2017/03/14 21:17:31 by jhalford ### ########.fr */ /* Updated: 2017/03/15 01:07:00 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -62,7 +62,7 @@ struct s_data_cond
struct s_data_list struct s_data_list
{ {
t_ld *list_word; t_ld *token;
t_btree *content; t_btree *content;
}; };

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 20:33:45 by wescande #+# #+# */ /* Created: 2017/03/07 20:33:45 by wescande #+# #+# */
/* Updated: 2017/03/07 20:34:48 by wescande ### ########.fr */ /* Updated: 2017/03/15 01:21:45 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -17,23 +17,20 @@ int exec_case_branch(t_btree **ast)
t_astnode *node; t_astnode *node;
char **av; char **av;
t_exec *exec; t_exec *exec;
int i;
DG("exec branch case");
exec = &data_singleton()->exec; exec = &data_singleton()->exec;
if (EXEC_IS_CASE_BRANCH(exec->attrs)) if (EXEC_IS_CASE_BRANCH(exec->attrs))
return (0); return (0);
node = (*ast)->item; node = (*ast)->item;
av = token_to_argv(node->data.cmd.wordlist, 1); av = token_to_argv(node->data.cmd.token, 1);
i = 0; DG("compare pattern %s ", av[0]);
while (av[i]) DG("and case %s", ((char **)exec->case_pattern)[0]);
DG();
if (ft_strcmp(av[0], ((char **)exec->case_pattern)[0]) == 0)
{ {
if (ft_strcmp(av[i], ((char **)exec->case_pattern)[0]) == 0) exec->attrs |= EXEC_CASE_BRANCH;
{ ft_exec(&(*ast)->right);
exec->attrs |= EXEC_CASE_BRANCH;
ft_exec(&(*ast)->right);
break ;
}
i++;
} }
return (0); return (0);
} }

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 15:47:30 by wescande #+# #+# */ /* Created: 2017/03/07 15:47:30 by wescande #+# #+# */
/* Updated: 2017/03/14 22:55:12 by ariard ### ########.fr */ /* Updated: 2017/03/15 01:50:11 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */ /* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */
/* Updated: 2017/03/14 22:10:56 by ariard ### ########.fr */ /* Updated: 2017/03/15 01:53:18 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/08 03:38:36 by wescande #+# #+# */ /* Created: 2017/03/08 03:38:36 by wescande #+# #+# */
/* Updated: 2017/03/14 00:49:02 by ariard ### ########.fr */ /* Updated: 2017/03/15 01:24:26 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -31,6 +31,6 @@ void *node_copy(void *data)
new->data.cmd.token = ft_ld_copy(old->data.cmd.token, &tab_esc_copy); new->data.cmd.token = ft_ld_copy(old->data.cmd.token, &tab_esc_copy);
} }
if (old->type == TK_FOR || old->type == TK_PAREN_OPEN || old->type == TK_CASE) if (old->type == TK_FOR || old->type == TK_PAREN_OPEN || old->type == TK_CASE)
new->data.cmd.wordlist = ft_ld_copy(old->data.cmd.token, &tab_esc_copy); new->data.cmd.token = ft_ld_copy(old->data.cmd.token, &tab_esc_copy);
return (new); return (new);
} }

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/08 02:37:04 by wescande #+# #+# */ /* Created: 2017/03/08 02:37:04 by wescande #+# #+# */
/* Updated: 2017/03/13 22:31:32 by jhalford ### ########.fr */ /* Updated: 2017/03/15 01:05:43 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -14,7 +14,7 @@
int pfree_list(t_process *p) int pfree_list(t_process *p)
{ {
ft_ld_del(&p->data.d_for.list_word, &ft_tabdel); ft_ld_del(&p->data.d_for.token, &ft_tabdel);
btree_del(&p->data.d_for.content, &ast_free); btree_del(&p->data.d_for.content, &ast_free);
return (0); return (0);
} }

View file

@ -6,25 +6,21 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 19:02:23 by wescande #+# #+# */ /* Created: 2017/03/07 19:02:23 by wescande #+# #+# */
/* Updated: 2017/03/15 00:04:09 by ariard ### ########.fr */ /* Updated: 2017/03/15 01:10:32 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "minishell.h" #include "minishell.h"
static int do_case(t_process *p) static int do_case(t_process *p)
{ {
t_exec *exec; t_exec *exec;
DG("exec case");
exec = &data_singleton()->exec; exec = &data_singleton()->exec;
exec->attrs &= ~EXEC_CASE_BRANCH; exec->attrs &= ~EXEC_CASE_BRANCH;
exec->case_pattern = token_to_argv(p->data.d_case.list_word, 1); exec->case_pattern = token_to_argv(p->data.d_case.token, 1);
/* ft_exec(&p->data.d_if.condition); ft_exec(&p->data.d_if.content);
if (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0")))
{
exec->attrs |= EXEC_IF_BRANCH;
ft_exec(&p->data.d_if.content);
}
return (ft_atoi(ft_getenv(data_singleton()->env, "?")));*/
return (0); return (0);
} }

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 17:34:43 by wescande #+# #+# */ /* Created: 2017/03/07 17:34:43 by wescande #+# #+# */
/* Updated: 2017/03/15 00:03:12 by ariard ### ########.fr */ /* Updated: 2017/03/15 01:57:25 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -19,10 +19,11 @@ static int do_for(t_process *p)
char **av; char **av;
char *var; char *var;
temp = p->data.d_for.list_word; temp = p->data.d_for.token;
var = ((char **)temp->content)[0]; var = ((char **)temp->content)[0];
if (!word_is_assignment(temp->content)) if (!word_is_assignment(temp->content))
return (error_badidentifier(var)); return (error_badidentifier(var));
DG();
temp = temp->next; temp = temp->next;
while (temp) while (temp)
{ {

View file

@ -6,29 +6,12 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 17:20:53 by wescande #+# #+# */ /* Created: 2017/03/07 17:20:53 by wescande #+# #+# */
/* Updated: 2017/03/13 20:28:53 by jhalford ### ########.fr */ /* Updated: 2017/03/15 00:55:31 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "minishell.h" #include "minishell.h"
/*
int exec_while(t_btree **ast)
{
int ret;
DG("exec while condition");
ft_exec(&(*ast)->left);
DG("ret :[%s]", ft_getenv(data_singleton()->env, "?"));
while (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0")))
{
DG("in the while");
ft_exec(&(*ast)->right);
ret = ft_atoi(ft_getenv(data_singleton()->env, "?"));
ft_exec(&(*ast)->left);
}
exit(ret);
return (0);
}
*/
static int do_while(t_process *p) static int do_while(t_process *p)
{ {
int ret; int ret;

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/13 22:21:19 by jhalford #+# #+# */ /* Created: 2017/03/13 22:21:19 by jhalford #+# #+# */
/* Updated: 2017/03/14 22:34:22 by jhalford ### ########.fr */ /* Updated: 2017/03/15 01:52:43 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/05 14:54:45 by jhalford #+# #+# */ /* Created: 2017/03/05 14:54:45 by jhalford #+# #+# */
/* Updated: 2017/03/13 22:40:00 by jhalford ### ########.fr */ /* Updated: 2017/03/15 00:57:31 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 20:36:04 by wescande #+# #+# */ /* Created: 2017/03/07 20:36:04 by wescande #+# #+# */
/* Updated: 2017/03/13 20:31:21 by jhalford ### ########.fr */ /* Updated: 2017/03/15 01:46:29 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -14,7 +14,8 @@
int pset_case(t_process *p, t_btree *ast) int pset_case(t_process *p, t_btree *ast)
{ {
p->data.d_case.list_word = ft_ld_copy(((t_astnode *)ast->item)->data.cmd.wordlist, tab_esc_copy); DG("set case");
p->data.d_case.token = ft_ld_copy(((t_astnode *)ast->item)->data.cmd.token, tab_esc_copy);
p->data.d_case.content = btree_map(ast->right, &node_copy); p->data.d_case.content = btree_map(ast->right, &node_copy);
p->type = PROCESS_CASE; p->type = PROCESS_CASE;
return (0); return (0);

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/07 19:38:05 by wescande #+# #+# */ /* Created: 2017/03/07 19:38:05 by wescande #+# #+# */
/* Updated: 2017/03/13 20:31:21 by jhalford ### ########.fr */ /* Updated: 2017/03/15 01:57:17 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -14,7 +14,7 @@
int pset_for(t_process *p, t_btree *ast) int pset_for(t_process *p, t_btree *ast)
{ {
p->data.d_for.list_word = ft_ld_copy(((t_astnode *)ast->item)->data.cmd.wordlist, tab_esc_copy); p->data.d_for.token = ft_ld_copy(((t_astnode *)ast->item)->data.cmd.token, tab_esc_copy);
p->data.d_for.content = btree_map(ast->right, &node_copy); p->data.d_for.content = btree_map(ast->right, &node_copy);
p->type = PROCESS_FOR; p->type = PROCESS_FOR;
return (0); return (0);

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */ /* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/04 20:42:13 by ariard #+# #+# */ /* Created: 2017/03/04 20:42:13 by ariard #+# #+# */
/* Updated: 2017/03/15 00:46:52 by ariard ### ########.fr */ /* Updated: 2017/03/15 01:09:23 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */ /* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/15 20:49:15 by ariard #+# #+# */ /* Created: 2017/02/15 20:49:15 by ariard #+# #+# */
/* Updated: 2017/03/15 00:45:46 by ariard ### ########.fr */ /* Updated: 2017/03/15 01:35:15 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -17,7 +17,6 @@ t_distrostree g_distrostree[] =
{&superflous_token, &add_null}, {&superflous_token, &add_null},
{&isdir_sep, &add_redir_type}, {&isdir_sep, &add_redir_type},
{&isdir_word, &add_redir_word}, {&isdir_word, &add_redir_word},
{&isloop_condition, &add_loop_condition},
{&isloop, &add_loop_cmd}, {&isloop, &add_loop_cmd},
{&iscondition_branch, &add_branch}, {&iscondition_branch, &add_branch},
{&iscondition, &add_condition_cmd}, {&iscondition, &add_condition_cmd},
@ -60,7 +59,7 @@ static int no_del_token(t_btree **ast, t_list **lst)
return (0); return (0);
if (node->type != TK_DO && node->type != TK_THEN if (node->type != TK_DO && node->type != TK_THEN
&& node->type != CMD && node->type != REDIR && node->type != CMD && node->type != REDIR
&& node->type != TK_ASSIGNMENT_WORD) && node->type != TK_ASSIGNMENT_WORD && node->type != TK_FOR)
return (1); return (1);
} }
return (0); return (0);
@ -73,7 +72,7 @@ int add_cmd(t_btree **ast, t_list **lst)
int i; int i;
i = -1; i = -1;
while (++i < 15) while (++i < 14)
{ {
if (g_distrostree[i].test(ast, lst) == 1) if (g_distrostree[i].test(ast, lst) == 1)
{ {
@ -89,14 +88,18 @@ int add_cmd(t_btree **ast, t_list **lst)
node = (*ast)->item; node = (*ast)->item;
if (token->type == TK_IF) if (token->type == TK_IF)
add_if(ast, lst); add_if(ast, lst);
else if (token->type != TK_WORD) else if (token->type != TK_WORD && token->type != TK_NAME)
node->type = token->type; node->type = token->type;
else if (node->type != TK_CASE && node->type != TK_PAREN_OPEN) else if (node->type != TK_CASE && node->type != TK_PAREN_OPEN && node->type != TK_FOR)
node->type = CMD; node->type = CMD;
if (token->type == TK_WORD || token->type == TK_ASSIGNMENT_WORD) if (token->type == TK_WORD || token->type == TK_ASSIGNMENT_WORD || token->type == TK_NAME)
{
DG("type is %s", read_state(node->type));
ft_ld_pushback(&node->data.cmd.token, ft_ld_pushback(&node->data.cmd.token,
gen_tab(token->data, token->esc, token->esc2, 1)); gen_tab(token->data, token->esc, token->esc2, 1));
if (token->type == TK_WORD) }
if ((token->type == TK_WORD || token->type == TK_NAME)
&& (node->type == TK_CASE || node->type == TK_PAREN_OPEN))
node->pattern = 1; node->pattern = 1;
return (0); return (0);
} }

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */ /* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/17 22:17:14 by ariard #+# #+# */ /* Created: 2017/02/17 22:17:14 by ariard #+# #+# */
/* Updated: 2017/03/13 16:12:35 by ariard ### ########.fr */ /* Updated: 2017/03/15 01:45:34 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -15,12 +15,19 @@
int isloop(t_btree **ast, t_list **lst) int isloop(t_btree **ast, t_list **lst)
{ {
t_astnode *node; t_astnode *node;
t_token *token;
(void)lst;
node = NULL; node = NULL;
token = (*lst)->content;
if (*ast) if (*ast)
{ {
node = (*ast)->item; node = (*ast)->item;
if (node->type == TK_FOR && (token->type == TK_NEWLINE
|| token->type == TK_SEMI) && node->pattern == 0)
return (1);
if (node->type == TK_FOR && (token->type == TK_WORD || token->type == TK_NAME)
&& node->pattern == 0)
return (0);
if ((node->type == TK_NEWLINE || node->type == TK_SEMI if ((node->type == TK_NEWLINE || node->type == TK_SEMI
|| node->type == TK_AMP || node->type == TK_PIPE) || node->type == TK_AMP || node->type == TK_PIPE)
&& isloop(&(*ast)->right, lst) == 1) && isloop(&(*ast)->right, lst) == 1)
@ -79,6 +86,15 @@ int add_loop_cmd(t_btree **ast, t_list **lst)
int add_loop_sep(t_btree **ast, t_list **lst) int add_loop_sep(t_btree **ast, t_list **lst)
{ {
t_astnode *node;
node = NULL;
if (*ast)
{
node = (*ast)->item;
if (node->type == TK_FOR && node->pattern == 0)
return (0);
}
if (!(*ast)->right) if (!(*ast)->right)
return (add_sep(&(*ast)->left, lst)); return (add_sep(&(*ast)->left, lst));
else else

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */ /* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/15 19:12:07 by ariard #+# #+# */ /* Created: 2017/02/15 19:12:07 by ariard #+# #+# */
/* Updated: 2017/03/13 16:25:31 by ariard ### ########.fr */ /* Updated: 2017/03/15 01:41:06 by ariard ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */