optimisation du backquotting + mise a la norme

This commit is contained in:
wescande 2017-02-20 19:11:52 +01:00
parent 169aa62b7e
commit 10596c48d9
11 changed files with 188 additions and 140 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/02/20 14:10:48 by wescande ### ########.fr */ /* Updated: 2017/02/20 19:03:45 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -17,6 +17,8 @@
# define CH(x) ((char **)(x)->content) # define CH(x) ((char **)(x)->content)
# define UCH(x) ((unsigned char **)(x)->content) # define UCH(x) ((unsigned char **)(x)->content)
# define SCH(x) ((char **)(x).content)
# define SUCH(x) ((unsigned char **)(x).content)
typedef struct s_ld typedef struct s_ld
{ {
@ -46,6 +48,16 @@ typedef struct s_expand
char *s1; char *s1;
} t_expand; } t_expand;
typedef struct s_bquote
{
t_ld **wk;
char *str;
unsigned char *esc;
unsigned char *esc2;
char *s1;
char *s2;
char *mid;
} t_bquote;
/* /*
** interface of glob. ** interface of glob.
*/ */
@ -86,6 +98,8 @@ void expand_bquote(t_glob *gl);
void expand_var(t_glob *tglob); void expand_var(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, char *pat, int rec); int dir_research(t_glob *tglob, char *p, char *pat, int rec);
char **gen_tab(const char *pat, const unsigned char *esc,
const unsigned char *esc2, int dup);
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,

@ -1 +1 @@
Subproject commit a82ea94ef7f50f8396d7bf6f9c08ab4a7faa994d Subproject commit 9aa3049dd23424807316a6f027589a95cdf1fcdd

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/17 15:38:14 by jhalford #+# #+# */ /* Created: 2017/02/17 15:38:14 by jhalford #+# #+# */
/* Updated: 2017/02/17 16:29:42 by jhalford ### ########.fr */ /* Updated: 2017/02/20 18:49:02 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -19,7 +19,7 @@ void esc_print(char *str, unsigned char *esc)
cur = str; cur = str;
while (*cur) while (*cur)
{ {
if (is_char_esc(esc,str,cur)) if (is_char_esc(esc, str, cur))
printf("\\%c", *cur); printf("\\%c", *cur);
else else
printf("%c", *cur); printf("%c", *cur);
@ -27,4 +27,3 @@ void esc_print(char *str, unsigned char *esc)
} }
printf("\n"); printf("\n");
} }

View file

@ -6,106 +6,133 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/17 17:47:53 by wescande #+# #+# */ /* Created: 2017/02/17 17:47:53 by wescande #+# #+# */
/* Updated: 2017/02/20 15:26:26 by wescande ### ########.fr */ /* Updated: 2017/02/20 19:11:11 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "glob.h" #include "glob.h"
/* static void expand_all_bquote(t_bquote *me, char *content,
** expand_bquote return expansion of a string after subshell execution char *ifs)
** input parameters are :
** -t_glob *gl -> struct of expanding
*/
static void insert_bquote(t_glob *gl, char *pos, char *name, char *content)
{ {
char *s1; char *content2;
char *s2;
int delta;
unsigned char *new_esc;
delta = pos - gl->pat; while ((content2 = ft_strtok(NULL, ifs)))
s1 = ft_strsub(gl->pat, 0, delta); {
delta += ft_strlen(name) + 1; ft_ld_pushfront(me->wk, gen_tab(ft_strdup(content),
s2 = ft_strsubf(gl->pat, delta, ft_strlen(gl->pat) - delta, 1); calc_expand_esc(me->esc, 0,
gl->pat = ft_strjoinf(ft_strjoin(s1, content), s2, 1); (int[2]){ft_strlen(content), 1}, (int[2]){0, 0}),
new_esc = calc_expand_esc(gl->esc, ft_strlen(s1), calc_expand_esc(me->esc2, 0,
(int [2]){ft_strlen(content), 1}, (int[2]){ft_strlen(content), 1}, (int[2]){0, 0}), 0));
(int [2]){delta, ft_strlen(s2)}); content = content2;
ft_memdel((void **)&gl->esc); }
gl->esc = new_esc; ft_ld_pushfront(me->wk, gen_tab(ft_strjoin(content, me->s2),
new_esc = calc_expand_esc(gl->esc2, ft_strlen(s1), calc_expand_esc(me->esc, 0,
(int [2]){ft_strlen(content), 1}, (int[2]){ft_strlen(content), 1},
(int [2]){delta, ft_strlen(s2)}); (int[2]){ft_strlen(me->s1) + ft_strlen(me->mid),
ft_memdel((void **)&gl->esc2); ft_strlen(me->s2)}),
gl->esc2 = new_esc; calc_expand_esc(me->esc2, ft_strlen(me->s1),
ft_strdel(&s1); (int[2]){ft_strlen(content), 1},
ft_strdel(&s2); (int[2]){ft_strlen(me->s1) + ft_strlen(me->mid),
ft_strdel(&content); ft_strlen(me->s2)}),
0));
} }
static void manage_bquote(int esc, char *str) static void init_expand(t_bquote *me, char *content, int esc)
{ {
int len;
char *ifs; char *ifs;
char *pos; char *content2;
len = ft_strlen(str) - 1;
while (str[len] == '\n')
{
str[len--] = '\0';
}
ifs = esc ? NULL : ft_getenv(data_singleton()->env, "IFS"); ifs = esc ? NULL : ft_getenv(data_singleton()->env, "IFS");
if (ifs) content = ft_strtok(content, ifs);
if (!(content2 = ft_strtok(NULL, ifs)))
ft_ld_pushfront(me->wk, gen_tab(ft_strjoinf(ft_strjoin(me->s1, content),
me->s2, 1),
calc_expand_esc(me->esc, ft_strlen(me->s1),
(int[2]){ft_strlen(content), 1},
(int[2]){ft_strlen(me->s1) + ft_strlen(me->mid),
ft_strlen(me->s2)}),
calc_expand_esc(me->esc2, ft_strlen(me->s1),
(int[2]){ft_strlen(content), 1},
(int[2]){ft_strlen(me->s1) + ft_strlen(me->mid),
ft_strlen(me->s2)}), 0));
else
{ {
while (*ifs) ft_ld_pushfront(me->wk, gen_tab(ft_strjoin(me->s1, content),
{ calc_expand_esc(me->esc, ft_strlen(me->s1),
while ((pos = ft_strchr(str, *ifs))) (int[2]){ft_strlen(content), 1}, (int[2]){0, 0}),
*pos = ' '; calc_expand_esc(me->esc2, ft_strlen(me->s1),
++ifs; (int[2]){ft_strlen(content), 1}, (int[2]){0, 0}), 0));
} expand_all_bquote(me, content2, ifs);
} }
} }
static char *get_cmd(t_glob *gl, const char *pat) static char *get_output(char *command)
{ {
const char *str; char *output;
int len;
str = pat; output = command_getoutput(command);
while (*str) len = ft_strlen(output);
{ while (output[--len] == '\n')
if (*str == '`' && !is_char_esc(gl->esc2, gl->pat, str)) output[len] = '\0';
break ; return (output);
++str;
}
if (*str)
return (ft_strsub(pat, 0, str - pat));
return (NULL);
} }
static int search_bquote(t_bquote *me)
{
char *sta;
char *content;
sta = NULL;
while (*me->str)
{
sta = *me->str == '`' && !sta
&& !is_char_esc(me->esc2, CH(*me->wk)[0], me->str) ? me->str : sta;
if (sta && *me->str == '`' && me->str != sta
&& !is_char_esc(me->esc2, CH(*me->wk)[0], me->str))
{
me->mid = ft_strsub(sta, 1, me->str - sta - 1);
me->s1 = ft_strsub(CH(*me->wk)[0], 0, sta - CH(*me->wk)[0]);
me->s2 = ft_strdup(me->str + 1);
content = get_output(me->mid);
init_expand(me, content, is_char_esc(me->esc, CH(*me->wk)[0], sta));
ft_strdel(&me->mid);
ft_strdel(&me->s1);
ft_strdel(&me->s2);
ft_strdel(&content);
return (1);
}
++me->str;
}
return (0);
}
void expand_bquote(t_glob *gl) void expand_bquote(t_glob *gl)
{ {
char *pat; t_ld *tmp;
char *var; t_bquote me;
char *content; int do_it;
pat = gl->pat; ft_ld_pushfront(&gl->m_pat, gen_tab(gl->pat, gl->esc, gl->esc2, 0));
while (*pat) me = (t_bquote){NULL, NULL, NULL, NULL, NULL, NULL, NULL};
do_it = 1;
while ((gl->m_pat = ft_ld_front(gl->m_pat)) && do_it)
{ {
if (*pat == '`' && !is_char_esc(gl->esc2, gl->pat, pat) && do_it = 0;
(var = get_cmd(gl, pat + 1))) while (gl->m_pat && !do_it)
{ {
if (ft_strlen(var)) me.wk = &gl->m_pat;
{ me.esc = UCH(gl->m_pat)[1];
if ((content = command_getoutput(var))) me.esc2 = UCH(gl->m_pat)[2];
manage_bquote(is_char_esc(gl->esc, gl->pat, pat), content); me.str = CH(gl->m_pat)[0];
insert_bquote(gl, pat, var, content); if ((tmp = gl->m_pat) &&
pat = gl->pat; (do_it = search_bquote(&me)) == 1)
ft_ld_del(&tmp, &ft_tabdel);
if (!gl->m_pat->next)
break ;
gl->m_pat = gl->m_pat->next;
} }
ft_strdel(&var);
}
++pat;
} }
ft_ld_reverse(&gl->m_pat);
} }

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/12 19:00:29 by wescande #+# #+# */ /* Created: 2017/01/12 19:00:29 by wescande #+# #+# */
/* Updated: 2017/02/20 14:05:20 by wescande ### ########.fr */ /* Updated: 2017/02/20 18:54:19 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -20,23 +20,32 @@
** -t_glob *gl -> struct of expanding ** -t_glob *gl -> struct of expanding
*/ */
static char **gen_tab(const char *pat, char **gen_tab(const char *pat,
const unsigned char *esc, int dup) const unsigned char *esc,
const unsigned char *esc2,
int dup)
{ {
char **my_tab; char **my_tab;
if (!(my_tab = (char **)malloc(sizeof(char *) * 3))) if (!(my_tab = (char **)malloc(sizeof(char *) * (esc2 ? 4 : 3))))
return (NULL); return (NULL);
if (dup) if (dup)
{ {
my_tab[0] = ft_strdup(pat); my_tab[0] = ft_strdup(pat);
my_tab[1] = ft_strdup((const char *)esc); my_tab[1] = ft_strdup((const char *)esc);
if (esc2)
my_tab[2] = ft_strdup((const char *)esc2);
} }
else else
{ {
my_tab[0] = (char *)pat; my_tab[0] = (char *)pat;
my_tab[1] = (char *)esc; my_tab[1] = (char *)esc;
if (esc2)
my_tab[2] = (char *)esc2;
} }
if (esc2)
my_tab[3] = NULL;
else
my_tab[2] = NULL; my_tab[2] = NULL;
return (my_tab); return (my_tab);
} }
@ -56,11 +65,11 @@ static void iter_on_each(t_expand *me)
first = ft_strjoinf(ft_strjoin(me->s1, me->split[i]), me->str + 1, 1); first = ft_strjoinf(ft_strjoin(me->s1, me->split[i]), me->str + 1, 1);
second = calc_expand_esc(me->esc, second = calc_expand_esc(me->esc,
ft_strlen(me->s1), ft_strlen(me->s1),
(int [2]){ft_strlen(me->split[i]), 0}, (int[2]){ft_strlen(me->split[i]), 0},
(int [2]){me->str - CH(*me->wk)[0], ft_strlen(me->str + 1)}); (int[2]){me->str - CH(*me->wk)[0], ft_strlen(me->str + 1)});
modify_esc_split(second, me->m_esc[i], modify_esc_split(second, me->m_esc[i],
ft_strlen(me->s1), ft_strlen(me->split[i])); ft_strlen(me->s1), ft_strlen(me->split[i]));
my_new = gen_tab(first, second, 0); my_new = gen_tab(first, second, NULL, 0);
ft_ld_pushfront(me->wk, my_new); ft_ld_pushfront(me->wk, my_new);
} }
me->wk = &wk_tmp; me->wk = &wk_tmp;
@ -93,7 +102,7 @@ static int search_brace(t_expand *me)
start = NULL; start = NULL;
nb = 0; nb = 0;
com = 0; com = 0;
while (*me->str) while (*++me->str)
{ {
start = *me->str == '{' && !is_char_esc(me->esc, CH(*me->wk)[0], start = *me->str == '{' && !is_char_esc(me->esc, CH(*me->wk)[0],
me->str) && nb == 0 ? me->str : start; me->str) && nb == 0 ? me->str : start;
@ -109,7 +118,6 @@ static int search_brace(t_expand *me)
set_char_esc(me->esc, CH(*me->wk)[0], me->str); set_char_esc(me->esc, CH(*me->wk)[0], me->str);
return (2); return (2);
} }
++me->str;
} }
return (0); return (0);
} }
@ -120,21 +128,22 @@ void expand_brace(t_glob *gl)
int do_it; int do_it;
t_expand me; t_expand me;
ft_ld_pushfront(&gl->m_pat, gen_tab("", (const unsigned char *)"", 1));
ft_ld_pushfront(&gl->m_pat, gen_tab(gl->pat, gl->esc, 0));
me = (t_expand){NULL, NULL, NULL, NULL, NULL, NULL}; me = (t_expand){NULL, NULL, NULL, NULL, NULL, NULL};
do_it = 1; do_it = 1;
while (do_it) while (do_it)
{ {
do_it = 0; do_it = 0;
while (gl->m_pat->next && !do_it) while (gl->m_pat && !do_it)
{ {
me.wk = &gl->m_pat; me.wk = &gl->m_pat;
me.esc = UCH(gl->m_pat)[1]; me.esc = UCH(gl->m_pat)[1];
me.str = CH(gl->m_pat)[0]; me.str = CH(gl->m_pat)[0];
--me.str;
if ((tmp = gl->m_pat) && if ((tmp = gl->m_pat) &&
(do_it = search_brace(&me)) == 1) (do_it = search_brace(&me)) == 1)
ft_ld_del(&tmp, &ft_tabdel); ft_ld_del(&tmp, &ft_tabdel);
if (!gl->m_pat->next)
break ;
gl->m_pat = gl->m_pat->next; gl->m_pat = gl->m_pat->next;
} }
gl->m_pat = ft_ld_front(gl->m_pat); gl->m_pat = ft_ld_front(gl->m_pat);

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/31 23:18:56 by wescande #+# #+# */ /* Created: 2017/01/31 23:18:56 by wescande #+# #+# */
/* Updated: 2017/02/07 15:49:15 by wescande ### ########.fr */ /* Updated: 2017/02/20 17:25:43 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -20,23 +20,23 @@ unsigned char *calc_expand_esc(const unsigned char *esc,
int pos; int pos;
if (!(new_esc = (unsigned char *)ft_strnew(((nb_start + nb_middle[0] if (!(new_esc = (unsigned char *)ft_strnew(((nb_start + nb_middle[0]
+ nb_end[1]) / 8) + 1))) + nb_end[1]) >> 3) + 1)))
return (NULL); return (NULL);
index = -1; index = -1;
while (++index < nb_start) while (++index < nb_start)
new_esc[index / 8] |= new_esc[index >> 3] |=
((esc[index / 8] >> (7 - index % 8)) & 1) << (7 - index % 8); ((esc[index >> 3] >> (7 - index % 8)) & 1) << (7 - index % 8);
pos = -1; pos = -1;
while (++pos < nb_middle[0]) while (++pos < nb_middle[0])
{ {
new_esc[index / 8] |= nb_middle[1] << (7 - index % 8); new_esc[index >> 3] |= nb_middle[1] << (7 - index % 8);
++index; ++index;
} }
pos = nb_end[0]; pos = nb_end[0];
while (++pos <= nb_end[0] + nb_end[1]) while (++pos <= nb_end[0] + nb_end[1])
{ {
new_esc[index / 8] |= new_esc[index >> 3] |=
((esc[pos / 8] >> (7 - pos % 8)) & 1) << (7 - index % 8); ((esc[pos >> 3] >> (7 - pos % 8)) & 1) << (7 - index % 8);
++index; ++index;
} }
return (new_esc); return (new_esc);
@ -52,8 +52,8 @@ void modify_esc_split(unsigned char *esc_dest,
while (++index < len) while (++index < len)
{ {
wk = index + start - 1; wk = index + start - 1;
esc_dest[wk / 8] |= esc_dest[wk >> 3] |=
((esc_src[index / 8] >> (7 - index % 8)) & 1) << (7 - wk % 8); ((esc_src[index >> 3] >> (7 - index % 8)) & 1) << (7 - wk % 8);
} }
} }
@ -63,13 +63,13 @@ unsigned char *ft_sub_esc(const unsigned char *esc,
unsigned char *new_esc; unsigned char *new_esc;
int index; int index;
if (!(new_esc = (unsigned char *)ft_strnew(((len) / 8) + 1))) if (!(new_esc = (unsigned char *)ft_strnew(((len) >> 3) + 1)))
return (NULL); return (NULL);
index = -1; index = -1;
while (++index < len) while (++index < len)
{ {
new_esc[index / 8] |= new_esc[index >> 3] |=
((esc[start / 8] >> (7 - start % 8)) & 1) << (7 - index % 8); ((esc[start >> 3] >> (7 - start % 8)) & 1) << (7 - index % 8);
++start; ++start;
} }
return (new_esc); return (new_esc);

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/06 16:09:27 by wescande #+# #+# */ /* Created: 2017/02/06 16:09:27 by wescande #+# #+# */
/* Updated: 2017/02/20 15:24:34 by wescande ### ########.fr */ /* Updated: 2017/02/20 18:56:50 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -31,13 +31,13 @@ static void insert_var(t_glob *gl, char *pos, char *name, char *content)
s2 = ft_strsubf(gl->pat, delta, ft_strlen(gl->pat) - delta, 1); s2 = ft_strsubf(gl->pat, delta, ft_strlen(gl->pat) - delta, 1);
gl->pat = ft_strjoinf(ft_strjoin(s1, content), s2, 1); gl->pat = ft_strjoinf(ft_strjoin(s1, content), s2, 1);
new_esc = calc_expand_esc(gl->esc, ft_strlen(s1), new_esc = calc_expand_esc(gl->esc, ft_strlen(s1),
(int [2]){ft_strlen(content), 1}, (int[2]){ft_strlen(content), 1},
(int [2]){delta, ft_strlen(s2)}); (int[2]){delta, ft_strlen(s2)});
ft_memdel((void **)&gl->esc); ft_memdel((void **)&gl->esc);
gl->esc = new_esc; gl->esc = new_esc;
new_esc = calc_expand_esc(gl->esc2, ft_strlen(s1), new_esc = calc_expand_esc(gl->esc2, ft_strlen(s1),
(int [2]){ft_strlen(content), 1}, (int[2]){ft_strlen(content), 1},
(int [2]){delta, ft_strlen(s2)}); (int[2]){delta, ft_strlen(s2)});
ft_memdel((void **)&gl->esc2); ft_memdel((void **)&gl->esc2);
gl->esc2 = new_esc; gl->esc2 = new_esc;
ft_strdel(&s1); ft_strdel(&s1);
@ -72,7 +72,7 @@ void expand_var(t_glob *gl)
if (*pat == '$' && !is_char_esc(gl->esc2, gl->pat, pat) && if (*pat == '$' && !is_char_esc(gl->esc2, gl->pat, pat) &&
(var = get_name(gl, pat + 1))) (var = get_name(gl, pat + 1)))
{ {
if (ft_strlen(var)) if (var && *var)
{ {
content = ft_getenv(data_singleton()->env, var); content = ft_getenv(data_singleton()->env, var);
insert_var(gl, pat, var, content); insert_var(gl, pat, var, content);

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/31 20:49:30 by wescande #+# #+# */ /* Created: 2017/01/31 20:49:30 by wescande #+# #+# */
/* Updated: 2017/02/20 12:37:12 by wescande ### ########.fr */ /* Updated: 2017/02/20 18:57:58 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -63,9 +63,8 @@ char **ft_strsplit_spe(const char *str,
const char *fix; const char *fix;
int len; int len;
if (!str) if (!str || !(s1 =
return (NULL); (char**)malloc(sizeof(*s1) * (ft_nbstr_c(str, esc, c) + 1))))
if (!(s1 = (char**)malloc(sizeof(*s1) * (ft_nbstr_c(str, esc, c) + 1))))
return (NULL); return (NULL);
i = 0; i = 0;
fix = str; fix = str;

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/02/20 14:19:46 by wescande ### ########.fr */ /* Updated: 2017/02/20 19:04:44 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -22,15 +22,16 @@
** to just expanse in local directory and not in path dir ** to just expanse in local directory and not in path dir
*/ */
static char **treat_glob(t_ld **match) static char **treat_glob(t_glob *gl)
{ {
char **gl; char **ret;
gl = NULL; ret= NULL;
ft_ld_reverse(match); ft_ld_clear(&gl->m_pat, &ft_tabdel);
gl = ft_ld_to_tab(*match); ft_ld_reverse(&gl->match);
ft_ld_clear(match, &ft_strdel); ret = ft_ld_to_tab(gl->match);
return (gl); ft_ld_clear(&gl->match, &ft_strdel);
return (ret);
} }
char **glob(char *pat, unsigned char *esc, char **glob(char *pat, unsigned char *esc,
@ -41,25 +42,24 @@ char **glob(char *pat, unsigned char *esc,
len = ft_strlen(pat); len = ft_strlen(pat);
gl = (t_glob){0, 0, ft_strdup(pat), dup_char_esc(esc, (len >> 3) + 1), gl = (t_glob){0, 0, ft_strdup(pat), dup_char_esc(esc, (len >> 3) + 1),
dup_char_esc(esc2, (len >> 3) +1), NULL, NULL}; dup_char_esc(esc2, (len >> 3) + 1), NULL, NULL};
expand_var(&gl); expand_var(&gl);
expand_bquote(&gl); expand_bquote(&gl);
ft_memdel((void **)&gl.esc2);
expand_brace(&gl); expand_brace(&gl);
while (gl.m_pat->next && !(gl.found = 0)) while (gl.m_pat && !(gl.found = 0))
{ {
gl.cur_dir = 1; gl.cur_dir = 1;
gl.pat = ((char **)gl.m_pat->content)[0]; gl.pat = CH(gl.m_pat)[0];
gl.esc = ((unsigned char **)gl.m_pat->content)[1]; if ((gl.esc = UCH(gl.m_pat)[1]) && gl.pat[0] != '/')
if (gl.pat[0] != '/')
dir_research(&gl, ".", gl.pat, 0); dir_research(&gl, ".", gl.pat, 0);
else else
dir_research(&gl, "/", gl.pat + 1, 0); dir_research(&gl, "/", gl.pat + 1, 0);
if (!gl.found) if (!gl.found)
ft_ld_pushfront(&gl.match, ft_ld_pushfront(&gl.match,
ft_strjoin(gl.cur_dir ? "" : "./", ((char **)gl.m_pat->content)[0])); ft_strjoin(gl.cur_dir ? "" : "./", CH(gl.m_pat)[0]));
if (!gl.m_pat->next)
break ;
gl.m_pat = gl.m_pat->next; gl.m_pat = gl.m_pat->next;
} }
ft_ld_clear(&gl.m_pat, &ft_tabdel); return (treat_glob(&gl));
return (treat_glob(&gl.match));
} }

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/27 18:19:55 by wescande #+# #+# */ /* Created: 2017/01/27 18:19:55 by wescande #+# #+# */
/* Updated: 2017/02/17 16:29:20 by jhalford ### ########.fr */ /* Updated: 2017/02/20 18:51:47 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/12/12 17:37:04 by jhalford #+# #+# */ /* Created: 2016/12/12 17:37:04 by jhalford #+# #+# */
/* Updated: 2017/01/10 16:51:45 by jhalford ### ########.fr */ /* Updated: 2017/02/20 18:37:46 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -14,7 +14,7 @@
void shell_exit(void) void shell_exit(void)
{ {
DG("shell_exit()"); // DG("shell_exit()");
data_exit(); data_exit();
if (SH_HAS_JOBC(data_singleton()->opts)) if (SH_HAS_JOBC(data_singleton()->opts))
job_kill_all(); job_kill_all();