diff --git a/inc/minishell.h b/inc/minishell.h index 5aa8ca0..68c4f17 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -207,4 +207,5 @@ t_token *ft_token_next(t_lexer *lexer); t_token *ft_token_new(TokenType type, char *c, int pos); void ft_token_free(t_token *token); void ft_clear_tokenlist(void *content); +t_token *ft_parse_token(t_lexer *lexer); #endif \ No newline at end of file diff --git a/src/tokenizer/lexer.c b/src/tokenizer/lexer.c index 186e612..a8e748c 100644 --- a/src/tokenizer/lexer.c +++ b/src/tokenizer/lexer.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 18:04:07 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:11:48 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:40:27 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,31 +43,38 @@ void ft_lexer_readchar(t_lexer *lexer) lexer->n_pos++; } -char *ft_lexer_readword(t_lexer *lexer) +static char *ft_parse_quotes(t_lexer *lexer) +{ + int start; + int len; + char qc; + char *word; + + qc = lexer->current_char; + word = NULL; + ft_lexer_readchar(lexer); + start = lexer->pos; + while (lexer->current_char != '\0' && lexer->current_char != qc) + ft_lexer_readchar(lexer); + len = lexer->pos - start; + word = malloc(sizeof(char) * len); + ft_strlcpy(word, lexer->input + start, len + 1); + if (lexer->current_char == qc) + ft_lexer_readchar(lexer); + return (word); +} + +char *ft_lexer_readword(t_lexer *lexer) { int start; int len; - char quote; char *word; start = lexer->pos; if (lexer->current_char == '"' || lexer->current_char == '\'') { - quote = lexer->current_char; - ft_lexer_readchar(lexer); - start = lexer->pos; - while (lexer->current_char != '\0' && lexer->current_char != quote) - ft_lexer_readchar(lexer); - if (lexer->current_char == quote) - { - len = lexer->pos - start; - word = malloc(sizeof(char) * len); - ft_strlcpy(word, lexer->input + start, len + 1); - ft_lexer_readchar(lexer); - return (word); - } + return (ft_parse_quotes(lexer)); } - start = lexer->pos; while (ft_isprint(lexer->current_char) && lexer->current_char != '<' && lexer->current_char != '>' && lexer->current_char != '|' && lexer->current_char != '\0') ft_lexer_readchar(lexer); len = lexer->pos - start; diff --git a/src/tokenizer/tokenizer.c b/src/tokenizer/tokenizer.c index a7b4ed8..f60497d 100644 --- a/src/tokenizer/tokenizer.c +++ b/src/tokenizer/tokenizer.c @@ -6,59 +6,40 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:14:50 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:28:00 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -# include "minishell.h" +#include "minishell.h" -t_token *ft_token_next(t_lexer *lexer) +t_token *ft_token_next(t_lexer *lexer) { - t_token *token; - char *word; - int current_pos; + t_token *token; + char *word; + int current_pos; token = NULL; while (ft_isspace(lexer->current_char)) ft_lexer_readchar(lexer); current_pos = lexer->pos; - switch(lexer->current_char) + if (lexer->current_char == '\0') + token = ft_token_new(T_EOF, NULL, current_pos); + else if (lexer->current_char == '<' || lexer->current_char == '>' || lexer->current_char == '|') + token = ft_parse_token(lexer); + else if (ft_isprint(lexer->current_char)) { - case '\0': - token = ft_token_new(T_EOF, NULL, current_pos); - break; - case '|': - token = ft_token_new(T_PIPE, "|", current_pos); - ft_lexer_readchar(lexer); - break; - case '<': - token = ft_token_new(T_REDIRECT_IN, "<", current_pos); - ft_lexer_readchar(lexer); - break; - case '>': - ft_lexer_readchar(lexer); - if (lexer->current_char == '>') - { - token = ft_token_new(T_APPEND_OUT, ">>", current_pos); - ft_lexer_readchar(lexer); - } - else - token = ft_token_new(T_REDIRECT_OUT, ">", current_pos); - break; - default: - if (ft_isprint(lexer->current_char)) - { - word = ft_lexer_readword(lexer); - token = ft_token_new(T_WORD, word, current_pos); - free(word); - } + word = ft_lexer_readword(lexer); + token = ft_token_new(T_WORD, word, current_pos); + free(word); } + else + token = ft_token_new(T_ERROR, NULL, current_pos); return (token); } -void ft_clear_tokenlist(void *content) +void ft_clear_tokenlist(void *content) { - t_token *token; + t_token *token; token = (t_token *)content; ft_token_free(token); diff --git a/src/tokenizer/tokens.c b/src/tokenizer/tokens.c index 7dec144..627347b 100644 --- a/src/tokenizer/tokens.c +++ b/src/tokenizer/tokens.c @@ -6,12 +6,39 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 18:02:56 by qmennen #+# #+# */ -/* Updated: 2025/02/04 18:22:11 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:29:06 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ # include "minishell.h" +t_token *ft_parse_token(t_lexer *lexer) +{ + t_token *token; + + token = NULL; + if (lexer->current_char == '|') + { + token = ft_token_new(T_PIPE, "|", lexer->pos); + } + else if (lexer->current_char == '<') + { + token = ft_token_new(T_REDIRECT_IN, "<", lexer->pos); + } + else if (lexer->current_char == '>' && lexer->input[lexer->pos + 1] == '>') + { + token = ft_token_new(T_APPEND_OUT, ">>", lexer->pos); + ft_lexer_readchar(lexer); + } + else if (lexer->current_char == '>') + { + token = ft_token_new(T_REDIRECT_OUT, ">", lexer->pos); + } + + ft_lexer_readchar(lexer); + return (token); +} + t_token *ft_token_new(TokenType type, char *c, int pos) { t_token *token;