41 lines
1 KiB
C
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));
|
|
}
|