/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* parser.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: dkaiser next = ft_lstnew(parse_statement(current_tokens)); current = current->next; } if (current == NULL) return (ft_lstclear(&result, free_node_wrapper), NULL); current_tokens = split_at_first(&tokens, NEWLINE_TOKEN); } return (result); } static t_node *parse_statement(t_token *tokens) { t_token *left_side_tokens; left_side_tokens = split_at_first(&tokens, PIPE_TOKEN); if (left_side_tokens == NULL) { free_tokens(tokens); printf("Parsing error.\n"); return (NULL); } else if (tokens != NULL) { return (new_pipe_node(parse_cmd(left_side_tokens), parse_statement(tokens))); } else { return (parse_cmd(left_side_tokens)); } } t_token *split_at_first(t_token **tokens, int type) { t_token *split; t_token *result; split = find_token_by_type(*tokens, type); if (split == NULL) { result = *tokens; *tokens = NULL; return (result); } result = *tokens; *tokens = split->next; if (result == split) result = NULL; free_token(split); return (result); } static t_token *find_token_by_type(t_token *tokens, int type) { while (tokens != NULL) { if (tokens->type == type) return (tokens); tokens = tokens->next; } return (NULL); } static void free_node_wrapper(void *node) { free_node((t_node *)node); }