diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/env.c | 6 | ||||
| -rw-r--r-- | src/main.c | 9 | ||||
| -rw-r--r-- | src/preprocess.c | 164 |
3 files changed, 145 insertions, 34 deletions
@@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 09:21:24 by cacharle #+# #+# */ -/* Updated: 2020/04/03 14:25:31 by charles ### ########.fr */ +/* Updated: 2020/04/04 13:33:42 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,15 +27,13 @@ t_env env_from_array(char **envp) { - char *tmp; t_env env; if ((env = ft_vecnew(ENV_VEC_DEFAULT_SIZE)) == NULL) return (NULL); while (*envp != NULL) { - if ((tmp = ft_strdup(*envp)) == NULL || - ft_vecpush(env, tmp) == NULL) + if (ft_vecpush_safe(env, ft_strdup(*envp)) == NULL) { ft_vecdestroy(env, free); return (NULL); @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/04/03 14:25:48 by charles ### ########.fr */ +/* Updated: 2020/04/04 18:37:03 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,7 +32,7 @@ int main(int argc, char **argv, char **envp) (void)argc; (void)argv; /* (void)envp; */ - t_path path; + /* t_path path; */ t_env env; /* char *line; */ /* int ret; */ @@ -86,7 +86,10 @@ int main(int argc, char **argv, char **envp) /* } */ /* free(line); */ /* ft_htdestroy(path, free); */ - printf("%s\n", preprocess("*.c", env)); + /* ms_glob("src#<{(|"); */ + char *j = ms_glob("*/"); + printf("%s\n", j); + free(j); ft_vecdestroy(env, free); return (0); } diff --git a/src/preprocess.c b/src/preprocess.c index 30d2aa3..6dbc386 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,16 +6,123 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/04/03 14:48:57 by charles ### ########.fr */ +/* Updated: 2020/04/04 18:30:10 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +// 8 en moyenne +#define MATCHES_VEC_DEFAULT_SIZE 32 + +struct s_glob_param +{ + char *pattern; + t_ftvec *matches; +}; + +t_ftvec *glob_matches(char *pattern); + + +int glob_iter(char *dirname, struct dirent *entry, void *void_param) +{ + struct s_glob_param *param; + char *subdir_pattern; + char *subdir_name; + t_ftvec *subdir_matches; + + param = void_param; + /* printf("DIR: %15s %d\n", entry->d_name, entry->d_type == DT_DIR); */ + if (param->pattern[0] != '.' && entry->d_name[0] == '.') + return (0); + if ((subdir_pattern = ft_strchr(param->pattern, '/')) != NULL) + { + *subdir_pattern = '\0'; + subdir_pattern++; + } + if (!ft_fnmatch(param->pattern, entry->d_name)) + { + if (subdir_pattern != NULL) + subdir_pattern[-1] = '/'; + return (0); + } + if (subdir_pattern != NULL) + { + if (entry->d_type != DT_DIR) + { + if (ft_vecpush_safe(param->matches, ft_strdup(entry->d_name)) == NULL) + return (-1); + subdir_pattern[-1] = '/'; + return (0); + } + + if ((subdir_name = ft_strjoin3(dirname, "/", entry->d_name)) == NULL) + return (-1); + chdir(subdir_name); + free(subdir_name); + subdir_matches = glob_matches(subdir_pattern); + chdir(dirname); + if (subdir_matches == NULL) + return (-1); + for (size_t i = 0; i < subdir_matches->size; i++) + { + if (ft_vecpush_safe(param->matches, + ft_strjoin3(entry->d_name, "/", subdir_matches->data[i])) == NULL) + { + ft_vecdestroy(subdir_matches, free); + return (-1); + } + } + ft_vecdestroy(subdir_matches, free); + subdir_pattern[-1] = '/'; + } + else + { + if (ft_vecpush_safe(param->matches, ft_strdup(entry->d_name)) == NULL) + return (-1); + } + return (0); +} + +t_ftvec *glob_matches(char *pattern) +{ + char dirname[PATH_MAX]; + struct s_glob_param param; + + if (getcwd(dirname, PATH_MAX) == NULL) + return (NULL); + if ((param.pattern = ft_strdup(pattern)) == NULL || + (param.matches = ft_vecnew(MATCHES_VEC_DEFAULT_SIZE)) == NULL) + { + free(param.pattern); + return (NULL); + } + if (utils_directory_iter(dirname, ¶m, glob_iter) == -1) + { + free(param.pattern); + ft_vecdestroy(param.matches, free); + return (NULL); + } + free(param.pattern); + return (param.matches); +} + char *ms_glob(char *pattern) { - (void)pattern; - return (NULL); + char *join; + t_ftvec *matches; + + if ((matches = glob_matches(pattern)) == NULL) + return (NULL); + ft_vecsort(matches, ft_compar_str); + if (ft_vecpush(matches, NULL) == NULL || + (join = ft_strsjoin((char**)matches->data, "\n")) == NULL) + { + ft_vecdestroy(matches, free); + return (NULL); + } + ft_vecdestroy(matches, free); + return (join); } /* void iterpolate_iter_f(char **curr) */ @@ -27,33 +134,35 @@ char *ms_glob(char *pattern) char *preprocess(char *input, t_env env) { - int i; - t_ftdstr *input_dstr; - char *glob_str; + /* int i; */ + /* t_ftdstr *input_dstr; */ + /* char *glob_str; */ /* char *tmp; */ - glob_str = NULL; - if ((input_dstr = ft_dstrnew(input)) == NULL) - return (NULL); - i = 0; - while (input_dstr->str[i] != '\0') - { - if (input_dstr->str[i] == '*') - { - free(glob_str); + (void)input; + (void)env; + /* glob_str = NULL; */ + /* if ((input_dstr = ft_dstrnew(input)) == NULL) */ + /* return (NULL); */ + /* i = 0; */ + /* while (input_dstr->str[i] != '\0') */ + /* { */ + /* if (input_dstr->str[i] == '*') */ + /* { */ + /* free(glob_str); */ /* if ((glob_str = ms_glob()) = NULL) */ /* { */ /* ft_dstrdestroy(input_str); */ /* return (NULL); */ /* } */ - if (ft_dstrinsert(input_dstr, glob_str, 0) == NULL) - { - free(glob_str); - ft_dstrdestroy(input_dstr); - return (NULL); - } - i += strlen(glob_str); - } + /* if (ft_dstrinsert(input_dstr, glob_str, 0) == NULL) */ + /* { */ + /* free(glob_str); */ + /* ft_dstrdestroy(input_dstr); */ + /* return (NULL); */ + /* } */ + /* i += strlen(glob_str); */ + /* } */ /* else if (input_dstr->str[i] == '$') */ /* { */ /* if ((tmp = env_match_first(env, input_dstr->str + i + 1)) == NULL) */ @@ -67,8 +176,9 @@ char *preprocess(char *input, t_env env) /* i += ft_strlen(tmp); */ /* } */ /* else */ - i++; - } - printf("%d %d %s\n", input_dstr->length, input_dstr->capacity, input_dstr->str); - return (ft_dstrunwrap(input_dstr)); + /* i++; */ + /* } */ + /* printf("%d %d %s\n", input_dstr->length, input_dstr->capacity, input_dstr->str); */ + /* return (ft_dstrunwrap(input_dstr)); */ + return NULL; } |
