diff --git a/srcs/built_in/cd.c b/srcs/built_in/cd.c new file mode 100644 index 0000000..f2e9e7a --- /dev/null +++ b/srcs/built_in/cd.c @@ -0,0 +1,203 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/03/21 18:30:26 by sadjigui #+# #+# */ +/* Updated: 2022/04/09 04:55:48 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/minishell.h" + +void ft_ls(char *input) +{ + int i; + + DIR *dir; + struct dirent *sd; + + i = ft_strlen("ls"); + // if (input[i] == ' ') + // { + //printf("ici\n"); + while (input[i] && input[i] != ' ') + i++; + // } + // printf("[%c]\n", input[i]); + // printf("[%c]\n", input[i+1]); + + dir = opendir("."); + if (dir == NULL) + { + printf("stop\n"); + return ; + } + // printf("dir --> %s\n", dir[0]); + while ((sd=readdir(dir)) != NULL) + { + printf(" >> %s\n", sd->d_name); + } + closedir(dir); +} + +void del_one(t_s_cmd *cmd) +{ + int i; + char *r; + + i = ft_strlen(cmd->big_cmd->env[find_pwd(cmd)]); + // printf("%s\n", cmd->args[6]); + // while (cmd->big_cmd->env[find_pwd(cmd)][i]) + // i++; + while (cmd->big_cmd->env[find_pwd(cmd)][i] != '/') + i--; + r = ft_substr(cmd->big_cmd->env[find_pwd(cmd)], 0, i); + // printf ("-->%s\n", r); + // free(cmd->big_cmd->env[find_pwd(cmd)]); + if (r) + cmd->big_cmd->env[find_pwd(cmd)] = ft_strdup(r); + else + cmd->big_cmd->env[find_pwd(cmd)] = ft_strdup("PWD=/"); + + if (r) + free(r); +} + +void add_one(t_s_cmd *cmd, char *str) +{ + char *r; + + r = ft_strjoin(cmd->big_cmd->env[find_pwd(cmd)], "/"); + r = ft_strjoin(r, str); + //free(cmd->big_cmd->env[find_pwd(cmd)]); + cmd->big_cmd->env[find_pwd(cmd)] = ft_strdup(r); + free(r); +} + +void change_path(t_s_cmd *cmd) +{ + char **tab; + int i; + + i = 0; + tab = ft_split(cmd->args[1], '/'); + while (cmd->big_cmd->env[i]) + { + if (ft_strncmp(cmd->big_cmd->env[i], "OLDPWD=", 7) == 0) + break ; + i++; + } + // printf("%d\n", i); + /*if (cmd->big_cmd->env[i]) + free(cmd->big_cmd->env[i]);*/ + cmd->big_cmd->env[i] = ft_strjoin("OLD", cmd->big_cmd->env[find_pwd(cmd)]); + i = 0; + while (tab[i]) + { + // printf("%d -> %s\n", tab_len(tab), tab[i]); + // if (tab_len(tab) < 2) + // break ; + if (ft_strcmp(tab[i], "..") == 0) + del_one(cmd); + else + add_one(cmd, tab[i]); + + i++; + } +} + +void reboot_pwd(t_s_cmd *cmd, int i) +{ + char *str; + + while (i > 3) + { + if (chdir("..") == 0) + del_one(cmd); + i--; + } + str = ft_substr(cmd->args[1], 2, ft_strlen(cmd->args[1])); + cmd->args[1] = ft_strdup(str); + free(str); +} + +int find_it(char **str, char *s) +{ + int i; + + i = 0; + while (str[i] && ft_strncmp(str[i], s, ft_strlen(s))) + i++; + if (str[i] == NULL) + return (0); + return (i); +} + +void open_directory(t_s_cmd *cmd) +{ + char **str; + int j; + + str = ft_split(cmd->big_cmd->env[find_pwd(cmd)], '/'); + // printf("jojo\n"); + // printf("%s\n", cmd->big_cmd->env[find_it(cmd->big_cmd->env, "HOME=")]); + if (find_it(cmd->big_cmd->env, "HOME=") == 0) + { + //printf("%d\n", tab_len(cmd->args[1])); + printf("bash: cd: HOME not set\n"); + return ; + } + j = tab_len(str); + if (!cmd->args[1]) + { + // reboot_pwd(cmd, j); + // if (tab_len(str) > 3) + // { + // while (j-- > 3) + // if (chdir("..") == 0) + // del_one(cmd); + // } + // else + // { + char *p = ft_substr(cmd->big_cmd->env[find_it(cmd->big_cmd->env, "HOME=")], 5, ft_strlen(cmd->big_cmd->env[find_it(cmd->big_cmd->env, "HOME=")])); + printf("%s\n", p); + if (chdir(p) == 0) + { + cmd->big_cmd->env[find_it(cmd->big_cmd->env, "OLDPWD=")] = ft_strjoin("OLD", cmd->big_cmd->env[find_pwd(cmd)]); + cmd->big_cmd->env[find_pwd(cmd)] = ft_strjoin("PWD=", p); + } + free(p); + // printf("%s\n", p); + // } + } + if (tab_len(cmd->args) == 2) + { + if (cmd->args[1][0] == '~') + reboot_pwd(cmd, j); + if (chdir(cmd->args[1]) == 0) + change_path(cmd); + } + if (str) + free_double(str); +} + +void ft_pwd(t_s_cmd *cmd) +{ + int i; + int j; + + j = 0; + i = 0; + while (cmd->big_cmd->env[find_pwd(cmd)][j] != '=') + j++; + j += 1; + while (cmd->big_cmd->env[find_pwd(cmd)][j]) + { + write (1, &cmd->big_cmd->env[find_pwd(cmd)][j], 1); + j++; + } + write(1, "\n", 1); +} \ No newline at end of file diff --git a/srcs/built_in/export.c b/srcs/built_in/export.c index a6104a0..74c6b89 100644 --- a/srcs/built_in/export.c +++ b/srcs/built_in/export.c @@ -78,8 +78,10 @@ void ft_export_variable(t_s_cmd *cmd, char *variable) { if (ft_strncmp(unset, cmd->big_cmd->env[i], ft_strlen(unset)) == 0) { - find_variable(unset, cmd); - break ; + free(cmd->big_cmd->env[i]); + cmd->big_cmd->env[i] = dest; + // find_variable(unset, cmd); + return ; } i++; } diff --git a/srcs/built_in/init_builtin.c b/srcs/built_in/init_builtin.c new file mode 100644 index 0000000..36de6c5 --- /dev/null +++ b/srcs/built_in/init_builtin.c @@ -0,0 +1,134 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_builtin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/02/28 17:17:01 by sadjigui #+# #+# */ +/* Updated: 2022/04/09 04:55:48 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/minishell.h" + +// void join_variable(t_s_cmd *cmd, char **v_v, int size, char **tab) +// { +// char *str; +// char *tmp; +// +// while (tab[size]) +// { +// cmd->big_cmd->env[size] = ft_strdup(tab[size]); +// // printf("tmp----%s\n", tmp[size]); +// // printf("envy---%s\n", cmd->big_cmd->env[size]); +// size++; +// } +// str = ft_strjoin(v_v[0], "="); +// tmp = ft_strdup(str); +// free(str); +// str = ft_strjoin(tmp,v_v[1]); +// cmd->big_cmd->env[size] = ft_strdup(str); +// printf("ici\n"); +// free(str); +// free(tmp); +// cmd->big_cmd->env[size + 1] = NULL; +// } + +void register_env(t_s_cmd *cmd, char *variable) +{ + char **tmp = NULL; + int i; + i = 0; + + // tmp = NULL; + // printf("TABLEN %d", tab_len(cmd->big_cmd->env)); + tmp = (char **)malloc(sizeof(char *) * (tab_len(cmd->big_cmd->env) + 2)); + if(!tmp) + printf("no tmp\n"); + while (cmd->big_cmd->env[i]) + { + tmp[i] = ft_strdup(cmd->big_cmd->env[i]); + // printf("ici\n"); + // printf("%s\n", "let me in"); + i++; + } + // printf("i: %d %s\n",i,tmp[i]); + // printf("%s\n", "brrrrrrr"); + tmp[i] = ft_strdup(variable); + tmp[i + 1] = NULL; + // printf("debut %p\n", tmp[2]); + // printf("1--------------------\n"); + free_double(cmd->big_cmd->env); + // printf("1--------------------\n"); + cmd->big_cmd->env = (char **)malloc(sizeof(char *) * (tab_len(tmp) + 1)); + if (!cmd->big_cmd->env) + printf("no env\n"); + i = 0; + while (tmp[i]) + { + cmd->big_cmd->env[i] = ft_strdup(tmp[i]); + // if (tmp[size]) + // free(tmp[size]); + // printf("tmp----%s\n", tmp[size]); + // printf("envy---%s\n", cmd->big_cmd->env[size]); + i++; + } + cmd->big_cmd->env[i] = NULL; + // printf("2--------------------\n"); + if (tmp) + free_double(tmp); + // printf("2--------------------\n"); + // int i = 0; + // while (tmp[i]) + // { + // printf("nano"); + // free(tmp[i]); + // i++; + // } + // if(tmp) + // free(tmp); + // join_variable(cmd, variable, size, tmp); +} + +void ft_env(t_s_cmd *cmd, char **env) +{ + int i; + + i = 0; + while (env[i]) + i++; + cmd->big_cmd->env = ft_calloc(sizeof(char *), i + 1); + i = 0; + while (env[i]) + { + cmd->big_cmd->env[i] = ft_strdup(env[i]); + i++; + } + cmd->big_cmd->env[i] = NULL; +} + +int find_pwd(t_s_cmd *cmd) +{ + int i; + + i = 0; + while (cmd->big_cmd->env[i] && ft_strncmp(cmd->big_cmd->env[i], "PWD=", 4) != 0) + i++; + return (i); +} + +void init_s_cmd(t_s_cmd *cmd, char **env) +{ + ft_env(cmd, env); +} + +int tab_len(char **tab) +{ + int i; + + i = 0; + while (tab[i]) + i++; + return (i); +} \ No newline at end of file diff --git a/srcs/built_in/unset.c b/srcs/built_in/unset.c index 0bc662a..f96fdd7 100644 --- a/srcs/built_in/unset.c +++ b/srcs/built_in/unset.c @@ -28,7 +28,7 @@ void unset_variable(t_s_cmd *cmd, int i) { // if (a == i) // a++; - printf("%s\n", cmd->big_cmd->env[a]); + // printf("%s\n", cmd->big_cmd->env[a]); if (a != i) { tmp[b] = ft_substr(cmd->big_cmd->env[a], 0, ft_strlen(cmd->big_cmd->env[a])); diff --git a/vgcore.12673 b/vgcore.12673 new file mode 100644 index 0000000..4ea4a6c Binary files /dev/null and b/vgcore.12673 differ