From 73a7027a9d58c6ca71817170bff23ac71edac9d8 Mon Sep 17 00:00:00 2001 From: Charles Date: Sat, 28 Mar 2020 12:10:13 +0100 Subject: Cleaning env and path, Removed state struct --- src/path.c | 63 +++++++++++++++----------------------------------------------- 1 file changed, 15 insertions(+), 48 deletions(-) (limited to 'src/path.c') diff --git a/src/path.c b/src/path.c index d4f4418..3ac12d9 100644 --- a/src/path.c +++ b/src/path.c @@ -12,15 +12,13 @@ #include "minishell.h" -static int st_in_dirs(char **dirs, char *dir) -{ - while (*dirs != NULL) - if (ft_strcmp(*dirs++, dir) == 0) - return (0); - return (-1); -} +#define MS_PATH_HT_SIZE 4096 + +/* +** Update `path` with all files in the directory named `dirname`. +*/ -static t_path *st_path_commands_update(t_path *path, char *dirname) +static t_path st_path_dir_update(t_path path, char *dirname) { DIR *dir; struct dirent *entry; @@ -30,9 +28,9 @@ static t_path *st_path_commands_update(t_path *path, char *dirname) return (NULL); while ((entry = readdir(dir)) != NULL) { - if ((tmp = ft_strjoin(dirname, entry->d_name)) == NULL) + if ((tmp = ft_strjoin3(dirname, "/", entry->d_name)) == NULL) return (NULL); - if (ft_htset(path->commands, entry->d_name, tmp, ms_ht_del_str_entry) == NULL) + if (ft_htset(path, entry->d_name, tmp, ms_ht_del_str_entry) == NULL) return (NULL); } if (closedir(dir) == -1) @@ -40,57 +38,26 @@ static t_path *st_path_commands_update(t_path *path, char *dirname) return (path); } -/* -** Update path list with `dirname` -*/ - -static t_path *st_path_dir_update(t_path *path, char *dirname) -{ - t_ftlst *front; - - if (ft_lstlfind(path->dirs, (int (*)(const void*, const void*))ft_strcmp, dirname) == NULL) - { - if ((dirname = ft_strdup(dirname)) == NULL) - return (NULL); - if ((front = ft_lstnew(dirname)) == NULL) - { - free(dirname); - return (NULL); - } - ft_lstadd_front(&path->dirs, front); - } - return (st_path_commands_update(path, dirname)); -} - /* ** Update (or create if `path` is NULL) `path` according to `path_str` ** (each directory is separated by a ':'). */ -t_path *ms_path_update(t_path *path, const char *path_str) +t_path ms_path_update(t_path path, char *path_var) { int i; char **dirs; - if (path == NULL) - if ((path = malloc(sizeof(t_path))) == NULL) - return (NULL); - if ((dirs = ft_split(path_str, ':')) == NULL) + if (path_var == NULL) + return (NULL); + if (path == NULL && (path = ft_htnew(MS_PATH_HT_SIZE)) == NULL) + return (NULL); + if ((dirs = ft_split(path_var, ':')) == NULL) return (NULL); - ft_lstremove_if(&path->dirs, (int (*)(const void*, const void*))st_in_dirs, free, (void*)dirs); i = -1; - while (dirs[i] != NULL) + while (dirs[++i] != NULL) if (st_path_dir_update(path, dirs[i]) == NULL) return (ft_split_destroy(dirs)); ft_split_destroy(dirs); return (path); } - -void ms_path_destroy(t_path *path) -{ - if (path == NULL) - return ; - ft_lstclear(&path->dirs, free); - ft_htdestroy(path->commands, ms_ht_del_str_entry); - free(path); -} -- cgit