diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/d_define.h | 9 | ||||
-rw-r--r-- | src/m_loop.c | 1 | ||||
-rw-r--r-- | src/m_loop_next.c | 61 | ||||
-rw-r--r-- | src/m_loop_next.h | 1 | ||||
-rw-r--r-- | src/p_args.c | 70 | ||||
-rw-r--r-- | src/p_lcom_next.c | 33 | ||||
-rw-r--r-- | src/p_line.c | 4 |
7 files changed, 139 insertions, 40 deletions
diff --git a/src/d_define.h b/src/d_define.h index 62cfe7c..66cc619 100644 --- a/src/d_define.h +++ b/src/d_define.h @@ -62,6 +62,15 @@ #define FT_FAIL_HOME_NOT_SET "HOME not set" /* +** ====== UTILS ====== +*/ + +#define C_SQUOTE '\'' +#define C_DQUOTE '"' +#define C_BACKSLASH '\\' +#define C_NULL '\000' + +/* ** ====== FILES ====== */ diff --git a/src/m_loop.c b/src/m_loop.c index 1faa2cf..17668a5 100644 --- a/src/m_loop.c +++ b/src/m_loop.c @@ -87,6 +87,7 @@ uint8_t line = m_check_multi_backslash(fd, line, msh); line = m_check_multi_pipe(fd, line, msh); line = m_check_multi_and(fd, line, msh); + line = m_check_multi_quotes(fd, line, msh); if (fd == STDIN_FILENO) m_handle_hist(line, msh); m_parse_and_run_line(line, msh); diff --git a/src/m_loop_next.c b/src/m_loop_next.c index 1a8d867..22eadba 100644 --- a/src/m_loop_next.c +++ b/src/m_loop_next.c @@ -14,6 +14,7 @@ #include <stdint.h> #include <unistd.h> +#include "d_define.h" #include "m_prompt.h" #include "s_struct.h" @@ -25,7 +26,7 @@ static char if (fd == STDIN_FILENO) m_prompt_psx(psx, msh); get_next_line(fd, &counter_line); - if (counter_line[0] != 0) + if (counter_line[0] != C_NULL) { line = ft_nrealloc(line, ft_strlen(line) + 1, @@ -46,7 +47,7 @@ static char if (fd == STDIN_FILENO) m_prompt_psx(psx, msh); get_next_line(fd, &counter_line); - if (counter_line[0] != 0) + if (counter_line[0] != C_NULL) { line = ft_nrealloc(line, ft_strlen(line) + 1, @@ -59,6 +60,30 @@ static char return (line); } +static char + *m_counter_line_quotes(int32_t fd, uint8_t psx, char *line, t_msh *msh) +{ + char *counter_line; + + if (fd == STDIN_FILENO) + m_prompt_psx(psx, msh); + get_next_line(fd, &counter_line); + if (counter_line[0] != C_NULL) + { + line = ft_nrealloc(line, + ft_strlen(line) + 1, + ft_strlen(line) + ft_strlen(counter_line) + 2); + line[ft_strlen(line) + 1] = '\0'; + line[ft_strlen(line)] = '\n'; + ft_memcpy(line + ft_strlen(line), + counter_line, + ft_strlen(counter_line) + 1); + } + ft_memdel((void*)&counter_line); + ft_printf("[%s]\n", line); + return (line); +} + char *m_check_multi_backslash(int32_t fd, char line[], t_msh *msh) { @@ -80,7 +105,7 @@ char pipe += 1; while (*pipe != '\0') { - if (ft_isspace(*pipe) == FALSE) + if (ft_iswhitespace(*pipe) == FALSE) { return (line); } @@ -103,7 +128,7 @@ char and += 1; while (*and != '\0') { - if (ft_isspace(*and) == FALSE) + if (ft_iswhitespace(*and) == FALSE) { return (line); } @@ -116,3 +141,31 @@ char } return (line); } + +char + *m_check_multi_quotes(int32_t fd, char line[], t_msh *msh) +{ + char *ptr; + size_t q[2]; + + q[0] = 0; + q[1] = 0; + ptr = line; + while (*ptr != C_NULL) + { + if (*ptr == C_SQUOTE && *(ptr - 1) != C_BACKSLASH) + q[0] += 1; + else if (*ptr == C_DQUOTE && *(ptr - 1) != C_BACKSLASH) + q[1] += 1; + ptr++; + } + if (q[0] % 2 == 1 || q[1] % 2 == 1) + { + line = m_counter_line_quotes(fd, 2, line, msh); + line = m_check_multi_backslash(fd, line, msh); + line = m_check_multi_pipe(fd, line, msh); + line = m_check_multi_and(fd, line, msh); + line = m_check_multi_quotes(fd, line, msh); + } + return (line); +} diff --git a/src/m_loop_next.h b/src/m_loop_next.h index 225e2ed..b4ca62c 100644 --- a/src/m_loop_next.h +++ b/src/m_loop_next.h @@ -20,6 +20,7 @@ char *m_check_multi_backslash(int32_t fd, char line[], t_msh *msh); char *m_check_multi_pipe(int32_t fd, char line[], t_msh *msh); char *m_check_multi_and(int32_t fd, char line[], t_msh *msh); +char *m_check_multi_quotes(int32_t fd, char line[], t_msh *msh); #endif diff --git a/src/p_args.c b/src/p_args.c index d8ca029..1cab59d 100644 --- a/src/p_args.c +++ b/src/p_args.c @@ -14,6 +14,8 @@ #include <stdint.h> #include <stdlib.h> +#include "d_define.h" + /* ================= */ /* TODO: DELETE THIS */ /* ================= */ @@ -35,14 +37,80 @@ p_print(char *words[]) /* TODO: DELETE ABOVE */ /* ================== */ +static void + p_skip_delim(char *ptr, char c) +{ + ptr++; + while (*ptr != C_NULL && *ptr != c) + { + ptr++; + if (*ptr == c && *(ptr - 1) == C_BACKSLASH) + ptr++; + } + if (*ptr != C_NULL) + ptr++; +} + +static uint16_t + p_count_args(char *ptr, uint16_t argc) +{ + if (*ptr == C_NULL) + return (argc); + while (*ptr != C_NULL && ft_iswhitespace(*ptr) == TRUE) + ptr++; + if (*ptr != C_SQUOTE && *ptr != C_DQUOTE) + { + while (*ptr != C_NULL && ft_iswhitespace(*ptr) == FALSE) + { + ptr++; + if ((*ptr == C_SQUOTE || *ptr == C_DQUOTE) && + *(ptr - 1) != C_BACKSLASH) + { + ptr++; + return (p_count_args(ptr, argc)); + } + } + } + else if (*ptr == C_SQUOTE) + { + p_skip_delim(ptr, C_SQUOTE); + } + else if (*ptr == C_DQUOTE) + { + p_skip_delim(ptr, C_DQUOTE); + } + return (p_count_args(ptr, argc + 1)); +} + +static char + **p_split_words_no_rdr(const char word[]) +{ + char **words; + char *ptr; + uint16_t argc; + + ptr = (char*)word; + argc = p_count_args(ptr, 0); + ft_printf("%hu\n", argc); + exit(0); + if ((words = (char**)malloc((argc + 1) * sizeof(char*))) == NULL) + return (NULL); + words[argc] = NULL; + return (words); +} + + char **p_split_args(const char word[], int8_t redir) { - char **words; + char **words; + words = NULL; ft_printf("word at start: [%s]\n", word); if (redir == 0) { + if ((words = p_split_words_no_rdr(word)) == NULL) + return (NULL); p_print(words); return (words); } diff --git a/src/p_lcom_next.c b/src/p_lcom_next.c index 28ad821..435a710 100644 --- a/src/p_lcom_next.c +++ b/src/p_lcom_next.c @@ -72,39 +72,6 @@ char } char - **p_subst_args(const char word[], - int8_t redir) -{ - char **words; - - return (words); - /* char **words; */ - /* char *subst; */ - /* size_t i; */ - - /* if (redir == 0) */ - /* { */ - /* if (!(words = ft_split(word, ' '))) */ - /* return (NULL); */ - /* return (words); */ - /* } */ - /* i = 0; */ - /* while (word[i] && ft_ischarset("<>", word[i]) == FALSE) */ - /* i++; */ - /* while (redir > 0 && ft_isdigit(word[i]) == TRUE) */ - /* i--; */ - /* if (!(subst = ft_substr(word, 0, i))) */ - /* return (NULL); */ - /* if (!(words = ft_split(subst, ' '))) */ - /* { */ - /* ft_memdel((void*)&subst); */ - /* return (NULL); */ - /* } */ - /* ft_memdel((void*)&subst); */ - /* return (words); */ -} - -char **p_subst_home(char *words[], t_msh *msh) { diff --git a/src/p_line.c b/src/p_line.c index ec148e3..0224bbb 100644 --- a/src/p_line.c +++ b/src/p_line.c @@ -45,7 +45,7 @@ static void ptr = line; while (*ptr != '\0') { - if (ft_isspace(*ptr) == TRUE) + if (ft_iswhitespace(*ptr) == TRUE) { *ptr = ' '; } @@ -61,7 +61,7 @@ static t_bool ptr = line; while (*ptr != '\0') { - if (ft_isspace(*ptr) == FALSE) + if (ft_iswhitespace(*ptr) == FALSE) { return (FALSE); } |