diff options
| author | salad <fmoenne-@student.le-101.fr> | 2020-04-30 12:48:50 +0200 | 
|---|---|---|
| committer | salad <fmoenne-@student.le-101.fr> | 2020-04-30 12:48:50 +0200 | 
| commit | 349458ca999a7bf7fc5b80c0431e929a6204f722 (patch) | |
| tree | 1f82bd3c08460aed4a246e312db9b5cb48f7403a | |
| parent | merge master into fmoenne_indahouse (diff) | |
| download | 42-minishell-349458ca999a7bf7fc5b80c0431e929a6204f722.tar.gz 42-minishell-349458ca999a7bf7fc5b80c0431e929a6204f722.tar.bz2 42-minishell-349458ca999a7bf7fc5b80c0431e929a6204f722.tar.xz 42-minishell-349458ca999a7bf7fc5b80c0431e929a6204f722.tar.zst 42-minishell-349458ca999a7bf7fc5b80c0431e929a6204f722.zip | |
no inval read, *fin leaking
Diffstat (limited to '')
| -rw-r--r-- | src/ft_m_loop.c | 61 | 
1 files changed, 44 insertions, 17 deletions
| diff --git a/src/ft_m_loop.c b/src/ft_m_loop.c index 1797c93..cc83617 100644 --- a/src/ft_m_loop.c +++ b/src/ft_m_loop.c @@ -20,36 +20,59 @@  #include "ft_p_line.h"  #include "ft_s_lcom.h" +static char +*ft_strjoin_m(char *s1, char *s2) +{ +	size_t	i; +	size_t	j; +	char	*dst; +	size_t	size1; +	size_t	size2; + +	i = -1; +	j = -1; +	size1 = ft_strlen(s1); +	size2 = ft_strlen(s2) + 1; +	if (!(dst = (char*)malloc((size1 + size2 + 2) * sizeof(char)))) +		return (NULL); +	while (++i < size1) +		dst[i] = s1[i]; +    dst[i] = '\n'; +    i++; +	while (++j < size2) +		dst[i + j] = s2[j]; +	dst[i + j] = '\0'; +	ft_memdel((void*)&s1); +	return (dst); +} +  uint8_t      ft_m_loop_cont(t_msh *msh, char *line, char *quote)  { -	int8_t	gnl; -	size_t	len; -	char	*prog; -	char	*buf; -	char	*fin; +    int8_t	gnl; +    uint16_t	len; +    char	*prog; +    char	*buf; +    char	*fin; -    if (!(prog = ft_calloc(ft_strlen(line + 1), sizeof(char)))) +    if (!(prog = ft_calloc(ft_strlen(line) + 1, sizeof(char))))          return (0);      ft_memcpy(prog, line, (quote - line)); -    buf = ft_strdup(line + (quote - line) + 1); +    if (!(buf = ft_strdup(line + (quote - line) + 1))) +        return (0);      gnl = 1;  	while (gnl > 0 && ((!(quote = ft_strrchr(buf, '\"'))) && (!(quote = ft_strrchr(buf, '\'')))))      {          ft_m_cont_prompt(); -        gnl = get_next_line(STDIN_FILENO, &line);          len = ft_strlen(buf); -        buf = ft_nrealloc(buf, len, (len + ft_strlen(line))); -        ft_sprintf(buf + ft_strlen(buf), "\n%s", line); +        gnl = get_next_line(STDIN_FILENO, &line); +        buf = ft_strjoin_m(buf, line); +        ft_memdel((void*)&line);      } -    buf = ft_strtrim(buf, "\"'"); -    if (!(fin = malloc((ft_strlen(prog) + ft_strlen(buf)) * sizeof(char)))) -        return (0); -    fin = ft_strjoin(prog, buf); -    ft_p_line(fin, msh); -    ft_memdel((void*)&line); +    fin = ft_strtrim(buf, "\"'");      ft_memdel((void*)&buf); -    ft_memdel((void*)&fin); +    fin = ft_strjoin(prog, fin); +    ft_p_line(fin, msh);      ft_memdel((void*)&prog);      ft_e_lcom(msh);      ft_lcom_clear(&msh->curr); @@ -78,7 +101,11 @@ uint8_t                  ft_lcom_clear(&msh->curr);              }              else +            {                  ft_m_loop_cont(msh, line, quote); +                if (line != NULL) +                    ft_memdel((void*)&line); +            }  			/* TODO: (null): Bad address on "msh ~> echo a > asd; cat < asd" but not on "msh ~> echo a > asd; cat asd" */  			/* TODO: GNL 25 leak on "msh ~> exit" | gl hf */  			/* TODO: "msh ~> some command \": re GNL into ft_nrealloc */ | 
