diff options
-rw-r--r-- | libft/Makefile | 2 | ||||
-rw-r--r-- | libft/src/ft_substr.c | 2 | ||||
-rw-r--r-- | src/ft_b_echo.c | 85 | ||||
-rw-r--r-- | src/ft_m_loop.c | 51 | ||||
-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 |
8 files changed, 131 insertions, 19 deletions
diff --git a/libft/Makefile b/libft/Makefile index 858e90b..85f063d 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -121,7 +121,7 @@ OS = $(shell uname) #-------------------------------- Compiler ------------------------------------# #==============================================================================# ifeq (${OS}, Linux) - CC = gcc + CC = clang else CC = clang endif diff --git a/libft/src/ft_substr.c b/libft/src/ft_substr.c index 947a305..234ddc4 100644 --- a/libft/src/ft_substr.c +++ b/libft/src/ft_substr.c @@ -18,9 +18,7 @@ char *ft_substr(const char *s, unsigned int start, size_t len) { char *nstr; - size_t i; - i = 0; if (!(nstr = (char*)malloc((len + 1) * sizeof(char)))) return (NULL); ft_strlcpy(nstr, s + start, len + 1); 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..1797c93 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" @@ -20,9 +21,46 @@ #include "ft_s_lcom.h" 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; + + 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); + 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); + } + 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); + ft_memdel((void*)&buf); + ft_memdel((void*)&fin); + ft_memdel((void*)&prog); + ft_e_lcom(msh); + ft_lcom_clear(&msh->curr); + return (1); +} + +uint8_t ft_m_loop(t_msh *msh) { char *line; + char *quote; int8_t gnl; gnl = 1; @@ -32,10 +70,15 @@ 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); /* 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 96b51c8..0e8dbdd 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> |