diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ft_b_echo.c | 85 | ||||
-rw-r--r-- | src/ft_m_loop.c | 80 | ||||
-rw-r--r-- | src/ft_m_prompt.c | 7 | ||||
-rw-r--r-- | src/ft_m_prompt.h | 1 | ||||
-rw-r--r-- | src/ft_p_line.c | 1 | ||||
-rw-r--r-- | src/minishell.c | 1 |
6 files changed, 159 insertions, 16 deletions
diff --git a/src/ft_b_echo.c b/src/ft_b_echo.c index bca20ac..de5431f 100644 --- a/src/ft_b_echo.c +++ b/src/ft_b_echo.c @@ -12,13 +12,70 @@ #include <libft.h> #include <stdint.h> +#include <stdio.h> +#include <stdlib.h> #include "ft_s_struct.h" #include "ft_u_utils.h" -/* TODO: echo "quoted text", echo 'quoted text', */ -/* echo kill\nbackslash\nbut\nnot\nn, echo "quoted\nnew\nlines" */ -/* Might need to go full buffer */ +/* TODO: echo "quoted text", echo 'quoted text', done*/ +/* echo kill\nbackslash\nbut\nnot\nn, echo "quoted\nnew\nlines", done */ +/* full buffer */ + +void + ft_e_put(char *str, + uint8_t op) +{ + size_t i; + + i = -1; + if (op == 0) + while (str[++i]) + { + if (str[i] == '\\') + i++; + ft_putchar(str[i]); + } +} + +char + *ft_e_initb(char *ptr[], + char *str) +{ + size_t len; + uint8_t i; + + len = 0; + i = -1; + while (ptr[++i]) + { + len += ft_strlen(ptr[i]); + } + if (!(str = (char*)malloc(len * sizeof(char)))) + return (NULL); + return (str); +} + +/***********************************************/ +/* void */ +/* ft_e_fill(char *ptr[], char **str) */ +/* { */ +/* char *bs; */ +/* */ +/* ft_sprintf(*str, "%s", *ptr); */ +/* if (*str[0] == '\"' || *str[0] == '\'') */ +/* { */ +/* *str = ft_strtrim(*str, "\"\'"); */ +/* ft_printf("%s", *str); */ +/* } */ +/* else if ((bs = ft_strrchr(*str, '\\'))) */ +/* { */ +/* ft_e_put(*str, 0); */ +/* } */ +/* else */ +/* ft_printf("%s", *str); */ +/* } */ +/***********************************************/ uint8_t ft_b_echo(char *args[], @@ -26,11 +83,14 @@ uint8_t { const uint64_t argc = ft_get_argc((const char **)args); char **ptr; + char *str; int8_t nopt; (void)msh; ptr = args; nopt = 0; + str = NULL; + str = ft_e_initb(ptr, str); if (argc >= 1) { if (ft_strncmp(ptr[0], "-n", 2) == 0) @@ -39,16 +99,17 @@ uint8_t ptr += 1; } if (argc - nopt >= 1) - { - ft_printf("%s", *ptr); - ptr++; - while (*ptr) - { - ft_printf(" %s", *ptr); - ptr++; - } - } + { + ft_printf("%s", *ptr); + ptr++; + while (*ptr) + { + ft_printf(" %s", *ptr); + ptr++; + } + } } + free(str); if (nopt == 0) ft_printf("\n"); return (0); diff --git a/src/ft_m_loop.c b/src/ft_m_loop.c index 7ed8009..0b590a0 100644 --- a/src/ft_m_loop.c +++ b/src/ft_m_loop.c @@ -12,6 +12,7 @@ #include <libft.h> #include <stdint.h> +#include <stdlib.h> #include <unistd.h> #include "ft_e_lcom.h" @@ -19,10 +20,72 @@ #include "ft_p_line.h" #include "ft_s_lcom.h" + +static char + *ft_strjoin_m(char *s1, + char *s2, + uint8_t mode) +{ + 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]; + (mode == 0) ? dst[i++] = '\n' : 0; + while (++j < size2) + dst[i + j] = s2[j]; + dst[i + j] = '\0'; + (mode == 0) ? ft_memdel((void*)&s1) : ft_memdel((void*)&s2); + return (dst); +} + +void + ft_m_loop_cont(t_msh *msh, + char *line, + char *quote, + int8_t gnl) +{ + char *prog; + char *buf; + char *fin; + + if (!(prog = ft_calloc(ft_strlen(line) + 1, sizeof(char))) || + !(buf = ft_strdup(line + (quote - line) + 1))) + return ; + ft_memcpy(prog, line, (quote - line)); + while (gnl > 0 && ((!(quote = ft_strrchr(buf, '\"'))) && + (!(quote = ft_strrchr(buf, '\''))))) + { + ft_m_cont_prompt(); + gnl = get_next_line(STDIN_FILENO, &line); + buf = ft_strjoin_m(buf, line, 0); + ft_memdel((void*)&line); + } + fin = ft_strtrim(buf, "\"'"); + ft_memdel((void*)&buf); + fin = (ft_strrchr(fin, '\'')) ? ft_strsubst(fin, "\'", "") : fin; + fin = ft_strjoin_m(prog, fin, 1); + ft_p_line(fin, msh); + ft_memdel((void*)&prog); + ft_memdel((void*)&fin); + ft_e_lcom(msh); + ft_lcom_clear(&msh->curr); +} + uint8_t ft_m_loop(t_msh *msh) { char *line; + char *quote; int8_t gnl; gnl = 1; @@ -32,10 +95,19 @@ uint8_t gnl = get_next_line(STDIN_FILENO, &line); if (line[0] != '\0') { - ft_p_line(line, msh); - ft_memdel((void*)&line); - ft_e_lcom(msh); - ft_lcom_clear(&msh->curr); + if (!(quote = ft_strchr(line, '\'')) && !(quote = ft_strchr(line, '\"'))) + { + ft_p_line(line, msh); + ft_memdel((void*)&line); + ft_e_lcom(msh); + ft_lcom_clear(&msh->curr); + } + else + { + ft_m_loop_cont(msh, line, quote, 1); + 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 */ diff --git a/src/ft_m_prompt.c b/src/ft_m_prompt.c index 5d0f80c..d6a73fd 100644 --- a/src/ft_m_prompt.c +++ b/src/ft_m_prompt.c @@ -15,6 +15,13 @@ #include "ft_s_struct.h" void + ft_m_cont_prompt(void) +{ + ft_printf("> "); + /* TODO :ft_printf("%s", msh->ps_two); */ +} + +void ft_m_prompt(t_msh *msh) { ft_printf("%s", msh->ps_one); diff --git a/src/ft_m_prompt.h b/src/ft_m_prompt.h index e16b24c..2725539 100644 --- a/src/ft_m_prompt.h +++ b/src/ft_m_prompt.h @@ -16,4 +16,5 @@ #include "ft_s_struct.h" void ft_m_prompt(t_msh *msh); +void ft_m_cont_prompt(void); #endif diff --git a/src/ft_p_line.c b/src/ft_p_line.c index b1ba6b2..166b880 100644 --- a/src/ft_p_line.c +++ b/src/ft_p_line.c @@ -31,6 +31,7 @@ void ptr = line; while (*ptr != '\0') { + if (*ptr == ';') { count += 1; diff --git a/src/minishell.c b/src/minishell.c index 7ddaa42..37e1520 100644 --- a/src/minishell.c +++ b/src/minishell.c @@ -12,6 +12,7 @@ #include <libft.h> #include <stdint.h> +#include <unistd.h> #include <string.h> #include <errno.h> |