summaryrefslogtreecommitdiffstats
path: root/src/p_lcom.c
diff options
context:
space:
mode:
authorJozanLeClerc <bousset.rudy@gmail.com>2020-07-27 18:55:07 +0200
committerJozanLeClerc <bousset.rudy@gmail.com>2020-07-27 18:55:07 +0200
commit487a66394061f2d14a2fa421302966b5442d643f (patch)
tree34237d4e9cb85f94bcefd46f399d2224dff3f6b3 /src/p_lcom.c
parentCorrect shell prompt (diff)
download42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.gz
42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.bz2
42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.xz
42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.zst
42-minishell-487a66394061f2d14a2fa421302966b5442d643f.zip
I couldn't see shit
Diffstat (limited to 'src/p_lcom.c')
-rw-r--r--src/p_lcom.c158
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);
+}