diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 78c50f4..9a601b5 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -1,17 +1,33 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* lexer_read_word.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/26 16:13:59 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* lexer_read_word.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ +/* Updated: 2025/02/27 18:47:33 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +static int match_quotes(t_minishell *msh, t_lexer *lexer) +{ + int i; + int qts; + + i = lexer->pos; + qts = 0; + while (lexer->input[i]) + { + if (lexer->input[i] == '\'' || lexer->input[i] == '"') + qts++; + i++; + } + return ((qts % 2) == 0); +} + static char *parse_quotes(t_minishell *msh, t_lexer *lexer) { int start; @@ -28,13 +44,7 @@ static char *parse_quotes(t_minishell *msh, t_lexer *lexer) len = lexer->pos - start; word = malloc_safe(msh, sizeof(char) * len + 1); ft_strlcpy(word, lexer->input + start, len + 1); - if (lexer->current_char == qc) - lexer_readchar(lexer); - else - { - free_safe(msh, (void **)&word); - return (NULL); - } + lexer_readchar(lexer); return (word); } @@ -43,18 +53,19 @@ char *lexer_readword(t_minishell *msh, t_lexer *lexer) int start; int len; char *word; + char c; start = lexer->pos; + if (!match_quotes(msh, lexer)) + return (NULL); if (lexer->current_char == '"' || lexer->current_char == '\'') - { return (parse_quotes(msh, lexer)); - } - while (ft_isprint(lexer->current_char) && lexer->current_char != '<' - && lexer->current_char != '>' && lexer->current_char != '|' - && lexer->current_char != '\0' && !ft_isspace(lexer->current_char) - && lexer->current_char != '"' && lexer->current_char != '\'') + c = lexer->current_char; + while (ft_isprint(c) && c != '<' &&c != '>' && c != '|' && c != '\0' + && !ft_isspace(lexer->current_char)) { lexer_readchar(lexer); + c = lexer->current_char; } len = lexer->pos - start; word = malloc_safe(msh, sizeof(char) * len + 1);