rectif issue sur glob /*/*/* + rectif sur le matching avec plusieurs bquote dans le meme word + rectif expansion sur les char esc

This commit is contained in:
wescande 2017-03-23 03:25:13 +01:00
parent cd5fefa671
commit fb35d3ea53
5 changed files with 35 additions and 32 deletions

View file

@ -6,14 +6,14 @@
# By: wescande <wescande@student.42.fr> +#+ +:+ +#+ # # By: wescande <wescande@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ # # +#+#+#+#+#+ +#+ #
# Created: 2016/08/29 21:32:58 by wescande #+# #+# # # Created: 2016/08/29 21:32:58 by wescande #+# #+# #
# Updated: 2017/03/22 14:59:33 by gwojda ### ########.fr # # Updated: 2017/03/23 01:59:31 by wescande ### ########.fr #
# # # #
# **************************************************************************** # # **************************************************************************** #
NAME = 42sh NAME = 42sh
CC = gcc CC = gcc
FLAGS = -Wall -Wextra -Werror #-fvisibility=hidden# -fsanitize=address FLAGS = -Wall -Wextra -Werror -fsanitize=address
D_FLAGS = -g D_FLAGS = -g
DELTA = $$(echo "$$(tput cols)-47"|bc) DELTA = $$(echo "$$(tput cols)-47"|bc)

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/03/15 18:52:34 by jhalford ### ########.fr */ /* Updated: 2017/03/23 03:18:41 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -65,6 +65,7 @@ char **glob(char *str, unsigned char *esc,
void esc_print(char *str, unsigned char *esc); void esc_print(char *str, unsigned char *esc);
int word_is_assignment(char **content); int word_is_assignment(char **content);
void *tab_esc_copy(void *content); void *tab_esc_copy(void *content);
char *get_output(char *command);
/* /*
** return TRUE if path file is a directory. ** return TRUE if path file is a directory.

View file

@ -6,7 +6,7 @@
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */ /* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/14 19:44:25 by wescande #+# #+# */ /* Created: 2017/03/14 19:44:25 by wescande #+# #+# */
/* Updated: 2017/03/22 22:25:49 by wescande ### ########.fr */ /* Updated: 2017/03/23 03:19:23 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -21,7 +21,8 @@ static char *manage_output(int *fds)
output = NULL; output = NULL;
close(fds[PIPE_WRITE]); close(fds[PIPE_WRITE]);
while ((ret = read(fds[PIPE_READ], buf, BUF_SIZE)) > 0) { while ((ret = read(fds[PIPE_READ], buf, BUF_SIZE)) > 0)
{
buf[ret] = 0; buf[ret] = 0;
ft_strappend(&output, buf); ft_strappend(&output, buf);
} }
@ -52,3 +53,16 @@ char *command_getoutput(char *command)
waitpid(pid, &ret, WUNTRACED); waitpid(pid, &ret, WUNTRACED);
return (manage_output(fds)); return (manage_output(fds));
} }
char *get_output(char *command)
{
char *output;
int len;
if (!(output = command_getoutput(command)))
return (NULL);
len = ft_strlen(output);
while (len && output[--len] == '\n')
output[len] = '\0';
return (output);
}

View file

@ -6,7 +6,7 @@
/* 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/03/22 19:24:52 by jhalford ### ########.fr */ /* Updated: 2017/03/23 03:20:10 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -33,27 +33,27 @@ static void expand_all_bquote(t_bquote *me, char *content,
ft_strlen(me->s2)}), ft_strlen(me->s2)}),
calc_expand_esc(me->esc2, ft_strlen(me->s1), calc_expand_esc(me->esc2, ft_strlen(me->s1),
(int[2]){ft_strlen(content), 1}, (int[2]){ft_strlen(content), 1},
(int[2]){ft_strlen(me->s1) + ft_strlen(me->mid), (int[2]){ft_strlen(me->s1) + ft_strlen(me->mid) + 1,
ft_strlen(me->s2)}), ft_strlen(me->s2)}),
0)); 0));
} }
static void init_expand(t_bquote *me, char *content, int esc) static void init_expand(t_bquote *me, char *content, int doifs)
{ {
char *ifs; char *ifs;
char *content2; char *content2;
ifs = esc ? NULL : ft_getenv(data_singleton()->local_var, "IFS"); ifs = doifs ? ft_getenv(data_singleton()->local_var, "IFS") : NULL;
content = ft_strtok(content, ifs); content = ft_strtok(content, ifs);
if (!content || !(content2 = ft_strtok(NULL, ifs))) if (!content || !(content2 = ft_strtok(NULL, ifs)))
{ {
ft_ld_pushfront(me->wk, gen_tab(ft_strjoinf(ft_strjoin(me->s1, content), ft_ld_pushfront(me->wk, gen_tab(ft_strjoinf(ft_strjoin(me->s1, content),
me->s2, 1), me->s2, 1),
calc_expand_esc(me->esc, ft_strlen(me->s1), (int[2]){ft_strlen(content), 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)}), (int[2]){ft_strlen(me->s1) + ft_strlen(me->mid) + 1, ft_strlen(me->s2)}),
calc_expand_esc(me->esc2, ft_strlen(me->s1), calc_expand_esc(me->esc2, ft_strlen(me->s1),
(int[2]){ft_strlen(content), 1}, (int[2]){ft_strlen(content), 1},
(int[2]){ft_strlen(me->s1) + ft_strlen(me->mid), (int[2]){ft_strlen(me->s1) + ft_strlen(me->mid) + 1,
ft_strlen(me->s2)}), 0)); ft_strlen(me->s2)}), 0));
} }
else else
@ -67,19 +67,6 @@ static void init_expand(t_bquote *me, char *content, int esc)
} }
} }
static char *get_output(char *command)
{
char *output;
int len;
if (!(output = command_getoutput(command)))
return (NULL);
len = ft_strlen(output);
while (output[--len] == '\n')
output[len] = '\0';
return (output);
}
static int search_bquote(t_bquote *me) static int search_bquote(t_bquote *me)
{ {
char *sta; char *sta;
@ -98,7 +85,7 @@ static int search_bquote(t_bquote *me)
me->s2 = ft_strdup(me->str + 1); me->s2 = ft_strdup(me->str + 1);
if ((content = get_output(me->mid))) if ((content = get_output(me->mid)))
init_expand(me, content, init_expand(me, content,
is_char_esc(me->esc, CH(*me->wk)[0], sta)); !is_char_esc(me->esc, CH(*me->wk)[0], sta));
ft_strdel(&me->mid); ft_strdel(&me->mid);
ft_strdel(&me->s1); ft_strdel(&me->s1);
ft_strdel(&me->s2); ft_strdel(&me->s2);
@ -109,12 +96,13 @@ static int search_bquote(t_bquote *me)
return (0); return (0);
} }
void delete(t_ld **tmp, t_ld **src) static int delete(t_ld **tmp, t_ld **src)
{ {
if (*tmp == *src) if (*tmp == *src)
ft_ld_del(src, &ft_tabdel); ft_ld_del(src, &ft_tabdel);
else else
ft_ld_del(tmp, &ft_tabdel); ft_ld_del(tmp, &ft_tabdel);
return (1);
} }
void expand_bquote(t_glob *gl) void expand_bquote(t_glob *gl)
@ -129,15 +117,15 @@ void expand_bquote(t_glob *gl)
while ((gl->m_pat = ft_ld_front(gl->m_pat)) && do_it) while ((gl->m_pat = ft_ld_front(gl->m_pat)) && do_it)
{ {
do_it = 0; do_it = 0;
while (gl->m_pat && !do_it) while (gl->m_pat)
{ {
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.esc2 = UCH(gl->m_pat)[2]; me.esc2 = UCH(gl->m_pat)[2];
me.str = CH(gl->m_pat)[0] - 1; me.str = CH(gl->m_pat)[0] - 1;
if ((tmp = gl->m_pat) && if ((tmp = gl->m_pat) &&
(do_it = search_bquote(&me)) == 1) (do_it = search_bquote(&me)) && delete(&tmp, &gl->m_pat))
delete(&tmp, &gl->m_pat); continue;
if (!gl->m_pat || !gl->m_pat->next) if (!gl->m_pat || !gl->m_pat->next)
break ; break ;
gl->m_pat = gl->m_pat->next; gl->m_pat = gl->m_pat->next;

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/03/14 23:25:44 by wescande ### ########.fr */ /* Updated: 2017/03/23 03:16:08 by wescande ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -71,8 +71,8 @@ static int match_star(t_glob *gl, char *str, char *full_word)
char *fix; char *fix;
char *pat; char *pat;
if (gl->pat[1] == '*' && if (!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)) && gl->pat[1] == '*')
{ {
while (gl->pat[1] == '*') while (gl->pat[1] == '*')
++gl->pat; ++gl->pat;