/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* p_args.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 #include #include "d_define.h" #include "p_args.h" #include "p_args_next.h" #include "p_args_escape.h" #include "u_utils.h" static void p_meet_bs(char *ptr, t_quote_mode mode) { if (mode != Q_SINGLE) { if (*(ptr + 1) == C_BACKS) { *ptr = C_SUB; *(ptr + 1) = C_SUB; } } } static t_quote_mode p_meet_dquote(char *head, char *ptr, t_quote_mode mode) { if (mode == Q_NONE) { if (u_is_not_escaped(head, ptr) == TRUE) { return (Q_DOUBLE); } else { return (Q_NONE); } } else if (mode == Q_DOUBLE && u_is_not_escaped(head, ptr) == TRUE) { return (Q_NONE); } return (mode); } static t_quote_mode p_meet_squote(char *head, char *ptr, t_quote_mode mode) { if (mode == Q_NONE) { if (u_is_not_escaped(head, ptr) == TRUE) { return (Q_SINGLE); } else { return (Q_NONE); } } else if (mode == Q_SINGLE) { return (Q_NONE); } return (mode); } static t_bool p_meet_whitespace(char *head, char *ptr, t_quote_mode mode) { if (mode == Q_NONE && u_is_not_escaped(head, ptr) == TRUE) { return (TRUE); } return (FALSE); } static char *p_skip_whitespace(char *ptr) { while (*ptr != C_NUL && ft_iswhitespace(*ptr)) ptr++; return (ptr); } static uint16_t p_count_args(const char word[], size_t start[]) { char *ptr; t_quote_mode mode; uint16_t count; ptr = (char *)word; mode = Q_NONE; count = 1; ptr = p_skip_whitespace(ptr); start[0] = (ptr - word); while (*ptr != C_NUL) { if (*ptr == C_BACKS) p_meet_bs(ptr, mode); if (*ptr == C_DQUOTE) mode = p_meet_dquote((char*)word, ptr, mode); else if (*ptr == C_SQUOTE) mode = p_meet_squote((char*)word, ptr, mode); if (ft_iswhitespace(*ptr) && p_meet_whitespace((char*)word, ptr, mode) == TRUE) { count += 1; ptr = p_skip_whitespace(ptr); start[count - 1] = (ptr - word); ptr -= 1; } ptr++; } return (count); /* TODO: quotes parse error */ } static char **p_split_words_no_rdr(const char word[]) { char **words; size_t start[512]; uint16_t argc; uint16_t to_del; argc = p_count_args(word, start); if ((words = (char**)malloc((argc + 1) * sizeof(char*))) == NULL) return (NULL); words[argc] = NULL; if ((to_del = p_dup_words(words, word, argc, start)) != argc) { p_del_alloced_words(words, to_del); return (NULL); } p_args_escape_chars_and_quotes(words); return (words); } char **p_split_args(char word[], int8_t redir) { char **words; size_t i; words = NULL; if (redir == 0) { if ((words = p_split_words_no_rdr(word)) == NULL) return (NULL); return (words); } i = ft_strlen(word); while (ft_ischarset("<>", word[i]) == FALSE) i--; i--; while (redir > 0 && ft_isdigit(word[i]) == TRUE) i--; word[i] = C_NUL; ft_printf("[%s]\n", word); if ((words = p_split_words_no_rdr(word)) == NULL) return (NULL); 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); */ }