From 6ae7296237ee79261a58920c9782d9f842d2cd3f Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Tue, 18 Jun 2024 12:21:40 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D=20wip:?= =?UTF-8?q?=20Work=20in=20progress?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/parsing.h | 13 +++-- libft/src/str/ft_strjoin.c | 2 +- libft/src/str/ft_strncmp.c | 4 +- src/main.c | 11 +++-- src/parsing/check_error/check_syntax.c | 30 +++++++++++- src/parsing/check_error/send_error.c | 3 +- src/parsing/env_var/env_var_replace.c | 64 +++++++++++++++++++++++++ src/parsing/env_var/get_size_with_env.c | 40 ++++++++++++++++ src/parsing/env_var/strlen_till_char.c | 29 +++++++++++ src/parsing/get_redir_fd.c | 49 +++++++++++-------- src/parsing/is_inquote.c | 6 +-- src/parsing/split_argv.c | 57 ++++++++++++++++++++++ src/prompt/get_pwd.c | 4 +- 13 files changed, 270 insertions(+), 42 deletions(-) create mode 100644 src/parsing/env_var/env_var_replace.c create mode 100644 src/parsing/env_var/get_size_with_env.c create mode 100644 src/parsing/env_var/strlen_till_char.c create mode 100644 src/parsing/split_argv.c diff --git a/include/parsing.h b/include/parsing.h index d64b975..99d85cc 100644 --- a/include/parsing.h +++ b/include/parsing.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/25 12:20:26 by adjoly #+# #+# */ -/* Updated: 2024/06/04 13:15:24 by adjoly ### ########.fr */ +/* Updated: 2024/06/11 15:18:38 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ # include "libft.h" # include "tokenizer.h" +# include "env.h" typedef struct s_cmd { @@ -28,15 +29,19 @@ typedef enum s_quote { NOT_CLOSED = -1, FALSE, - SINGLE, - DOUBLE + SINGLE = 39, + DOUBLE = 34 } t_quote; -void check_syntax(char *readline, char **argv); +bool check_syntax(char *readline, char **argv); void send_error(char *msg, char **argv); void check_redir(t_list *redir, char **argv); t_cmd *get_redir_fd(void *content); t_list *get_cmd_list(t_list *list); +char **split_argv(char *readline); +char *env_var_replace(char *readline, t_env *env); +size_t get_size_with_env(char *readline, t_env *env); +size_t strlen_till_char(char *s, int c); /** * @brief Take the argv of a command a split the argv and the * command it self diff --git a/libft/src/str/ft_strjoin.c b/libft/src/str/ft_strjoin.c index 4b64541..317f76c 100644 --- a/libft/src/str/ft_strjoin.c +++ b/libft/src/str/ft_strjoin.c @@ -6,7 +6,7 @@ /* By: mmoussou content))->redirection, av); + ft_putendl_fd(env_var_replace(test, &env_l), STDOUT_FILENO); cmd_list = get_cmd_list(piped); - exec_split_cmd(cmd_list, &env_l); + //exec_split_cmd(cmd_list, &env_l); /*while (cmd_list) { cmd = cmd_list->content; cmd_list = cmd_list->next; - } - print_cmd(cmd);*/ + }*/ + print_cmd(cmd_list->content); free(test); ft_lstclear(&piped, free_token); ft_free("a", &lll); @@ -110,6 +111,6 @@ int main(int ac, char **av, char **env) t_quote d; d = is_inquote(ll, 6); - ft_printf("%c\n", *(ll+6)); + ft_printf("%c\n", *(ll+6)) print_quote_type(d); }*/ diff --git a/src/parsing/check_error/check_syntax.c b/src/parsing/check_error/check_syntax.c index 4a27266..b279bf1 100644 --- a/src/parsing/check_error/check_syntax.c +++ b/src/parsing/check_error/check_syntax.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/28 17:40:13 by adjoly #+# #+# */ -/* Updated: 2024/05/29 11:37:06 by adjoly ### ########.fr */ +/* Updated: 2024/06/04 16:43:53 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,7 +31,24 @@ bool check_triple(char *chevron) return (false); } -void check_syntax(char *readline, char **argv) +bool check_if_file(char *readline) +{ + char *tmp; + + tmp = readline; + if (is_chevron(*tmp)) + { + while (*tmp && is_chevron(*tmp)) + tmp++; + while (*tmp && !ft_isalnum(*tmp)) + tmp++; + if (!*tmp) + return (true); + } + return (false); +} + +bool check_syntax(char *readline, char **argv) { char *tmp; @@ -39,7 +56,16 @@ void check_syntax(char *readline, char **argv) while (*tmp) { if (check_triple(tmp)) + { send_error(ERROR_SYNTAX, argv); + return (true); + } + if (check_if_file(tmp)) + { + send_error(ERROR_SYNTAX, argv); + return (true); + } tmp++; } + return (false); } diff --git a/src/parsing/check_error/send_error.c b/src/parsing/check_error/send_error.c index d1cfbc8..c7ed812 100644 --- a/src/parsing/check_error/send_error.c +++ b/src/parsing/check_error/send_error.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/28 18:09:49 by adjoly #+# #+# */ -/* Updated: 2024/05/28 18:15:09 by adjoly ### ########.fr */ +/* Updated: 2024/06/04 15:39:24 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,5 +16,4 @@ void send_error(char *msg, char **argv) { ft_putstr_fd(argv[0], STDERR_FILENO); ft_putendl_fd(msg, STDERR_FILENO); - exit(EXIT_FAILURE); } diff --git a/src/parsing/env_var/env_var_replace.c b/src/parsing/env_var/env_var_replace.c new file mode 100644 index 0000000..44b0335 --- /dev/null +++ b/src/parsing/env_var/env_var_replace.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* env_var_replace.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 21:14:04 by adjoly #+# #+# */ +/* Updated: 2024/06/11 16:26:06 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include "parsing.h" +#include "env.h" + +size_t strlen_till_notalnum(char *s) +{ + char *tmp; + + tmp = s; + while (*tmp && ft_isalnum(*tmp)) + tmp++; + return (tmp - s); +} + +char *env_var_replace(char *readline, t_env *env) +{ + char *tmp; + char *rl_dollared; + size_t dollar_size; + char *dollar; + + rl_dollared = ft_calloc(get_size_with_env(readline, env) + 1, sizeof(char)); + if (rl_dollared == NULL) + return (NULL); + tmp = readline; + while (*tmp) + { + print_quote_type(__is_quote(*tmp)); + if (*tmp == '$' && is_inquote(tmp, tmp - readline + 1) != SINGLE) + { + tmp++; + dollar_size = strlen_till_notalnum(tmp); + ft_putnbr_fd(dollar_size, STDOUT_FILENO); + dollar = env_getn_value(tmp, env, dollar_size); + write(1, tmp, dollar_size); + ft_putendl_fd(dollar, STDOUT_FILENO); + if (!dollar) + { + tmp += dollar_size; + continue ; + } + ft_strlcat(rl_dollared, dollar, ft_strlen(dollar) + ft_strlen(rl_dollared) + 1); + tmp += dollar_size; + } + else + { + ft_strlcat(rl_dollared, tmp, ft_strlen(rl_dollared) + 2); + tmp++; + } + } + return (rl_dollared); +} diff --git a/src/parsing/env_var/get_size_with_env.c b/src/parsing/env_var/get_size_with_env.c new file mode 100644 index 0000000..e54570a --- /dev/null +++ b/src/parsing/env_var/get_size_with_env.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_size_with_env.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 15:01:19 by adjoly #+# #+# */ +/* Updated: 2024/06/10 17:11:16 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include "env.h" +#include "parsing.h" +#include "libft.h" + +size_t get_size_with_env(char *readline, t_env *env) +{ + size_t size; + char *tmp; + char *dollar; + + tmp = readline; + size = ft_strlen(readline); + while (*tmp) + { + if (*tmp == '$' && is_inquote(tmp, tmp - readline) != SINGLE && is_inquote(tmp, tmp - readline) != NOT_CLOSED) + { + tmp++; + size -= strlen_till_char(tmp, ' '); + dollar = env_getn_value(tmp, env, strlen_till_char(tmp, ' ')); + if (!dollar) + continue ; + size += ft_strlen(dollar); + } + tmp++; + } + return (size); +} diff --git a/src/parsing/env_var/strlen_till_char.c b/src/parsing/env_var/strlen_till_char.c new file mode 100644 index 0000000..b5202c5 --- /dev/null +++ b/src/parsing/env_var/strlen_till_char.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* strlen_till_char.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/07 01:09:40 by adjoly #+# #+# */ +/* Updated: 2024/06/09 14:02:35 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include + +size_t strlen_till_char(char *s, int c) +{ + char *tmp; + size_t size; + + tmp = s; + size = 0; + while (*tmp && *tmp != c) + { + tmp++; + size++; + } + return (size); +} diff --git a/src/parsing/get_redir_fd.c b/src/parsing/get_redir_fd.c index c47124e..4f95c42 100644 --- a/src/parsing/get_redir_fd.c +++ b/src/parsing/get_redir_fd.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/30 10:48:41 by adjoly #+# #+# */ -/* Updated: 2024/05/31 19:16:41 by adjoly ### ########.fr */ +/* Updated: 2024/06/04 15:35:30 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,48 +18,55 @@ t_cmd *get_redir_fd(void *content) { - t_token *token; - t_list *tmp; - t_redirection *tmp_redir; - t_redirection out; - t_redirection in; - t_cmd *cmd; + t_token *token; + t_list *tmp; + t_redirection *tmp_redir; + t_redirection_sign out; + t_redirection_sign in; + t_cmd *cmd; token = (t_token *)content; tmp = token->redirection; cmd = NULL; - out.sign = INFILE; - in.sign = OUTFILE; + out = INFILE; + in = OUTFILE; cmd = ft_calloc(sizeof(t_cmd), 1); while (tmp) { tmp_redir = (t_redirection *)tmp->content; if (tmp_redir->sign == (t_redirection_sign)HEREDOC) { - in.file_name = NULL; - in.sign = HEREDOC; - close(cmd->infile); + if (cmd->infile != 0) + close(cmd->infile); + in = HEREDOC; cmd->infile = ft_heredoc(tmp_redir->file_name); } else if (tmp_redir->sign == INFILE) { - in.sign = INFILE; - in.file_name = tmp_redir->file_name; + if (cmd->infile != 0) + close(cmd->infile); + cmd->infile = open(tmp_redir->file_name, O_RDONLY); + in = INFILE; } else if (tmp_redir->sign == OUTFILE) + { + if (cmd->infile != 0) + close(cmd->outfile); + out = OUTFILE; cmd->outfile = open(tmp_redir->file_name, O_CREAT | O_TRUNC | O_WRONLY, 0644); + } else if (tmp_redir->sign == OUT_APPEND) + { + if (cmd->infile != 0) + close(cmd->outfile); + out = OUT_APPEND; cmd->outfile = open(tmp_redir->file_name, O_CREAT | O_APPEND | O_WRONLY, 0644); + } tmp = tmp->next; } - if (in.sign == OUTFILE) + if (in == OUTFILE) cmd->infile = STDIN_FILENO; - else if (in.sign == INFILE) - { - cmd->infile = open(in.file_name, O_RDONLY); - ft_putendl_fd(in.file_name, STDOUT_FILENO); - } - if (out.sign == INFILE) + if (out == INFILE) cmd->outfile = STDOUT_FILENO; cmd = split_cmd(token->argv, cmd); return (cmd); diff --git a/src/parsing/is_inquote.c b/src/parsing/is_inquote.c index ade548f..ffc812a 100644 --- a/src/parsing/is_inquote.c +++ b/src/parsing/is_inquote.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/20 20:06:13 by adjoly #+# #+# */ -/* Updated: 2024/05/21 20:34:14 by adjoly ### ########.fr */ +/* Updated: 2024/06/11 15:26:56 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,9 +15,9 @@ t_quote __is_quote(char c) { - if (c == 39) + if (c == SINGLE) return (SINGLE); - if (c == 34) + if (c == DOUBLE) return (DOUBLE); return (FALSE); } diff --git a/src/parsing/split_argv.c b/src/parsing/split_argv.c new file mode 100644 index 0000000..682434a --- /dev/null +++ b/src/parsing/split_argv.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* split_argv.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 13:48:57 by adjoly #+# #+# */ +/* Updated: 2024/06/10 16:29:12 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include "parsing.h" + +/*char *end_of_arg(char *readline) +{ + char *tmp; + + tmp = readline; + while (*tmp) + { + if (*tmp == 32 && is_inquote(readline, tmp - readline)) + break ; + tmp++; + } + return (tmp); +} + +size_t count_args(char *readline) +{ + char *tmp; + + tmp = readline; + while (*tmp) + { + + tmp++; + } +} + +char **split_argv(char *readline) +{ + char *tmp; + char **argv; + + tmp = readline; + ft_putnbr_fd(count_args(readline), STDOUT_FILENO); + argv = ft_calloc(count_args(readline), sizof(char *)); + while (*tmp) + { + + tmp++; + } + return (argv); +} +*/ diff --git a/src/prompt/get_pwd.c b/src/prompt/get_pwd.c index 189b06e..0dd6ad3 100644 --- a/src/prompt/get_pwd.c +++ b/src/prompt/get_pwd.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/02 14:42:00 by adjoly #+# #+# */ -/* Updated: 2024/05/27 19:00:47 by adjoly ### ########.fr */ +/* Updated: 2024/06/11 16:04:42 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ char *get_pwd(t_env env) home = env_get_value("HOME", &env);//getenv("HOME"); if (!pwd) return (NULL); - if (!ft_strncmp(pwd, home, ft_strlen(home))) + if (!ft_strncmp(pwd, home, ft_strlen(home) - 1)) { pwd += ft_strlen(home); pwd = ft_strjoin("~", pwd);