/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ms_env.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/09/20 11:43:53 by tmaze #+# #+# */ /* Updated: 2019/11/10 20:49:35 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" void ft_envdelelem(t_env **elem) { if (elem) { ft_strdel(&((*elem)->key)); ft_strdel(&((*elem)->val)); ft_memdel((void**)elem); } } void ft_envdel(t_env **env) { t_env *tmp; while (*env) { tmp = *env; *env = (*env)->next; ft_envdelelem(&tmp); } } t_env *ft_envnew(char *env) { t_env *ret; int i; i = 0; ret = NULL; while (env[i] && env[i] != '=') i++; if (env[i] == '=' && (ret = (t_env*)ft_memalloc(sizeof(t_env))) != NULL) if ((ret->val = ft_strsub(env, i + 1, ft_strlen(env) - i - 1)) == NULL || (ret->key = ft_strsub(env, 0, i)) == NULL) ft_envdelelem(&ret); return (ret); } t_env *ft_envaddend(t_env **alst, t_env *new) { t_env *tmp; if (new == NULL) return (NULL); if (*alst == NULL) *alst = new; else { tmp = *alst; while (tmp->next) tmp = tmp->next; tmp->next = new; } return (*alst); } t_env *ft_envgetelem(char *key, t_env *env) { t_env *it; it = env; while (it && !ft_strequ(it->key, key)) it = it->next; return (it); } char *ft_envtochar(t_env *env) { int size; char *ret; size = ft_strlen(env->key) + ft_strlen(env->val) + 1; if ((ret = ft_strnew(size)) != NULL) { ft_strlcpy(ret, env->key, size); ft_strlcat(ret, "=", size); ft_strlcat(ret, env->val, size); } return (ret); } char **ft_envtotab(t_env *env) { t_env *it; char *new; char **ret; int i; i = 0; ret = NULL; it = env; while (it && (++i)) it = it->next; if ((ret = (char**)ft_memalloc(sizeof(char*) * (i + 1))) == NULL) return (NULL); it = env; i = 0; while (it) { if ((new = ft_envtochar(it)) == NULL) ft_del_words_tables(&ret); if (new == NULL) break ; ret[i++] = new; it = it->next; } return (ret); } char *ft_envupdate(char *key, t_env *env, char *val) { t_env *elem; char *new; new = NULL; if ((elem = ft_envgetelem(key, env)) != NULL) if ((new = ft_strdup(val)) != NULL) { ft_strdel(&elem->val); elem->val = new; } return (new); } void ft_envclean(t_env **env) { t_env **it; t_env *tmp; it = env; while (*it) { if (ft_strequ((*it)->val, "")) { tmp = *it; *it = tmp->next; ft_envdelelem(&tmp); } else it = &((*it)->next); } }