42-archive/42sh/src/lexer/lexer_dless.c
2017-03-07 18:37:13 +01:00

41 lines
1 KiB
C

#include "minishell.h"
int lexer_dless(t_list **alst, t_lexer *lexer)
{
t_list *heredoc_lst;
t_token *eof_tok;
t_token *heredoc_tok;
(void)alst;
(void)lexer;
heredoc_lst = *(t_list**)lexer->heredoc_stack->content;
heredoc_tok = heredoc_lst->content;
if (!(heredoc_lst->next))
{
ft_dprintf(2, "{red}%s: parse error near `\\n'{eoc}\n", SHELL_NAME);
return (1);
}
eof_tok = heredoc_lst->next->content;
if (!(eof_tok->type == TK_WORD))
{
ft_dprintf(2, "{red}%s: expected word token after <<{eoc}\n", SHELL_NAME);
return (1);
}
DG("heredoc contains [%s]", heredoc_tok->data);
DG("heredoc ends at [%s]", eof_tok->data);
DG("input is [%s]", lexer->str + lexer->pos);
if (ft_strcmp(eof_tok->data, lexer->str + lexer->pos) == 0)
{
pop(&lexer->stack);
pop(&lexer->heredoc_stack);
while (lexer->str[++lexer->pos])
;
ft_strappend(&lexer->str, (char[]){'\n', 0});
lexer->pos++;
return (0);
}
else
while (lexer->str[lexer->pos])
token_append_char(heredoc_tok, lexer->str[lexer->pos++], 0, 0);
return (lexer_end(alst, lexer));
}