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 /src/ft_m_loop.c | |
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 */ |