minishell/src/lexer/lexer_read_word.c

102 lines
2.3 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* lexer_read_word.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */
/* Updated: 2025/03/18 16:23:02 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
static int is_word_char(char c)
{
if (c == '<' || c == '>' || c == '|' || c == '\0')
return (0);
else if (c == '\'' || c == '"')
return (0);
else if (ft_isspace(c))
return (0);
return (ft_isprint(c));
}
static int calculate_word_len(t_lexer *lexer)
{
int i;
int len;
len = 1;
i = lexer->pos;
while (is_word_char(lexer->input[i]))
{
len++;
i++;
}
return (len);
}
char *read_word(t_minishell *msh, t_lexer *lexer, int len)
{
char c;
char *dest;
int i;
dest = malloc_safe(msh, sizeof(char) * len);
c = lexer->current_char;
i = 0;
while (is_word_char(c))
{
dest[i++] = lexer->current_char;
lexer_readchar(lexer);
c = lexer->current_char;
}
dest[i] = 0;
return (dest);
}
int match_quotes(t_lexer *lexer)
{
char c;
int i;
int sq;
int dq;
sq = 0;
dq = 0;
i = lexer->pos;
c = lexer->current_char;
while (c && !ft_isspace(c) && !(c == '>' || c == '<' || c == '|'))
{
c = lexer->input[i];
if (c == '\'')
sq++;
else if (c == '"')
dq++;
i++;
}
if (sq == 0 && dq == 0)
return (1);
return (dq % 2 == 0 && sq % 2 == 0);
}
char *lexer_readword(t_minishell *msh, t_lexer *lexer)
{
int len;
int qts;
char *word;
char c;
c = lexer->current_char;
qts = (c == '"' || c == '\'');
if (qts)
return (lexer_parse_quotes(msh, lexer));
if (!match_quotes(lexer))
return (NULL);
len = calculate_word_len(lexer);
word = read_word(msh, lexer, len);
return (word);
}