summaryrefslogtreecommitdiffstats
path: root/src/p_lblock.c
diff options
context:
space:
mode:
authorJozanLeClerc <bousset.rudy@gmail.com>2020-09-08 18:50:11 +0200
committerJozanLeClerc <bousset.rudy@gmail.com>2020-09-08 18:50:11 +0200
commit4dd10e6f4de22446ea84d7b194d2a18cb6e43c6c (patch)
tree2768d27ebe01fa5e74b4e6d14c5defdfd501a1d6 /src/p_lblock.c
parentstatic hist, words fix (diff)
download42-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.c167
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);
+}