summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsalad <fmoenne-@student.le-101.fr>2020-04-30 12:48:50 +0200
committersalad <fmoenne-@student.le-101.fr>2020-04-30 12:48:50 +0200
commit349458ca999a7bf7fc5b80c0431e929a6204f722 (patch)
tree1f82bd3c08460aed4a246e312db9b5cb48f7403a /src
parentmerge master into fmoenne_indahouse (diff)
download42-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 'src')
-rw-r--r--src/ft_m_loop.c61
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 */