clean-up parsing a bit
This commit is contained in:
parent
fc71f3c9ca
commit
b252b01268
@ -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
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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;
|
||||
|
||||
@ -6,59 +6,40 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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);
|
||||
|
||||
@ -6,12 +6,39 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user