/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* parse_if.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/05 23:15:23 by ariard #+# #+# */ /* Updated: 2017/02/05 23:57:18 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #include "parser.h" static int parse_after_condition(t_btree **ast, t_list **start, t_list **lst) { t_list *temp; t_list *del; t_token *token; int nest; temp = (*lst); nest = 0; while ((temp = temp->next)) { token = temp->content; if (token->type & TK_THEN) nest++; else if (token->type & TK_FI) nest--; if (nest == 0 && (token->type & TK_FI)) break; } del = temp; temp = temp->next; del->next = NULL; ft_lst_delif(start, del->content, &ft_addrcmp, &token_free); if (temp) ft_parse(ast, &temp); return (0); } static int parse_head(t_btree **ast, t_btree **new_ast, t_list **start, t_list **lst) { t_btree *father; t_token *token; t_list *del; t_astnode *node; t_astnode item; father = *ast; while (father->left) father = father->left; *new_ast = btree_create_node(&item, sizeof(item)); ((t_astnode *)(*new_ast)->item)->data.token = NULL; node = (*ast)->item; if (node->type > 0) father->left = *new_ast; else *new_ast = *ast; token = (*lst)->content; node = (*new_ast)->item; node->type = token->type; del = (*lst); *lst = (*lst)->next; ft_lst_delif(start, del->content, &ft_addrcmp, &token_free); delete_newline(start, lst); return (0); } static int parse_loop(t_btree **ast, t_list **start, t_list **lst) { t_token *token; t_list *temp; t_list *new_start; int nest; nest = 0; while ((*lst)->next) *lst = (*lst)->next; new_start = *start; ft_lst_reverse(start); temp = *lst; while ((*lst)) { token = (*lst)->content; if (token->type & TK_THEN) nest++; else if (token->type & TK_FI) nest--; if (nest == 1 && (token->type & TK_THEN)) break; *lst = (*lst)->next; } ft_lst_reverse(&temp); temp = (*lst)->next; (*lst)->next = NULL; ft_lst_delif(&new_start, (*lst)->content, &ft_addrcmp, &token_free); delete_newline(start, &temp); ft_parse(&(*ast)->right, &temp); ft_parse(&(*ast)->left, &new_start); return (0); } int parse_if(t_btree **ast, t_list **start, t_list **lst) { t_btree *new_ast; parse_after_condition(ast, start, lst); parse_head(ast, &new_ast, start, lst); parse_loop(&new_ast, start, lst); return (0); }