From 41b42d88033bfd2655433ed8d930acb87ddd9353 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Mon, 27 Mar 2017 18:20:25 +0200 Subject: [PATCH] lexer_bang and lexer_dquote --- 42sh/Makefile | 1 + 42sh/includes/lexer.h | 4 +++- 42sh/src/completion/c_match.c | 4 ++-- 42sh/src/lexer/get_state_global.c | 5 +++-- 42sh/src/lexer/lexer_bang.c | 31 +++++++++++++++++++++++++++++++ 42sh/src/lexer/lexer_dquote.c | 4 ++-- 42sh/src/lexer/lexer_lex.c | 3 ++- 42sh/src/lexer/lexer_sep.c | 2 +- 8 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 42sh/src/lexer/lexer_bang.c diff --git a/42sh/Makefile b/42sh/Makefile index 181c8a0a..ada05fc1 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -226,6 +226,7 @@ lexer/insert_newline.c\ lexer/isrw_delim.c\ lexer/keep_last_type.c\ lexer/lexer_backslash.c\ +lexer/lexer_bang.c\ lexer/lexer_bquote.c\ lexer/lexer_curly_braces.c\ lexer/lexer_default.c\ diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index 93fa6b49..f52902bb 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 12:15:50 by jhalford #+# #+# */ -/* Updated: 2017/03/23 15:18:36 by jhalford ### ########.fr */ +/* Updated: 2017/03/27 18:17:39 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,6 +24,7 @@ enum e_lexstate HEREDOC, NEWLINE, DELIM, + BANG, SEP, WORD, NUMBER, @@ -99,6 +100,7 @@ int lexer_default(t_list **alst, t_lexer *lexer); int lexer_newline(t_list **alst, t_lexer *lexer); int lexer_heredoc(t_list **alst, t_lexer *lexer); int lexer_delim(t_list **alst, t_lexer *lexer); +int lexer_bang(t_list **alst, t_lexer *lexer); int lexer_sep(t_list **alst, t_lexer *lexer); int lexer_word(t_list **alst, t_lexer *lexer); int lexer_number(t_list **alst, t_lexer *lexer); diff --git a/42sh/src/completion/c_match.c b/42sh/src/completion/c_match.c index 36adb113..602462c1 100644 --- a/42sh/src/completion/c_match.c +++ b/42sh/src/completion/c_match.c @@ -6,7 +6,7 @@ /* By: alao +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/10/15 13:27:14 by alao #+# #+# */ -/* Updated: 2017/03/27 17:48:25 by gwojda ### ########.fr */ +/* Updated: 2017/03/27 18:10:25 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ static int c_is_delim(char c) return (0); } -char *c_strdupi(char *s, int (*f)(char)) +char *c_strdupi(char *s, int (*f)(char)) { int i; char *str; diff --git a/42sh/src/lexer/get_state_global.c b/42sh/src/lexer/get_state_global.c index aa08fe4e..12796d40 100644 --- a/42sh/src/lexer/get_state_global.c +++ b/42sh/src/lexer/get_state_global.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 20:39:06 by jhalford #+# #+# */ -/* Updated: 2017/03/24 14:51:00 by jhalford ### ########.fr */ +/* Updated: 2017/03/27 18:13:03 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,7 +24,8 @@ t_lexstate get_state_global(t_lexer *lexer) cl = lexer->pos ? lexer->str[lexer->pos - 1] : 0; ret = 0; if ((ft_is_delim(c) && (ret = DELIM)) - || ((c == '&' || c == ';' || c == '|' || c == '!') && (ret = SEP)) + || ((c == '&' || c == ';' || c == '|') && (ret = SEP)) + || ((c == '!') && (ret = BANG)) || ((c == '\\') && (ret = BACKSLASH)) || ((c == '\n') && (ret = NEWLINE)) || ((c == '\'') && (ret = QUOTE)) diff --git a/42sh/src/lexer/lexer_bang.c b/42sh/src/lexer/lexer_bang.c new file mode 100644 index 00000000..14042405 --- /dev/null +++ b/42sh/src/lexer/lexer_bang.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_bang.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/27 18:12:03 by jhalford #+# #+# */ +/* Updated: 2017/03/27 18:18:55 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int lexer_bang(t_list **alst, t_lexer *lexer) +{ + t_token *token; + + token = (*alst)->content; + if (token->type) + { + token->type = TK_BANG; + lexer->state = DEFAULT; + lexer->pos++; + return (lexer_lex(&(*alst)->next, lexer)); + } + token->type = TK_WORD; + lexer->state = WORD; + lexer->pos++; + return (lexer_lex(alst, lexer)); +} diff --git a/42sh/src/lexer/lexer_dquote.c b/42sh/src/lexer/lexer_dquote.c index 51e50643..0c9f7e9b 100644 --- a/42sh/src/lexer/lexer_dquote.c +++ b/42sh/src/lexer/lexer_dquote.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 18:36:58 by jhalford #+# #+# */ -/* Updated: 2017/03/24 16:08:35 by gwojda ### ########.fr */ +/* Updated: 2017/03/27 18:19:57 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) else push(&lexer->stack, DQUOTE); } - else if (lexer->str[lexer->pos] == '\\') + else if (lexer->str[lexer->pos] == '\\' && lexer->str[lexer->pos + 1] == 0) { lexer->pos++; if (lexer->str[lexer->pos] == 0) diff --git a/42sh/src/lexer/lexer_lex.c b/42sh/src/lexer/lexer_lex.c index 53cec923..180a01c9 100644 --- a/42sh/src/lexer/lexer_lex.c +++ b/42sh/src/lexer/lexer_lex.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 17:08:51 by jhalford #+# #+# */ -/* Updated: 2017/03/22 18:13:29 by jhalford ### ########.fr */ +/* Updated: 2017/03/27 18:13:01 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,7 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) = &lexer_heredoc, &lexer_newline, &lexer_delim, + &lexer_bang, &lexer_sep, &lexer_word, &lexer_number, diff --git a/42sh/src/lexer/lexer_sep.c b/42sh/src/lexer/lexer_sep.c index b7a5c67f..c0e1745f 100644 --- a/42sh/src/lexer/lexer_sep.c +++ b/42sh/src/lexer/lexer_sep.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 16:29:57 by jhalford #+# #+# */ -/* Updated: 2017/03/20 15:23:35 by jhalford ### ########.fr */ +/* Updated: 2017/03/27 18:11:51 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */