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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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
{
t_ld *list_word;
t_ld *token;
t_btree *content;
};

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;
char **av;
t_exec *exec;
int i;
DG("exec branch case");
exec = &data_singleton()->exec;
if (EXEC_IS_CASE_BRANCH(exec->attrs))
return (0);
node = (*ast)->item;
av = token_to_argv(node->data.cmd.wordlist, 1);
i = 0;
while (av[i])
av = token_to_argv(node->data.cmd.token, 1);
DG("compare pattern %s ", av[0]);
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);
break ;
}
i++;
exec->attrs |= EXEC_CASE_BRANCH;
ft_exec(&(*ast)->right);
}
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}
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);
}

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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)
{
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);
return (0);
}

View file

@ -6,25 +6,21 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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"
static int do_case(t_process *p)
{
t_exec *exec;
DG("exec case");
exec = &data_singleton()->exec;
exec->attrs &= ~EXEC_CASE_BRANCH;
exec->case_pattern = token_to_argv(p->data.d_case.list_word, 1);
/* ft_exec(&p->data.d_if.condition);
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, "?")));*/
exec->case_pattern = token_to_argv(p->data.d_case.token, 1);
ft_exec(&p->data.d_if.content);
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 *var;
temp = p->data.d_for.list_word;
temp = p->data.d_for.token;
var = ((char **)temp->content)[0];
if (!word_is_assignment(temp->content))
return (error_badidentifier(var));
DG();
temp = temp->next;
while (temp)
{

View file

@ -6,29 +6,12 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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"
/*
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)
{
int ret;

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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)
{
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->type = PROCESS_CASE;
return (0);

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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)
{
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->type = PROCESS_FOR;
return (0);

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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},
{&isdir_sep, &add_redir_type},
{&isdir_word, &add_redir_word},
{&isloop_condition, &add_loop_condition},
{&isloop, &add_loop_cmd},
{&iscondition_branch, &add_branch},
{&iscondition, &add_condition_cmd},
@ -60,7 +59,7 @@ static int no_del_token(t_btree **ast, t_list **lst)
return (0);
if (node->type != TK_DO && node->type != TK_THEN
&& node->type != CMD && node->type != REDIR
&& node->type != TK_ASSIGNMENT_WORD)
&& node->type != TK_ASSIGNMENT_WORD && node->type != TK_FOR)
return (1);
}
return (0);
@ -73,7 +72,7 @@ int add_cmd(t_btree **ast, t_list **lst)
int i;
i = -1;
while (++i < 15)
while (++i < 14)
{
if (g_distrostree[i].test(ast, lst) == 1)
{
@ -89,14 +88,18 @@ int add_cmd(t_btree **ast, t_list **lst)
node = (*ast)->item;
if (token->type == TK_IF)
add_if(ast, lst);
else if (token->type != TK_WORD)
else if (token->type != TK_WORD && token->type != TK_NAME)
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;
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,
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;
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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)
{
t_astnode *node;
t_token *token;
(void)lst;
node = NULL;
token = (*lst)->content;
if (*ast)
{
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
|| node->type == TK_AMP || node->type == TK_PIPE)
&& 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)
{
t_astnode *node;
node = NULL;
if (*ast)
{
node = (*ast)->item;
if (node->type == TK_FOR && node->pattern == 0)
return (0);
}
if (!(*ast)->right)
return (add_sep(&(*ast)->left, lst));
else

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */