From 3bb4c23b61d5f5f193541c87e99eed489ab43d2e Mon Sep 17 00:00:00 2001 From: narnaud Date: Fri, 6 May 2022 17:29:03 +0200 Subject: [PATCH] norminage et anti-leaks --- lexer.c | 114 ++++++++++++++++++++++++++++++------------------------- parser.c | 10 ++++- 2 files changed, 72 insertions(+), 52 deletions(-) diff --git a/lexer.c b/lexer.c index 110b2f5..5e7a484 100755 --- a/lexer.c +++ b/lexer.c @@ -23,8 +23,8 @@ int create_token(t_lexer *lex, char str[]) else lex->type = WORD; lex->next_type = WORD; - if (!str[0]) - return (0); + //if (!str[0]) + // return (0); tok = lex->tokens; if (!lex->tokens) tok = ft_calloc(1, sizeof *tok); @@ -36,14 +36,34 @@ int create_token(t_lexer *lex, char str[]) tok = tok->next; } tok->type = type; - tok->value = strdup(str); - if (DEBUG) - printf("token value : %s - token type : %d\n", tok->value, type); + tok->value = ft_strdup(str); if (!lex->tokens) lex->tokens = tok; + ft_bzero(str, 1024); return (1); } +int set_redir(t_lexer *lex, char **line, char ch) +{ + static t_type type_out[2] = {ADD, OUT}; + static t_type type_in[2] = {IN, HD}; + t_type *type; + + if (ch == '>') + type = type_out; + else + type = type_in; + if (**line == ch && (*line)++) + { + if (**line == ch && (*line)++) + lex->next_type = type[0]; + else + lex->next_type = type[1]; + return (1); + } + return (0); +} + int check_register(t_lexer *lex, char **line, char *tmp) { int spaces; @@ -57,22 +77,9 @@ int check_register(t_lexer *lex, char **line, char *tmp) (*line)++; spaces = 1; } - if (**line == '>' && (*line)++) - { - if (**line == '>' && (*line)++) - lex->next_type = ADD; - else - lex->next_type = OUT; - return (create_token(lex, tmp)); - } - else if (**line == '<' && (*line)++) - { - if (**line == '<' && (*line)++) - lex->next_type = HD; - else - lex->next_type = IN; - return (create_token(lex, tmp)); - } + if (set_redir(lex, line, '>') + || set_redir(lex, line, '<')) + return (create_token(lex, tmp)); else if (**line == '|') { (*line)++; @@ -85,44 +92,54 @@ int check_register(t_lexer *lex, char **line, char *tmp) return (create_token(lex, tmp)); } -int replace_var(t_datas *datas, char **line, char *tmp, int tmp_i) +char *get_var_value(t_datas *datas, char **line, int *name_len) { - int name_len; - int i; - char *var_name; - char *value; - char **env; + int i; + char **env; + char *name; + char *value; - i = 1; - if ((*line)[1] == '?') - { - value = ft_itoa(datas->exit_code); - name_len = 2; - } - else - { + i = 1; while (ft_isalpha((*line)[i]) || ft_isdigit((*line)[i]) || (*line)[i] == '_') i++; - var_name = ft_substr(*line, 1, i - 1); + name = ft_substr(*line, 1, i - 1); i = 0; - while (datas->envp[i]) + *name_len = ft_strlen(name); + value = NULL; + while (datas->envp[i] && !value) { env = ft_split(datas->envp[i], '='); - if (!ft_strncmp(var_name, env[0], ft_strlen(var_name) + 1)) - break ; - i++; + if (!ft_strncmp(name, env[0], *name_len + 1)) + value = (free(env[0]), env[1]); + else if (++i) + ft_free_split(env); } if (!datas->envp[i]) value = strdup(""); else - value = env[1]; - name_len = ft_strlen(var_name); + free(env); + return (value); +} + +int replace_var(t_datas *datas, char **line, char *tmp, int tmp_i) +{ + int name_len; + int i; + char *value; + + if ((*line)[1] == '?') + { + value = ft_itoa(datas->exit_code); + name_len = 2; } + else + value = get_var_value(datas, line, &name_len); i = 0; while (value[i]) tmp[tmp_i++] = value[i++]; tmp[tmp_i] = 0; *line += name_len + 1; + free(value); return (tmp_i); } @@ -171,17 +188,12 @@ t_token *lexer(t_datas *datas, char *line) if (lex->state != S_QUOTE_ST && *line == '$') tmp_i = replace_var(datas, &line, tmp, tmp_i); if (check_register(lex, &line, tmp)) - { tmp_i = 0; - ft_bzero(tmp, 1024); - continue ; - } - tmp[tmp_i] = *line; - line++; - tmp_i++; + else + tmp[tmp_i++] = *(line++); } create_token(lex, tmp); + free(tmp); + free(lex); return (lex->tokens); } - - diff --git a/parser.c b/parser.c index 493df7a..5f0f6e3 100755 --- a/parser.c +++ b/parser.c @@ -96,6 +96,7 @@ t_command *parser(t_datas *datas, t_token *tok, t_command *prev) { int i; t_command *cmd; + t_token *prev_tok; if (!tok) return (NULL); @@ -109,15 +110,22 @@ t_command *parser(t_datas *datas, t_token *tok, t_command *prev) if (tok->type) update_redir(datas, cmd, tok); else - cmd->argv[i++] = tok->value; + cmd->argv[i++] = ft_strdup(tok->value); + prev_tok = tok; tok = tok->next; + free(prev_tok->value); + free(prev_tok); } if (DEBUG) printf("######\n->cmd : %s, in_fd : %d, out_fd : %d\n", \ cmd->argv[0], cmd->fd[0], cmd->fd[1]); cmd->argv[i] = NULL; if (tok && tok->type == PIPE) + { cmd->next = parser(datas, tok->next, cmd); + free(tok->value); + free(tok); + } return(cmd); }