diff --git a/inc/expander.h b/inc/expander.h index 4d22de6..b926783 100644 --- a/inc/expander.h +++ b/inc/expander.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/18 19:00:51 by qmennen #+# #+# */ -/* Updated: 2025/02/18 19:05:14 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 20:40:04 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,8 @@ #include "minishell.h" + +size_t expander_count_vars(const char *s); char *expander_parse_string(char *s, t_minishell *minishell); #endif diff --git a/src/expander/expander.c b/src/expander/expander.c index bf8a6eb..8307e2c 100644 --- a/src/expander/expander.c +++ b/src/expander/expander.c @@ -6,89 +6,58 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:31:36 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 21:04:00 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ +#include "environment.h" +#include "libft.h" #include "minishell.h" -#include +#include "typedef.h" -static size_t len_prefix(const char *s) +static size_t len_var_name(const char *s, int idx) { size_t i; i = 0; - while (s[i] != '$' && s[i]) + while (s[idx + i] && ft_isalpha(s[idx + i])) i++; return (i); } -static size_t len_var_name(const char *s) +t_environment *get_var(const char *s, int idx, t_minishell *minishell) { - size_t start; - size_t i; + int i; + t_environment *env; + char *name; - start = len_prefix(s); - if (start == ft_strlen(s)) - return (0); - start++; i = 0; - while (s[start + i] && !ft_isspace(s[start + i])) + while (s[idx + i] && ft_isalpha(s[idx + i])) i++; - return (i); -} - -static char *get_env_value(char *s) -{ - int start; - - start = 0; - while (s[start] != '$' && s[start]) - start++; - if (s[start] != '$' || !s[start + 1]) - return (NULL); - start++; - return ft_substr(s, start, len_var_name(s)); -} - -static char *expand_string(char *s, t_environment *env) -{ - char *s1; - char *s2; - char *s3; - char *final_str; - - final_str = ft_calloc(1, ft_strlen(env->value) + ft_strlen(s) - len_var_name(s)); - if (!final_str) - { - perror("malloc"); - exit(EXIT_FAILURE); - } - s1 = ft_substr(s, 0, len_prefix(s)); - s2 = ft_strdup(env->value); - s3 = ft_substr(s, len_prefix(s) + 1 + len_var_name(s),len_prefix(s) + len_var_name(s) - ft_strlen(s)); - if (!s1 || !s2 || !s3) - perror("expand"); - return (ft_strjoin(ft_strjoin(s1, s2), s3)); + name = ft_substr(s, idx, i); + if (!name) + perror("name"); + env = environment_get(minishell->environment, name); + free(name); + return (env); } char *expander_parse_string(char *s, t_minishell *minishell) { - size_t l1; - char *result; - char *name; + int i; t_environment *env; + t_list *var_list; - l1 = len_prefix(s); - if (l1 == ft_strlen(s)) - return (ft_strdup(s)); - name = get_env_value(s); - if (!name) - return (ft_strdup("")); - env = environment_get(minishell->environment, name); - if (!env) - return (ft_strdup("")); - result = expand_string(s, env); - free(name); - return (result); + i = 0; + while (s[i]) + { + if (s[i] == '$') + { + env = get_var(s, i, minishell); + if (env) + ft_lstadd_back(&var_list, ft_lstnew(env->value)); + } + i++; + } + return ft_strdup(""); } diff --git a/src/expander/expander_count_vars.c b/src/expander/expander_count_vars.c new file mode 100644 index 0000000..eceae4c --- /dev/null +++ b/src/expander/expander_count_vars.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander_count_vars.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/18 20:38:17 by qmennen #+# #+# */ +/* Updated: 2025/02/18 20:39:53 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +size_t expander_count_vars(const char *s) +{ + size_t vars; + size_t i; + + i = 0; + vars = 0; + while (s[i]) + { + if (s[i] == '$' && ft_isalpha(s[i + 1])) + vars++; + i++; + } + return (vars); +}