diff options
Diffstat (limited to 'src/p_lcom.c')
-rw-r--r-- | src/p_lcom.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/p_lcom.c b/src/p_lcom.c new file mode 100644 index 0000000..f47e2c1 --- /dev/null +++ b/src/p_lcom.c @@ -0,0 +1,158 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* p_lcom.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 <stdlib.h> +#include <stdint.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> + +#include "d_define.h" +#include "f_fail.h" +#include "s_lcom.h" +#include "s_lpipes.h" +#include "s_struct.h" + +static void + rdr_err_check(char *ptr, + t_lcom **link) +{ + if ((*link)->redir == -1 && ft_ischarset("><", *(ptr + 1))) + { + /* TODO: syntax err */ + } + else if ((*link)->redir == 1 && ft_ischarset("<", *(ptr + 1))) + { + /* TODO: syntax err */ + } + else if ((*link)->redir == 2 && ft_ischarset("<>", *(ptr + 1))) + { + /* TODO: syntax err */ + } +} + +static int8_t + get_rdrpath(char *ptr, + t_lcom **link) +{ + char *p_rdrpath; + + ptr += ((*link)->redir == 2) ? (2) : (1); + if (!((*link)->rdrpath = + (char*)malloc((ft_strlen(ptr) + 1) * sizeof(char)))) + { + return (-1); + } + p_rdrpath = (*link)->rdrpath; + while (*ptr) + { + if (*ptr != ' ') + { + *p_rdrpath = *ptr; + p_rdrpath++; + } + ptr++; + } + *p_rdrpath = '\0'; + return (0); +} + +static void + get_rdrfd(const char *ptr, + t_lcom **link) +{ + while (ft_isdigit(*ptr)) + { + ptr--; + } + if (*ptr != ' ') + (*link)->rdrfd = STDOUT_FILENO; + else + { + ptr += 1; + (*link)->rdrfd = ft_atoi(ptr); + } +} + +int8_t + get_redir(const char word[], + t_lcom **link) +{ + /* TODO: norme */ + char *ptr; + + ptr = (char *)word; + while (*ptr) + { + if (*ptr == '<') + { + (*link)->redir = -1; + break ; + } + if (*ptr == '>') + { + (*link)->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 ((*link)->redir > 0) + { + if (ft_isdigit(*(ptr - 1))) + get_rdrfd(ptr - 1, link); + else + (*link)->rdrfd = STDOUT_FILENO; + rdr_err_check(ptr, link); + if (get_rdrpath(ptr, link) != 0) + return (-1); + } + return (0); +} + +int8_t + p_lcom(const char line[], + const uint64_t count, + t_msh *msh) +{ + /* TODO: norme */ + uint64_t i; + t_lcom *link; + char **words; + t_bool next; + + i = 0; + if (!(words = ft_split(line, ';'))) + return (-1); + while (i <= count && words[i]) + { + next = FALSE; + /* TODO: split pipes here */ + if (ft_strchr(words[i], '|')) + { + if (!(link = lcom_new(NULL, msh))) + return (-1); + if (!(split_pipes(words[i], link, msh))) + return (-1); + next = TRUE; + } + if (next == FALSE && !(link = lcom_new(words[i], msh))) + return (-1); + lcom_add_back(&msh->curr, link); + i++; + } + ft_delwords(words); + return (0); +} |