diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2020-10-09 16:13:50 +0200 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2020-10-09 16:13:50 +0200 |
| commit | 00bce5ad1d5ac92d20617a9eb2647365bf87cab2 (patch) | |
| tree | aaad5cbb6cdb6372f5809d50cdc65b912695956f /src/preprocess/preprocess.c | |
| parent | e8075fcf93873149593ccd141f99d65a4db40f4f (diff) | |
| download | minishell-00bce5ad1d5ac92d20617a9eb2647365bf87cab2.tar.gz minishell-00bce5ad1d5ac92d20617a9eb2647365bf87cab2.tar.bz2 minishell-00bce5ad1d5ac92d20617a9eb2647365bf87cab2.zip | |
Splitting preprocessing, Added parsed error helper
Diffstat (limited to 'src/preprocess/preprocess.c')
| -rw-r--r-- | src/preprocess/preprocess.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/preprocess/preprocess.c b/src/preprocess/preprocess.c new file mode 100644 index 0000000..03ae203 --- /dev/null +++ b/src/preprocess/preprocess.c @@ -0,0 +1,98 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* preprocess.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles@student.42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 08:58:49 by charles #+# #+# */ +/* Updated: 2020/10/09 15:31:33 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "eval.h" +#include "lexer.h" +#include "minishell.h" + +t_tok_lst *st_stick_tokens(t_tok_lst *tokens) +{ + t_tok_lst *curr; + t_tok_lst *tmp; + + curr = tokens; + while (curr != NULL) + { + if (curr->tag & TAG_STICK && curr->next != NULL) + { + curr->content = ft_strjoinf_fst(curr->content, curr->next->content); + tmp = curr->next->next; + curr->tag = curr->next->tag; + ft_lstdelone((t_ftlst *)curr->next, free); + curr->next = tmp; + continue; + } + curr = curr->next; + } + return (tokens); +} + +char **st_tokens_to_argv(t_tok_lst **tokens) +{ + char **ret; + size_t i; + t_tok_lst *curr; + + curr = *tokens; + ret = ft_calloc(ft_lstsize((t_ftlst *)curr) + 1, sizeof(char *)); + if (ret == NULL) + return (NULL); + i = 0; + while (curr != NULL) + { + ret[i++] = curr->content; + curr = curr->next; + } + tok_lst_destroy(tokens, NULL); + return (ret); +} + +bool escape(char *str, enum e_tok tag) +{ + if (str[0] == '\\' && + (tag & TAG_STR || ((tag & TAG_STR_DOUBLE) + && ft_strchr("\\\"$", str[1])))) + { + ft_memmove(str, str + 1, ft_strlen(str + 1) + 1); + return (true); + } + return (false); +} + +char **preprocess(t_tok_lst **tokens, t_env env) +{ + t_tok_lst *curr; + enum e_tok prev_tag; + char *str; + size_t i; + + prev_tag = 0; + curr = *tokens; + while (curr != NULL) + { + if (curr->tag & (TAG_STR | TAG_STR_DOUBLE)) + { + i = -1; + while ((str = curr->content) != NULL && str[++i] != '\0') + { + if (escape(str + i, curr->tag)) + continue; + if (str[i] == '$') + i = interpolate(str, i, &curr, prev_tag, env) - 1; + } + } + prev_tag = curr->tag; + curr = curr->next; + } + st_stick_tokens(*tokens); + return (st_tokens_to_argv(tokens)); +} |
