From 169aa62b7edcaabef54ed07505c235e0e1e958f0 Mon Sep 17 00:00:00 2001 From: wescande Date: Mon, 20 Feb 2017 15:31:13 +0100 Subject: [PATCH] rectif nombreuses issues + ajout de l'expansion des backquote --- 42sh/Makefile | 1 + 42sh/file | 18 ---- 42sh/includes/glob.h | 3 +- 42sh/src/glob/expand_bquote.c | 159 ++++++++++++++------------------ 42sh/src/glob/expand_brace.c | 13 +-- 42sh/src/glob/expand_var.c | 11 ++- 42sh/src/glob/ft_strsplit_spe.c | 3 +- 42sh/src/glob/glob.c | 4 +- 42sh/src/glob/match_pattern.c | 6 +- 42sh/src/lexer/expand_bquotes.c | 5 +- 42sh/src/main/main.c | 9 +- 11 files changed, 102 insertions(+), 130 deletions(-) delete mode 100644 42sh/file diff --git a/42sh/Makefile b/42sh/Makefile index 220e4cec..af4c2ff4 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -85,6 +85,7 @@ exec/redirect_lessand.c\ exec/set_exitstatus.c\ glob/dir_glob.c\ glob/esc_print.c\ +glob/expand_bquote.c\ glob/expand_brace.c\ glob/expand_esc.c\ glob/expand_var.c\ diff --git a/42sh/file b/42sh/file deleted file mode 100644 index 982f231a..00000000 --- a/42sh/file +++ /dev/null @@ -1,18 +0,0 @@ -4 -42sh -Makefile -Session.vim -debug -donovan_segaults_06-02 -file -file1 -file2 -file3 -includes -libft -objs -out -pdf -script.sh -src -update_makefile.sh diff --git a/42sh/includes/glob.h b/42sh/includes/glob.h index 56d25818..f5acc6c3 100644 --- a/42sh/includes/glob.h +++ b/42sh/includes/glob.h @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/04 16:31:18 by wescande #+# #+# */ -/* Updated: 2017/02/17 15:42:09 by jhalford ### ########.fr */ +/* Updated: 2017/02/20 14:10:48 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -82,6 +82,7 @@ unsigned char *calc_expand_esc(const unsigned char *esc, void modify_esc_split(unsigned char *esc_dest, unsigned char *esc_src, int start, int len); void expand_brace(t_glob *tglob); +void expand_bquote(t_glob *gl); void expand_var(t_glob *tglob); int match_pattern(t_glob *tglob, char *str, char *full_word); int dir_research(t_glob *tglob, char *p, char *pat, int rec); diff --git a/42sh/src/glob/expand_bquote.c b/42sh/src/glob/expand_bquote.c index 2904df33..a3ec8d17 100644 --- a/42sh/src/glob/expand_bquote.c +++ b/42sh/src/glob/expand_bquote.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 17:47:53 by wescande #+# #+# */ -/* Updated: 2017/02/17 18:18:36 by wescande ### ########.fr */ +/* Updated: 2017/02/20 15:26:26 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,113 +18,94 @@ ** -t_glob *gl -> struct of expanding */ -static char **gen_tab(const char *pat, - const unsigned char *esc, int dup) +static void insert_bquote(t_glob *gl, char *pos, char *name, char *content) { - char **my_tab; + char *s1; + char *s2; + int delta; + unsigned char *new_esc; - if (!(my_tab = (char **)malloc(sizeof(char *) * 3))) - return (NULL); - if (dup) - { - my_tab[0] = ft_strdup(pat); - my_tab[1] = ft_strdup((const char *)esc); - } - else - { - my_tab[0] = (char *)pat; - my_tab[1] = (char *)esc; - } - my_tab[2] = NULL; - return (my_tab); + delta = pos - gl->pat; + s1 = ft_strsub(gl->pat, 0, delta); + delta += ft_strlen(name) + 1; + s2 = ft_strsubf(gl->pat, delta, ft_strlen(gl->pat) - delta, 1); + gl->pat = ft_strjoinf(ft_strjoin(s1, content), s2, 1); + new_esc = calc_expand_esc(gl->esc, ft_strlen(s1), + (int [2]){ft_strlen(content), 1}, + (int [2]){delta, ft_strlen(s2)}); + ft_memdel((void **)&gl->esc); + gl->esc = new_esc; + new_esc = calc_expand_esc(gl->esc2, ft_strlen(s1), + (int [2]){ft_strlen(content), 1}, + (int [2]){delta, ft_strlen(s2)}); + ft_memdel((void **)&gl->esc2); + gl->esc2 = new_esc; + ft_strdel(&s1); + ft_strdel(&s2); + ft_strdel(&content); } -static void iter_on_each(t_expand *me) +static void manage_bquote(int esc, char *str) { - int i; - char **my_new; - char *first; - unsigned char *second; - t_ld *wk_tmp; + int len; + char *ifs; + char *pos; - i = ft_tablen(me->split); - wk_tmp = *me->wk; - while (i--) + len = ft_strlen(str) - 1; + while (str[len] == '\n') { - first = ft_strjoinf(ft_strjoin(me->s1, me->split[i]), me->str + 1, 1); - second = calc_expand_esc(me->esc, - ft_strlen(me->s1), - (int [2]){ft_strlen(me->split[i]), 0}, - (int [2]){me->str - CH(*me->wk)[0], ft_strlen(me->str + 1)}); - modify_esc_split(second, me->m_esc[i], - ft_strlen(me->s1), ft_strlen(me->split[i])); - my_new = gen_tab(first, second, 0); - ft_ld_pushfront(&wk_tmp, my_new); + str[len--] = '\0'; } - me->wk = &wk_tmp; -} - -static int init_expand(t_expand *me, char *start) -{ - unsigned char *esc; - - me->s1 = ft_strsub(start, 1, me->str - start - 1); - esc = ft_sub_esc(me->esc, start - CH(*me->wk)[0] + 1, me->str - start); - me->split = ft_strsplit_spe(me->s1, esc, ','); - me->m_esc = ft_strsplit_esc(me->s1, esc, ','); - ft_strdel(&me->s1); - ft_strdel((char **)&esc); - me->s1 = ft_strsub(CH(*me->wk)[0], 0, start - CH(*me->wk)[0]); - iter_on_each(me); - ft_strdel(&me->s1); - ft_tabdel(&me->split); - ft_tabdel((char ***)&me->m_esc); - return (1); -} - -static int search_bquote(t_expand *me) -{ - char *start; - - start = NULL; - while (*me->str) + ifs = esc ? NULL : ft_getenv(data_singleton()->env, "IFS"); + if (ifs) { - start = *me->str == '`' && !is_char_esc(me->esc, CH(*me->wk)[0], - me->str) && !start ? me->str : start; - if (start && start != me->str && - *me->str == '`' && !is_char_esc(me->esc, CH(*me->wk)[0], me->str)) + while (*ifs) { - return (init_expand(me, start)); -// set_char_esc(me->esc, CH(*me->wk)[0], start); -// set_char_esc(me->esc, CH(*me->wk)[0], me->str); -// return (2); + while ((pos = ft_strchr(str, *ifs))) + *pos = ' '; + ++ifs; } - ++me->str; } - return (0); } +static char *get_cmd(t_glob *gl, const char *pat) +{ + const char *str; + + str = pat; + while (*str) + { + if (*str == '`' && !is_char_esc(gl->esc2, gl->pat, str)) + break ; + ++str; + } + if (*str) + return (ft_strsub(pat, 0, str - pat)); + return (NULL); +} + + void expand_bquote(t_glob *gl) { - t_ld *tmp; - int do_it; - t_expand me; + char *pat; + char *var; + char *content; - me = (t_expand){NULL, NULL, NULL, NULL, NULL, NULL}; - do_it = 1; - while (do_it) + pat = gl->pat; + while (*pat) { - do_it = 0; - while (gl->m_pat->next && !do_it) + if (*pat == '`' && !is_char_esc(gl->esc2, gl->pat, pat) && + (var = get_cmd(gl, pat + 1))) { - me.wk = &gl->m_pat; - me.esc = UCH(gl->m_pat)[1]; - me.str = CH(gl->m_pat)[0]; - if ((tmp = gl->m_pat) && - (do_it = search_bquote(&me)) == 1) - ft_ld_del(&tmp, &ft_tabdel); - gl->m_pat = gl->m_pat->next; + if (ft_strlen(var)) + { + if ((content = command_getoutput(var))) + manage_bquote(is_char_esc(gl->esc, gl->pat, pat), content); + insert_bquote(gl, pat, var, content); + pat = gl->pat; + } + ft_strdel(&var); } - gl->m_pat = ft_ld_front(gl->m_pat); + ++pat; } } diff --git a/42sh/src/glob/expand_brace.c b/42sh/src/glob/expand_brace.c index 27b4b71d..418ed449 100644 --- a/42sh/src/glob/expand_brace.c +++ b/42sh/src/glob/expand_brace.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/12 19:00:29 by wescande #+# #+# */ -/* Updated: 2017/02/07 16:10:20 by wescande ### ########.fr */ +/* Updated: 2017/02/20 14:05:20 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -61,7 +61,7 @@ static void iter_on_each(t_expand *me) modify_esc_split(second, me->m_esc[i], ft_strlen(me->s1), ft_strlen(me->split[i])); my_new = gen_tab(first, second, 0); - ft_ld_pushfront(&wk_tmp, my_new); + ft_ld_pushfront(me->wk, my_new); } me->wk = &wk_tmp; } @@ -87,22 +87,23 @@ static int init_expand(t_expand *me, char *start) static int search_brace(t_expand *me) { char *start; - int comma; + int com; int nb; start = NULL; nb = 0; - comma = 0; + com = 0; while (*me->str) { start = *me->str == '{' && !is_char_esc(me->esc, CH(*me->wk)[0], me->str) && nb == 0 ? me->str : start; nb += *me->str == '{' && !is_char_esc(me->esc, CH(*me->wk)[0], me->str); nb -= *me->str == '}' && !is_char_esc(me->esc, CH(*me->wk)[0], me->str); - comma += *me->str == ',' && nb == 1; + com += *me->str == ',' && !is_char_esc(me->esc, CH(*me->wk)[0], me->str) + && nb == 1; if (!nb && start) { - if (comma) + if (com) return (init_expand(me, start)); set_char_esc(me->esc, CH(*me->wk)[0], start); set_char_esc(me->esc, CH(*me->wk)[0], me->str); diff --git a/42sh/src/glob/expand_var.c b/42sh/src/glob/expand_var.c index 374fbc87..c73d9c6c 100644 --- a/42sh/src/glob/expand_var.c +++ b/42sh/src/glob/expand_var.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/06 16:09:27 by wescande #+# #+# */ -/* Updated: 2017/02/07 17:18:33 by wescande ### ########.fr */ +/* Updated: 2017/02/20 15:24:34 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ static void insert_var(t_glob *gl, char *pos, char *name, char *content) s1 = ft_strsub(gl->pat, 0, delta); delta += ft_strlen(name) + 1; s2 = ft_strsubf(gl->pat, delta, ft_strlen(gl->pat) - delta, 1); - gl->pat = ft_strjoinf(ft_strjoinf(s1, content, 1), s2, 3); + gl->pat = ft_strjoinf(ft_strjoin(s1, content), s2, 1); new_esc = calc_expand_esc(gl->esc, ft_strlen(s1), (int [2]){ft_strlen(content), 1}, (int [2]){delta, ft_strlen(s2)}); @@ -40,6 +40,9 @@ static void insert_var(t_glob *gl, char *pos, char *name, char *content) (int [2]){delta, ft_strlen(s2)}); ft_memdel((void **)&gl->esc2); gl->esc2 = new_esc; + ft_strdel(&s1); + ft_strdel(&s2); + ft_strdel(&content); } static char *get_name(t_glob *gl, const char *pat) @@ -49,11 +52,11 @@ static char *get_name(t_glob *gl, const char *pat) str = pat; if (ft_isdigit(*str)) return (ft_strsub(pat, 0, str - pat + 1)); + if (*str == '?') + return (ft_strsub(pat, 0, str - pat + 1)); while ((ft_isalnum(*str) || *str == '_' || *str == '-') && !is_char_esc(gl->esc2, gl->pat, str)) ++str; - if (is_char_esc(gl->esc2, gl->pat, str)) - return (ft_strsub(pat, 0, str - pat)); return (ft_strsub(pat, 0, str - pat)); } diff --git a/42sh/src/glob/ft_strsplit_spe.c b/42sh/src/glob/ft_strsplit_spe.c index a76d475e..3948c79d 100644 --- a/42sh/src/glob/ft_strsplit_spe.c +++ b/42sh/src/glob/ft_strsplit_spe.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/31 20:49:30 by wescande #+# #+# */ -/* Updated: 2017/01/31 23:15:41 by wescande ### ########.fr */ +/* Updated: 2017/02/20 12:37:12 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -76,6 +76,7 @@ char **ft_strsplit_spe(const char *str, if (!(s1[i] = (char*)malloc(sizeof(**s1) * (len + 1)))) return (NULL); ft_strncpy(s1[i], str, len); + s1[i][len] = '\0'; str = str + len; ++i; while (*str && *str == c) diff --git a/42sh/src/glob/glob.c b/42sh/src/glob/glob.c index 2c4dd9f1..2a1a7b34 100644 --- a/42sh/src/glob/glob.c +++ b/42sh/src/glob/glob.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/04 16:29:54 by wescande #+# #+# */ -/* Updated: 2017/02/17 17:47:27 by wescande ### ########.fr */ +/* Updated: 2017/02/20 14:19:46 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,9 +43,9 @@ char **glob(char *pat, unsigned char *esc, gl = (t_glob){0, 0, ft_strdup(pat), dup_char_esc(esc, (len >> 3) + 1), dup_char_esc(esc2, (len >> 3) +1), NULL, NULL}; expand_var(&gl); + expand_bquote(&gl); ft_memdel((void **)&gl.esc2); expand_brace(&gl); - expand_bquote(&gl); while (gl.m_pat->next && !(gl.found = 0)) { gl.cur_dir = 1; diff --git a/42sh/src/glob/match_pattern.c b/42sh/src/glob/match_pattern.c index 086d768f..536cb08c 100644 --- a/42sh/src/glob/match_pattern.c +++ b/42sh/src/glob/match_pattern.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/24 17:30:23 by wescande #+# #+# */ -/* Updated: 2017/02/07 19:45:54 by wescande ### ########.fr */ +/* Updated: 2017/02/20 14:00:41 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -73,7 +73,7 @@ static int match_star(t_glob *gl, char *str, char *full_word) if (gl->pat[1] == '*' && !is_char_esc(gl->esc, ((char **)gl->m_pat->content)[0], gl->pat + 1)) dir_research(gl, full_word, gl->pat + 1, 1); - if (!*++gl->pat) + if (!*gl->pat || (*gl->pat == '*' && !*++gl->pat)) return (1); fix = str + ft_strlen(str); while (fix > str) @@ -107,7 +107,7 @@ int match_pattern(t_glob *gl, char *str, char *full_word) return (0); } else if (*gl->pat == '?') - str++; + ; else if (*gl->pat == '[') { if (!match_bracket(gl, *str)) diff --git a/42sh/src/lexer/expand_bquotes.c b/42sh/src/lexer/expand_bquotes.c index 098f15f7..eec0e93e 100644 --- a/42sh/src/lexer/expand_bquotes.c +++ b/42sh/src/lexer/expand_bquotes.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 16:46:27 by jhalford #+# #+# */ -/* Updated: 2017/02/17 16:34:34 by jhalford ### ########.fr */ +/* Updated: 2017/02/20 14:17:03 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -68,6 +68,8 @@ int bquotes_substitute(t_list *cur_word, char *bq_start, char *bq_end) int bquotes_expand(t_list **alst) { + (void) alst; + /* t_list *cur_word; char *bq_start; char *bq_end; @@ -96,6 +98,7 @@ int bquotes_expand(t_list **alst) ft_lst_delif(alst, cur_word->content, ft_addrcmp, token_free); cur_word = *alst; } + */ return (0); } diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 8ab40dfb..f3bfdf13 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/02/17 16:35:24 by jhalford ### ########.fr */ +/* Updated: 2017/02/20 15:00:31 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,7 +33,7 @@ int non_interactive_shell(char *command) return (0); if (bquotes_expand(&token)) return (1); - token_print(token); + //token_print(token); if (ft_parse(&ast, &token)) return (1); if (ft_exec(&ast)) @@ -61,8 +61,7 @@ int interactive_shell() ltoken = ft_lstlast(token); if (lexer_lex((token ? <oken : &token), &lexer)) return (1); - DG("[{mag}%s{eoc}] stack=[%i] state=[%i]", lexer.str, lexer.stack ? *(int*)lexer.stack->content : 0, lexer.state); - token_print(token); + //token_print(token); } while (get_lexer_stack(lexer)); if (bquotes_expand(&token)) return (1); @@ -85,7 +84,7 @@ int main(int ac, char **av) data = data_singleton(); setlocale(LC_ALL, ""); shell_init(ac, av); - DG("{inv}{bol}{gre}start of shell{eoc} JOBC is %s", SH_HAS_JOBC(data->opts)?"ON":"OFF"); +// DG("{inv}{bol}{gre}start of shell{eoc} JOBC is %s", SH_HAS_JOBC(data->opts)?"ON":"OFF"); if (SH_IS_INTERACTIVE(data->opts)) { while (1)