dquotes->bquotes
This commit is contained in:
parent
1167a23ca3
commit
0a1fd7e518
9 changed files with 22 additions and 14 deletions
|
|
@ -58,6 +58,7 @@ enum e_lexstate
|
|||
QUOTE,
|
||||
DQUOTE,
|
||||
BQUOTE,
|
||||
DQUOTE_BQUOTE,
|
||||
BACKSLASH,
|
||||
PAREN,
|
||||
COMMENT,
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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++;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Reference in a new issue