suppression d'un malheureux leaks + opti recursivite

This commit is contained in:
wescande 2017-02-01 19:50:32 +01:00
parent 43f1295324
commit 9641ed9dbb
5 changed files with 38 additions and 53 deletions

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/04 16:31:18 by wescande #+# #+# */ /* Created: 2017/01/04 16:31:18 by wescande #+# #+# */
/* Updated: 2017/01/31 23:20:22 by wescande ### ########.fr */ /* Updated: 2017/02/01 19:50:07 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -69,8 +69,7 @@ void modify_esc_split(unsigned char *esc_dest,
unsigned char *esc_src, int start, int len); unsigned char *esc_src, int start, int len);
void expand_brace(t_glob *tglob); void expand_brace(t_glob *tglob);
int match_pattern(t_glob *tglob, char *str, char *full_word); int match_pattern(t_glob *tglob, char *str, char *full_word);
int dir_research(t_glob *tglob, char *p, const char *pat); int dir_research(t_glob *tglob, char *p, const char *pat, int rec);
int dir_research_recursive(t_glob *tglob, char *p, const char *pat);
char **ft_strsplit_spe(const char *str, char **ft_strsplit_spe(const char *str,
const unsigned char *esc, char c); const unsigned char *esc, char c);
unsigned char **ft_strsplit_esc(const char *str, unsigned char **ft_strsplit_esc(const char *str,

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */ /* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */
/* Updated: 2017/01/31 20:19:48 by wescande ### ########.fr */ /* Updated: 2017/02/01 19:29:27 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/30 12:07:16 by wescande #+# #+# */ /* Created: 2017/01/30 12:07:16 by wescande #+# #+# */
/* Updated: 2017/01/31 18:00:16 by wescande ### ########.fr */ /* Updated: 2017/02/01 19:49:44 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -20,59 +20,45 @@ int is_directory(const char *path)
return (S_ISDIR(path_stat.st_mode)); return (S_ISDIR(path_stat.st_mode));
} }
int dir_research(t_glob *gl, char *p, const char *pat) static int dir_list_content(t_glob *gl, char **str, const char *pat,
int recursive)
{ {
DIR *dir;
struct dirent *in;
char *path_tmp;
int ret; int ret;
char *path_tmp;
ret = 0; ret = 0;
if ((ft_strlen(p) <= 1 || p[ft_strlen(p) - 1] != '.') if (ft_strcmp(str[1], ".") && ft_strcmp(str[1], ".."))
&& is_directory(p) && (dir = opendir(p)))
while ((in = readdir(dir)))
{ {
if (ft_strcmp(in->d_name, ".") && ft_strcmp(in->d_name, "..")) if (*str[0] == '/' && !*(str[0] + 1))
{ path_tmp = ft_strjoin(str[0], str[1]);
if (*p == '/' && !*(p + 1))
path_tmp = ft_strjoin(p, in->d_name);
else else
path_tmp = ft_strjoinf(ft_strjoin(p, "/"), in->d_name, 1); path_tmp = ft_strjoinf(ft_strjoin(str[0], "/"), str[1], 1);
if (recursive)
dir_research(gl, path_tmp, pat, recursive);
gl->pat = pat; gl->pat = pat;
if (match_pattern(gl, in->d_name, path_tmp) && ++ret) if (match_pattern(gl, str[1], path_tmp) && ++ret)
ft_ld_pushfront(&gl->match, ft_strdup(path_tmp + 2 * ft_ld_pushfront(&gl->match, ft_strdup(path_tmp + 2 *
(path_tmp[0] == '.' && path_tmp[1] == '/'))); (path_tmp[0] == '.' && path_tmp[1] == '/')));
ft_strdel(&path_tmp); ft_strdel(&path_tmp);
} }
}
return (ret); return (ret);
} }
int dir_research_recursive(t_glob *gl, char *p, const char *pat) int dir_research(t_glob *gl, char *p,
const char *pat, int recursive)
{ {
DIR *dir; DIR *dir;
struct dirent *in; struct dirent *in;
char *path_tmp;
int ret; int ret;
ret = 0; ret = 0;
if ((ft_strlen(p) <= 1 || p[ft_strlen(p) - 1] != '.') if ((ft_strlen(p) <= 1 || p[ft_strlen(p) - 1] != '.') && is_directory(p))
&& is_directory(p) && (dir = opendir(p))) {
dir = opendir(p);
while ((in = readdir(dir))) while ((in = readdir(dir)))
{ ret += dir_list_content(gl,
if (ft_strcmp(in->d_name, ".") && ft_strcmp(in->d_name, "..")) (char *[2]){p, in->d_name}, pat, recursive);
{ closedir(dir);
if (*p == '/' && !*(p + 1))
path_tmp = ft_strjoin(p, in->d_name);
else
path_tmp = ft_strjoinf(ft_strjoin(p, "/"), in->d_name, 1);
dir_research_recursive(gl, path_tmp, pat);
gl->pat = pat;
if (match_pattern(gl, in->d_name, path_tmp) && ++ret)
ft_ld_pushfront(&gl->match, ft_strdup(path_tmp + 2 *
(path_tmp[0] == '.' && path_tmp[1] == '/')));
ft_strdel(&path_tmp);
}
} }
return (ret); return (ret);
} }

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/04 16:29:54 by wescande #+# #+# */ /* Created: 2017/01/04 16:29:54 by wescande #+# #+# */
/* Updated: 2017/01/31 23:15:27 by wescande ### ########.fr */ /* Updated: 2017/02/01 19:46:22 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -45,9 +45,9 @@ char **glob(const char *pat, const unsigned char *esc)
gl.pat = ((char **)gl.m_pat->content)[0]; gl.pat = ((char **)gl.m_pat->content)[0];
gl.esc = ((unsigned char **)gl.m_pat->content)[1]; gl.esc = ((unsigned char **)gl.m_pat->content)[1];
if (gl.pat[0] != '/') if (gl.pat[0] != '/')
ret = dir_research(&gl, ".", gl.pat); ret = dir_research(&gl, ".", gl.pat, 0);
else else
ret = dir_research(&gl, "/", gl.pat + 1); ret = dir_research(&gl, "/", gl.pat + 1, 0);
if (!ret) if (!ret)
ft_ld_pushfront(&gl.match, ft_ld_pushfront(&gl.match,
ft_strdup(((char **)gl.m_pat->content)[0])); ft_strdup(((char **)gl.m_pat->content)[0]));

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/24 17:30:23 by wescande #+# #+# */ /* Created: 2017/01/24 17:30:23 by wescande #+# #+# */
/* Updated: 2017/01/27 23:45:39 by wescande ### ########.fr */ /* Updated: 2017/02/01 19:46:43 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -72,7 +72,7 @@ static int match_star(t_glob *gl, char *str, char *full_word)
if (gl->pat[1] == '*' && if (gl->pat[1] == '*' &&
!is_char_esc(gl->esc, ((char **)gl->m_pat->content)[0], gl->pat + 1)) !is_char_esc(gl->esc, ((char **)gl->m_pat->content)[0], gl->pat + 1))
dir_research_recursive(gl, full_word, gl->pat + 1); dir_research(gl, full_word, gl->pat + 1, 1);
if (!*++gl->pat) if (!*++gl->pat)
return (1); return (1);
fix = str + ft_strlen(str); fix = str + ft_strlen(str);
@ -113,7 +113,7 @@ int match_pattern(t_glob *gl, char *str, char *full_word)
else if (*gl->pat == '*') else if (*gl->pat == '*')
return (match_star(gl, str, full_word)); return (match_star(gl, str, full_word));
else if (*gl->pat == '/' && !*str && is_directory(full_word)) else if (*gl->pat == '/' && !*str && is_directory(full_word))
dir_research(gl, full_word, gl->pat + 1); dir_research(gl, full_word, gl->pat + 1, 0);
else if (*gl->pat != *str) else if (*gl->pat != *str)
return (0); return (0);
++str; ++str;