From c0e2ee28eedc1a9a886f9729a994d77738e2eb58 Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 3 Apr 2020 15:13:08 +0200 Subject: Refactoring env, connecting pipes, preprocess draft --- src/preprocess.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/preprocess.c (limited to 'src/preprocess.c') diff --git a/src/preprocess.c b/src/preprocess.c new file mode 100644 index 0000000..30d2aa3 --- /dev/null +++ b/src/preprocess.c @@ -0,0 +1,74 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* preprocess.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 08:58:49 by charles #+# #+# */ +/* Updated: 2020/04/03 14:48:57 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *ms_glob(char *pattern) +{ + (void)pattern; + return (NULL); +} + +/* void iterpolate_iter_f(char **curr) */ +/* { */ +/* if (*curr != '$') */ +/* return (i + 1); */ +/* } */ + + +char *preprocess(char *input, t_env env) +{ + 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); + /* 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); + } + /* else if (input_dstr->str[i] == '$') */ + /* { */ + /* if ((tmp = env_match_first(env, input_dstr->str + i + 1)) == NULL) */ + /* tmp = ""; */ + /* if (ft_dstrreplace(input_dstr, tmp, i, i + ft_strlen(tmp)) == NULL) */ + /* { */ + /* free(glob_str); */ + /* ft_dstrdestroy(input_dstr); */ + /* return (NULL); */ + /* } */ + /* 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)); +} -- cgit From db122618b7dd0e1c2b9432e3f470c880e0d4422e Mon Sep 17 00:00:00 2001 From: Charles Date: Sat, 4 Apr 2020 19:11:05 +0200 Subject: Glob logic mainly done --- src/preprocess.c | 164 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 137 insertions(+), 27 deletions(-) (limited to 'src/preprocess.c') 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 +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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; } -- cgit From 4aeba6d2f03706fa21281709a138a7d3ea9797dc Mon Sep 17 00:00:00 2001 From: Charles Date: Sun, 5 Apr 2020 15:04:23 +0200 Subject: Preprocessing (glob and iterpolation) draft (not tested) --- src/preprocess.c | 191 +++++++++++-------------------------------------------- 1 file changed, 38 insertions(+), 153 deletions(-) (limited to 'src/preprocess.c') diff --git a/src/preprocess.c b/src/preprocess.c index 6dbc386..1151bca 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,179 +6,64 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/04/04 18:30:10 by charles ### ########.fr */ +/* Updated: 2020/04/05 14:58:00 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +#include "ms_glob.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) +static char *iterpolate(char *str, t_env env) { - struct s_glob_param *param; - char *subdir_pattern; - char *subdir_name; - t_ftvec *subdir_matches; + size_t i; + t_ftdstr *dstr; + char *match; - 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 ((dstr = ft_dstrnew(str)) == NULL) + return (NULL); + free(str); + i = 0; + while (i < dstr->length) { - 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 (dstr->str[i] == '$') { - if (ft_vecpush_safe(param->matches, - ft_strjoin3(entry->d_name, "/", subdir_matches->data[i])) == NULL) + if ((match = env_search_first_match(env, dstr->str + i + 1)) == NULL) + ft_dstrerase(dstr, i, utils_var_end(dstr->str + i + 1)); + else { - ft_vecdestroy(subdir_matches, free); - return (-1); + if (ft_dstrsubstitute(dstr, match, i, utils_var_end(dstr->str + i + 1)) == NULL) + return (NULL); } } - ft_vecdestroy(subdir_matches, free); - subdir_pattern[-1] = '/'; - } - else - { - if (ft_vecpush_safe(param->matches, ft_strdup(entry->d_name)) == NULL) - return (-1); + i++; } - return (0); + return (ft_dstrunwrap(dstr)); } -t_ftvec *glob_matches(char *pattern) +static char *preprocess_arg(char *arg, t_env env) { - 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) + if (*arg == '\'') + return (ft_strsubf(arg, 1, ft_strlen(arg) - 1)); + if (*arg == '"') { - free(param.pattern); - ft_vecdestroy(param.matches, free); - return (NULL); + if (ft_strchr(arg, '$') != NULL) + arg = iterpolate(arg, env); + return (ft_strsubf(arg, 1, ft_strlen(arg) - 1)); } - free(param.pattern); - return (param.matches); + if (ft_strchr(arg, '$') != NULL) + return (iterpolate(arg, env)); + if (ft_strchr(arg, '*') != NULL) + return (ms_glob(arg)); + return (arg); } -char *ms_glob(char *pattern) -{ - 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) */ -/* { */ -/* if (*curr != '$') */ -/* return (i + 1); */ -/* } */ - - -char *preprocess(char *input, t_env env) +char **preprocess_argv(char **argv, t_env env) { - /* int i; */ - /* t_ftdstr *input_dstr; */ - /* char *glob_str; */ - /* char *tmp; */ + int i; - (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); */ - /* } */ - /* else if (input_dstr->str[i] == '$') */ - /* { */ - /* if ((tmp = env_match_first(env, input_dstr->str + i + 1)) == NULL) */ - /* tmp = ""; */ - /* if (ft_dstrreplace(input_dstr, tmp, i, i + ft_strlen(tmp)) == NULL) */ - /* { */ - /* free(glob_str); */ - /* ft_dstrdestroy(input_dstr); */ - /* return (NULL); */ - /* } */ - /* 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)); */ - return NULL; + i = -1; + while (argv[++i] != NULL) + if ((argv[i] = preprocess_arg(argv[i], env)) == NULL) + return (NULL); + return (argv); } -- cgit From 9fabc25a980550afc6337fd729632462f2680daa Mon Sep 17 00:00:00 2001 From: Charles Date: Sun, 12 Apr 2020 18:36:17 +0200 Subject: Removing data name in ast union, io_frame, root line ast tag --- src/preprocess.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/preprocess.c') diff --git a/src/preprocess.c b/src/preprocess.c index 1151bca..c30bb70 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/04/05 14:58:00 by charles ### ########.fr */ +/* Updated: 2020/04/05 15:04:06 by charles ### ########.fr */ /* */ /* ************************************************************************** */ -- cgit