/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* p_lcom.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 #include #include #include "d_define.h" #include "f_fail.h" #include "p_split.h" #include "s_line.h" #include "s_lpipes.h" #include "s_struct.h" static void rdr_err_check(char *ptr, t_com **com) { if ((*com)->redir == -1 && ft_ischarset("><", *(ptr + 1))) { /* TODO: syntax err */ } else if ((*com)->redir == 1 && ft_ischarset("<", *(ptr + 1))) { /* TODO: syntax err */ } else if ((*com)->redir == 2 && ft_ischarset("<>", *(ptr + 1))) { /* TODO: syntax err */ } } static int8_t get_rdrpath(char *ptr, t_com **com) { char *p_rdrpath; ptr += ((*com)->redir == 2) ? (2) : (1); if (!((*com)->rdrpath = (char*)malloc((ft_strlen(ptr) + 1) * sizeof(char)))) { return (-1); } p_rdrpath = (*com)->rdrpath; while (*ptr) { if (*ptr != ' ') { *p_rdrpath = *ptr; p_rdrpath++; } ptr++; } *p_rdrpath = '\0'; return (0); } static void get_rdrfd(const char *ptr, t_com **com) { while (ft_isdigit(*ptr)) { ptr--; } if (*ptr != ' ') (*com)->rdrfd = STDOUT_FILENO; else { ptr += 1; (*com)->rdrfd = ft_atoi(ptr); } } int8_t get_redir(const char word[], t_com **com) { /* TODO: norme */ char *ptr; ptr = (char *)word; while (*ptr) { if (*ptr == '<') { (*com)->redir = -1; break ; } if (*ptr == '>') { (*com)->redir = (*(ptr + 1) == '>') ? (2) : (1); break ; } ptr++; /* TODO: handle correctly multiples "msh ~> echo qwe > qwe > asd >> zxc > qweasdzxc" */ /* hint: bash only handles the last one */ /* TODO: handle "msh ~> cat < Makefile >qwe" | gl hf */ } if ((*com)->redir > 0) { if (ft_isdigit(*(ptr - 1))) get_rdrfd(ptr - 1, com); else (*com)->rdrfd = STDOUT_FILENO; rdr_err_check(ptr, com); if (get_rdrpath(ptr, com) != 0) return (-1); } return (0); } int8_t p_lcom(const char line[], t_msh *msh) { /* TODO: norme */ uint64_t i; t_line *link; char **words; char *ptr; uint8_t nextif; t_bool next; i = 0; if ((words = p_split_line(line)) == NULL) return (-1); while (words[i] != NULL) { if (words[i][ft_strlen(words[i]) - 1] == ';') nextif = 0; else if (words[i][ft_strlen(words[i]) - 1] == '&') nextif = 1; else nextif = 2; words[i][ft_strlen(words[i]) - 1] = '\0'; next = FALSE; if ((ptr = ft_strchr(words[i], '|')) != NULL) { if ((link = s_line_new(NULL, msh)) == NULL) return (-1); if ((split_pipes(words[i], link, msh)) == NULL) return (-1); next = TRUE; } if (next == FALSE && (link = s_line_new(words[i], msh)) == NULL) return (-1); link->nextif = nextif; s_line_add_back(&msh->curr, link); i++; } ft_delwords(words); return (0); }