optimisation du backquotting + mise a la norme
This commit is contained in:
parent
169aa62b7e
commit
10596c48d9
11 changed files with 188 additions and 140 deletions
|
|
@ -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
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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));
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue