aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-04-04 19:11:05 +0200
committerCharles <sircharlesaze@gmail.com>2020-04-04 19:11:05 +0200
commitdb122618b7dd0e1c2b9432e3f470c880e0d4422e (patch)
tree992305487e3b0d19b14cf27fa2a272814bce5fb0 /src
parentc0e2ee28eedc1a9a886f9729a994d77738e2eb58 (diff)
downloadminishell-db122618b7dd0e1c2b9432e3f470c880e0d4422e.tar.gz
minishell-db122618b7dd0e1c2b9432e3f470c880e0d4422e.tar.bz2
minishell-db122618b7dd0e1c2b9432e3f470c880e0d4422e.zip
Glob logic mainly done
Diffstat (limited to 'src')
-rw-r--r--src/env.c6
-rw-r--r--src/main.c9
-rw-r--r--src/preprocess.c164
3 files changed, 145 insertions, 34 deletions
diff --git a/src/env.c b/src/env.c
index d402a1b..f00d046 100644
--- a/src/env.c
+++ b/src/env.c
@@ -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);
diff --git a/src/main.c b/src/main.c
index 2e42601..f897faa 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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, &param, 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;
}