diff options
author | JozanLeClerc <bousset.rudy@gmail.com> | 2020-10-01 19:14:01 +0200 |
---|---|---|
committer | JozanLeClerc <bousset.rudy@gmail.com> | 2020-10-01 19:14:01 +0200 |
commit | 426399f98b6cf68c2eee448de49ea091ac7a0562 (patch) | |
tree | e68f2f1ed1fca3bd54d7525d81f29e1bd6836703 /src/m_loop_multis.c | |
parent | Renormed m_loop (diff) | |
download | 42-minishell-426399f98b6cf68c2eee448de49ea091ac7a0562.tar.gz 42-minishell-426399f98b6cf68c2eee448de49ea091ac7a0562.tar.bz2 42-minishell-426399f98b6cf68c2eee448de49ea091ac7a0562.tar.xz 42-minishell-426399f98b6cf68c2eee448de49ea091ac7a0562.tar.zst 42-minishell-426399f98b6cf68c2eee448de49ea091ac7a0562.zip |
Normed m_loop
Diffstat (limited to '')
-rw-r--r-- | src/m_loop_multis.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/m_loop_multis.c b/src/m_loop_multis.c new file mode 100644 index 0000000..c4438d3 --- /dev/null +++ b/src/m_loop_multis.c @@ -0,0 +1,111 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* m_loop_multis.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> + +#include "m_loop_counter.h" +#include "m_loop_next.h" +#include "u_utils.h" + +static t_bool m_check_dquote(char **ptr, char line[]) +{ + if (((*ptr - line) == 0) || + ((*ptr - line) == 1 && *(*ptr - 1) == C_BACKS) || + ((*ptr - line) > 1 && *(*ptr - 1) == C_BACKS && *(*ptr - 2) != C_BACKS)) + { + return (FALSE); + } + else + { + return (TRUE); + } +} + +static t_bool m_find_next_quote(char **ptr, char line[], t_quote_mode mode) +{ + char c; + + if (mode == Q_NONE) + return (FALSE); + c = (mode == Q_SINGLE) ? (C_SQUOTE) : (C_DQUOTE); + (*ptr) += 1; + while (**ptr != C_NUL) + { + if (**ptr == c && c == C_DQUOTE) + { + if (m_check_dquote(ptr, line) == FALSE) + { + (*ptr)++; + if (**ptr == C_NUL) + break ; + } + else + return (FALSE); + } + else if (**ptr == c && c == C_SQUOTE) + return (FALSE); + (*ptr)++; + } + return (TRUE); +} + +static t_bool m_check_missing_quotes(char line[]) +{ + char *ptr; + t_quote_mode mode; + + ptr = line; + mode = Q_NONE; + while (*ptr != C_NUL) + { + if (*ptr == C_SQUOTE || *ptr == C_DQUOTE) + { + if (u_is_not_escaped(line, ptr) == TRUE) + { + mode = (*ptr == C_SQUOTE) ? (Q_SINGLE) : (Q_DOUBLE); + if (m_find_next_quote(&ptr, line, mode) == FALSE) + mode = Q_NONE; + else + return (TRUE); + } + } + ptr++; + } + return (FALSE); +} + +char *m_check_multi_quotes(int32_t fd, char line[], t_msh *msh) +{ + t_bool reparse; + + reparse = FALSE; + reparse = m_check_missing_quotes(line); + if (reparse == TRUE) + { + 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); +} + +char *m_check_multis(int32_t fd, char line[], t_msh *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); +} |