diff options
author | JozanLeClerc <bousset.rudy@gmail.com> | 2020-09-08 18:50:11 +0200 |
---|---|---|
committer | JozanLeClerc <bousset.rudy@gmail.com> | 2020-09-08 18:50:11 +0200 |
commit | 4dd10e6f4de22446ea84d7b194d2a18cb6e43c6c (patch) | |
tree | 2768d27ebe01fa5e74b4e6d14c5defdfd501a1d6 /src/p_lblock.c | |
parent | static hist, words fix (diff) | |
download | 42-minishell-4dd10e6f4de22446ea84d7b194d2a18cb6e43c6c.tar.gz 42-minishell-4dd10e6f4de22446ea84d7b194d2a18cb6e43c6c.tar.bz2 42-minishell-4dd10e6f4de22446ea84d7b194d2a18cb6e43c6c.tar.xz 42-minishell-4dd10e6f4de22446ea84d7b194d2a18cb6e43c6c.tar.zst 42-minishell-4dd10e6f4de22446ea84d7b194d2a18cb6e43c6c.zip |
Names
Diffstat (limited to 'src/p_lblock.c')
-rw-r--r-- | src/p_lblock.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/p_lblock.c b/src/p_lblock.c new file mode 100644 index 0000000..a8c42ce --- /dev/null +++ b/src/p_lblock.c @@ -0,0 +1,167 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* 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 "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)) == TRUE) + { + /* TODO: syntax err */ + } + else if ((*com)->redir == 1 && ft_ischarset("<", *(ptr + 1)) == TRUE) + { + /* TODO: syntax err */ + } + else if ((*com)->redir == 2 && ft_ischarset("<>", *(ptr + 1)) == TRUE) + { + /* 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) == TRUE) + { + ptr--; + } + if (*ptr != ' ') + (*com)->rdrfd = STDOUT_FILENO; + else + { + ptr += 1; + (*com)->rdrfd = ft_atoi(ptr); + } +} + +int8_t + p_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)) == TRUE) + 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 ((s_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); +} |