/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* lexer.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: sede-san ') { if (str[1] == '>') return (TOKEN_APPEND); return (TOKEN_REDIRECT_OUT); } return (TOKEN_WORD); } static t_token *token_new( t_token_type type, const char *text) { t_token *token; token = (t_token *)malloc(sizeof(t_token)); if (token == NULL) return (NULL); token->type = type; token->value = text; if (token->type == TOKEN_WORD && token->value == NULL) { free(token); return (NULL); } return (token); } static void token_clear( t_token *token) { if (token != NULL) { free(token->value); free(token); } } static t_token *read_token( t_token_type type, const char *line, size_t *i) { const size_t start = *i; size_t end; while (is_meta(line[*i])) (*i)++; end = *i; while (ft_isspace(line[*i])) (*i)++; return (token_new(type, ft_substr(line, start, end - start))); } static t_token *read_word( const char *line, size_t *i) { const size_t start = *i; bool in_single_quote; bool in_double_quote; in_single_quote = false; in_double_quote = false; while (line[*i] != '\0') { char c = line[*i]; (void)c; if (line[*i] == '\'' && !in_double_quote) in_single_quote = !in_single_quote; else if (line[*i] == '"' && !in_single_quote) in_double_quote = !in_double_quote; else if (!in_single_quote && !in_double_quote && (isspace(line[*i]) || is_meta(line[*i]))) break; (*i)++; } return (token_new(TOKEN_WORD, ft_substr(line, start, *i - start))); } static inline bool is_meta(char c) { return (c == '|' || c == '<' || c == '>'); }