From a9cffbe6e3ea82eeca1daadc2bed3ba275b9688b Mon Sep 17 00:00:00 2001 From: Loic Deridder Date: Mon, 17 Feb 2025 09:38:08 +0100 Subject: [PATCH] expander fixes --- srcs/expander/expand_tilde.c | 96 ++++++++------------ srcs/expander/expand_var.c | 135 ----------------------------- srcs/expander/expander_var_utils.c | 60 ------------- 3 files changed, 34 insertions(+), 257 deletions(-) delete mode 100644 srcs/expander/expander_var_utils.c diff --git a/srcs/expander/expand_tilde.c b/srcs/expander/expand_tilde.c index bb92140..5732aa5 100644 --- a/srcs/expander/expand_tilde.c +++ b/srcs/expander/expand_tilde.c @@ -6,87 +6,59 @@ /* By: lderidde +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/07 12:56:32 by lderidde #+# #+# */ -/* Updated: 2025/02/08 13:15:52 by lderidde ### ########.fr */ +/* Updated: 2025/02/17 09:30:24 by lderidde ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../includes/minishell.h" +#include -static int get_nw_len(t_ast_n *node, int j) +void expander_tilde(t_ast_n *node, int j, int i, char *str) { - int i; - int len; - - i = -1; - len = ft_strlen(node->args[j]); - while (node->args[j][++i]) - { - if (node->args[j][i] == '~') - { - len += ft_strlen(get_var_value("HOME", node->msh->env)) - 1; - } - } - return (len); -} - -size_t ft_astrlcat(char *dst, const char *src, size_t dstsize) -{ - size_t dst_len; - size_t src_len; - size_t i; - - if (!dst || !src) - return (0); - dst_len = ft_strlen(dst); - src_len = ft_strlen(src); - if (dstsize <= dst_len) - return (dstsize + src_len); - i = -1; - while (src[++i] && (dst_len + i) < (dstsize - 1)) - dst[dst_len + i] = src[i]; - dst[dst_len + i] = '\0'; - return (dst_len + src_len); -} - -void expander_tilde(t_ast_n *node, int j) -{ - int i; - int len; - int save; char *new; + char *ret; + char *var; + int k; + int l; - i = -1; - len = get_nw_len(node, j); - new = ft_calloc(len + 1, sizeof(char)); + k = i; + var = get_var_value("HOME", node->msh->env); + new = ft_calloc(ft_strlen(str) + ft_strlen(var), 1); if (!new) return ; - save = len; - len = 0; - while (++i < save) - { - if (node->args[j][len] != '~') - new[i] = node->args[j][len++]; - else - { - ft_astrlcat(new, get_var_value("HOME", node->msh->env), -1); - i = ft_strlen(new) - 1; - len++; - } - } + ret = new; + l = -1; + while (++l < i) + *new++ = node->args[j][l]; + ft_strlcat(new, var, -1); + ft_strlcat(new, &node->args[j][++i], -1); ft_free(&node->args[j]); - node->args[j] = new; + node->args[j] = ret; } int expand_tilde(t_ast_n *node, int j) { - int i; + int i; + bool in_squote; + bool in_dquote; + int ret; i = 0; + ret = 0; + in_squote = false; + in_dquote = false; while (node->args[j][i]) { - if (node->args[j][i] == '~') - return (expander_tilde(node, j), 1); + if (node->args[j][i] == '"' && !in_squote) + in_dquote = !in_dquote; + else if (node->args[j][i] == '\'' && !in_dquote) + in_squote = !in_squote; + else if (node->args[j][i] == '~' && !in_squote) + { + ret = 1; + expander_tilde(node, j, i, node->args[j]); + } i++; } - return (0); + return (ret); } diff --git a/srcs/expander/expand_var.c b/srcs/expander/expand_var.c index 10c74a1..3ced7d1 100644 --- a/srcs/expander/expand_var.c +++ b/srcs/expander/expand_var.c @@ -14,112 +14,6 @@ #include #include -// static int get_var_len(t_ast_n *node, int j, int *i) -// { -// int len; -// int ret; -// char *str; -// -// len = *i + 1; -// while (node->args[j][len] && is_exvalidchar(node->args[j][len])) -// len++; -// str = ft_substr(node->args[j], *i + 1, (size_t)len - (*i + 1)); -// *i = len; -// ret = ft_strlen(get_var_value(str, node->msh->env)); -// ft_free(&str); -// return (ret - (len - (*i + 1))); -// } -// -// static char *extract_env(char *str, char **envp) -// { -// int i; -// char *var; -// char *tmp; -// -// i = 1; -// tmp = NULL; -// while (str[i] && is_exvalidchar(str[i])) -// i++; -// if (i > 1) -// tmp = ft_substr(str, 1, i - 1); -// var = get_var_value(tmp, envp); -// free(tmp); -// return (var); -// } -// -// int get_new_len(t_ast_n *node, int j) -// { -// int i; -// int len; -// char *itoa; -// -// i = 0; -// len = ft_strlen(node->args[j]); -// while (node->args[j][i]) -// { -// if (node->args[j][i] == '$' && (node->args[j][i + 1] -// && node->args[j][i + 1] == '?') -// && !in_squote(node->args[j], &node->args[j][i])) -// { -// itoa = ft_itoa(node->msh->ex_code); -// len += ft_strlen(itoa) - 2; -// free(itoa); -// } -// else if (node->args[j][i] == '$' && -// !in_squote(node->args[j], &node->args[j][i])) -// { -// len += get_var_len(node, j, &i); -// i--; -// } -// i++; -// } -// return (len); -// } -// -// void expander_var(t_ast_n *nd, int j) -// { -// int i; -// int k; -// int len; -// char *new; -// -// i = -1; -// new = create_new(nd, j, &len); -// if (!new) -// return ; -// k = 0; -// while (nd->args[j][k] && ++i < len) -// { -// if (nd->args[j][k] != '$' || in_squote(nd->args[j], &nd->args[j][k])) -// new[i] = nd->args[j][k++]; -// else if (expand_exit(nd, j, k)) -// cat_exit(nd, &new, &i, &k); -// else if (valid_expand(nd, j, k)) -// { -// ft_strlcat(new, extract_env(&nd->args[j][k], nd->msh->env), -1); -// i = ft_strlen(new) - 1; -// while (nd->args[j][++k] && is_exvalidchar(nd->args[j][k])) -// continue ; -// } -// } -// handle_copy(nd, j, &new); -// } -// -// int expand_var(t_ast_n *node, int j) -// { -// int i; -// -// i = 0; -// while (node->args[j][i]) -// { -// if (node->args[j][i] == '$' && -// !in_squote(node->args[j], &node->args[j][i])) -// return (expander_var(node, j), 1); -// i++; -// } -// return (0); -// } - static int get_var_len(t_ast_n *node, int j, int *i) { int len; @@ -153,35 +47,6 @@ static char *extract_env(char *str, char **envp) return (var); } -// int get_new_len(t_ast_n *node, int j) -// { -// int i; -// int len; -// char *itoa; -// -// i = 0; -// len = ft_strlen(node->args[j]); -// while (node->args[j][i]) -// { -// if (node->args[j][i] == '$' && (node->args[j][i + 1] -// && node->args[j][i + 1] == '?') -// && !in_squote(node->args[j], &node->args[j][i])) -// { -// itoa = ft_itoa(node->msh->ex_code); -// len += ft_strlen(itoa) - 2; -// free(itoa); -// } -// else if (node->args[j][i] == '$' && -// !in_squote(node->args[j], &node->args[j][i])) -// { -// len += get_var_len(node, j, &i); -// i--; -// } -// i++; -// } -// return (len); -// } -// void expander_var(t_ast_n *nd, int j, int i) { char *new; diff --git a/srcs/expander/expander_var_utils.c b/srcs/expander/expander_var_utils.c deleted file mode 100644 index bc18928..0000000 --- a/srcs/expander/expander_var_utils.c +++ /dev/null @@ -1,60 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* expander_var_utils.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: lderidde +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/12 09:17:28 by lderidde #+# #+# */ -/* Updated: 2025/02/12 11:01:55 by lderidde ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "../../includes/minishell.h" - -int expand_exit(t_ast_n *node, int j, int k) -{ - if (node->args[j][k] == '$' && (node->args[j][k + 1] - && node->args[j][k + 1] == '?') - && !in_squote(node->args[j], &node->args[j][k])) - { - return (1); - } - return (0); -} - -int valid_expand(t_ast_n *node, int j, int k) -{ - if (node->args[j][k] == '$' && exvalid_next(node->args[j][k + 1]) - && !in_squote(node->args[j], &node->args[j][k])) - { - return (1); - } - return (0); -} - -char *create_new(t_ast_n *node, int j, int *len) -{ - char *new; - - *len = get_new_len(node, j); - new = ft_calloc(*len + 1, sizeof(char)); - return (new); -} - -void handle_copy(t_ast_n *node, int j, char **new) -{ - ft_free(&node->args[j]); - node->args[j] = *new; -} - -void cat_exit(t_ast_n *node, char **new, int *i, int *k) -{ - char *itoa; - - itoa = ft_itoa(node->msh->ex_code); - ft_strlcat(*new, itoa, -1); - *i = ft_strlen(*new) - 1; - *k += 2; - free(itoa); -}