diff --git a/42sh/Makefile b/42sh/Makefile index 022c2fe2..0da8e579 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -143,6 +143,7 @@ exec/ft_cmd.c\ exec/ft_exec.c\ exec/ft_findexec.c\ exec/set_exitstatus.c\ +glob/expand_brace.c\ glob/glob.c\ glob/glob_print.c\ glob/ld/ft_ld_back.c\ diff --git a/42sh/includes/glob.h b/42sh/includes/glob.h index 4ad01613..c1afce7c 100644 --- a/42sh/includes/glob.h +++ b/42sh/includes/glob.h @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/04 16:31:18 by wescande #+# #+# */ -/* Updated: 2017/01/12 17:14:38 by wescande ### ########.fr */ +/* Updated: 2017/01/12 19:00:08 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,7 @@ typedef struct s_ld } t_ld; char **glob(const char *str, char **env); +t_ld *expand_brace(const char *pat); void glob_print(t_list *token, t_data *data); /* diff --git a/42sh/srcs/glob/expand_brace.c b/42sh/srcs/glob/expand_brace.c new file mode 100644 index 00000000..2fe05f61 --- /dev/null +++ b/42sh/srcs/glob/expand_brace.c @@ -0,0 +1,108 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expand_brace.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/12 19:00:29 by wescande #+# #+# */ +/* Updated: 2017/01/12 20:24:00 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "glob.h" + +/* + ** expand_brace return expansion of a string. + ** pattern searched are {ab, cd}. + ** return is t_ld which first param is ab and second is cd + ** input parameters are : + ** -char *pat -> pattern string to be looking for expand + */ + +static char *ft_strjoinf(char *s1, char *s2, int state) +{ + char *ans; + + ans = ft_strjoin((const char *)s1, (const char *)s2); + if (state == 1 || state == 3) + ft_strdel(&s1); + if (state == 2 || state == 3) + ft_strdel(&s2); + return (ans); +} + +static void ft_tabdel(char ***mytab) +{ + char **erase; + int i; + + if (!mytab || !*mytab) + return ; + erase = *mytab; + i = 0; + while (erase[i]) + { + ft_strdel(&erase[i]); + ++i; + } + free(*mytab); + *mytab = NULL; +} + +static int search_brace(t_ld **wk, char *str, int index) +{ + char *start; + char *s1; + char **split; + + start = NULL; + while (*str) + { + if (*str == '{') + start = str; + else if (*str == '}' && start) + { + s1 = ft_strsub(start, 1, str - start - 1); + split = ft_strsplit(s1, ','); + ft_strdel(&s1); + s1 = ft_strsub((*wk)->content, 0, start - (char *)(*wk)->content); + while (split[++index]) + ft_ld_pushfront(wk, ft_strjoinf(ft_strjoin(s1, split[index]), + str + 1, 1)); + ft_strdel(&s1); + ft_tabdel(&split); + return (1); + } + ++str; + } + return (0); +} + +t_ld *expand_brace(const char *pat) +{ + t_ld *ret; + t_ld *tmp; + int do_it; + + ret = NULL; + ft_ld_pushfront(&ret, ft_strdup(pat)); + do_it = 1; + while (do_it) + { + do_it = 0; + while (ret) + { + if ((tmp = ret) && search_brace(&ret, ret->content, -1)) + { + ft_ld_del(&tmp, &ft_strdel); + do_it = 1; + } + if (!ret->next) + break; + ret = ret->next; + } + ret = ft_ld_front(ret); + } + return (ret); +} diff --git a/42sh/srcs/glob/glob.c b/42sh/srcs/glob/glob.c index 2731809b..cc68bb11 100644 --- a/42sh/srcs/glob/glob.c +++ b/42sh/srcs/glob/glob.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/04 16:29:54 by wescande #+# #+# */ -/* Updated: 2017/01/12 18:48:26 by wescande ### ########.fr */ +/* Updated: 2017/01/12 19:00:12 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -176,15 +176,22 @@ char **glob(const char *pat, char **env) t_ld *match; char **gl; char **path; + t_ld *mul_pat; match = NULL; gl = NULL; - if (env && (path = ft_strsplit(ft_getenv(env, "PATH"), ':'))) + mul_pat = expand_brace(pat); + while (mul_pat) { - path_research(pat, path, &match); - ft_tabdel(&path); + if (env && (path = ft_strsplit(ft_getenv(env, "PATH"), ':'))) + { + path_research(mul_pat->content, path, &match); + ft_tabdel(&path); + } + dir_research(mul_pat->content, "./", &match); + mul_pat = mul_pat->next; } - dir_research(pat, "./", &match); + ft_ld_clear(&mul_pat, &ft_strdel); if (match) { gl = ft_ld_to_tab(match);