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,
|
QUOTE,
|
||||||
DQUOTE,
|
DQUOTE,
|
||||||
BQUOTE,
|
BQUOTE,
|
||||||
|
DQUOTE_BQUOTE,
|
||||||
BACKSLASH,
|
BACKSLASH,
|
||||||
PAREN,
|
PAREN,
|
||||||
COMMENT,
|
COMMENT,
|
||||||
|
|
|
||||||
|
|
@ -15,23 +15,25 @@
|
||||||
int lexer_bquote(t_list **alst, t_lexer *lexer)
|
int lexer_bquote(t_list **alst, t_lexer *lexer)
|
||||||
{
|
{
|
||||||
t_token *token;
|
t_token *token;
|
||||||
|
int top_state;
|
||||||
|
|
||||||
token = (*alst)->content;
|
token = (*alst)->content;
|
||||||
token->type = TK_WORD;
|
token->type = TK_WORD;
|
||||||
|
token_append(token, lexer, 0, 0);
|
||||||
if (lexer->str[lexer->pos] == '`')
|
if (lexer->str[lexer->pos] == '`')
|
||||||
{
|
{
|
||||||
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));
|
return (lexer_lex(alst, lexer));
|
||||||
}
|
}
|
||||||
lexer->state = WORD;
|
top_state = *(int*)pop(&lexer->stack);
|
||||||
pop(&lexer->stack);
|
lexer->state = top_state == DQUOTE_BQUOTE ? DQUOTE : DEFAULT;
|
||||||
return (lexer_lex(alst, lexer));
|
return (lexer_lex(alst, lexer));
|
||||||
}
|
}
|
||||||
token_append(token, lexer, 0, 0);
|
|
||||||
lexer->pos++;
|
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] == '"')
|
if (lexer->str[lexer->pos] == '"')
|
||||||
{
|
{
|
||||||
lexer->pos++;
|
lexer->pos++;
|
||||||
|
/* if (!(lexer->stack && *(int*)lexer->stack->content != BQUOTE)) */
|
||||||
if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE))
|
if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE))
|
||||||
{
|
{
|
||||||
push(&lexer->stack, DQUOTE);
|
push(&lexer->stack, DQUOTE);
|
||||||
|
|
@ -45,8 +46,8 @@ int lexer_dquote(t_list **alst, t_lexer *lexer)
|
||||||
}
|
}
|
||||||
else if (lexer->str[lexer->pos] == '`')
|
else if (lexer->str[lexer->pos] == '`')
|
||||||
{
|
{
|
||||||
lexer->state = BQUOTE;
|
lexer->state = DQUOTE_BQUOTE;
|
||||||
lexer_bquote(alst, lexer);
|
return (lexer_bquote(alst, lexer));
|
||||||
}
|
}
|
||||||
token_append(token, lexer, 1, 0);
|
token_append(token, lexer, 1, 0);
|
||||||
lexer->pos++;
|
lexer->pos++;
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) =
|
||||||
&lexer_quote,
|
&lexer_quote,
|
||||||
&lexer_dquote,
|
&lexer_dquote,
|
||||||
&lexer_bquote,
|
&lexer_bquote,
|
||||||
|
&lexer_bquote,
|
||||||
&lexer_backslash,
|
&lexer_backslash,
|
||||||
&lexer_paren,
|
&lexer_paren,
|
||||||
&lexer_comment,
|
&lexer_comment,
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,8 @@ char *stack_to_prompt(t_list *stack)
|
||||||
return ("dquote> ");
|
return ("dquote> ");
|
||||||
else if (top == BQUOTE)
|
else if (top == BQUOTE)
|
||||||
return ("bquote> ");
|
return ("bquote> ");
|
||||||
|
else if (top == DQUOTE_BQUOTE)
|
||||||
|
return ("dquote bquote> ");
|
||||||
else if (top == PAREN)
|
else if (top == PAREN)
|
||||||
return ("subsh> ");
|
return ("subsh> ");
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ int token_append(t_token *token, t_lexer *lexer, short int esc, short int esc2)
|
||||||
(token->size >> 3) + 1);
|
(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->esc[len >> 3] |= esc << (7 - len % 8);
|
||||||
token->esc2[len >> 3] |= esc2 << (7 - len % 8);
|
token->esc2[len >> 3] |= esc2 << (7 - len % 8);
|
||||||
return (0);
|
return (0);
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ void token_print(t_list *lst)
|
||||||
type = token->type;
|
type = token->type;
|
||||||
while (type >> (i++ + 2))
|
while (type >> (i++ + 2))
|
||||||
;
|
;
|
||||||
DG("%02i '%s'", i, token->data);
|
DG("%02i:[%s]", i, token->data);
|
||||||
index = -1;
|
index = -1;
|
||||||
lst = lst->next;
|
lst = lst->next;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
|
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/11/28 19:26:32 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)
|
int data_init(void)
|
||||||
{
|
{
|
||||||
t_data *data;
|
t_data *data;
|
||||||
|
char *term_name;
|
||||||
|
|
||||||
data = data_singleton();
|
data = data_singleton();
|
||||||
data->env = ft_sstrdup(environ);
|
data->env = ft_sstrdup(environ);
|
||||||
|
|
|
||||||
|
|
@ -29,9 +29,9 @@ int interactive_shell()
|
||||||
if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH)
|
if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH)
|
||||||
pop(&lexer.stack);
|
pop(&lexer.stack);
|
||||||
ft_strappend(&lexer.str, readline(stack_to_prompt(lexer.stack)));
|
ft_strappend(&lexer.str, readline(stack_to_prompt(lexer.stack)));
|
||||||
DG("[{mag}%s{eoc}]", lexer.str);
|
|
||||||
ltoken = ft_lstlast(token);
|
ltoken = ft_lstlast(token);
|
||||||
lexer_lex((token ? <oken : &token), &lexer);
|
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);
|
token_print(token);
|
||||||
} while (lexer.stack);
|
} while (lexer.stack);
|
||||||
DG("after lexing");
|
DG("after lexing");
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue