minishell/tokenizer/tokenizer_heredoc_helper.c
2025-06-04 14:58:04 +02:00

80 lines
2.5 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* tokenizer_heredoc_helper.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: vvobis <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/08/23 14:23:44 by vvobis #+# #+# */
/* Updated: 2024/08/26 12:34:09 by vvobis ### ########.fr */
/* */
/* ************************************************************************** */
#include "../minishell.h"
t_token mark_tokens_till_heredoc(char *value, char **input)
{
uint32_t value_length;
t_token token;
*(*input)++ = 0;
token.token_value = *input;
token.token_type = TOKEN_WORD;
if (!value)
return (token);
value_length = 0;
while (value[value_length] && !ft_isspace(value[value_length]) \
&& (!is_special_char(value[value_length]) || value[value_length] == '$'))
value_length++;
remove_qoutes_delimiter(value, &value_length);
while (**input)
{
if (*(*input)++ == '\n')
if (ft_strncmp(value, *input, value_length) == 0 \
&& (*(*input + value_length) == '\n' \
|| *(*input + value_length) == '\0'))
return (*input += value_length, token);
}
return (token);
}
void ring_buffer_put(t_ring_buffer *buffer, t_token *entry)
{
if (buffer->write + 1 == buffer->read)
buffer->read++;
buffer->buffer[buffer->write++] = entry;
buffer->write %= buffer->buffer_capacity;
}
t_token *ring_buffer_get(t_ring_buffer *buffer)
{
t_token *entry;
if (buffer->read == buffer->write)
return (NULL);
entry = buffer->buffer[buffer->read++];
buffer->read %= buffer->buffer_capacity;
return (entry);
}
void tokenizing_loop(char **input, \
t_token *tokens, \
uint32_t *i, \
t_ring_buffer *heredoc_buffer)
{
while (ft_isspace(**input) || **input == ';')
{
if (**input == '\n')
{
tokens[++*i].token_type = TOKEN_NEWLINE;
while (heredoc_buffer->read != heredoc_buffer->write)
tokens[++*i] = mark_tokens_till_heredoc(\
ring_buffer_get(heredoc_buffer)[1].token_value, input);
}
else if (**input == ';')
tokens[++(*i)].token_type = TOKEN_SEMICOLON;
if (**input)
*(*input)++ = 0;
}
}