From 426399f98b6cf68c2eee448de49ea091ac7a0562 Mon Sep 17 00:00:00 2001 From: JozanLeClerc Date: Thu, 1 Oct 2020 19:14:01 +0200 Subject: Normed m_loop --- src/m_loop_multis.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/m_loop_multis.c (limited to 'src/m_loop_multis.c') 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include + +#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); +} -- cgit v1.2.3