diff --git a/42sh/Makefile b/42sh/Makefile index 4992fc50..52f779f2 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -79,6 +79,7 @@ exec/set_exitstatus.c\ glob/dir_glob.c\ glob/expand_brace.c\ glob/expand_esc.c\ +glob/expand_var.c\ glob/ft_strsplit_esc.c\ glob/ft_strsplit_spe.c\ glob/glob.c\ @@ -96,6 +97,7 @@ glob/lib_perso/ft_ld_size.c\ glob/lib_perso/ft_ld_swap.c\ glob/lib_perso/ft_ld_to_tab.c\ glob/lib_perso/ft_strjoinf.c\ +glob/lib_perso/ft_strsubf.c\ glob/lib_perso/ft_tabdel.c\ glob/lib_perso/ft_tablen.c\ glob/match_pattern.c\ diff --git a/42sh/includes/glob.h b/42sh/includes/glob.h index 29792c69..651a6231 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/06 15:12:39 by wescande ### ########.fr */ +/* Updated: 2017/02/07 16:04:57 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,8 +27,9 @@ typedef struct s_ld typedef struct s_glob { - const char *pat; - const unsigned char *esc; + char *pat; + unsigned char *esc; + unsigned char *esc2; t_ld *match; t_ld *m_pat; } t_glob; @@ -46,7 +47,8 @@ typedef struct s_expand /* ** interface of glob. */ -char **glob(const char *str, const unsigned char *esc); +char **glob(char *str, unsigned char *esc, + unsigned char *dbl_esc); /* ** return TRUE if path file is a directory. @@ -71,13 +73,15 @@ void set_char_no_esc(unsigned char *esc, ** Internal function. */ unsigned char *ft_sub_esc(const unsigned char *esc, int start, int len); +unsigned char *dup_char_esc(const unsigned char *esc, const int size); unsigned char *calc_expand_esc(const unsigned char *esc, - int nb_start, int nb_middle, int *nb_end); + int nb_start, int *nb_middle, int *nb_end); void modify_esc_split(unsigned char *esc_dest, unsigned char *esc_src, int start, int len); void expand_brace(t_glob *tglob); +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, const char *pat, int rec); +int dir_research(t_glob *tglob, char *p, char *pat, int rec); char **ft_strsplit_spe(const char *str, const unsigned char *esc, char c); unsigned char **ft_strsplit_esc(const char *str, @@ -103,6 +107,8 @@ t_ld *ft_ld_order(t_ld *ld, int (*f)(), void (*del)()); */ char *ft_strjoinf(char *str, char *str2, int mode); +char *ft_strsubf(char *s, unsigned int start, + size_t len, short int mode); void ft_tabdel(char ***mytab); int ft_tablen(char **mytab); diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index 5e41aab9..3ea33bbb 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 12:15:50 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:56:46 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:32:51 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,7 +57,6 @@ enum e_lexstate QUOTE, DQUOTE, BACKSLASH, - VAR, SPECIAL, COMMENT, }; @@ -67,6 +66,7 @@ struct s_token t_type type; char *data; unsigned char *esc; + unsigned char *esc2; int size; }; @@ -81,7 +81,8 @@ int ft_tokenize(t_list **alst, char *str, t_lexstate state); int ft_post_tokenize(t_list **alst, char **str); t_token *token_init(); -int token_append(t_token *token, char c, short int esc); +int token_append(t_token *token, char c, short int esc, + short int dbl_esc); void token_free(void *data, size_t size); int token_cmp_type(t_token *token, t_type *ref); void token_print(t_list *lst); diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c index 49bdfc0e..4a712842 100644 --- a/42sh/src/exec/exec_command.c +++ b/42sh/src/exec/exec_command.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:14:31 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:33:15 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,7 @@ static char **token_to_argv(t_astnode *node) while (ld) { content = ld->content; - if ((expand = glob(content[0], (unsigned char *)content[1]))) + if ((expand = glob(content[0], (unsigned char *)content[1], (unsigned char *)content[2]))) { index = -1; while (expand[++index]) diff --git a/42sh/src/glob/dir_glob.c b/42sh/src/glob/dir_glob.c index 3ed4a660..9c9ad8e3 100644 --- a/42sh/src/glob/dir_glob.c +++ b/42sh/src/glob/dir_glob.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/30 12:07:16 by wescande #+# #+# */ -/* Updated: 2017/02/01 19:49:44 by wescande ### ########.fr */ +/* Updated: 2017/02/07 13:06:07 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,14 +20,14 @@ int is_directory(const char *path) return (S_ISDIR(path_stat.st_mode)); } -static int dir_list_content(t_glob *gl, char **str, const char *pat, +static int dir_list_content(t_glob *gl, char **str, char *pat, int recursive) { int ret; char *path_tmp; ret = 0; - if (ft_strcmp(str[1], ".") && ft_strcmp(str[1], "..")) + if (str[1][0] != '.') { if (*str[0] == '/' && !*(str[0] + 1)) path_tmp = ft_strjoin(str[0], str[1]); @@ -45,7 +45,7 @@ static int dir_list_content(t_glob *gl, char **str, const char *pat, } int dir_research(t_glob *gl, char *p, - const char *pat, int recursive) + char *pat, int recursive) { DIR *dir; struct dirent *in; diff --git a/42sh/src/glob/expand_brace.c b/42sh/src/glob/expand_brace.c index 00aba745..27b4b71d 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/06 15:51:32 by wescande ### ########.fr */ +/* Updated: 2017/02/07 16:10:20 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -56,8 +56,8 @@ static void iter_on_each(t_expand *me) first = ft_strjoinf(ft_strjoin(me->s1, me->split[i]), me->str + 1, 1); second = calc_expand_esc(me->esc, ft_strlen(me->s1), - ft_strlen(me->split[i]), - (int[2]){me->str - CH(*me->wk)[0], ft_strlen(me->str + 1)}); + (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); @@ -120,7 +120,7 @@ void expand_brace(t_glob *gl) 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, 1)); + ft_ld_pushfront(&gl->m_pat, gen_tab(gl->pat, gl->esc, 0)); me = (t_expand){NULL, NULL, NULL, NULL, NULL, NULL}; do_it = 1; while (do_it) diff --git a/42sh/src/glob/expand_esc.c b/42sh/src/glob/expand_esc.c index 9ad603e4..00990cf7 100644 --- a/42sh/src/glob/expand_esc.c +++ b/42sh/src/glob/expand_esc.c @@ -6,20 +6,20 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/31 23:18:56 by wescande #+# #+# */ -/* Updated: 2017/01/31 23:19:45 by wescande ### ########.fr */ +/* Updated: 2017/02/07 15:49:15 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ #include "glob.h" unsigned char *calc_expand_esc(const unsigned char *esc, - int nb_start, int nb_middle, int *nb_end) + int nb_start, int *nb_middle, int *nb_end) { unsigned char *new_esc; int index; int pos; - if (!(new_esc = (unsigned char *)ft_strnew(((nb_start + nb_middle + if (!(new_esc = (unsigned char *)ft_strnew(((nb_start + nb_middle[0] + nb_end[1]) / 8) + 1))) return (NULL); index = -1; @@ -27,9 +27,9 @@ unsigned char *calc_expand_esc(const unsigned char *esc, new_esc[index / 8] |= ((esc[index / 8] >> (7 - index % 8)) & 1) << (7 - index % 8); pos = -1; - while (++pos < nb_middle) + while (++pos < nb_middle[0]) { - new_esc[index / 8] |= 0 << (7 - index % 8); + new_esc[index / 8] |= nb_middle[1] << (7 - index % 8); ++index; } pos = nb_end[0]; diff --git a/42sh/src/glob/expand_var.c b/42sh/src/glob/expand_var.c new file mode 100644 index 00000000..374fbc87 --- /dev/null +++ b/42sh/src/glob/expand_var.c @@ -0,0 +1,82 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expand_var.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/06 16:09:27 by wescande #+# #+# */ +/* Updated: 2017/02/07 17:18:33 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "glob.h" + +/* +** expand_var return value of $var in the string. +** input parameters are : +** -t_glob *gl -> struct of expanding +*/ + +static void insert_var(t_glob *gl, char *pos, char *name, char *content) +{ + char *s1; + char *s2; + int delta; + unsigned char *new_esc; + + 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_strjoinf(s1, content, 1), s2, 3); + 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; +} + +static char *get_name(t_glob *gl, const char *pat) +{ + const char *str; + + str = pat; + if (ft_isdigit(*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)); +} + +void expand_var(t_glob *gl) +{ + char *pat; + char *var; + char *content; + + pat = gl->pat; + while (*pat) + { + if (*pat == '$' && !is_char_esc(gl->esc2, gl->pat, pat) && + (var = get_name(gl, pat + 1))) + { + if (ft_strlen(var)) + { + content = ft_getenv(data_singleton()->env, var); + insert_var(gl, pat, var, content); + pat = gl->pat; + } + ft_strdel(&var); + } + ++pat; + } +} diff --git a/42sh/src/glob/glob.c b/42sh/src/glob/glob.c index 1ec41786..3aad8ae9 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/01 19:46:22 by wescande ### ########.fr */ +/* Updated: 2017/02/07 16:13:36 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,12 +33,18 @@ static char **treat_glob(t_ld **match) return (gl); } -char **glob(const char *pat, const unsigned char *esc) +char **glob(char *pat, unsigned char *esc, + unsigned char *esc2) { t_glob gl; int ret; + int len; - gl = (t_glob){pat, esc, NULL, NULL}; + len = ft_strlen(pat); + gl = (t_glob){ft_strdup(pat), dup_char_esc(esc, len), + dup_char_esc(esc2, len), NULL, NULL}; + expand_var(&gl); + ft_memdel((void **)&gl.esc2); expand_brace(&gl); while (gl.m_pat->next) { diff --git a/42sh/src/glob/is_char_esc.c b/42sh/src/glob/is_char_esc.c index 33cec385..ef702e69 100644 --- a/42sh/src/glob/is_char_esc.c +++ b/42sh/src/glob/is_char_esc.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/27 18:19:55 by wescande #+# #+# */ -/* Updated: 2017/02/06 15:11:14 by wescande ### ########.fr */ +/* Updated: 2017/02/07 16:33:47 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,9 +18,11 @@ int is_char_esc(const unsigned char *esc, int pos; if (!esc || !ini_str || !str_pos) - return (0); + return (-1); pos = str_pos - ini_str; - if ((esc[pos / 8] >> (7 - pos % 8)) & 1) + if (pos < 0) + return (-1); + if ((esc[pos >> 3] >> (7 - pos % 8)) & 1) return (1); return (0); } @@ -33,7 +35,7 @@ void set_char_esc_mode(unsigned char *esc, if (!esc || !ini_str || !str_pos || mode < 0 || mode > 1) return ; pos = str_pos - ini_str; - esc[pos / 8] |= mode << (7 - pos % 8); + esc[pos >> 3] |= mode << (7 - pos % 8); } void set_char_esc(unsigned char *esc, @@ -44,7 +46,7 @@ void set_char_esc(unsigned char *esc, if (!esc || !ini_str || !str_pos) return ; pos = str_pos - ini_str; - esc[pos / 8] |= 1 << (7 - pos % 8); + esc[pos >> 3] |= 1 << (7 - pos % 8); } void set_char_no_esc(unsigned char *esc, @@ -55,5 +57,15 @@ void set_char_no_esc(unsigned char *esc, if (!esc || !ini_str || !str_pos) return ; pos = str_pos - ini_str; - esc[pos / 8] |= 0 << (7 - pos % 8); + esc[pos >> 3] |= 0 << (7 - pos % 8); +} + +unsigned char *dup_char_esc(const unsigned char *esc, const int size) +{ + unsigned char *new_esc; + + if (!(new_esc = (unsigned char *)ft_strnew(size))) + return (NULL); + ft_memcpy(new_esc, esc, size); + return (new_esc); } diff --git a/42sh/src/glob/lib_perso/ft_strsubf.c b/42sh/src/glob/lib_perso/ft_strsubf.c new file mode 100644 index 00000000..2e6d5b51 --- /dev/null +++ b/42sh/src/glob/lib_perso/ft_strsubf.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsubf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/15 17:20:08 by wescande #+# #+# */ +/* Updated: 2017/02/07 13:01:55 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "glob.h" + +char *ft_strsubf(char *s, unsigned int start, size_t len, short int mode) +{ + char *sptr; + + if (!s) + return (NULL); + sptr = ft_strsub(s, start, len); + if (mode == 1) + ft_strdel(&s); + return (sptr); +} diff --git a/42sh/src/glob/match_pattern.c b/42sh/src/glob/match_pattern.c index b2688603..47b77311 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/01 19:46:43 by wescande ### ########.fr */ +/* Updated: 2017/02/07 13:06:58 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -85,7 +85,7 @@ static int match_star(t_glob *gl, char *str, char *full_word) return (0); } -const char *manage_pat(const char *pat, char *str) +char *manage_pat(char *pat, char *str) { if (pat[0] == '.' && pat[1] == '/' && ((str[0] == '.' && str[1] != '/') || str[0] != '.')) diff --git a/42sh/src/lexer/ft_tokenize.c b/42sh/src/lexer/ft_tokenize.c index 92cc33a8..fccf7a7a 100644 --- a/42sh/src/lexer/ft_tokenize.c +++ b/42sh/src/lexer/ft_tokenize.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 13:37:11 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:29:41 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:33:34 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,6 @@ int (*g_lexer[])(t_list **alst, char *str) = &lexer_quote, &lexer_dquote, &lexer_backslash, - &lexer_var, &lexer_special, &lexer_comment, }; diff --git a/42sh/src/lexer/get_lexer_state.c b/42sh/src/lexer/get_lexer_state.c index bb2dbc18..9a738e65 100644 --- a/42sh/src/lexer/get_lexer_state.c +++ b/42sh/src/lexer/get_lexer_state.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/10 13:45:46 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:16:51 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:34:14 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,6 @@ t_lexstate get_lexer_state(char *str) return (DELIM); else if (*str == '#') return (COMMENT); - else if (*str == '$') - return (VAR); else if (*str == '&' || *str == ';' || *str == '|') return (SEP); else if (*str == '\\') diff --git a/42sh/src/lexer/lexer_backslash.c b/42sh/src/lexer/lexer_backslash.c index d1da0d6c..eb339d0a 100644 --- a/42sh/src/lexer/lexer_backslash.c +++ b/42sh/src/lexer/lexer_backslash.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:56:49 by jhalford #+# #+# */ -/* Updated: 2017/01/30 13:07:52 by wescande ### ########.fr */ +/* Updated: 2017/02/07 11:39:15 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,6 @@ int lexer_backslash(t_list **alst, char *str) token = (*alst)->content; token->type = TK_WORD; - token_append(token, str[1], 1); + token_append(token, str[1], 1, 1); return (ft_tokenize(alst, str + 2, WORD)); } diff --git a/42sh/src/lexer/lexer_default.c b/42sh/src/lexer/lexer_default.c index 08ccabcf..0359269c 100644 --- a/42sh/src/lexer/lexer_default.c +++ b/42sh/src/lexer/lexer_default.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 18:36:21 by jhalford #+# #+# */ -/* Updated: 2017/01/27 15:53:10 by wescande ### ########.fr */ +/* Updated: 2017/02/07 11:39:07 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,7 @@ int lexer_default(t_list **alst, char *str) else state = WORD; token = (*alst)->content; - token_append(token, *str, 0); + token_append(token, *str, 0, 0); token->type = TK_N_WORD; return (ft_tokenize(alst, str + 1, state)); } diff --git a/42sh/src/lexer/lexer_dquote.c b/42sh/src/lexer/lexer_dquote.c index 9b64b6a6..9d52263b 100644 --- a/42sh/src/lexer/lexer_dquote.c +++ b/42sh/src/lexer/lexer_dquote.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 18:36:58 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:22:23 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:35:38 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,13 +19,15 @@ int lexer_dquote(t_list **alst, char *str) token = (*alst)->content; token->type = TK_DQ_WORD; str++; - if (*str == '\"') + if (*str == '"') return (ft_tokenize(alst, str + 1, DEFAULT)); if (*str == '\\') { - token_append(token, *(str + 1), 1); + if (str[1] != '"') + token_append(token, str[0], 1, 0); + token_append(token, str[1], 1, 1); return (lexer_dquote(alst, str + 1)); } - token_append(token, *str, 1); + token_append(token, *str, 1, 0); return (lexer_dquote(alst, str)); } diff --git a/42sh/src/lexer/lexer_great.c b/42sh/src/lexer/lexer_great.c index da36e903..a0f069c8 100644 --- a/42sh/src/lexer/lexer_great.c +++ b/42sh/src/lexer/lexer_great.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:35 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:45:28 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:36:19 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,17 +17,17 @@ int lexer_great(t_list **alst, char *str) t_token *token; token = (*alst)->content; - token_append(token, str[0], 0); + token_append(token, str[0], 0, 0); if (*(str + 1) == '&') { token->type = TK_GREATAND; - token_append(token, str[1], 0); + token_append(token, str[1], 0, 0); return (lexer_greatand(alst, str + 2)); } else if (*(str + 1) == '>') { token->type = TK_DGREAT; - token_append(token, str[1], 0); + token_append(token, str[1], 0, 0); return (ft_tokenize(&(*alst)->next, str + 2, DEFAULT)); } else diff --git a/42sh/src/lexer/lexer_greatand.c b/42sh/src/lexer/lexer_greatand.c index b803f0f1..d9f9787f 100644 --- a/42sh/src/lexer/lexer_greatand.c +++ b/42sh/src/lexer/lexer_greatand.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:56:58 by jhalford #+# #+# */ -/* Updated: 2017/01/27 15:55:04 by wescande ### ########.fr */ +/* Updated: 2017/02/07 11:37:08 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,12 +20,12 @@ int lexer_greatand(t_list **alst, char *str) token->type = TK_GREATAND; if (ft_isdigit(*str)) { - token_append(token, *str, 0); + token_append(token, *str, 0, 0); return (lexer_greatand(alst, str + 1)); } else if (*str == '-') { - token_append(token, *str, 0); + token_append(token, *str, 0, 0); return (ft_tokenize(&(*alst)->next, str + 1, DEFAULT)); } return (ft_tokenize(alst, str, DEFAULT)); diff --git a/42sh/src/lexer/lexer_less.c b/42sh/src/lexer/lexer_less.c index 2fbc72d2..7f067ab0 100644 --- a/42sh/src/lexer/lexer_less.c +++ b/42sh/src/lexer/lexer_less.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:53 by jhalford #+# #+# */ -/* Updated: 2017/02/06 22:30:07 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:36:42 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,17 +17,17 @@ int lexer_less(t_list **alst, char *str) t_token *token; token = (*alst)->content; - token_append(token, str[0], 0); + token_append(token, str[0], 0, 0); if (*(str + 1) == '&') { token->type = TK_LESSAND; - token_append(token, str[1], 0); + token_append(token, str[1], 0, 0); return (lexer_lessand(alst, str + 2)); } else if (*(str + 1) == '<') { token->type = TK_DLESS; - token_append(token, str[1], 0); + token_append(token, str[1], 0, 0); return (ft_tokenize(&(*alst)->next, str + 2, DEFAULT)); } else diff --git a/42sh/src/lexer/lexer_lessand.c b/42sh/src/lexer/lexer_lessand.c index bb5b900c..04c7fe8e 100644 --- a/42sh/src/lexer/lexer_lessand.c +++ b/42sh/src/lexer/lexer_lessand.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:58:51 by jhalford #+# #+# */ -/* Updated: 2017/02/06 21:58:23 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:37:07 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,12 +20,12 @@ int lexer_lessand(t_list **alst, char *str) token->type = TK_LESSAND; if (ft_isdigit(*str)) { - token_append(token, *str, 0); + token_append(token, *str, 0, 0); return (lexer_lessand(alst, str + 1)); } else if (*str == '-') { - token_append(token, *str, 0); + token_append(token, *str, 0, 0); return (ft_tokenize(&(*alst)->next, str + 1, DEFAULT)); } return (ft_tokenize(alst, str, DEFAULT)); diff --git a/42sh/src/lexer/lexer_number.c b/42sh/src/lexer/lexer_number.c index 1309e780..5cb3fa24 100644 --- a/42sh/src/lexer/lexer_number.c +++ b/42sh/src/lexer/lexer_number.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:45 by jhalford #+# #+# */ -/* Updated: 2017/01/30 13:08:05 by wescande ### ########.fr */ +/* Updated: 2017/02/07 11:39:29 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,7 +26,7 @@ int lexer_number(t_list **alst, char *str) return (ft_tokenize(alst, str, LESS)); else if (ft_isdigit(*str)) { - token_append(token, *str, 0); + token_append(token, *str, 0, 0); return (lexer_number(alst, str + 1)); } return (ft_tokenize(alst, str, DEFAULT)); diff --git a/42sh/src/lexer/lexer_quote.c b/42sh/src/lexer/lexer_quote.c index 4b99e6fe..647ac038 100644 --- a/42sh/src/lexer/lexer_quote.c +++ b/42sh/src/lexer/lexer_quote.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:07:08 by jhalford #+# #+# */ -/* Updated: 2017/01/27 15:52:21 by wescande ### ########.fr */ +/* Updated: 2017/02/07 11:39:24 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,6 @@ int lexer_quote(t_list **alst, char *str) str++; if (*str == '\'') return (ft_tokenize(alst, str + 1, WORD)); - token_append(token, *str, 1); + token_append(token, *str, 1, 1); return (lexer_quote(alst, str)); } diff --git a/42sh/src/lexer/lexer_var.c b/42sh/src/lexer/lexer_var.c index fc9c98d7..6561c95b 100644 --- a/42sh/src/lexer/lexer_var.c +++ b/42sh/src/lexer/lexer_var.c @@ -6,12 +6,13 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/10 14:54:57 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:16:37 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:37:25 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" +/* int lexer_var(t_list **alst, char *str) { t_token *token; @@ -34,4 +35,4 @@ int lexer_var(t_list **alst, char *str) } token_append(token, *str, 0); return (lexer_var(alst, str)); -} +}*/ diff --git a/42sh/src/lexer/lexer_word.c b/42sh/src/lexer/lexer_word.c index c89e4f63..c952c6f5 100644 --- a/42sh/src/lexer/lexer_word.c +++ b/42sh/src/lexer/lexer_word.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:07:11 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:16:33 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:37:44 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,6 +25,6 @@ int lexer_word(t_list **alst, char *str) return (ft_tokenize(&(*alst)->next, str, GREAT)); else if (*str == '<') return (ft_tokenize(&(*alst)->next, str, LESS)); - token_append(token, *str, 0); + token_append(token, *str, 0, 0); return (ft_tokenize(alst, str + 1, WORD)); } diff --git a/42sh/src/lexer/token_append.c b/42sh/src/lexer/token_append.c index 9cc197fb..3fcfec70 100644 --- a/42sh/src/lexer/token_append.c +++ b/42sh/src/lexer/token_append.c @@ -6,15 +6,13 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/11 17:18:42 by jhalford #+# #+# */ -/* Updated: 2017/01/30 13:09:01 by wescande ### ########.fr */ +/* Updated: 2017/02/07 15:32:08 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -#define TOKEN_INCR 10 - -int token_append(t_token *token, char c, short int esc) +int token_append(t_token *token, char c, short int esc, short int esc2) { int len; @@ -24,11 +22,14 @@ int token_append(t_token *token, char c, short int esc) token->size += 8; token->data = (char *)ft_realloc(token->data, token->size + 1); token->esc = (unsigned char *)ft_realloc((char *)token->esc, - token->size / 8 + 1); - token->esc[token->size / 8 - 1] = 0; + (token->size >> 3) + 1); + token->esc[token->size >> 3] = 0; + token->esc2 = (unsigned char *)ft_realloc((char *)token->esc2, + (token->size >> 3) + 1); + token->esc2[token->size >> 3] = 0; } ft_strcat(token->data, (char[2]){c, '\0'}); - if (esc) - token->esc[len / 8] |= 1 << (7 - len % 8); + token->esc[len >> 3] |= esc << (7 - len % 8); + token->esc2[len >> 3] |= esc2 << (7 - len % 8); return (0); } diff --git a/42sh/src/lexer/token_expand_var.c b/42sh/src/lexer/token_expand_var.c index 8d271ed4..689dcb60 100644 --- a/42sh/src/lexer/token_expand_var.c +++ b/42sh/src/lexer/token_expand_var.c @@ -6,12 +6,12 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/10 14:57:53 by jhalford #+# #+# */ -/* Updated: 2017/02/06 14:32:16 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 13:16:04 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" - +/* void token_expand_var(t_token *token) { char *dollar; @@ -24,5 +24,6 @@ void token_expand_var(t_token *token) *dollar = 0; if (val) while (*val) - token_append(token, *val++, 1); + token_append(token, *val++, 1, 1); } +*/ diff --git a/42sh/src/lexer/token_free.c b/42sh/src/lexer/token_free.c index eda8f28b..a807db59 100644 --- a/42sh/src/lexer/token_free.c +++ b/42sh/src/lexer/token_free.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:07:30 by jhalford #+# #+# */ -/* Updated: 2017/01/31 18:36:40 by wescande ### ########.fr */ +/* Updated: 2017/02/07 13:39:50 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ void token_free(void *data, size_t size) { ft_strdel(&token->data); ft_memdel((void **)&token->esc); + ft_memdel((void **)&token->esc2); } free(token); } diff --git a/42sh/src/lexer/token_init.c b/42sh/src/lexer/token_init.c index 6547b15b..d67262c4 100644 --- a/42sh/src/lexer/token_init.c +++ b/42sh/src/lexer/token_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 15:30:25 by jhalford #+# #+# */ -/* Updated: 2017/01/31 18:36:31 by wescande ### ########.fr */ +/* Updated: 2017/02/07 13:42:00 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,7 @@ t_token *token_init(void) token->type = 0; token->size = 8; token->data = ft_strnew(token->size + 1); - token->esc = (unsigned char *)ft_strnew(token->size / 8 + 1); + token->esc = (unsigned char *)ft_strnew((token->size >> 3) + 1); + token->esc2 = (unsigned char *)ft_strnew((token->size >> 3) + 1); return (token); } diff --git a/42sh/src/parser/parse_word.c b/42sh/src/parser/parse_word.c index 1bb12b7d..e4faa7aa 100644 --- a/42sh/src/parser/parse_word.c +++ b/42sh/src/parser/parse_word.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/14 12:49:45 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:11:11 by jhalford ### ########.fr */ +/* Updated: 2017/02/07 17:39:36 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,16 +16,20 @@ int parse_word(t_btree **ast, t_list **start, t_list **lst) { t_astnode *node; t_token *token; - char **my_tab; + char **the_tab; (void)start; - my_tab = NULL; token = (*lst)->content; node = (*ast)->item; node->type = TK_COMMAND; - my_tab = ft_sstradd(my_tab, token->data); - my_tab = ft_sstradd(my_tab, (char *)token->esc); - ft_ld_pushback(&node->data.token, my_tab); + if ((the_tab = (char **)malloc(sizeof(char *) * 4))) + { + the_tab[0] = ft_strdup(token->data); + the_tab[1] = (char *)dup_char_esc(token->esc, token->size >> 3); + the_tab[2] = (char *)dup_char_esc(token->esc2, token->size >> 3); + the_tab[3] = NULL; + } + ft_ld_pushback(&node->data.token, the_tab); ft_parse(ast, &(*lst)->next); ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); return (0);