diff --git a/Makefile b/Makefile index 7c8878a..9108b49 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ # **************************************************************************** # # # -# :::::::: # -# Makefile :+: :+: # -# +:+ # -# By: qmennen +#+ # -# +#+ # -# Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/08 17:13:50 by willem ######## odam.nl # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: qmennen +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/15 11:48:46 by whaffman #+# #+# # +# Updated: 2025/02/11 15:06:22 by qmennen ### ########.fr # # # # **************************************************************************** # diff --git a/inc/parser.h b/inc/parser.h index 74afc75..5c581fa 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/11 14:03:03 by qmennen #+# #+# */ -/* Updated: 2025/02/11 14:03:36 by qmennen ### ########.fr */ +/* Updated: 2025/02/11 16:25:16 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,4 +15,8 @@ #include "minishell.h" +t_command *parser_command_new(char *cmd); +char **parser_get_arguments(t_list *list); +t_list *parser_get_commands(t_list *list); + #endif diff --git a/inc/typedef.h b/inc/typedef.h index d784297..3ce6c38 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -55,7 +55,7 @@ typedef struct s_command typedef struct s_minishell { - t_list *environment; + t_list *environment; char *line; t_lexer *lexer; t_list *tokens; diff --git a/inc/utils.h b/inc/utils.h index 4a8066a..d374f75 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -15,6 +15,7 @@ void free_minishell_line(t_minishell *minishell); void free_minishell(t_minishell *minishell); +void free_command_list(void *content); t_minishell *init_minishell(void); void print_banner(void); void print_list(void *content); diff --git a/src/main.c b/src/main.c index 42e926c..78283e8 100644 --- a/src/main.c +++ b/src/main.c @@ -12,10 +12,10 @@ #include "minishell.h" - int main(int argc, char **argv, char **envp) { t_minishell *minishell; + t_list *commands; (void)argc; (void)argv; @@ -28,9 +28,11 @@ int main(int argc, char **argv, char **envp) minishell->line = ft_prompt(minishell); minishell->lexer = ft_lexer_new(minishell->line); minishell->tokens = ft_parse_input(minishell->lexer); + commands = parser_get_commands(minishell->tokens); simple_builtins(minishell); - ft_lstiter(minishell->tokens, print_list); + //ft_lstiter(minishell->tokens, print_list); free_minishell_line(minishell); + ft_lstclear(&commands, free_command_list); } free_minishell(minishell); return (EXIT_SUCCESS); diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c new file mode 100644 index 0000000..8fa4fa8 --- /dev/null +++ b/src/parser/parser_get_arguments.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_get_arguments.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ +/* Updated: 2025/02/11 16:26:41 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int count_cmds(t_list *list) +{ + int cmds; + t_list *current; + + cmds = 0; + current = list; + while (current) + { + if (((t_token *)current->content)->type != T_WORD) + break ; + cmds++; + current = current->next; + } + return (cmds - 1); +} + +char **parser_get_arguments(t_list *list) +{ + t_list *current; + char **args; + int cmds; + int i; + + cmds = count_cmds(list); + args = malloc((cmds + 1) * sizeof(char *)); + if (!args) + { + perror("malloc"); + exit(EXIT_FAILURE); + } + current = list->next; + i = -1; + while ((++i) < cmds && current) + { + if (((t_token *)current->content)->type == T_WORD) + args[i] = ft_strdup(((t_token *)current->content)->value); + current = current->next; + } + args[i] = 0; + return (args); +} diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c new file mode 100644 index 0000000..6e9fab9 --- /dev/null +++ b/src/parser/parser_get_commands.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_get_commands.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ +/* Updated: 2025/02/11 16:25:36 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static void print_cmds(void *content) +{ + t_command *cmd; + int i; + + cmd = (t_command *)content; + printf("cmd: %s\n", cmd->command); + printf("args: "); + i = 0; + while (cmd->args[i]) + { + printf("%s ", cmd->args[i]); + i++; + } + printf("\n"); +} + +t_list *parser_get_commands(t_list *list) +{ + t_list *command_list; + t_list *current; + t_command *command; + t_token *token; + + command_list = NULL; + if (!list) + return (NULL); + current = list; + while (current) + { + token = (t_token *) current->content; + command = parser_command_new(ft_strdup(token->value)); + command->args = parser_get_arguments(current); + ft_lstadd_back(&command_list, ft_lstnew(command)); + while (current && ((t_token *)current->content)->type == T_WORD) + current = current->next; + if (current && ((t_token *)current->content)->type != T_WORD) + current = current->next; + } + ft_lstiter(command_list, print_cmds); + return (command_list); +} diff --git a/src/parser/parser.c b/src/parser/parser_new_command.c similarity index 57% rename from src/parser/parser.c rename to src/parser/parser_new_command.c index 8936ec4..d2780a7 100644 --- a/src/parser/parser.c +++ b/src/parser/parser_new_command.c @@ -1,13 +1,30 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* parser.c :+: :+: :+: */ +/* parser_new_command.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ -/* Updated: 2025/02/11 14:06:06 by qmennen ### ########.fr */ +/* Created: 2025/02/11 16:18:21 by qmennen #+# #+# */ +/* Updated: 2025/02/11 16:25:12 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -#include "parser.h" +#include "minishell.h" + +t_command *parser_command_new(char *cmd) +{ + t_command *command; + + command = malloc(sizeof(t_command)); + if (!command) + { + perror("minishell malloc error"); + exit(EXIT_FAILURE); + } + command->args = NULL; + command->fd_in = 0; + command->fd_out = 1; + command->command = cmd; + return (command); +} diff --git a/src/utils/free_command_list.c b/src/utils/free_command_list.c new file mode 100644 index 0000000..684f713 --- /dev/null +++ b/src/utils/free_command_list.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* free_command_list.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/11 14:24:05 by qmennen #+# #+# */ +/* Updated: 2025/02/11 14:27:02 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static void free_args(char **args) +{ + int i; + + i = 0; + while (args[i]) + { + free(args[i]); + i++; + } + free(args); +} + +void free_command_list(void *content) +{ + t_command *command; + + command = (t_command *)content; + if (command->command) + free(command->command); + if (command->args) + free_args(command->args); + free(command); +} diff --git a/src/utils/print_banner.c b/src/utils/print_banner.c index 01948ce..7914508 100644 --- a/src/utils/print_banner.c +++ b/src/utils/print_banner.c @@ -14,22 +14,6 @@ void print_banner(void) { - /* - printf("%s\n", RED "\n" - "▒▒▓▓███████████████████████████████████████████████████████████████████████████████████████████████████████████▓▓▒▒\n\n" - GREEN - -" ░▒▓██████████████▓▒░░▒▓█▓▒░▒▓███████▓▒░░▒▓█▓▒░░▒▓███████▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓████████▓▒░▒▓█▓▒░ ░▒▓█▓▒░ \n" -" ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ \n" -" ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ \n" -" ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓██████▓▒░░▒▓████████▓▒░▒▓██████▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ \n" -" ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ \n" -" ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ \n" -" ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓███████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓████████▓▒░▒▓████████▓▒░▒▓████████▓▒░ \n\n" - RED - "▒▒▓▓███████████████████████████████████████████████████████████████████████████████████████████████████████████▓▓▒▒\n\n" - RESET); - */ printf("%s\n", "\033[2J\033[1;1H" GREEN " • • ┓ ┓┓\n" diff --git a/src/utils/simple_builtins.c b/src/utils/simple_builtins.c index 80007a4..5fa3c7c 100644 --- a/src/utils/simple_builtins.c +++ b/src/utils/simple_builtins.c @@ -83,6 +83,8 @@ void fork_execve(t_minishell *minishell, char *path, char **argv) void simple_builtins(t_minishell *minishell) { char *path; + if (!minishell->tokens) + return ; if (cmp_value(minishell->tokens, "clear")) printf("\033[2J\033[1;1H"); else if (cmp_value(minishell->tokens, "env"))