diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2020-08-29 20:59:22 +0200 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2020-08-29 20:59:22 +0200 |
| commit | d32d5ce8258b1abac1b30f98471f6666ca9dd855 (patch) | |
| tree | 3265b267b5d7e244c2eee5d7af55695d4b59b003 /src/preprocess.c | |
| parent | 1f947c5dfe27a9f7ef5734d4ab16a01317e50fe1 (diff) | |
| download | minishell-d32d5ce8258b1abac1b30f98471f6666ca9dd855.tar.gz minishell-d32d5ce8258b1abac1b30f98471f6666ca9dd855.tar.bz2 minishell-d32d5ce8258b1abac1b30f98471f6666ca9dd855.zip | |
Trying my hardest to refactor the worst code ever produced by mankind
Diffstat (limited to 'src/preprocess.c')
| -rw-r--r-- | src/preprocess.c | 168 |
1 files changed, 87 insertions, 81 deletions
diff --git a/src/preprocess.c b/src/preprocess.c index f58cd37..b33e790 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,7 +6,7 @@ /* By: charles <charles@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/08/28 17:42:02 by charles ### ########.fr */ +/* Updated: 2020/08/29 20:58:37 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -80,10 +80,90 @@ char **st_tokens_to_argv(t_tok_lst *tokens) 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); +} + +size_t interpolate(char *str, size_t i, t_tok_lst **curr_addr, enum e_tok prev_tag, t_env env) +{ + char *match; + size_t var_len; + t_tok_lst *curr; + char *before; + char *after; + size_t len; + t_tok_lst *fields; + t_tok_lst *last; + + curr = *curr_addr; + var_len = utils_var_end(&str[i + 1]); + if ((match = env_search_first_match(env, &str[i + 1])) == NULL) + { + ft_memmove(&str[i], &str[i + var_len], var_len); + return (i); + } + + str[i] = '\0'; + before = str; + after = &str[i + var_len]; + if (curr->tag & TAG_STR_DOUBLE) + { + curr->content = ft_strjoin3(before, match, after); + return i + ft_strlen(match); + } + if (curr->tag & TAG_STR) + { + fields = st_field_split(match); + if (fields == NULL) + return (i); + + last = tok_lst_last(fields); + len = ft_strlen(last->content); + + if (!(prev_tag & TAG_STICK) && *before == '\0' && *fields->content == '\0') + ft_lstpop_front((t_ftlst**)&fields, free); + if (!(curr->tag & TAG_STICK) && *after == '\0' && *last->content == '\0') + ft_lstpop_back((t_ftlst**)&fields, free); + + if (fields == NULL) + ; + else if (fields->next == NULL) + { + curr->content = ft_strjoin3(before, fields->content, after); + return i + len; + } + else + { + last = tok_lst_last(fields); + curr->content = ft_strjoin(before, fields->content); + last->content = ft_strjoin(last->content, after); + + t_tok_lst *tmp = curr->next; + curr->next = fields->next; + (*curr_addr) = last; + (*curr_addr)->next = tmp; + + return len; + } + } + return i; +} + char **preprocess(t_tok_lst **tokens, t_env env) { - t_tok_lst *curr; - enum e_tok prev_tag; + t_tok_lst *curr; + enum e_tok prev_tag; + char *str; + size_t i; prev_tag = 0; curr = *tokens; @@ -91,92 +171,18 @@ char **preprocess(t_tok_lst **tokens, t_env env) { if (curr->tag & (TAG_STR | TAG_STR_DOUBLE)) { - char *str = curr->content; - - size_t i = -1; - while (str[++i] != '\0') + i = -1; + while ((str = curr->content) != NULL && str[++i] != '\0') { - str = curr->content; - // escape - if (str[i] == '\\' - && (curr->tag & TAG_STR - || ((curr->tag & TAG_STR_DOUBLE) && ft_strchr("\\\"$", str[i + 1])))) - { - ft_memmove(&str[i], &str[i + 1], ft_strlen(&str[i + 1]) + 1); + if (escape(str + i, curr->tag)) continue; - } - - // interpolate if (str[i] == '$') - { - char *match; - size_t var_len = utils_var_end(&str[i + 1]); - - if ((match = env_search_first_match(env, &str[i + 1])) == NULL) - { - ft_memmove(&str[i], &str[i + var_len], var_len ); - i--; - continue; - } - - char *before; - char *after; - size_t len; - - str[i] = '\0'; - before = str; - after = &str[i + var_len]; - if (curr->tag & TAG_STR) - { - t_tok_lst *fields = st_field_split(match); - if (fields != NULL) - { - len = ft_strlen(tok_lst_last(fields)->content); - - if (!(prev_tag & TAG_STICK) && *before == '\0' && *fields->content == '\0') - ft_lstpop_front((t_ftlst**)&fields, free); - if (!(curr->tag & TAG_STICK) && *after == '\0' - && *tok_lst_last(fields)->content == '\0') - ft_lstpop_back((t_ftlst**)&fields, free); - - if (fields == NULL) - // delete curr? - ; - else if (fields->next == NULL) - { - curr->content = ft_strjoin3(before, fields->content, after); - i += len - 1; - } - else - { - curr->content = ft_strjoin(before, fields->content); - tok_lst_last(fields)->content = - ft_strjoin(tok_lst_last(fields)->content, after); - - t_tok_lst *tmp = curr->next; - curr->next = fields->next; - curr = tok_lst_last(fields); - curr->next = tmp; - i = len - 1; - str = curr->content; - } - } - /* else */ - /* printf("yo\n"); */ - /* i+=10; */ - } - else if (curr->tag & TAG_STR_DOUBLE) - { - curr->content = ft_strjoin3(before, match, after); - i += ft_strlen(match) - 1; - } - } + 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)); } |
