/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ms_ext.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/25 18:21:47 by tmaze #+# #+# */ /* Updated: 2019/11/10 15:55:39 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" t_env *search_key(t_env *env, char *cmd, int index) { t_env *it; int i; int j; it = env; while (it && cmd[index + 2]) { i = 0; j = index; while (it->key[i] && cmd[j] && cmd[j] != '}' && it->key[i] == cmd[j]) { i++; j++; } if (!it->key[i] && cmd[j] == '}') return (it); it = it->next; } return (NULL); } char **res_ext(char **argv, t_env *env) { int i; int j; int k; int res_len; t_env *elem; char *ret; k = 0; while (argv && argv[k]) { i = 0; while (argv[k] && argv[k][i]) { if (i == 0 && argv[k][i] == '~' && ft_envgetelem("HOME", env)) { res_len = ft_strlen(argv[k]) - 1 + ft_strlen(ft_envgetelem("HOME", env)->val); if ((ret = ft_strnew(res_len)) != NULL) { ft_strcpy(ret, ft_envgetelem("HOME", env)->val); if (ret[ft_strlen(ret) - 1] != '/') ft_strcat(ret, "/"); ft_strcat(ret, argv[k] + 1); ft_strdel(&(argv[k])); argv[k] = ret; i = ft_strlen(ft_envgetelem("HOME", env)->val); } else { ft_printf("minishell: memory error\n"); return (NULL); } } else if (argv[k][i] == '$' && argv[k][i + 1] && argv[k][i + 1] == '{') { j = i + 1; while (argv[k][j] && argv[k][j] != '}') j++; if (!argv[k][j]) { ft_printf("minishell: missing }\n"); return (NULL); } else if ((elem = search_key(env, argv[k], i + 2)) != NULL) { if ((ret = ft_strnew(i + ft_strlen(argv[k]) - j + ft_strlen(elem->val))) != NULL) { ft_strncpy(ret, argv[k], i); ft_strcat(ret, elem->val); ft_strcat(ret, argv[k] + j + 1); ft_strdel(&(argv[k])); argv[k] = ret; } else { ft_printf("minishell: memory error\n"); return (NULL); } } else { ft_printf("minishell: variable %*s not found\n", j - i - 1, argv[k] + i + 2); return (NULL); } } i++; } k++; } return (argv); }