diff --git a/42sh/includes/glob.h b/42sh/includes/glob.h index 4df7b651..4ad01613 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/05 16:20:32 by wescande ### ########.fr */ +/* Updated: 2017/01/12 17:14:38 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/srcs/glob/glob.c b/42sh/srcs/glob/glob.c index 49f54440..7aff12d4 100644 --- a/42sh/srcs/glob/glob.c +++ b/42sh/srcs/glob/glob.c @@ -6,20 +6,20 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/04 16:29:54 by wescande #+# #+# */ -/* Updated: 2017/01/05 20:09:14 by wescande ### ########.fr */ +/* Updated: 2017/01/12 18:37:44 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ #include "glob.h" /* -** glob return expansion of a string. -** pattern searched are ~, *, ?, [a-z], [!a-z], [^a-z], {ab}. -** input parameters are : -** -char *pat -> pattern string to be looking for match -** -char **env -> env var. could be NULL - to just expanse in local directory and not in path -*/ + ** glob return expansion of a string. + ** pattern searched are ~, *, ?, [a-z], [!a-z], [^a-z], {ab}. + ** input parameters are : + ** -char *pat -> pattern string to be looking for match + ** -char **env -> env var. could be NULL + ** to just expanse in local directory and not in path + */ static void ft_tabdel(char ***mytab) { @@ -39,15 +39,66 @@ static void ft_tabdel(char ***mytab) *mytab = NULL; } -static int match_bracket(const char **pat, char **str) +static int match_bracket_char(char **cmp, const char *pat, char c, int neg) { - return (1); + int dir; + char s; + + if ((*cmp + 2) < pat && (*cmp)[1] == '-' && (s = (*cmp)[0])) + { + dir = s > (*cmp)[2]; + while ((dir && s >= (*cmp)[2]) || (!dir && s <= (*cmp)[2])) + { + if (!neg && s == c) + return (1); + else if (neg && s == c) + return (0); + s += (dir * -2 + 1); + } + *cmp += 2; + } + else if (!neg && **cmp == c) + { + return (1); + } + else if (neg && **cmp == c) + { + return (0); + } + return (-1); +} + +static int match_bracket(const char **pat, char c) +{ + char *cmp; + int neg; + int ret; + + cmp = (char *)*pat + 1; + while (**pat != ']') + { + if (!**pat) + return (0); + ++*pat; + } + neg = 0; + if ((*cmp == '^' || *cmp == '!') && ++neg) + ++cmp; + while (cmp < *pat) + { + ret = match_bracket_char(&cmp, *pat, c, neg); + if (ret != -1) + return (ret); + ++cmp; + } + return (neg); } static int match_star(const char *pat, char *str) { char *fix; + (void)pat; fix = str + ft_strlen(str); return (1); } @@ -60,7 +111,7 @@ static int match_pattern(const char *pat, char *str) str++; else if (*pat == '[') { - if (!match_bracket(&pat, &str)) + if (!match_bracket(&pat, *str)) return (0); } else if (*pat == '*') @@ -73,6 +124,7 @@ static int match_pattern(const char *pat, char *str) else if (*pat != *str) return (0); ++str; + ++pat; } return (*str ? 0 : 1); } diff --git a/42sh/srcs/glob/glob_print.c b/42sh/srcs/glob/glob_print.c index eba06727..828089a5 100644 --- a/42sh/srcs/glob/glob_print.c +++ b/42sh/srcs/glob/glob_print.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/05 16:09:40 by wescande #+# #+# */ -/* Updated: 2017/01/05 16:31:36 by wescande ### ########.fr */ +/* Updated: 2017/01/12 15:48:03 by wescande ### ########.fr */ /* */ /* ************************************************************************** */