diff options
Diffstat (limited to '')
-rw-r--r-- | TODO.org | 1 | ||||
-rw-r--r-- | src/m_loop_next.c | 5 | ||||
-rw-r--r-- | src/m_prompt.c | 3 | ||||
-rw-r--r-- | src/p_args_escape.c | 91 | ||||
-rw-r--r-- | src/u_utils.c | 11 | ||||
-rw-r--r-- | src/u_utils.h | 2 |
6 files changed, 108 insertions, 5 deletions
@@ -18,6 +18,7 @@ ** TODO [#C] Handle memory ** TODO [#C] Go full stack to ken dash in the ass ** TODO [#C] Handle comments better # +** TODO [#C] msh ~> ./qwe.sh <---- without shebang (maybe works find already) * Stuff to add ** DONE [#A] builtins to pipes diff --git a/src/m_loop_next.c b/src/m_loop_next.c index 4bb8f78..3bc85e8 100644 --- a/src/m_loop_next.c +++ b/src/m_loop_next.c @@ -18,6 +18,7 @@ #include "m_loop_next.h" #include "m_prompt.h" #include "s_struct.h" +#include "u_utils.h" static char *m_counter_line_backslash(int32_t fd, uint8_t psx, char *line, t_msh *msh) @@ -198,9 +199,7 @@ static t_bool { if (*ptr == C_SQUOTE || *ptr == C_DQUOTE) { - if (((ptr - line) == 0) || - ((ptr - line) >= 1 && *(ptr - 1) != C_BS) || - ((ptr - line) > 1 && *(ptr - 1) == C_BS && *(ptr - 2) == C_BS)) + if (u_is_true_quote(line, ptr) == TRUE) { mode = (*ptr == C_SQUOTE) ? (Q_SINGLE) : (Q_DOUBLE); if (m_find_next_quote(&ptr, line, mode) == FALSE) diff --git a/src/m_prompt.c b/src/m_prompt.c index ad3c957..1ea8d70 100644 --- a/src/m_prompt.c +++ b/src/m_prompt.c @@ -54,7 +54,8 @@ static char while (tmp[j] != '/' && j != 0) j--; j++; - ft_memmove(tmp, tmp + j, (ft_strlen(tmp) - j) + 1); + (void)ft_memmove(tmp, tmp + j, + ((ft_strlen(tmp) - j) + 1) * sizeof(char)); } var = ft_strsubst(var, "\\W", tmp); ft_memdel((void*)&tmp); diff --git a/src/p_args_escape.c b/src/p_args_escape.c index 2a3a702..182ef2f 100644 --- a/src/p_args_escape.c +++ b/src/p_args_escape.c @@ -10,18 +10,105 @@ /* */ /* ************************************************************************** */ +#include <libft.h> #include <stddef.h> #include "d_define.h" +#include "u_utils.h" + +static t_quote_mode + p_escape_squote(char *ptr, char word[], t_quote_mode mode) +{ + if (mode == Q_NONE) + { + (void)ft_memmove(word + (ptr - word), ptr + 1, + (ft_strlen(ptr + 1) + 1) * sizeof(char)); + return (Q_SINGLE); + } + else if (mode == Q_SINGLE) + { + (void)ft_memmove(word + (ptr - word), ptr + 1, + (ft_strlen(ptr + 1) + 1) * sizeof(char)); + return (Q_NONE); + } + return (mode); +} + +static t_quote_mode + p_escape_dquote(char *ptr, char word[], t_quote_mode mode) +{ + if (mode == Q_NONE) + { + if (u_is_true_quote(word, ptr) == TRUE) + { + (void)ft_memmove(word + (ptr - word), ptr + 1, + (ft_strlen(ptr + 1) + 1) * sizeof(char)); + } + return (Q_DOUBLE); + } + else if (mode == Q_DOUBLE) + { + if (u_is_true_quote(word, ptr) == TRUE) + { + (void)ft_memmove(word + (ptr - word), ptr + 1, + (ft_strlen(ptr + 1) + 1) * sizeof(char)); + } + return (Q_NONE); + } + return (mode); +} + +static void + p_escape_bs(char *ptr, char word[], t_quote_mode mode) +{ + if (mode == Q_NONE) + { + (void)ft_memmove(word + (ptr - word), ptr + 1, + (ft_strlen(ptr + 1) + 1) * sizeof(char)); + } + else if (mode == Q_DOUBLE) + { + if (*(ptr + 1) == C_BS) + { + (void)ft_memmove(word + (ptr - word), ptr + 1, + (ft_strlen(ptr + 1) + 1) * sizeof(char)); + *(word + (ptr - word)) = 26; + } + else if (*(ptr + 1) == C_DQUOTE) + { + (void)ft_memmove(word + (ptr - word), ptr + 1, + (ft_strlen(ptr + 1) + 1) * sizeof(char)); + } + } +} static void - p_escape_arg(char *ptr) + p_escape_arg(char word[]) { + char *ptr; t_quote_mode mode; + ptr = word; mode = Q_NONE; while (*ptr != C_NULL) { + if (*ptr == C_SQUOTE) + mode = p_escape_squote(ptr, word, mode); + else if (*ptr == C_DQUOTE) + mode = p_escape_dquote(ptr, word, mode); + if (*ptr == C_BS) + p_escape_bs(ptr, word, mode); + ptr++; + } +} + +static void + p_replace_bs(char *ptr) +{ + while (*ptr != C_NULL) + { + if (*ptr == 26) + *ptr = C_BS; ptr++; } } @@ -32,12 +119,14 @@ void /* TODO: escape \ */ /* TODO: escape $# special vars */ /* TODO: escape my life */ + /* TODO: comments */ char **ptr; ptr = words; while (*ptr != NULL) { p_escape_arg(*ptr); + p_replace_bs(*ptr); ptr++; } } diff --git a/src/u_utils.c b/src/u_utils.c index ad44e82..d554a98 100644 --- a/src/u_utils.c +++ b/src/u_utils.c @@ -15,9 +15,20 @@ #include <stdint.h> #include <unistd.h> +#include "d_define.h" #include "f_fail.h" #include "s_struct.h" +t_bool + u_is_true_quote(char *head, char *ptr) +{ + if (((ptr - head) == 0) || + ((ptr - head) >= 1 && *(ptr - 1) != C_BS) || + ((ptr - head) > 1 && *(ptr - 1) == C_BS && *(ptr - 2) == C_BS)) + return (TRUE); + return (FALSE); +} + void u_eof_fd(int32_t fd) { diff --git a/src/u_utils.h b/src/u_utils.h index 22b63ff..1b83d65 100644 --- a/src/u_utils.h +++ b/src/u_utils.h @@ -13,10 +13,12 @@ #ifndef U_UTILS_H #define U_UTILS_H +#include <libft.h> #include <stdint.h> #include "s_struct.h" +t_bool u_is_true_quote(char *head, char *ptr); void u_eof_fd(int32_t fd); uint64_t u_builtins_get_argc(const char *args[]); char **u_get_env_var_names(t_msh *msh); |