diff --git a/srcs/cmd_cd.c b/srcs/cmd_cd.c index 5bcff10..c342976 100644 --- a/srcs/cmd_cd.c +++ b/srcs/cmd_cd.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/07 16:44:40 by tmaze #+# #+# */ -/* Updated: 2019/01/25 16:36:51 by tmaze ### ########.fr */ +/* Updated: 2019/01/26 16:58:39 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -94,7 +94,7 @@ char *ft_realpath(char *r_path, char **a_path) if (strcmp == 0 && i != 0) ft_strdel(&(tab_path[j])); while (tab_path[++j]) - tab_path[j - (strcmp == 0 && i != 0) ? 2 : 1)] = tab_path[j]; + tab_path[j - ((strcmp == 0 && i != 0) ? 2 : 1)] = tab_path[j]; if (strcmp == 0 && i != 0) tab_path[j - 2] = NULL; tab_path[j - 1] = NULL; @@ -139,22 +139,20 @@ int cmd_cd_core(char *path, t_list **env) return (0); } -char cd_getparams(char **argv) +char cd_getparams(char **argv, size_t *i) { char ret; - size_t i; size_t j; - i = 0; - ret = 'N'; - while (argv[++i] && argv[i][0] == '-' && ft_strlen(argv[i]) > 1) + ret = 'L'; + while (argv[++*i] && argv[*i][0] == '-' && ft_strlen(argv[*i]) > 1) { j = 0; - while (argv[i][j] && (argv[i][j] == 'L' || argv[i][j] == 'P')) - ret = argv[i][j++]; - if (argv[i][j] && argv[i][j] != 'L' && argv[i][j] != 'P') + while (argv[*i][j] && (argv[*i][j] == 'L' || argv[*i][j] == 'P')) + ret = argv[*i][j++]; + if (argv[*i][j] && argv[*i][j] != 'L' && argv[*i][j] != 'P') { - ret = argv[i][j]; + ret = argv[*i][j]; put_error_cd(&ret, "invalid option"); put_error_cd("usage", "cd [-L|-P] [dir]"); ret = '\0'; @@ -164,25 +162,62 @@ char cd_getparams(char **argv) return (ret); } -int cmd_cd(char **argv, t_list **env) +int ft_isfstcmp(char *path, char *cmp) +{ + size_t i; + + i == 0; + while (path[i] == '/') + i++; + return (ft_strncmp(&path[i], cmp, ft_strlen(cmp))); +} + +int cmd_cd2(char **argv, t_list **env) { t_envelem *elem; char *path; char *tmp; char opt; + size_t i; + + i = 0; + if ((opt = cf_getparams(argv, &i)) == '\0') + return (1); + if (!argv[i] && (elem = env_getelemfromkey("HOME", *env)) != NULL && elem->val != NULL) + tmp = elem->val; + else if (argv[i] && argv[i][0] != ft_isfstcmp(argv[i]) == 0 && (elem = env_getelemfromkey("PWD", *env)) != NULL && elem->val != NULL) + { + if ((tmp = ft_strnew(ft_strlen(argv[i]) + ft_strelen(elem->val) + 1)) == NULL) + put_error_cd(argv[i], "memory error"); + if (tmp == NULL) + return (1); + ft_strcat(tmp, elem->val); + ft_strcat(tmp, "/"); + ft_strcat(tmp, argv[i]); + } +} + +int cmd_cd(char **argv, t_list **env) +{ + t_envelem *elem; + size_t i; + char *path; + char *tmp; + char opt; int ret; - if ((opt = cd_getparams(argv)) == '\0') + i = 0; + if ((opt = cd_getparams(argv, &i)) == '\0') return (1); - if (!argv[1] && (elem = env_getelemfromkey("HOME", *env)) != NULL && elem->val != NULL) + if (!argv[i] && (elem = env_getelemfromkey("HOME", *env)) != NULL && elem->val != NULL) return (cmd_cd_core(elem->val, env)); - else if (argv[1] && argv[1][0] == '/') + else if (argv[i] && argv[1][0] == '/') return (cmd_cd_core(argv[1], env)); - else if (argv[1] && argv[1][0] == '-' && (elem = env_getelemfromkey("OLDPWD", *env)) != NULL) + else if (argv[i] && argv[i][0] == '-' && (elem = env_getelemfromkey("OLDPWD", *env)) != NULL) return (cmd_cd_core(elem->val, env)); - else if (argv[1] && argv[1][0] == '.' && (elem = env_getelemfromkey("PWD", *env)) != NULL && elem->val != NULL) + else if (argv[i] && argv[i][0] == '.' && (elem = env_getelemfromkey("PWD", *env)) != NULL && elem->val != NULL) { - if ((tmp = ft_strnew(ft_strlen(elem->val) + ft_strlen(argv[1]) + 1)) == NULL) + if ((tmp = ft_strnew(ft_strlen(elem->val) + ft_strlen(argv[i]) + 1)) == NULL) put_error_cd(argv[1], "memory error"); if (tmp == NULL) return (1); @@ -206,7 +241,9 @@ int cmd_cd(char **argv, t_list **env) path[ft_strlen(path)] = '/'; ft_strcat(path, argv[1]); ft_putendl(path); + ft_putendl("plop"); ret = cmd_cd_core(path, env); + ft_strdel(&tmp); ft_strdel(&path); return (ret); }