dquotes->bquotes

This commit is contained in:
Jack Halford 2017-02-10 13:38:49 +01:00
parent 1167a23ca3
commit 0a1fd7e518
9 changed files with 22 additions and 14 deletions

View file

@ -58,6 +58,7 @@ enum e_lexstate
QUOTE,
DQUOTE,
BQUOTE,
DQUOTE_BQUOTE,
BACKSLASH,
PAREN,
COMMENT,

View file

@ -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));
}

View file

@ -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++;

View file

@ -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,

View file

@ -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

View file

@ -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);

View file

@ -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;
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);

View file

@ -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 ? &ltoken : &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");