diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index 14d04d60..f0405871 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -58,6 +58,7 @@ enum e_lexstate QUOTE, DQUOTE, BQUOTE, + DQUOTE_BQUOTE, BACKSLASH, PAREN, COMMENT, diff --git a/42sh/src/lexer/lexer_bquote.c b/42sh/src/lexer/lexer_bquote.c index af4020b7..e4c003ad 100644 --- a/42sh/src/lexer/lexer_bquote.c +++ b/42sh/src/lexer/lexer_bquote.c @@ -15,23 +15,25 @@ int lexer_bquote(t_list **alst, t_lexer *lexer) { t_token *token; + int top_state; token = (*alst)->content; token->type = TK_WORD; + token_append(token, lexer, 0, 0); if (lexer->str[lexer->pos] == '`') { lexer->pos++; - if (!(lexer->stack && *(int*)lexer->stack->content == BQUOTE)) + if (!(lexer->stack && (*(int*)lexer->stack->content == BQUOTE + || *(int*)lexer->stack->content == DQUOTE_BQUOTE))) { - push(&lexer->stack, BQUOTE); + push(&lexer->stack, lexer->state); return (lexer_lex(alst, lexer)); } - lexer->state = WORD; - pop(&lexer->stack); + top_state = *(int*)pop(&lexer->stack); + lexer->state = top_state == DQUOTE_BQUOTE ? DQUOTE : DEFAULT; return (lexer_lex(alst, lexer)); } - token_append(token, lexer, 0, 0); lexer->pos++; - return (lexer_quote(alst, lexer)); + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_dquote.c b/42sh/src/lexer/lexer_dquote.c index 68157512..36399c62 100644 --- a/42sh/src/lexer/lexer_dquote.c +++ b/42sh/src/lexer/lexer_dquote.c @@ -21,6 +21,7 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) if (lexer->str[lexer->pos] == '"') { lexer->pos++; + /* if (!(lexer->stack && *(int*)lexer->stack->content != BQUOTE)) */ if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE)) { push(&lexer->stack, DQUOTE); @@ -45,8 +46,8 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) } else if (lexer->str[lexer->pos] == '`') { - lexer->state = BQUOTE; - lexer_bquote(alst, lexer); + lexer->state = DQUOTE_BQUOTE; + return (lexer_bquote(alst, lexer)); } token_append(token, lexer, 1, 0); lexer->pos++; diff --git a/42sh/src/lexer/lexer_lex.c b/42sh/src/lexer/lexer_lex.c index 054b03d9..1e9f4a03 100644 --- a/42sh/src/lexer/lexer_lex.c +++ b/42sh/src/lexer/lexer_lex.c @@ -27,6 +27,7 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) = &lexer_quote, &lexer_dquote, &lexer_bquote, + &lexer_bquote, &lexer_backslash, &lexer_paren, &lexer_comment, diff --git a/42sh/src/lexer/stack_to_prompt.c b/42sh/src/lexer/stack_to_prompt.c index 35d83a5c..385ffc89 100644 --- a/42sh/src/lexer/stack_to_prompt.c +++ b/42sh/src/lexer/stack_to_prompt.c @@ -27,6 +27,8 @@ char *stack_to_prompt(t_list *stack) return ("dquote> "); else if (top == BQUOTE) return ("bquote> "); + else if (top == DQUOTE_BQUOTE) + return ("dquote bquote> "); else if (top == PAREN) return ("subsh> "); else diff --git a/42sh/src/lexer/token_append.c b/42sh/src/lexer/token_append.c index b2b00fb3..1b82a8d3 100644 --- a/42sh/src/lexer/token_append.c +++ b/42sh/src/lexer/token_append.c @@ -26,13 +26,13 @@ int token_append(t_token *token, t_lexer *lexer, short int esc, short int esc2) token->esc = (unsigned char *)ft_memrealloc((char *)token->esc, (token->size >> 3), (token->size >> 3) + 1); - token->esc[token->size >> 3] = 0; + token->esc[token->size >> 3] = 0; token->esc2 = (unsigned char *)ft_memrealloc((char *)token->esc2, (token->size >> 3), (token->size >> 3) + 1); - token->esc2[token->size >> 3] = 0; + token->esc2[token->size >> 3] = 0; } - ft_strcat(token->data, (char[2]){c, '\0'}); + ft_strcat(token->data, (char[]){c, 0}); token->esc[len >> 3] |= esc << (7 - len % 8); token->esc2[len >> 3] |= esc2 << (7 - len % 8); return (0); diff --git a/42sh/src/lexer/token_print.c b/42sh/src/lexer/token_print.c index cc644557..7f102fa2 100644 --- a/42sh/src/lexer/token_print.c +++ b/42sh/src/lexer/token_print.c @@ -26,7 +26,7 @@ void token_print(t_list *lst) type = token->type; while (type >> (i++ + 2)) ; - DG("%02i '%s'", i, token->data); + DG("%02i:[%s]", i, token->data); index = -1; lst = lst->next; } diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index 8c11688e..8892b426 100644 --- a/42sh/src/main/data_init.c +++ b/42sh/src/main/data_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 19:26:32 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:23:02 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 16:31:07 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,7 @@ extern char **environ; int data_init(void) { t_data *data; + char *term_name; data = data_singleton(); data->env = ft_sstrdup(environ); diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index a847c100..df8b4f98 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -29,9 +29,9 @@ int interactive_shell() if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH) pop(&lexer.stack); ft_strappend(&lexer.str, readline(stack_to_prompt(lexer.stack))); - DG("[{mag}%s{eoc}]", lexer.str); ltoken = ft_lstlast(token); lexer_lex((token ? <oken : &token), &lexer); + DG("[{mag}%s{eoc}] stack=[%i] state=[%i]", lexer.str, lexer.stack ? *(int*)lexer.stack->content : 0, lexer.state); token_print(token); } while (lexer.stack); DG("after lexing");