diff --git a/Makefile b/Makefile index a8726ac..f106597 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: mmoussou # include "libft.h" +# include "parsing.h" # include "error_msg.h" # include "env.h" # include "prompt.h" -# include "parsing.h" # include "execution.h" void free_redir(void *redir_v); @@ -41,7 +41,7 @@ void free_cmd(void *content); t_env **get_env(t_env **env); t_list **get_list(t_list **list); -t_list **get_list2(t_list **list); +void *get_void(void *in); int get_exit_code(int in); size_t ft_arrlen(char **a); char **get_rl(char **rl); diff --git a/include/parsing.h b/include/parsing.h index 8c240e7..f794833 100644 --- a/include/parsing.h +++ b/include/parsing.h @@ -6,7 +6,7 @@ /* By: mmoussou +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/05/18 20:14:15 by adjoly #+# #+# */ -/* Updated: 2024/07/20 16:52:51 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef TOKENIZER_H -# define TOKENIZER_H - -# include "libft.h" - -typedef enum s_redir_sign -{ - INFILE, - HEREDOC, - OUTFILE, - OUT_APPEND, -} t_redir_sign; - -typedef struct s_redirection -{ - char *file_name; - t_redir_sign sign; -} t_redirection; - -typedef struct s_token -{ - char *argv; - t_list *redirection; -} t_token; - -/** - * @brief Take a string and tell what type of redirect it is - * - * @param A string that contain a redirection sign - * - * @return (t_redirection_sign) The sign of the redirecition - */ -t_redir_sign __to_redir_sign(char *redir_sign); - -/** - * @brief Take a string and split the filename and the redirect - * sign - * - * @param redir_s A string that contain a redirection - * - * @return (t_redirection) The splited redirection - */ -t_redirection *__to_redir(char *redir_s); - -/** - * @brief Convert the raw command into a t_token that contains - * the argv of the command an a linked list of redirection - * - * @param cmd A string that contain the command to tokenize - * - * @return (t_token *) The tokenized version of the command - * - */ -t_token *__to_token(char *cmd); - -/** - * @brief - * - * @param The readline output - * - * @return (t_list *) A linked lst of all the command splited - * - */ -t_list *__split_pipe(char *readline); - -/** - * @brief Convert the readline output, split all command and put - * it in linked list of t_token (given by t_token function) - * - * @param readline The readline output - * - * @return (t_list *) Linked list of t_token - * - */ -t_list *tokenizer(char *readline); - -#endif diff --git a/src/exec/format_quotes.c b/src/exec/format_quotes.c index a27a4bd..0ab0bf3 100644 --- a/src/exec/format_quotes.c +++ b/src/exec/format_quotes.c @@ -6,7 +6,7 @@ /* By: mmoussou cmd) - return (0); - cmd->cmd = format_quotes_string(cmd->cmd); - i = 0; - while (cmd->argv[i]) + argv = content; + while (argv && *argv) { - cmd->argv[i] = format_quotes_string(cmd->argv[i]); - i++; + *argv = format_quotes_string(*argv); + argv++; } - return (0); -} - -int format_quotes(t_list *list_cmd) -{ - if (!list_cmd) - return (0); - while (list_cmd) - { - if (format_quotes_cmd(list_cmd->content)) - return (-1); - list_cmd = list_cmd->next; - } - return (0); } diff --git a/src/exec/heredoc.c b/src/exec/heredoc.c index 7b51835..6422477 100644 --- a/src/exec/heredoc.c +++ b/src/exec/heredoc.c @@ -6,7 +6,7 @@ /* By: mmoussou +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/10 01:14:10 by adjoly #+# #+# */ -/* Updated: 2024/08/01 17:58:58 by adjoly ### ########.fr */ +/* Updated: 2024/08/06 15:18:19 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -66,10 +66,10 @@ void __heredoc_sig(int code) { (void)code; ft_envclear(get_env(NULL), free); - ft_lstclear_till_nxt(get_list2(NULL), &free_cmd); - ft_lstclear(get_list(NULL), &free_token); + ft_lstclear(get_list(NULL), free); + ft_free("a", (char ***)get_void(NULL)); + close(get_fd_heredoc(-1)); close(get_fd_heredoc(-1)); rl_clear_history(); - free(*get_rl(NULL)); exit(130); } diff --git a/src/exec/sig.c b/src/exec/sig.c index b1f171b..6264940 100644 --- a/src/exec/sig.c +++ b/src/exec/sig.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/16 14:38:11 by adjoly #+# #+# */ -/* Updated: 2024/07/29 19:16:15 by adjoly ### ########.fr */ +/* Updated: 2024/08/05 16:22:38 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/main.c b/src/main.c index c78e954..bbeb2a4 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: mmoussou +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/03 16:34:19 by adjoly #+# #+# */ -/* Updated: 2024/07/18 17:15:01 by adjoly ### ########.fr */ +/* Updated: 2024/08/05 16:34:01 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,27 +14,27 @@ #include "parsing.h" #include "error_msg.h" -bool check_file_name(t_list *redir) -{ - while (redir) - { - if (!((t_redirection *)redir->content)->file_name) - return (true); - redir = redir->next; - } - return (false); -} +//bool check_file_name(t_list *redir) +//{ +// while (redir) +// { +// if (!((t_redirection *)redir->content)->file_name) +// return (true); +// redir = redir->next; +// } +// return (false); +//} -bool check_argv(t_list *token) -{ - t_list *tmp; - - tmp = token; - while (tmp) - { - if (check_file_name(((t_token *)tmp->content)->redirection)) - return (send_error_parsing(ERROR_NO_FILE)); - tmp = tmp->next; - } - return (false); -} +//bool check_argv(t_list *token) +//{ +// t_list *tmp; +// +// tmp = token; +// while (tmp) +// { +// if (check_file_name(((t_token *)tmp->content)->redirection)) +// return (send_error_parsing(ERROR_NO_FILE)); +// tmp = tmp->next; +// } +// return (false); +//} diff --git a/src/parsing/check_error/check_quote.c b/src/parsing/check_error/check_quote.c index 4b91ea6..9345778 100644 --- a/src/parsing/check_error/check_quote.c +++ b/src/parsing/check_error/check_quote.c @@ -6,13 +6,12 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/21 11:59:34 by adjoly #+# #+# */ -/* Updated: 2024/07/18 13:01:49 by adjoly ### ########.fr */ +/* Updated: 2024/08/05 16:28:43 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "parsing.h" #include "error_msg.h" -#include "tokenizer.h" #include char *go_to_nxt_quote(char *rl, t_quote quote_type) diff --git a/src/parsing/check_error/check_redir.c b/src/parsing/check_error/check_redir.c index 2b0bb51..071d5df 100644 --- a/src/parsing/check_error/check_redir.c +++ b/src/parsing/check_error/check_redir.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/09 16:32:21 by adjoly #+# #+# */ -/* Updated: 2024/07/09 23:09:41 by adjoly ### ########.fr */ +/* Updated: 2024/08/05 22:02:00 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,13 +17,13 @@ bool check_redir(t_list *list) { t_list *tmp; - t_cmd *cmd; + t_redir *redir; tmp = list; while (tmp) { - cmd = (t_cmd *)tmp->content; - if (cmd->infile == -1 || cmd->outfile == -1) + redir = (t_redir *)tmp->content; + if (redir->fd < 0) return (send_error_parsing(ERROR_NO_FILE)); tmp = tmp->next; } diff --git a/src/parsing/check_error/check_syntax.c b/src/parsing/check_error/check_syntax.c index 40094a1..0a6eaf8 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/06/30 13:54:53 by adjoly ### ########.fr */ +/* Updated: 2024/08/06 16:51:48 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,7 +40,7 @@ bool check_if_file(char *readline) { while (*tmp && is_chevron(*tmp)) tmp++; - while (*tmp && !ft_isalnum(*tmp)) + while (*tmp && ft_isspace(*tmp)) tmp++; if (!*tmp) return (true); diff --git a/src/parsing/env_var/env_var_replace.c b/src/parsing/env_var/env_var_replace.c index 80eac13..9fbc3b2 100644 --- a/src/parsing/env_var/env_var_replace.c +++ b/src/parsing/env_var/env_var_replace.c @@ -6,7 +6,7 @@ /* By: mmoussou +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/05/31 12:47:13 by adjoly #+# #+# */ -/* Updated: 2024/08/01 19:07:28 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "libft.h" -#include "parsing.h" -#include "minishell.h" - -t_list *make_lst(t_list *tmp) -{ - t_list *cmd_list; - - cmd_list = malloc(sizeof(t_list)); - get_list2(&cmd_list); - cmd_list->next = NULL; - cmd_list->content = get_redir_fd(tmp->content, \ - ((t_token *)tmp->content)->redirection); - return (cmd_list); -} - -t_list *get_cmd_list(t_list *list) -{ - t_list *tmp; - t_list *cmd_list; - - tmp = list; - cmd_list = make_lst(tmp); - if (!cmd_list->content) - { - free(cmd_list); - return (NULL); - } - tmp = tmp->next; - while (tmp) - { - ft_lstadd_back(&cmd_list, ft_lstnew(get_redir_fd(tmp->content, \ - ((t_token *)tmp->content)->redirection))); - if (!ft_lstlast(cmd_list)->content) - { - ft_lstclear(&cmd_list, &free_cmd); - if (cmd_list) - free(cmd_list); - return (NULL); - } - tmp = tmp->next; - } - return (cmd_list); -} diff --git a/src/parsing/get_redir_fd.c b/src/parsing/get_redir_fd.c deleted file mode 100644 index c043e27..0000000 --- a/src/parsing/get_redir_fd.c +++ /dev/null @@ -1,68 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* get_redir_fd.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/05/30 10:48:41 by adjoly #+# #+# */ -/* Updated: 2024/08/03 18:43:13 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parsing.h" -#include "tokenizer.h" -#include "execution.h" -#include -#include "minishell.h" -#include -#include "libft.h" - -void parsing_msg(t_cmd *cmd) -{ - if (cmd->infile == -1 || cmd->outfile == -1) - send_error_parsing(ERROR_NO_FILE); -} - -t_cmd *init_cmd(void) -{ - t_cmd *cmd; - - cmd = ft_calloc(sizeof(t_cmd), 1); - if (!cmd) - return (NULL); - cmd->infile = -2; - cmd->outfile = -2; - cmd->argv = NULL; - cmd->cmd = NULL; - return (cmd); -} - -t_cmd *get_redir_fd(void *content, t_list *tmp) -{ - t_redir_sign sign[2]; - t_cmd *cmd; - - sign[0] = INFILE; - sign[1] = OUTFILE; - cmd = init_cmd(); - if (!cmd) - return (NULL); - while (tmp) - { - open_redir((t_redirection *)tmp->content, cmd, sign); - if (cmd->infile <= -1 || cmd->outfile == -1) - { - parsing_msg(cmd); - free(cmd); - return (NULL); - } - tmp = tmp->next; - } - if (sign[0] == INFILE || cmd->outfile == -1) - cmd->outfile = STDOUT_FILENO; - if (sign[1] == OUTFILE || cmd->infile == -1) - cmd->infile = STDIN_FILENO; - cmd = split_cmd(((t_token *)content)->argv, cmd); - return (cmd); -} diff --git a/src/parsing/is_inquote.c b/src/parsing/is_inquote.c index b9cf4c9..7fded8d 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/07/17 16:20:46 by adjoly ### ########.fr */ +/* Updated: 2024/08/05 16:28:20 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/parsing/open_redir.c b/src/parsing/open_redir.c deleted file mode 100644 index 0a90ed9..0000000 --- a/src/parsing/open_redir.c +++ /dev/null @@ -1,48 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* open_redir.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/06/30 15:56:53 by adjoly #+# #+# */ -/* Updated: 2024/08/03 18:44:03 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "tokenizer.h" -#include -#include "parsing.h" -#include "execution.h" -#include - -t_redir_sign __close_unused_fd(t_cmd *cmd, t_redir_sign sign) -{ - if (cmd->outfile > 1 && sign >= 2) - close(cmd->outfile); - else if (cmd->infile > 1 && sign < 2) - close(cmd->infile); - return (sign); -} - -void open_redir(t_redirection *redir, t_cmd *cmd, t_redir_sign sign[2]) -{ - if (redir->sign == OUTFILE || redir->sign == OUT_APPEND) - sign[0] = __close_unused_fd(cmd, redir->sign); - else if (redir->sign == INFILE || redir->sign == HEREDOC) - sign[1] = __close_unused_fd(cmd, redir->sign); - if (redir->sign == HEREDOC) - { - cmd->infile = ft_heredoc(redir->file_name, cmd); - if (cmd->infile == -2) - return ; - } - else if (redir->sign == INFILE) - cmd->infile = open(redir->file_name, O_RDONLY); - else if (redir->sign == OUTFILE) - cmd->outfile = open(redir->file_name, \ - O_CREAT | O_TRUNC | O_WRONLY, 0644); - else if (redir->sign == OUT_APPEND) - cmd->outfile = open(redir->file_name, \ - O_CREAT | O_APPEND | O_WRONLY, 0644); -} diff --git a/src/parsing/split_argv.c b/src/parsing/split_argv.c index 35b3988..c12d4d3 100644 --- a/src/parsing/split_argv.c +++ b/src/parsing/split_argv.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/05 13:48:57 by adjoly #+# #+# */ -/* Updated: 2024/07/30 19:10:17 by adjoly ### ########.fr */ +/* Updated: 2024/08/06 17:23:12 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,14 +14,26 @@ #include "parsing.h" #include +int ft_ischevron(int c) +{ + return (c == '<' || c == '>'); +} + size_t __get_len_arg(char *s) { char *tmp; tmp = s; - while (*tmp) + if (ft_ischevron(*tmp)) { - if (ft_isspace(*tmp) && is_inquote(s, tmp - s) == FALSE) + while (*tmp && ft_ischevron(*tmp)) + tmp++; + return (tmp - s); + } + while (tmp && *tmp) + { + if ((ft_isspace(*tmp) || ft_ischevron(*tmp)) \ + && is_inquote(s, tmp - s) == FALSE) break ; tmp++; } @@ -64,8 +76,13 @@ char **split_argv(char *readline) char *tmp; tmp = readline; - if (!readline || !*readline) + if (!readline) return (NULL); + if (!*readline) + { + free(readline); + return (NULL); + } argv = ft_calloc(__count_args(readline) + 1, sizeof(char *)); tmp_av = argv; while (*tmp) @@ -80,5 +97,6 @@ char **split_argv(char *readline) } } *tmp_av = NULL; + free(readline); return (argv); } diff --git a/src/parsing/split_cmd.c b/src/parsing/split_cmd.c deleted file mode 100644 index 5f3d61c..0000000 --- a/src/parsing/split_cmd.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* split_cmd.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: mmoussou argv = NULL; - cmd->cmd = NULL; - split = split_argv(cmd_av); - if (!split) - { - cmd->argv = NULL; - cmd->cmd = NULL; - return (cmd); - } - cmd->argv = split; - cmd->cmd = ft_strdup(*split); - if (!cmd->cmd) - return (cmd); - return (cmd); -} diff --git a/src/parsing/tokenizer/__get_argv.c b/src/parsing/tokenizer/__get_argv.c new file mode 100644 index 0000000..fdb7a9b --- /dev/null +++ b/src/parsing/tokenizer/__get_argv.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* __get_argv.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/06 14:30:31 by adjoly #+# #+# */ +/* Updated: 2024/08/06 15:24:51 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parsing.h" + +size_t __get_size_argv(char **content) +{ + size_t size; + + size = 0; + while (content && *content) + { + if (__to_redir_sign(*content) != ERROR) + content++; + else + size++; + content++; + } + return (size); +} + +char **__get_argv(char **content) +{ + char **argv; + char **start; + + if (!content || !*content) + return (NULL); + argv = ft_calloc(sizeof(char *), __get_size_argv(content) + 1); + start = argv; + while (content && *content) + { + if (__to_redir_sign(*content) != ERROR) + { + content += 2; + free(*(content - 1)); + free(*(content - 2)); + } + else + { + *argv = *content; + argv++; + content++; + } + } + argv = NULL; + return (start); +} diff --git a/src/parsing/tokenizer/__to_redir_sign.c b/src/parsing/tokenizer/__get_fd.c similarity index 51% rename from src/parsing/tokenizer/__to_redir_sign.c rename to src/parsing/tokenizer/__get_fd.c index 662572f..4d63d64 100644 --- a/src/parsing/tokenizer/__to_redir_sign.c +++ b/src/parsing/tokenizer/__get_fd.c @@ -1,26 +1,41 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* __to_redir_sign.c :+: :+: :+: */ +/* __get_fd.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2024/05/25 15:06:40 by adjoly #+# #+# */ -/* Updated: 2024/06/30 17:27:57 by adjoly ### ########.fr */ +/* Created: 2024/08/05 23:34:03 by adjoly #+# #+# */ +/* Updated: 2024/08/06 14:15:02 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "tokenizer.h" +#include "parsing.h" +#include -t_redir_sign __to_redir_sign(char *redir_sign) +void __get_fd(t_list *list, t_cmd *cmd) { - if (redir_sign[0] == '<' && redir_sign[1] != '<') - return (INFILE); - else if (redir_sign[0] == '<' && redir_sign[1] == '<') - return (HEREDOC); - else if (redir_sign[0] == '>' && redir_sign[1] == '>') - return (OUT_APPEND); - else if (redir_sign[0] == '>' && redir_sign[1] != '>') - return (OUTFILE); - return (0); + t_redir *redir; + + cmd->infile = STDIN_FILENO; + cmd->outfile = STDOUT_FILENO; + if (!list) + return ; + while (list) + { + redir = list->content; + if (redir->sign < 2) + { + if (cmd->infile > 1) + close (cmd->infile); + cmd->infile = redir->fd; + } + else if (redir->sign >= 2) + { + if (cmd->outfile > 1) + close (cmd->outfile); + cmd->outfile = redir->fd; + } + list = list->next; + } } diff --git a/src/parsing/tokenizer/__open_redir.c b/src/parsing/tokenizer/__open_redir.c new file mode 100644 index 0000000..cc2a3df --- /dev/null +++ b/src/parsing/tokenizer/__open_redir.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* __open_redir.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/05 23:31:09 by adjoly #+# #+# */ +/* Updated: 2024/08/06 15:29:13 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parsing.h" +#include "execution.h" +#include + +t_redir_sign __to_redir_sign(char *redir_sign) +{ + if (!redir_sign || !*redir_sign) + return (ERROR); + else if (!(*redir_sign == '<' || *redir_sign == '>')) + return (ERROR); + else if (*redir_sign == '<' && !*(redir_sign + 1)) + return (INFILE); + else if (*redir_sign == '<' && *(redir_sign + 1) == '<' \ + && !*(redir_sign + 2)) + return (HEREDOC); + else if (*redir_sign == '>' && !*(redir_sign + 1)) + return (OUTFILE); + else if (*redir_sign == '>' && *(redir_sign + 1) == '>' \ + && !*(redir_sign + 2)) + return (OUT_APPEND); + return (ERROR); +} + +t_redir *__open_heredoc(char *filename) +{ + int fd; + t_redir *redir; + + if (!filename && !*filename) + return (NULL); + fd = ft_heredoc(filename); + redir = ft_calloc(sizeof(t_redir), 1); + if (!redir) + { + if (fd != -1) + close(fd); + return (NULL); + } + redir->fd = fd; + if (fd == -2) + redir->sign = ERROR; + else + redir->sign = HEREDOC; + return (redir); +} + +t_redir *__to_redir(char *filename, t_redir_sign sign) +{ + t_redir *redir; + int fd; + + if (!filename && !*filename) + return (NULL); + fd = -1; + if (sign == INFILE) + fd = open(filename, O_RDONLY); + else if (sign == OUTFILE) + fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, 0644); + else if (sign == OUT_APPEND) + fd = open(filename, O_CREAT | O_APPEND | O_WRONLY, 0644); + redir = ft_calloc(sizeof(t_redir), 1); + if (!redir) + { + if (fd != 1) + close(fd); + return (NULL); + } + redir->fd = fd; + redir->sign = sign; + return (redir); +} diff --git a/src/parsing/tokenizer/__to_cmd.c b/src/parsing/tokenizer/__to_cmd.c new file mode 100644 index 0000000..63ffcd8 --- /dev/null +++ b/src/parsing/tokenizer/__to_cmd.c @@ -0,0 +1,88 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* __to_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/08/05 14:19:35 by adjoly #+# #+# */ +/* Updated: 2024/08/06 17:25:14 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void printcmd(t_cmd *cmd){ + printf("in = %d\n", cmd->infile); + printf("out = %d\n", cmd->outfile); + printf("cmd = %s\n", cmd->cmd); + char **tmp = cmd->argv; + while (tmp && *tmp) + { + printf("argv = %s\n", *tmp); + tmp++; + } +} + +t_list *__get_redir(char **content) +{ + t_list *list; + t_redir_sign sign; + t_list *tmp; + + list = NULL; + while (content && *content) + { + sign = __to_redir_sign(*content); + if (sign == HEREDOC) + { + tmp = ft_lstnew(__open_heredoc(*(content + 1))); + ft_lstadd_back(&list, tmp); + if (((t_redir *)(tmp->content))->sign == ERROR) + { + ft_lstclear(&list, free_redir); + return (NULL); + } + } + else if (sign != ERROR) + ft_lstadd_back(&list, ft_lstnew(__to_redir(*(content + 1), sign))); + content++; + } + return (list); +} + +void *clear_all_cmd(char **content, t_list *redir) +{ + ft_lstclear(&redir, free_redir); + ft_free("a", &content); + return (NULL); +} + +t_cmd *__to_cmd(char **content) +{ + t_list *redir; + t_cmd *cmd; + + if (!content) + return (NULL); + if (!*content) + { + free(content); + return (NULL); + } + format_quotes(content); + get_void(&content); + redir = __get_redir(content); + if (check_redir(redir)) + return (clear_all_cmd(content, redir)); + cmd = ft_calloc(sizeof(t_cmd), 1); + if (!cmd) + return (clear_all_cmd(content, redir)); + __get_fd(redir, cmd); + cmd->argv = __get_argv(content); + free(content); + cmd->cmd = ft_strdup(cmd->argv[0]); + ft_lstclear(&redir, free); + printcmd(cmd); + return (cmd); +} diff --git a/src/parsing/tokenizer/__to_redir.c b/src/parsing/tokenizer/__to_redir.c deleted file mode 100644 index c8bd28f..0000000 --- a/src/parsing/tokenizer/__to_redir.c +++ /dev/null @@ -1,50 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* __to_redir.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/05/25 15:06:15 by adjoly #+# #+# */ -/* Updated: 2024/08/04 12:53:17 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "tokenizer.h" -#include -#include "parsing.h" - -size_t __cpy_arg(char *dst, char *src); -size_t __get_len_arg(char *s); -char *format_quotes_string(char *cmd); - -char *__redir_filename_cpy(char *redir_s) -{ - char *tmp; - - tmp = ft_calloc(__get_len_arg(redir_s) + 1, sizeof(char)); - if (!tmp) - return (NULL); - __cpy_arg(tmp, redir_s); - tmp = format_quotes_string(tmp); - return (tmp); -} - -t_redirection *__to_redir(char *redir_s) -{ - t_redirection *redir; - - redir = ft_calloc(sizeof(t_redirection), 1); - if (!redir) - return (NULL); - redir->sign = __to_redir_sign(redir_s); - redir->file_name = NULL; - if (redir->sign == OUT_APPEND || redir->sign == HEREDOC) - redir_s += 2; - else - redir_s++; - while (*redir_s && ft_isspace(*redir_s)) - redir_s++; - redir->file_name = __redir_filename_cpy(redir_s); - return (redir); -} diff --git a/src/parsing/tokenizer/__to_token.c b/src/parsing/tokenizer/__to_token.c deleted file mode 100644 index 48ddcea..0000000 --- a/src/parsing/tokenizer/__to_token.c +++ /dev/null @@ -1,81 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* __to_token.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: adjoly +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2024/05/20 21:05:04 by adjoly #+# #+# */ -/* Updated: 2024/08/04 12:52:25 by adjoly ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "tokenizer.h" -#include "libft.h" -#include "parsing.h" -#include - -size_t __get_len_arg(char *s); - -bool check_argvcontent(char *argv) -{ - if (!argv) - return (false); - while (*argv && ft_isspace(*argv)) - argv++; - if (!*argv) - return (true); - return (false); -} - -size_t __get_sizeof_redir(char *redir_s, t_redirection *redir) -{ - size_t i; - char *tmp; - - if (!redir_s || !redir) - return (0); - else if (redir->sign == OUT_APPEND || redir->sign == HEREDOC) - i = 1; - else - i = 0; - if (!redir->file_name) - return (i); - tmp = redir_s + i; - while (*++tmp && ft_isspace(*tmp)) - i++; - i += __get_len_arg(tmp); - return (i); -} - -t_token *__to_token(char *cmd) -{ - t_token *token; - t_redirection *tmp_redir; - char *tmp; - - token = ft_calloc(sizeof(t_token), 1); - token->argv = NULL; - tmp = cmd; - while (*tmp) - { - if ((*tmp == '<' || *tmp == '>') && is_inquote(cmd, tmp - cmd) == FALSE) - { - tmp_redir = __to_redir(tmp); - ft_lstadd_back(&(token->redirection), ft_lstnew((void *)tmp_redir)); - tmp += __get_sizeof_redir(tmp, tmp_redir); - } - else - { - token->argv = ft_strjoin_free(token->argv, ft_substr(tmp, 0, 1)); - if (check_argvcontent(token->argv)) - { - free(token->argv); - token->argv = NULL; - } - } - - tmp++; - } - return (token); -} diff --git a/src/parsing/tokenizer/tokenizer.c b/src/parsing/tokenizer/tokenizer.c index 038244c..5389c7a 100644 --- a/src/parsing/tokenizer/tokenizer.c +++ b/src/parsing/tokenizer/tokenizer.c @@ -6,28 +6,42 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/18 20:13:50 by adjoly #+# #+# */ -/* Updated: 2024/08/04 16:16:59 by adjoly ### ########.fr */ +/* Updated: 2024/08/06 17:05:44 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "tokenizer.h" #include "parsing.h" +#include "minishell.h" #include -t_list *tokenizer(char *readline) +void *clear_all(t_list *cmd, t_list *piped) { - t_list *token; + ft_lstclear(&cmd, free); + ft_lstclear(&piped, free); + return (NULL); +} + +t_list *tokenizer(char *readline, t_env *env) +{ + t_list *cmd; t_list *piped; t_list *tmp; + (void)(env); piped = __split_pipe(readline); - token = NULL; + free(readline); + cmd = NULL; tmp = piped; + get_list(&piped); while (tmp) { - ft_lstadd_back(&token, ft_lstnew((void *)__to_token(tmp->content))); + ft_lstadd_back(&cmd, + ft_lstnew(__to_cmd(split_argv(env_var_replace(tmp->content, + env))))); + if (!ft_lstlast(cmd)->content) + return (clear_all(cmd, piped)); tmp = tmp->next; } ft_lstclear(&piped, free); - return (token); + return (cmd); } diff --git a/src/utils/free_list.c b/src/utils/free_list.c index a59593c..00cfaca 100644 --- a/src/utils/free_list.c +++ b/src/utils/free_list.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/04 20:10:35 by adjoly #+# #+# */ -/* Updated: 2024/08/04 16:58:07 by adjoly ### ########.fr */ +/* Updated: 2024/08/05 23:27:57 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,26 +15,14 @@ void free_redir(void *redir_v) { - t_redirection *redir; + t_redir *redir; redir = redir_v; - free(redir->file_name); + if (redir->fd > 1) + close (redir->fd); free(redir); } -void free_token(void *token_v) -{ - t_token *token; - - token = token_v; - if (token->argv) - free(token->argv); - if (token->redirection) - ft_lstclear(&(token->redirection), free_redir); - if (token) - free(token); -} - void free_cmd(void *content) { t_cmd *cmd; diff --git a/src/utils/get_to_free.c b/src/utils/get_to_free.c index 980766e..ebb0b89 100644 --- a/src/utils/get_to_free.c +++ b/src/utils/get_to_free.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/09 17:24:15 by adjoly #+# #+# */ -/* Updated: 2024/07/18 14:15:18 by adjoly ### ########.fr */ +/* Updated: 2024/08/05 23:11:27 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,12 +31,12 @@ t_list **get_list(t_list **list) return (ret); } -t_list **get_list2(t_list **list) +void *get_void(void *in) { - static t_list **ret; + static void *ret; - if (list) - ret = list; + if (in) + ret = in; return (ret); }