From a1b064fdfce24fe4e196dad1b336a804f494f284 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 12 Feb 2025 13:00:51 +0100 Subject: [PATCH 001/103] fixed many malloc in prompt, chaged name history, added command to front of arg list so that its argv[0] --- inc/minishell.h | 3 +- inc/prompt.h | 6 +- src/main.c | 6 +- src/parser/parser_get_arguments.c | 18 ++-- .../{ft_load_history.c => history_load.c} | 6 +- .../{ft_write_history.c => history_write.c} | 7 +- src/prompt/prompt.c | 93 +++++++++++++------ src/utils/simple_builtins.c | 2 +- 8 files changed, 90 insertions(+), 51 deletions(-) rename src/prompt/{ft_load_history.c => history_load.c} (87%) rename src/prompt/{ft_write_history.c => history_write.c} (84%) diff --git a/inc/minishell.h b/inc/minishell.h index d67e2fe..7c820b9 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:13 by whaffman #+# #+# */ -/* Updated: 2025/02/11 15:50:21 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 10:59:38 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -38,5 +38,6 @@ # define CYAN "\001\033[0;36m\002" # define RESET "\001\033[0m\002" # define PROMPT RESET "🐚" GREEN "minishell" RESET ": " +# define PROMPT_LEN 51 #endif diff --git a/inc/prompt.h b/inc/prompt.h index 155de23..3ed41c4 100644 --- a/inc/prompt.h +++ b/inc/prompt.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:35:35 by whaffman #+# #+# */ -/* Updated: 2025/02/05 17:05:32 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:54:01 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ void print_banner(void); char *ft_prompt(t_minishell *minishell); -void ft_write_history(char *line); -void ft_load_history(void); +void history_write(char *line); +void history_load(void); #endif // PROMPT_H diff --git a/src/main.c b/src/main.c index 5944a3f..6a1a2b4 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ -/* Updated: 2025/02/08 14:09:11 by willem ######## odam.nl */ +/* Updated: 2025/02/12 12:54:01 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ int main(int argc, char **argv, char **envp) (void)argc; (void)argv; print_banner(); - ft_load_history(); + history_load(); minishell = init_minishell(); environment_parse(envp, &(minishell->environment)); while (TRUE) @@ -38,7 +38,7 @@ int main(int argc, char **argv, char **envp) minishell->lexer = ft_lexer_new(minishell->line); minishell->tokens = ft_parse_input(minishell->lexer); ft_lstiter(minishell->tokens, token_print); - // minishell->commands = parser_get_commands(minishell->tokens); + minishell->commands = parser_get_commands(minishell->tokens); simple_builtins(minishell); free_minishell_line(minishell); ft_lstclear(&minishell->commands, free_command_list); diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index 8fa4fa8..2b428ce 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* 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 */ +/* :::::::: */ +/* parser_get_arguments.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ +/* Updated: 2025/02/12 12:58:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -26,7 +26,7 @@ static int count_cmds(t_list *list) cmds++; current = current->next; } - return (cmds - 1); + return (cmds); } char **parser_get_arguments(t_list *list) @@ -43,7 +43,7 @@ char **parser_get_arguments(t_list *list) perror("malloc"); exit(EXIT_FAILURE); } - current = list->next; + current = list; i = -1; while ((++i) < cmds && current) { diff --git a/src/prompt/ft_load_history.c b/src/prompt/history_load.c similarity index 87% rename from src/prompt/ft_load_history.c rename to src/prompt/history_load.c index cd1816e..2094bec 100644 --- a/src/prompt/ft_load_history.c +++ b/src/prompt/history_load.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* ft_load_history.c :+: :+: */ +/* history_load.c :+: :+: */ /* +:+ */ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:44:51 by whaffman #+# #+# */ -/* Updated: 2025/02/05 17:11:59 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:54:04 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_load_history(void) +void history_load(void) { int fd; char *line; diff --git a/src/prompt/ft_write_history.c b/src/prompt/history_write.c similarity index 84% rename from src/prompt/ft_write_history.c rename to src/prompt/history_write.c index 38f9901..86caf61 100644 --- a/src/prompt/ft_write_history.c +++ b/src/prompt/history_write.c @@ -1,21 +1,22 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* ft_write_history.c :+: :+: */ +/* history_write.c :+: :+: */ /* +:+ */ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 17:12:17 by whaffman #+# #+# */ -/* Updated: 2025/02/05 17:12:23 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:53:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_write_history(char *line) +void history_write(char *line) { int fd; + add_history(line); fd = open(".minishell_history", O_WRONLY | O_APPEND | O_CREAT, 0644); if (fd < 0) return ; diff --git a/src/prompt/prompt.c b/src/prompt/prompt.c index 26a5fbe..81b9293 100644 --- a/src/prompt/prompt.c +++ b/src/prompt/prompt.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ -/* Updated: 2025/02/11 16:06:17 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:53:38 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ char *get_user(t_list *environment) username = (char *)guest; else username = user->value; - len = ft_strlen(username) + ft_strlen(PROMPT) + ft_strlen(GREEN) + 1; + len = ft_strlen(username) + ft_strlen(PROMPT GREEN) + 1; result = (char *)malloc(len); if (result == NULL) { @@ -38,30 +38,65 @@ char *get_user(t_list *environment) return (result); } -char *get_path(t_list *environment) +int get_home_len(char *cwd, t_list *environment) { - char *home; - char *temp; - char *cwd; + t_environment *home; + int home_len; + + home = environment_get(environment, "HOME"); + home_len = 0; + if (home && !ft_strncmp(cwd, home->value, ft_strlen(home->value))) + home_len = ft_strlen(home->value) - 1; + return (home_len); +} + +char *get_path_with_home(t_list *environment) +{ + char *result; + char *cwd; + int len; + int home_len; cwd = getcwd(NULL, 0); - home = environment_get(environment, "HOME")->value; if (cwd == NULL) + return (perror("getcwd"), NULL); + home_len = get_home_len(cwd, environment); + len = ft_strlen(cwd) - home_len + 1; + result = malloc(len); + if (result == NULL) + return (free(cwd), NULL); + if (home_len) { - perror("getcwd"); - return (NULL); + ft_strlcpy(result, "~", 2); + ft_strlcat(result, cwd + home_len + 1, len); } - if (home && ft_strncmp(cwd, home, ft_strlen(home)) == 0) - { - temp = ft_strjoin("~", cwd + ft_strlen(home)); - free(cwd); - cwd = temp; - } - temp = ft_strjoin(BLUE, cwd); + else + ft_strlcpy(result, cwd, len); free(cwd); - cwd = ft_strjoin(temp, RESET); - free(temp); - return (cwd); + return (result); +} + +char *get_path(t_list *environment) +{ + char *result; + char *cwd; + int len; + + cwd = get_path_with_home(environment); + if (cwd == NULL) + return (NULL); + len = ft_strlen(cwd) + ft_strlen(BLUE RESET "> ") + 1; + result = malloc(len); + if (result == NULL) + { + perror("malloc"); + return (free(cwd), NULL); + } + ft_strlcpy(result, BLUE, len); + ft_strlcat(result, cwd, len); + ft_strlcat(result, RESET "> ", len); + free(cwd); + return (result); } char *ft_prompt(t_minishell *minishell) @@ -70,23 +105,25 @@ char *ft_prompt(t_minishell *minishell) char *cwd; char *prompt; char *user; - char *temp; cwd = get_path(minishell->environment); if (cwd == NULL) return (NULL); user = get_user(minishell->environment); - temp = ft_strjoin(user, cwd); + if (user == NULL) + return (free(cwd), NULL); + prompt = ft_strjoin(user, cwd); + if (prompt == NULL) + { + perror("malloc"); + return (free(cwd), free(user), NULL); + } free(user); free(cwd); - prompt = ft_strjoin(temp, "> "); - free(temp); line = readline(prompt); free(prompt); - if (line != NULL) - { - add_history(line); - ft_write_history(line); - } + if (line == NULL) + return (NULL); + history_write(line); return (line); } diff --git a/src/utils/simple_builtins.c b/src/utils/simple_builtins.c index 11169fb..e50b454 100644 --- a/src/utils/simple_builtins.c +++ b/src/utils/simple_builtins.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:21:39 by whaffman #+# #+# */ -/* Updated: 2025/02/11 17:11:16 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 12:52:30 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ From 662343a6efafd78dc81018e9078944868f68ba3c Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 12 Feb 2025 14:25:54 +0100 Subject: [PATCH 002/103] created pipetester program --- pipetester.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 pipetester.c diff --git a/pipetester.c b/pipetester.c new file mode 100644 index 0000000..833d61e --- /dev/null +++ b/pipetester.c @@ -0,0 +1,61 @@ + +#include +#include +#include +#include + +void error(char *msg) +{ + write(2, msg, strlen(msg)); +} + +int main(void) +{ + int fd_in = STDIN_FILENO; + int fd_out = STDOUT_FILENO; + struct stat statbuf_in; + struct stat statbuf_out; + + if (fstat(fd_in, &statbuf_in) == -1) + { + perror("fstat"); + return (1); + } + error("STDIN File type: "); + + switch (statbuf_in.st_mode & S_IFMT) { + case S_IFBLK: error("block device\n"); break; + case S_IFCHR: error("character device\n"); break; + case S_IFDIR: error("directory\n"); break; + case S_IFIFO: error("FIFO/pipe\n"); break; + case S_IFLNK: error("symlink\n"); break; + case S_IFREG: error("regular file\n"); break; + case S_IFSOCK: error("socket\n"); break; + default: error("unknown?\n"); break; + } + + + error("\n"); + + if (fstat(fd_out, &statbuf_out) == -1) + { + perror("fstat"); + return (1); + } + +error("STDOUT File type: "); + + switch (statbuf_out.st_mode & S_IFMT) { + case S_IFBLK: error("block device\n"); break; + case S_IFCHR: error("character device\n"); break; + case S_IFDIR: error("directory\n"); break; + case S_IFIFO: error("FIFO/pipe\n"); break; + case S_IFLNK: error("symlink\n"); break; + case S_IFREG: error("regular file\n"); break; + case S_IFSOCK: error("socket\n"); break; + default: error("unknown?\n"); break; + } + + + return (0); +} From b1963770664f50a41e507d8f6f27c70b0089937c Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 12 Feb 2025 19:14:05 +0100 Subject: [PATCH 003/103] add executor_fork and executor_child --- inc/typedef.h | 3 +- src/executor/executor.c | 62 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/executor/executor.c diff --git a/inc/typedef.h b/inc/typedef.h index 6b6a6f2..e5372e5 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/05 15:25:40 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 18:47:30 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -50,6 +50,7 @@ typedef struct s_command { char *command; char **args; + char **environment; int fd_in; int fd_out; } t_command; diff --git a/src/executor/executor.c b/src/executor/executor.c new file mode 100644 index 0000000..fe28b48 --- /dev/null +++ b/src/executor/executor.c @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* executor.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/12 18:45:50 by willem #+# #+# */ +/* Updated: 2025/02/12 18:45:51 by willem ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void executor_child(t_command *command) +{ + if (command->fd_in != 0) + { + dup2(command->fd_in, 0); + close(command->fd_in); + } + if (command->fd_out != 1) + { + dup2(command->fd_out, 1); + close(command->fd_out); + } + execve(command->command, command->args, command->environment); +} + +int executor_fork(t_command *command) +{ + pid_t pid; + int status; + + pid = fork(); + if (pid > 0) + { + waitpid(pid, &status, 0); + return (((status) & 0xff00) >> 8); + } + else if (pid == 0) + executor_child(command); + else + perror("fork"); + return (EXIT_FAILURE); +} + +int main(int argc, char **argv, char **envp) +{ + t_minishell minishell; + t_command command; + + + command.command = "/bin/ls"; + command.args = (char *[]){"ls", "-l", NULL}; + command.environment = envp; + command.fd_in = 0; + command.fd_out = 1; + + printf("exit status: %d\n", executor_fork(&command)); + return (0); +} \ No newline at end of file From 68efadf4ac97a94883d73e87672f2df6d15a672b Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 12 Feb 2025 20:52:49 +0100 Subject: [PATCH 004/103] feat: made an executer and commented print functions out for show --- inc/executor.h | 9 ++- inc/typedef.h | 5 +- src/executor/executor.c | 101 +++++++++++++++++++++++++------ src/main.c | 16 ++--- src/parser/parser_get_commands.c | 46 +++++++------- src/utils/simple_builtins.c | 13 +--- 6 files changed, 127 insertions(+), 63 deletions(-) diff --git a/inc/executor.h b/inc/executor.h index 1c256de..9331b8c 100644 --- a/inc/executor.h +++ b/inc/executor.h @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:06:07 by willem #+# #+# */ -/* Updated: 2025/02/11 17:06:54 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 20:24:20 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -16,5 +16,12 @@ # include "minishell.h" char *executor_absolute_path(t_list *env, char *cmd); +void executor_child(t_command *command); +int executor_fork(t_command *command); +void executor_create_pipes(t_minishell *minishell); +void executor_execute_pipeline(t_minishell *minishell); + + + #endif // EXECUTOR_H diff --git a/inc/typedef.h b/inc/typedef.h index e5372e5..601c08a 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/12 18:47:30 by willem ######## odam.nl */ +/* Updated: 2025/02/12 20:35:09 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -50,9 +50,10 @@ typedef struct s_command { char *command; char **args; - char **environment; + t_list *environment; int fd_in; int fd_out; + int n_pipes; } t_command; typedef struct s_minishell diff --git a/src/executor/executor.c b/src/executor/executor.c index fe28b48..d2cc485 100644 --- a/src/executor/executor.c +++ b/src/executor/executor.c @@ -12,19 +12,28 @@ #include "minishell.h" +void executor_close_pipes(int n_pipes) +{ + int i; + + i = 3; + while (i < n_pipes + 3) + { + close(i); + i++; + } +} + void executor_child(t_command *command) { + char *path; if (command->fd_in != 0) - { dup2(command->fd_in, 0); - close(command->fd_in); - } if (command->fd_out != 1) - { dup2(command->fd_out, 1); - close(command->fd_out); - } - execve(command->command, command->args, command->environment); + executor_close_pipes(command->n_pipes); + path = executor_absolute_path(command->environment, command->command); + execve(path, command->args, environment_get_arr(command->environment)); } int executor_fork(t_command *command) @@ -35,6 +44,10 @@ int executor_fork(t_command *command) pid = fork(); if (pid > 0) { + if(command->fd_in != 0) + close(command->fd_in); + if(command->fd_out != 1) + close(command->fd_out); waitpid(pid, &status, 0); return (((status) & 0xff00) >> 8); } @@ -45,18 +58,70 @@ int executor_fork(t_command *command) return (EXIT_FAILURE); } -int main(int argc, char **argv, char **envp) +void executer_create_pipes(t_minishell *minishell) { - t_minishell minishell; - t_command command; + t_list *current; + t_command *command; + int fd[2]; + int fd_in; + - command.command = "/bin/ls"; - command.args = (char *[]){"ls", "-l", NULL}; - command.environment = envp; - command.fd_in = 0; - command.fd_out = 1; + fd_in = 0; + current = minishell->commands; + while (current) + { + command = (t_command *)current->content; + if (current->next) + { + pipe(fd); + command->fd_out = fd[1]; + } + else + command->fd_out = 1; + command->fd_in = fd_in; + command->n_pipes = (ft_lstsize(minishell->commands) - 1) * 2; + fd_in = fd[0]; + current = current->next; + } +} +void executor_execute_pipeline(t_minishell *minishell) +{ + t_list *current; + t_command *command; - printf("exit status: %d\n", executor_fork(&command)); - return (0); -} \ No newline at end of file + executer_create_pipes(minishell); + current = minishell->commands; + while (current) + { + command = (t_command *)current->content; + command->environment = minishell->environment; + executor_fork(command); + current = current->next; + } +} + +// int main(int argc, char **argv, char **envp) +// { +// t_minishell minishell; +// t_command command[3]; + +// minishell.commands = ft_lstnew(&command[0]); +// ft_lstadd_back(&minishell.commands, ft_lstnew(&command[1])); +// ft_lstadd_back(&minishell.commands, ft_lstnew(&command[2])); + +// command[0].command = "/bin/ls"; +// command[0].args = (char *[]){"ls", "-l", NULL}; +// command[0].environment = envp; + +// command[1].command = "/usr/bin/grep"; +// command[1].args = (char *[]){"grep", "src", NULL}; +// command[1].environment = envp; + +// command[2].command = "/usr/bin/wc"; +// command[2].args = (char *[]){"wc", "-l", NULL}; +// command[2].environment = envp; + +// executor_execute_pipeline(&minishell); +// return (0); +// } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 6a1a2b4..44b4751 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ -/* Updated: 2025/02/12 12:54:01 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 20:46:11 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,13 +14,13 @@ #include "minishell.h" #include "utils.h" -static void token_print(void *param) -{ - t_token *token; +// static void token_print(void *param) +// { +// t_token *token; - token = (t_token *)param; - printf("token type %i, value %s\n", token->type, token->value); -} +// token = (t_token *)param; +// printf("token type %i, value %s\n", token->type, token->value); +// } int main(int argc, char **argv, char **envp) { @@ -37,7 +37,7 @@ 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); - ft_lstiter(minishell->tokens, token_print); + //ft_lstiter(minishell->tokens, token_print); minishell->commands = parser_get_commands(minishell->tokens); simple_builtins(minishell); free_minishell_line(minishell); diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 6e9fab9..786e143 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -1,33 +1,33 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* 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 */ +/* :::::::: */ +/* parser_get_commands.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ +/* Updated: 2025/02/12 20:49:00 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -static void print_cmds(void *content) -{ - t_command *cmd; - int i; +// 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"); -} +// 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) { @@ -51,6 +51,6 @@ t_list *parser_get_commands(t_list *list) if (current && ((t_token *)current->content)->type != T_WORD) current = current->next; } - ft_lstiter(command_list, print_cmds); + //ft_lstiter(command_list, print_cmds); return (command_list); } diff --git a/src/utils/simple_builtins.c b/src/utils/simple_builtins.c index e50b454..d197f8e 100644 --- a/src/utils/simple_builtins.c +++ b/src/utils/simple_builtins.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:21:39 by whaffman #+# #+# */ -/* Updated: 2025/02/12 12:52:30 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 20:25:23 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -81,8 +81,6 @@ 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")) @@ -100,13 +98,6 @@ void simple_builtins(t_minishell *minishell) environment_del(&(minishell->environment), ((t_token *)minishell->tokens->next->content)->value); else { - path = executor_absolute_path(minishell->environment, ((t_token *)minishell->tokens->content)->value); - if (path == NULL) - printf("minishell: %s: command not found\n", ((t_token *)minishell->tokens->content)->value); - else - { - printf("found excutable: %s\n", path); - fork_execve(minishell, path, ft_split(((t_token *)minishell->tokens->content)->value, ' ')); - } + executor_execute_pipeline(minishell); } } From c02e19bfc87dcdde5eeabf88eb74985384ed5c22 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 12 Feb 2025 21:30:04 +0100 Subject: [PATCH 005/103] split executor in files --- src/executor/executer_create_pipes.c | 41 ++++++++ src/executor/executor.c | 127 ----------------------- src/executor/executor_child.c | 25 +++++ src/executor/executor_close_pipes.c | 11 ++ src/executor/executor_execute_pipeline.c | 29 ++++++ src/executor/executor_fork.c | 35 +++++++ 6 files changed, 141 insertions(+), 127 deletions(-) create mode 100644 src/executor/executer_create_pipes.c delete mode 100644 src/executor/executor.c create mode 100644 src/executor/executor_child.c create mode 100644 src/executor/executor_close_pipes.c create mode 100644 src/executor/executor_execute_pipeline.c create mode 100644 src/executor/executor_fork.c diff --git a/src/executor/executer_create_pipes.c b/src/executor/executer_create_pipes.c new file mode 100644 index 0000000..c7dae9f --- /dev/null +++ b/src/executor/executer_create_pipes.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* executer_create_pipes.c :+: :+: */ +/* +:+ */ +/* By: willem +#+ */ +/* +#+ */ +/* Created: 2025/02/12 21:25:22 by willem #+# #+# */ +/* Updated: 2025/02/12 21:25:23 by willem ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void executer_create_pipes(t_minishell *minishell) +{ + t_list *current; + t_command *command; + int fd[2]; + int fd_in; + + + + fd_in = 0; + current = minishell->commands; + while (current) + { + command = (t_command *)current->content; + if (current->next) + { + pipe(fd); + command->fd_out = fd[1]; + } + else + command->fd_out = 1; + command->fd_in = fd_in; + command->n_pipes = (ft_lstsize(minishell->commands) - 1) * 2; + fd_in = fd[0]; + current = current->next; + } +} \ No newline at end of file diff --git a/src/executor/executor.c b/src/executor/executor.c deleted file mode 100644 index d2cc485..0000000 --- a/src/executor/executor.c +++ /dev/null @@ -1,127 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* executor.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/12 18:45:50 by willem #+# #+# */ -/* Updated: 2025/02/12 18:45:51 by willem ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -void executor_close_pipes(int n_pipes) -{ - int i; - - i = 3; - while (i < n_pipes + 3) - { - close(i); - i++; - } -} - -void executor_child(t_command *command) -{ - char *path; - if (command->fd_in != 0) - dup2(command->fd_in, 0); - if (command->fd_out != 1) - dup2(command->fd_out, 1); - executor_close_pipes(command->n_pipes); - path = executor_absolute_path(command->environment, command->command); - execve(path, command->args, environment_get_arr(command->environment)); -} - -int executor_fork(t_command *command) -{ - pid_t pid; - int status; - - pid = fork(); - if (pid > 0) - { - if(command->fd_in != 0) - close(command->fd_in); - if(command->fd_out != 1) - close(command->fd_out); - waitpid(pid, &status, 0); - return (((status) & 0xff00) >> 8); - } - else if (pid == 0) - executor_child(command); - else - perror("fork"); - return (EXIT_FAILURE); -} - -void executer_create_pipes(t_minishell *minishell) -{ - t_list *current; - t_command *command; - int fd[2]; - int fd_in; - - - - fd_in = 0; - current = minishell->commands; - while (current) - { - command = (t_command *)current->content; - if (current->next) - { - pipe(fd); - command->fd_out = fd[1]; - } - else - command->fd_out = 1; - command->fd_in = fd_in; - command->n_pipes = (ft_lstsize(minishell->commands) - 1) * 2; - fd_in = fd[0]; - current = current->next; - } -} -void executor_execute_pipeline(t_minishell *minishell) -{ - t_list *current; - t_command *command; - - executer_create_pipes(minishell); - current = minishell->commands; - while (current) - { - command = (t_command *)current->content; - command->environment = minishell->environment; - executor_fork(command); - current = current->next; - } -} - -// int main(int argc, char **argv, char **envp) -// { -// t_minishell minishell; -// t_command command[3]; - -// minishell.commands = ft_lstnew(&command[0]); -// ft_lstadd_back(&minishell.commands, ft_lstnew(&command[1])); -// ft_lstadd_back(&minishell.commands, ft_lstnew(&command[2])); - -// command[0].command = "/bin/ls"; -// command[0].args = (char *[]){"ls", "-l", NULL}; -// command[0].environment = envp; - -// command[1].command = "/usr/bin/grep"; -// command[1].args = (char *[]){"grep", "src", NULL}; -// command[1].environment = envp; - -// command[2].command = "/usr/bin/wc"; -// command[2].args = (char *[]){"wc", "-l", NULL}; -// command[2].environment = envp; - -// executor_execute_pipeline(&minishell); -// return (0); -// } \ No newline at end of file diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c new file mode 100644 index 0000000..7855161 --- /dev/null +++ b/src/executor/executor_child.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* executor_child.c :+: :+: */ +/* +:+ */ +/* By: willem +#+ */ +/* +#+ */ +/* Created: 2025/02/12 21:25:10 by willem #+# #+# */ +/* Updated: 2025/02/12 21:25:11 by willem ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void executor_child(t_command *command) +{ + char *path; + if (command->fd_in != 0) + dup2(command->fd_in, 0); + if (command->fd_out != 1) + dup2(command->fd_out, 1); + executor_close_pipes(command->n_pipes); + path = executor_absolute_path(command->environment, command->command); + execve(path, command->args, environment_get_arr(command->environment)); +} \ No newline at end of file diff --git a/src/executor/executor_close_pipes.c b/src/executor/executor_close_pipes.c new file mode 100644 index 0000000..3b172bd --- /dev/null +++ b/src/executor/executor_close_pipes.c @@ -0,0 +1,11 @@ +void executor_close_pipes(int n_pipes) +{ + int i; + + i = 3; + while (i < n_pipes + 3) + { + close(i); + i++; + } +} \ No newline at end of file diff --git a/src/executor/executor_execute_pipeline.c b/src/executor/executor_execute_pipeline.c new file mode 100644 index 0000000..bf4961a --- /dev/null +++ b/src/executor/executor_execute_pipeline.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* executor_execute_pipeline.c :+: :+: */ +/* +:+ */ +/* By: willem +#+ */ +/* +#+ */ +/* Created: 2025/02/12 21:25:02 by willem #+# #+# */ +/* Updated: 2025/02/12 21:25:03 by willem ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void executor_execute_pipeline(t_minishell *minishell) +{ + t_list *current; + t_command *command; + + executer_create_pipes(minishell); + current = minishell->commands; + while (current) + { + command = (t_command *)current->content; + command->environment = minishell->environment; + executor_fork(command); + current = current->next; + } +} \ No newline at end of file diff --git a/src/executor/executor_fork.c b/src/executor/executor_fork.c new file mode 100644 index 0000000..ad1cd69 --- /dev/null +++ b/src/executor/executor_fork.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* executor_fork.c :+: :+: */ +/* +:+ */ +/* By: willem +#+ */ +/* +#+ */ +/* Created: 2025/02/12 21:24:52 by willem #+# #+# */ +/* Updated: 2025/02/12 21:24:53 by willem ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int executor_fork(t_command *command) +{ + pid_t pid; + int status; + + pid = fork(); + if (pid > 0) + { + if(command->fd_in != 0) + close(command->fd_in); + if(command->fd_out != 1) + close(command->fd_out); + waitpid(pid, &status, 0); + return (((status) & 0xff00) >> 8); + } + else if (pid == 0) + executor_child(command); + else + perror("fork"); + return (EXIT_FAILURE); +} \ No newline at end of file From 3c04887ffbf4c7dfe7ec1b31e175a1ec6314ecac Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 12 Feb 2025 21:39:30 +0100 Subject: [PATCH 006/103] use environment_free if you can! --- src/environment/environment_add.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/environment/environment_add.c b/src/environment/environment_add.c index 03c9cc9..1f20b01 100644 --- a/src/environment/environment_add.c +++ b/src/environment/environment_add.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:33 by whaffman #+# #+# */ -/* Updated: 2025/02/11 17:15:45 by whaffman ######## odam.nl */ +/* Updated: 2025/02/12 21:33:20 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -29,9 +29,7 @@ void environment_add(t_list **environment, char *name, char *value) || new_environment->name == NULL || new_environment->value == NULL) { - free(new_environment->name); - free(new_environment->value); - free(new_environment); + environment_free(new_environment); return (perror("malloc")); } ft_lstadd_back(environment, new_node); From 0784d3cf04712c346800f2b6379566e13c6a1645 Mon Sep 17 00:00:00 2001 From: whaffman Date: Thu, 13 Feb 2025 15:05:17 +0100 Subject: [PATCH 007/103] fixed some norm --- .gitignore | 2 + README.md | 11 +- inc/executor.h | 4 +- inc/typedef.h | 5 +- pipetester.c | 118 ++++++++++++------ src/executor/executor_absolute_path.c | 2 +- src/executor/executor_child.c | 8 +- src/executor/executor_close_fds.c | 25 ++++ src/executor/executor_close_pipes.c | 11 -- ...create_pipes.c => executor_create_pipes.c} | 33 +++-- src/executor/executor_execute_pipeline.c | 10 +- src/executor/executor_fork.c | 14 +-- src/main.c | 16 +-- 13 files changed, 166 insertions(+), 93 deletions(-) create mode 100644 src/executor/executor_close_fds.c delete mode 100644 src/executor/executor_close_pipes.c rename src/executor/{executer_create_pipes.c => executor_create_pipes.c} (61%) diff --git a/.gitignore b/.gitignore index 293add1..2ec1726 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ a.out *.o obj/ .minishell_history +pipetester.c +pipetest diff --git a/README.md b/README.md index d6fecff..1ac6a5b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ A lot of amazing shell stuff -[x] Set environment variable (export) -[x] Simple builtin export - Preliminary signals -- Define struct for commands, something like ( +-[x] Define struct for commands, something like ( ```c typedef struct s_command { @@ -24,9 +24,16 @@ A lot of amazing shell stuff } t_command; ``` ) -- Make the `executor`, run a command +- [x] Make the `executor`, run a command - Make a parser to create a command list - Add redirects, appends, pipe etc. File descriptor functions + a command can have multiple redirects but only the last is used for stdout + Redirects take precedence over pipes, but pipes are still created and managed. + should it close the unused pipe-end? + all redirects are opened and closed, but only last fd is used. + multiple HEREDOCs can be nested, only last is used. + + - Expand \$ vars & support \$? - CB command to change banner - __Bonus:__ Command tree for &&, ||, * diff --git a/inc/executor.h b/inc/executor.h index 9331b8c..e6c145e 100644 --- a/inc/executor.h +++ b/inc/executor.h @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:06:07 by willem #+# #+# */ -/* Updated: 2025/02/12 20:24:20 by willem ######## odam.nl */ +/* Updated: 2025/02/13 14:57:13 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,6 +20,8 @@ void executor_child(t_command *command); int executor_fork(t_command *command); void executor_create_pipes(t_minishell *minishell); void executor_execute_pipeline(t_minishell *minishell); +void executor_close_fds(int n_fds); + diff --git a/inc/typedef.h b/inc/typedef.h index 601c08a..9039e04 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/12 20:35:09 by willem ######## odam.nl */ +/* Updated: 2025/02/13 14:27:07 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -53,7 +53,8 @@ typedef struct s_command t_list *environment; int fd_in; int fd_out; - int n_pipes; + int n_fds; + int exit_status; } t_command; typedef struct s_minishell diff --git a/pipetester.c b/pipetester.c index 833d61e..35409af 100644 --- a/pipetester.c +++ b/pipetester.c @@ -6,56 +6,94 @@ void error(char *msg) { - write(2, msg, strlen(msg)); + write(2, msg, strlen(msg)); } int main(void) { - int fd_in = STDIN_FILENO; - int fd_out = STDOUT_FILENO; - struct stat statbuf_in; - struct stat statbuf_out; + int fd_in = STDIN_FILENO; + int fd_out = STDOUT_FILENO; + struct stat statbuf_in; + struct stat statbuf_out; - if (fstat(fd_in, &statbuf_in) == -1) - { - perror("fstat"); - return (1); - } - error("STDIN File type: "); + char c; - switch (statbuf_in.st_mode & S_IFMT) { - case S_IFBLK: error("block device\n"); break; - case S_IFCHR: error("character device\n"); break; - case S_IFDIR: error("directory\n"); break; - case S_IFIFO: error("FIFO/pipe\n"); break; - case S_IFLNK: error("symlink\n"); break; - case S_IFREG: error("regular file\n"); break; - case S_IFSOCK: error("socket\n"); break; - default: error("unknown?\n"); break; + if (fstat(fd_in, &statbuf_in) == -1) + { + perror("fstat"); + return (1); + } + error("STDIN File type: "); + + switch (statbuf_in.st_mode & S_IFMT) + { + case S_IFBLK: + error("block device\n"); + break; + case S_IFCHR: + error("character device\n"); + break; + case S_IFDIR: + error("directory\n"); + break; + case S_IFIFO: + error("FIFO/pipe\n"); + break; + case S_IFLNK: + error("symlink\n"); + break; + case S_IFREG: + error("regular file\n"); + break; + case S_IFSOCK: + error("socket\n"); + break; + default: + error("unknown?\n"); + break; } + error("\n"); - error("\n"); - - if (fstat(fd_out, &statbuf_out) == -1) - { - perror("fstat"); - return (1); - } - -error("STDOUT File type: "); - - switch (statbuf_out.st_mode & S_IFMT) { - case S_IFBLK: error("block device\n"); break; - case S_IFCHR: error("character device\n"); break; - case S_IFDIR: error("directory\n"); break; - case S_IFIFO: error("FIFO/pipe\n"); break; - case S_IFLNK: error("symlink\n"); break; - case S_IFREG: error("regular file\n"); break; - case S_IFSOCK: error("socket\n"); break; - default: error("unknown?\n"); break; + if (fstat(fd_out, &statbuf_out) == -1) + { + perror("fstat"); + return (1); } + error("STDOUT File type: "); - return (0); + switch (statbuf_out.st_mode & S_IFMT) + { + case S_IFBLK: + error("block device\n"); + break; + case S_IFCHR: + error("character device\n"); + break; + case S_IFDIR: + error("directory\n"); + break; + case S_IFIFO: + error("FIFO/pipe\n"); + break; + case S_IFLNK: + error("symlink\n"); + break; + case S_IFREG: + error("regular file\n"); + break; + case S_IFSOCK: + error("socket\n"); + break; + default: + error("unknown?\n"); + break; + } + + while (read(fd_in, &c, 1) > 0) + { + write(fd_out, &c, 1); + } + return (0); } diff --git a/src/executor/executor_absolute_path.c b/src/executor/executor_absolute_path.c index 396dbb2..178d72a 100644 --- a/src/executor/executor_absolute_path.c +++ b/src/executor/executor_absolute_path.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:00:24 by willem #+# #+# */ -/* Updated: 2025/02/11 17:20:17 by whaffman ######## odam.nl */ +/* Updated: 2025/02/13 15:04:09 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 7855161..950b337 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,20 +6,20 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/12 21:25:11 by willem ######## odam.nl */ +/* Updated: 2025/02/13 15:04:12 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void executor_child(t_command *command) +void executor_child(t_command *command) { char *path; if (command->fd_in != 0) dup2(command->fd_in, 0); if (command->fd_out != 1) dup2(command->fd_out, 1); - executor_close_pipes(command->n_pipes); + executor_close_fds(command->n_fds); path = executor_absolute_path(command->environment, command->command); execve(path, command->args, environment_get_arr(command->environment)); -} \ No newline at end of file +} diff --git a/src/executor/executor_close_fds.c b/src/executor/executor_close_fds.c new file mode 100644 index 0000000..2c38dbc --- /dev/null +++ b/src/executor/executor_close_fds.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* executor_close_fds.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/13 13:31:25 by whaffman #+# #+# */ +/* Updated: 2025/02/13 15:04:15 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void executor_close_fds(int n_fds) +{ + int i; + + i = 3; + while (i < n_fds + 3) + { + close(i); + i++; + } +} diff --git a/src/executor/executor_close_pipes.c b/src/executor/executor_close_pipes.c deleted file mode 100644 index 3b172bd..0000000 --- a/src/executor/executor_close_pipes.c +++ /dev/null @@ -1,11 +0,0 @@ -void executor_close_pipes(int n_pipes) -{ - int i; - - i = 3; - while (i < n_pipes + 3) - { - close(i); - i++; - } -} \ No newline at end of file diff --git a/src/executor/executer_create_pipes.c b/src/executor/executor_create_pipes.c similarity index 61% rename from src/executor/executer_create_pipes.c rename to src/executor/executor_create_pipes.c index c7dae9f..d2306ac 100644 --- a/src/executor/executer_create_pipes.c +++ b/src/executor/executor_create_pipes.c @@ -1,26 +1,35 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* executer_create_pipes.c :+: :+: */ +/* executor_create_pipes.c :+: :+: */ /* +:+ */ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:22 by willem #+# #+# */ -/* Updated: 2025/02/12 21:25:23 by willem ######## odam.nl */ +/* Updated: 2025/02/13 14:58:49 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void executer_create_pipes(t_minishell *minishell) -{ - t_list *current; - t_command *command; - int fd[2]; - int fd_in; - +/** + * @brief Creates pipes for the executor in the minishell. + * + * This function sets up the necessary pipes for inter-process communication + * within the minishell. It initializes the pipes based on the requirements + * of the minishell structure. + * + * @param minishell A pointer to the t_minishell structure containing the + * necessary information for pipe creation. + */ + +void executor_create_pipes(t_minishell *minishell) +{ + t_list *current; + t_command *command; + int fd[2]; + int fd_in; - fd_in = 0; current = minishell->commands; while (current) @@ -34,8 +43,8 @@ void executer_create_pipes(t_minishell *minishell) else command->fd_out = 1; command->fd_in = fd_in; - command->n_pipes = (ft_lstsize(minishell->commands) - 1) * 2; + command->n_fds = (ft_lstsize(minishell->commands) - 1) * 2; fd_in = fd[0]; current = current->next; } -} \ No newline at end of file +} diff --git a/src/executor/executor_execute_pipeline.c b/src/executor/executor_execute_pipeline.c index bf4961a..970de1b 100644 --- a/src/executor/executor_execute_pipeline.c +++ b/src/executor/executor_execute_pipeline.c @@ -6,18 +6,18 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:02 by willem #+# #+# */ -/* Updated: 2025/02/12 21:25:03 by willem ######## odam.nl */ +/* Updated: 2025/02/13 15:04:18 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void executor_execute_pipeline(t_minishell *minishell) +void executor_execute_pipeline(t_minishell *minishell) { - t_list *current; + t_list *current; t_command *command; - executer_create_pipes(minishell); + executor_create_pipes(minishell); current = minishell->commands; while (current) { @@ -26,4 +26,4 @@ void executor_execute_pipeline(t_minishell *minishell) executor_fork(command); current = current->next; } -} \ No newline at end of file +} diff --git a/src/executor/executor_fork.c b/src/executor/executor_fork.c index ad1cd69..af52654 100644 --- a/src/executor/executor_fork.c +++ b/src/executor/executor_fork.c @@ -6,23 +6,23 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:24:52 by willem #+# #+# */ -/* Updated: 2025/02/12 21:24:53 by willem ######## odam.nl */ +/* Updated: 2025/02/13 15:03:19 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int executor_fork(t_command *command) +int executor_fork(t_command *command) { - pid_t pid; + pid_t pid; int status; pid = fork(); if (pid > 0) { - if(command->fd_in != 0) + if (command->fd_in != 0) close(command->fd_in); - if(command->fd_out != 1) + if (command->fd_out != 1) close(command->fd_out); waitpid(pid, &status, 0); return (((status) & 0xff00) >> 8); @@ -31,5 +31,5 @@ int executor_fork(t_command *command) executor_child(command); else perror("fork"); - return (EXIT_FAILURE); -} \ No newline at end of file + return (-1); +} diff --git a/src/main.c b/src/main.c index 44b4751..78a4813 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ -/* Updated: 2025/02/12 20:46:11 by willem ######## odam.nl */ +/* Updated: 2025/02/13 13:36:23 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,13 +14,13 @@ #include "minishell.h" #include "utils.h" -// static void token_print(void *param) -// { -// t_token *token; +static void token_print(void *param) +{ + t_token *token; -// token = (t_token *)param; -// printf("token type %i, value %s\n", token->type, token->value); -// } + token = (t_token *)param; + printf("token type %i, value %s\n", token->type, token->value); +} int main(int argc, char **argv, char **envp) { @@ -37,7 +37,7 @@ 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); - //ft_lstiter(minishell->tokens, token_print); + ft_lstiter(minishell->tokens, token_print); minishell->commands = parser_get_commands(minishell->tokens); simple_builtins(minishell); free_minishell_line(minishell); From c368cf80eadd60f14d513aea342c91f550b5eaea Mon Sep 17 00:00:00 2001 From: whaffman Date: Tue, 18 Feb 2025 16:00:38 +0100 Subject: [PATCH 008/103] exit status at the end of the executor_execute_pipeline --- inc/executor.h | 6 +++--- inc/typedef.h | 2 +- src/executor/executor_execute_pipeline.c | 11 ++++++++--- src/executor/executor_fork.c | 12 ++++++------ src/utils/simple_builtins.c | 7 +++++-- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/inc/executor.h b/inc/executor.h index e6c145e..61d0075 100644 --- a/inc/executor.h +++ b/inc/executor.h @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:06:07 by willem #+# #+# */ -/* Updated: 2025/02/13 14:57:13 by whaffman ######## odam.nl */ +/* Updated: 2025/02/18 15:45:27 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,9 +17,9 @@ char *executor_absolute_path(t_list *env, char *cmd); void executor_child(t_command *command); -int executor_fork(t_command *command); +pid_t executor_fork(t_command *command); void executor_create_pipes(t_minishell *minishell); -void executor_execute_pipeline(t_minishell *minishell); +int executor_execute_pipeline(t_minishell *minishell); void executor_close_fds(int n_fds); diff --git a/inc/typedef.h b/inc/typedef.h index 9039e04..817f5e0 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/13 14:27:07 by whaffman ######## odam.nl */ +/* Updated: 2025/02/18 14:34:39 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ diff --git a/src/executor/executor_execute_pipeline.c b/src/executor/executor_execute_pipeline.c index 970de1b..e86e9e3 100644 --- a/src/executor/executor_execute_pipeline.c +++ b/src/executor/executor_execute_pipeline.c @@ -6,24 +6,29 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:02 by willem #+# #+# */ -/* Updated: 2025/02/13 15:04:18 by whaffman ######## odam.nl */ +/* Updated: 2025/02/18 15:59:43 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void executor_execute_pipeline(t_minishell *minishell) +int executor_execute_pipeline(t_minishell *minishell) { t_list *current; t_command *command; + pid_t last_pid; + int exit_status; executor_create_pipes(minishell); current = minishell->commands; + last_pid = 0; while (current) { command = (t_command *)current->content; command->environment = minishell->environment; - executor_fork(command); + last_pid = executor_fork(command); current = current->next; } + waitpid(last_pid, &exit_status, 0); + return (((exit_status) & 0xff00) >> 8); } diff --git a/src/executor/executor_fork.c b/src/executor/executor_fork.c index af52654..bdc2c08 100644 --- a/src/executor/executor_fork.c +++ b/src/executor/executor_fork.c @@ -6,16 +6,16 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:24:52 by willem #+# #+# */ -/* Updated: 2025/02/13 15:03:19 by whaffman ######## odam.nl */ +/* Updated: 2025/02/18 15:41:56 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int executor_fork(t_command *command) +pid_t executor_fork(t_command *command) { pid_t pid; - int status; + // int status; pid = fork(); if (pid > 0) @@ -24,12 +24,12 @@ int executor_fork(t_command *command) close(command->fd_in); if (command->fd_out != 1) close(command->fd_out); - waitpid(pid, &status, 0); - return (((status) & 0xff00) >> 8); + // waitpid(pid, &status, 0); + // return (((status) & 0xff00) >> 8); } else if (pid == 0) executor_child(command); else perror("fork"); - return (-1); + return (pid); } diff --git a/src/utils/simple_builtins.c b/src/utils/simple_builtins.c index d197f8e..922f38a 100644 --- a/src/utils/simple_builtins.c +++ b/src/utils/simple_builtins.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:21:39 by whaffman #+# #+# */ -/* Updated: 2025/02/12 20:25:23 by willem ######## odam.nl */ +/* Updated: 2025/02/18 15:49:36 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -95,7 +95,10 @@ void simple_builtins(t_minishell *minishell) else if (cmp_value(minishell->tokens, "export")) builtin_export(minishell); else if (cmp_value(minishell->tokens, "unset")) - environment_del(&(minishell->environment), ((t_token *)minishell->tokens->next->content)->value); + { + environment_del(&(minishell->environment), + ((t_token *)minishell->tokens->next->content)->value); + } else { executor_execute_pipeline(minishell); From adee957c2da84cd88c84cef16b006164f6e32dc0 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 18 Feb 2025 17:03:11 +0100 Subject: [PATCH 009/103] refactor: parsing tokens is now less bulky --- src/lexer/lexer_token_next.c | 16 +++---- src/token/token_parse.c | 84 ++++++++++++++++++++++++------------ 2 files changed, 65 insertions(+), 35 deletions(-) diff --git a/src/lexer/lexer_token_next.c b/src/lexer/lexer_token_next.c index aa57eae..99dfdea 100644 --- a/src/lexer/lexer_token_next.c +++ b/src/lexer/lexer_token_next.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:25:35 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,22 +39,22 @@ t_token *ft_token_next(t_lexer *lexer) token = NULL; while (ft_isspace(lexer->current_char)) - ft_lexer_readchar(lexer); + lexer_readchar(lexer); current_pos = lexer->pos; if (lexer->current_char == '\0') - token = ft_token_new(T_EOF, NULL, current_pos); + token = token_new(T_EOF, NULL, current_pos); else if (lexer->current_char == '<' || lexer->current_char == '>' || lexer->current_char == '|') - token = ft_parse_token(lexer); + token = token_parse(lexer); else if (ft_isprint(lexer->current_char)) { - word = ft_lexer_readword(lexer); + word = lexer_readword(lexer); if (!word) - return (ft_token_new(T_ERROR, &lexer->current_char, current_pos)); - token = ft_token_new(T_WORD, word, current_pos); + return (token_new(T_ERROR, &lexer->current_char, current_pos)); + token = token_new(T_WORD, word, current_pos); free(word); } else - token = ft_token_new(T_ERROR, NULL, current_pos); + token = token_new(T_ERROR, NULL, current_pos); return (token); } diff --git a/src/token/token_parse.c b/src/token/token_parse.c index 5ce93aa..7a9d561 100644 --- a/src/token/token_parse.c +++ b/src/token/token_parse.c @@ -6,39 +6,69 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:10:17 by qmennen #+# #+# */ -/* Updated: 2025/02/11 17:38:51 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_token *ft_parse_token(t_lexer *lexer) +static t_token_type token_from_char(char c, int is_double) { - t_token *token; + if (c == '<') + { + if (is_double) + return (T_HEREDOC); + return (T_REDIRECT_IN); + } + else if (c == '>') + { + if (is_double) + return (T_APPEND_OUT); + return (T_REDIRECT_OUT); + } + else if (c == '&' && is_double) + return (T_AND); + else if (c == '|') + { + if (is_double) + return (T_OR); + return (T_PIPE); + } + return (T_ERROR); +} - token = NULL; - if (lexer->current_char == '|') - { - token = ft_token_new(T_PIPE, "|", lexer->pos); - } - else if (lexer->current_char == '<' && lexer->input[lexer->pos + 1] == '<') - { - token = ft_token_new(T_HEREDOC, "<<", lexer->pos); - ft_lexer_readchar(lexer); - } - else if (lexer->current_char == '<') - { - token = ft_token_new(T_REDIRECT_IN, "<", lexer->pos); - } - else if (lexer->current_char == '>' && lexer->input[lexer->pos + 1] == '>') - { - token = ft_token_new(T_APPEND_OUT, ">>", lexer->pos); - ft_lexer_readchar(lexer); - } - else if (lexer->current_char == '>') - { - token = ft_token_new(T_REDIRECT_OUT, ">", lexer->pos); - } - ft_lexer_readchar(lexer); +static char *char_from_type(t_token_type type) +{ + if (type == T_HEREDOC) + return ("<<"); + else if (type == T_REDIRECT_IN) + return ("<"); + else if (type == T_APPEND_OUT) + return (">>"); + else if (type == T_REDIRECT_OUT) + return (">"); + else if (type == T_AND) + return ("&&"); + else if (type == T_OR) + return ("||"); + else if (type == T_PIPE) + return ("|"); + return (NULL); +} + +t_token *token_parse(t_lexer *lexer) +{ + int is_double; + char c; + t_token *token; + t_token_type type; + + c = lexer->current_char; + is_double = lexer->input[lexer->pos + 1] == c; + type = token_from_char(c, is_double); + token = token_new(type, char_from_type(type), lexer->pos); + if (is_double) + lexer_readchar(lexer); + lexer_readchar(lexer); return (token); } From 4005f98b16d53d6fa5d60de3ae31919aa8a7b3ef Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 18 Feb 2025 17:03:40 +0100 Subject: [PATCH 010/103] refactor: naming conventions --- inc/tokenizer.h | 22 +++++++++++----------- inc/typedef.h | 2 ++ src/lexer/lexer_read_char.c | 6 +++--- src/lexer/lexer_read_word.c | 12 ++++++------ src/main.c | 2 +- src/token/token_new.c | 4 ++-- 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/inc/tokenizer.h b/inc/tokenizer.h index 1e8d893..306bc03 100644 --- a/inc/tokenizer.h +++ b/inc/tokenizer.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* tokenizer.h :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ -/* Updated: 2025/02/05 12:36:01 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* tokenizer.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ +/* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,16 +18,16 @@ */ t_lexer *ft_lexer_new(const char *input); void ft_lexer_free(t_lexer *lexer); -void ft_lexer_readchar(t_lexer *lexer); -char *ft_lexer_readword(t_lexer *lexer); +void lexer_readchar(t_lexer *lexer); +char *lexer_readword(t_lexer *lexer); t_list *ft_parse_input(t_lexer *lexer); /** * Token */ t_token *ft_token_next(t_lexer *lexer); -t_token *ft_token_new(t_token_type type, char *c, int pos); +t_token *token_new(t_token_type type, char *c, int pos); void ft_token_free(t_token *token); void ft_clear_tokenlist(void *content); -t_token *ft_parse_token(t_lexer *lexer); +t_token *token_parse(t_lexer *lexer); #endif // TOKENIZER_H diff --git a/inc/typedef.h b/inc/typedef.h index 817f5e0..b4ab084 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -19,6 +19,8 @@ typedef enum e_token_type T_PIPE, T_REDIRECT_IN, T_REDIRECT_OUT, + T_AND, + T_OR, T_APPEND_OUT, T_HEREDOC, T_EOF, diff --git a/src/lexer/lexer_read_char.c b/src/lexer/lexer_read_char.c index 6f62b34..4b67351 100644 --- a/src/lexer/lexer_read_char.c +++ b/src/lexer/lexer_read_char.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* lexer_readchar.c :+: :+: :+: */ +/* lexer_read_char.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:04:53 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:05:06 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_lexer_readchar(t_lexer *lexer) +void lexer_readchar(t_lexer *lexer) { if ((size_t)lexer->n_pos > ft_strlen(lexer->input)) { diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 2738be8..083240a 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:28:17 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,15 +21,15 @@ static char *parse_quotes(t_lexer *lexer) qc = lexer->current_char; word = NULL; - ft_lexer_readchar(lexer); + lexer_readchar(lexer); start = lexer->pos; while (lexer->current_char != '\0' && lexer->current_char != qc) - ft_lexer_readchar(lexer); + lexer_readchar(lexer); len = lexer->pos - start; word = malloc(sizeof(char) * len + 1); ft_strlcpy(word, lexer->input + start, len + 1); if (lexer->current_char == qc) - ft_lexer_readchar(lexer); + lexer_readchar(lexer); else { free(word); @@ -38,7 +38,7 @@ static char *parse_quotes(t_lexer *lexer) return (word); } -char *ft_lexer_readword(t_lexer *lexer) +char *lexer_readword(t_lexer *lexer) { int start; int len; @@ -54,7 +54,7 @@ char *ft_lexer_readword(t_lexer *lexer) && lexer->current_char != '\0' && !ft_isspace(lexer->current_char) && lexer->current_char != '"' && lexer->current_char != '\'') { - ft_lexer_readchar(lexer); + lexer_readchar(lexer); } len = lexer->pos - start; word = malloc(sizeof(char) * len + 1); diff --git a/src/main.c b/src/main.c index 78a4813..eac3a5c 100644 --- a/src/main.c +++ b/src/main.c @@ -38,7 +38,7 @@ int main(int argc, char **argv, char **envp) minishell->lexer = ft_lexer_new(minishell->line); minishell->tokens = ft_parse_input(minishell->lexer); ft_lstiter(minishell->tokens, token_print); - minishell->commands = parser_get_commands(minishell->tokens); + //minishell->commands = parser_get_commands(minishell->tokens); simple_builtins(minishell); free_minishell_line(minishell); ft_lstclear(&minishell->commands, free_command_list); diff --git a/src/token/token_new.c b/src/token/token_new.c index 6529b1b..9626f44 100644 --- a/src/token/token_new.c +++ b/src/token/token_new.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:10:49 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:11:32 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 17:01:52 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_token *ft_token_new(t_token_type type, char *c, int pos) +t_token *token_new(t_token_type type, char *c, int pos) { t_token *token; From 6d308b4a67b026ddfba8b202d103c3f9e5089827 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 18 Feb 2025 20:04:56 +0100 Subject: [PATCH 011/103] we're expanding --- Makefile | 2 +- inc/expander.h | 20 +++++++ inc/minishell.h | 1 + inc/parser.h | 4 +- inc/typedef.h | 2 + src/expander/expander.c | 86 +++++++++++++++++++++++++++++++ src/lexer/lexer_parse_input.c | 2 +- src/lexer/lexer_token_next.c | 21 ++++++-- src/main.c | 2 +- src/parser/parser_get_arguments.c | 13 +++-- src/parser/parser_get_commands.c | 39 ++++---------- 11 files changed, 152 insertions(+), 40 deletions(-) create mode 100644 inc/expander.h create mode 100644 src/expander/expander.c diff --git a/Makefile b/Makefile index 9108b49..dd9ca2f 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ LIBFT = $(LIBFT_PATH)/libft.a OBJ_PATH = obj -VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils:src/executor:src/parser +VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils:src/executor:src/parser:src/expander SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) diff --git a/inc/expander.h b/inc/expander.h new file mode 100644 index 0000000..4d22de6 --- /dev/null +++ b/inc/expander.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/18 19:00:51 by qmennen #+# #+# */ +/* Updated: 2025/02/18 19:05:14 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef EXPANDER_H +# define EXPANDER_H + +#include "minishell.h" + +char *expander_parse_string(char *s, t_minishell *minishell); + +#endif diff --git a/inc/minishell.h b/inc/minishell.h index 7c820b9..5543c1b 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -21,6 +21,7 @@ # include "tokenizer.h" # include "executor.h" # include "parser.h" +# include "expander.h" # include "utils.h" # define TRUE 1 diff --git a/inc/parser.h b/inc/parser.h index 8caaa0a..f757caa 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -16,7 +16,7 @@ # 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); +char **parser_get_arguments(t_list *list, t_minishell *minishell); +t_list *parser_get_commands(t_minishell *minishell); #endif diff --git a/inc/typedef.h b/inc/typedef.h index b4ab084..c3b4b8a 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -16,6 +16,8 @@ typedef enum e_token_type { T_WORD, + T_DQWORD, + T_SQWORD, T_PIPE, T_REDIRECT_IN, T_REDIRECT_OUT, diff --git a/src/expander/expander.c b/src/expander/expander.c new file mode 100644 index 0000000..7910737 --- /dev/null +++ b/src/expander/expander.c @@ -0,0 +1,86 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ +/* Updated: 2025/02/18 20:00:51 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" +#include + +static size_t len_prefix(const char *s) +{ + size_t i; + + i = 0; + while (s[i] != '$' && s[i]) + i++; + return (i); +} + +static size_t len_var_name(const char *s) +{ + size_t start; + size_t i; + + start = len_prefix(s); + if (start == ft_strlen(s)) + return (0); + start++; + i = 0; + while (s[start + i]) + i++; + return (i); +} + +static char *get_env_value(char *s) +{ + int start; + + start = 0; + while (s[start] != '$' && s[start]) + start++; + if (s[start] != '$' || !s[start + 1]) + return (NULL); + start++; + return ft_substr(s, start, len_var_name(s)); +} + +static char *expand_string(char *s, t_environment *env) +{ + char *final_str; + + final_str = ft_calloc(1, ft_strlen(env->value) + len_prefix(s) + 1); + if (!final_str) + { + perror("malloc"); + exit(EXIT_FAILURE); + } + ft_strlcat(final_str, s, len_prefix(s) + 1); + ft_strlcat(final_str, env->value, ft_strlen(env->value)); + return (final_str); +} + +char *expander_parse_string(char *s, t_minishell *minishell) +{ + size_t l1; + char *result; + char *name; + t_environment *env; + + l1 = len_prefix(s); + if (l1 == ft_strlen(s)) + return (ft_strdup(s)); + name = get_env_value(s); + if (!name) + return (ft_strdup("")); + env = environment_get(minishell->environment, name); + result = expand_string(s, env); + free(name); + return (result); +} diff --git a/src/lexer/lexer_parse_input.c b/src/lexer/lexer_parse_input.c index 861e4eb..466d668 100644 --- a/src/lexer/lexer_parse_input.c +++ b/src/lexer/lexer_parse_input.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:09:26 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 17:18:10 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/lexer/lexer_token_next.c b/src/lexer/lexer_token_next.c index 99dfdea..0aab9db 100644 --- a/src/lexer/lexer_token_next.c +++ b/src/lexer/lexer_token_next.c @@ -11,6 +11,17 @@ /* ************************************************************************** */ #include "minishell.h" +#include "typedef.h" + +static t_token_type get_word_type(char c) +{ + if (c == '\'') + return (T_SQWORD); + else if (c == '"') + return (T_DQWORD); + else + return (T_WORD); +} /** * @brief Retrieves the next token from the lexer. @@ -33,9 +44,10 @@ */ t_token *ft_token_next(t_lexer *lexer) { - t_token *token; - char *word; - int current_pos; + t_token *token; + t_token_type word_type; + char *word; + int current_pos; token = NULL; while (ft_isspace(lexer->current_char)) @@ -48,10 +60,11 @@ t_token *ft_token_next(t_lexer *lexer) token = token_parse(lexer); else if (ft_isprint(lexer->current_char)) { + word_type = get_word_type(lexer->current_char); word = lexer_readword(lexer); if (!word) return (token_new(T_ERROR, &lexer->current_char, current_pos)); - token = token_new(T_WORD, word, current_pos); + token = token_new(word_type, word, current_pos); free(word); } else diff --git a/src/main.c b/src/main.c index eac3a5c..fd282ac 100644 --- a/src/main.c +++ b/src/main.c @@ -38,7 +38,7 @@ int main(int argc, char **argv, char **envp) minishell->lexer = ft_lexer_new(minishell->line); minishell->tokens = ft_parse_input(minishell->lexer); ft_lstiter(minishell->tokens, token_print); - //minishell->commands = parser_get_commands(minishell->tokens); + minishell->commands = parser_get_commands(minishell); simple_builtins(minishell); free_minishell_line(minishell); ft_lstclear(&minishell->commands, free_command_list); diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index 2b428ce..efa6e05 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -16,12 +16,14 @@ static int count_cmds(t_list *list) { int cmds; t_list *current; + t_token *token; cmds = 0; current = list; while (current) { - if (((t_token *)current->content)->type != T_WORD) + token = ((t_token *)current->content); + if (token->type >= 3) break ; cmds++; current = current->next; @@ -29,7 +31,7 @@ static int count_cmds(t_list *list) return (cmds); } -char **parser_get_arguments(t_list *list) +char **parser_get_arguments(t_list *list, t_minishell *minishell) { t_list *current; char **args; @@ -47,7 +49,12 @@ char **parser_get_arguments(t_list *list) i = -1; while ((++i) < cmds && current) { - if (((t_token *)current->content)->type == T_WORD) + if (((t_token *)current->content)->type == T_DQWORD) + { + args[i] = expander_parse_string(((t_token *)current->content)->value, minishell); + } + if (((t_token *)current->content)->type == T_WORD || + ((t_token *)current->content)->type == T_SQWORD) args[i] = ft_strdup(((t_token *)current->content)->value); current = current->next; } diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 786e143..a911dcf 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -1,35 +1,18 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* parser_get_commands.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ -/* Updated: 2025/02/12 20:49:00 by willem ######## odam.nl */ +/* ::: :::::::: */ +/* parser_get_commands.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ +/* Updated: 2025/02/18 19:29:38 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 *parser_get_commands(t_minishell *minishell) { t_list *command_list; t_list *current; @@ -37,14 +20,14 @@ t_list *parser_get_commands(t_list *list) t_token *token; command_list = NULL; - if (!list) + if (!minishell->tokens) return (NULL); - current = list; + current = minishell->tokens; while (current) { token = (t_token *) current->content; command = parser_command_new(ft_strdup(token->value)); - command->args = parser_get_arguments(current); + command->args = parser_get_arguments(current, minishell); ft_lstadd_back(&command_list, ft_lstnew(command)); while (current && ((t_token *)current->content)->type == T_WORD) current = current->next; From 4793ab36b4398d1ef0dbc1d8b2cc4648af00dfa8 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 18 Feb 2025 20:32:42 +0100 Subject: [PATCH 012/103] better expension but cat doesnt work --- Makefile | 4 ++-- inc/debug.h | 20 ++++++++++++++++++++ inc/minishell.h | 1 + src/debug/print_commands.c | 29 +++++++++++++++++++++++++++++ src/expander/expander.c | 20 ++++++++++++++------ src/parser/parser_get_commands.c | 4 ++-- 6 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 inc/debug.h create mode 100644 src/debug/print_commands.c diff --git a/Makefile b/Makefile index dd9ca2f..2d09536 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: qmennen +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/11 15:06:22 by qmennen ### ########.fr # +# Updated: 2025/02/18 20:11:18 by qmennen ### ########.fr # # # # **************************************************************************** # @@ -22,7 +22,7 @@ LIBFT = $(LIBFT_PATH)/libft.a OBJ_PATH = obj -VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils:src/executor:src/parser:src/expander +VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils:src/executor:src/parser:src/expander:src/debug SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) diff --git a/inc/debug.h b/inc/debug.h new file mode 100644 index 0000000..934b75a --- /dev/null +++ b/inc/debug.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* debug.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/18 20:06:53 by qmennen #+# #+# */ +/* Updated: 2025/02/18 20:10:49 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef DEBUG_H +# define DEBUG_H + +# include "minishell.h" + +void print_commands(void *param); + +#endif diff --git a/inc/minishell.h b/inc/minishell.h index 5543c1b..55fd24e 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -22,6 +22,7 @@ # include "executor.h" # include "parser.h" # include "expander.h" +# include "debug.h" # include "utils.h" # define TRUE 1 diff --git a/src/debug/print_commands.c b/src/debug/print_commands.c new file mode 100644 index 0000000..88ed829 --- /dev/null +++ b/src/debug/print_commands.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* print_commands.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/18 20:06:37 by qmennen #+# #+# */ +/* Updated: 2025/02/18 20:11:45 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void print_commands(void *param) +{ + t_command *command; + int i; + + command = (t_command *)param; + if (!command) + return ; + printf("command: %s\n", command->command); + printf("args: "); + i = 0; + while (command->args[i++]) + printf("%s ", command->args[i]); + printf("\n"); +} diff --git a/src/expander/expander.c b/src/expander/expander.c index 7910737..bf8a6eb 100644 --- a/src/expander/expander.c +++ b/src/expander/expander.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:00:51 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 20:31:36 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,7 +33,7 @@ static size_t len_var_name(const char *s) return (0); start++; i = 0; - while (s[start + i]) + while (s[start + i] && !ft_isspace(s[start + i])) i++; return (i); } @@ -53,17 +53,23 @@ static char *get_env_value(char *s) static char *expand_string(char *s, t_environment *env) { + char *s1; + char *s2; + char *s3; char *final_str; - final_str = ft_calloc(1, ft_strlen(env->value) + len_prefix(s) + 1); + final_str = ft_calloc(1, ft_strlen(env->value) + ft_strlen(s) - len_var_name(s)); if (!final_str) { perror("malloc"); exit(EXIT_FAILURE); } - ft_strlcat(final_str, s, len_prefix(s) + 1); - ft_strlcat(final_str, env->value, ft_strlen(env->value)); - return (final_str); + s1 = ft_substr(s, 0, len_prefix(s)); + s2 = ft_strdup(env->value); + s3 = ft_substr(s, len_prefix(s) + 1 + len_var_name(s),len_prefix(s) + len_var_name(s) - ft_strlen(s)); + if (!s1 || !s2 || !s3) + perror("expand"); + return (ft_strjoin(ft_strjoin(s1, s2), s3)); } char *expander_parse_string(char *s, t_minishell *minishell) @@ -80,6 +86,8 @@ char *expander_parse_string(char *s, t_minishell *minishell) if (!name) return (ft_strdup("")); env = environment_get(minishell->environment, name); + if (!env) + return (ft_strdup("")); result = expand_string(s, env); free(name); return (result); diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index a911dcf..d417835 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ -/* Updated: 2025/02/18 19:29:38 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 20:31:54 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,6 +34,6 @@ t_list *parser_get_commands(t_minishell *minishell) if (current && ((t_token *)current->content)->type != T_WORD) current = current->next; } - //ft_lstiter(command_list, print_cmds); +// ft_lstiter(command_list, print_commands); return (command_list); } From 1cccbad890b02ef8e65630ea0ddba5e42608fce1 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 18 Feb 2025 20:36:40 +0100 Subject: [PATCH 013/103] And we're back again --- src/parser/parser_get_commands.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index d417835..74c21ff 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:31:54 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 20:36:01 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,9 +29,9 @@ t_list *parser_get_commands(t_minishell *minishell) command = parser_command_new(ft_strdup(token->value)); command->args = parser_get_arguments(current, minishell); ft_lstadd_back(&command_list, ft_lstnew(command)); - while (current && ((t_token *)current->content)->type == T_WORD) + while (current && ((t_token *)current->content)->type < 3) current = current->next; - if (current && ((t_token *)current->content)->type != T_WORD) + if (current && ((t_token *)current->content)->type >= 3) current = current->next; } // ft_lstiter(command_list, print_commands); From ce028b7b6f811827e5141e90f797d6ba8fe5604e Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 18 Feb 2025 21:04:26 +0100 Subject: [PATCH 014/103] refactoring expander --- inc/expander.h | 4 +- src/expander/expander.c | 93 ++++++++++-------------------- src/expander/expander_count_vars.c | 29 ++++++++++ 3 files changed, 63 insertions(+), 63 deletions(-) create mode 100644 src/expander/expander_count_vars.c diff --git a/inc/expander.h b/inc/expander.h index 4d22de6..b926783 100644 --- a/inc/expander.h +++ b/inc/expander.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/18 19:00:51 by qmennen #+# #+# */ -/* Updated: 2025/02/18 19:05:14 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 20:40:04 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,8 @@ #include "minishell.h" + +size_t expander_count_vars(const char *s); char *expander_parse_string(char *s, t_minishell *minishell); #endif diff --git a/src/expander/expander.c b/src/expander/expander.c index bf8a6eb..8307e2c 100644 --- a/src/expander/expander.c +++ b/src/expander/expander.c @@ -6,89 +6,58 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:31:36 by qmennen ### ########.fr */ +/* Updated: 2025/02/18 21:04:00 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ +#include "environment.h" +#include "libft.h" #include "minishell.h" -#include +#include "typedef.h" -static size_t len_prefix(const char *s) +static size_t len_var_name(const char *s, int idx) { size_t i; i = 0; - while (s[i] != '$' && s[i]) + while (s[idx + i] && ft_isalpha(s[idx + i])) i++; return (i); } -static size_t len_var_name(const char *s) +t_environment *get_var(const char *s, int idx, t_minishell *minishell) { - size_t start; - size_t i; + int i; + t_environment *env; + char *name; - start = len_prefix(s); - if (start == ft_strlen(s)) - return (0); - start++; i = 0; - while (s[start + i] && !ft_isspace(s[start + i])) + while (s[idx + i] && ft_isalpha(s[idx + i])) i++; - return (i); -} - -static char *get_env_value(char *s) -{ - int start; - - start = 0; - while (s[start] != '$' && s[start]) - start++; - if (s[start] != '$' || !s[start + 1]) - return (NULL); - start++; - return ft_substr(s, start, len_var_name(s)); -} - -static char *expand_string(char *s, t_environment *env) -{ - char *s1; - char *s2; - char *s3; - char *final_str; - - final_str = ft_calloc(1, ft_strlen(env->value) + ft_strlen(s) - len_var_name(s)); - if (!final_str) - { - perror("malloc"); - exit(EXIT_FAILURE); - } - s1 = ft_substr(s, 0, len_prefix(s)); - s2 = ft_strdup(env->value); - s3 = ft_substr(s, len_prefix(s) + 1 + len_var_name(s),len_prefix(s) + len_var_name(s) - ft_strlen(s)); - if (!s1 || !s2 || !s3) - perror("expand"); - return (ft_strjoin(ft_strjoin(s1, s2), s3)); + name = ft_substr(s, idx, i); + if (!name) + perror("name"); + env = environment_get(minishell->environment, name); + free(name); + return (env); } char *expander_parse_string(char *s, t_minishell *minishell) { - size_t l1; - char *result; - char *name; + int i; t_environment *env; + t_list *var_list; - l1 = len_prefix(s); - if (l1 == ft_strlen(s)) - return (ft_strdup(s)); - name = get_env_value(s); - if (!name) - return (ft_strdup("")); - env = environment_get(minishell->environment, name); - if (!env) - return (ft_strdup("")); - result = expand_string(s, env); - free(name); - return (result); + i = 0; + while (s[i]) + { + if (s[i] == '$') + { + env = get_var(s, i, minishell); + if (env) + ft_lstadd_back(&var_list, ft_lstnew(env->value)); + } + i++; + } + return ft_strdup(""); } diff --git a/src/expander/expander_count_vars.c b/src/expander/expander_count_vars.c new file mode 100644 index 0000000..eceae4c --- /dev/null +++ b/src/expander/expander_count_vars.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander_count_vars.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/18 20:38:17 by qmennen #+# #+# */ +/* Updated: 2025/02/18 20:39:53 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +size_t expander_count_vars(const char *s) +{ + size_t vars; + size_t i; + + i = 0; + vars = 0; + while (s[i]) + { + if (s[i] == '$' && ft_isalpha(s[i + 1])) + vars++; + i++; + } + return (vars); +} From 2add37e72a8135c5b2ad10c1cbe8e8051fb27919 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 19 Feb 2025 12:17:27 +0100 Subject: [PATCH 015/103] added signals to README --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 1ac6a5b..4cfd029 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,22 @@ A lot of amazing shell stuff - CB command to change banner - __Bonus:__ Command tree for &&, ||, * +## Signals +### In interactive mode +- `ctrl - C` redisplay prompt status 130 +- `ctrl - D` exit shell +- `ctrl - \` + +### During process +- `ctrl - C` SIGINT to processs status 130 +- `ctrl - D` +- `ctrl - \` SIGQUIT to process core dumped status 131 + +### During HEREDOC +- `ctrl - C` redisplay prompt status 130 +- `ctrl - D` SEND EOF error displayed but still works status:0 +- `ctrl - \` nothing + ## Allowed Functions ### `` From 9f5c134517c3b9a33627f64fbf6cd985fc1ed898 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 19 Feb 2025 12:47:09 +0100 Subject: [PATCH 016/103] first signals in minshell --- .vscode/settings.json | 5 +++-- Makefile | 16 ++++++++-------- inc/minishell.h | 3 ++- inc/signals.h | 21 +++++++++++++++++++++ src/main.c | 5 ++++- src/signal/signal.c | 28 ++++++++++++++++++++++++++++ 6 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 inc/signals.h create mode 100644 src/signal/signal.c diff --git a/.vscode/settings.json b/.vscode/settings.json index 828d5ed..6be99c7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "files.associations": { - "minishell.h": "c" + "minishell.h": "c", + "signal.h": "c" } -} \ No newline at end of file +} diff --git a/Makefile b/Makefile index 9108b49..2060049 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ # **************************************************************************** # # # -# ::: :::::::: # -# Makefile :+: :+: :+: # -# +:+ +:+ +:+ # -# By: qmennen +#+ +:+ +#+ # -# +#+#+#+#+#+ +#+ # -# Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/11 15:06:22 by qmennen ### ########.fr # +# :::::::: # +# Makefile :+: :+: # +# +:+ # +# By: qmennen +#+ # +# +#+ # +# Created: 2024/10/15 11:48:46 by whaffman #+# #+# # +# Updated: 2025/02/19 12:18:18 by whaffman ######## odam.nl # # # # **************************************************************************** # @@ -22,7 +22,7 @@ LIBFT = $(LIBFT_PATH)/libft.a OBJ_PATH = obj -VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils:src/executor:src/parser +VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils:src/executor:src/parser:src/signal SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) diff --git a/inc/minishell.h b/inc/minishell.h index 7c820b9..ce63aa9 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:13 by whaffman #+# #+# */ -/* Updated: 2025/02/12 10:59:38 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 12:38:57 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -16,6 +16,7 @@ # include "allowed.h" # include "libft.h" # include "typedef.h" +# include "signals.h" # include "environment.h" # include "prompt.h" # include "tokenizer.h" diff --git a/inc/signals.h b/inc/signals.h new file mode 100644 index 0000000..658fab8 --- /dev/null +++ b/inc/signals.h @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* signals.h :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/19 12:26:09 by whaffman #+# #+# */ +/* Updated: 2025/02/19 12:32:26 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#ifndef SIGNALS_H +# define SIGNALS_H + +# include "minishell.h" + +void signal_init_minishell(void); +void sigint_minishell_handler(int signum); + +#endif // SIGNALS_H diff --git a/src/main.c b/src/main.c index 78a4813..c634e60 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ -/* Updated: 2025/02/13 13:36:23 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 12:41:05 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -31,10 +31,13 @@ int main(int argc, char **argv, char **envp) print_banner(); history_load(); minishell = init_minishell(); + signal_init_minishell(); environment_parse(envp, &(minishell->environment)); while (TRUE) { minishell->line = ft_prompt(minishell); + if (minishell->line == NULL) + break ; minishell->lexer = ft_lexer_new(minishell->line); minishell->tokens = ft_parse_input(minishell->lexer); ft_lstiter(minishell->tokens, token_print); diff --git a/src/signal/signal.c b/src/signal/signal.c new file mode 100644 index 0000000..29f3ab0 --- /dev/null +++ b/src/signal/signal.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* signal.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/19 12:18:47 by whaffman #+# #+# */ +/* Updated: 2025/02/19 12:39:05 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + + +void signal_init_minishell(void) +{ + signal(SIGINT, sigint_minishell_handler); + signal(SIGQUIT, SIG_IGN); +} + +void sigint_minishell_handler(int signum) +{ + (void)signum; + ft_putstr_fd("\n", 1); + rl_on_new_line(); + rl_redisplay(); +} From 49d3a8232b25ca6dc3b7bdcae560f5b7759cc15c Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 19 Feb 2025 13:58:50 +0100 Subject: [PATCH 017/103] preliminary signals --- inc/signals.h | 9 +++-- src/executor/executor_child.c | 9 ++++- src/executor/executor_execute_pipeline.c | 3 +- src/executor/executor_fork.c | 7 +++- src/main.c | 3 +- src/prompt/prompt.c | 3 +- src/signal/signal.c | 42 ++++++++++++++++++++---- 7 files changed, 62 insertions(+), 14 deletions(-) diff --git a/inc/signals.h b/inc/signals.h index 658fab8..9d6d602 100644 --- a/inc/signals.h +++ b/inc/signals.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* signals.h :+: :+: */ +/* signals.h :+: :+: */ /* +:+ */ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/19 12:26:09 by whaffman #+# #+# */ -/* Updated: 2025/02/19 12:32:26 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 13:39:58 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,7 +15,10 @@ # include "minishell.h" -void signal_init_minishell(void); +void sigint_heredoc_handler(int signum); void sigint_minishell_handler(int signum); +void signal_init_child(void); +void signal_init_parent(void); +void signal_init_minishell(void); #endif // SIGNALS_H diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 950b337..b69206b 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/13 15:04:12 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 12:56:03 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -21,5 +21,12 @@ void executor_child(t_command *command) dup2(command->fd_out, 1); executor_close_fds(command->n_fds); path = executor_absolute_path(command->environment, command->command); + if (path == NULL) + { + ft_putstr_fd(RED BOLD, 2); + ft_putstr_fd(command->command, 2); + ft_putstr_fd(": " RESET "command not found\n", 2); + return ; + } execve(path, command->args, environment_get_arr(command->environment)); } diff --git a/src/executor/executor_execute_pipeline.c b/src/executor/executor_execute_pipeline.c index e86e9e3..1d75caf 100644 --- a/src/executor/executor_execute_pipeline.c +++ b/src/executor/executor_execute_pipeline.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:02 by willem #+# #+# */ -/* Updated: 2025/02/18 15:59:43 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 13:40:45 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -30,5 +30,6 @@ int executor_execute_pipeline(t_minishell *minishell) current = current->next; } waitpid(last_pid, &exit_status, 0); + signal_init_minishell(); return (((exit_status) & 0xff00) >> 8); } diff --git a/src/executor/executor_fork.c b/src/executor/executor_fork.c index bdc2c08..5bd2d22 100644 --- a/src/executor/executor_fork.c +++ b/src/executor/executor_fork.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:24:52 by willem #+# #+# */ -/* Updated: 2025/02/18 15:41:56 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 13:40:19 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -26,9 +26,14 @@ pid_t executor_fork(t_command *command) close(command->fd_out); // waitpid(pid, &status, 0); // return (((status) & 0xff00) >> 8); + signal_init_parent(); } else if (pid == 0) + { + signal_init_child(); executor_child(command); + exit(127); + } else perror("fork"); return (pid); diff --git a/src/main.c b/src/main.c index c634e60..4b03161 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ -/* Updated: 2025/02/19 12:41:05 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 12:48:13 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -46,6 +46,7 @@ int main(int argc, char **argv, char **envp) free_minishell_line(minishell); ft_lstclear(&minishell->commands, free_command_list); } + ft_lstclear(&minishell->commands, free_command_list); free_minishell(minishell); return (EXIT_SUCCESS); } diff --git a/src/prompt/prompt.c b/src/prompt/prompt.c index 81b9293..9f05c69 100644 --- a/src/prompt/prompt.c +++ b/src/prompt/prompt.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ -/* Updated: 2025/02/12 12:53:38 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 13:44:20 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -120,6 +120,7 @@ char *ft_prompt(t_minishell *minishell) } free(user); free(cwd); + rl_on_new_line(); line = readline(prompt); free(prompt); if (line == NULL) diff --git a/src/signal/signal.c b/src/signal/signal.c index 29f3ab0..fa03468 100644 --- a/src/signal/signal.c +++ b/src/signal/signal.c @@ -6,23 +6,53 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/19 12:18:47 by whaffman #+# #+# */ -/* Updated: 2025/02/19 12:39:05 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 13:42:55 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" +void sigint_minishell_handler(int signum) +{ + (void)signum; + ft_putstr_fd("\n", 1); + rl_on_new_line(); + rl_replace_line("", 0); + rl_redisplay(); +} + +void sigint_heredoc_handler(int signum) +{ + (void)signum; + ft_putstr_fd("\n", 1); + rl_on_new_line(); + rl_replace_line("", 0); + exit(130); +} + void signal_init_minishell(void) { signal(SIGINT, sigint_minishell_handler); signal(SIGQUIT, SIG_IGN); } -void sigint_minishell_handler(int signum) +void signal_init_parent(void) { - (void)signum; - ft_putstr_fd("\n", 1); - rl_on_new_line(); - rl_redisplay(); + signal(SIGINT, SIG_IGN); + signal(SIGQUIT, SIG_IGN); +} + + +void signal_init_child(void) +{ + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); +} + + +void signal_init_heredoc(void) +{ + signal(SIGINT, sigint_heredoc_handler); + signal(SIGQUIT, SIG_IGN); } From 9f6f48c0efa63765f0692eab0f00142967cc8d7a Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 19 Feb 2025 15:24:06 +0100 Subject: [PATCH 018/103] expansion --- inc/expander.h | 11 ++-- src/expander/expander_allocate_memory.c | 40 +++++++++++++ src/expander/expander_expand_dollar.c | 45 ++++++++++++++ .../{expander.c => expander_get_variable.c} | 47 +++------------ ...r_count_vars.c => expander_is_character.c} | 21 ++----- src/expander/expander_parse_string.c | 58 +++++++++++++++++++ src/expander/expander_parse_variables.c | 37 ++++++++++++ src/lexer/lexer_read_word.c | 2 +- src/parser/parser_get_arguments.c | 15 ++++- 9 files changed, 213 insertions(+), 63 deletions(-) create mode 100644 src/expander/expander_allocate_memory.c create mode 100644 src/expander/expander_expand_dollar.c rename src/expander/{expander.c => expander_get_variable.c} (51%) rename src/expander/{expander_count_vars.c => expander_is_character.c} (65%) create mode 100644 src/expander/expander_parse_string.c create mode 100644 src/expander/expander_parse_variables.c diff --git a/inc/expander.h b/inc/expander.h index b926783..3e61de9 100644 --- a/inc/expander.h +++ b/inc/expander.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/18 19:00:51 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:40:04 by qmennen ### ########.fr */ +/* Updated: 2025/02/19 15:19:50 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,8 +15,11 @@ #include "minishell.h" - -size_t expander_count_vars(const char *s); -char *expander_parse_string(char *s, t_minishell *minishell); +t_environment *expander_get_var(const char *s, int idx, t_minishell *minishell); +t_list *expander_parse_variables(const char *s, t_minishell *minishell); +char *expander_allocate_memory(const char *s, t_list *variables); +char *expander_parse_string(char *s, t_minishell *minishell); +int expander_character_valid(const char c); +int expander_expand_dollar(char *src, char *dest, int *j, t_list *variables); #endif diff --git a/src/expander/expander_allocate_memory.c b/src/expander/expander_allocate_memory.c new file mode 100644 index 0000000..286ed37 --- /dev/null +++ b/src/expander/expander_allocate_memory.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander_allocate_memory.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/19 13:57:19 by qmennen #+# #+# */ +/* Updated: 2025/02/19 13:57:36 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *expander_allocate_memory(const char *s, t_list *variables) +{ + int size; + t_list *current; + t_environment *env; + char *string; + + size = 0; + current = variables; + while (current) + { + if (current->content == NULL) + { + current = current->next; + continue; + } + env = (t_environment *)current->content; + size += (ft_strlen(env->value) - ft_strlen(env->name)); + current = current->next; + } + size += ft_strlen(s); + string = malloc(size); + if (!string) + perror("expander malloc"); + return (string); +} diff --git a/src/expander/expander_expand_dollar.c b/src/expander/expander_expand_dollar.c new file mode 100644 index 0000000..414e19c --- /dev/null +++ b/src/expander/expander_expand_dollar.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander_expand_dollar.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/19 15:05:58 by qmennen #+# #+# */ +/* Updated: 2025/02/19 15:22:40 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int get_var_len(const char *source, int idx) +{ + int i; + + i = 0; + while (expander_character_valid(source[idx + i])) + i++; + return (i); +} + +int expander_expand_dollar(char *src, char *dest, int *j, t_list *variables) +{ + int i; + int v_len; + t_environment *env; + + i = 0; + v_len = 0; + if (variables && variables->content) + { + env = (t_environment *)variables->content; + v_len = ft_strlen(env->name); + while (env->value[i]) + { + dest[(*j)++] = env->value[i++]; + } + } + else + v_len = get_var_len(src, (*j) + 1); + return (v_len); +} diff --git a/src/expander/expander.c b/src/expander/expander_get_variable.c similarity index 51% rename from src/expander/expander.c rename to src/expander/expander_get_variable.c index 8307e2c..924798a 100644 --- a/src/expander/expander.c +++ b/src/expander/expander_get_variable.c @@ -1,63 +1,30 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* expander.c :+: :+: :+: */ +/* expander_get_variable.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/18 21:04:00 by qmennen ### ########.fr */ +/* Created: 2025/02/19 13:59:03 by qmennen #+# #+# */ +/* Updated: 2025/02/19 13:59:14 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -#include "environment.h" -#include "libft.h" #include "minishell.h" -#include "typedef.h" -static size_t len_var_name(const char *s, int idx) -{ - size_t i; - - i = 0; - while (s[idx + i] && ft_isalpha(s[idx + i])) - i++; - return (i); -} - -t_environment *get_var(const char *s, int idx, t_minishell *minishell) +t_environment *expander_get_var(const char *s, int idx, t_minishell *minishell) { int i; t_environment *env; char *name; i = 0; - while (s[idx + i] && ft_isalpha(s[idx + i])) + while (expander_character_valid(s[idx + i])) i++; name = ft_substr(s, idx, i); - if (!name) - perror("name"); + if (!name || !*name) + return (NULL); env = environment_get(minishell->environment, name); free(name); return (env); } - -char *expander_parse_string(char *s, t_minishell *minishell) -{ - int i; - t_environment *env; - t_list *var_list; - - i = 0; - while (s[i]) - { - if (s[i] == '$') - { - env = get_var(s, i, minishell); - if (env) - ft_lstadd_back(&var_list, ft_lstnew(env->value)); - } - i++; - } - return ft_strdup(""); -} diff --git a/src/expander/expander_count_vars.c b/src/expander/expander_is_character.c similarity index 65% rename from src/expander/expander_count_vars.c rename to src/expander/expander_is_character.c index eceae4c..161a0c8 100644 --- a/src/expander/expander_count_vars.c +++ b/src/expander/expander_is_character.c @@ -1,29 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* expander_count_vars.c :+: :+: :+: */ +/* expander_is_character.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/18 20:38:17 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:39:53 by qmennen ### ########.fr */ +/* Created: 2025/02/19 13:15:11 by qmennen #+# #+# */ +/* Updated: 2025/02/19 13:15:55 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -size_t expander_count_vars(const char *s) +int expander_character_valid(const char c) { - size_t vars; - size_t i; - - i = 0; - vars = 0; - while (s[i]) - { - if (s[i] == '$' && ft_isalpha(s[i + 1])) - vars++; - i++; - } - return (vars); + return (ft_isalnum(c) || c == '_'); } diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c new file mode 100644 index 0000000..f5e1406 --- /dev/null +++ b/src/expander/expander_parse_string.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander_parse_string.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ +/* Updated: 2025/02/19 15:20:04 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static void free_variables(t_list *variables) +{ + t_list *current; + t_list *last; + + current = variables; + while (current) + { + last = current; + current = current->next; + free(last); + } +} + +char *expander_parse_string(char *s, t_minishell *minishell) +{ + t_list *variables; + t_list *current; + char *string; + int i; + int j; + + variables = expander_parse_variables(s, minishell); + string = expander_allocate_memory(s, variables); + i = 0; + j = 0; + current = variables; + while (s[i]) + { + if (s[i] == '$' && s[i + 1]) + { + i++; + i += expander_expand_dollar(s, string, &j, current); + if (current) + current = current->next; + } + else + string[j++] = s[i++]; + } + + string[j] = 0; + free_variables(variables); + return (string); +} diff --git a/src/expander/expander_parse_variables.c b/src/expander/expander_parse_variables.c new file mode 100644 index 0000000..b3e9023 --- /dev/null +++ b/src/expander/expander_parse_variables.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander_parse_variables.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/19 13:58:13 by qmennen #+# #+# */ +/* Updated: 2025/02/19 15:07:23 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_list *expander_parse_variables(const char *s, t_minishell *minishell) +{ + + int i; + t_list *var_list; + t_environment *env; + + i = 0; + var_list = NULL; + while (s[i]) + { + if (s[i] == '$') + { + env = expander_get_var(s, i + 1, minishell); + if (env) + ft_lstadd_back(&var_list, ft_lstnew(env)); + else + ft_lstadd_back(&var_list, ft_lstnew(NULL)); + } + i++; + } + return (var_list); +} diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 083240a..1bbd225 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */ +/* Updated: 2025/02/19 14:12:19 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index efa6e05..0cdb42b 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -31,6 +31,17 @@ static int count_cmds(t_list *list) return (cmds); } +static int parser_should_expand(t_list *value) +{ + t_token *token; + + token = (t_token *)value->content; + if (!token) + return (0); + return (token->type == T_DQWORD || (token->type == T_WORD && + token->value[0] == '$' && token->value[1])); +} + char **parser_get_arguments(t_list *list, t_minishell *minishell) { t_list *current; @@ -49,11 +60,11 @@ char **parser_get_arguments(t_list *list, t_minishell *minishell) i = -1; while ((++i) < cmds && current) { - if (((t_token *)current->content)->type == T_DQWORD) + if (parser_should_expand(current)) { args[i] = expander_parse_string(((t_token *)current->content)->value, minishell); } - if (((t_token *)current->content)->type == T_WORD || + else if (((t_token *)current->content)->type == T_WORD || ((t_token *)current->content)->type == T_SQWORD) args[i] = ft_strdup(((t_token *)current->content)->value); current = current->next; From b188c4c6ac01576851f273ef48829c300d4c822b Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 19 Feb 2025 16:50:24 +0100 Subject: [PATCH 019/103] fix source index --- src/expander/expander_expand_dollar.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/expander/expander_expand_dollar.c b/src/expander/expander_expand_dollar.c index 414e19c..1bf29a9 100644 --- a/src/expander/expander_expand_dollar.c +++ b/src/expander/expander_expand_dollar.c @@ -12,12 +12,12 @@ #include "minishell.h" -static int get_var_len(const char *source, int idx) +static int get_var_len(const char *source) { int i; - i = 0; - while (expander_character_valid(source[idx + i])) + i = 1; + while (expander_character_valid(source[i])) i++; return (i); } @@ -40,6 +40,8 @@ int expander_expand_dollar(char *src, char *dest, int *j, t_list *variables) } } else - v_len = get_var_len(src, (*j) + 1); + { + v_len = get_var_len(src); + } return (v_len); } From a2f5656b158b08e42be167556ec8004e945a8ce1 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 19 Feb 2025 16:54:00 +0100 Subject: [PATCH 020/103] oops --- src/expander/expander_parse_string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c index f5e1406..ec32807 100644 --- a/src/expander/expander_parse_string.c +++ b/src/expander/expander_parse_string.c @@ -44,7 +44,7 @@ char *expander_parse_string(char *s, t_minishell *minishell) if (s[i] == '$' && s[i + 1]) { i++; - i += expander_expand_dollar(s, string, &j, current); + i += expander_expand_dollar(s + i, string, &j, current); if (current) current = current->next; } From 1e0e78ee10b0873c3643073bbb728c6f5a60f93f Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 19 Feb 2025 17:30:12 +0100 Subject: [PATCH 021/103] update: readme --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4cfd029..2b17ca3 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ A lot of amazing shell stuff -[x] Get environment array (export) -[x] Set environment variable (export) -[x] Simple builtin export -- Preliminary signals +-[x] Preliminary signals -[x] Define struct for commands, something like ( ```c typedef struct s_command @@ -25,16 +25,16 @@ A lot of amazing shell stuff ``` ) - [x] Make the `executor`, run a command -- Make a parser to create a command list +- [x] Make a parser to create a command list - Add redirects, appends, pipe etc. File descriptor functions a command can have multiple redirects but only the last is used for stdout Redirects take precedence over pipes, but pipes are still created and managed. should it close the unused pipe-end? all redirects are opened and closed, but only last fd is used. multiple HEREDOCs can be nested, only last is used. - - - Expand \$ vars & support \$? + * $var [x] + * $? [0] - CB command to change banner - __Bonus:__ Command tree for &&, ||, * @@ -43,11 +43,13 @@ A lot of amazing shell stuff - `ctrl - C` redisplay prompt status 130 - `ctrl - D` exit shell - `ctrl - \` +-- Done ### During process - `ctrl - C` SIGINT to processs status 130 - `ctrl - D` - `ctrl - \` SIGQUIT to process core dumped status 131 +-- Shows ^C ### During HEREDOC - `ctrl - C` redisplay prompt status 130 From 4621fd2497e4bf1bd2b1b7b1b9195ea222d32bdf Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 19 Feb 2025 17:30:34 +0100 Subject: [PATCH 022/103] move token print to debug --- inc/debug.h | 1 + src/debug/print_commands.c | 9 +++++++++ src/main.c | 10 +--------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 934b75a..f26f569 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -16,5 +16,6 @@ # include "minishell.h" void print_commands(void *param); +void token_print(void *param); #endif diff --git a/src/debug/print_commands.c b/src/debug/print_commands.c index 88ed829..ed094e9 100644 --- a/src/debug/print_commands.c +++ b/src/debug/print_commands.c @@ -27,3 +27,12 @@ void print_commands(void *param) printf("%s ", command->args[i]); printf("\n"); } + +void token_print(void *param) +{ + t_token *token; + + token = (t_token *)param; + printf("token type %i, value %s\n", token->type, token->value); +} + diff --git a/src/main.c b/src/main.c index 1cabd60..c41507c 100644 --- a/src/main.c +++ b/src/main.c @@ -14,14 +14,6 @@ #include "minishell.h" #include "utils.h" -static void token_print(void *param) -{ - t_token *token; - - token = (t_token *)param; - printf("token type %i, value %s\n", token->type, token->value); -} - int main(int argc, char **argv, char **envp) { t_minishell *minishell; @@ -40,7 +32,7 @@ int main(int argc, char **argv, char **envp) break ; minishell->lexer = ft_lexer_new(minishell->line); minishell->tokens = ft_parse_input(minishell->lexer); - ft_lstiter(minishell->tokens, token_print); + //ft_lstiter(minishell->tokens, token_print); minishell->commands = parser_get_commands(minishell); simple_builtins(minishell); free_minishell_line(minishell); From 450add4cb7c5e7a9d1f05562439b7f84f72b420a Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 19 Feb 2025 17:56:57 +0100 Subject: [PATCH 023/103] fixed signal and removed infloop after unicode nofix --- .vscode/launch.json | 29 +++++++++++++++++++++++++++++ .vscode/tasks.json | 34 ++++++++++++++++++++++++++++++++++ Makefile | 4 ++-- inc/minishell.h | 4 +++- inc/signals.h | 3 ++- src/lexer/lexer_parse_input.c | 16 ++++++++-------- src/main.c | 4 ++-- src/signal/signal.c | 13 ++++++++++--- 8 files changed, 90 insertions(+), 17 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2c45ecc --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug minishell", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/minishell", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "Build minishell", + "miDebuggerPath": "/usr/bin/gdb", + "logging": { + "engineLogging": true + } + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..48db8a7 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,34 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build minishell", + "type": "shell", + "command": "make", + "args": [], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": ["$gcc"], + "detail": "Generated task for building minishell" + }, + { + "label": "Run minishell", + "type": "shell", + "command": "./minishell", + "args": [], + "group": { + "kind": "test", + "isDefault": true + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared" + }, + "problemMatcher": [] + } + ] +} diff --git a/Makefile b/Makefile index 2060049..3e41510 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: qmennen +#+ # # +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/19 12:18:18 by whaffman ######## odam.nl # +# Updated: 2025/02/19 17:43:13 by whaffman ######## odam.nl # # # # **************************************************************************** # @@ -32,7 +32,7 @@ CC = cc RM = rm -rf INCLUDES = -I./$(INC_PATH) -I./$(LIBFT_INC_PATH) -CFLAGS = -Wall -Wextra -Werror -fsanitize=address,undefined -MMD +CFLAGS = -Wall -Wextra -Werror -fsanitize=address,undefined -MMD -g3 UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) diff --git a/inc/minishell.h b/inc/minishell.h index ce63aa9..4f9e7fe 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:13 by whaffman #+# #+# */ -/* Updated: 2025/02/19 12:38:57 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 14:46:53 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -41,4 +41,6 @@ # define PROMPT RESET "🐚" GREEN "minishell" RESET ": " # define PROMPT_LEN 51 +void token_print(void *param); + #endif diff --git a/inc/signals.h b/inc/signals.h index 9d6d602..3d9ae46 100644 --- a/inc/signals.h +++ b/inc/signals.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/19 12:26:09 by whaffman #+# #+# */ -/* Updated: 2025/02/19 13:39:58 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 17:30:12 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,6 +17,7 @@ void sigint_heredoc_handler(int signum); void sigint_minishell_handler(int signum); +void sig_parent_handler(int signum); void signal_init_child(void); void signal_init_parent(void); void signal_init_minishell(void); diff --git a/src/lexer/lexer_parse_input.c b/src/lexer/lexer_parse_input.c index 861e4eb..5f1625d 100644 --- a/src/lexer/lexer_parse_input.c +++ b/src/lexer/lexer_parse_input.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* lexer_parse_input.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:09:26 by qmennen ### ########.fr */ +/* :::::::: */ +/* lexer_parse_input.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ +/* Updated: 2025/02/19 17:53:12 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -32,7 +32,7 @@ t_list *ft_parse_input(t_lexer *lexer) while (TRUE) { token = ft_token_next(lexer); - if (token->type == T_EOF) + if (token->type == T_EOF || token->type == T_ERROR) //TODO T_ERROR removes the inf loop break ; ft_lstadd_back(&list, ft_lstnew(token)); } diff --git a/src/main.c b/src/main.c index 4b03161..eb766f3 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ -/* Updated: 2025/02/19 12:48:13 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 14:46:41 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ #include "minishell.h" #include "utils.h" -static void token_print(void *param) +void token_print(void *param) { t_token *token; diff --git a/src/signal/signal.c b/src/signal/signal.c index fa03468..0b81082 100644 --- a/src/signal/signal.c +++ b/src/signal/signal.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/19 12:18:47 by whaffman #+# #+# */ -/* Updated: 2025/02/19 13:42:55 by whaffman ######## odam.nl */ +/* Updated: 2025/02/19 17:30:12 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -31,6 +31,13 @@ void sigint_heredoc_handler(int signum) exit(130); } +void sig_parent_handler(int signum) +{ + (void)signum; + ft_putstr_fd("\n", 1); +} + + void signal_init_minishell(void) { signal(SIGINT, sigint_minishell_handler); @@ -39,8 +46,8 @@ void signal_init_minishell(void) void signal_init_parent(void) { - signal(SIGINT, SIG_IGN); - signal(SIGQUIT, SIG_IGN); + signal(SIGINT, sig_parent_handler); + signal(SIGQUIT, sig_parent_handler); } From d289065adea5b67fb76b2d64766c96119a9a52ba Mon Sep 17 00:00:00 2001 From: whaffman Date: Thu, 20 Feb 2025 11:43:15 +0100 Subject: [PATCH 024/103] feat: builtin router, checker and buitlin stubs --- Makefile | 5 ++-- inc/builtin.h | 27 +++++++++++++++++++++ inc/minishell.h | 3 ++- inc/typedef.h | 6 ++++- src/builtin/builtin_cd.c | 20 ++++++++++++++++ src/builtin/builtin_echo.c | 20 ++++++++++++++++ src/builtin/builtin_env.c | 20 ++++++++++++++++ src/builtin/builtin_exit.c | 20 ++++++++++++++++ src/builtin/builtin_export.c | 20 ++++++++++++++++ src/builtin/builtin_pwd.c | 20 ++++++++++++++++ src/builtin/builtin_router.c | 30 ++++++++++++++++++++++++ src/builtin/builtin_unset.c | 27 +++++++++++++++++++++ src/builtin/is_builtin.c | 29 +++++++++++++++++++++++ src/{utils => builtin}/simple_builtins.c | 6 ++--- src/lexer/lexer_token_next.c | 17 ++++++++------ 15 files changed, 256 insertions(+), 14 deletions(-) create mode 100644 inc/builtin.h create mode 100644 src/builtin/builtin_cd.c create mode 100644 src/builtin/builtin_echo.c create mode 100644 src/builtin/builtin_env.c create mode 100644 src/builtin/builtin_exit.c create mode 100644 src/builtin/builtin_export.c create mode 100644 src/builtin/builtin_pwd.c create mode 100644 src/builtin/builtin_router.c create mode 100644 src/builtin/builtin_unset.c create mode 100644 src/builtin/is_builtin.c rename src/{utils => builtin}/simple_builtins.c (94%) diff --git a/Makefile b/Makefile index 5e2c101..634f3cc 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: qmennen +#+ # # +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/19 17:43:13 by whaffman ######## odam.nl # +# Updated: 2025/02/20 11:10:42 by whaffman ######## odam.nl # # # # **************************************************************************** # @@ -22,7 +22,8 @@ LIBFT = $(LIBFT_PATH)/libft.a OBJ_PATH = obj -VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils:src/executor:src/parser:src/expander:src/debug:src/signal +VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils: +VPATH += src/executor:src/parser:src/expander:src/debug:src/signal:src/builtin SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) diff --git a/inc/builtin.h b/inc/builtin.h new file mode 100644 index 0000000..b9c8182 --- /dev/null +++ b/inc/builtin.h @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* builtin.h :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:09:02 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:38:58 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#ifndef BUILTIN_H +# define BUILTIN_H +# include "minishell.h" + +int is_builtin(char *cmd); +int builtin_router(t_minishell *minishell, t_command *cmd); +int builtin_echo(t_minishell *minishell, t_command *cmd); +int builtin_cd(t_minishell *minishell, t_command *cmd); +int builtin_pwd(t_minishell *minishell, t_command *cmd); +int builtin_export(t_minishell *minishell, t_command *cmd); +int builtin_unset(t_minishell *minishell, t_command *cmd); +int builtin_env(t_minishell *minishell, t_command *cmd); +int builtin_exit(t_minishell *minishell, t_command *cmd); + +#endif // BUILTIN_H diff --git a/inc/minishell.h b/inc/minishell.h index bf6d561..27bca6a 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:13 by whaffman #+# #+# */ -/* Updated: 2025/02/19 14:46:53 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 11:35:24 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,6 +20,7 @@ # include "environment.h" # include "prompt.h" # include "tokenizer.h" +# include "builtin.h" # include "executor.h" # include "parser.h" # include "expander.h" diff --git a/inc/typedef.h b/inc/typedef.h index c3b4b8a..a09131e 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -6,13 +6,15 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/18 14:34:39 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 11:37:00 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #ifndef TYPEDEF_H # define TYPEDEF_H + + typedef enum e_token_type { T_WORD, @@ -69,4 +71,6 @@ typedef struct s_minishell t_list *tokens; t_list *commands; } t_minishell; + +typedef int (*t_builtin_fn)(t_minishell *, t_command *); #endif // TYPEDEF_H diff --git a/src/builtin/builtin_cd.c b/src/builtin/builtin_cd.c new file mode 100644 index 0000000..118948e --- /dev/null +++ b/src/builtin/builtin_cd.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* builtin_cd.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:33:07 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:38:03 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_cd(t_minishell *minishell, t_command *cmd) +{ + (void)minishell; + (void)cmd; + return (SUCCESS); +} diff --git a/src/builtin/builtin_echo.c b/src/builtin/builtin_echo.c new file mode 100644 index 0000000..a800250 --- /dev/null +++ b/src/builtin/builtin_echo.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* builtin_echo.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:33:05 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:38:10 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_echo(t_minishell *minishell, t_command *cmd) +{ + (void)minishell; + (void)cmd; + return (SUCCESS); +} diff --git a/src/builtin/builtin_env.c b/src/builtin/builtin_env.c new file mode 100644 index 0000000..76ed25f --- /dev/null +++ b/src/builtin/builtin_env.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* builtin_env.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:33:02 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:38:17 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_env(t_minishell *minishell, t_command *cmd) +{ + (void)minishell; + (void)cmd; + return (SUCCESS); +} diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c new file mode 100644 index 0000000..3e9086f --- /dev/null +++ b/src/builtin/builtin_exit.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* builtin_exit.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:38:25 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_exit(t_minishell *minishell, t_command *cmd) +{ + (void)minishell; + (void)cmd; + return (SUCCESS); +} diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c new file mode 100644 index 0000000..99a8236 --- /dev/null +++ b/src/builtin/builtin_export.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* builtin_export.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:38:32 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_export(t_minishell *minishell, t_command *cmd) +{ + (void)minishell; + (void)cmd; + return (SUCCESS); +} diff --git a/src/builtin/builtin_pwd.c b/src/builtin/builtin_pwd.c new file mode 100644 index 0000000..c47db48 --- /dev/null +++ b/src/builtin/builtin_pwd.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* builtin_pwd.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:32:28 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:38:37 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_pwd(t_minishell *minishell, t_command *cmd) +{ + (void)minishell; + (void)cmd; + return (SUCCESS); +} diff --git a/src/builtin/builtin_router.c b/src/builtin/builtin_router.c new file mode 100644 index 0000000..584fb2f --- /dev/null +++ b/src/builtin/builtin_router.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* builtin_router.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:12:38 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:41:28 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_router(t_minishell *minishell, t_command *cmd) +{ + const t_builtin_fn builtin_fn[] = { + builtin_echo, + builtin_cd, + builtin_pwd, + builtin_export, + builtin_unset, + builtin_env, + builtin_exit}; + + if (!is_builtin(cmd->args[0])) + return (FALSE); + builtin_fn[is_builtin(cmd->args[0])](minishell, cmd); + return (TRUE); +} diff --git a/src/builtin/builtin_unset.c b/src/builtin/builtin_unset.c new file mode 100644 index 0000000..834fad5 --- /dev/null +++ b/src/builtin/builtin_unset.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* builtin_unset.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:25:43 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:31:25 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int builtin_unset(t_minishell *minishell, t_command *cmd) +{ + int i; + + i = 1; + while (cmd->args[i] != NULL) + { + if (environment_get(minishell->environment, cmd->args[i]) != NULL) + environment_del(&(minishell->environment), cmd->args[i]); + i++; + } + return (SUCCESS); +} diff --git a/src/builtin/is_builtin.c b/src/builtin/is_builtin.c new file mode 100644 index 0000000..a9eca66 --- /dev/null +++ b/src/builtin/is_builtin.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* is_builtin.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:03:33 by whaffman #+# #+# */ +/* Updated: 2025/02/20 11:12:25 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int is_builtin(char *cmd) +{ + const char *builtins[] = {"echo", "cd", "pwd", "export", + "unset", "env", "exit", NULL}; + int i; + + i = 0; + while (builtins[i]) + { + if (ft_strcmp(cmd, builtins[i]) == 0) + return (1); + i++; + } + return (FALSE); +} diff --git a/src/utils/simple_builtins.c b/src/builtin/simple_builtins.c similarity index 94% rename from src/utils/simple_builtins.c rename to src/builtin/simple_builtins.c index 922f38a..71988f2 100644 --- a/src/utils/simple_builtins.c +++ b/src/builtin/simple_builtins.c @@ -6,13 +6,13 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:21:39 by whaffman #+# #+# */ -/* Updated: 2025/02/18 15:49:36 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 11:42:29 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void builtin_export(t_minishell *minishell) +void builtin_export_simple(t_minishell *minishell) { t_list *tmp; t_environment *env; @@ -93,7 +93,7 @@ void simple_builtins(t_minishell *minishell) exit(EXIT_SUCCESS); } else if (cmp_value(minishell->tokens, "export")) - builtin_export(minishell); + builtin_export_simple(minishell); else if (cmp_value(minishell->tokens, "unset")) { environment_del(&(minishell->environment), diff --git a/src/lexer/lexer_token_next.c b/src/lexer/lexer_token_next.c index 0aab9db..d419c8c 100644 --- a/src/lexer/lexer_token_next.c +++ b/src/lexer/lexer_token_next.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* lexer_token_next.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */ +/* :::::::: */ +/* lexer_token_next.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ +/* Updated: 2025/02/20 10:39:50 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -68,6 +68,9 @@ t_token *ft_token_next(t_lexer *lexer) free(word); } else + { token = token_new(T_ERROR, NULL, current_pos); + printf("token->type: %d\n", token->type); + } return (token); } From eda29542798ca4c29da5cf8d4be98a088389806b Mon Sep 17 00:00:00 2001 From: whaffman Date: Thu, 20 Feb 2025 15:10:38 +0100 Subject: [PATCH 025/103] builtins working --- src/builtin/builtin_cd.c | 27 +++++++++-- src/builtin/builtin_echo.c | 22 ++++++++- src/builtin/builtin_env.c | 4 +- src/builtin/builtin_exit.c | 5 +- src/builtin/builtin_export.c | 29 +++++++++-- src/builtin/builtin_pwd.c | 7 ++- src/builtin/builtin_router.c | 2 +- src/builtin/builtin_unset.c | 2 +- src/builtin/is_builtin.c | 4 +- src/builtin/simple_builtins.c | 90 ++--------------------------------- 10 files changed, 88 insertions(+), 104 deletions(-) diff --git a/src/builtin/builtin_cd.c b/src/builtin/builtin_cd.c index 118948e..664cea8 100644 --- a/src/builtin/builtin_cd.c +++ b/src/builtin/builtin_cd.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:33:07 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:38:03 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 12:49:36 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,7 +14,28 @@ int builtin_cd(t_minishell *minishell, t_command *cmd) { - (void)minishell; - (void)cmd; + t_environment *env; + char *path; + + if (cmd->args[1] == NULL) + { + env = environment_get(minishell->environment, "HOME"); + if (env == NULL || env->value == NULL) + { + ft_putendl_fd("minishell: cd: HOME not set", STDERR_FILENO); + return (FAILURE); + } + path = env->value; + } + else + path = cmd->args[1]; + if (chdir(path) == -1) + { + ft_putstr_fd("minishell: cd: ", STDERR_FILENO); + ft_putstr_fd(path, STDERR_FILENO); + ft_putstr_fd(": ", STDERR_FILENO); + ft_putendl_fd(strerror(errno), STDERR_FILENO); + return (FAILURE); + } return (SUCCESS); } diff --git a/src/builtin/builtin_echo.c b/src/builtin/builtin_echo.c index a800250..cd545b3 100644 --- a/src/builtin/builtin_echo.c +++ b/src/builtin/builtin_echo.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:33:05 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:38:10 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 12:37:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,7 +14,25 @@ int builtin_echo(t_minishell *minishell, t_command *cmd) { + int i; + int n_flag; + (void)minishell; - (void)cmd; + i = 1; + n_flag = 0; + if (cmd->args[i] != NULL && ft_strncmp(cmd->args[i], "-n", 3) == 0) + { + n_flag = 1; + i++; + } + while (cmd->args[i] != NULL) + { + printf("%s", cmd->args[i]); + if (cmd->args[i + 1] != NULL) + printf(" "); + i++; + } + if (!n_flag) + printf("\n"); return (SUCCESS); } diff --git a/src/builtin/builtin_env.c b/src/builtin/builtin_env.c index 76ed25f..42a119a 100644 --- a/src/builtin/builtin_env.c +++ b/src/builtin/builtin_env.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:33:02 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:38:17 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 12:17:10 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ int builtin_env(t_minishell *minishell, t_command *cmd) { - (void)minishell; (void)cmd; + environment_print(minishell->environment); return (SUCCESS); } diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c index 3e9086f..954bc28 100644 --- a/src/builtin/builtin_exit.c +++ b/src/builtin/builtin_exit.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:38:25 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 12:17:40 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,7 +14,8 @@ int builtin_exit(t_minishell *minishell, t_command *cmd) { - (void)minishell; (void)cmd; + free_minishell(minishell); + exit(EXIT_SUCCESS); return (SUCCESS); } diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c index 99a8236..38dccbc 100644 --- a/src/builtin/builtin_export.c +++ b/src/builtin/builtin_export.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:38:32 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 12:30:21 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,7 +14,30 @@ int builtin_export(t_minishell *minishell, t_command *cmd) { - (void)minishell; - (void)cmd; + t_environment *env; + char **arr; + int i; + + i = 1; + while (cmd->args[i] != NULL) + { + arr = ft_split(cmd->args[i], '='); + if (arr[1] == NULL) + { + ft_free_arr(arr); + i++; + continue ; + } + env = environment_get(minishell->environment, arr[0]); + if (env != NULL) + { + free(env->value); + env->value = ft_strdup(arr[1]); //TODO: malloc check + } + else + environment_add(&(minishell->environment), arr[0], arr[1]); + ft_free_arr(arr); + i++; + } return (SUCCESS); } diff --git a/src/builtin/builtin_pwd.c b/src/builtin/builtin_pwd.c index c47db48..01df7c3 100644 --- a/src/builtin/builtin_pwd.c +++ b/src/builtin/builtin_pwd.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:28 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:38:37 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 13:57:01 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,7 +14,12 @@ int builtin_pwd(t_minishell *minishell, t_command *cmd) { + char *cwd; + (void)minishell; (void)cmd; + cwd = getcwd(NULL, 0); + printf("%s\n", cwd); + free(cwd); return (SUCCESS); } diff --git a/src/builtin/builtin_router.c b/src/builtin/builtin_router.c index 584fb2f..d28be54 100644 --- a/src/builtin/builtin_router.c +++ b/src/builtin/builtin_router.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:12:38 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:41:28 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 13:56:10 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ diff --git a/src/builtin/builtin_unset.c b/src/builtin/builtin_unset.c index 834fad5..9bef151 100644 --- a/src/builtin/builtin_unset.c +++ b/src/builtin/builtin_unset.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:25:43 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:31:25 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 15:04:59 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ diff --git a/src/builtin/is_builtin.c b/src/builtin/is_builtin.c index a9eca66..30510d1 100644 --- a/src/builtin/is_builtin.c +++ b/src/builtin/is_builtin.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:03:33 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:12:25 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 13:54:04 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ int is_builtin(char *cmd) while (builtins[i]) { if (ft_strcmp(cmd, builtins[i]) == 0) - return (1); + return (i); i++; } return (FALSE); diff --git a/src/builtin/simple_builtins.c b/src/builtin/simple_builtins.c index 71988f2..992b67d 100644 --- a/src/builtin/simple_builtins.c +++ b/src/builtin/simple_builtins.c @@ -6,101 +6,17 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:21:39 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:42:29 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 15:06:40 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void builtin_export_simple(t_minishell *minishell) -{ - t_list *tmp; - t_environment *env; - char **arr; - - tmp = minishell->tokens->next; - while (tmp != NULL) - { - arr = ft_split(((t_token *)tmp->content)->value, '='); - if (arr[1] == NULL) - { - ft_free_arr(arr); - tmp = tmp->next; - continue ; - } - env = environment_get(minishell->environment, arr[0]); - if (env != NULL) - { - free(env->value); - env->value = ft_strdup(arr[1]); - } - else - environment_add(&(minishell->environment), arr[0], arr[1]); - ft_free_arr(arr); - tmp = tmp->next; - } -} - -static int cmp_value(t_list *list, char *str) -{ - if (list != NULL - && ft_strncmp( - ((t_token *)list->content)->value, - str, - ft_strlen(str) + 1) == 0) - return (TRUE); - return (FALSE); -} - -void fork_execve(t_minishell *minishell, char *path, char **argv) -{ - pid_t pid; - int status; - - pid = fork(); - if (pid == 0) - { - execve(path, argv, environment_get_arr(minishell->environment)); - while (*argv != NULL) - printf("%s\n", *argv++); - printf("minishell->: %s: %s\n", path, strerror(errno)); - exit(EXIT_FAILURE); - } - else if (pid < 0) - { - printf("minishell: %s\n", strerror(errno)); - } - else - { - free(path); - ft_free_arr(argv); - waitpid(pid, &status, 0); - printf("exit status of pid(%d): %d\n", pid, (((status) & 0xff00) >> 8)); - } -} void simple_builtins(t_minishell *minishell) { - if (!minishell->tokens) + if (minishell->commands == NULL) return ; - if (cmp_value(minishell->tokens, "clear")) - printf("\033[2J\033[1;1H"); - else if (cmp_value(minishell->tokens, "env")) - environment_print(minishell->environment); - else if (cmp_value(minishell->tokens, "exit")) - { - free_minishell(minishell); - exit(EXIT_SUCCESS); - } - else if (cmp_value(minishell->tokens, "export")) - builtin_export_simple(minishell); - else if (cmp_value(minishell->tokens, "unset")) - { - environment_del(&(minishell->environment), - ((t_token *)minishell->tokens->next->content)->value); - } - else - { + if (!builtin_router(minishell, minishell->commands->content)) executor_execute_pipeline(minishell); - } } From a93185a45e6029cb0a12a81550c6c63c7603f616 Mon Sep 17 00:00:00 2001 From: whaffman Date: Thu, 20 Feb 2025 15:54:48 +0100 Subject: [PATCH 026/103] fixe builtin exit to accept arguments --- README.md | 3 ++- src/builtin/builtin_exit.c | 29 +++++++++++++++++++++++++---- src/builtin/is_builtin.c | 3 ++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2b17ca3..7ba4ee1 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ A lot of amazing shell stuff -[x] Get environment array (export) -[x] Set environment variable (export) -[x] Simple builtin export +-[x] builtins -[x] Preliminary signals -[x] Define struct for commands, something like ( ```c @@ -49,7 +50,7 @@ A lot of amazing shell stuff - `ctrl - C` SIGINT to processs status 130 - `ctrl - D` - `ctrl - \` SIGQUIT to process core dumped status 131 --- Shows ^C +-- Shows ^C ### During HEREDOC - `ctrl - C` redisplay prompt status 130 diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c index 954bc28..d27d981 100644 --- a/src/builtin/builtin_exit.c +++ b/src/builtin/builtin_exit.c @@ -6,16 +6,37 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ -/* Updated: 2025/02/20 12:17:40 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 15:54:11 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" + int builtin_exit(t_minishell *minishell, t_command *cmd) { - (void)cmd; + int exit_status; + + exit_status = 0; //TODO EXIT last exit status + if (ft_count_arr(cmd->args) > 2) + { + ft_putstr_fd("exit\n", STDERR_FILENO); + ft_putstr_fd("minishell: exit: too many arguments\n", STDERR_FILENO); + return (FAILURE); + } + if (ft_count_arr(cmd->args) == 2 && cmd->args[1] != NULL) + { + if (ft_isdigit_str(cmd->args[1]) == FALSE) + { + ft_putstr_fd("exit\n", STDERR_FILENO); + ft_putstr_fd("minishell: exit: ", STDERR_FILENO); + ft_putstr_fd(cmd->args[1], STDERR_FILENO); + ft_putstr_fd(": numeric argument required\n", STDERR_FILENO); + return (FAILURE); + } + exit_status = ft_atoi(cmd->args[1]); + } free_minishell(minishell); - exit(EXIT_SUCCESS); - return (SUCCESS); + exit(exit_status); + return (FAILURE); } diff --git a/src/builtin/is_builtin.c b/src/builtin/is_builtin.c index 30510d1..8fe1345 100644 --- a/src/builtin/is_builtin.c +++ b/src/builtin/is_builtin.c @@ -6,12 +6,13 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:03:33 by whaffman #+# #+# */ -/* Updated: 2025/02/20 13:54:04 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 15:36:16 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" + int is_builtin(char *cmd) { const char *builtins[] = {"echo", "cd", "pwd", "export", From 3fdfebea7b0ad489b66e947019a786af9fc6c449 Mon Sep 17 00:00:00 2001 From: whaffman Date: Thu, 20 Feb 2025 15:55:53 +0100 Subject: [PATCH 027/103] libft update --- lib/libft | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libft b/lib/libft index 8072c13..5944b0f 160000 --- a/lib/libft +++ b/lib/libft @@ -1 +1 @@ -Subproject commit 8072c13f1e064dabf7249e2f148aa6111660dab0 +Subproject commit 5944b0f8116007fd65a4224750cc4cdbf7ac9952 From a9f356176f0f7f91f9257249766a02b0d0f61f7b Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 20 Feb 2025 17:54:34 +0100 Subject: [PATCH 028/103] redirect setup --- inc/typedef.h | 22 +++++++++++++++------- src/expander/expander_parse_string.c | 3 ++- src/lexer/lexer_parse_input.c | 15 ++++++++------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/inc/typedef.h b/inc/typedef.h index a09131e..a5e6799 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* typedef.h :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:37:00 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* typedef.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ +/* Updated: 2025/02/20 16:45:55 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -52,11 +52,19 @@ typedef struct s_lexer char current_char; } t_lexer; +typedef struct s_redirect +{ + enum e_token_type type; + char *value; +} t_redirect; + typedef struct s_command { char *command; char **args; t_list *environment; + t_list *redirect_in; + t_list *redirect_out; int fd_in; int fd_out; int n_fds; diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c index ec32807..25b7b27 100644 --- a/src/expander/expander_parse_string.c +++ b/src/expander/expander_parse_string.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/19 15:20:04 by qmennen ### ########.fr */ +/* Updated: 2025/02/20 16:38:28 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -51,6 +51,7 @@ char *expander_parse_string(char *s, t_minishell *minishell) else string[j++] = s[i++]; } + //TODO: Figure out why echo "> echo "\as"" breaks string[j] = 0; free_variables(variables); diff --git a/src/lexer/lexer_parse_input.c b/src/lexer/lexer_parse_input.c index a85c561..2182c21 100644 --- a/src/lexer/lexer_parse_input.c +++ b/src/lexer/lexer_parse_input.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* lexer_parse_input.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ -/* Updated: 2025/02/19 17:59:44 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* lexer_parse_input.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ +/* Updated: 2025/02/20 16:42:39 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,6 +31,7 @@ t_list *ft_parse_input(t_lexer *lexer) list = NULL; while (TRUE) { + //TODO: Check if unicode support is viable token = ft_token_next(lexer); if (token->type == T_EOF || token->type == T_ERROR) //TODO T_ERROR removes the inf loop break ; From 8da0e0a0361c9e16e9ff961f3ddcc781514b6aa5 Mon Sep 17 00:00:00 2001 From: whaffman Date: Thu, 20 Feb 2025 18:09:28 +0100 Subject: [PATCH 029/103] error_msg and safe strdup strjoin and malloc --- inc/utils.h | 7 ++++++- src/utils/check_malloc.c | 23 +++++++++++++++++++++++ src/utils/error_msg.c | 34 ++++++++++++++++++++++++++++++++++ src/utils/ft_malloc_safe.c | 22 ++++++++++++++++++++++ src/utils/ft_strdup_safe.c | 22 ++++++++++++++++++++++ src/utils/ft_strjoin_safe.c | 23 +++++++++++++++++++++++ 6 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 src/utils/check_malloc.c create mode 100644 src/utils/error_msg.c create mode 100644 src/utils/ft_malloc_safe.c create mode 100644 src/utils/ft_strdup_safe.c create mode 100644 src/utils/ft_strjoin_safe.c diff --git a/inc/utils.h b/inc/utils.h index d374f75..36087dc 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:06:35 by whaffman #+# #+# */ -/* Updated: 2025/02/05 16:23:21 by whaffman ######## odam.nl */ +/* Updated: 2025/02/20 18:07:19 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,5 +20,10 @@ t_minishell *init_minishell(void); void print_banner(void); void print_list(void *content); void simple_builtins(t_minishell *minishell); +void error_msg(char *func, char *msg); +void check_malloc(void *ptr); +char *ft_strdup_safe(const char *str); +char *ft_strjoin_safe(const char *s1, const char *s2); +void *ft_malloc_safe(size_t size); #endif // UTILS_H diff --git a/src/utils/check_malloc.c b/src/utils/check_malloc.c new file mode 100644 index 0000000..a7ae1d5 --- /dev/null +++ b/src/utils/check_malloc.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* check_malloc.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 18:00:10 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:01:08 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + + +void check_malloc(void *ptr) +{ + if (ptr == NULL) + { + error_msg("malloc", "can't allocate memory"); + exit(1); + } +} diff --git a/src/utils/error_msg.c b/src/utils/error_msg.c new file mode 100644 index 0000000..bb985e4 --- /dev/null +++ b/src/utils/error_msg.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* error_msg.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 17:03:13 by whaffman #+# #+# */ +/* Updated: 2025/02/20 17:59:36 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + + +void error_msg(char *func, char *msg) +{ + if (errno) + perror(RED BOLD "minishell" RESET); + else + { + ft_putstr_fd(RED BOLD "minishell" RESET ": ", 2); + if (func != NULL) + { + ft_putstr_fd(func, 2); + ft_putstr_fd(": ", 2); + } + if (msg != NULL) + ft_putstr_fd(msg, 2); + else + ft_putstr_fd("general error", 2); + ft_putstr_fd("\n", 2); + } +} diff --git a/src/utils/ft_malloc_safe.c b/src/utils/ft_malloc_safe.c new file mode 100644 index 0000000..eeb6923 --- /dev/null +++ b/src/utils/ft_malloc_safe.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* ft_malloc_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 18:06:46 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:07:00 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void *ft_malloc_safe(size_t size) +{ + void *ptr; + + ptr = malloc(size); + check_malloc(ptr); + return (ptr); +} diff --git a/src/utils/ft_strdup_safe.c b/src/utils/ft_strdup_safe.c new file mode 100644 index 0000000..c0fe7fb --- /dev/null +++ b/src/utils/ft_strdup_safe.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* ft_strdup_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 18:01:27 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:04:53 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *ft_strdup_safe(const char *str) +{ + char *new_str; + + new_str = ft_strdup(str); + check_malloc(new_str); + return (new_str); +} diff --git a/src/utils/ft_strjoin_safe.c b/src/utils/ft_strjoin_safe.c new file mode 100644 index 0000000..27c8d0f --- /dev/null +++ b/src/utils/ft_strjoin_safe.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* ft_strjoin_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 18:02:31 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:04:23 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *ft_strjoin_safe(const char *s1, const char *s2) +{ + char *new_str; + + new_str = ft_strjoin(s1, s2); + check_malloc(new_str); + return (new_str); +} + From 3631e127e4b8085de880fb437f53116b6cbcdf2a Mon Sep 17 00:00:00 2001 From: whaffman Date: Fri, 21 Feb 2025 13:03:49 +0100 Subject: [PATCH 030/103] redirects and fds+count --- inc/executor.h | 9 +++--- src/executor/executor_count_fds.c | 33 ++++++++++++++++++++ src/executor/executor_create_pipes.c | 5 +-- src/executor/executor_create_redirects.c | 28 +++++++++++++++++ src/executor/executor_execute_pipeline.c | 3 +- src/executor/executor_open_fds.c | 39 ++++++++++++++++++++++++ 6 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 src/executor/executor_count_fds.c create mode 100644 src/executor/executor_create_redirects.c create mode 100644 src/executor/executor_open_fds.c diff --git a/inc/executor.h b/inc/executor.h index 61d0075..7fdb68e 100644 --- a/inc/executor.h +++ b/inc/executor.h @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:06:07 by willem #+# #+# */ -/* Updated: 2025/02/18 15:45:27 by whaffman ######## odam.nl */ +/* Updated: 2025/02/21 13:01:39 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -21,9 +21,8 @@ pid_t executor_fork(t_command *command); void executor_create_pipes(t_minishell *minishell); int executor_execute_pipeline(t_minishell *minishell); void executor_close_fds(int n_fds); - - - - +int executor_count_fds(t_minishell *minishell); +int executor_open_fds(t_list *redirect_list); +void executor_create_redirects(t_minishell *minishell); #endif // EXECUTOR_H diff --git a/src/executor/executor_count_fds.c b/src/executor/executor_count_fds.c new file mode 100644 index 0000000..b1c1dea --- /dev/null +++ b/src/executor/executor_count_fds.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* executor_count_fds.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/21 12:42:26 by whaffman #+# #+# */ +/* Updated: 2025/02/21 12:46:00 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int executor_count_fds(t_minishell *minishell) +{ + int fd; + int count; + t_list *current; + t_command *command; + + + current = minishell->commands; + count = (ft_lstsize(current) - 1) * 2; + while (current) + { + command = (t_command *)current->content; + count += ft_lstsize(command->redirect_in); + count += ft_lstsize(command->redirect_out); + current = current->next; + } + return (count); +} diff --git a/src/executor/executor_create_pipes.c b/src/executor/executor_create_pipes.c index d2306ac..6c24ff5 100644 --- a/src/executor/executor_create_pipes.c +++ b/src/executor/executor_create_pipes.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:22 by willem #+# #+# */ -/* Updated: 2025/02/13 14:58:49 by whaffman ######## odam.nl */ +/* Updated: 2025/02/21 12:48:04 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -29,6 +29,7 @@ void executor_create_pipes(t_minishell *minishell) t_command *command; int fd[2]; int fd_in; + const int n_fds = executor_count_fds(minishell); fd_in = 0; current = minishell->commands; @@ -43,7 +44,7 @@ void executor_create_pipes(t_minishell *minishell) else command->fd_out = 1; command->fd_in = fd_in; - command->n_fds = (ft_lstsize(minishell->commands) - 1) * 2; + command->n_fds = n_fds; fd_in = fd[0]; current = current->next; } diff --git a/src/executor/executor_create_redirects.c b/src/executor/executor_create_redirects.c new file mode 100644 index 0000000..e9c4caa --- /dev/null +++ b/src/executor/executor_create_redirects.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* executor_create_redirects.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/21 13:00:00 by whaffman #+# #+# */ +/* Updated: 2025/02/21 13:00:11 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void executor_create_redirects(t_minishell *minishell) +{ + t_list *current; + t_command *command; + + current = minishell->commands; + while (current) + { + command = (t_command *)current->content; + command->fd_in = executor_open_fds(command->redirect_in); + command->fd_out = executor_open_fds(command->redirect_out); + current = current->next; + } +} diff --git a/src/executor/executor_execute_pipeline.c b/src/executor/executor_execute_pipeline.c index 1d75caf..3182355 100644 --- a/src/executor/executor_execute_pipeline.c +++ b/src/executor/executor_execute_pipeline.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:02 by willem #+# #+# */ -/* Updated: 2025/02/19 13:40:45 by whaffman ######## odam.nl */ +/* Updated: 2025/02/21 12:49:21 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,6 +20,7 @@ int executor_execute_pipeline(t_minishell *minishell) int exit_status; executor_create_pipes(minishell); + executor_create_redirects(minishell); current = minishell->commands; last_pid = 0; while (current) diff --git a/src/executor/executor_open_fds.c b/src/executor/executor_open_fds.c new file mode 100644 index 0000000..9c104ca --- /dev/null +++ b/src/executor/executor_open_fds.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* executor_open_fds.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/21 12:50:42 by whaffman #+# #+# */ +/* Updated: 2025/02/21 12:59:41 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int executor_open_fds(t_list *redirect_list) +{ + t_redirect *redirect; + int fd; + + fd = 0; + while (redirect_list) + { + redirect = (t_redirect *)redirect_list->content; + if (redirect->type == T_REDIRECT_IN) + fd = open(redirect->value, O_RDONLY); + else if (redirect->type == T_REDIRECT_OUT) + fd = open(redirect->value, O_WRONLY | O_CREAT | O_TRUNC, 0644); + else if (redirect->type == T_APPEND_OUT) + fd = open(redirect->value, O_WRONLY | O_CREAT | O_APPEND, 0644); + if (fd < 0) + { + error_msg("executor_open_fds", "can't open file"); + return (fd); + } + redirect_list = redirect_list->next; + } + return (fd); + +} From 8c02b32601fbc70aa28023f9b9534a55ec1801bf Mon Sep 17 00:00:00 2001 From: whaffman Date: Fri, 21 Feb 2025 13:17:22 +0100 Subject: [PATCH 031/103] dont throw away of_fd before testing the new one --- inc/executor.h | 4 ++-- src/executor/executor_count_fds.c | 8 +++----- src/executor/executor_create_redirects.c | 10 +++++----- src/executor/executor_execute_pipeline.c | 2 +- src/executor/executor_open_fds.c | 8 ++++---- src/parser/parser_new_command.c | 18 +++++++++++------- 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/inc/executor.h b/inc/executor.h index 7fdb68e..82ec74f 100644 --- a/inc/executor.h +++ b/inc/executor.h @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:06:07 by willem #+# #+# */ -/* Updated: 2025/02/21 13:01:39 by whaffman ######## odam.nl */ +/* Updated: 2025/02/21 13:16:29 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ void executor_create_pipes(t_minishell *minishell); int executor_execute_pipeline(t_minishell *minishell); void executor_close_fds(int n_fds); int executor_count_fds(t_minishell *minishell); -int executor_open_fds(t_list *redirect_list); +int executor_open_fds(t_list *redirect_list, int og_fd); void executor_create_redirects(t_minishell *minishell); #endif // EXECUTOR_H diff --git a/src/executor/executor_count_fds.c b/src/executor/executor_count_fds.c index b1c1dea..f478882 100644 --- a/src/executor/executor_count_fds.c +++ b/src/executor/executor_count_fds.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/21 12:42:26 by whaffman #+# #+# */ -/* Updated: 2025/02/21 12:46:00 by whaffman ######## odam.nl */ +/* Updated: 2025/02/21 13:05:55 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,12 +14,10 @@ int executor_count_fds(t_minishell *minishell) { - int fd; - int count; - t_list *current; + int count; + t_list *current; t_command *command; - current = minishell->commands; count = (ft_lstsize(current) - 1) * 2; while (current) diff --git a/src/executor/executor_create_redirects.c b/src/executor/executor_create_redirects.c index e9c4caa..86388e1 100644 --- a/src/executor/executor_create_redirects.c +++ b/src/executor/executor_create_redirects.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/21 13:00:00 by whaffman #+# #+# */ -/* Updated: 2025/02/21 13:00:11 by whaffman ######## odam.nl */ +/* Updated: 2025/02/21 13:16:03 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,14 +15,14 @@ void executor_create_redirects(t_minishell *minishell) { t_list *current; - t_command *command; + t_command *cmd; current = minishell->commands; while (current) { - command = (t_command *)current->content; - command->fd_in = executor_open_fds(command->redirect_in); - command->fd_out = executor_open_fds(command->redirect_out); + cmd = (t_command *)current->content; + cmd->fd_in = executor_open_fds(cmd->redirect_in, cmd->fd_in); + cmd->fd_out = executor_open_fds(cmd->redirect_out, cmd->fd_out); current = current->next; } } diff --git a/src/executor/executor_execute_pipeline.c b/src/executor/executor_execute_pipeline.c index 3182355..9c6d49f 100644 --- a/src/executor/executor_execute_pipeline.c +++ b/src/executor/executor_execute_pipeline.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:02 by willem #+# #+# */ -/* Updated: 2025/02/21 12:49:21 by whaffman ######## odam.nl */ +/* Updated: 2025/02/21 13:11:17 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ diff --git a/src/executor/executor_open_fds.c b/src/executor/executor_open_fds.c index 9c104ca..4dc2b5e 100644 --- a/src/executor/executor_open_fds.c +++ b/src/executor/executor_open_fds.c @@ -6,18 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/21 12:50:42 by whaffman #+# #+# */ -/* Updated: 2025/02/21 12:59:41 by whaffman ######## odam.nl */ +/* Updated: 2025/02/21 13:15:04 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int executor_open_fds(t_list *redirect_list) +int executor_open_fds(t_list *redirect_list, int og_fd) { t_redirect *redirect; int fd; - fd = 0; + fd = og_fd; while (redirect_list) { redirect = (t_redirect *)redirect_list->content; @@ -30,7 +30,7 @@ int executor_open_fds(t_list *redirect_list) if (fd < 0) { error_msg("executor_open_fds", "can't open file"); - return (fd); + return (og_fd); } redirect_list = redirect_list->next; } diff --git a/src/parser/parser_new_command.c b/src/parser/parser_new_command.c index d2780a7..5d4ff99 100644 --- a/src/parser/parser_new_command.c +++ b/src/parser/parser_new_command.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* parser_new_command.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/11 16:18:21 by qmennen #+# #+# */ -/* Updated: 2025/02/11 16:25:12 by qmennen ### ########.fr */ +/* :::::::: */ +/* parser_new_command.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/11 16:18:21 by qmennen #+# #+# */ +/* Updated: 2025/02/21 13:07:47 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -25,6 +25,10 @@ t_command *parser_command_new(char *cmd) command->args = NULL; command->fd_in = 0; command->fd_out = 1; + command->redirect_in = NULL; + command->redirect_out = NULL; + command->environment = NULL; + command->n_fds = 0; command->command = cmd; return (command); } From a81b84f60529ce9d6fbdd62bf7ce3f578ad0f3de Mon Sep 17 00:00:00 2001 From: whaffman Date: Fri, 21 Feb 2025 16:16:17 +0100 Subject: [PATCH 032/103] norm --- inc/expander.h | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/inc/expander.h b/inc/expander.h index 3e61de9..e491c6e 100644 --- a/inc/expander.h +++ b/inc/expander.h @@ -1,25 +1,28 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* expander.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/18 19:00:51 by qmennen #+# #+# */ -/* Updated: 2025/02/19 15:19:50 by qmennen ### ########.fr */ +/* :::::::: */ +/* expander.h :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/18 19:00:51 by qmennen #+# #+# */ +/* Updated: 2025/02/21 16:13:32 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #ifndef EXPANDER_H # define EXPANDER_H -#include "minishell.h" +# include "minishell.h" -t_environment *expander_get_var(const char *s, int idx, t_minishell *minishell); -t_list *expander_parse_variables(const char *s, t_minishell *minishell); +t_environment *expander_get_var(const char *s, int idx, + t_minishell *minishell); +t_list *expander_parse_variables(const char *s, + t_minishell *minishell); char *expander_allocate_memory(const char *s, t_list *variables); char *expander_parse_string(char *s, t_minishell *minishell); int expander_character_valid(const char c); -int expander_expand_dollar(char *src, char *dest, int *j, t_list *variables); +int expander_expand_dollar(char *src, char *dest, + int *j, t_list *variables); #endif From 24752c9d08ac27d9be0b5a4408d5dd053ce90869 Mon Sep 17 00:00:00 2001 From: Quinten Date: Sun, 23 Feb 2025 11:58:13 +0100 Subject: [PATCH 033/103] temp --- src/parser/parser_get_commands.c | 79 +++++++++++++------------ src/parser/parser_get_input_redirects.c | 39 ++++++++++++ 2 files changed, 79 insertions(+), 39 deletions(-) create mode 100644 src/parser/parser_get_input_redirects.c diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 74c21ff..1001485 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -1,39 +1,40 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parser_get_commands.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:36:01 by qmennen ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -t_list *parser_get_commands(t_minishell *minishell) -{ - t_list *command_list; - t_list *current; - t_command *command; - t_token *token; - - command_list = NULL; - if (!minishell->tokens) - return (NULL); - current = minishell->tokens; - while (current) - { - token = (t_token *) current->content; - command = parser_command_new(ft_strdup(token->value)); - command->args = parser_get_arguments(current, minishell); - ft_lstadd_back(&command_list, ft_lstnew(command)); - while (current && ((t_token *)current->content)->type < 3) - current = current->next; - if (current && ((t_token *)current->content)->type >= 3) - current = current->next; - } -// ft_lstiter(command_list, print_commands); - return (command_list); -} +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_get_commands.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ +/* Updated: 2025/02/18 20:36:01 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_list *parser_get_commands(t_minishell *minishell) +{ + t_list *command_list; + t_list *current; + t_command *command; + t_token *token; + + command_list = NULL; + if (!minishell->tokens) + return (NULL); + current = minishell->tokens; + while (current) + { + token = (t_token *) current->content; + command = parser_command_new(ft_strdup(token->value)); + command->args = parser_get_arguments(current, minishell); + command->redirect_in = parser_get_input_redirects(current); + ft_lstadd_back(&command_list, ft_lstnew(command)); + while (current && ((t_token *)current->content)->type < 3) + current = current->next; + if (current && ((t_token *)current->content)->type >= 3) + current = current->next; + } +// ft_lstiter(command_list, print_commands); + return (command_list); +} diff --git a/src/parser/parser_get_input_redirects.c b/src/parser/parser_get_input_redirects.c new file mode 100644 index 0000000..83b011d --- /dev/null +++ b/src/parser/parser_get_input_redirects.c @@ -0,0 +1,39 @@ +# include "minishell.h" + +static int valid_def(t_list *list, t_token *token) +{ + t_token *next; + + if (!list->next) + return (0); + next = (t_token *)list->next->content; + if (!next) + return (0); + return ((token->type == T_REDIRECT_IN || token->type == T_HEREDOC) && next->type < 3); +} + +static t_redirect *redirect_new() +{ + t_redirect *result; +} + +void parser_get_input_redirects(t_list *list) +{ + t_list *current; + t_list *redirects; + t_token *token; + + redirects = NULL; + current = list; + while (current) + { + token = (t_token *)current->content; + if (valid_def(current, token)) + { + ft_lstaddfront(&redirects, ft_lstnew()); + } + else + break ; + current = current->next; + } +} \ No newline at end of file From e83df82dc344595b7765c75bf8bcce8121a8f3cd Mon Sep 17 00:00:00 2001 From: whaffman Date: Sun, 23 Feb 2025 11:59:59 +0100 Subject: [PATCH 034/103] create better Makefile --- Makefile | 139 +++++++++++++++++++++------ Makefile.old | 77 +++++++++++++++ sources.mk | 20 ++++ src/executor/executor_create_pipes.c | 5 +- 4 files changed, 210 insertions(+), 31 deletions(-) create mode 100644 Makefile.old create mode 100644 sources.mk diff --git a/Makefile b/Makefile index 634f3cc..8d04098 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: qmennen +#+ # # +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/20 11:10:42 by whaffman ######## odam.nl # +# Updated: 2025/02/23 11:20:52 by willem ######## odam.nl # # # # **************************************************************************** # @@ -15,63 +15,144 @@ NAME = minishell SRC_PATH = src INC_PATH = inc LIB_PATH = lib +BUILD_PATH = build LIBFT_PATH = $(LIB_PATH)/libft LIBFT_INC_PATH = $(LIBFT_PATH)/inc LIBFT = $(LIBFT_PATH)/libft.a -OBJ_PATH = obj - -VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils: -VPATH += src/executor:src/parser:src/expander:src/debug:src/signal:src/builtin -SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) - -OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) -DEPENDS = ${OBJECTS:.o=.d} - CC = cc RM = rm -rf INCLUDES = -I./$(INC_PATH) -I./$(LIBFT_INC_PATH) -CFLAGS = -Wall -Wextra -Werror -fsanitize=address,undefined -MMD -g3 UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) - LDLIBS := -L$(LIBFT_PATH) -lft -lreadline + LDLIBS := -L$(LIBFT_PATH) -lft -lreadline endif -all: $(NAME) - echo $(SOURCES) +# Include sources.mk if it exists +-include sources.mk -$(NAME): $(LIBFT) $(OBJECTS) - $(CC) $(CFLAGS) $(OBJECTS) $(LDLIBS) -o $(NAME) +# Build configurations +BUILD_CONFIGS = release debug asan tsan --include ${DEPENDS} +release_CFLAGS = -Wall -Werror -Werror -O2 +debug_CFLAGS = -Wall -Werror -Werror -g3 +asan_CFLAGS = -Wall -Werror -Werror -fsanitize=address,leak,undefined -g3 +tsan_CFLAGS = -Wall -Werror -Werror -fsanitize=thread -g3 -$(LIBFT): $(LIBFT_PATH) +# Targets for each build configuration +define BUILD_TARGETS +$(1)_OBJ_PATH = $(BUILD_PATH)/$(1)/obj +$(1)_DEPENDS = $$(addprefix $$($(1)_OBJ_PATH)/, $$(SOURCES:.c=.d)) +$(1)_OBJECTS = $$(addprefix $$($(1)_OBJ_PATH)/, $$(SOURCES:.c=.o)) + +.PHONY: $(1) +$(1): CFLAGS = $$($(1)_CFLAGS) +$(1): $(BUILD_PATH)/$(1)/$(NAME) + +.PHONY: run_$(1) + +run_$(1): $(1) + $$(info $(bold)$(green)Running $(1)$(reset)) + ./$(BUILD_PATH)/$(1)/$(NAME) + +$(BUILD_PATH)/$(1)/$(NAME): $(LIBFT) $$($(1)_OBJECTS) + $$(info $(bold)$(green)Linking $(1) config$(reset)) + $$(CC) $$(CFLAGS) $$($(1)_OBJECTS) $$(LDLIBS) -o $$@ + +-include $$($(1)_DEPENDS) + +$$($(1)_OBJ_PATH)/%.o: %.c $(LIBFT) | $$($(1)_OBJ_PATH) + $$(CC) $$(CFLAGS) $$(INCLUDES) -MMD -MP -c $$< -o $$@ + +$$($(1)_OBJ_PATH): + $$(info $(bold)$(green)Creating $(1) object directory$(reset)) + mkdir -p $$@ +endef + +# Copy the release build configuration to the root +$(NAME): $(BUILD_PATH)/release/$(NAME) + $(info $(bold)$(green)Copying release build to root$(reset)) + cp $< $@ + +$(foreach config,$(BUILD_CONFIGS),$(eval $(call BUILD_TARGETS,$(config)))) + +# Build all configurations +all: release debug asan tsan + $(info $(bold)$(green)Building all$(reset)) + +# Build libft +$(LIBFT): $(LIBFT_PATH) check-and-reinit-submodules + $(info $(bold)$(green)Building libft$(reset)) $(MAKE) -C $(LIBFT_PATH) $(LIBFT_PATH): + $(info $(bold)$(green)Adding libft submodule$(reset)) git submodule add https://gitea.duinvoetje.nl/willem/libft.git $(LIBFT_PATH) -$(OBJ_PATH): - mkdir -p $@ - -$(OBJ_PATH)/%.o: %.c $(LIBFT) | $(OBJ_PATH) - $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ +# Generate sources.mk +sources.mk: + $(info $(bold)$(green)Generating sources.mk$(reset)) + @echo "VPATH = $$(find $(SRC_PATH) -type d | tr '\n' ':')" > sources.mk + @echo "SOURCES = $$(find $(SRC_PATH) -type f -name '*.c' -exec basename {} \; | tr '\n' ' ' | fold -s -w 70 | sed 's/$$/ \\/')" >> sources.mk +# Remove build artifacts clean: - $(RM) $(OBJECTS) $(OBJ_PATH) + $(info $(bold)$(red)Cleaning$(reset)) + find $(BUILD_PATH) -type d -name 'obj' -exec $(RM) {} + $(MAKE) -C $(LIBFT_PATH) clean - +# Remove build artifacts and the executable fclean: clean + $(info $(bold)$(red)Full cleaning$(reset)) + $(RM) $(BUILD_PATH) $(RM) $(NAME) $(MAKE) -C $(LIBFT_PATH) fclean -re: fclean all +# Rebuild the project +re: fclean + $(info $(bold)$(green)Rebuilding$(reset)) + $(MAKE) all $(NAME) -run: all - ./$(NAME) +# Run the project with the release build configuration +run: run_release + $(info $(bold)$(green)Running$(reset)) + +# Remove sources.mk to force regeneration +srcs: + $(info $(bold)$(green)Regenerating sources.mk$(reset)) + $(RM) sources.mk + +# Show this help. +help: + @echo "Usage: make [target]" + @echo "" + @echo "Targets:" + @awk '/^#/{c=substr($$0,3);next}c&&/^[[:alpha:]][[:alnum:]_-]+:/{print substr($$1,1,index($$1,":")),c}1{c=0}' $(MAKEFILE_LIST) | column -s: -t + @echo "" + +.PHONY: check-and-reinit-submodules +check-and-reinit-submodules: + $(info $(bold)$(green)Checking and reinitializing submodules$(reset)) + @if git submodule status | egrep -q '^[-+]' ; then \ + echo "INFO: Need to reinitialize git submodules"; \ + git submodule update --init; \ + fi + +.PHONY: all clean fclean re srcs run help + +red:=$(shell tput setaf 1) +green:=$(shell tput setaf 2) +yellow:=$(shell tput setaf 3) +blue:=$(shell tput setaf 4) +magenta:=$(shell tput setaf 5) +cyan:=$(shell tput setaf 6) +white:=$(shell tput setaf 7) + +bold:=$(shell tput bold) +underline:=$(shell tput smul) + +reset:=$(shell tput sgr0) -.PHONY: all clean fclean re run diff --git a/Makefile.old b/Makefile.old new file mode 100644 index 0000000..634f3cc --- /dev/null +++ b/Makefile.old @@ -0,0 +1,77 @@ +# **************************************************************************** # +# # +# :::::::: # +# Makefile :+: :+: # +# +:+ # +# By: qmennen +#+ # +# +#+ # +# Created: 2024/10/15 11:48:46 by whaffman #+# #+# # +# Updated: 2025/02/20 11:10:42 by whaffman ######## odam.nl # +# # +# **************************************************************************** # + +NAME = minishell + +SRC_PATH = src +INC_PATH = inc +LIB_PATH = lib + +LIBFT_PATH = $(LIB_PATH)/libft +LIBFT_INC_PATH = $(LIBFT_PATH)/inc +LIBFT = $(LIBFT_PATH)/libft.a + +OBJ_PATH = obj + +VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils: +VPATH += src/executor:src/parser:src/expander:src/debug:src/signal:src/builtin +SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) + +OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) +DEPENDS = ${OBJECTS:.o=.d} + +CC = cc +RM = rm -rf + +INCLUDES = -I./$(INC_PATH) -I./$(LIBFT_INC_PATH) +CFLAGS = -Wall -Wextra -Werror -fsanitize=address,undefined -MMD -g3 + +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) + LDLIBS := -L$(LIBFT_PATH) -lft -lreadline +endif + +all: $(NAME) + echo $(SOURCES) + +$(NAME): $(LIBFT) $(OBJECTS) + $(CC) $(CFLAGS) $(OBJECTS) $(LDLIBS) -o $(NAME) + +-include ${DEPENDS} + +$(LIBFT): $(LIBFT_PATH) + $(MAKE) -C $(LIBFT_PATH) + +$(LIBFT_PATH): + git submodule add https://gitea.duinvoetje.nl/willem/libft.git $(LIBFT_PATH) + +$(OBJ_PATH): + mkdir -p $@ + +$(OBJ_PATH)/%.o: %.c $(LIBFT) | $(OBJ_PATH) + $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ + +clean: + $(RM) $(OBJECTS) $(OBJ_PATH) + $(MAKE) -C $(LIBFT_PATH) clean + + +fclean: clean + $(RM) $(NAME) + $(MAKE) -C $(LIBFT_PATH) fclean + +re: fclean all + +run: all + ./$(NAME) + +.PHONY: all clean fclean re run diff --git a/sources.mk b/sources.mk new file mode 100644 index 0000000..862e5a7 --- /dev/null +++ b/sources.mk @@ -0,0 +1,20 @@ +VPATH = src:src/parser:src/environment:src/lexer:src/debug:src/token:src/signal:src/prompt:src/utils:src/expander:src/executor:src/builtin: +SOURCES = parser_get_arguments.c parser_new_command.c parser_get_commands.c \ +environment_get.c environment_get_arr.c environment_free_list.c \ +environment_add.c environment_print.c environment_del.c \ +environment_free.c environment_parse.c lexer_new.c lexer_read_word.c \ +lexer_read_char.c lexer_parse_input.c lexer_token_next.c \ +print_commands.c main.c token_new.c token_parse.c signal.c \ +history_write.c prompt.c history_load.c ft_malloc_safe.c \ +free_command_list.c free_minishell.c free_lexer.c print_banner.c \ +check_malloc.c error_msg.c free_token_list.c free_minishell_line.c \ +ft_strdup_safe.c free_token.c init_minishell.c ft_strjoin_safe.c \ +expander_allocate_memory.c expander_parse_string.c \ +expander_parse_variables.c expander_expand_dollar.c \ +expander_is_character.c expander_get_variable.c executor_open_fds.c \ +executor_count_fds.c executor_fork.c executor_absolute_path.c \ +executor_execute_pipeline.c executor_child.c executor_close_fds.c \ +executor_create_redirects.c executor_create_pipes.c builtin_export.c \ +simple_builtins.c builtin_router.c is_builtin.c builtin_unset.c \ +builtin_env.c builtin_cd.c builtin_pwd.c builtin_exit.c \ +builtin_echo.c \ diff --git a/src/executor/executor_create_pipes.c b/src/executor/executor_create_pipes.c index 6c24ff5..9cff884 100644 --- a/src/executor/executor_create_pipes.c +++ b/src/executor/executor_create_pipes.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:22 by willem #+# #+# */ -/* Updated: 2025/02/21 12:48:04 by whaffman ######## odam.nl */ +/* Updated: 2025/02/22 22:25:28 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -38,7 +38,8 @@ void executor_create_pipes(t_minishell *minishell) command = (t_command *)current->content; if (current->next) { - pipe(fd); + if (!pipe(fd)) + error_msg("pipe", "pipe creation failed"); command->fd_out = fd[1]; } else From 3eb742d3fe2830a4ce25797c65b8100d8575ec4b Mon Sep 17 00:00:00 2001 From: whaffman Date: Sun, 23 Feb 2025 12:00:43 +0100 Subject: [PATCH 035/103] libft update --- lib/libft | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libft b/lib/libft index 5944b0f..de8a369 160000 --- a/lib/libft +++ b/lib/libft @@ -1 +1 @@ -Subproject commit 5944b0f8116007fd65a4224750cc4cdbf7ac9952 +Subproject commit de8a369a6264465d4cb2979ff6d6938048a2857d From 45968e547ed22078431eb56c8af98aa3aeec9832 Mon Sep 17 00:00:00 2001 From: Quinten Date: Sun, 23 Feb 2025 12:20:19 +0100 Subject: [PATCH 036/103] parsing input redirects --- inc/debug.h | 1 + inc/parser.h | 1 + src/debug/print_commands.c | 10 ++++++++++ src/main.c | 1 - src/parser/parser_get_commands.c | 2 +- src/parser/parser_get_input_redirects.c | 25 ++++++++++++++++++++++--- src/utils/free_command_list.c | 22 ++++++++++++++++++++++ 7 files changed, 57 insertions(+), 5 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index f26f569..174135e 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -17,5 +17,6 @@ void print_commands(void *param); void token_print(void *param); +void print_redirects(void *param); #endif diff --git a/inc/parser.h b/inc/parser.h index f757caa..8a8d05e 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -18,5 +18,6 @@ t_command *parser_command_new(char *cmd); char **parser_get_arguments(t_list *list, t_minishell *minishell); t_list *parser_get_commands(t_minishell *minishell); +t_list *parser_get_input_redirects(t_list *list); #endif diff --git a/src/debug/print_commands.c b/src/debug/print_commands.c index ed094e9..2ddf0cf 100644 --- a/src/debug/print_commands.c +++ b/src/debug/print_commands.c @@ -28,6 +28,16 @@ void print_commands(void *param) printf("\n"); } +void print_redirects(void *param) +{ + t_redirect *redirect; + + redirect = (t_redirect *)param; + if (!redirect) + return ; + printf("redirect %i value %s\n", redirect->type, redirect->value); +} + void token_print(void *param) { t_token *token; diff --git a/src/main.c b/src/main.c index 2a82a97..dec9a74 100644 --- a/src/main.c +++ b/src/main.c @@ -36,7 +36,6 @@ int main(int argc, char **argv, char **envp) minishell->commands = parser_get_commands(minishell); simple_builtins(minishell); free_minishell_line(minishell); - ft_lstclear(&minishell->commands, free_command_list); } ft_lstclear(&minishell->commands, free_command_list); free_minishell(minishell); diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 1001485..c6af1fd 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -30,7 +30,7 @@ t_list *parser_get_commands(t_minishell *minishell) command->args = parser_get_arguments(current, minishell); command->redirect_in = parser_get_input_redirects(current); ft_lstadd_back(&command_list, ft_lstnew(command)); - while (current && ((t_token *)current->content)->type < 3) + while (current && (((t_token *)current->content)->type < 3 || ((t_token *)current->content)->type == T_REDIRECT_IN)) current = current->next; if (current && ((t_token *)current->content)->type >= 3) current = current->next; diff --git a/src/parser/parser_get_input_redirects.c b/src/parser/parser_get_input_redirects.c index 83b011d..aee0376 100644 --- a/src/parser/parser_get_input_redirects.c +++ b/src/parser/parser_get_input_redirects.c @@ -12,12 +12,19 @@ static int valid_def(t_list *list, t_token *token) return ((token->type == T_REDIRECT_IN || token->type == T_HEREDOC) && next->type < 3); } -static t_redirect *redirect_new() +static t_redirect *redirect_new(t_token_type type, char *value) { t_redirect *result; + + result = ft_malloc_safe(sizeof(t_redirect)); + result->type = type; + result->value = NULL; + if (value) + result->value = value; + return (result); } -void parser_get_input_redirects(t_list *list) +t_list *parser_get_input_redirects(t_list *list) { t_list *current; t_list *redirects; @@ -28,12 +35,24 @@ void parser_get_input_redirects(t_list *list) while (current) { token = (t_token *)current->content; + if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) + { + current = current->next; + continue ; + } if (valid_def(current, token)) { - ft_lstaddfront(&redirects, ft_lstnew()); + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(token->type, ft_strdup(((t_token *)current->next->content)->value)))); + current = current->next; + continue ; } else + { + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(T_ERROR, NULL))); break ; + } current = current->next; } + ft_lstiter(redirects, print_redirects); + return (redirects); } \ No newline at end of file diff --git a/src/utils/free_command_list.c b/src/utils/free_command_list.c index 684f713..76316c0 100644 --- a/src/utils/free_command_list.c +++ b/src/utils/free_command_list.c @@ -25,6 +25,26 @@ static void free_args(char **args) free(args); } +static void free_redirects(t_list *lst) +{ + t_redirect *redir; + t_list *current; + t_list *last; + + current = lst; + while (current) + { + last = current; + redir = (t_redirect *)current->content; + if (redir && redir->value) + free(redir->value); + if (redir) + free(redir); + current = current->next; + free(last); + } +} + void free_command_list(void *content) { t_command *command; @@ -34,5 +54,7 @@ void free_command_list(void *content) free(command->command); if (command->args) free_args(command->args); + if (command->redirect_in) + free_redirects(command->redirect_in); free(command); } From 3c14325711885dc314f2cbac07f74b68d6b1d1f1 Mon Sep 17 00:00:00 2001 From: Quinten Date: Sun, 23 Feb 2025 12:34:34 +0100 Subject: [PATCH 037/103] some more structure --- Makefile | 5 ++- inc/minishell.h | 5 ++- inc/redirect.h | 20 +++++++++ src/parser/parser_get_commands.c | 2 +- src/parser/parser_get_input_redirects.c | 58 ------------------------- src/redirect/redirect_get_inputs.c | 46 ++++++++++++++++++++ src/redirect/redirect_new.c | 25 +++++++++++ src/redirect/redirect_valid_type.c | 31 +++++++++++++ 8 files changed, 129 insertions(+), 63 deletions(-) create mode 100644 inc/redirect.h delete mode 100644 src/parser/parser_get_input_redirects.c create mode 100644 src/redirect/redirect_get_inputs.c create mode 100644 src/redirect/redirect_new.c create mode 100644 src/redirect/redirect_valid_type.c diff --git a/Makefile b/Makefile index 634f3cc..8e3044a 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,10 @@ # :::::::: # # Makefile :+: :+: # # +:+ # -# By: qmennen +#+ # +# By: marvin +#+ # # +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/20 11:10:42 by whaffman ######## odam.nl # +# Updated: 2025/02/23 12:28:40 by Quinten ######## odam.nl # # # # **************************************************************************** # @@ -24,6 +24,7 @@ OBJ_PATH = obj VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils: VPATH += src/executor:src/parser:src/expander:src/debug:src/signal:src/builtin +VPATH += src/redirect SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) diff --git a/inc/minishell.h b/inc/minishell.h index 27bca6a..6b60f96 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -3,10 +3,10 @@ /* :::::::: */ /* minishell.h :+: :+: */ /* +:+ */ -/* By: whaffman +#+ */ +/* By: marvin +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:13 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:35:24 by whaffman ######## odam.nl */ +/* Updated: 2025/02/23 12:28:23 by Quinten ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -24,6 +24,7 @@ # include "executor.h" # include "parser.h" # include "expander.h" +# include "redirect.h" # include "debug.h" # include "utils.h" diff --git a/inc/redirect.h b/inc/redirect.h new file mode 100644 index 0000000..4f6f0c4 --- /dev/null +++ b/inc/redirect.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* redirect.h :+: :+: */ +/* +:+ */ +/* By: Quinten +#+ */ +/* +#+ */ +/* Created: 2025/02/23 12:26:29 by Quinten #+# #+# */ +/* Updated: 2025/02/23 12:26:29 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#ifndef REDIRECT_H +# define REDIRECT_H +# include "minishell.h" + +t_redirect *redirect_new(t_token_type type, char *value); +t_list *redirect_get_inputs(t_list *list); +int redirect_is_valid(t_list *lst, t_token *token); +#endif \ No newline at end of file diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index c6af1fd..e49dfb1 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -28,7 +28,7 @@ t_list *parser_get_commands(t_minishell *minishell) token = (t_token *) current->content; command = parser_command_new(ft_strdup(token->value)); command->args = parser_get_arguments(current, minishell); - command->redirect_in = parser_get_input_redirects(current); + command->redirect_in = redirect_get_inputs(current); ft_lstadd_back(&command_list, ft_lstnew(command)); while (current && (((t_token *)current->content)->type < 3 || ((t_token *)current->content)->type == T_REDIRECT_IN)) current = current->next; diff --git a/src/parser/parser_get_input_redirects.c b/src/parser/parser_get_input_redirects.c deleted file mode 100644 index aee0376..0000000 --- a/src/parser/parser_get_input_redirects.c +++ /dev/null @@ -1,58 +0,0 @@ -# include "minishell.h" - -static int valid_def(t_list *list, t_token *token) -{ - t_token *next; - - if (!list->next) - return (0); - next = (t_token *)list->next->content; - if (!next) - return (0); - return ((token->type == T_REDIRECT_IN || token->type == T_HEREDOC) && next->type < 3); -} - -static t_redirect *redirect_new(t_token_type type, char *value) -{ - t_redirect *result; - - result = ft_malloc_safe(sizeof(t_redirect)); - result->type = type; - result->value = NULL; - if (value) - result->value = value; - return (result); -} - -t_list *parser_get_input_redirects(t_list *list) -{ - t_list *current; - t_list *redirects; - t_token *token; - - redirects = NULL; - current = list; - while (current) - { - token = (t_token *)current->content; - if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) - { - current = current->next; - continue ; - } - if (valid_def(current, token)) - { - ft_lstadd_front(&redirects, ft_lstnew(redirect_new(token->type, ft_strdup(((t_token *)current->next->content)->value)))); - current = current->next; - continue ; - } - else - { - ft_lstadd_front(&redirects, ft_lstnew(redirect_new(T_ERROR, NULL))); - break ; - } - current = current->next; - } - ft_lstiter(redirects, print_redirects); - return (redirects); -} \ No newline at end of file diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c new file mode 100644 index 0000000..4caf8b8 --- /dev/null +++ b/src/redirect/redirect_get_inputs.c @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* redirect_get_inputs.c :+: :+: */ +/* +:+ */ +/* By: Quinten +#+ */ +/* +#+ */ +/* Created: 2025/02/23 12:29:05 by Quinten #+# #+# */ +/* Updated: 2025/02/23 12:29:05 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +# include "redirect.h" + +t_list *redirect_get_inputs(t_list *list) +{ + t_list *current; + t_list *redirects; + t_token *token; + + redirects = NULL; + current = list; + while (current) + { + token = (t_token *)current->content; + if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) + { + current = current->next; + continue ; + } + if (redirect_is_valid(current, token)) + { + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(token->type, ft_strdup(((t_token *)current->next->content)->value)))); + current = current->next; + continue ; + } + else + { + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(T_ERROR, NULL))); + break ; + } + current = current->next; + } + ft_lstiter(redirects, print_redirects); + return (redirects); +} \ No newline at end of file diff --git a/src/redirect/redirect_new.c b/src/redirect/redirect_new.c new file mode 100644 index 0000000..4983828 --- /dev/null +++ b/src/redirect/redirect_new.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* redirect_new.c :+: :+: */ +/* +:+ */ +/* By: Quinten +#+ */ +/* +#+ */ +/* Created: 2025/02/23 12:27:33 by Quinten #+# #+# */ +/* Updated: 2025/02/23 12:27:33 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_redirect *redirect_new(t_token_type type, char *value) +{ + t_redirect *result; + + result = ft_malloc_safe(sizeof(t_redirect)); + result->type = type; + result->value = NULL; + if (value) + result->value = value; + return (result); +} \ No newline at end of file diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c new file mode 100644 index 0000000..49d0674 --- /dev/null +++ b/src/redirect/redirect_valid_type.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* redirect_valid_type.c :+: :+: */ +/* +:+ */ +/* By: Quinten +#+ */ +/* +#+ */ +/* Created: 2025/02/23 12:30:18 by Quinten #+# #+# */ +/* Updated: 2025/02/23 12:30:18 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int is_redirection(t_token *token) +{ + return (token->type == T_REDIRECT_IN || token->type == T_HEREDOC || + token->type == T_REDIRECT_OUT || token->type == T_APPEND_OUT); +} + +int redirect_is_valid(t_list *lst, t_token *token) +{ + t_token *next; + + if (!lst->next) + return (0); + next = (t_token *)lst->next->content; + if (!next) + return (0); + return (is_redirection(token) && next->type < 3); +} \ No newline at end of file From 2117a6538e8d862c56415f4f0b1a6b250b47d201 Mon Sep 17 00:00:00 2001 From: Quinten Date: Sun, 23 Feb 2025 12:44:31 +0100 Subject: [PATCH 038/103] redirects --- inc/redirect.h | 2 ++ src/debug/print_commands.c | 22 ++++++++------ src/parser/parser_get_commands.c | 10 +++++-- src/redirect/redirect_get_inputs.c | 1 - src/redirect/redirect_get_outputs.c | 45 +++++++++++++++++++++++++++++ src/redirect/redirect_valid_type.c | 4 +-- src/utils/free_command_list.c | 18 +++++++----- 7 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 src/redirect/redirect_get_outputs.c diff --git a/inc/redirect.h b/inc/redirect.h index 4f6f0c4..98a86e3 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -16,5 +16,7 @@ t_redirect *redirect_new(t_token_type type, char *value); t_list *redirect_get_inputs(t_list *list); +t_list *redirect_get_outputs(t_list *list); int redirect_is_valid(t_list *lst, t_token *token); +int redirect_token_type(t_token *token); #endif \ No newline at end of file diff --git a/src/debug/print_commands.c b/src/debug/print_commands.c index 2ddf0cf..7884a8d 100644 --- a/src/debug/print_commands.c +++ b/src/debug/print_commands.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* print_commands.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/18 20:06:37 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:11:45 by qmennen ### ########.fr */ +/* :::::::: */ +/* print_commands.c :+: :+: */ +/* +:+ */ +/* By: marvin +#+ */ +/* +#+ */ +/* Created: 2025/02/18 20:06:37 by qmennen #+# #+# */ +/* Updated: 2025/02/23 12:43:35 by Quinten ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -21,11 +21,15 @@ void print_commands(void *param) if (!command) return ; printf("command: %s\n", command->command); - printf("args: "); + printf("-- Args: "); i = 0; while (command->args[i++]) printf("%s ", command->args[i]); printf("\n"); + printf("-- Input redirects:\n"); + ft_lstiter(command->redirect_in, print_redirects); + printf("-- Output redirects:\n"); + ft_lstiter(command->redirect_out, print_redirects); } void print_redirects(void *param) @@ -35,7 +39,7 @@ void print_redirects(void *param) redirect = (t_redirect *)param; if (!redirect) return ; - printf("redirect %i value %s\n", redirect->type, redirect->value); + printf(" Redirect %i value %s\n", redirect->type, redirect->value); } void token_print(void *param) diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index e49dfb1..6725b8c 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -12,6 +12,11 @@ #include "minishell.h" +static int is_command_token(t_token *token) +{ + return (token->type < 3 || redirect_token_type(token)); +} + t_list *parser_get_commands(t_minishell *minishell) { t_list *command_list; @@ -29,12 +34,13 @@ t_list *parser_get_commands(t_minishell *minishell) command = parser_command_new(ft_strdup(token->value)); command->args = parser_get_arguments(current, minishell); command->redirect_in = redirect_get_inputs(current); + command->redirect_out = redirect_get_outputs(current); ft_lstadd_back(&command_list, ft_lstnew(command)); - while (current && (((t_token *)current->content)->type < 3 || ((t_token *)current->content)->type == T_REDIRECT_IN)) + while (current && is_command_token((t_token *)current->content)) current = current->next; if (current && ((t_token *)current->content)->type >= 3) current = current->next; } -// ft_lstiter(command_list, print_commands); + ft_lstiter(command_list, print_commands); return (command_list); } diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index 4caf8b8..1ea9f8b 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -41,6 +41,5 @@ t_list *redirect_get_inputs(t_list *list) } current = current->next; } - ft_lstiter(redirects, print_redirects); return (redirects); } \ No newline at end of file diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c new file mode 100644 index 0000000..18cc0dc --- /dev/null +++ b/src/redirect/redirect_get_outputs.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* redirect_get_outputs.c :+: :+: */ +/* +:+ */ +/* By: Quinten +#+ */ +/* +#+ */ +/* Created: 2025/02/23 12:37:24 by Quinten #+# #+# */ +/* Updated: 2025/02/23 12:37:24 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_list *redirect_get_outputs(t_list *list) +{ + t_list *current; + t_list *redirects; + t_token *token; + + redirects = NULL; + current = list; + while (current) + { + token = (t_token *)current->content; + if (token->type != T_REDIRECT_OUT && token->type != T_APPEND_OUT) + { + current = current->next; + continue ; + } + if (redirect_is_valid(current, token)) + { + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(token->type, ft_strdup(((t_token *)current->next->content)->value)))); + current = current->next; + continue ; + } + else + { + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(T_ERROR, NULL))); + break ; + } + current = current->next; + } + return (redirects); +} \ No newline at end of file diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c index 49d0674..2df0a3d 100644 --- a/src/redirect/redirect_valid_type.c +++ b/src/redirect/redirect_valid_type.c @@ -12,7 +12,7 @@ #include "minishell.h" -static int is_redirection(t_token *token) +int redirect_token_type(t_token *token) { return (token->type == T_REDIRECT_IN || token->type == T_HEREDOC || token->type == T_REDIRECT_OUT || token->type == T_APPEND_OUT); @@ -27,5 +27,5 @@ int redirect_is_valid(t_list *lst, t_token *token) next = (t_token *)lst->next->content; if (!next) return (0); - return (is_redirection(token) && next->type < 3); + return (redirect_token_type(token) && next->type < 3); } \ No newline at end of file diff --git a/src/utils/free_command_list.c b/src/utils/free_command_list.c index 76316c0..4654515 100644 --- a/src/utils/free_command_list.c +++ b/src/utils/free_command_list.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* 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 */ +/* :::::::: */ +/* free_command_list.c :+: :+: */ +/* +:+ */ +/* By: marvin +#+ */ +/* +#+ */ +/* Created: 2025/02/11 14:24:05 by qmennen #+# #+# */ +/* Updated: 2025/02/23 12:40:17 by Quinten ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -55,6 +55,8 @@ void free_command_list(void *content) if (command->args) free_args(command->args); if (command->redirect_in) - free_redirects(command->redirect_in); + free_redirects(command->redirect_in); + if (command->redirect_out) + free_redirects(command->redirect_out); free(command); } From ea90a00c33e8f5528ddfb61aa4b5442ad01eb6bf Mon Sep 17 00:00:00 2001 From: Quinten Date: Sun, 23 Feb 2025 12:46:02 +0100 Subject: [PATCH 039/103] merge main into quitnen --- Makefile | 156 +++++++++++++++++----------------- inc/debug.h | 44 +++++----- inc/minishell.h | 100 +++++++++++----------- inc/parser.h | 46 +++++----- inc/utils.h | 58 ++++++------- src/debug/print_commands.c | 104 +++++++++++------------ src/main.c | 86 +++++++++---------- src/utils/check_malloc.c | 46 +++++----- src/utils/error_msg.c | 68 +++++++-------- src/utils/free_command_list.c | 124 +++++++++++++-------------- src/utils/ft_malloc_safe.c | 44 +++++----- src/utils/ft_strdup_safe.c | 44 +++++----- src/utils/ft_strjoin_safe.c | 46 +++++----- 13 files changed, 483 insertions(+), 483 deletions(-) diff --git a/Makefile b/Makefile index 8e3044a..7a679b7 100644 --- a/Makefile +++ b/Makefile @@ -1,78 +1,78 @@ -# **************************************************************************** # -# # -# :::::::: # -# Makefile :+: :+: # -# +:+ # -# By: marvin +#+ # -# +#+ # -# Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/23 12:28:40 by Quinten ######## odam.nl # -# # -# **************************************************************************** # - -NAME = minishell - -SRC_PATH = src -INC_PATH = inc -LIB_PATH = lib - -LIBFT_PATH = $(LIB_PATH)/libft -LIBFT_INC_PATH = $(LIBFT_PATH)/inc -LIBFT = $(LIBFT_PATH)/libft.a - -OBJ_PATH = obj - -VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils: -VPATH += src/executor:src/parser:src/expander:src/debug:src/signal:src/builtin -VPATH += src/redirect -SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) - -OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) -DEPENDS = ${OBJECTS:.o=.d} - -CC = cc -RM = rm -rf - -INCLUDES = -I./$(INC_PATH) -I./$(LIBFT_INC_PATH) -CFLAGS = -Wall -Wextra -Werror -fsanitize=address,undefined -MMD -g3 - -UNAME_S := $(shell uname -s) -ifeq ($(UNAME_S),Linux) - LDLIBS := -L$(LIBFT_PATH) -lft -lreadline -endif - -all: $(NAME) - echo $(SOURCES) - -$(NAME): $(LIBFT) $(OBJECTS) - $(CC) $(CFLAGS) $(OBJECTS) $(LDLIBS) -o $(NAME) - --include ${DEPENDS} - -$(LIBFT): $(LIBFT_PATH) - $(MAKE) -C $(LIBFT_PATH) - -$(LIBFT_PATH): - git submodule add https://gitea.duinvoetje.nl/willem/libft.git $(LIBFT_PATH) - -$(OBJ_PATH): - mkdir -p $@ - -$(OBJ_PATH)/%.o: %.c $(LIBFT) | $(OBJ_PATH) - $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ - -clean: - $(RM) $(OBJECTS) $(OBJ_PATH) - $(MAKE) -C $(LIBFT_PATH) clean - - -fclean: clean - $(RM) $(NAME) - $(MAKE) -C $(LIBFT_PATH) fclean - -re: fclean all - -run: all - ./$(NAME) - -.PHONY: all clean fclean re run +# **************************************************************************** # +# # +# :::::::: # +# Makefile :+: :+: # +# +:+ # +# By: marvin +#+ # +# +#+ # +# Created: 2024/10/15 11:48:46 by whaffman #+# #+# # +# Updated: 2025/02/23 12:28:40 by Quinten ######## odam.nl # +# # +# **************************************************************************** # + +NAME = minishell + +SRC_PATH = src +INC_PATH = inc +LIB_PATH = lib + +LIBFT_PATH = $(LIB_PATH)/libft +LIBFT_INC_PATH = $(LIBFT_PATH)/inc +LIBFT = $(LIBFT_PATH)/libft.a + +OBJ_PATH = obj + +VPATH = src:src/environment:src/prompt:src/lexer:src/token:src/utils: +VPATH += src/executor:src/parser:src/expander:src/debug:src/signal:src/builtin +VPATH += src/redirect +SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) + +OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) +DEPENDS = ${OBJECTS:.o=.d} + +CC = cc +RM = rm -rf + +INCLUDES = -I./$(INC_PATH) -I./$(LIBFT_INC_PATH) +CFLAGS = -Wall -Wextra -Werror -fsanitize=address,undefined -MMD -g3 + +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) + LDLIBS := -L$(LIBFT_PATH) -lft -lreadline +endif + +all: $(NAME) + echo $(SOURCES) + +$(NAME): $(LIBFT) $(OBJECTS) + $(CC) $(CFLAGS) $(OBJECTS) $(LDLIBS) -o $(NAME) + +-include ${DEPENDS} + +$(LIBFT): $(LIBFT_PATH) + $(MAKE) -C $(LIBFT_PATH) + +$(LIBFT_PATH): + git submodule add https://gitea.duinvoetje.nl/willem/libft.git $(LIBFT_PATH) + +$(OBJ_PATH): + mkdir -p $@ + +$(OBJ_PATH)/%.o: %.c $(LIBFT) | $(OBJ_PATH) + $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ + +clean: + $(RM) $(OBJECTS) $(OBJ_PATH) + $(MAKE) -C $(LIBFT_PATH) clean + + +fclean: clean + $(RM) $(NAME) + $(MAKE) -C $(LIBFT_PATH) fclean + +re: fclean all + +run: all + ./$(NAME) + +.PHONY: all clean fclean re run diff --git a/inc/debug.h b/inc/debug.h index 174135e..9c11cdd 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -1,22 +1,22 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* debug.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/18 20:06:53 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:10:49 by qmennen ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef DEBUG_H -# define DEBUG_H - -# include "minishell.h" - -void print_commands(void *param); -void token_print(void *param); -void print_redirects(void *param); - -#endif +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* debug.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/18 20:06:53 by qmennen #+# #+# */ +/* Updated: 2025/02/18 20:10:49 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef DEBUG_H +# define DEBUG_H + +# include "minishell.h" + +void print_commands(void *param); +void token_print(void *param); +void print_redirects(void *param); + +#endif diff --git a/inc/minishell.h b/inc/minishell.h index 6b60f96..78bc2cf 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -1,50 +1,50 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* minishell.h :+: :+: */ -/* +:+ */ -/* By: marvin +#+ */ -/* +#+ */ -/* Created: 2025/02/04 16:13:13 by whaffman #+# #+# */ -/* Updated: 2025/02/23 12:28:23 by Quinten ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#ifndef MINISHELL_H -# define MINISHELL_H - -# include "allowed.h" -# include "libft.h" -# include "typedef.h" -# include "signals.h" -# include "environment.h" -# include "prompt.h" -# include "tokenizer.h" -# include "builtin.h" -# include "executor.h" -# include "parser.h" -# include "expander.h" -# include "redirect.h" -# include "debug.h" -# include "utils.h" - -# define TRUE 1 -# define FALSE 0 - -# define SUCCESS 1 -# define FAILURE 0 - -# define BOLD "\001\033[1m\002" -# define RED "\001\033[0;31m\002" -# define GREEN "\001\033[0;32m\002" -# define YELLOW "\001\033[0;33m\002" -# define BLUE "\001\033[0;34m\002" -# define MAGENTA "\001\033[0;35m\002" -# define CYAN "\001\033[0;36m\002" -# define RESET "\001\033[0m\002" -# define PROMPT RESET "🐚" GREEN "minishell" RESET ": " -# define PROMPT_LEN 51 - -void token_print(void *param); - -#endif +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* minishell.h :+: :+: */ +/* +:+ */ +/* By: marvin +#+ */ +/* +#+ */ +/* Created: 2025/02/04 16:13:13 by whaffman #+# #+# */ +/* Updated: 2025/02/23 12:28:23 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#ifndef MINISHELL_H +# define MINISHELL_H + +# include "allowed.h" +# include "libft.h" +# include "typedef.h" +# include "signals.h" +# include "environment.h" +# include "prompt.h" +# include "tokenizer.h" +# include "builtin.h" +# include "executor.h" +# include "parser.h" +# include "expander.h" +# include "redirect.h" +# include "debug.h" +# include "utils.h" + +# define TRUE 1 +# define FALSE 0 + +# define SUCCESS 1 +# define FAILURE 0 + +# define BOLD "\001\033[1m\002" +# define RED "\001\033[0;31m\002" +# define GREEN "\001\033[0;32m\002" +# define YELLOW "\001\033[0;33m\002" +# define BLUE "\001\033[0;34m\002" +# define MAGENTA "\001\033[0;35m\002" +# define CYAN "\001\033[0;36m\002" +# define RESET "\001\033[0m\002" +# define PROMPT RESET "🐚" GREEN "minishell" RESET ": " +# define PROMPT_LEN 51 + +void token_print(void *param); + +#endif diff --git a/inc/parser.h b/inc/parser.h index 8a8d05e..aafa02a 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -1,23 +1,23 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* parser.h :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/11 14:03:03 by qmennen #+# #+# */ -/* Updated: 2025/02/11 17:19:01 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#ifndef PARSER_H -# define PARSER_H - -# include "minishell.h" - -t_command *parser_command_new(char *cmd); -char **parser_get_arguments(t_list *list, t_minishell *minishell); -t_list *parser_get_commands(t_minishell *minishell); -t_list *parser_get_input_redirects(t_list *list); - -#endif +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* parser.h :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/11 14:03:03 by qmennen #+# #+# */ +/* Updated: 2025/02/11 17:19:01 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#ifndef PARSER_H +# define PARSER_H + +# include "minishell.h" + +t_command *parser_command_new(char *cmd); +char **parser_get_arguments(t_list *list, t_minishell *minishell); +t_list *parser_get_commands(t_minishell *minishell); +t_list *parser_get_input_redirects(t_list *list); + +#endif diff --git a/inc/utils.h b/inc/utils.h index 36087dc..cf269ea 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -1,29 +1,29 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* utils.h :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/05 16:06:35 by whaffman #+# #+# */ -/* Updated: 2025/02/20 18:07:19 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#ifndef UTILS_H -# define UTILS_H - -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); -void simple_builtins(t_minishell *minishell); -void error_msg(char *func, char *msg); -void check_malloc(void *ptr); -char *ft_strdup_safe(const char *str); -char *ft_strjoin_safe(const char *s1, const char *s2); -void *ft_malloc_safe(size_t size); - -#endif // UTILS_H +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* utils.h :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/05 16:06:35 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:07:19 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#ifndef UTILS_H +# define UTILS_H + +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); +void simple_builtins(t_minishell *minishell); +void error_msg(char *func, char *msg); +void check_malloc(void *ptr); +char *ft_strdup_safe(const char *str); +char *ft_strjoin_safe(const char *s1, const char *s2); +void *ft_malloc_safe(size_t size); + +#endif // UTILS_H diff --git a/src/debug/print_commands.c b/src/debug/print_commands.c index 7884a8d..cd5cc23 100644 --- a/src/debug/print_commands.c +++ b/src/debug/print_commands.c @@ -1,52 +1,52 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* print_commands.c :+: :+: */ -/* +:+ */ -/* By: marvin +#+ */ -/* +#+ */ -/* Created: 2025/02/18 20:06:37 by qmennen #+# #+# */ -/* Updated: 2025/02/23 12:43:35 by Quinten ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -void print_commands(void *param) -{ - t_command *command; - int i; - - command = (t_command *)param; - if (!command) - return ; - printf("command: %s\n", command->command); - printf("-- Args: "); - i = 0; - while (command->args[i++]) - printf("%s ", command->args[i]); - printf("\n"); - printf("-- Input redirects:\n"); - ft_lstiter(command->redirect_in, print_redirects); - printf("-- Output redirects:\n"); - ft_lstiter(command->redirect_out, print_redirects); -} - -void print_redirects(void *param) -{ - t_redirect *redirect; - - redirect = (t_redirect *)param; - if (!redirect) - return ; - printf(" Redirect %i value %s\n", redirect->type, redirect->value); -} - -void token_print(void *param) -{ - t_token *token; - - token = (t_token *)param; - printf("token type %i, value %s\n", token->type, token->value); -} - +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* print_commands.c :+: :+: */ +/* +:+ */ +/* By: marvin +#+ */ +/* +#+ */ +/* Created: 2025/02/18 20:06:37 by qmennen #+# #+# */ +/* Updated: 2025/02/23 12:43:35 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void print_commands(void *param) +{ + t_command *command; + int i; + + command = (t_command *)param; + if (!command) + return ; + printf("command: %s\n", command->command); + printf("-- Args: "); + i = 0; + while (command->args[i++]) + printf("%s ", command->args[i]); + printf("\n"); + printf("-- Input redirects:\n"); + ft_lstiter(command->redirect_in, print_redirects); + printf("-- Output redirects:\n"); + ft_lstiter(command->redirect_out, print_redirects); +} + +void print_redirects(void *param) +{ + t_redirect *redirect; + + redirect = (t_redirect *)param; + if (!redirect) + return ; + printf(" Redirect %i value %s\n", redirect->type, redirect->value); +} + +void token_print(void *param) +{ + t_token *token; + + token = (t_token *)param; + printf("token type %i, value %s\n", token->type, token->value); +} + diff --git a/src/main.c b/src/main.c index dec9a74..4b3e413 100644 --- a/src/main.c +++ b/src/main.c @@ -1,43 +1,43 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* main.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ -/* Updated: 2025/02/19 17:59:24 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "libft.h" -#include "minishell.h" -#include "utils.h" - -int main(int argc, char **argv, char **envp) -{ - t_minishell *minishell; - - (void)argc; - (void)argv; - print_banner(); - history_load(); - minishell = init_minishell(); - signal_init_minishell(); - environment_parse(envp, &(minishell->environment)); - while (TRUE) - { - minishell->line = ft_prompt(minishell); - if (minishell->line == NULL) - break ; - minishell->lexer = ft_lexer_new(minishell->line); - minishell->tokens = ft_parse_input(minishell->lexer); - //ft_lstiter(minishell->tokens, token_print); - minishell->commands = parser_get_commands(minishell); - simple_builtins(minishell); - free_minishell_line(minishell); - } - ft_lstclear(&minishell->commands, free_command_list); - free_minishell(minishell); - return (EXIT_SUCCESS); -} +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* main.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/04 16:19:22 by whaffman #+# #+# */ +/* Updated: 2025/02/19 17:59:24 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include "minishell.h" +#include "utils.h" + +int main(int argc, char **argv, char **envp) +{ + t_minishell *minishell; + + (void)argc; + (void)argv; + print_banner(); + history_load(); + minishell = init_minishell(); + signal_init_minishell(); + environment_parse(envp, &(minishell->environment)); + while (TRUE) + { + minishell->line = ft_prompt(minishell); + if (minishell->line == NULL) + break ; + minishell->lexer = ft_lexer_new(minishell->line); + minishell->tokens = ft_parse_input(minishell->lexer); + //ft_lstiter(minishell->tokens, token_print); + minishell->commands = parser_get_commands(minishell); + simple_builtins(minishell); + free_minishell_line(minishell); + } + ft_lstclear(&minishell->commands, free_command_list); + free_minishell(minishell); + return (EXIT_SUCCESS); +} diff --git a/src/utils/check_malloc.c b/src/utils/check_malloc.c index a7ae1d5..fff6fad 100644 --- a/src/utils/check_malloc.c +++ b/src/utils/check_malloc.c @@ -1,23 +1,23 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* check_malloc.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/20 18:00:10 by whaffman #+# #+# */ -/* Updated: 2025/02/20 18:01:08 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - - -void check_malloc(void *ptr) -{ - if (ptr == NULL) - { - error_msg("malloc", "can't allocate memory"); - exit(1); - } -} +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* check_malloc.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 18:00:10 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:01:08 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + + +void check_malloc(void *ptr) +{ + if (ptr == NULL) + { + error_msg("malloc", "can't allocate memory"); + exit(1); + } +} diff --git a/src/utils/error_msg.c b/src/utils/error_msg.c index bb985e4..6442019 100644 --- a/src/utils/error_msg.c +++ b/src/utils/error_msg.c @@ -1,34 +1,34 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* error_msg.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/20 17:03:13 by whaffman #+# #+# */ -/* Updated: 2025/02/20 17:59:36 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - - -void error_msg(char *func, char *msg) -{ - if (errno) - perror(RED BOLD "minishell" RESET); - else - { - ft_putstr_fd(RED BOLD "minishell" RESET ": ", 2); - if (func != NULL) - { - ft_putstr_fd(func, 2); - ft_putstr_fd(": ", 2); - } - if (msg != NULL) - ft_putstr_fd(msg, 2); - else - ft_putstr_fd("general error", 2); - ft_putstr_fd("\n", 2); - } -} +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* error_msg.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 17:03:13 by whaffman #+# #+# */ +/* Updated: 2025/02/20 17:59:36 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + + +void error_msg(char *func, char *msg) +{ + if (errno) + perror(RED BOLD "minishell" RESET); + else + { + ft_putstr_fd(RED BOLD "minishell" RESET ": ", 2); + if (func != NULL) + { + ft_putstr_fd(func, 2); + ft_putstr_fd(": ", 2); + } + if (msg != NULL) + ft_putstr_fd(msg, 2); + else + ft_putstr_fd("general error", 2); + ft_putstr_fd("\n", 2); + } +} diff --git a/src/utils/free_command_list.c b/src/utils/free_command_list.c index 4654515..5ed7a59 100644 --- a/src/utils/free_command_list.c +++ b/src/utils/free_command_list.c @@ -1,62 +1,62 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* free_command_list.c :+: :+: */ -/* +:+ */ -/* By: marvin +#+ */ -/* +#+ */ -/* Created: 2025/02/11 14:24:05 by qmennen #+# #+# */ -/* Updated: 2025/02/23 12:40:17 by Quinten ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -static void free_args(char **args) -{ - int i; - - i = 0; - while (args[i]) - { - free(args[i]); - i++; - } - free(args); -} - -static void free_redirects(t_list *lst) -{ - t_redirect *redir; - t_list *current; - t_list *last; - - current = lst; - while (current) - { - last = current; - redir = (t_redirect *)current->content; - if (redir && redir->value) - free(redir->value); - if (redir) - free(redir); - current = current->next; - free(last); - } -} - -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); - if (command->redirect_in) - free_redirects(command->redirect_in); - if (command->redirect_out) - free_redirects(command->redirect_out); - free(command); -} +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* free_command_list.c :+: :+: */ +/* +:+ */ +/* By: marvin +#+ */ +/* +#+ */ +/* Created: 2025/02/11 14:24:05 by qmennen #+# #+# */ +/* Updated: 2025/02/23 12:40:17 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static void free_args(char **args) +{ + int i; + + i = 0; + while (args[i]) + { + free(args[i]); + i++; + } + free(args); +} + +static void free_redirects(t_list *lst) +{ + t_redirect *redir; + t_list *current; + t_list *last; + + current = lst; + while (current) + { + last = current; + redir = (t_redirect *)current->content; + if (redir && redir->value) + free(redir->value); + if (redir) + free(redir); + current = current->next; + free(last); + } +} + +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); + if (command->redirect_in) + free_redirects(command->redirect_in); + if (command->redirect_out) + free_redirects(command->redirect_out); + free(command); +} diff --git a/src/utils/ft_malloc_safe.c b/src/utils/ft_malloc_safe.c index eeb6923..5c601f2 100644 --- a/src/utils/ft_malloc_safe.c +++ b/src/utils/ft_malloc_safe.c @@ -1,22 +1,22 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* ft_malloc_safe.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/20 18:06:46 by whaffman #+# #+# */ -/* Updated: 2025/02/20 18:07:00 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -void *ft_malloc_safe(size_t size) -{ - void *ptr; - - ptr = malloc(size); - check_malloc(ptr); - return (ptr); -} +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* ft_malloc_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 18:06:46 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:07:00 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void *ft_malloc_safe(size_t size) +{ + void *ptr; + + ptr = malloc(size); + check_malloc(ptr); + return (ptr); +} diff --git a/src/utils/ft_strdup_safe.c b/src/utils/ft_strdup_safe.c index c0fe7fb..bb52b05 100644 --- a/src/utils/ft_strdup_safe.c +++ b/src/utils/ft_strdup_safe.c @@ -1,22 +1,22 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* ft_strdup_safe.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/20 18:01:27 by whaffman #+# #+# */ -/* Updated: 2025/02/20 18:04:53 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -char *ft_strdup_safe(const char *str) -{ - char *new_str; - - new_str = ft_strdup(str); - check_malloc(new_str); - return (new_str); -} +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* ft_strdup_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 18:01:27 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:04:53 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *ft_strdup_safe(const char *str) +{ + char *new_str; + + new_str = ft_strdup(str); + check_malloc(new_str); + return (new_str); +} diff --git a/src/utils/ft_strjoin_safe.c b/src/utils/ft_strjoin_safe.c index 27c8d0f..8a41829 100644 --- a/src/utils/ft_strjoin_safe.c +++ b/src/utils/ft_strjoin_safe.c @@ -1,23 +1,23 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* ft_strjoin_safe.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/20 18:02:31 by whaffman #+# #+# */ -/* Updated: 2025/02/20 18:04:23 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -char *ft_strjoin_safe(const char *s1, const char *s2) -{ - char *new_str; - - new_str = ft_strjoin(s1, s2); - check_malloc(new_str); - return (new_str); -} - +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* ft_strjoin_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 18:02:31 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:04:23 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *ft_strjoin_safe(const char *s1, const char *s2) +{ + char *new_str; + + new_str = ft_strjoin(s1, s2); + check_malloc(new_str); + return (new_str); +} + From fd72fbb0d31d9742f17022569b1abe7a9d3a36d6 Mon Sep 17 00:00:00 2001 From: Quinten Date: Sun, 23 Feb 2025 13:11:06 +0100 Subject: [PATCH 040/103] general fixes to redirects --- src/parser/parser_get_commands.c | 2 +- src/redirect/redirect_get_inputs.c | 2 ++ src/redirect/redirect_get_outputs.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 6725b8c..cbf115e 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -14,7 +14,7 @@ static int is_command_token(t_token *token) { - return (token->type < 3 || redirect_token_type(token)); + return (token->type < 3 || token->type == T_REDIRECT_IN || token->type ==T_HEREDOC || token->type == T_REDIRECT_OUT || token->type == T_APPEND_OUT); } t_list *parser_get_commands(t_minishell *minishell) diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index 1ea9f8b..a44a6fe 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -23,6 +23,8 @@ t_list *redirect_get_inputs(t_list *list) while (current) { token = (t_token *)current->content; + if (token->type == T_PIPE || token->type == T_EOF) + break ; if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) { current = current->next; diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index 18cc0dc..9383bf6 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -23,6 +23,8 @@ t_list *redirect_get_outputs(t_list *list) while (current) { token = (t_token *)current->content; + if (token->type == T_PIPE || token->type == T_EOF) + break; if (token->type != T_REDIRECT_OUT && token->type != T_APPEND_OUT) { current = current->next; From e13eff066921d2f58ffbdb419221f73f82d006b9 Mon Sep 17 00:00:00 2001 From: Quinten Date: Sun, 23 Feb 2025 13:12:06 +0100 Subject: [PATCH 041/103] util --- src/parser/parser_get_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index cbf115e..6725b8c 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -14,7 +14,7 @@ static int is_command_token(t_token *token) { - return (token->type < 3 || token->type == T_REDIRECT_IN || token->type ==T_HEREDOC || token->type == T_REDIRECT_OUT || token->type == T_APPEND_OUT); + return (token->type < 3 || redirect_token_type(token)); } t_list *parser_get_commands(t_minishell *minishell) From 8b33185add356fb6df2e7ada7b1b4b04aadcd108 Mon Sep 17 00:00:00 2001 From: Quinten Date: Sun, 23 Feb 2025 13:14:48 +0100 Subject: [PATCH 042/103] readability --- inc/redirect.h | 2 ++ src/redirect/redirect_get_inputs.c | 2 +- src/redirect/redirect_get_outputs.c | 2 +- src/redirect/redirect_valid_type.c | 8 +++++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/inc/redirect.h b/inc/redirect.h index 98a86e3..5cffd36 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -19,4 +19,6 @@ t_list *redirect_get_inputs(t_list *list); t_list *redirect_get_outputs(t_list *list); int redirect_is_valid(t_list *lst, t_token *token); int redirect_token_type(t_token *token); +int redirect_is_delimiter(t_token *token); + #endif \ No newline at end of file diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index a44a6fe..b6e0828 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -23,7 +23,7 @@ t_list *redirect_get_inputs(t_list *list) while (current) { token = (t_token *)current->content; - if (token->type == T_PIPE || token->type == T_EOF) + if (redirect_is_delimiter(token)) break ; if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) { diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index 9383bf6..8daee58 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -23,7 +23,7 @@ t_list *redirect_get_outputs(t_list *list) while (current) { token = (t_token *)current->content; - if (token->type == T_PIPE || token->type == T_EOF) + if (redirect_is_delimiter(token)) break; if (token->type != T_REDIRECT_OUT && token->type != T_APPEND_OUT) { diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c index 2df0a3d..2554d32 100644 --- a/src/redirect/redirect_valid_type.c +++ b/src/redirect/redirect_valid_type.c @@ -28,4 +28,10 @@ int redirect_is_valid(t_list *lst, t_token *token) if (!next) return (0); return (redirect_token_type(token) && next->type < 3); -} \ No newline at end of file +} + +int redirect_is_delimiter(t_token *token) +{ + return (token->type == T_PIPE || token->type == T_AND || + token->type == T_OR || token->type == T_EOF || token->type == T_ERROR); +} \ No newline at end of file From 757aea646414e21dd0d56540928034b38b229dd0 Mon Sep 17 00:00:00 2001 From: whaffman Date: Sun, 23 Feb 2025 13:33:09 +0100 Subject: [PATCH 043/103] make help --- Makefile | 46 +++++++++++++++++++++++++++++----------- src/utils/print_banner.c | 2 +- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 8d04098..943141f 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: qmennen +#+ # # +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/23 11:20:52 by willem ######## odam.nl # +# Updated: 2025/02/23 12:30:21 by willem ######## odam.nl # # # # **************************************************************************** # @@ -53,13 +53,12 @@ $(1): CFLAGS = $$($(1)_CFLAGS) $(1): $(BUILD_PATH)/$(1)/$(NAME) .PHONY: run_$(1) - run_$(1): $(1) - $$(info $(bold)$(green)Running $(1)$(reset)) + $$(info $$(bold)$$(green)Running $(1)$$(reset)) ./$(BUILD_PATH)/$(1)/$(NAME) $(BUILD_PATH)/$(1)/$(NAME): $(LIBFT) $$($(1)_OBJECTS) - $$(info $(bold)$(green)Linking $(1) config$(reset)) + $$(info $$(bold)$$(green)Linking $(1) config$$(reset)) $$(CC) $$(CFLAGS) $$($(1)_OBJECTS) $$(LDLIBS) -o $$@ -include $$($(1)_DEPENDS) @@ -68,7 +67,7 @@ $$($(1)_OBJ_PATH)/%.o: %.c $(LIBFT) | $$($(1)_OBJ_PATH) $$(CC) $$(CFLAGS) $$(INCLUDES) -MMD -MP -c $$< -o $$@ $$($(1)_OBJ_PATH): - $$(info $(bold)$(green)Creating $(1) object directory$(reset)) + $$(info $$(bold)$$(green)Creating $(1) object directory$$(reset)) mkdir -p $$@ endef @@ -81,10 +80,10 @@ $(foreach config,$(BUILD_CONFIGS),$(eval $(call BUILD_TARGETS,$(config)))) # Build all configurations all: release debug asan tsan - $(info $(bold)$(green)Building all$(reset)) + $(info $(bold)$(green)All builc config have been build$(reset)) # Build libft -$(LIBFT): $(LIBFT_PATH) check-and-reinit-submodules +$(LIBFT): $(LIBFT_PATH) submodules $(info $(bold)$(green)Building libft$(reset)) $(MAKE) -C $(LIBFT_PATH) @@ -118,11 +117,10 @@ re: fclean # Run the project with the release build configuration run: run_release - $(info $(bold)$(green)Running$(reset)) # Remove sources.mk to force regeneration srcs: - $(info $(bold)$(green)Regenerating sources.mk$(reset)) + $(info $(bold)$(green)Regenerating sources.mk on next make$(reset)) $(RM) sources.mk # Show this help. @@ -130,11 +128,35 @@ help: @echo "Usage: make [target]" @echo "" @echo "Targets:" - @awk '/^#/{c=substr($$0,3);next}c&&/^[[:alpha:]][[:alnum:]_-]+:/{print substr($$1,1,index($$1,":")),c}1{c=0}' $(MAKEFILE_LIST) | column -s: -t + @echo " $(green)$(bold)all $(reset)- Build all configurations (release, debug, asan, tsan)" + @echo " $(green)$(bold)clean $(reset)- Remove build artifacts" + @echo " $(green)$(bold)fclean $(reset)- Remove build artifacts and the executable" + @echo " $(green)$(bold)re $(reset)- Rebuild the project" + @echo " $(green)$(bold)run $(reset)- Run the release build" + @echo " $(green)$(bold)srcs $(reset)- Remove sources.mk" + @echo " $(green)$(bold)help $(reset)- Show this help message" + @echo "" + @echo "Build configurations:" + @echo " $(green)$(bold)release $(reset)- Build with release configuration" + @echo " $(green)$(bold)debug $(reset)- Build with debug configuration" + @echo " $(green)$(bold)asan $(reset)- Build with AddressSanitizer configuration" + @echo " $(green)$(bold)tsan $(reset)- Build with ThreadSanitizer configuration" + @echo "" + @echo "Run configurations:" + @echo " $(green)$(bold)run_release $(reset)- Run the release build" + @echo " $(green)$(bold)run_debug $(reset)- Run the debug build" + @echo " $(green)$(bold)run_asan $(reset)- Run the AddressSanitizer build" + @echo " $(green)$(bold)run_tsan $(reset)- Run the ThreadSanitizer build" + @echo "" + @echo "Other targets:" + @echo " $(green)$(bold)submodules $(reset)- Check and reinitialize git submodules" + @echo " $(green)$(bold)libft $(reset)- Build libft" + @echo " $(green)$(bold)sources.mk $(reset)- Generate sources.mk" @echo "" -.PHONY: check-and-reinit-submodules -check-and-reinit-submodules: + +.PHONY: submodules +submodules: $(info $(bold)$(green)Checking and reinitializing submodules$(reset)) @if git submodule status | egrep -q '^[-+]' ; then \ echo "INFO: Need to reinitialize git submodules"; \ diff --git a/src/utils/print_banner.c b/src/utils/print_banner.c index 7914508..1cdc64d 100644 --- a/src/utils/print_banner.c +++ b/src/utils/print_banner.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:04:44 by whaffman #+# #+# */ -/* Updated: 2025/02/05 16:05:07 by whaffman ######## odam.nl */ +/* Updated: 2025/02/23 12:31:28 by willem ######## odam.nl */ /* */ /* ************************************************************************** */ From ab72bd5bbb22ff933bf4213329244bd843cf680d Mon Sep 17 00:00:00 2001 From: whaffman Date: Tue, 25 Feb 2025 14:54:17 +0100 Subject: [PATCH 044/103] malloc_safe - add freelist to minishell - add t_minishell *minishell to all function calling malloc_free - substituted all malloc calls but the first to malloc_safe --- inc/environment.h | 17 +++++----- inc/executor.h | 8 ++--- inc/expander.h | 7 ++-- inc/parser.h | 2 +- inc/redirect.h | 8 ++--- inc/tokenizer.h | 26 +++++++-------- inc/typedef.h | 15 +++++---- inc/utils.h | 8 ++--- sources.mk | 42 +++++++++++++----------- src/builtin/builtin_cd.c | 4 +-- src/builtin/builtin_env.c | 4 +-- src/builtin/builtin_export.c | 6 ++-- src/builtin/builtin_unset.c | 6 ++-- src/environment/environment_add.c | 8 +++-- src/environment/environment_del.c | 8 ++--- src/environment/environment_free_list.c | 6 ++-- src/environment/environment_get.c | 6 ++-- src/environment/environment_get_arr.c | 14 ++++---- src/environment/environment_parse.c | 8 ++--- src/environment/environment_print.c | 11 ++----- src/executor/executor_absolute_path.c | 10 +++--- src/executor/executor_child.c | 9 ++--- src/executor/executor_create_pipes.c | 4 +-- src/executor/executor_execute_pipeline.c | 4 +-- src/executor/executor_fork.c | 6 ++-- src/expander/expander_allocate_memory.c | 23 +++++++------ src/expander/expander_get_variable.c | 16 ++++----- src/expander/expander_parse_string.c | 16 ++++----- src/lexer/lexer_new.c | 27 +++++++-------- src/lexer/lexer_parse_input.c | 20 ++++++----- src/lexer/lexer_read_word.c | 24 +++++++------- src/lexer/lexer_token_next.c | 16 ++++----- src/main.c | 6 ++-- src/parser/parser_get_arguments.c | 9 ++--- src/parser/parser_get_commands.c | 6 ++-- src/parser/parser_new_command.c | 12 +++---- src/prompt/prompt.c | 35 ++++++++------------ src/redirect/redirect_get_inputs.c | 10 +++--- src/redirect/redirect_get_outputs.c | 8 ++--- src/redirect/redirect_new.c | 6 ++-- src/token/token_new.c | 23 +++++-------- src/token/token_parse.c | 18 +++++----- src/utils/check_malloc.c | 8 ++++- src/utils/free_freelist.c | 18 ++++++++++ src/utils/free_minishell.c | 4 +-- src/utils/ft_malloc_safe.c | 4 +-- src/utils/ft_strdup_safe.c | 4 +-- src/utils/ft_strjoin_safe.c | 4 +-- src/utils/init_minishell.c | 3 +- 49 files changed, 289 insertions(+), 278 deletions(-) create mode 100644 src/utils/free_freelist.c diff --git a/inc/environment.h b/inc/environment.h index d98c3c3..c8a467b 100644 --- a/inc/environment.h +++ b/inc/environment.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:26:35 by whaffman #+# #+# */ -/* Updated: 2025/02/11 15:39:15 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:31:55 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,13 +15,14 @@ # include "minishell.h" -void environment_add(t_list **environment, char *name, char *value); -void environment_print(t_list *environment); -t_environment *environment_get(t_list *environment, char *name); -void environment_free_list(t_list **environment); -int environment_parse(char **envp, t_list **environment); -char **environment_get_arr(t_list *environment); -void environment_del(t_list **environment, char *name); +void environment_add(t_minishell *minishell, + char *name, char *value); +void environment_print(t_minishell *minishell); +t_environment *environment_get(t_minishell *minishell, char *name); +void environment_free_list(t_minishell *minishell); +int environment_parse(t_minishell *minishell, char **envp); +char **environment_get_arr(t_minishell *minishell); +void environment_del(t_minishell *minishell, char *name); void environment_free(void *content); #endif // ENVIRONMENT_H diff --git a/inc/executor.h b/inc/executor.h index 82ec74f..d305646 100644 --- a/inc/executor.h +++ b/inc/executor.h @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:06:07 by willem #+# #+# */ -/* Updated: 2025/02/21 13:16:29 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:52:05 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,9 +15,9 @@ # include "minishell.h" -char *executor_absolute_path(t_list *env, char *cmd); -void executor_child(t_command *command); -pid_t executor_fork(t_command *command); +char *executor_absolute_path(t_minishell *minishell, char *cmd); +void executor_child(t_minishell *minishell, t_command *command); +pid_t executor_fork(t_minishell *minishell, t_command *command); void executor_create_pipes(t_minishell *minishell); int executor_execute_pipeline(t_minishell *minishell); void executor_close_fds(int n_fds); diff --git a/inc/expander.h b/inc/expander.h index e491c6e..db6158a 100644 --- a/inc/expander.h +++ b/inc/expander.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/18 19:00:51 by qmennen #+# #+# */ -/* Updated: 2025/02/21 16:13:32 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 14:32:18 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -19,7 +19,10 @@ t_environment *expander_get_var(const char *s, int idx, t_minishell *minishell); t_list *expander_parse_variables(const char *s, t_minishell *minishell); -char *expander_allocate_memory(const char *s, t_list *variables); +char *expander_allocate_memory( + t_minishell *minishell, + const char *s, + t_list *variables); char *expander_parse_string(char *s, t_minishell *minishell); int expander_character_valid(const char c); int expander_expand_dollar(char *src, char *dest, diff --git a/inc/parser.h b/inc/parser.h index aafa02a..13250e4 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -15,7 +15,7 @@ # include "minishell.h" -t_command *parser_command_new(char *cmd); +t_command *parser_command_new(t_minishell *minishell, char *cmd); char **parser_get_arguments(t_list *list, t_minishell *minishell); t_list *parser_get_commands(t_minishell *minishell); t_list *parser_get_input_redirects(t_list *list); diff --git a/inc/redirect.h b/inc/redirect.h index 5cffd36..d9b5911 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -14,11 +14,11 @@ # define REDIRECT_H # include "minishell.h" -t_redirect *redirect_new(t_token_type type, char *value); -t_list *redirect_get_inputs(t_list *list); -t_list *redirect_get_outputs(t_list *list); +t_redirect *redirect_new(t_minishell *minishell, t_token_type type, char *value); +t_list *redirect_get_inputs(t_minishell *minishell, t_list *list); +t_list *redirect_get_outputs(t_minishell *minishell, t_list *list); int redirect_is_valid(t_list *lst, t_token *token); int redirect_token_type(t_token *token); int redirect_is_delimiter(t_token *token); -#endif \ No newline at end of file +#endif diff --git a/inc/tokenizer.h b/inc/tokenizer.h index 306bc03..37ccacf 100644 --- a/inc/tokenizer.h +++ b/inc/tokenizer.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* tokenizer.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ -/* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */ +/* :::::::: */ +/* tokenizer.h :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ +/* Updated: 2025/02/25 14:45:15 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -16,18 +16,18 @@ /** * Lexer */ -t_lexer *ft_lexer_new(const char *input); +t_lexer *ft_lexer_new(t_minishell *minishell); void ft_lexer_free(t_lexer *lexer); void lexer_readchar(t_lexer *lexer); -char *lexer_readword(t_lexer *lexer); -t_list *ft_parse_input(t_lexer *lexer); +char *lexer_readword(t_minishell *minishell, t_lexer *lexer); +t_list *ft_parse_input(t_minishell *minishell); /** * Token */ -t_token *ft_token_next(t_lexer *lexer); -t_token *token_new(t_token_type type, char *c, int pos); +t_token *ft_token_next(t_minishell *minishell, t_lexer *lexer); +t_token *token_new(t_minishell *minishell, t_token_type type, char *c, int pos); void ft_token_free(t_token *token); void ft_clear_tokenlist(void *content); -t_token *token_parse(t_lexer *lexer); +t_token *token_parse(t_minishell *minishell, t_lexer *lexer); #endif // TOKENIZER_H diff --git a/inc/typedef.h b/inc/typedef.h index a5e6799..53d848c 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* typedef.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/20 16:45:55 by qmennen ### ########.fr */ +/* :::::::: */ +/* typedef.h :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ +/* Updated: 2025/02/25 13:23:12 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -78,6 +78,7 @@ typedef struct s_minishell t_lexer *lexer; t_list *tokens; t_list *commands; + t_list *freelist; } t_minishell; typedef int (*t_builtin_fn)(t_minishell *, t_command *); diff --git a/inc/utils.h b/inc/utils.h index cf269ea..30a6dab 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -21,9 +21,9 @@ void print_banner(void); void print_list(void *content); void simple_builtins(t_minishell *minishell); void error_msg(char *func, char *msg); -void check_malloc(void *ptr); -char *ft_strdup_safe(const char *str); -char *ft_strjoin_safe(const char *s1, const char *s2); -void *ft_malloc_safe(size_t size); +void check_malloc(t_minishell *minishell, void *ptr); +char *ft_strdup_safe(t_minishell *minishell, const char *str); +char *ft_strjoin_safe(t_minishell *minishell, const char *s1, const char *s2); +void *malloc_safe(t_minishell *minishell, size_t size); #endif // UTILS_H diff --git a/sources.mk b/sources.mk index 862e5a7..391e82e 100644 --- a/sources.mk +++ b/sources.mk @@ -1,20 +1,22 @@ -VPATH = src:src/parser:src/environment:src/lexer:src/debug:src/token:src/signal:src/prompt:src/utils:src/expander:src/executor:src/builtin: -SOURCES = parser_get_arguments.c parser_new_command.c parser_get_commands.c \ -environment_get.c environment_get_arr.c environment_free_list.c \ -environment_add.c environment_print.c environment_del.c \ -environment_free.c environment_parse.c lexer_new.c lexer_read_word.c \ -lexer_read_char.c lexer_parse_input.c lexer_token_next.c \ -print_commands.c main.c token_new.c token_parse.c signal.c \ -history_write.c prompt.c history_load.c ft_malloc_safe.c \ -free_command_list.c free_minishell.c free_lexer.c print_banner.c \ -check_malloc.c error_msg.c free_token_list.c free_minishell_line.c \ -ft_strdup_safe.c free_token.c init_minishell.c ft_strjoin_safe.c \ -expander_allocate_memory.c expander_parse_string.c \ -expander_parse_variables.c expander_expand_dollar.c \ -expander_is_character.c expander_get_variable.c executor_open_fds.c \ -executor_count_fds.c executor_fork.c executor_absolute_path.c \ -executor_execute_pipeline.c executor_child.c executor_close_fds.c \ -executor_create_redirects.c executor_create_pipes.c builtin_export.c \ -simple_builtins.c builtin_router.c is_builtin.c builtin_unset.c \ -builtin_env.c builtin_cd.c builtin_pwd.c builtin_exit.c \ -builtin_echo.c \ +VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/signal:src/debug:src/expander:src/builtin:src/redirect: +SOURCES = history_load.c history_write.c prompt.c free_lexer.c free_token.c \ +free_token_list.c free_minishell.c free_minishell_line.c \ +init_minishell.c check_malloc.c error_msg.c free_command_list.c \ +ft_malloc_safe.c ft_strdup_safe.c ft_strjoin_safe.c print_banner.c \ +free_freelist.c lexer_read_char.c lexer_token_next.c \ +lexer_parse_input.c lexer_new.c lexer_read_word.c token_new.c \ +token_parse.c environment_free.c environment_del.c \ +environment_free_list.c environment_get.c environment_parse.c \ +environment_add.c environment_get_arr.c environment_print.c \ +executor_close_fds.c executor_child.c executor_fork.c \ +executor_absolute_path.c executor_execute_pipeline.c \ +executor_count_fds.c executor_create_redirects.c executor_open_fds.c \ +executor_create_pipes.c parser_get_arguments.c parser_new_command.c \ +parser_get_commands.c signal.c print_commands.c \ +expander_expand_dollar.c expander_get_variable.c \ +expander_is_character.c expander_parse_variables.c \ +expander_parse_string.c expander_allocate_memory.c builtin_cd.c \ +builtin_echo.c builtin_env.c builtin_export.c builtin_pwd.c \ +builtin_router.c builtin_unset.c simple_builtins.c builtin_exit.c \ +is_builtin.c main.c redirect_get_inputs.c redirect_get_outputs.c \ +redirect_new.c redirect_valid_type.c \ diff --git a/src/builtin/builtin_cd.c b/src/builtin/builtin_cd.c index 664cea8..1075101 100644 --- a/src/builtin/builtin_cd.c +++ b/src/builtin/builtin_cd.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:33:07 by whaffman #+# #+# */ -/* Updated: 2025/02/20 12:49:36 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:57:57 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ int builtin_cd(t_minishell *minishell, t_command *cmd) if (cmd->args[1] == NULL) { - env = environment_get(minishell->environment, "HOME"); + env = environment_get(minishell, "HOME"); if (env == NULL || env->value == NULL) { ft_putendl_fd("minishell: cd: HOME not set", STDERR_FILENO); diff --git a/src/builtin/builtin_env.c b/src/builtin/builtin_env.c index 42a119a..0888c66 100644 --- a/src/builtin/builtin_env.c +++ b/src/builtin/builtin_env.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:33:02 by whaffman #+# #+# */ -/* Updated: 2025/02/20 12:17:10 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:57:49 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,6 +15,6 @@ int builtin_env(t_minishell *minishell, t_command *cmd) { (void)cmd; - environment_print(minishell->environment); + environment_print(minishell); return (SUCCESS); } diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c index 38dccbc..acdc31a 100644 --- a/src/builtin/builtin_export.c +++ b/src/builtin/builtin_export.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */ -/* Updated: 2025/02/20 12:30:21 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:57:08 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -28,14 +28,14 @@ int builtin_export(t_minishell *minishell, t_command *cmd) i++; continue ; } - env = environment_get(minishell->environment, arr[0]); + env = environment_get(minishell, arr[0]); if (env != NULL) { free(env->value); env->value = ft_strdup(arr[1]); //TODO: malloc check } else - environment_add(&(minishell->environment), arr[0], arr[1]); + environment_add(minishell, arr[0], arr[1]); ft_free_arr(arr); i++; } diff --git a/src/builtin/builtin_unset.c b/src/builtin/builtin_unset.c index 9bef151..474e2ea 100644 --- a/src/builtin/builtin_unset.c +++ b/src/builtin/builtin_unset.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:25:43 by whaffman #+# #+# */ -/* Updated: 2025/02/20 15:04:59 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:57:29 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -19,8 +19,8 @@ int builtin_unset(t_minishell *minishell, t_command *cmd) i = 1; while (cmd->args[i] != NULL) { - if (environment_get(minishell->environment, cmd->args[i]) != NULL) - environment_del(&(minishell->environment), cmd->args[i]); + if (environment_get(minishell, cmd->args[i]) != NULL) + environment_del(minishell, cmd->args[i]); i++; } return (SUCCESS); diff --git a/src/environment/environment_add.c b/src/environment/environment_add.c index 1f20b01..a2e395e 100644 --- a/src/environment/environment_add.c +++ b/src/environment/environment_add.c @@ -6,20 +6,22 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:33 by whaffman #+# #+# */ -/* Updated: 2025/02/12 21:33:20 by willem ######## odam.nl */ +/* Updated: 2025/02/25 14:28:43 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_add(t_list **environment, char *name, char *value) +void environment_add(t_minishell *minishell, char *name, char *value) { t_environment *new_environment; t_list *new_node; + t_list **environment; + environment = &minishell->environment; if (name != NULL && value != NULL) { - new_environment = malloc(sizeof(t_environment)); + new_environment = malloc_safe(minishell, sizeof(t_environment)); if (new_environment == NULL) return (perror("malloc")); new_environment->name = ft_strdup(name); diff --git a/src/environment/environment_del.c b/src/environment/environment_del.c index 6a7fd35..0238a1a 100644 --- a/src/environment/environment_del.c +++ b/src/environment/environment_del.c @@ -6,13 +6,13 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/11 14:17:53 by whaffman #+# #+# */ -/* Updated: 2025/02/11 17:20:26 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:41:06 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_del(t_list **environment, char *name) +void environment_del(t_minishell *minishell, char *name) { t_list *prev; t_list *current; @@ -21,7 +21,7 @@ void environment_del(t_list **environment, char *name) prev = NULL; next = NULL; - current = *environment; + current = minishell->environment; while (current != NULL) { env = (t_environment *)current->content; @@ -31,7 +31,7 @@ void environment_del(t_list **environment, char *name) environment_free(current->content); free(current); if (prev == NULL) - *environment = next; + minishell->environment = next; else prev->next = next; return ; diff --git a/src/environment/environment_free_list.c b/src/environment/environment_free_list.c index 2e1905c..022189e 100644 --- a/src/environment/environment_free_list.c +++ b/src/environment/environment_free_list.c @@ -6,13 +6,13 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:59 by whaffman #+# #+# */ -/* Updated: 2025/02/11 17:18:27 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:37:21 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_free_list(t_list **environment) +void environment_free_list(t_minishell *minishell) { - ft_lstclear(environment, environment_free); + ft_lstclear(&(minishell->environment), environment_free); } diff --git a/src/environment/environment_get.c b/src/environment/environment_get.c index 280698e..beb2315 100644 --- a/src/environment/environment_get.c +++ b/src/environment/environment_get.c @@ -6,16 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:15:05 by whaffman #+# #+# */ -/* Updated: 2025/02/11 17:04:28 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:35:13 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_environment *environment_get(t_list *environment, char *name) +t_environment *environment_get(t_minishell *minishell, char *name) { t_environment *env; + t_list *environment; + environment = minishell->environment; while (environment != NULL) { env = (t_environment *)environment->content; diff --git a/src/environment/environment_get_arr.c b/src/environment/environment_get_arr.c index 8052e04..c7d9b68 100644 --- a/src/environment/environment_get_arr.c +++ b/src/environment/environment_get_arr.c @@ -6,28 +6,26 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 13:59:48 by willem #+# #+# */ -/* Updated: 2025/02/11 17:18:15 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 14:29:49 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -char **environment_get_arr(t_list *environment) +char **environment_get_arr(t_minishell *minishell) { char **arr; t_environment *env; int i; + t_list *environment; - arr = malloc(sizeof(char *) * (ft_lstsize(environment) + 1)); - if (arr == NULL) - return (NULL); + environment = minishell->environment; + arr = malloc_safe(minishell, sizeof(char *) * (ft_lstsize(environment) + 1)); i = 0; while (environment != NULL) { env = (t_environment *)environment->content; - arr[i] = malloc(ft_strlen(env->name) + ft_strlen(env->value) + 2); - if (arr[i] == NULL) - return (ft_free_arr(arr), NULL); + arr[i] = malloc_safe(minishell, ft_strlen(env->name) + ft_strlen(env->value) + 2); ft_strlcpy(arr[i], env->name, ft_strlen(env->name) + 1); ft_strlcat(arr[i], "=", ft_strlen(env->name) + 2); ft_strlcat(arr[i], env->value, diff --git a/src/environment/environment_parse.c b/src/environment/environment_parse.c index 3abd042..d4a436f 100644 --- a/src/environment/environment_parse.c +++ b/src/environment/environment_parse.c @@ -6,23 +6,23 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 15:52:33 by whaffman #+# #+# */ -/* Updated: 2025/02/11 17:18:43 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:42:22 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int environment_parse(char **envp, t_list **environment) +int environment_parse(t_minishell *minishell, char **envp) { char **env; - *environment = NULL; + if (envp == NULL) return (FAILURE); while (*envp != NULL) { env = ft_split(*envp, '='); - environment_add(environment, env[0], env[1]); + environment_add(minishell, env[0], env[1]); ft_free_arr(env); envp++; } diff --git a/src/environment/environment_print.c b/src/environment/environment_print.c index e5c7b52..7720ec4 100644 --- a/src/environment/environment_print.c +++ b/src/environment/environment_print.c @@ -6,23 +6,18 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 13:52:08 by willem #+# #+# */ -/* Updated: 2025/02/11 17:05:10 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:39:45 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_print(t_list *environment) +void environment_print(t_minishell *minishell) { char **arr; int i; - arr = environment_get_arr(environment); - if (arr == NULL) - { - perror("malloc"); - return ; - } + arr = environment_get_arr(minishell); i = 0; while (arr[i] != NULL) { diff --git a/src/executor/executor_absolute_path.c b/src/executor/executor_absolute_path.c index 178d72a..e4af0d6 100644 --- a/src/executor/executor_absolute_path.c +++ b/src/executor/executor_absolute_path.c @@ -6,13 +6,13 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:00:24 by willem #+# #+# */ -/* Updated: 2025/02/13 15:04:09 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 14:30:18 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -char *executor_absolute_path(t_list *env, char *cmd) +char *executor_absolute_path(t_minishell *minishell, char *cmd) { char **path; t_environment *path_env; @@ -30,16 +30,14 @@ char *executor_absolute_path(t_list *env, char *cmd) } return (NULL); } - path_env = environment_get(env, "PATH"); + path_env = environment_get(minishell, "PATH"); if (!path_env) return (NULL); path = ft_split(path_env->value, ':'); i = 0; while (path[i] != NULL) { - executable = malloc(ft_strlen(path[i]) + ft_strlen(cmd) + 2); - if (!executable) - return (ft_free_arr(path), NULL); + executable = malloc_safe(minishell, ft_strlen(path[i]) + ft_strlen(cmd) + 2); ft_strlcpy(executable, path[i], ft_strlen(path[i]) + 1); ft_strlcat(executable, "/", ft_strlen(path[i]) + 2); ft_strlcat(executable, cmd, ft_strlen(path[i]) + ft_strlen(cmd) + 2); diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index b69206b..125acbb 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,21 +6,22 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/19 12:56:03 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:52:53 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void executor_child(t_command *command) +void executor_child(t_minishell *minishell, t_command *command) { char *path; + if (command->fd_in != 0) dup2(command->fd_in, 0); if (command->fd_out != 1) dup2(command->fd_out, 1); executor_close_fds(command->n_fds); - path = executor_absolute_path(command->environment, command->command); + path = executor_absolute_path(minishell, command->command); if (path == NULL) { ft_putstr_fd(RED BOLD, 2); @@ -28,5 +29,5 @@ void executor_child(t_command *command) ft_putstr_fd(": " RESET "command not found\n", 2); return ; } - execve(path, command->args, environment_get_arr(command->environment)); + execve(path, command->args, environment_get_arr(minishell)); } diff --git a/src/executor/executor_create_pipes.c b/src/executor/executor_create_pipes.c index 9cff884..4a17eec 100644 --- a/src/executor/executor_create_pipes.c +++ b/src/executor/executor_create_pipes.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:22 by willem #+# #+# */ -/* Updated: 2025/02/22 22:25:28 by willem ######## odam.nl */ +/* Updated: 2025/02/25 14:19:57 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -38,7 +38,7 @@ void executor_create_pipes(t_minishell *minishell) command = (t_command *)current->content; if (current->next) { - if (!pipe(fd)) + if (pipe(fd) == -1) error_msg("pipe", "pipe creation failed"); command->fd_out = fd[1]; } diff --git a/src/executor/executor_execute_pipeline.c b/src/executor/executor_execute_pipeline.c index 9c6d49f..7e3335b 100644 --- a/src/executor/executor_execute_pipeline.c +++ b/src/executor/executor_execute_pipeline.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:02 by willem #+# #+# */ -/* Updated: 2025/02/21 13:11:17 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:52:35 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -27,7 +27,7 @@ int executor_execute_pipeline(t_minishell *minishell) { command = (t_command *)current->content; command->environment = minishell->environment; - last_pid = executor_fork(command); + last_pid = executor_fork(minishell, command); current = current->next; } waitpid(last_pid, &exit_status, 0); diff --git a/src/executor/executor_fork.c b/src/executor/executor_fork.c index 5bd2d22..5da3295 100644 --- a/src/executor/executor_fork.c +++ b/src/executor/executor_fork.c @@ -6,13 +6,13 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:24:52 by willem #+# #+# */ -/* Updated: 2025/02/19 13:40:19 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:51:48 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -pid_t executor_fork(t_command *command) +pid_t executor_fork(t_minishell *minishell, t_command *command) { pid_t pid; // int status; @@ -31,7 +31,7 @@ pid_t executor_fork(t_command *command) else if (pid == 0) { signal_init_child(); - executor_child(command); + executor_child(minishell, command); exit(127); } else diff --git a/src/expander/expander_allocate_memory.c b/src/expander/expander_allocate_memory.c index 286ed37..85689dc 100644 --- a/src/expander/expander_allocate_memory.c +++ b/src/expander/expander_allocate_memory.c @@ -1,18 +1,21 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* expander_allocate_memory.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/19 13:57:19 by qmennen #+# #+# */ -/* Updated: 2025/02/19 13:57:36 by qmennen ### ########.fr */ +/* :::::::: */ +/* expander_allocate_memory.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/19 13:57:19 by qmennen #+# #+# */ +/* Updated: 2025/02/25 14:31:33 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -char *expander_allocate_memory(const char *s, t_list *variables) +char *expander_allocate_memory( + t_minishell *minishell, + const char *s, + t_list *variables) { int size; t_list *current; @@ -26,14 +29,14 @@ char *expander_allocate_memory(const char *s, t_list *variables) if (current->content == NULL) { current = current->next; - continue; + continue ; } env = (t_environment *)current->content; size += (ft_strlen(env->value) - ft_strlen(env->name)); current = current->next; } size += ft_strlen(s); - string = malloc(size); + string = malloc_safe(minishell, size); if (!string) perror("expander malloc"); return (string); diff --git a/src/expander/expander_get_variable.c b/src/expander/expander_get_variable.c index 924798a..edc2202 100644 --- a/src/expander/expander_get_variable.c +++ b/src/expander/expander_get_variable.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* expander_get_variable.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/19 13:59:03 by qmennen #+# #+# */ -/* Updated: 2025/02/19 13:59:14 by qmennen ### ########.fr */ +/* :::::::: */ +/* expander_get_variable.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/19 13:59:03 by qmennen #+# #+# */ +/* Updated: 2025/02/25 13:47:55 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -24,7 +24,7 @@ t_environment *expander_get_var(const char *s, int idx, t_minishell *minishell) name = ft_substr(s, idx, i); if (!name || !*name) return (NULL); - env = environment_get(minishell->environment, name); + env = environment_get(minishell, name); free(name); return (env); } diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c index 25b7b27..762e2a2 100644 --- a/src/expander/expander_parse_string.c +++ b/src/expander/expander_parse_string.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* expander_parse_string.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/20 16:38:28 by qmennen ### ########.fr */ +/* :::::::: */ +/* expander_parse_string.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ +/* Updated: 2025/02/25 14:32:59 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -35,7 +35,7 @@ char *expander_parse_string(char *s, t_minishell *minishell) int j; variables = expander_parse_variables(s, minishell); - string = expander_allocate_memory(s, variables); + string = expander_allocate_memory(minishell, s, variables); i = 0; j = 0; current = variables; diff --git a/src/lexer/lexer_new.c b/src/lexer/lexer_new.c index bbdc7c4..d346375 100644 --- a/src/lexer/lexer_new.c +++ b/src/lexer/lexer_new.c @@ -1,27 +1,24 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* lexer_new.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 19:03:01 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:08:41 by qmennen ### ########.fr */ +/* :::::::: */ +/* lexer_new.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 19:03:01 by qmennen #+# #+# */ +/* Updated: 2025/02/25 14:35:35 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_lexer *ft_lexer_new(const char *input) +t_lexer *ft_lexer_new(t_minishell *minishell) { - t_lexer *lexer; + char *input; - lexer = malloc(sizeof(t_lexer)); - if (!lexer) - { - perror("failed assigning lexer memory"); - exit(EXIT_FAILURE); - } + t_lexer *lexer; + input = minishell->line; + lexer = malloc_safe(minishell, sizeof(t_lexer)); lexer->input = ft_strdup(input); lexer->pos = 0; lexer->n_pos = 1; diff --git a/src/lexer/lexer_parse_input.c b/src/lexer/lexer_parse_input.c index 2182c21..cfafe3c 100644 --- a/src/lexer/lexer_parse_input.c +++ b/src/lexer/lexer_parse_input.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* lexer_parse_input.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ -/* Updated: 2025/02/20 16:42:39 by qmennen ### ########.fr */ +/* :::::::: */ +/* lexer_parse_input.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ +/* Updated: 2025/02/25 14:39:37 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -23,16 +23,18 @@ * the input to be parsed. * @return A linked list of tokens parsed from the input. */ -t_list *ft_parse_input(t_lexer *lexer) +t_list *ft_parse_input(t_minishell *minishell) { t_list *list; t_token *token; + t_lexer *lexer; + lexer = minishell->lexer; list = NULL; while (TRUE) { //TODO: Check if unicode support is viable - token = ft_token_next(lexer); + token = ft_token_next(minishell, lexer); if (token->type == T_EOF || token->type == T_ERROR) //TODO T_ERROR removes the inf loop break ; ft_lstadd_back(&list, ft_lstnew(token)); diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 1bbd225..5621d87 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* lexer_read_word.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/19 14:12:19 by qmennen ### ########.fr */ +/* :::::::: */ +/* lexer_read_word.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ +/* Updated: 2025/02/25 14:40:33 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -static char *parse_quotes(t_lexer *lexer) +static char *parse_quotes(t_minishell *minishell, t_lexer *lexer) { int start; int len; @@ -26,7 +26,7 @@ static char *parse_quotes(t_lexer *lexer) while (lexer->current_char != '\0' && lexer->current_char != qc) lexer_readchar(lexer); len = lexer->pos - start; - word = malloc(sizeof(char) * len + 1); + word = malloc_safe(minishell, sizeof(char) * len + 1); ft_strlcpy(word, lexer->input + start, len + 1); if (lexer->current_char == qc) lexer_readchar(lexer); @@ -38,7 +38,7 @@ static char *parse_quotes(t_lexer *lexer) return (word); } -char *lexer_readword(t_lexer *lexer) +char *lexer_readword(t_minishell *minishell, t_lexer *lexer) { int start; int len; @@ -47,7 +47,7 @@ char *lexer_readword(t_lexer *lexer) start = lexer->pos; if (lexer->current_char == '"' || lexer->current_char == '\'') { - return (parse_quotes(lexer)); + return (parse_quotes(minishell, lexer)); } while (ft_isprint(lexer->current_char) && lexer->current_char != '<' && lexer->current_char != '>' && lexer->current_char != '|' @@ -57,7 +57,7 @@ char *lexer_readword(t_lexer *lexer) lexer_readchar(lexer); } len = lexer->pos - start; - word = malloc(sizeof(char) * len + 1); + word = malloc_safe(minishell, sizeof(char) * len + 1); ft_strlcpy(word, lexer->input + start, len + 1); return (word); } diff --git a/src/lexer/lexer_token_next.c b/src/lexer/lexer_token_next.c index d419c8c..f9343fd 100644 --- a/src/lexer/lexer_token_next.c +++ b/src/lexer/lexer_token_next.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/20 10:39:50 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 14:45:28 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -42,7 +42,7 @@ static t_token_type get_word_type(char c) * - If it is a printable character, reads the word and creates a word token. * - Otherwise, creates an error token. */ -t_token *ft_token_next(t_lexer *lexer) +t_token *ft_token_next(t_minishell *minishell, t_lexer *lexer) { t_token *token; t_token_type word_type; @@ -54,22 +54,22 @@ t_token *ft_token_next(t_lexer *lexer) lexer_readchar(lexer); current_pos = lexer->pos; if (lexer->current_char == '\0') - token = token_new(T_EOF, NULL, current_pos); + token = token_new(minishell, T_EOF, NULL, current_pos); else if (lexer->current_char == '<' || lexer->current_char == '>' || lexer->current_char == '|') - token = token_parse(lexer); + token = token_parse(minishell, lexer); else if (ft_isprint(lexer->current_char)) { word_type = get_word_type(lexer->current_char); - word = lexer_readword(lexer); + word = lexer_readword(minishell, lexer); if (!word) - return (token_new(T_ERROR, &lexer->current_char, current_pos)); - token = token_new(word_type, word, current_pos); + return (token_new(minishell, T_ERROR, &lexer->current_char, current_pos)); + token = token_new(minishell, word_type, word, current_pos); free(word); } else { - token = token_new(T_ERROR, NULL, current_pos); + token = token_new(minishell, T_ERROR, NULL, current_pos); printf("token->type: %d\n", token->type); } return (token); diff --git a/src/main.c b/src/main.c index 4b3e413..4ef0c29 100644 --- a/src/main.c +++ b/src/main.c @@ -24,14 +24,14 @@ int main(int argc, char **argv, char **envp) history_load(); minishell = init_minishell(); signal_init_minishell(); - environment_parse(envp, &(minishell->environment)); + environment_parse(minishell, envp); while (TRUE) { minishell->line = ft_prompt(minishell); if (minishell->line == NULL) break ; - minishell->lexer = ft_lexer_new(minishell->line); - minishell->tokens = ft_parse_input(minishell->lexer); + minishell->lexer = ft_lexer_new(minishell); + minishell->tokens = ft_parse_input(minishell); //ft_lstiter(minishell->tokens, token_print); minishell->commands = parser_get_commands(minishell); simple_builtins(minishell); diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index 0cdb42b..0eaec91 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ -/* Updated: 2025/02/12 12:58:42 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 14:41:06 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -50,12 +50,7 @@ char **parser_get_arguments(t_list *list, t_minishell *minishell) int i; cmds = count_cmds(list); - args = malloc((cmds + 1) * sizeof(char *)); - if (!args) - { - perror("malloc"); - exit(EXIT_FAILURE); - } + args = malloc_safe(minishell, (cmds + 1) * sizeof(char *)); current = list; i = -1; while ((++i) < cmds && current) diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 6725b8c..f66f8bd 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -31,10 +31,10 @@ t_list *parser_get_commands(t_minishell *minishell) while (current) { token = (t_token *) current->content; - command = parser_command_new(ft_strdup(token->value)); + command = parser_command_new(minishell, ft_strdup(token->value)); command->args = parser_get_arguments(current, minishell); - command->redirect_in = redirect_get_inputs(current); - command->redirect_out = redirect_get_outputs(current); + command->redirect_in = redirect_get_inputs(minishell, current); + command->redirect_out = redirect_get_outputs(minishell, current); ft_lstadd_back(&command_list, ft_lstnew(command)); while (current && is_command_token((t_token *)current->content)) current = current->next; diff --git a/src/parser/parser_new_command.c b/src/parser/parser_new_command.c index 5d4ff99..7b4e45f 100644 --- a/src/parser/parser_new_command.c +++ b/src/parser/parser_new_command.c @@ -6,22 +6,18 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/11 16:18:21 by qmennen #+# #+# */ -/* Updated: 2025/02/21 13:07:47 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 14:41:57 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_command *parser_command_new(char *cmd) +t_command *parser_command_new(t_minishell *minishell, char *cmd) { t_command *command; - command = malloc(sizeof(t_command)); - if (!command) - { - perror("minishell malloc error"); - exit(EXIT_FAILURE); - } + command = malloc_safe(minishell, sizeof(t_command)); +\ command->args = NULL; command->fd_in = 0; command->fd_out = 1; diff --git a/src/prompt/prompt.c b/src/prompt/prompt.c index 9f05c69..2bcefb4 100644 --- a/src/prompt/prompt.c +++ b/src/prompt/prompt.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ -/* Updated: 2025/02/19 13:44:20 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 14:43:34 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -char *get_user(t_list *environment) +char *get_user(t_minishell *minishell) { const char guest[] = "guest"; int len; @@ -20,37 +20,32 @@ char *get_user(t_list *environment) char *username; char *result; - user = environment_get(environment, "USER"); + user = environment_get(minishell, "USER"); if (user == NULL) username = (char *)guest; else username = user->value; len = ft_strlen(username) + ft_strlen(PROMPT GREEN) + 1; - result = (char *)malloc(len); - if (result == NULL) - { - perror("malloc"); - return (NULL); - } + result = (char *)malloc_safe(minishell, len); ft_strlcpy(result, GREEN, ft_strlen(GREEN) + 1); ft_strlcat(result, username, ft_strlen(GREEN) + ft_strlen(username) + 1); ft_strlcat(result, PROMPT, len); return (result); } -int get_home_len(char *cwd, t_list *environment) +int get_home_len(t_minishell *minishell, char *cwd) { t_environment *home; int home_len; - home = environment_get(environment, "HOME"); + home = environment_get(minishell, "HOME"); home_len = 0; if (home && !ft_strncmp(cwd, home->value, ft_strlen(home->value))) home_len = ft_strlen(home->value) - 1; return (home_len); } -char *get_path_with_home(t_list *environment) +char *get_path_with_home(t_minishell *minishell) { char *result; char *cwd; @@ -60,11 +55,9 @@ char *get_path_with_home(t_list *environment) cwd = getcwd(NULL, 0); if (cwd == NULL) return (perror("getcwd"), NULL); - home_len = get_home_len(cwd, environment); + home_len = get_home_len(minishell, cwd); len = ft_strlen(cwd) - home_len + 1; - result = malloc(len); - if (result == NULL) - return (free(cwd), NULL); + result = malloc_safe(minishell, len); if (home_len) { ft_strlcpy(result, "~", 2); @@ -76,17 +69,17 @@ char *get_path_with_home(t_list *environment) return (result); } -char *get_path(t_list *environment) +char *get_path(t_minishell *minishell) { char *result; char *cwd; int len; - cwd = get_path_with_home(environment); + cwd = get_path_with_home(minishell); if (cwd == NULL) return (NULL); len = ft_strlen(cwd) + ft_strlen(BLUE RESET "> ") + 1; - result = malloc(len); + result = malloc_safe(minishell, len); if (result == NULL) { perror("malloc"); @@ -106,10 +99,10 @@ char *ft_prompt(t_minishell *minishell) char *prompt; char *user; - cwd = get_path(minishell->environment); + cwd = get_path(minishell); if (cwd == NULL) return (NULL); - user = get_user(minishell->environment); + user = get_user(minishell); if (user == NULL) return (free(cwd), NULL); prompt = ft_strjoin(user, cwd); diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index b6e0828..e3abc02 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -12,7 +12,7 @@ # include "redirect.h" -t_list *redirect_get_inputs(t_list *list) +t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) { t_list *current; t_list *redirects; @@ -32,16 +32,18 @@ t_list *redirect_get_inputs(t_list *list) } if (redirect_is_valid(current, token)) { - ft_lstadd_front(&redirects, ft_lstnew(redirect_new(token->type, ft_strdup(((t_token *)current->next->content)->value)))); + ft_lstadd_front(&redirects, ft_lstnew( + redirect_new(minishell, token->type, + ft_strdup(((t_token *)current->next->content)->value)))); current = current->next; continue ; } else { - ft_lstadd_front(&redirects, ft_lstnew(redirect_new(T_ERROR, NULL))); + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(minishell, T_ERROR, NULL))); break ; } current = current->next; } return (redirects); -} \ No newline at end of file +} diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index 8daee58..d65023e 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -12,7 +12,7 @@ #include "minishell.h" -t_list *redirect_get_outputs(t_list *list) +t_list *redirect_get_outputs(t_minishell *minishell, t_list *list) { t_list *current; t_list *redirects; @@ -32,16 +32,16 @@ t_list *redirect_get_outputs(t_list *list) } if (redirect_is_valid(current, token)) { - ft_lstadd_front(&redirects, ft_lstnew(redirect_new(token->type, ft_strdup(((t_token *)current->next->content)->value)))); + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(minishell, token->type, ft_strdup(((t_token *)current->next->content)->value)))); current = current->next; continue ; } else { - ft_lstadd_front(&redirects, ft_lstnew(redirect_new(T_ERROR, NULL))); + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(minishell, T_ERROR, NULL))); break ; } current = current->next; } return (redirects); -} \ No newline at end of file +} diff --git a/src/redirect/redirect_new.c b/src/redirect/redirect_new.c index 4983828..e6c9ccc 100644 --- a/src/redirect/redirect_new.c +++ b/src/redirect/redirect_new.c @@ -12,14 +12,14 @@ #include "minishell.h" -t_redirect *redirect_new(t_token_type type, char *value) +t_redirect *redirect_new(t_minishell * minishell, t_token_type type, char *value) { t_redirect *result; - result = ft_malloc_safe(sizeof(t_redirect)); + result = malloc_safe(minishell, sizeof(t_redirect)); result->type = type; result->value = NULL; if (value) result->value = value; return (result); -} \ No newline at end of file +} diff --git a/src/token/token_new.c b/src/token/token_new.c index 9626f44..4a35040 100644 --- a/src/token/token_new.c +++ b/src/token/token_new.c @@ -1,27 +1,22 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* token_new.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 19:10:49 by qmennen #+# #+# */ -/* Updated: 2025/02/18 17:01:52 by qmennen ### ########.fr */ +/* :::::::: */ +/* token_new.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 19:10:49 by qmennen #+# #+# */ +/* Updated: 2025/02/25 14:43:56 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_token *token_new(t_token_type type, char *c, int pos) +t_token *token_new(t_minishell *minishell, t_token_type type, char *c, int pos) { t_token *token; - token = malloc(sizeof(t_token)); - if (!token) - { - perror("failed assigning token memory"); - exit(EXIT_FAILURE); - } + token = malloc_safe(minishell, sizeof(t_token)); token->type = type; token->position = pos; if (c) diff --git a/src/token/token_parse.c b/src/token/token_parse.c index 7a9d561..2031eda 100644 --- a/src/token/token_parse.c +++ b/src/token/token_parse.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* token_parse.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 19:10:17 by qmennen #+# #+# */ -/* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */ +/* :::::::: */ +/* token_parse.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 19:10:17 by qmennen #+# #+# */ +/* Updated: 2025/02/25 14:45:08 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -56,7 +56,7 @@ static char *char_from_type(t_token_type type) return (NULL); } -t_token *token_parse(t_lexer *lexer) +t_token *token_parse(t_minishell *minishell, t_lexer *lexer) { int is_double; char c; @@ -66,7 +66,7 @@ t_token *token_parse(t_lexer *lexer) c = lexer->current_char; is_double = lexer->input[lexer->pos + 1] == c; type = token_from_char(c, is_double); - token = token_new(type, char_from_type(type), lexer->pos); + token = token_new(minishell, type, char_from_type(type), lexer->pos); if (is_double) lexer_readchar(lexer); lexer_readchar(lexer); diff --git a/src/utils/check_malloc.c b/src/utils/check_malloc.c index fff6fad..e78e62a 100644 --- a/src/utils/check_malloc.c +++ b/src/utils/check_malloc.c @@ -13,11 +13,17 @@ #include "minishell.h" -void check_malloc(void *ptr) +void check_malloc(t_minishell *minishell, void *ptr) { if (ptr == NULL) { error_msg("malloc", "can't allocate memory"); + + ft_lstclear(&(minishell->freelist), free); exit(1); } + else + { + ft_lstadd_front(&(minishell->freelist), ft_lstnew(ptr)); + } } diff --git a/src/utils/free_freelist.c b/src/utils/free_freelist.c new file mode 100644 index 0000000..5d3daa9 --- /dev/null +++ b/src/utils/free_freelist.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* free_freelist.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/25 13:23:30 by whaffman #+# #+# */ +/* Updated: 2025/02/25 13:24:18 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void free_freelist(t_minishell *minishell) +{ + ft_lstclear(&(minishell->freelist), free); +} diff --git a/src/utils/free_minishell.c b/src/utils/free_minishell.c index 9bb5dc3..4d09cb7 100644 --- a/src/utils/free_minishell.c +++ b/src/utils/free_minishell.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:03:57 by whaffman #+# #+# */ -/* Updated: 2025/02/11 15:36:24 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 13:47:23 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,6 +17,6 @@ void free_minishell(t_minishell *minishell) if (minishell->line) free_minishell_line(minishell); if (minishell->environment) - environment_free_list(&minishell->environment); + environment_free_list(minishell); free(minishell); } diff --git a/src/utils/ft_malloc_safe.c b/src/utils/ft_malloc_safe.c index 5c601f2..4b21724 100644 --- a/src/utils/ft_malloc_safe.c +++ b/src/utils/ft_malloc_safe.c @@ -12,11 +12,11 @@ #include "minishell.h" -void *ft_malloc_safe(size_t size) +void *malloc_safe(t_minishell *minishell, size_t size) { void *ptr; ptr = malloc(size); - check_malloc(ptr); + check_malloc(minishell, ptr); return (ptr); } diff --git a/src/utils/ft_strdup_safe.c b/src/utils/ft_strdup_safe.c index bb52b05..581d3ce 100644 --- a/src/utils/ft_strdup_safe.c +++ b/src/utils/ft_strdup_safe.c @@ -12,11 +12,11 @@ #include "minishell.h" -char *ft_strdup_safe(const char *str) +char *ft_strdup_safe(t_minishell *minishell, const char *str) { char *new_str; new_str = ft_strdup(str); - check_malloc(new_str); + check_malloc(minishell, new_str); return (new_str); } diff --git a/src/utils/ft_strjoin_safe.c b/src/utils/ft_strjoin_safe.c index 8a41829..655c85b 100644 --- a/src/utils/ft_strjoin_safe.c +++ b/src/utils/ft_strjoin_safe.c @@ -12,12 +12,12 @@ #include "minishell.h" -char *ft_strjoin_safe(const char *s1, const char *s2) +char *ft_strjoin_safe(t_minishell *minishell, const char *s1, const char *s2) { char *new_str; new_str = ft_strjoin(s1, s2); - check_malloc(new_str); + check_malloc(minishell, new_str); return (new_str); } diff --git a/src/utils/init_minishell.c b/src/utils/init_minishell.c index 75a24b9..bc2cb13 100644 --- a/src/utils/init_minishell.c +++ b/src/utils/init_minishell.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:03:03 by whaffman #+# #+# */ -/* Updated: 2025/02/05 16:03:15 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 14:50:19 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -27,5 +27,6 @@ t_minishell *init_minishell(void) minishell->lexer = NULL; minishell->tokens = NULL; minishell->commands = NULL; + minishell->freelist = NULL; return (minishell); } From 07f48cfc62f95a39b301c72e8ea1b2a929a07138 Mon Sep 17 00:00:00 2001 From: whaffman Date: Tue, 25 Feb 2025 15:43:56 +0100 Subject: [PATCH 045/103] free_safe working state WIP --- .vscode/launch.json | 2 +- .vscode/tasks.json | 12 ++++++ inc/environment.h | 4 +- inc/utils.h | 3 +- sources.mk | 4 +- src/builtin/builtin_exit.c | 4 +- src/builtin/builtin_export.c | 4 +- src/builtin/builtin_pwd.c | 4 +- src/environment/environment_add.c | 4 +- src/environment/environment_del.c | 6 +-- src/environment/environment_free.c | 10 ++--- src/environment/environment_free_list.c | 19 ++++++++- src/executor/executor_absolute_path.c | 4 +- src/expander/expander_get_variable.c | 4 +- src/lexer/lexer_read_word.c | 4 +- src/lexer/lexer_token_next.c | 4 +- src/main.c | 2 +- src/prompt/prompt.c | 10 ++--- src/utils/check_malloc.c | 1 - src/utils/free_minishell.c | 13 +++--- src/utils/free_minishell_line.c | 4 +- src/utils/free_safe.c | 41 +++++++++++++++++++ src/utils/{ft_malloc_safe.c => malloc_safe.c} | 2 +- 23 files changed, 117 insertions(+), 48 deletions(-) create mode 100644 src/utils/free_safe.c rename src/utils/{ft_malloc_safe.c => malloc_safe.c} (92%) diff --git a/.vscode/launch.json b/.vscode/launch.json index 2c45ecc..d319ec0 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,7 +19,7 @@ "ignoreFailures": true } ], - "preLaunchTask": "Build minishell", + "preLaunchTask": "Build minishell debug", "miDebuggerPath": "/usr/bin/gdb", "logging": { "engineLogging": true diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 48db8a7..eb91ccb 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -13,6 +13,18 @@ "problemMatcher": ["$gcc"], "detail": "Generated task for building minishell" }, + { + "label": "Build minishell debug", + "type": "shell", + "command": "make debug", + "args": [], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": ["$gcc"], + "detail": "Generated task for building minishell in debug mode" + }, { "label": "Run minishell", "type": "shell", diff --git a/inc/environment.h b/inc/environment.h index c8a467b..f1f1439 100644 --- a/inc/environment.h +++ b/inc/environment.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:26:35 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:31:55 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:19:01 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -23,6 +23,6 @@ void environment_free_list(t_minishell *minishell); int environment_parse(t_minishell *minishell, char **envp); char **environment_get_arr(t_minishell *minishell); void environment_del(t_minishell *minishell, char *name); -void environment_free(void *content); +void environment_free(t_minishell *minishell, void *content); #endif // ENVIRONMENT_H diff --git a/inc/utils.h b/inc/utils.h index 30a6dab..797adcc 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -14,7 +14,7 @@ # define UTILS_H void free_minishell_line(t_minishell *minishell); -void free_minishell(t_minishell *minishell); +void free_minishell(t_minishell **minishell); void free_command_list(void *content); t_minishell *init_minishell(void); void print_banner(void); @@ -25,5 +25,6 @@ void check_malloc(t_minishell *minishell, void *ptr); char *ft_strdup_safe(t_minishell *minishell, const char *str); char *ft_strjoin_safe(t_minishell *minishell, const char *s1, const char *s2); void *malloc_safe(t_minishell *minishell, size_t size); +void free_safe(t_minishell *minishell, void **ptr); #endif // UTILS_H diff --git a/sources.mk b/sources.mk index 391e82e..312f9d1 100644 --- a/sources.mk +++ b/sources.mk @@ -2,8 +2,8 @@ VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executo SOURCES = history_load.c history_write.c prompt.c free_lexer.c free_token.c \ free_token_list.c free_minishell.c free_minishell_line.c \ init_minishell.c check_malloc.c error_msg.c free_command_list.c \ -ft_malloc_safe.c ft_strdup_safe.c ft_strjoin_safe.c print_banner.c \ -free_freelist.c lexer_read_char.c lexer_token_next.c \ +ft_strdup_safe.c ft_strjoin_safe.c print_banner.c free_freelist.c \ +malloc_safe.c free_safe.c lexer_read_char.c lexer_token_next.c \ lexer_parse_input.c lexer_new.c lexer_read_word.c token_new.c \ token_parse.c environment_free.c environment_del.c \ environment_free_list.c environment_get.c environment_parse.c \ diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c index d27d981..e1254f5 100644 --- a/src/builtin/builtin_exit.c +++ b/src/builtin/builtin_exit.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ -/* Updated: 2025/02/20 15:54:11 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:31:16 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -36,7 +36,7 @@ int builtin_exit(t_minishell *minishell, t_command *cmd) } exit_status = ft_atoi(cmd->args[1]); } - free_minishell(minishell); + //free_minishell(&minishell); exit(exit_status); return (FAILURE); } diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c index acdc31a..81a896b 100644 --- a/src/builtin/builtin_export.c +++ b/src/builtin/builtin_export.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:57:08 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:17:21 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -31,7 +31,7 @@ int builtin_export(t_minishell *minishell, t_command *cmd) env = environment_get(minishell, arr[0]); if (env != NULL) { - free(env->value); + free_safe(minishell, (void **)&(env->value)); env->value = ft_strdup(arr[1]); //TODO: malloc check } else diff --git a/src/builtin/builtin_pwd.c b/src/builtin/builtin_pwd.c index 01df7c3..f380fa3 100644 --- a/src/builtin/builtin_pwd.c +++ b/src/builtin/builtin_pwd.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:28 by whaffman #+# #+# */ -/* Updated: 2025/02/20 13:57:01 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:17:51 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,6 +20,6 @@ int builtin_pwd(t_minishell *minishell, t_command *cmd) (void)cmd; cwd = getcwd(NULL, 0); printf("%s\n", cwd); - free(cwd); + free_safe(minishell, (void **)&(cwd)); return (SUCCESS); } diff --git a/src/environment/environment_add.c b/src/environment/environment_add.c index a2e395e..366404a 100644 --- a/src/environment/environment_add.c +++ b/src/environment/environment_add.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:33 by whaffman #+# #+# */ -/* Updated: 2025/02/25 14:28:43 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:24:34 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -31,7 +31,7 @@ void environment_add(t_minishell *minishell, char *name, char *value) || new_environment->name == NULL || new_environment->value == NULL) { - environment_free(new_environment); + environment_free(minishell, new_environment); return (perror("malloc")); } ft_lstadd_back(environment, new_node); diff --git a/src/environment/environment_del.c b/src/environment/environment_del.c index 0238a1a..87c56d8 100644 --- a/src/environment/environment_del.c +++ b/src/environment/environment_del.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/11 14:17:53 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:41:06 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:19:14 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -28,8 +28,8 @@ void environment_del(t_minishell *minishell, char *name) if (ft_strncmp(env->name, name, ft_strlen(name) + 1) == 0) { next = current->next; - environment_free(current->content); - free(current); + environment_free(minishell, current->content); + free_safe(minishell, (void **)&(current)); if (prev == NULL) minishell->environment = next; else diff --git a/src/environment/environment_free.c b/src/environment/environment_free.c index 6680cb1..79a4c1f 100644 --- a/src/environment/environment_free.c +++ b/src/environment/environment_free.c @@ -6,18 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/11 15:38:43 by whaffman #+# #+# */ -/* Updated: 2025/02/11 15:38:48 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:18:45 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_free(void *content) +void environment_free(t_minishell *minishell, void *content) { t_environment *env; env = (t_environment *)content; - free(env->name); - free(env->value); - free(env); + free_safe(minishell, (void **)&(env->name)); + free_safe(minishell, (void **)&(env->value)); + free_safe(minishell, (void **)&(env)); } diff --git a/src/environment/environment_free_list.c b/src/environment/environment_free_list.c index 022189e..741fd4b 100644 --- a/src/environment/environment_free_list.c +++ b/src/environment/environment_free_list.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:59 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:37:21 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:24:08 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,5 +14,20 @@ void environment_free_list(t_minishell *minishell) { - ft_lstclear(&(minishell->environment), environment_free); + t_list **lst; + t_list *next; + + lst = &minishell->environment; + if (!lst) + return ; + while (*lst) + { + if ((*lst)->next) + next = (*lst)->next; + else + next = NULL; + environment_free(minishell, (*lst)->content); + free(*lst); + *lst = next; + } } diff --git a/src/executor/executor_absolute_path.c b/src/executor/executor_absolute_path.c index e4af0d6..4be0c1e 100644 --- a/src/executor/executor_absolute_path.c +++ b/src/executor/executor_absolute_path.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:00:24 by willem #+# #+# */ -/* Updated: 2025/02/25 14:30:18 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:26:05 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -46,7 +46,7 @@ char *executor_absolute_path(t_minishell *minishell, char *cmd) ft_free_arr(path); return (executable); } - free(executable); + free_safe(minishell, (void **)&executable); i++; } return (ft_free_arr(path), NULL); diff --git a/src/expander/expander_get_variable.c b/src/expander/expander_get_variable.c index edc2202..a899083 100644 --- a/src/expander/expander_get_variable.c +++ b/src/expander/expander_get_variable.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/19 13:59:03 by qmennen #+# #+# */ -/* Updated: 2025/02/25 13:47:55 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:26:36 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -25,6 +25,6 @@ t_environment *expander_get_var(const char *s, int idx, t_minishell *minishell) if (!name || !*name) return (NULL); env = environment_get(minishell, name); - free(name); + free_safe(minishell, (void **)&name); return (env); } diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 5621d87..4befd32 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:40:33 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:27:01 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -32,7 +32,7 @@ static char *parse_quotes(t_minishell *minishell, t_lexer *lexer) lexer_readchar(lexer); else { - free(word); + free_safe(minishell, (void **)&word); return (NULL); } return (word); diff --git a/src/lexer/lexer_token_next.c b/src/lexer/lexer_token_next.c index f9343fd..04b728a 100644 --- a/src/lexer/lexer_token_next.c +++ b/src/lexer/lexer_token_next.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:45:28 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:27:11 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -65,7 +65,7 @@ t_token *ft_token_next(t_minishell *minishell, t_lexer *lexer) if (!word) return (token_new(minishell, T_ERROR, &lexer->current_char, current_pos)); token = token_new(minishell, word_type, word, current_pos); - free(word); + free_safe(minishell, (void **)&word); } else { diff --git a/src/main.c b/src/main.c index 4ef0c29..20bafe9 100644 --- a/src/main.c +++ b/src/main.c @@ -38,6 +38,6 @@ int main(int argc, char **argv, char **envp) free_minishell_line(minishell); } ft_lstclear(&minishell->commands, free_command_list); - free_minishell(minishell); + free_minishell(&minishell); return (EXIT_SUCCESS); } diff --git a/src/prompt/prompt.c b/src/prompt/prompt.c index 2bcefb4..9cb7aad 100644 --- a/src/prompt/prompt.c +++ b/src/prompt/prompt.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ -/* Updated: 2025/02/25 14:43:34 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:27:33 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -65,7 +65,7 @@ char *get_path_with_home(t_minishell *minishell) } else ft_strlcpy(result, cwd, len); - free(cwd); + free_safe(minishell, (void **)&cwd); return (result); } @@ -111,11 +111,11 @@ char *ft_prompt(t_minishell *minishell) perror("malloc"); return (free(cwd), free(user), NULL); } - free(user); - free(cwd); + free_safe(minishell, (void **)&user); + free_safe(minishell, (void **)&cwd); rl_on_new_line(); line = readline(prompt); - free(prompt); + free_safe(minishell, (void **)&prompt); if (line == NULL) return (NULL); history_write(line); diff --git a/src/utils/check_malloc.c b/src/utils/check_malloc.c index e78e62a..e733c26 100644 --- a/src/utils/check_malloc.c +++ b/src/utils/check_malloc.c @@ -18,7 +18,6 @@ void check_malloc(t_minishell *minishell, void *ptr) if (ptr == NULL) { error_msg("malloc", "can't allocate memory"); - ft_lstclear(&(minishell->freelist), free); exit(1); } diff --git a/src/utils/free_minishell.c b/src/utils/free_minishell.c index 4d09cb7..48e908a 100644 --- a/src/utils/free_minishell.c +++ b/src/utils/free_minishell.c @@ -6,17 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:03:57 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:47:23 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:30:19 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void free_minishell(t_minishell *minishell) +void free_minishell(t_minishell **minishell) { - if (minishell->line) - free_minishell_line(minishell); - if (minishell->environment) - environment_free_list(minishell); + if ((*minishell)->line) + free_minishell_line(*minishell); + if ((*minishell)->environment) + environment_free_list(*minishell); free(minishell); + *minishell = NULL; } diff --git a/src/utils/free_minishell_line.c b/src/utils/free_minishell_line.c index 22487a9..0a5750b 100644 --- a/src/utils/free_minishell_line.c +++ b/src/utils/free_minishell_line.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:01:44 by whaffman #+# #+# */ -/* Updated: 2025/02/05 16:02:07 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:28:18 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ void free_minishell_line(t_minishell *minishell) { if (minishell->line) - free(minishell->line); + free_safe(minishell, (void **)&(minishell->line)); if (minishell->lexer) ft_lexer_free(minishell->lexer); if (minishell->tokens) diff --git a/src/utils/free_safe.c b/src/utils/free_safe.c new file mode 100644 index 0000000..b3b06f2 --- /dev/null +++ b/src/utils/free_safe.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* free_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/25 15:09:34 by whaffman #+# #+# */ +/* Updated: 2025/02/25 15:41:05 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void free_safe(t_minishell *minishell, void **ptr) +{ + t_list *prev; + t_list *current; + + prev = NULL; + current = minishell->freelist; + if (*ptr) + { + while (current) + { + if (current->content == *ptr) + { + if (prev) + prev->next = current->next; + else + minishell->freelist = current->next; + free(*ptr); + free(current); + break ; + } + prev = current; + current = current->next; + } + } + *ptr = NULL; +} diff --git a/src/utils/ft_malloc_safe.c b/src/utils/malloc_safe.c similarity index 92% rename from src/utils/ft_malloc_safe.c rename to src/utils/malloc_safe.c index 4b21724..af46370 100644 --- a/src/utils/ft_malloc_safe.c +++ b/src/utils/malloc_safe.c @@ -1,7 +1,7 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* ft_malloc_safe.c :+: :+: */ +/* malloc_safe.c :+: :+: */ /* +:+ */ /* By: whaffman +#+ */ /* +#+ */ From 91cb0af6efb3a6d5f193e722affa20e160bd8651 Mon Sep 17 00:00:00 2001 From: whaffman Date: Tue, 25 Feb 2025 16:55:13 +0100 Subject: [PATCH 046/103] Free_safe implemented, ft_lstnew_safe and ft_lstclear_safe added ft_strdup_safe added ft_strjoin_safe added --- inc/debug.h | 1 + inc/tokenizer.h | 8 +-- inc/utils.h | 9 +++- sources.mk | 16 +++--- src/builtin/builtin_exit.c | 5 +- src/builtin/builtin_export.c | 4 +- src/debug/print_freelist.c | 28 +++++++++++ src/environment/environment_add.c | 8 +-- src/executor/executor_absolute_path.c | 4 +- src/expander/expander_parse_string.c | 8 +-- src/expander/expander_parse_variables.c | 18 +++---- src/lexer/lexer_new.c | 4 +- src/lexer/lexer_parse_input.c | 6 +-- src/main.c | 2 +- src/parser/parser_get_arguments.c | 4 +- src/parser/parser_get_commands.c | 4 +- src/prompt/prompt.c | 13 ++--- src/redirect/redirect_get_inputs.c | 67 +++++++++++++------------ src/redirect/redirect_get_outputs.c | 59 +++++++++++----------- src/token/token_new.c | 4 +- src/utils/check_malloc.c | 12 ++++- src/utils/free_command_list.c | 26 +++++----- src/utils/free_freelist.c | 15 +++++- src/utils/free_lexer.c | 20 ++++---- src/utils/free_minishell.c | 13 ++--- src/utils/free_minishell_line.c | 8 +-- src/utils/free_safe.c | 5 +- src/utils/free_token.c | 20 ++++---- src/utils/free_token_list.c | 18 +++---- src/utils/ft_lstclear_safe.c | 30 +++++++++++ src/utils/ft_lstnew_safe.c | 23 +++++++++ 31 files changed, 285 insertions(+), 177 deletions(-) create mode 100644 src/debug/print_freelist.c create mode 100644 src/utils/ft_lstclear_safe.c create mode 100644 src/utils/ft_lstnew_safe.c diff --git a/inc/debug.h b/inc/debug.h index 9c11cdd..9cc9cea 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -18,5 +18,6 @@ void print_commands(void *param); void token_print(void *param); void print_redirects(void *param); +void print_freelist(t_minishell *minishell); #endif diff --git a/inc/tokenizer.h b/inc/tokenizer.h index 37ccacf..1b2e7d4 100644 --- a/inc/tokenizer.h +++ b/inc/tokenizer.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ -/* Updated: 2025/02/25 14:45:15 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:19:05 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ * Lexer */ t_lexer *ft_lexer_new(t_minishell *minishell); -void ft_lexer_free(t_lexer *lexer); +void ft_lexer_free(t_minishell *minishell, t_lexer *lexer); void lexer_readchar(t_lexer *lexer); char *lexer_readword(t_minishell *minishell, t_lexer *lexer); t_list *ft_parse_input(t_minishell *minishell); @@ -26,8 +26,8 @@ t_list *ft_parse_input(t_minishell *minishell); */ t_token *ft_token_next(t_minishell *minishell, t_lexer *lexer); t_token *token_new(t_minishell *minishell, t_token_type type, char *c, int pos); -void ft_token_free(t_token *token); -void ft_clear_tokenlist(void *content); +void ft_token_free(t_minishell *minishell, t_token *token); +void ft_clear_tokenlist(t_minishell *minishell, void *content); t_token *token_parse(t_minishell *minishell, t_lexer *lexer); #endif // TOKENIZER_H diff --git a/inc/utils.h b/inc/utils.h index 797adcc..274ba80 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -15,7 +15,7 @@ void free_minishell_line(t_minishell *minishell); void free_minishell(t_minishell **minishell); -void free_command_list(void *content); +void free_command_list(t_minishell *minishell, void *content); t_minishell *init_minishell(void); void print_banner(void); void print_list(void *content); @@ -23,8 +23,13 @@ void simple_builtins(t_minishell *minishell); void error_msg(char *func, char *msg); void check_malloc(t_minishell *minishell, void *ptr); char *ft_strdup_safe(t_minishell *minishell, const char *str); -char *ft_strjoin_safe(t_minishell *minishell, const char *s1, const char *s2); +char *ft_strjoin_safe(t_minishell *minishell, + const char *s1, const char *s2); void *malloc_safe(t_minishell *minishell, size_t size); void free_safe(t_minishell *minishell, void **ptr); +void free_freelist(t_minishell *minishell); +void ft_lstclear_safe(t_minishell *minishell, t_list **lst, + void (*del)(t_minishell *minishell, void *)); +t_list *ft_lstnew_safe(t_minishell *minishell, void *content); #endif // UTILS_H diff --git a/sources.mk b/sources.mk index 312f9d1..1726b8e 100644 --- a/sources.mk +++ b/sources.mk @@ -3,16 +3,16 @@ SOURCES = history_load.c history_write.c prompt.c free_lexer.c free_token.c \ free_token_list.c free_minishell.c free_minishell_line.c \ init_minishell.c check_malloc.c error_msg.c free_command_list.c \ ft_strdup_safe.c ft_strjoin_safe.c print_banner.c free_freelist.c \ -malloc_safe.c free_safe.c lexer_read_char.c lexer_token_next.c \ -lexer_parse_input.c lexer_new.c lexer_read_word.c token_new.c \ -token_parse.c environment_free.c environment_del.c \ -environment_free_list.c environment_get.c environment_parse.c \ -environment_add.c environment_get_arr.c environment_print.c \ -executor_close_fds.c executor_child.c executor_fork.c \ -executor_absolute_path.c executor_execute_pipeline.c \ +malloc_safe.c free_safe.c ft_lstclear_safe.c ft_lstnew_safe.c \ +lexer_read_char.c lexer_token_next.c lexer_parse_input.c lexer_new.c \ +lexer_read_word.c token_new.c token_parse.c environment_free.c \ +environment_del.c environment_free_list.c environment_get.c \ +environment_parse.c environment_add.c environment_get_arr.c \ +environment_print.c executor_close_fds.c executor_child.c \ +executor_fork.c executor_absolute_path.c executor_execute_pipeline.c \ executor_count_fds.c executor_create_redirects.c executor_open_fds.c \ executor_create_pipes.c parser_get_arguments.c parser_new_command.c \ -parser_get_commands.c signal.c print_commands.c \ +parser_get_commands.c signal.c print_commands.c print_freelist.c \ expander_expand_dollar.c expander_get_variable.c \ expander_is_character.c expander_parse_variables.c \ expander_parse_string.c expander_allocate_memory.c builtin_cd.c \ diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c index e1254f5..831ec82 100644 --- a/src/builtin/builtin_exit.c +++ b/src/builtin/builtin_exit.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:31:16 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:04:17 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -36,7 +36,8 @@ int builtin_exit(t_minishell *minishell, t_command *cmd) } exit_status = ft_atoi(cmd->args[1]); } - //free_minishell(&minishell); + //print_freelist(minishell); + free_minishell(&minishell); exit(exit_status); return (FAILURE); } diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c index 81a896b..c803956 100644 --- a/src/builtin/builtin_export.c +++ b/src/builtin/builtin_export.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:17:21 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:39:13 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -32,7 +32,7 @@ int builtin_export(t_minishell *minishell, t_command *cmd) if (env != NULL) { free_safe(minishell, (void **)&(env->value)); - env->value = ft_strdup(arr[1]); //TODO: malloc check + env->value = ft_strdup_safe(minishell, arr[1]); } else environment_add(minishell, arr[0], arr[1]); diff --git a/src/debug/print_freelist.c b/src/debug/print_freelist.c new file mode 100644 index 0000000..fb11d2e --- /dev/null +++ b/src/debug/print_freelist.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* print_freelist.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/25 15:46:03 by whaffman #+# #+# */ +/* Updated: 2025/02/25 15:55:41 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void print_freelist(t_minishell *minishell) +{ + t_list *freelist; + int i; + + i = 0; + freelist = minishell->freelist; + while (freelist) + { + printf("%d: %p\n", i, freelist->content); + i++; + freelist = freelist->next; + } +} diff --git a/src/environment/environment_add.c b/src/environment/environment_add.c index 366404a..feb6815 100644 --- a/src/environment/environment_add.c +++ b/src/environment/environment_add.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:33 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:24:34 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:50:12 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -24,9 +24,9 @@ void environment_add(t_minishell *minishell, char *name, char *value) new_environment = malloc_safe(minishell, sizeof(t_environment)); if (new_environment == NULL) return (perror("malloc")); - new_environment->name = ft_strdup(name); - new_environment->value = ft_strdup(value); - new_node = ft_lstnew(new_environment); + new_environment->name = ft_strdup_safe(minishell, name); + new_environment->value = ft_strdup_safe(minishell, value); + new_node = ft_lstnew_safe(minishell, new_environment); if (new_node == NULL || new_environment->name == NULL || new_environment->value == NULL) diff --git a/src/executor/executor_absolute_path.c b/src/executor/executor_absolute_path.c index 4be0c1e..b868227 100644 --- a/src/executor/executor_absolute_path.c +++ b/src/executor/executor_absolute_path.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:00:24 by willem #+# #+# */ -/* Updated: 2025/02/25 15:26:05 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:39:59 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -23,7 +23,7 @@ char *executor_absolute_path(t_minishell *minishell, char *cmd) { if (access(cmd, F_OK) == 0) { - executable = ft_strdup(cmd); + executable = ft_strdup_safe(minishell, cmd); if (!executable) return (NULL); return (executable); diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c index 762e2a2..e2fdf4b 100644 --- a/src/expander/expander_parse_string.c +++ b/src/expander/expander_parse_string.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:32:59 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:14:16 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -static void free_variables(t_list *variables) +static void free_variables(t_minishell *minishell, t_list *variables) { t_list *current; t_list *last; @@ -22,7 +22,7 @@ static void free_variables(t_list *variables) { last = current; current = current->next; - free(last); + free_safe(minishell, (void **)&last); } } @@ -54,6 +54,6 @@ char *expander_parse_string(char *s, t_minishell *minishell) //TODO: Figure out why echo "> echo "\as"" breaks string[j] = 0; - free_variables(variables); + free_variables(minishell, variables); return (string); } diff --git a/src/expander/expander_parse_variables.c b/src/expander/expander_parse_variables.c index b3e9023..aab07e9 100644 --- a/src/expander/expander_parse_variables.c +++ b/src/expander/expander_parse_variables.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* expander_parse_variables.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/19 13:58:13 by qmennen #+# #+# */ -/* Updated: 2025/02/19 15:07:23 by qmennen ### ########.fr */ +/* :::::::: */ +/* expander_parse_variables.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/19 13:58:13 by qmennen #+# #+# */ +/* Updated: 2025/02/25 16:51:16 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -27,9 +27,9 @@ t_list *expander_parse_variables(const char *s, t_minishell *minishell) { env = expander_get_var(s, i + 1, minishell); if (env) - ft_lstadd_back(&var_list, ft_lstnew(env)); + ft_lstadd_back(&var_list, ft_lstnew_safe(minishell, env)); else - ft_lstadd_back(&var_list, ft_lstnew(NULL)); + ft_lstadd_back(&var_list, ft_lstnew_safe(minishell, NULL)); } i++; } diff --git a/src/lexer/lexer_new.c b/src/lexer/lexer_new.c index d346375..92d13d1 100644 --- a/src/lexer/lexer_new.c +++ b/src/lexer/lexer_new.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:03:01 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:35:35 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:40:16 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ t_lexer *ft_lexer_new(t_minishell *minishell) t_lexer *lexer; input = minishell->line; lexer = malloc_safe(minishell, sizeof(t_lexer)); - lexer->input = ft_strdup(input); + lexer->input = ft_strdup_safe(minishell, input); lexer->pos = 0; lexer->n_pos = 1; lexer->current_char = '\0'; diff --git a/src/lexer/lexer_parse_input.c b/src/lexer/lexer_parse_input.c index cfafe3c..e68d723 100644 --- a/src/lexer/lexer_parse_input.c +++ b/src/lexer/lexer_parse_input.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:39:37 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:51:27 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -37,8 +37,8 @@ t_list *ft_parse_input(t_minishell *minishell) token = ft_token_next(minishell, lexer); if (token->type == T_EOF || token->type == T_ERROR) //TODO T_ERROR removes the inf loop break ; - ft_lstadd_back(&list, ft_lstnew(token)); + ft_lstadd_back(&list, ft_lstnew_safe(minishell, token)); } - ft_token_free(token); + ft_token_free(minishell, token); return (list); } diff --git a/src/main.c b/src/main.c index 20bafe9..ef2570b 100644 --- a/src/main.c +++ b/src/main.c @@ -37,7 +37,7 @@ int main(int argc, char **argv, char **envp) simple_builtins(minishell); free_minishell_line(minishell); } - ft_lstclear(&minishell->commands, free_command_list); + ft_lstclear_safe(minishell, &minishell->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 index 0eaec91..4bd8db2 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:41:06 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:40:26 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -61,7 +61,7 @@ char **parser_get_arguments(t_list *list, t_minishell *minishell) } else if (((t_token *)current->content)->type == T_WORD || ((t_token *)current->content)->type == T_SQWORD) - args[i] = ft_strdup(((t_token *)current->content)->value); + args[i] = ft_strdup_safe(minishell, ((t_token *)current->content)->value); current = current->next; } args[i] = 0; diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index f66f8bd..724db81 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -31,11 +31,11 @@ t_list *parser_get_commands(t_minishell *minishell) while (current) { token = (t_token *) current->content; - command = parser_command_new(minishell, ft_strdup(token->value)); + command = parser_command_new(minishell, ft_strdup_safe(minishell, token->value)); command->args = parser_get_arguments(current, minishell); command->redirect_in = redirect_get_inputs(minishell, current); command->redirect_out = redirect_get_outputs(minishell, current); - ft_lstadd_back(&command_list, ft_lstnew(command)); + ft_lstadd_back(&command_list, ft_lstnew_safe(minishell, command)); while (current && is_command_token((t_token *)current->content)) current = current->next; if (current && ((t_token *)current->content)->type >= 3) diff --git a/src/prompt/prompt.c b/src/prompt/prompt.c index 9cb7aad..f4870bb 100644 --- a/src/prompt/prompt.c +++ b/src/prompt/prompt.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:27:33 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:43:27 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -65,7 +65,7 @@ char *get_path_with_home(t_minishell *minishell) } else ft_strlcpy(result, cwd, len); - free_safe(minishell, (void **)&cwd); + free(cwd); return (result); } @@ -80,15 +80,10 @@ char *get_path(t_minishell *minishell) return (NULL); len = ft_strlen(cwd) + ft_strlen(BLUE RESET "> ") + 1; result = malloc_safe(minishell, len); - if (result == NULL) - { - perror("malloc"); - return (free(cwd), NULL); - } ft_strlcpy(result, BLUE, len); ft_strlcat(result, cwd, len); ft_strlcat(result, RESET "> ", len); - free(cwd); + free_safe(minishell,(void **) &cwd); return (result); } @@ -105,7 +100,7 @@ char *ft_prompt(t_minishell *minishell) user = get_user(minishell); if (user == NULL) return (free(cwd), NULL); - prompt = ft_strjoin(user, cwd); + prompt = ft_strjoin_safe(minishell, user, cwd); if (prompt == NULL) { perror("malloc"); diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index e3abc02..7addf44 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -10,40 +10,41 @@ /* */ /* ************************************************************************** */ -# include "redirect.h" +#include "redirect.h" -t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) +t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) { - t_list *current; - t_list *redirects; - t_token *token; + t_list *current; + t_list *redirects; + t_token *token; - redirects = NULL; - current = list; - while (current) - { - token = (t_token *)current->content; - if (redirect_is_delimiter(token)) - break ; - if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) - { - current = current->next; - continue ; - } - if (redirect_is_valid(current, token)) - { - ft_lstadd_front(&redirects, ft_lstnew( - redirect_new(minishell, token->type, - ft_strdup(((t_token *)current->next->content)->value)))); - current = current->next; - continue ; - } - else - { - ft_lstadd_front(&redirects, ft_lstnew(redirect_new(minishell, T_ERROR, NULL))); - break ; - } - current = current->next; - } - return (redirects); + redirects = NULL; + current = list; + while (current) + { + token = (t_token *)current->content; + if (redirect_is_delimiter(token)) + break ; + if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) + { + current = current->next; + continue ; + } + if (redirect_is_valid(current, token)) + { + ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, + redirect_new(minishell, token->type, + ft_strdup_safe(minishell, + ((t_token *)current->next->content)->value)))); + current = current->next; + continue ; + } + else + { + ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, T_ERROR, NULL))); + break ; + } + current = current->next; + } + return (redirects); } diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index d65023e..f1f884c 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -14,34 +14,35 @@ t_list *redirect_get_outputs(t_minishell *minishell, t_list *list) { - t_list *current; - t_list *redirects; - t_token *token; + t_list *current; + t_list *redirects; + t_token *token; - redirects = NULL; - current = list; - while (current) - { - token = (t_token *)current->content; - if (redirect_is_delimiter(token)) - break; - if (token->type != T_REDIRECT_OUT && token->type != T_APPEND_OUT) - { - current = current->next; - continue ; - } - if (redirect_is_valid(current, token)) - { - ft_lstadd_front(&redirects, ft_lstnew(redirect_new(minishell, token->type, ft_strdup(((t_token *)current->next->content)->value)))); - current = current->next; - continue ; - } - else - { - ft_lstadd_front(&redirects, ft_lstnew(redirect_new(minishell, T_ERROR, NULL))); - break ; - } - current = current->next; - } - return (redirects); + redirects = NULL; + current = list; + while (current) + { + token = (t_token *)current->content; + if (redirect_is_delimiter(token)) + break ; + if (token->type != T_REDIRECT_OUT && token->type != T_APPEND_OUT) + { + current = current->next; + continue ; + } + if (redirect_is_valid(current, token)) + { + ft_lstadd_front(&redirects, + ft_lstnew_safe(minishell, redirect_new(minishell, token->type, ft_strdup_safe(minishell, ((t_token *)current->next->content)->value)))); + current = current->next; + continue ; + } + else + { + ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, T_ERROR, NULL))); + break ; + } + current = current->next; + } + return (redirects); } diff --git a/src/token/token_new.c b/src/token/token_new.c index 4a35040..778191f 100644 --- a/src/token/token_new.c +++ b/src/token/token_new.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:10:49 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:43:56 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:42:52 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ t_token *token_new(t_minishell *minishell, t_token_type type, char *c, int pos) token->type = type; token->position = pos; if (c) - token->value = ft_strdup(c); + token->value = ft_strdup_safe(minishell, c); else token->value = NULL; return (token); diff --git a/src/utils/check_malloc.c b/src/utils/check_malloc.c index e733c26..4607767 100644 --- a/src/utils/check_malloc.c +++ b/src/utils/check_malloc.c @@ -15,6 +15,8 @@ void check_malloc(t_minishell *minishell, void *ptr) { + t_list *new; + if (ptr == NULL) { error_msg("malloc", "can't allocate memory"); @@ -23,6 +25,14 @@ void check_malloc(t_minishell *minishell, void *ptr) } else { - ft_lstadd_front(&(minishell->freelist), ft_lstnew(ptr)); + new = ft_lstnew(ptr); + if (new == NULL) + { + error_msg("malloc", "can't allocate memory"); + ft_lstclear(&(minishell->freelist), free); + exit(1); + } + else + ft_lstadd_front(&(minishell->freelist), new); } } diff --git a/src/utils/free_command_list.c b/src/utils/free_command_list.c index 5ed7a59..6d2b06c 100644 --- a/src/utils/free_command_list.c +++ b/src/utils/free_command_list.c @@ -12,20 +12,20 @@ #include "minishell.h" -static void free_args(char **args) +static void free_args(t_minishell *minishell, char **args) { int i; i = 0; while (args[i]) { - free(args[i]); + free_safe(minishell, (void **)&args[i]); i++; } - free(args); + free_safe(minishell, (void **)&args); } -static void free_redirects(t_list *lst) +static void free_redirects(t_minishell *minishell, t_list *lst) { t_redirect *redir; t_list *current; @@ -37,26 +37,26 @@ static void free_redirects(t_list *lst) last = current; redir = (t_redirect *)current->content; if (redir && redir->value) - free(redir->value); + free_safe(minishell, (void **)&redir->value); if (redir) - free(redir); + free_safe(minishell, (void **)&redir); current = current->next; - free(last); + free_safe(minishell, (void **)&last); } } -void free_command_list(void *content) +void free_command_list(t_minishell *minishell, void *content) { t_command *command; command = (t_command *)content; if (command->command) - free(command->command); + free_safe(minishell, (void **)&(command->command)); if (command->args) - free_args(command->args); + free_args(minishell, command->args); if (command->redirect_in) - free_redirects(command->redirect_in); + free_redirects(minishell, command->redirect_in); if (command->redirect_out) - free_redirects(command->redirect_out); - free(command); + free_redirects(minishell, command->redirect_out); + free_safe(minishell, (void **)&command); } diff --git a/src/utils/free_freelist.c b/src/utils/free_freelist.c index 5d3daa9..b974dd7 100644 --- a/src/utils/free_freelist.c +++ b/src/utils/free_freelist.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 13:23:30 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:24:18 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 15:56:40 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,5 +14,16 @@ void free_freelist(t_minishell *minishell) { - ft_lstclear(&(minishell->freelist), free); + t_list *freelist; + t_list *next; + + freelist = minishell->freelist; + while (freelist) + { + next = freelist->next; + free(freelist->content); + free(freelist); + freelist = next; + } + minishell->freelist = NULL; } diff --git a/src/utils/free_lexer.c b/src/utils/free_lexer.c index d15f1dd..d42e3b4 100644 --- a/src/utils/free_lexer.c +++ b/src/utils/free_lexer.c @@ -1,20 +1,20 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* free_lexer.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 19:07:01 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:07:18 by qmennen ### ########.fr */ +/* :::::::: */ +/* free_lexer.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 19:07:01 by qmennen #+# #+# */ +/* Updated: 2025/02/25 16:16:01 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_lexer_free(t_lexer *lexer) +void ft_lexer_free(t_minishell *minishell, t_lexer *lexer) { if (lexer->input) - free(lexer->input); - free(lexer); + free_safe(minishell, (void **)&(lexer->input)); + free_safe(minishell, (void **)&lexer); } diff --git a/src/utils/free_minishell.c b/src/utils/free_minishell.c index 48e908a..1b8e567 100644 --- a/src/utils/free_minishell.c +++ b/src/utils/free_minishell.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:03:57 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:30:19 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:02:57 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,10 +14,11 @@ void free_minishell(t_minishell **minishell) { - if ((*minishell)->line) - free_minishell_line(*minishell); - if ((*minishell)->environment) - environment_free_list(*minishell); - free(minishell); + // if ((*minishell)->line) + // free_minishell_line(*minishell); + // if ((*minishell)->environment) + // environment_free_list(*minishell); + free_freelist(*minishell); + free(*minishell); *minishell = NULL; } diff --git a/src/utils/free_minishell_line.c b/src/utils/free_minishell_line.c index 0a5750b..3c6f3bb 100644 --- a/src/utils/free_minishell_line.c +++ b/src/utils/free_minishell_line.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:01:44 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:28:18 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:48:39 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,9 +17,9 @@ void free_minishell_line(t_minishell *minishell) if (minishell->line) free_safe(minishell, (void **)&(minishell->line)); if (minishell->lexer) - ft_lexer_free(minishell->lexer); + ft_lexer_free(minishell, minishell->lexer); if (minishell->tokens) - ft_lstclear(&minishell->tokens, ft_clear_tokenlist); + ft_lstclear_safe(minishell, &minishell->tokens, ft_clear_tokenlist); if (minishell->commands) - ft_lstclear(&minishell->commands, free_command_list); + ft_lstclear_safe(minishell, &minishell->commands, free_command_list); } diff --git a/src/utils/free_safe.c b/src/utils/free_safe.c index b3b06f2..ccbd0ee 100644 --- a/src/utils/free_safe.c +++ b/src/utils/free_safe.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 15:09:34 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:41:05 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 16:00:29 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -31,11 +31,12 @@ void free_safe(t_minishell *minishell, void **ptr) minishell->freelist = current->next; free(*ptr); free(current); - break ; + return; } prev = current; current = current->next; } + error_msg("free_safe", "pointer not found in freelist"); } *ptr = NULL; } diff --git a/src/utils/free_token.c b/src/utils/free_token.c index c641787..46b8e72 100644 --- a/src/utils/free_token.c +++ b/src/utils/free_token.c @@ -1,20 +1,20 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* free_token.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 19:07:45 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:07:54 by qmennen ### ########.fr */ +/* :::::::: */ +/* free_token.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 19:07:45 by qmennen #+# #+# */ +/* Updated: 2025/02/25 16:17:52 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_token_free(t_token *token) +void ft_token_free(t_minishell *minishell, t_token *token) { if (token->value) - free(token->value); - free(token); + free_safe(minishell, (void **)&token->value); + free_safe(minishell, (void **)&token); } diff --git a/src/utils/free_token_list.c b/src/utils/free_token_list.c index db06843..e179f55 100644 --- a/src/utils/free_token_list.c +++ b/src/utils/free_token_list.c @@ -1,21 +1,21 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* free_token_list.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 19:08:14 by qmennen #+# #+# */ -/* Updated: 2025/02/05 19:08:31 by qmennen ### ########.fr */ +/* :::::::: */ +/* free_token_list.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 19:08:14 by qmennen #+# #+# */ +/* Updated: 2025/02/25 16:18:44 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_clear_tokenlist(void *content) +void ft_clear_tokenlist(t_minishell *minishell, void *content) { t_token *token; token = (t_token *)content; - ft_token_free(token); + ft_token_free(minishell, token); } diff --git a/src/utils/ft_lstclear_safe.c b/src/utils/ft_lstclear_safe.c new file mode 100644 index 0000000..dfdca13 --- /dev/null +++ b/src/utils/ft_lstclear_safe.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* minishell_lstclear.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/25 16:21:16 by whaffman #+# #+# */ +/* Updated: 2025/02/25 16:48:43 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void ft_lstclear_safe(t_minishell *minishell, t_list **lst, + void (*del)(t_minishell *minishell, void *)) +{ + t_list *current; + t_list *next; + + current = *lst; + while (current) + { + next = current->next; + del(minishell, current->content); + free_safe(minishell, (void **)¤t); + current = next; + } + *lst = NULL; +} diff --git a/src/utils/ft_lstnew_safe.c b/src/utils/ft_lstnew_safe.c new file mode 100644 index 0000000..bd0ba5d --- /dev/null +++ b/src/utils/ft_lstnew_safe.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* minishell_lstnew.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/25 16:47:09 by whaffman #+# #+# */ +/* Updated: 2025/02/25 16:49:11 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_list *ft_lstnew_safe(t_minishell *minishell, void *content) +{ + t_list *new; + + new = malloc_safe(minishell, sizeof(t_list)); + new->content = content; + new->next = NULL; + return (new); +} From 8e5f90436a72f1b924ff42d03b185c3910c150fb Mon Sep 17 00:00:00 2001 From: whaffman Date: Tue, 25 Feb 2025 17:54:44 +0100 Subject: [PATCH 047/103] vallgrind --- .vscode/launch.json | 2 +- sources.mk | 42 ++++++++++++------------- src/debug/print_commands.c | 6 ++-- src/expander/expander_allocate_memory.c | 6 ++-- src/utils/free_minishell_line.c | 4 +-- src/utils/free_safe.c | 28 ++++++++++++++++- src/utils/print_banner.c | 5 +-- 7 files changed, 59 insertions(+), 34 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index d319ec0..21672c5 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,7 @@ "name": "Debug minishell", "type": "cppdbg", "request": "launch", - "program": "${workspaceFolder}/minishell", + "program": "${workspaceFolder}/build/debug/minishell", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", diff --git a/sources.mk b/sources.mk index 1726b8e..e2269f4 100644 --- a/sources.mk +++ b/sources.mk @@ -1,22 +1,22 @@ VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/signal:src/debug:src/expander:src/builtin:src/redirect: -SOURCES = history_load.c history_write.c prompt.c free_lexer.c free_token.c \ -free_token_list.c free_minishell.c free_minishell_line.c \ -init_minishell.c check_malloc.c error_msg.c free_command_list.c \ -ft_strdup_safe.c ft_strjoin_safe.c print_banner.c free_freelist.c \ -malloc_safe.c free_safe.c ft_lstclear_safe.c ft_lstnew_safe.c \ -lexer_read_char.c lexer_token_next.c lexer_parse_input.c lexer_new.c \ -lexer_read_word.c token_new.c token_parse.c environment_free.c \ -environment_del.c environment_free_list.c environment_get.c \ -environment_parse.c environment_add.c environment_get_arr.c \ -environment_print.c executor_close_fds.c executor_child.c \ -executor_fork.c executor_absolute_path.c executor_execute_pipeline.c \ -executor_count_fds.c executor_create_redirects.c executor_open_fds.c \ -executor_create_pipes.c parser_get_arguments.c parser_new_command.c \ -parser_get_commands.c signal.c print_commands.c print_freelist.c \ -expander_expand_dollar.c expander_get_variable.c \ -expander_is_character.c expander_parse_variables.c \ -expander_parse_string.c expander_allocate_memory.c builtin_cd.c \ -builtin_echo.c builtin_env.c builtin_export.c builtin_pwd.c \ -builtin_router.c builtin_unset.c simple_builtins.c builtin_exit.c \ -is_builtin.c main.c redirect_get_inputs.c redirect_get_outputs.c \ -redirect_new.c redirect_valid_type.c \ +SOURCES = history_load.c history_write.c prompt.c ft_lstclear_safe.c \ +ft_lstnew_safe.c ft_strdup_safe.c ft_strjoin_safe.c init_minishell.c \ +malloc_safe.c print_banner.c error_msg.c check_malloc.c \ +free_command_list.c free_freelist.c free_lexer.c free_minishell.c \ +free_minishell_line.c free_safe.c free_token.c free_token_list.c \ +lexer_read_char.c lexer_new.c lexer_parse_input.c lexer_read_word.c \ +lexer_token_next.c token_new.c token_parse.c environment_add.c \ +environment_del.c environment_free.c environment_free_list.c \ +environment_get.c environment_get_arr.c environment_parse.c \ +environment_print.c executor_close_fds.c executor_absolute_path.c \ +executor_child.c executor_count_fds.c executor_create_pipes.c \ +executor_create_redirects.c executor_execute_pipeline.c \ +executor_fork.c executor_open_fds.c parser_get_arguments.c \ +parser_get_commands.c parser_new_command.c signal.c print_commands.c \ +print_freelist.c expander_expand_dollar.c expander_is_character.c \ +expander_allocate_memory.c expander_get_variable.c \ +expander_parse_string.c expander_parse_variables.c builtin_echo.c \ +builtin_router.c simple_builtins.c is_builtin.c builtin_cd.c \ +builtin_env.c builtin_exit.c builtin_export.c builtin_pwd.c \ +builtin_unset.c redirect_valid_type.c redirect_get_inputs.c \ +redirect_get_outputs.c redirect_new.c main.c \ diff --git a/src/debug/print_commands.c b/src/debug/print_commands.c index cd5cc23..e52ca8f 100644 --- a/src/debug/print_commands.c +++ b/src/debug/print_commands.c @@ -23,12 +23,12 @@ void print_commands(void *param) printf("command: %s\n", command->command); printf("-- Args: "); i = 0; - while (command->args[i++]) - printf("%s ", command->args[i]); + while (command->args[i]) + printf("%s ", command->args[i++]); printf("\n"); printf("-- Input redirects:\n"); ft_lstiter(command->redirect_in, print_redirects); - printf("-- Output redirects:\n"); + printf("-- Output redirects:\n"); ft_lstiter(command->redirect_out, print_redirects); } diff --git a/src/expander/expander_allocate_memory.c b/src/expander/expander_allocate_memory.c index 85689dc..08c72b8 100644 --- a/src/expander/expander_allocate_memory.c +++ b/src/expander/expander_allocate_memory.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/19 13:57:19 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:31:33 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 17:54:08 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ char *expander_allocate_memory( t_environment *env; char *string; - size = 0; + size = 1; current = variables; while (current) { @@ -37,7 +37,5 @@ char *expander_allocate_memory( } size += ft_strlen(s); string = malloc_safe(minishell, size); - if (!string) - perror("expander malloc"); return (string); } diff --git a/src/utils/free_minishell_line.c b/src/utils/free_minishell_line.c index 3c6f3bb..693b953 100644 --- a/src/utils/free_minishell_line.c +++ b/src/utils/free_minishell_line.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:01:44 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:48:39 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 17:40:32 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ void free_minishell_line(t_minishell *minishell) { if (minishell->line) - free_safe(minishell, (void **)&(minishell->line)); + free(minishell->line); if (minishell->lexer) ft_lexer_free(minishell, minishell->lexer); if (minishell->tokens) diff --git a/src/utils/free_safe.c b/src/utils/free_safe.c index ccbd0ee..e5070ec 100644 --- a/src/utils/free_safe.c +++ b/src/utils/free_safe.c @@ -6,12 +6,37 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 15:09:34 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:00:29 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 17:35:39 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" +#include +#include +#include + +/* Obtain a backtrace and print it to stdout. */ +void +print_trace (void) +{ + void *array[10]; + char **strings; + int size, i; + + size = backtrace (array, 10); + strings = backtrace_symbols (array, size); + if (strings != NULL) + { + + printf ("Obtained %d stack frames.\n", size); + for (i = 0; i < size; i++) + fprintf (stderr, "%s\n", strings[i]); + } + + free (strings); +} + void free_safe(t_minishell *minishell, void **ptr) { t_list *prev; @@ -37,6 +62,7 @@ void free_safe(t_minishell *minishell, void **ptr) current = current->next; } error_msg("free_safe", "pointer not found in freelist"); + // print_trace(); } *ptr = NULL; } diff --git a/src/utils/print_banner.c b/src/utils/print_banner.c index 1cdc64d..ba33208 100644 --- a/src/utils/print_banner.c +++ b/src/utils/print_banner.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:04:44 by whaffman #+# #+# */ -/* Updated: 2025/02/23 12:31:28 by willem ######## odam.nl */ +/* Updated: 2025/02/25 17:27:28 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,7 +15,8 @@ void print_banner(void) { printf("%s\n", - "\033[2J\033[1;1H" GREEN + // "\033[2J\033[1;1H" GREEN + GREEN " • • ┓ ┓┓\n" " ┏┳┓┓┏┓┓┏┣┓┏┓┃┃\n" " ┛┗┗┗┛┗┗┛┛┗┗ ┗┗\n" From 7b1951bf859774521f8d3956daa83e736e3fd7cf Mon Sep 17 00:00:00 2001 From: whaffman Date: Tue, 25 Feb 2025 18:31:14 +0100 Subject: [PATCH 048/103] DDEBUG --- Makefile | 4 ++-- README.md | 18 +++++++++--------- inc/minishell.h | 6 ++++++ src/debug/print_commands.c | 4 ++++ src/debug/print_freelist.c | 4 +++- src/utils/free_safe.c | 27 +++------------------------ 6 files changed, 27 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index 350889b..1546611 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: qmennen +#+ # # +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/02/23 13:34:57 by willem ######## odam.nl # +# Updated: 2025/02/25 18:15:50 by whaffman ######## odam.nl # # # # **************************************************************************** # @@ -38,7 +38,7 @@ endif BUILD_CONFIGS = release debug asan tsan release_CFLAGS = -Wall -Werror -Werror -O2 -debug_CFLAGS = -Wall -Werror -Werror -g3 +debug_CFLAGS = -Wall -Werror -Werror -g3 -DDEBUG asan_CFLAGS = -Wall -Werror -Werror -fsanitize=address,leak,undefined -g3 tsan_CFLAGS = -Wall -Werror -Werror -fsanitize=thread -g3 diff --git a/README.md b/README.md index 7ba4ee1..deeb689 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,15 @@ A lot of amazing shell stuff - libncurses-dev ## TODO --[x] Find absolute path for command input ('/', './', 'cmd') -- Add heredoc to tokenizer --[x] Environment to `t_list` --[x] Get environment array (export) --[x] Set environment variable (export) --[x] Simple builtin export --[x] builtins --[x] Preliminary signals --[x] Define struct for commands, something like ( +- [x] Find absolute path for command input ('/', './', 'cmd') +- [x]Add heredoc to tokenizer +- [x] Environment to `t_list` +- [x] Get environment array (export) +- [x] Set environment variable (export) +- [x] Simple builtin export +- [x] builtins +- [x] Preliminary signals +- [x] Define struct for commands, something like ( ```c typedef struct s_command { diff --git a/inc/minishell.h b/inc/minishell.h index 78bc2cf..1697e7f 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -45,6 +45,12 @@ # define PROMPT RESET "🐚" GREEN "minishell" RESET ": " # define PROMPT_LEN 51 +# ifdef DEBUG +# define DEBUG 1 +# else +# define DEBUG 0 +# endif // DEBUG + void token_print(void *param); #endif diff --git a/src/debug/print_commands.c b/src/debug/print_commands.c index e52ca8f..c41bfa2 100644 --- a/src/debug/print_commands.c +++ b/src/debug/print_commands.c @@ -17,6 +17,8 @@ void print_commands(void *param) t_command *command; int i; + if (!DEBUG) + return ; command = (t_command *)param; if (!command) return ; @@ -46,6 +48,8 @@ void token_print(void *param) { t_token *token; + if (!DEBUG) + return ; token = (t_token *)param; printf("token type %i, value %s\n", token->type, token->value); } diff --git a/src/debug/print_freelist.c b/src/debug/print_freelist.c index fb11d2e..b9b1e6e 100644 --- a/src/debug/print_freelist.c +++ b/src/debug/print_freelist.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 15:46:03 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:55:41 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 18:17:13 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,6 +17,8 @@ void print_freelist(t_minishell *minishell) t_list *freelist; int i; + if (!DEBUG) + return ; i = 0; freelist = minishell->freelist; while (freelist) diff --git a/src/utils/free_safe.c b/src/utils/free_safe.c index e5070ec..bae7ef2 100644 --- a/src/utils/free_safe.c +++ b/src/utils/free_safe.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 15:09:34 by whaffman #+# #+# */ -/* Updated: 2025/02/25 17:35:39 by whaffman ######## odam.nl */ +/* Updated: 2025/02/25 18:06:06 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -16,28 +16,8 @@ #include #include -/* Obtain a backtrace and print it to stdout. */ -void -print_trace (void) -{ - void *array[10]; - char **strings; - int size, i; - size = backtrace (array, 10); - strings = backtrace_symbols (array, size); - if (strings != NULL) - { - - printf ("Obtained %d stack frames.\n", size); - for (i = 0; i < size; i++) - fprintf (stderr, "%s\n", strings[i]); - } - - free (strings); -} - -void free_safe(t_minishell *minishell, void **ptr) +void free_safe(t_minishell *minishell, void **ptr) { t_list *prev; t_list *current; @@ -56,13 +36,12 @@ void free_safe(t_minishell *minishell, void **ptr) minishell->freelist = current->next; free(*ptr); free(current); - return; + return ; } prev = current; current = current->next; } error_msg("free_safe", "pointer not found in freelist"); - // print_trace(); } *ptr = NULL; } From 0b250580f2c333678fe085c6b316ef01843b15a1 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 25 Feb 2025 19:59:18 +0100 Subject: [PATCH 049/103] remove obsolete malloc check --- src/prompt/prompt.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/prompt/prompt.c b/src/prompt/prompt.c index f4870bb..8e98282 100644 --- a/src/prompt/prompt.c +++ b/src/prompt/prompt.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* prompt.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:43:27 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* prompt.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ +/* Updated: 2025/02/25 18:41:56 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -101,11 +101,6 @@ char *ft_prompt(t_minishell *minishell) if (user == NULL) return (free(cwd), NULL); prompt = ft_strjoin_safe(minishell, user, cwd); - if (prompt == NULL) - { - perror("malloc"); - return (free(cwd), free(user), NULL); - } free_safe(minishell, (void **)&user); free_safe(minishell, (void **)&cwd); rl_on_new_line(); From 2a31c7ef61b20011039f4145f985f94e93eb73d9 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 25 Feb 2025 20:00:26 +0100 Subject: [PATCH 050/103] sources? --- sources.mk | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 sources.mk diff --git a/sources.mk b/sources.mk new file mode 100644 index 0000000..00202f6 --- /dev/null +++ b/sources.mk @@ -0,0 +1,22 @@ +VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/debug:src/expander:src/builtin:src/signal:src/redirect: +SOURCES = history_load.c history_write.c prompt.c check_malloc.c error_msg.c \ +free_command_list.c free_freelist.c free_lexer.c free_minishell.c \ +free_minishell_line.c free_safe.c free_token.c free_token_list.c \ +ft_lstclear_safe.c ft_lstnew_safe.c ft_strdup_safe.c \ +ft_strjoin_safe.c init_minishell.c malloc_safe.c print_banner.c \ +lexer_read_char.c lexer_new.c lexer_parse_input.c lexer_read_word.c \ +lexer_token_next.c token_new.c token_parse.c environment_add.c \ +environment_del.c environment_free.c environment_free_list.c \ +environment_get.c environment_get_arr.c environment_parse.c \ +environment_print.c executor_close_fds.c executor_absolute_path.c \ +executor_child.c executor_count_fds.c executor_create_pipes.c \ +executor_create_redirects.c executor_execute_pipeline.c \ +executor_fork.c executor_open_fds.c parser_get_arguments.c \ +parser_get_commands.c parser_new_command.c print_commands.c \ +print_freelist.c expander_is_character.c expander_expand_dollar.c \ +expander_allocate_memory.c expander_get_variable.c \ +expander_parse_string.c expander_parse_variables.c builtin_echo.c \ +builtin_router.c simple_builtins.c is_builtin.c builtin_cd.c \ +builtin_env.c builtin_exit.c builtin_export.c builtin_pwd.c \ +builtin_unset.c signal.c main.c redirect_get_inputs.c \ +redirect_get_outputs.c redirect_new.c redirect_valid_type.c \ From e0e77f4012776b25ddb20a4751e96bd99bbe28b2 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 25 Feb 2025 20:55:30 +0100 Subject: [PATCH 051/103] processing heredocs --- .vscode/settings.json | 10 ++++++- sources.mk | 43 +++++++++++++++--------------- src/builtin/builtin_pwd.c | 16 +++++------ src/parser/parser_get_arguments.c | 16 +++++------ src/redirect/redirect_get_inputs.c | 29 +++++++++++++++++++- 5 files changed, 74 insertions(+), 40 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 6be99c7..98bea1c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,14 @@ { "files.associations": { "minishell.h": "c", - "signal.h": "c" + "signal.h": "c", + "optional": "c", + "ostream": "c", + "system_error": "c", + "array": "c", + "functional": "c", + "tuple": "c", + "type_traits": "c", + "utility": "c" } } diff --git a/sources.mk b/sources.mk index e2269f4..3fa9ed9 100644 --- a/sources.mk +++ b/sources.mk @@ -1,22 +1,23 @@ -VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/signal:src/debug:src/expander:src/builtin:src/redirect: -SOURCES = history_load.c history_write.c prompt.c ft_lstclear_safe.c \ -ft_lstnew_safe.c ft_strdup_safe.c ft_strjoin_safe.c init_minishell.c \ -malloc_safe.c print_banner.c error_msg.c check_malloc.c \ -free_command_list.c free_freelist.c free_lexer.c free_minishell.c \ -free_minishell_line.c free_safe.c free_token.c free_token_list.c \ -lexer_read_char.c lexer_new.c lexer_parse_input.c lexer_read_word.c \ -lexer_token_next.c token_new.c token_parse.c environment_add.c \ -environment_del.c environment_free.c environment_free_list.c \ -environment_get.c environment_get_arr.c environment_parse.c \ -environment_print.c executor_close_fds.c executor_absolute_path.c \ -executor_child.c executor_count_fds.c executor_create_pipes.c \ -executor_create_redirects.c executor_execute_pipeline.c \ -executor_fork.c executor_open_fds.c parser_get_arguments.c \ -parser_get_commands.c parser_new_command.c signal.c print_commands.c \ -print_freelist.c expander_expand_dollar.c expander_is_character.c \ -expander_allocate_memory.c expander_get_variable.c \ -expander_parse_string.c expander_parse_variables.c builtin_echo.c \ -builtin_router.c simple_builtins.c is_builtin.c builtin_cd.c \ -builtin_env.c builtin_exit.c builtin_export.c builtin_pwd.c \ -builtin_unset.c redirect_valid_type.c redirect_get_inputs.c \ +VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/debug:src/expander:src/builtin:src/signal:src/redirect: +SOURCES = history_load.c history_write.c prompt.c error_msg.c \ +ft_lstclear_safe.c ft_lstnew_safe.c ft_strdup_safe.c \ +ft_strjoin_safe.c init_minishell.c malloc_safe.c print_banner.c \ +check_malloc.c free_command_list.c free_freelist.c free_lexer.c \ +free_minishell.c free_minishell_line.c free_safe.c free_token.c \ +free_token_list.c lexer_read_char.c lexer_new.c lexer_parse_input.c \ +lexer_read_word.c lexer_token_next.c token_new.c token_parse.c \ +environment_add.c environment_del.c environment_free.c \ +environment_free_list.c environment_get.c environment_get_arr.c \ +environment_parse.c environment_print.c executor_close_fds.c \ +executor_absolute_path.c executor_child.c executor_count_fds.c \ +executor_create_pipes.c executor_create_redirects.c \ +executor_execute_pipeline.c executor_fork.c executor_open_fds.c \ +parser_get_arguments.c parser_get_commands.c parser_new_command.c \ +print_commands.c print_freelist.c expander_is_character.c \ +expander_expand_dollar.c expander_allocate_memory.c \ +expander_get_variable.c expander_parse_string.c \ +expander_parse_variables.c builtin_echo.c builtin_router.c \ +simple_builtins.c is_builtin.c builtin_cd.c builtin_env.c \ +builtin_exit.c builtin_export.c builtin_pwd.c builtin_unset.c \ +signal.c redirect_valid_type.c redirect_get_inputs.c \ redirect_get_outputs.c redirect_new.c main.c \ diff --git a/src/builtin/builtin_pwd.c b/src/builtin/builtin_pwd.c index f380fa3..bbf57d1 100644 --- a/src/builtin/builtin_pwd.c +++ b/src/builtin/builtin_pwd.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* builtin_pwd.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/20 11:32:28 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:17:51 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* builtin_pwd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/20 11:32:28 by whaffman #+# #+# */ +/* Updated: 2025/02/25 20:07:22 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ int builtin_pwd(t_minishell *minishell, t_command *cmd) { - char *cwd; + char *cwd; (void)minishell; (void)cmd; diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index 4bd8db2..afbb729 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* parser_get_arguments.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ -/* Updated: 2025/02/25 16:40:26 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* parser_get_arguments.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ +/* Updated: 2025/02/25 20:14:18 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -56,9 +56,7 @@ char **parser_get_arguments(t_list *list, t_minishell *minishell) while ((++i) < cmds && current) { if (parser_should_expand(current)) - { args[i] = expander_parse_string(((t_token *)current->content)->value, minishell); - } else if (((t_token *)current->content)->type == T_WORD || ((t_token *)current->content)->type == T_SQWORD) args[i] = ft_strdup_safe(minishell, ((t_token *)current->content)->value); diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index 7addf44..705ac5e 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -12,6 +12,31 @@ #include "redirect.h" +static void process_heredoc(t_minishell *ms, t_token *heredoc, t_token *delim) +{ + char *line; + int fd; + + fd = open(".ms_heredoc", O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + return ; + + + while (TRUE) + { + line = readline("heredoc>"); + if ((*line && ft_strcmp(line, delim->value) == 0) || !line) + break ; + if (!*line) + ft_putendl_fd("", fd); + else + ft_putendl_fd(line, fd); + } + close(fd); + heredoc->type = T_REDIRECT_IN; + delim->value = ft_strdup_safe(ms, ".ms_heredoc"); +} + t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) { t_list *current; @@ -30,9 +55,11 @@ t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) current = current->next; continue ; } + if (token->type == T_HEREDOC && redirect_is_valid(current, token)) + process_heredoc(minishell, token, current->next->content); if (redirect_is_valid(current, token)) { - ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, + ft_lstadd_back(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, token->type, ft_strdup_safe(minishell, ((t_token *)current->next->content)->value)))); From 40c208044708403c6866ae5aeb8a8701971dd65c Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 25 Feb 2025 20:56:16 +0100 Subject: [PATCH 052/103] print tokens on debug --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index ef2570b..4c37120 100644 --- a/src/main.c +++ b/src/main.c @@ -32,7 +32,7 @@ int main(int argc, char **argv, char **envp) break ; minishell->lexer = ft_lexer_new(minishell); minishell->tokens = ft_parse_input(minishell); - //ft_lstiter(minishell->tokens, token_print); + ft_lstiter(minishell->tokens, token_print); minishell->commands = parser_get_commands(minishell); simple_builtins(minishell); free_minishell_line(minishell); From aba5e2f28b78ff84c8e34fae27954b696469e57b Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 25 Feb 2025 21:00:29 +0100 Subject: [PATCH 053/103] some todos --- src/redirect/redirect_get_inputs.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index 705ac5e..f68d9af 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -18,14 +18,13 @@ static void process_heredoc(t_minishell *ms, t_token *heredoc, t_token *delim) int fd; fd = open(".ms_heredoc", O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd < 0) + if (fd < 0) //TODO: Will this work? return ; - while (TRUE) { - line = readline("heredoc>"); - if ((*line && ft_strcmp(line, delim->value) == 0) || !line) + line = readline(">"); + if ((*line && ft_strcmp(line, delim->value) == 0) || !line) //TODO: What if not line? break ; if (!*line) ft_putendl_fd("", fd); From f67c5a0f21e6f3d895155dd2d6dc567556d8283e Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 25 Feb 2025 21:00:40 +0100 Subject: [PATCH 054/103] clear history on shell end --- src/builtin/builtin_exit.c | 15 ++++++++------- src/main.c | 1 + 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c index 831ec82..5e3252d 100644 --- a/src/builtin/builtin_exit.c +++ b/src/builtin/builtin_exit.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* builtin_exit.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:04:17 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* builtin_exit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ +/* Updated: 2025/02/25 20:56:29 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,6 +38,7 @@ int builtin_exit(t_minishell *minishell, t_command *cmd) } //print_freelist(minishell); free_minishell(&minishell); + rl_clear_history(); exit(exit_status); return (FAILURE); } diff --git a/src/main.c b/src/main.c index 4c37120..238519d 100644 --- a/src/main.c +++ b/src/main.c @@ -39,5 +39,6 @@ int main(int argc, char **argv, char **envp) } ft_lstclear_safe(minishell, &minishell->commands, free_command_list); free_minishell(&minishell); + rl_clear_history(); return (EXIT_SUCCESS); } From 1bd1b8404cb7017ce9ab4e8a0dc157405dfb7e78 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 25 Feb 2025 21:03:36 +0100 Subject: [PATCH 055/103] see if this fixes seg --- src/environment/environment_parse.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/environment/environment_parse.c b/src/environment/environment_parse.c index d4a436f..91a4b43 100644 --- a/src/environment/environment_parse.c +++ b/src/environment/environment_parse.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* environment_parse.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/05 15:52:33 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:42:22 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* environment_parse.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 15:52:33 by whaffman #+# #+# */ +/* Updated: 2025/02/25 21:02:45 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ int environment_parse(t_minishell *minishell, char **envp) while (*envp != NULL) { env = ft_split(*envp, '='); + check_malloc(minishell, env); environment_add(minishell, env[0], env[1]); ft_free_arr(env); envp++; From 8bb6c5d5fe40bfd013a5dd8b8d0a66f9f148ab49 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 25 Feb 2025 21:27:19 +0100 Subject: [PATCH 056/103] this should do it --- src/environment/environment_parse.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/environment/environment_parse.c b/src/environment/environment_parse.c index 91a4b43..8ef6f6d 100644 --- a/src/environment/environment_parse.c +++ b/src/environment/environment_parse.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 15:52:33 by whaffman #+# #+# */ -/* Updated: 2025/02/25 21:02:45 by qmennen ### ########.fr */ +/* Updated: 2025/02/25 21:17:06 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,8 @@ int environment_parse(t_minishell *minishell, char **envp) while (*envp != NULL) { env = ft_split(*envp, '='); - check_malloc(minishell, env); + if (!env) + return (FAILURE); environment_add(minishell, env[0], env[1]); ft_free_arr(env); envp++; From a5e877fdd515dec21df4d0bc045f482353c3d92b Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 26 Feb 2025 15:27:53 +0100 Subject: [PATCH 057/103] norm 1 --- sources.mk | 43 ++++++++++++------------- src/builtin/builtin_exit.c | 19 ++++++----- src/builtin/is_builtin.c | 3 +- src/builtin/simple_builtins.c | 3 +- src/debug/print_commands.c | 1 - src/debug/print_freelist.c | 4 +-- src/environment/environment_get_arr.c | 8 +++-- src/environment/environment_parse.c | 15 ++++----- src/executor/executor_child.c | 4 +-- src/executor/executor_count_fds.c | 4 +-- src/executor/executor_fork.c | 6 ++-- src/executor/executor_open_fds.c | 3 +- src/expander/expander_allocate_memory.c | 8 ++--- src/expander/expander_parse_string.c | 5 ++- src/expander/expander_parse_variables.c | 3 +- src/lexer/lexer_new.c | 6 ++-- src/lexer/lexer_parse_input.c | 6 ++-- src/parser/parser_get_arguments.c | 30 +++++++++-------- 18 files changed, 83 insertions(+), 88 deletions(-) diff --git a/sources.mk b/sources.mk index 3fa9ed9..9930b49 100644 --- a/sources.mk +++ b/sources.mk @@ -1,23 +1,22 @@ -VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/debug:src/expander:src/builtin:src/signal:src/redirect: -SOURCES = history_load.c history_write.c prompt.c error_msg.c \ -ft_lstclear_safe.c ft_lstnew_safe.c ft_strdup_safe.c \ -ft_strjoin_safe.c init_minishell.c malloc_safe.c print_banner.c \ -check_malloc.c free_command_list.c free_freelist.c free_lexer.c \ -free_minishell.c free_minishell_line.c free_safe.c free_token.c \ -free_token_list.c lexer_read_char.c lexer_new.c lexer_parse_input.c \ -lexer_read_word.c lexer_token_next.c token_new.c token_parse.c \ -environment_add.c environment_del.c environment_free.c \ -environment_free_list.c environment_get.c environment_get_arr.c \ -environment_parse.c environment_print.c executor_close_fds.c \ -executor_absolute_path.c executor_child.c executor_count_fds.c \ -executor_create_pipes.c executor_create_redirects.c \ -executor_execute_pipeline.c executor_fork.c executor_open_fds.c \ -parser_get_arguments.c parser_get_commands.c parser_new_command.c \ -print_commands.c print_freelist.c expander_is_character.c \ -expander_expand_dollar.c expander_allocate_memory.c \ +VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/signal:src/debug:src/expander:src/builtin:src/redirect: +SOURCES = history_load.c history_write.c prompt.c ft_lstclear_safe.c \ +ft_lstnew_safe.c ft_strdup_safe.c ft_strjoin_safe.c init_minishell.c \ +malloc_safe.c free_minishell_line.c free_safe.c print_banner.c \ +error_msg.c check_malloc.c free_command_list.c free_freelist.c \ +free_lexer.c free_minishell.c free_token.c free_token_list.c \ +lexer_read_char.c lexer_new.c lexer_parse_input.c lexer_read_word.c \ +lexer_token_next.c token_new.c token_parse.c environment_add.c \ +environment_del.c environment_free.c environment_free_list.c \ +environment_get.c environment_get_arr.c environment_print.c \ +environment_parse.c executor_close_fds.c executor_absolute_path.c \ +executor_child.c executor_count_fds.c executor_create_pipes.c \ +executor_create_redirects.c executor_fork.c executor_open_fds.c \ +executor_execute_pipeline.c parser_get_commands.c \ +parser_new_command.c parser_get_arguments.c signal.c print_freelist.c \ +print_commands.c expander_expand_dollar.c expander_is_character.c \ expander_get_variable.c expander_parse_string.c \ -expander_parse_variables.c builtin_echo.c builtin_router.c \ -simple_builtins.c is_builtin.c builtin_cd.c builtin_env.c \ -builtin_exit.c builtin_export.c builtin_pwd.c builtin_unset.c \ -signal.c redirect_valid_type.c redirect_get_inputs.c \ -redirect_get_outputs.c redirect_new.c main.c \ +expander_parse_variables.c expander_allocate_memory.c builtin_echo.c \ +builtin_router.c simple_builtins.c is_builtin.c builtin_cd.c \ +builtin_env.c builtin_export.c builtin_unset.c builtin_pwd.c \ +builtin_exit.c redirect_valid_type.c redirect_get_outputs.c \ +redirect_new.c redirect_get_inputs.c main.c \ diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c index 5e3252d..4dcb622 100644 --- a/src/builtin/builtin_exit.c +++ b/src/builtin/builtin_exit.c @@ -1,23 +1,23 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* builtin_exit.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ -/* Updated: 2025/02/25 20:56:29 by qmennen ### ########.fr */ +/* :::::::: */ +/* builtin_exit.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ +/* Updated: 2025/02/26 15:19:51 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" - +//TODO EXIT last exit status r:20 int builtin_exit(t_minishell *minishell, t_command *cmd) { int exit_status; - exit_status = 0; //TODO EXIT last exit status + exit_status = 0; if (ft_count_arr(cmd->args) > 2) { ft_putstr_fd("exit\n", STDERR_FILENO); @@ -36,7 +36,6 @@ int builtin_exit(t_minishell *minishell, t_command *cmd) } exit_status = ft_atoi(cmd->args[1]); } - //print_freelist(minishell); free_minishell(&minishell); rl_clear_history(); exit(exit_status); diff --git a/src/builtin/is_builtin.c b/src/builtin/is_builtin.c index 8fe1345..05cb3f9 100644 --- a/src/builtin/is_builtin.c +++ b/src/builtin/is_builtin.c @@ -6,13 +6,12 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:03:33 by whaffman #+# #+# */ -/* Updated: 2025/02/20 15:36:16 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 14:42:49 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" - int is_builtin(char *cmd) { const char *builtins[] = {"echo", "cd", "pwd", "export", diff --git a/src/builtin/simple_builtins.c b/src/builtin/simple_builtins.c index 992b67d..b83fbbe 100644 --- a/src/builtin/simple_builtins.c +++ b/src/builtin/simple_builtins.c @@ -6,13 +6,12 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:21:39 by whaffman #+# #+# */ -/* Updated: 2025/02/20 15:06:40 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 14:42:54 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" - void simple_builtins(t_minishell *minishell) { if (minishell->commands == NULL) diff --git a/src/debug/print_commands.c b/src/debug/print_commands.c index c41bfa2..2092b8d 100644 --- a/src/debug/print_commands.c +++ b/src/debug/print_commands.c @@ -53,4 +53,3 @@ void token_print(void *param) token = (t_token *)param; printf("token type %i, value %s\n", token->type, token->value); } - diff --git a/src/debug/print_freelist.c b/src/debug/print_freelist.c index b9b1e6e..7a74220 100644 --- a/src/debug/print_freelist.c +++ b/src/debug/print_freelist.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 15:46:03 by whaffman #+# #+# */ -/* Updated: 2025/02/25 18:17:13 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 14:44:46 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ void print_freelist(t_minishell *minishell) { t_list *freelist; - int i; + int i; if (!DEBUG) return ; diff --git a/src/environment/environment_get_arr.c b/src/environment/environment_get_arr.c index c7d9b68..9746792 100644 --- a/src/environment/environment_get_arr.c +++ b/src/environment/environment_get_arr.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 13:59:48 by willem #+# #+# */ -/* Updated: 2025/02/25 14:29:49 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 14:45:35 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,12 +20,14 @@ char **environment_get_arr(t_minishell *minishell) t_list *environment; environment = minishell->environment; - arr = malloc_safe(minishell, sizeof(char *) * (ft_lstsize(environment) + 1)); + arr = malloc_safe(minishell, + sizeof(char *) * (ft_lstsize(environment) + 1)); i = 0; while (environment != NULL) { env = (t_environment *)environment->content; - arr[i] = malloc_safe(minishell, ft_strlen(env->name) + ft_strlen(env->value) + 2); + arr[i] = malloc_safe(minishell, + ft_strlen(env->name) + ft_strlen(env->value) + 2); ft_strlcpy(arr[i], env->name, ft_strlen(env->name) + 1); ft_strlcat(arr[i], "=", ft_strlen(env->name) + 2); ft_strlcat(arr[i], env->value, diff --git a/src/environment/environment_parse.c b/src/environment/environment_parse.c index 8ef6f6d..e5a42a1 100644 --- a/src/environment/environment_parse.c +++ b/src/environment/environment_parse.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* environment_parse.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/05 15:52:33 by whaffman #+# #+# */ -/* Updated: 2025/02/25 21:17:06 by qmennen ### ########.fr */ +/* :::::::: */ +/* environment_parse.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/05 15:52:33 by whaffman #+# #+# */ +/* Updated: 2025/02/26 15:20:09 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -16,7 +16,6 @@ int environment_parse(t_minishell *minishell, char **envp) { char **env; - if (envp == NULL) return (FAILURE); while (*envp != NULL) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 125acbb..549cdcb 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/25 13:52:53 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:20:25 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ void executor_child(t_minishell *minishell, t_command *command) { - char *path; + char *path; if (command->fd_in != 0) dup2(command->fd_in, 0); diff --git a/src/executor/executor_count_fds.c b/src/executor/executor_count_fds.c index f478882..0fcf5f9 100644 --- a/src/executor/executor_count_fds.c +++ b/src/executor/executor_count_fds.c @@ -6,13 +6,13 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/21 12:42:26 by whaffman #+# #+# */ -/* Updated: 2025/02/21 13:05:55 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:20:33 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int executor_count_fds(t_minishell *minishell) +int executor_count_fds(t_minishell *minishell) { int count; t_list *current; diff --git a/src/executor/executor_fork.c b/src/executor/executor_fork.c index 5da3295..2c025a3 100644 --- a/src/executor/executor_fork.c +++ b/src/executor/executor_fork.c @@ -6,16 +6,16 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:24:52 by willem #+# #+# */ -/* Updated: 2025/02/25 13:51:48 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:21:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" +//TODO should parent close the fds? pid_t executor_fork(t_minishell *minishell, t_command *command) { pid_t pid; - // int status; pid = fork(); if (pid > 0) @@ -24,8 +24,6 @@ pid_t executor_fork(t_minishell *minishell, t_command *command) close(command->fd_in); if (command->fd_out != 1) close(command->fd_out); - // waitpid(pid, &status, 0); - // return (((status) & 0xff00) >> 8); signal_init_parent(); } else if (pid == 0) diff --git a/src/executor/executor_open_fds.c b/src/executor/executor_open_fds.c index 4dc2b5e..ace0aa4 100644 --- a/src/executor/executor_open_fds.c +++ b/src/executor/executor_open_fds.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/21 12:50:42 by whaffman #+# #+# */ -/* Updated: 2025/02/21 13:15:04 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:21:56 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -35,5 +35,4 @@ int executor_open_fds(t_list *redirect_list, int og_fd) redirect_list = redirect_list->next; } return (fd); - } diff --git a/src/expander/expander_allocate_memory.c b/src/expander/expander_allocate_memory.c index 08c72b8..a323e4c 100644 --- a/src/expander/expander_allocate_memory.c +++ b/src/expander/expander_allocate_memory.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/19 13:57:19 by qmennen #+# #+# */ -/* Updated: 2025/02/25 17:54:08 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:22:11 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,10 +17,10 @@ char *expander_allocate_memory( const char *s, t_list *variables) { - int size; - t_list *current; + int size; + t_list *current; t_environment *env; - char *string; + char *string; size = 1; current = variables; diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c index e2fdf4b..6546950 100644 --- a/src/expander/expander_parse_string.c +++ b/src/expander/expander_parse_string.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/25 16:14:16 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:22:54 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -26,6 +26,7 @@ static void free_variables(t_minishell *minishell, t_list *variables) } } +//TODO: Figure out why echo "> echo "\as"" breaks char *expander_parse_string(char *s, t_minishell *minishell) { t_list *variables; @@ -51,8 +52,6 @@ char *expander_parse_string(char *s, t_minishell *minishell) else string[j++] = s[i++]; } - //TODO: Figure out why echo "> echo "\as"" breaks - string[j] = 0; free_variables(minishell, variables); return (string); diff --git a/src/expander/expander_parse_variables.c b/src/expander/expander_parse_variables.c index aab07e9..69c6c5c 100644 --- a/src/expander/expander_parse_variables.c +++ b/src/expander/expander_parse_variables.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/19 13:58:13 by qmennen #+# #+# */ -/* Updated: 2025/02/25 16:51:16 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:23:17 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,7 +14,6 @@ t_list *expander_parse_variables(const char *s, t_minishell *minishell) { - int i; t_list *var_list; t_environment *env; diff --git a/src/lexer/lexer_new.c b/src/lexer/lexer_new.c index 92d13d1..8bb3a0d 100644 --- a/src/lexer/lexer_new.c +++ b/src/lexer/lexer_new.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:03:01 by qmennen #+# #+# */ -/* Updated: 2025/02/25 16:40:16 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:23:52 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,9 +14,9 @@ t_lexer *ft_lexer_new(t_minishell *minishell) { - char *input; - + char *input; t_lexer *lexer; + input = minishell->line; lexer = malloc_safe(minishell, sizeof(t_lexer)); lexer->input = ft_strdup_safe(minishell, input); diff --git a/src/lexer/lexer_parse_input.c b/src/lexer/lexer_parse_input.c index e68d723..fb4dc94 100644 --- a/src/lexer/lexer_parse_input.c +++ b/src/lexer/lexer_parse_input.c @@ -6,11 +6,12 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ -/* Updated: 2025/02/25 16:51:27 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:24:39 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" +//TODO: Check if unicode support is viable /** * @brief Parses the input from the lexer and returns a list of tokens. @@ -33,9 +34,8 @@ t_list *ft_parse_input(t_minishell *minishell) list = NULL; while (TRUE) { - //TODO: Check if unicode support is viable token = ft_token_next(minishell, lexer); - if (token->type == T_EOF || token->type == T_ERROR) //TODO T_ERROR removes the inf loop + if (token->type == T_EOF || token->type == T_ERROR) break ; ft_lstadd_back(&list, ft_lstnew_safe(minishell, token)); } diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index afbb729..1881561 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* parser_get_arguments.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ -/* Updated: 2025/02/25 20:14:18 by qmennen ### ########.fr */ +/* :::::::: */ +/* parser_get_arguments.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ +/* Updated: 2025/02/26 15:26:32 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -38,8 +38,10 @@ static int parser_should_expand(t_list *value) token = (t_token *)value->content; if (!token) return (0); - return (token->type == T_DQWORD || (token->type == T_WORD && - token->value[0] == '$' && token->value[1])); + return (token->type == T_DQWORD + || (token->type == T_WORD + && token->value[0] == '$' + && token->value[1])); } char **parser_get_arguments(t_list *list, t_minishell *minishell) @@ -56,10 +58,12 @@ char **parser_get_arguments(t_list *list, t_minishell *minishell) while ((++i) < cmds && current) { if (parser_should_expand(current)) - args[i] = expander_parse_string(((t_token *)current->content)->value, minishell); - else if (((t_token *)current->content)->type == T_WORD || - ((t_token *)current->content)->type == T_SQWORD) - args[i] = ft_strdup_safe(minishell, ((t_token *)current->content)->value); + args[i] = expander_parse_string( + ((t_token *)current->content)->value, minishell); + else if (((t_token *)current->content)->type == T_WORD + || ((t_token *)current->content)->type == T_SQWORD) + args[i] = ft_strdup_safe(minishell, + ((t_token *)current->content)->value); current = current->next; } args[i] = 0; From c2efcca0fa55307b498e5b70d5f2ce654c759ba9 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 26 Feb 2025 15:45:10 +0100 Subject: [PATCH 058/103] norm 2 --- src/parser/parser_get_commands.c | 5 ++-- src/parser/parser_new_command.c | 3 +-- src/prompt/prompt.c | 18 +++++++------- src/redirect/redirect_get_inputs.c | 11 ++++----- src/redirect/redirect_get_outputs.c | 12 +++++----- src/redirect/redirect_new.c | 16 ++++++------- src/redirect/redirect_valid_type.c | 37 ++++++++++++++++------------- src/signal/signal.c | 30 +---------------------- src/signal/signal_init.c.c | 37 +++++++++++++++++++++++++++++ src/utils/check_malloc.c | 5 ++-- src/utils/error_msg.c | 1 - src/utils/free_minishell.c | 6 +---- src/utils/free_safe.c | 6 +---- src/utils/ft_strjoin_safe.c | 1 - 14 files changed, 95 insertions(+), 93 deletions(-) create mode 100644 src/signal/signal_init.c.c diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 724db81..7d67d06 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -12,7 +12,7 @@ #include "minishell.h" -static int is_command_token(t_token *token) +static int is_command_token(t_token *token) { return (token->type < 3 || redirect_token_type(token)); } @@ -31,7 +31,8 @@ t_list *parser_get_commands(t_minishell *minishell) while (current) { token = (t_token *) current->content; - command = parser_command_new(minishell, ft_strdup_safe(minishell, token->value)); + command = parser_command_new(minishell, + ft_strdup_safe(minishell, token->value)); command->args = parser_get_arguments(current, minishell); command->redirect_in = redirect_get_inputs(minishell, current); command->redirect_out = redirect_get_outputs(minishell, current); diff --git a/src/parser/parser_new_command.c b/src/parser/parser_new_command.c index 7b4e45f..f162d67 100644 --- a/src/parser/parser_new_command.c +++ b/src/parser/parser_new_command.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/11 16:18:21 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:41:57 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:32:45 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,7 +17,6 @@ t_command *parser_command_new(t_minishell *minishell, char *cmd) t_command *command; command = malloc_safe(minishell, sizeof(t_command)); -\ command->args = NULL; command->fd_in = 0; command->fd_out = 1; diff --git a/src/prompt/prompt.c b/src/prompt/prompt.c index 8e98282..e0f9195 100644 --- a/src/prompt/prompt.c +++ b/src/prompt/prompt.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* prompt.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ -/* Updated: 2025/02/25 18:41:56 by qmennen ### ########.fr */ +/* :::::::: */ +/* prompt.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ +/* Updated: 2025/02/26 15:33:15 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -33,7 +33,7 @@ char *get_user(t_minishell *minishell) return (result); } -int get_home_len(t_minishell *minishell, char *cwd) +int get_home_len(t_minishell *minishell, char *cwd) { t_environment *home; int home_len; @@ -83,7 +83,7 @@ char *get_path(t_minishell *minishell) ft_strlcpy(result, BLUE, len); ft_strlcat(result, cwd, len); ft_strlcat(result, RESET "> ", len); - free_safe(minishell,(void **) &cwd); + free_safe(minishell, (void **) &cwd); return (result); } diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index f68d9af..6e298fb 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -12,7 +12,7 @@ #include "redirect.h" -static void process_heredoc(t_minishell *ms, t_token *heredoc, t_token *delim) +static void process_heredoc(t_minishell *msh, t_token *heredoc, t_token *delim) { char *line; int fd; @@ -20,7 +20,6 @@ static void process_heredoc(t_minishell *ms, t_token *heredoc, t_token *delim) fd = open(".ms_heredoc", O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd < 0) //TODO: Will this work? return ; - while (TRUE) { line = readline(">"); @@ -33,14 +32,14 @@ static void process_heredoc(t_minishell *ms, t_token *heredoc, t_token *delim) } close(fd); heredoc->type = T_REDIRECT_IN; - delim->value = ft_strdup_safe(ms, ".ms_heredoc"); + delim->value = ft_strdup_safe(msh, ".ms_heredoc"); } t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) { - t_list *current; - t_list *redirects; - t_token *token; + t_list *current; + t_list *redirects; + t_token *token; redirects = NULL; current = list; diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index f1f884c..e2cca75 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -12,11 +12,11 @@ #include "minishell.h" -t_list *redirect_get_outputs(t_minishell *minishell, t_list *list) +t_list *redirect_get_outputs(t_minishell *msh, t_list *list) { - t_list *current; - t_list *redirects; - t_token *token; + t_list *current; + t_list *redirects; + t_token *token; redirects = NULL; current = list; @@ -33,13 +33,13 @@ t_list *redirect_get_outputs(t_minishell *minishell, t_list *list) if (redirect_is_valid(current, token)) { ft_lstadd_front(&redirects, - ft_lstnew_safe(minishell, redirect_new(minishell, token->type, ft_strdup_safe(minishell, ((t_token *)current->next->content)->value)))); + ft_lstnew_safe(msh, redirect_new(msh, token->type, ft_strdup_safe(msh, ((t_token *)current->next->content)->value)))); current = current->next; continue ; } else { - ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, T_ERROR, NULL))); + ft_lstadd_front(&redirects, ft_lstnew_safe(msh, redirect_new(msh, T_ERROR, NULL))); break ; } current = current->next; diff --git a/src/redirect/redirect_new.c b/src/redirect/redirect_new.c index e6c9ccc..662d337 100644 --- a/src/redirect/redirect_new.c +++ b/src/redirect/redirect_new.c @@ -12,14 +12,14 @@ #include "minishell.h" -t_redirect *redirect_new(t_minishell * minishell, t_token_type type, char *value) +t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value) { - t_redirect *result; + t_redirect *result; - result = malloc_safe(minishell, sizeof(t_redirect)); - result->type = type; - result->value = NULL; - if (value) - result->value = value; - return (result); + result = malloc_safe(msh, sizeof(t_redirect)); + result->type = type; + result->value = NULL; + if (value) + result->value = value; + return (result); } diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c index 2554d32..5f5f9de 100644 --- a/src/redirect/redirect_valid_type.c +++ b/src/redirect/redirect_valid_type.c @@ -12,26 +12,31 @@ #include "minishell.h" -int redirect_token_type(t_token *token) +int redirect_token_type(t_token *token) { - return (token->type == T_REDIRECT_IN || token->type == T_HEREDOC || - token->type == T_REDIRECT_OUT || token->type == T_APPEND_OUT); + return (token->type == T_REDIRECT_IN + || token->type == T_HEREDOC + || token->type == T_REDIRECT_OUT + || token->type == T_APPEND_OUT); } -int redirect_is_valid(t_list *lst, t_token *token) +int redirect_is_valid(t_list *lst, t_token *token) { - t_token *next; - - if (!lst->next) - return (0); - next = (t_token *)lst->next->content; - if (!next) - return (0); - return (redirect_token_type(token) && next->type < 3); -} + t_token *next; -int redirect_is_delimiter(t_token *token) + if (!lst->next) + return (0); + next = (t_token *)lst->next->content; + if (!next) + return (0); + return (redirect_token_type(token) && next->type < 3); +} + +int redirect_is_delimiter(t_token *token) { - return (token->type == T_PIPE || token->type == T_AND || - token->type == T_OR || token->type == T_EOF || token->type == T_ERROR); + return (token->type == T_PIPE + || token->type == T_AND + || token->type == T_OR + || token->type == T_EOF + || token->type == T_ERROR); } \ No newline at end of file diff --git a/src/signal/signal.c b/src/signal/signal.c index 0b81082..edc72ca 100644 --- a/src/signal/signal.c +++ b/src/signal/signal.c @@ -6,13 +6,12 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/19 12:18:47 by whaffman #+# #+# */ -/* Updated: 2025/02/19 17:30:12 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:42:30 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" - void sigint_minishell_handler(int signum) { (void)signum; @@ -36,30 +35,3 @@ void sig_parent_handler(int signum) (void)signum; ft_putstr_fd("\n", 1); } - - -void signal_init_minishell(void) -{ - signal(SIGINT, sigint_minishell_handler); - signal(SIGQUIT, SIG_IGN); -} - -void signal_init_parent(void) -{ - signal(SIGINT, sig_parent_handler); - signal(SIGQUIT, sig_parent_handler); -} - - -void signal_init_child(void) -{ - signal(SIGINT, SIG_DFL); - signal(SIGQUIT, SIG_DFL); -} - - -void signal_init_heredoc(void) -{ - signal(SIGINT, sigint_heredoc_handler); - signal(SIGQUIT, SIG_IGN); -} diff --git a/src/signal/signal_init.c.c b/src/signal/signal_init.c.c new file mode 100644 index 0000000..0f5133c --- /dev/null +++ b/src/signal/signal_init.c.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* signal_init.c.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/26 15:39:01 by whaffman #+# #+# */ +/* Updated: 2025/02/26 15:39:46 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void signal_init_minishell(void) +{ + signal(SIGINT, sigint_minishell_handler); + signal(SIGQUIT, SIG_IGN); +} + +void signal_init_parent(void) +{ + signal(SIGINT, sig_parent_handler); + signal(SIGQUIT, sig_parent_handler); +} + +void signal_init_child(void) +{ + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); +} + +void signal_init_heredoc(void) +{ + signal(SIGINT, sigint_heredoc_handler); + signal(SIGQUIT, SIG_IGN); +} diff --git a/src/utils/check_malloc.c b/src/utils/check_malloc.c index 4607767..72cff69 100644 --- a/src/utils/check_malloc.c +++ b/src/utils/check_malloc.c @@ -12,10 +12,9 @@ #include "minishell.h" - -void check_malloc(t_minishell *minishell, void *ptr) +void check_malloc(t_minishell *minishell, void *ptr) { - t_list *new; + t_list *new; if (ptr == NULL) { diff --git a/src/utils/error_msg.c b/src/utils/error_msg.c index 6442019..2ce1ed1 100644 --- a/src/utils/error_msg.c +++ b/src/utils/error_msg.c @@ -12,7 +12,6 @@ #include "minishell.h" - void error_msg(char *func, char *msg) { if (errno) diff --git a/src/utils/free_minishell.c b/src/utils/free_minishell.c index 1b8e567..fc4db5a 100644 --- a/src/utils/free_minishell.c +++ b/src/utils/free_minishell.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:03:57 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:02:57 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:43:00 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,10 +14,6 @@ void free_minishell(t_minishell **minishell) { - // if ((*minishell)->line) - // free_minishell_line(*minishell); - // if ((*minishell)->environment) - // environment_free_list(*minishell); free_freelist(*minishell); free(*minishell); *minishell = NULL; diff --git a/src/utils/free_safe.c b/src/utils/free_safe.c index bae7ef2..53faa28 100644 --- a/src/utils/free_safe.c +++ b/src/utils/free_safe.c @@ -6,16 +6,12 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 15:09:34 by whaffman #+# #+# */ -/* Updated: 2025/02/25 18:06:06 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:43:08 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -#include -#include -#include - void free_safe(t_minishell *minishell, void **ptr) { diff --git a/src/utils/ft_strjoin_safe.c b/src/utils/ft_strjoin_safe.c index 655c85b..cf596c8 100644 --- a/src/utils/ft_strjoin_safe.c +++ b/src/utils/ft_strjoin_safe.c @@ -20,4 +20,3 @@ char *ft_strjoin_safe(t_minishell *minishell, const char *s1, const char *s2) check_malloc(minishell, new_str); return (new_str); } - From 5d01cf308624c9a809da3f29ff0cffdd2faf5cd5 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 26 Feb 2025 16:17:07 +0100 Subject: [PATCH 059/103] minishell -> msh --- inc/builtin.h | 18 +++++----- inc/debug.h | 2 +- inc/environment.h | 18 +++++----- inc/executor.h | 16 ++++----- inc/expander.h | 10 +++--- inc/parser.h | 6 ++-- inc/prompt.h | 4 +-- inc/redirect.h | 6 ++-- inc/tokenizer.h | 20 +++++------ inc/utils.h | 26 +++++++------- sources.mk | 43 ++++++++++++------------ src/builtin/builtin_cd.c | 6 ++-- src/builtin/builtin_echo.c | 6 ++-- src/builtin/builtin_env.c | 6 ++-- src/builtin/builtin_exit.c | 6 ++-- src/builtin/builtin_export.c | 12 +++---- src/builtin/builtin_pwd.c | 20 +++++------ src/builtin/builtin_router.c | 6 ++-- src/builtin/builtin_unset.c | 8 ++--- src/builtin/simple_builtins.c | 10 +++--- src/debug/print_freelist.c | 6 ++-- src/environment/environment_add.c | 16 ++++----- src/environment/environment_del.c | 12 +++---- src/environment/environment_free.c | 10 +++--- src/environment/environment_free_list.c | 8 ++--- src/environment/environment_get.c | 6 ++-- src/environment/environment_get_arr.c | 10 +++--- src/environment/environment_parse.c | 6 ++-- src/environment/environment_print.c | 6 ++-- src/executor/executor_absolute_path.c | 12 +++---- src/executor/executor_child.c | 8 ++--- src/executor/executor_count_fds.c | 6 ++-- src/executor/executor_create_pipes.c | 2 +- src/executor/executor_create_redirects.c | 6 ++-- src/executor/executor_execute_pipeline.c | 14 ++++---- src/executor/executor_fork.c | 6 ++-- src/expander/expander_allocate_memory.c | 6 ++-- src/expander/expander_get_variable.c | 8 ++--- src/expander/expander_parse_string.c | 14 ++++---- src/expander/expander_parse_variables.c | 10 +++--- src/lexer/lexer_new.c | 10 +++--- src/lexer/lexer_parse_input.c | 12 +++---- src/lexer/lexer_read_word.c | 14 ++++---- src/lexer/lexer_token_next.c | 18 +++++----- src/main.c | 26 +++++++------- src/parser/parser_get_arguments.c | 10 +++--- src/parser/parser_get_commands.c | 18 +++++----- src/parser/parser_new_command.c | 6 ++-- src/prompt/prompt.c | 40 +++++++++++----------- src/redirect/redirect_get_inputs.c | 12 +++---- src/token/token_new.c | 8 ++--- src/token/token_parse.c | 6 ++-- src/utils/check_malloc.c | 8 ++--- src/utils/error_msg.c | 4 +-- src/utils/free_command_list.c | 26 +++++++------- src/utils/free_freelist.c | 8 ++--- src/utils/free_lexer.c | 8 ++--- src/utils/free_minishell.c | 10 +++--- src/utils/free_minishell_line.c | 20 +++++------ src/utils/free_safe.c | 8 ++--- src/utils/free_token.c | 8 ++--- src/utils/free_token_list.c | 6 ++-- src/utils/ft_lstclear_safe.c | 12 +++---- src/utils/ft_lstnew_safe.c | 8 ++--- src/utils/ft_strdup_safe.c | 4 +-- src/utils/ft_strjoin_safe.c | 4 +-- src/utils/init_minishell.c | 24 ++++++------- src/utils/malloc_safe.c | 4 +-- 68 files changed, 382 insertions(+), 381 deletions(-) diff --git a/inc/builtin.h b/inc/builtin.h index b9c8182..1ceac33 100644 --- a/inc/builtin.h +++ b/inc/builtin.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:09:02 by whaffman #+# #+# */ -/* Updated: 2025/02/20 11:38:58 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:44:47 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,13 +15,13 @@ # include "minishell.h" int is_builtin(char *cmd); -int builtin_router(t_minishell *minishell, t_command *cmd); -int builtin_echo(t_minishell *minishell, t_command *cmd); -int builtin_cd(t_minishell *minishell, t_command *cmd); -int builtin_pwd(t_minishell *minishell, t_command *cmd); -int builtin_export(t_minishell *minishell, t_command *cmd); -int builtin_unset(t_minishell *minishell, t_command *cmd); -int builtin_env(t_minishell *minishell, t_command *cmd); -int builtin_exit(t_minishell *minishell, t_command *cmd); +int builtin_router(t_minishell *msh, t_command *cmd); +int builtin_echo(t_minishell *msh, t_command *cmd); +int builtin_cd(t_minishell *msh, t_command *cmd); +int builtin_pwd(t_minishell *msh, t_command *cmd); +int builtin_export(t_minishell *msh, t_command *cmd); +int builtin_unset(t_minishell *msh, t_command *cmd); +int builtin_env(t_minishell *msh, t_command *cmd); +int builtin_exit(t_minishell *msh, t_command *cmd); #endif // BUILTIN_H diff --git a/inc/debug.h b/inc/debug.h index 9cc9cea..fc287f5 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -18,6 +18,6 @@ void print_commands(void *param); void token_print(void *param); void print_redirects(void *param); -void print_freelist(t_minishell *minishell); +void print_freelist(t_minishell *msh); #endif diff --git a/inc/environment.h b/inc/environment.h index f1f1439..6d0e160 100644 --- a/inc/environment.h +++ b/inc/environment.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:26:35 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:19:01 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:44:49 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,14 +15,14 @@ # include "minishell.h" -void environment_add(t_minishell *minishell, +void environment_add(t_minishell *msh, char *name, char *value); -void environment_print(t_minishell *minishell); -t_environment *environment_get(t_minishell *minishell, char *name); -void environment_free_list(t_minishell *minishell); -int environment_parse(t_minishell *minishell, char **envp); -char **environment_get_arr(t_minishell *minishell); -void environment_del(t_minishell *minishell, char *name); -void environment_free(t_minishell *minishell, void *content); +void environment_print(t_minishell *msh); +t_environment *environment_get(t_minishell *msh, char *name); +void environment_free_list(t_minishell *msh); +int environment_parse(t_minishell *msh, char **envp); +char **environment_get_arr(t_minishell *msh); +void environment_del(t_minishell *msh, char *name); +void environment_free(t_minishell *msh, void *content); #endif // ENVIRONMENT_H diff --git a/inc/executor.h b/inc/executor.h index d305646..6799399 100644 --- a/inc/executor.h +++ b/inc/executor.h @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:06:07 by willem #+# #+# */ -/* Updated: 2025/02/25 13:52:05 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:45:17 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,14 +15,14 @@ # include "minishell.h" -char *executor_absolute_path(t_minishell *minishell, char *cmd); -void executor_child(t_minishell *minishell, t_command *command); -pid_t executor_fork(t_minishell *minishell, t_command *command); -void executor_create_pipes(t_minishell *minishell); -int executor_execute_pipeline(t_minishell *minishell); +char *executor_absolute_path(t_minishell *msh, char *cmd); +void executor_child(t_minishell *msh, t_command *command); +pid_t executor_fork(t_minishell *msh, t_command *command); +void executor_create_pipes(t_minishell *msh); +int executor_execute_pipeline(t_minishell *msh); void executor_close_fds(int n_fds); -int executor_count_fds(t_minishell *minishell); +int executor_count_fds(t_minishell *msh); int executor_open_fds(t_list *redirect_list, int og_fd); -void executor_create_redirects(t_minishell *minishell); +void executor_create_redirects(t_minishell *msh); #endif // EXECUTOR_H diff --git a/inc/expander.h b/inc/expander.h index db6158a..82f4b4b 100644 --- a/inc/expander.h +++ b/inc/expander.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/18 19:00:51 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:32:18 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:45:19 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -16,14 +16,14 @@ # include "minishell.h" t_environment *expander_get_var(const char *s, int idx, - t_minishell *minishell); + t_minishell *msh); t_list *expander_parse_variables(const char *s, - t_minishell *minishell); + t_minishell *msh); char *expander_allocate_memory( - t_minishell *minishell, + t_minishell *msh, const char *s, t_list *variables); -char *expander_parse_string(char *s, t_minishell *minishell); +char *expander_parse_string(char *s, t_minishell *msh); int expander_character_valid(const char c); int expander_expand_dollar(char *src, char *dest, int *j, t_list *variables); diff --git a/inc/parser.h b/inc/parser.h index 13250e4..c2aff32 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -15,9 +15,9 @@ # include "minishell.h" -t_command *parser_command_new(t_minishell *minishell, char *cmd); -char **parser_get_arguments(t_list *list, t_minishell *minishell); -t_list *parser_get_commands(t_minishell *minishell); +t_command *parser_command_new(t_minishell *msh, char *cmd); +char **parser_get_arguments(t_list *list, t_minishell *msh); +t_list *parser_get_commands(t_minishell *msh); t_list *parser_get_input_redirects(t_list *list); #endif diff --git a/inc/prompt.h b/inc/prompt.h index 3ed41c4..efdb11a 100644 --- a/inc/prompt.h +++ b/inc/prompt.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:35:35 by whaffman #+# #+# */ -/* Updated: 2025/02/12 12:54:01 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:45:22 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ # include "minishell.h" void print_banner(void); -char *ft_prompt(t_minishell *minishell); +char *ft_prompt(t_minishell *msh); void history_write(char *line); void history_load(void); diff --git a/inc/redirect.h b/inc/redirect.h index d9b5911..2068b97 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -14,9 +14,9 @@ # define REDIRECT_H # include "minishell.h" -t_redirect *redirect_new(t_minishell *minishell, t_token_type type, char *value); -t_list *redirect_get_inputs(t_minishell *minishell, t_list *list); -t_list *redirect_get_outputs(t_minishell *minishell, t_list *list); +t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value); +t_list *redirect_get_inputs(t_minishell *msh, t_list *list); +t_list *redirect_get_outputs(t_minishell *msh, t_list *list); int redirect_is_valid(t_list *lst, t_token *token); int redirect_token_type(t_token *token); int redirect_is_delimiter(t_token *token); diff --git a/inc/tokenizer.h b/inc/tokenizer.h index 1b2e7d4..cfd415e 100644 --- a/inc/tokenizer.h +++ b/inc/tokenizer.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:19:05 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:45:26 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -16,18 +16,18 @@ /** * Lexer */ -t_lexer *ft_lexer_new(t_minishell *minishell); -void ft_lexer_free(t_minishell *minishell, t_lexer *lexer); +t_lexer *ft_lexer_new(t_minishell *msh); +void ft_lexer_free(t_minishell *msh, t_lexer *lexer); void lexer_readchar(t_lexer *lexer); -char *lexer_readword(t_minishell *minishell, t_lexer *lexer); -t_list *ft_parse_input(t_minishell *minishell); +char *lexer_readword(t_minishell *msh, t_lexer *lexer); +t_list *ft_parse_input(t_minishell *msh); /** * Token */ -t_token *ft_token_next(t_minishell *minishell, t_lexer *lexer); -t_token *token_new(t_minishell *minishell, t_token_type type, char *c, int pos); -void ft_token_free(t_minishell *minishell, t_token *token); -void ft_clear_tokenlist(t_minishell *minishell, void *content); -t_token *token_parse(t_minishell *minishell, t_lexer *lexer); +t_token *ft_token_next(t_minishell *msh, t_lexer *lexer); +t_token *token_new(t_minishell *msh, t_token_type type, char *c, int pos); +void ft_token_free(t_minishell *msh, t_token *token); +void ft_clear_tokenlist(t_minishell *msh, void *content); +t_token *token_parse(t_minishell *msh, t_lexer *lexer); #endif // TOKENIZER_H diff --git a/inc/utils.h b/inc/utils.h index 274ba80..a74ffdd 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -13,23 +13,23 @@ #ifndef UTILS_H # define UTILS_H -void free_minishell_line(t_minishell *minishell); -void free_minishell(t_minishell **minishell); -void free_command_list(t_minishell *minishell, void *content); +void free_minishell_line(t_minishell *msh); +void free_minishell(t_minishell **msh); +void free_command_list(t_minishell *msh, void *content); t_minishell *init_minishell(void); void print_banner(void); void print_list(void *content); -void simple_builtins(t_minishell *minishell); +void simple_builtins(t_minishell *msh); void error_msg(char *func, char *msg); -void check_malloc(t_minishell *minishell, void *ptr); -char *ft_strdup_safe(t_minishell *minishell, const char *str); -char *ft_strjoin_safe(t_minishell *minishell, +void check_malloc(t_minishell *msh, void *ptr); +char *ft_strdup_safe(t_minishell *msh, const char *str); +char *ft_strjoin_safe(t_minishell *msh, const char *s1, const char *s2); -void *malloc_safe(t_minishell *minishell, size_t size); -void free_safe(t_minishell *minishell, void **ptr); -void free_freelist(t_minishell *minishell); -void ft_lstclear_safe(t_minishell *minishell, t_list **lst, - void (*del)(t_minishell *minishell, void *)); -t_list *ft_lstnew_safe(t_minishell *minishell, void *content); +void *malloc_safe(t_minishell *msh, size_t size); +void free_safe(t_minishell *msh, void **ptr); +void free_freelist(t_minishell *msh); +void ft_lstclear_safe(t_minishell *msh, t_list **lst, + void (*del)(t_minishell *msh, void *)); +t_list *ft_lstnew_safe(t_minishell *msh, void *content); #endif // UTILS_H diff --git a/sources.mk b/sources.mk index 9930b49..5fc189d 100644 --- a/sources.mk +++ b/sources.mk @@ -1,22 +1,23 @@ VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/signal:src/debug:src/expander:src/builtin:src/redirect: -SOURCES = history_load.c history_write.c prompt.c ft_lstclear_safe.c \ -ft_lstnew_safe.c ft_strdup_safe.c ft_strjoin_safe.c init_minishell.c \ -malloc_safe.c free_minishell_line.c free_safe.c print_banner.c \ -error_msg.c check_malloc.c free_command_list.c free_freelist.c \ -free_lexer.c free_minishell.c free_token.c free_token_list.c \ -lexer_read_char.c lexer_new.c lexer_parse_input.c lexer_read_word.c \ -lexer_token_next.c token_new.c token_parse.c environment_add.c \ -environment_del.c environment_free.c environment_free_list.c \ -environment_get.c environment_get_arr.c environment_print.c \ -environment_parse.c executor_close_fds.c executor_absolute_path.c \ -executor_child.c executor_count_fds.c executor_create_pipes.c \ -executor_create_redirects.c executor_fork.c executor_open_fds.c \ -executor_execute_pipeline.c parser_get_commands.c \ -parser_new_command.c parser_get_arguments.c signal.c print_freelist.c \ -print_commands.c expander_expand_dollar.c expander_is_character.c \ -expander_get_variable.c expander_parse_string.c \ -expander_parse_variables.c expander_allocate_memory.c builtin_echo.c \ -builtin_router.c simple_builtins.c is_builtin.c builtin_cd.c \ -builtin_env.c builtin_export.c builtin_unset.c builtin_pwd.c \ -builtin_exit.c redirect_valid_type.c redirect_get_outputs.c \ -redirect_new.c redirect_get_inputs.c main.c \ +SOURCES = history_load.c history_write.c prompt.c init_minishell.c \ +print_banner.c check_malloc.c free_command_list.c free_freelist.c \ +free_lexer.c free_minishell_line.c free_safe.c free_token.c \ +free_token_list.c ft_lstclear_safe.c ft_lstnew_safe.c \ +ft_strdup_safe.c ft_strjoin_safe.c malloc_safe.c error_msg.c \ +free_minishell.c lexer_read_char.c lexer_new.c lexer_parse_input.c \ +lexer_read_word.c lexer_token_next.c token_new.c token_parse.c \ +environment_add.c environment_del.c environment_free.c \ +environment_free_list.c environment_get.c environment_get_arr.c \ +environment_parse.c environment_print.c executor_close_fds.c \ +executor_open_fds.c executor_absolute_path.c executor_child.c \ +executor_count_fds.c executor_create_pipes.c \ +executor_create_redirects.c executor_execute_pipeline.c \ +executor_fork.c parser_get_arguments.c parser_get_commands.c \ +parser_new_command.c signal.c signal_init.c.c print_commands.c \ +print_freelist.c expander_expand_dollar.c expander_is_character.c \ +expander_allocate_memory.c expander_parse_string.c \ +expander_parse_variables.c expander_get_variable.c is_builtin.c \ +builtin_cd.c builtin_echo.c builtin_env.c builtin_exit.c \ +builtin_export.c builtin_pwd.c builtin_router.c builtin_unset.c \ +simple_builtins.c redirect_valid_type.c redirect_new.c \ +redirect_get_inputs.c redirect_get_outputs.c main.c \ diff --git a/src/builtin/builtin_cd.c b/src/builtin/builtin_cd.c index 1075101..f2a5006 100644 --- a/src/builtin/builtin_cd.c +++ b/src/builtin/builtin_cd.c @@ -6,20 +6,20 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:33:07 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:57:57 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:45:55 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int builtin_cd(t_minishell *minishell, t_command *cmd) +int builtin_cd(t_minishell *msh, t_command *cmd) { t_environment *env; char *path; if (cmd->args[1] == NULL) { - env = environment_get(minishell, "HOME"); + env = environment_get(msh, "HOME"); if (env == NULL || env->value == NULL) { ft_putendl_fd("minishell: cd: HOME not set", STDERR_FILENO); diff --git a/src/builtin/builtin_echo.c b/src/builtin/builtin_echo.c index cd545b3..8a2da83 100644 --- a/src/builtin/builtin_echo.c +++ b/src/builtin/builtin_echo.c @@ -6,18 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:33:05 by whaffman #+# #+# */ -/* Updated: 2025/02/20 12:37:42 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:46:29 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int builtin_echo(t_minishell *minishell, t_command *cmd) +int builtin_echo(t_minishell *msh, t_command *cmd) { int i; int n_flag; - (void)minishell; + (void)msh; i = 1; n_flag = 0; if (cmd->args[i] != NULL && ft_strncmp(cmd->args[i], "-n", 3) == 0) diff --git a/src/builtin/builtin_env.c b/src/builtin/builtin_env.c index 0888c66..2b92fa8 100644 --- a/src/builtin/builtin_env.c +++ b/src/builtin/builtin_env.c @@ -6,15 +6,15 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:33:02 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:57:49 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:46:55 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int builtin_env(t_minishell *minishell, t_command *cmd) +int builtin_env(t_minishell *msh, t_command *cmd) { (void)cmd; - environment_print(minishell); + environment_print(msh); return (SUCCESS); } diff --git a/src/builtin/builtin_exit.c b/src/builtin/builtin_exit.c index 4dcb622..adf39cf 100644 --- a/src/builtin/builtin_exit.c +++ b/src/builtin/builtin_exit.c @@ -6,14 +6,14 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:59 by whaffman #+# #+# */ -/* Updated: 2025/02/26 15:19:51 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:47:14 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" //TODO EXIT last exit status r:20 -int builtin_exit(t_minishell *minishell, t_command *cmd) +int builtin_exit(t_minishell *msh, t_command *cmd) { int exit_status; @@ -36,7 +36,7 @@ int builtin_exit(t_minishell *minishell, t_command *cmd) } exit_status = ft_atoi(cmd->args[1]); } - free_minishell(&minishell); + free_minishell(&msh); rl_clear_history(); exit(exit_status); return (FAILURE); diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c index c803956..8b1120b 100644 --- a/src/builtin/builtin_export.c +++ b/src/builtin/builtin_export.c @@ -6,13 +6,13 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:39:13 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 15:49:16 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int builtin_export(t_minishell *minishell, t_command *cmd) +int builtin_export(t_minishell *msh, t_command *cmd) { t_environment *env; char **arr; @@ -28,14 +28,14 @@ int builtin_export(t_minishell *minishell, t_command *cmd) i++; continue ; } - env = environment_get(minishell, arr[0]); + env = environment_get(msh, arr[0]); if (env != NULL) { - free_safe(minishell, (void **)&(env->value)); - env->value = ft_strdup_safe(minishell, arr[1]); + free_safe(msh, (void **)&(env->value)); + env->value = ft_strdup_safe(msh, arr[1]); } else - environment_add(minishell, arr[0], arr[1]); + environment_add(msh, arr[0], arr[1]); ft_free_arr(arr); i++; } diff --git a/src/builtin/builtin_pwd.c b/src/builtin/builtin_pwd.c index bbf57d1..480086b 100644 --- a/src/builtin/builtin_pwd.c +++ b/src/builtin/builtin_pwd.c @@ -1,25 +1,25 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* builtin_pwd.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/20 11:32:28 by whaffman #+# #+# */ -/* Updated: 2025/02/25 20:07:22 by qmennen ### ########.fr */ +/* :::::::: */ +/* builtin_pwd.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/20 11:32:28 by whaffman #+# #+# */ +/* Updated: 2025/02/26 16:06:09 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int builtin_pwd(t_minishell *minishell, t_command *cmd) +int builtin_pwd(t_minishell *msh, t_command *cmd) { char *cwd; - (void)minishell; + (void)msh; (void)cmd; cwd = getcwd(NULL, 0); printf("%s\n", cwd); - free_safe(minishell, (void **)&(cwd)); + free_safe(msh, (void **)&(cwd)); return (SUCCESS); } diff --git a/src/builtin/builtin_router.c b/src/builtin/builtin_router.c index d28be54..5e5aa8c 100644 --- a/src/builtin/builtin_router.c +++ b/src/builtin/builtin_router.c @@ -6,13 +6,13 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:12:38 by whaffman #+# #+# */ -/* Updated: 2025/02/20 13:56:10 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:06:18 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int builtin_router(t_minishell *minishell, t_command *cmd) +int builtin_router(t_minishell *msh, t_command *cmd) { const t_builtin_fn builtin_fn[] = { builtin_echo, @@ -25,6 +25,6 @@ int builtin_router(t_minishell *minishell, t_command *cmd) if (!is_builtin(cmd->args[0])) return (FALSE); - builtin_fn[is_builtin(cmd->args[0])](minishell, cmd); + builtin_fn[is_builtin(cmd->args[0])](msh, cmd); return (TRUE); } diff --git a/src/builtin/builtin_unset.c b/src/builtin/builtin_unset.c index 474e2ea..8dae319 100644 --- a/src/builtin/builtin_unset.c +++ b/src/builtin/builtin_unset.c @@ -6,21 +6,21 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:25:43 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:57:29 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:07:21 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int builtin_unset(t_minishell *minishell, t_command *cmd) +int builtin_unset(t_minishell *msh, t_command *cmd) { int i; i = 1; while (cmd->args[i] != NULL) { - if (environment_get(minishell, cmd->args[i]) != NULL) - environment_del(minishell, cmd->args[i]); + if (environment_get(msh, cmd->args[i]) != NULL) + environment_del(msh, cmd->args[i]); i++; } return (SUCCESS); diff --git a/src/builtin/simple_builtins.c b/src/builtin/simple_builtins.c index b83fbbe..296ddf9 100644 --- a/src/builtin/simple_builtins.c +++ b/src/builtin/simple_builtins.c @@ -6,16 +6,16 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:21:39 by whaffman #+# #+# */ -/* Updated: 2025/02/26 14:42:54 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:08:49 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void simple_builtins(t_minishell *minishell) +void simple_builtins(t_minishell *msh) { - if (minishell->commands == NULL) + if (msh->commands == NULL) return ; - if (!builtin_router(minishell, minishell->commands->content)) - executor_execute_pipeline(minishell); + if (!builtin_router(msh, msh->commands->content)) + executor_execute_pipeline(msh); } diff --git a/src/debug/print_freelist.c b/src/debug/print_freelist.c index 7a74220..2cce7e9 100644 --- a/src/debug/print_freelist.c +++ b/src/debug/print_freelist.c @@ -6,13 +6,13 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 15:46:03 by whaffman #+# #+# */ -/* Updated: 2025/02/26 14:44:46 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:08:53 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void print_freelist(t_minishell *minishell) +void print_freelist(t_minishell *msh) { t_list *freelist; int i; @@ -20,7 +20,7 @@ void print_freelist(t_minishell *minishell) if (!DEBUG) return ; i = 0; - freelist = minishell->freelist; + freelist = msh->freelist; while (freelist) { printf("%d: %p\n", i, freelist->content); diff --git a/src/environment/environment_add.c b/src/environment/environment_add.c index feb6815..32049d0 100644 --- a/src/environment/environment_add.c +++ b/src/environment/environment_add.c @@ -6,32 +6,32 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:33 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:50:12 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:07 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_add(t_minishell *minishell, char *name, char *value) +void environment_add(t_minishell *msh, char *name, char *value) { t_environment *new_environment; t_list *new_node; t_list **environment; - environment = &minishell->environment; + environment = &msh->environment; if (name != NULL && value != NULL) { - new_environment = malloc_safe(minishell, sizeof(t_environment)); + new_environment = malloc_safe(msh, sizeof(t_environment)); if (new_environment == NULL) return (perror("malloc")); - new_environment->name = ft_strdup_safe(minishell, name); - new_environment->value = ft_strdup_safe(minishell, value); - new_node = ft_lstnew_safe(minishell, new_environment); + new_environment->name = ft_strdup_safe(msh, name); + new_environment->value = ft_strdup_safe(msh, value); + new_node = ft_lstnew_safe(msh, new_environment); if (new_node == NULL || new_environment->name == NULL || new_environment->value == NULL) { - environment_free(minishell, new_environment); + environment_free(msh, new_environment); return (perror("malloc")); } ft_lstadd_back(environment, new_node); diff --git a/src/environment/environment_del.c b/src/environment/environment_del.c index 87c56d8..3f5f85b 100644 --- a/src/environment/environment_del.c +++ b/src/environment/environment_del.c @@ -6,13 +6,13 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/11 14:17:53 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:19:14 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:12 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_del(t_minishell *minishell, char *name) +void environment_del(t_minishell *msh, char *name) { t_list *prev; t_list *current; @@ -21,17 +21,17 @@ void environment_del(t_minishell *minishell, char *name) prev = NULL; next = NULL; - current = minishell->environment; + current = msh->environment; while (current != NULL) { env = (t_environment *)current->content; if (ft_strncmp(env->name, name, ft_strlen(name) + 1) == 0) { next = current->next; - environment_free(minishell, current->content); - free_safe(minishell, (void **)&(current)); + environment_free(msh, current->content); + free_safe(msh, (void **)&(current)); if (prev == NULL) - minishell->environment = next; + msh->environment = next; else prev->next = next; return ; diff --git a/src/environment/environment_free.c b/src/environment/environment_free.c index 79a4c1f..d00187a 100644 --- a/src/environment/environment_free.c +++ b/src/environment/environment_free.c @@ -6,18 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/11 15:38:43 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:18:45 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:17 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_free(t_minishell *minishell, void *content) +void environment_free(t_minishell *msh, void *content) { t_environment *env; env = (t_environment *)content; - free_safe(minishell, (void **)&(env->name)); - free_safe(minishell, (void **)&(env->value)); - free_safe(minishell, (void **)&(env)); + free_safe(msh, (void **)&(env->name)); + free_safe(msh, (void **)&(env->value)); + free_safe(msh, (void **)&(env)); } diff --git a/src/environment/environment_free_list.c b/src/environment/environment_free_list.c index 741fd4b..bb35108 100644 --- a/src/environment/environment_free_list.c +++ b/src/environment/environment_free_list.c @@ -6,18 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:59 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:24:08 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:15 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_free_list(t_minishell *minishell) +void environment_free_list(t_minishell *msh) { t_list **lst; t_list *next; - lst = &minishell->environment; + lst = &msh->environment; if (!lst) return ; while (*lst) @@ -26,7 +26,7 @@ void environment_free_list(t_minishell *minishell) next = (*lst)->next; else next = NULL; - environment_free(minishell, (*lst)->content); + environment_free(msh, (*lst)->content); free(*lst); *lst = next; } diff --git a/src/environment/environment_get.c b/src/environment/environment_get.c index beb2315..882d082 100644 --- a/src/environment/environment_get.c +++ b/src/environment/environment_get.c @@ -6,18 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/04 16:15:05 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:35:13 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:22 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_environment *environment_get(t_minishell *minishell, char *name) +t_environment *environment_get(t_minishell *msh, char *name) { t_environment *env; t_list *environment; - environment = minishell->environment; + environment = msh->environment; while (environment != NULL) { env = (t_environment *)environment->content; diff --git a/src/environment/environment_get_arr.c b/src/environment/environment_get_arr.c index 9746792..d9d2034 100644 --- a/src/environment/environment_get_arr.c +++ b/src/environment/environment_get_arr.c @@ -6,27 +6,27 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 13:59:48 by willem #+# #+# */ -/* Updated: 2025/02/26 14:45:35 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:20 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -char **environment_get_arr(t_minishell *minishell) +char **environment_get_arr(t_minishell *msh) { char **arr; t_environment *env; int i; t_list *environment; - environment = minishell->environment; - arr = malloc_safe(minishell, + environment = msh->environment; + arr = malloc_safe(msh, sizeof(char *) * (ft_lstsize(environment) + 1)); i = 0; while (environment != NULL) { env = (t_environment *)environment->content; - arr[i] = malloc_safe(minishell, + arr[i] = malloc_safe(msh, ft_strlen(env->name) + ft_strlen(env->value) + 2); ft_strlcpy(arr[i], env->name, ft_strlen(env->name) + 1); ft_strlcat(arr[i], "=", ft_strlen(env->name) + 2); diff --git a/src/environment/environment_parse.c b/src/environment/environment_parse.c index e5a42a1..ba2e5e7 100644 --- a/src/environment/environment_parse.c +++ b/src/environment/environment_parse.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 15:52:33 by whaffman #+# #+# */ -/* Updated: 2025/02/26 15:20:09 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:26 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int environment_parse(t_minishell *minishell, char **envp) +int environment_parse(t_minishell *msh, char **envp) { char **env; @@ -23,7 +23,7 @@ int environment_parse(t_minishell *minishell, char **envp) env = ft_split(*envp, '='); if (!env) return (FAILURE); - environment_add(minishell, env[0], env[1]); + environment_add(msh, env[0], env[1]); ft_free_arr(env); envp++; } diff --git a/src/environment/environment_print.c b/src/environment/environment_print.c index 7720ec4..d76c7d5 100644 --- a/src/environment/environment_print.c +++ b/src/environment/environment_print.c @@ -6,18 +6,18 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 13:52:08 by willem #+# #+# */ -/* Updated: 2025/02/25 13:39:45 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:35 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void environment_print(t_minishell *minishell) +void environment_print(t_minishell *msh) { char **arr; int i; - arr = environment_get_arr(minishell); + arr = environment_get_arr(msh); i = 0; while (arr[i] != NULL) { diff --git a/src/executor/executor_absolute_path.c b/src/executor/executor_absolute_path.c index b868227..a193c46 100644 --- a/src/executor/executor_absolute_path.c +++ b/src/executor/executor_absolute_path.c @@ -6,13 +6,13 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/08 17:00:24 by willem #+# #+# */ -/* Updated: 2025/02/25 16:39:59 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -char *executor_absolute_path(t_minishell *minishell, char *cmd) +char *executor_absolute_path(t_minishell *msh, char *cmd) { char **path; t_environment *path_env; @@ -23,21 +23,21 @@ char *executor_absolute_path(t_minishell *minishell, char *cmd) { if (access(cmd, F_OK) == 0) { - executable = ft_strdup_safe(minishell, cmd); + executable = ft_strdup_safe(msh, cmd); if (!executable) return (NULL); return (executable); } return (NULL); } - path_env = environment_get(minishell, "PATH"); + path_env = environment_get(msh, "PATH"); if (!path_env) return (NULL); path = ft_split(path_env->value, ':'); i = 0; while (path[i] != NULL) { - executable = malloc_safe(minishell, ft_strlen(path[i]) + ft_strlen(cmd) + 2); + executable = malloc_safe(msh, ft_strlen(path[i]) + ft_strlen(cmd) + 2); ft_strlcpy(executable, path[i], ft_strlen(path[i]) + 1); ft_strlcat(executable, "/", ft_strlen(path[i]) + 2); ft_strlcat(executable, cmd, ft_strlen(path[i]) + ft_strlen(cmd) + 2); @@ -46,7 +46,7 @@ char *executor_absolute_path(t_minishell *minishell, char *cmd) ft_free_arr(path); return (executable); } - free_safe(minishell, (void **)&executable); + free_safe(msh, (void **)&executable); i++; } return (ft_free_arr(path), NULL); diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 549cdcb..27f1d7c 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,13 +6,13 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/26 15:20:25 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:44 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void executor_child(t_minishell *minishell, t_command *command) +void executor_child(t_minishell *msh, t_command *command) { char *path; @@ -21,7 +21,7 @@ void executor_child(t_minishell *minishell, t_command *command) if (command->fd_out != 1) dup2(command->fd_out, 1); executor_close_fds(command->n_fds); - path = executor_absolute_path(minishell, command->command); + path = executor_absolute_path(msh, command->command); if (path == NULL) { ft_putstr_fd(RED BOLD, 2); @@ -29,5 +29,5 @@ void executor_child(t_minishell *minishell, t_command *command) ft_putstr_fd(": " RESET "command not found\n", 2); return ; } - execve(path, command->args, environment_get_arr(minishell)); + execve(path, command->args, environment_get_arr(msh)); } diff --git a/src/executor/executor_count_fds.c b/src/executor/executor_count_fds.c index 0fcf5f9..a2d72be 100644 --- a/src/executor/executor_count_fds.c +++ b/src/executor/executor_count_fds.c @@ -6,19 +6,19 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/21 12:42:26 by whaffman #+# #+# */ -/* Updated: 2025/02/26 15:20:33 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:09:45 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int executor_count_fds(t_minishell *minishell) +int executor_count_fds(t_minishell *msh) { int count; t_list *current; t_command *command; - current = minishell->commands; + current = msh->commands; count = (ft_lstsize(current) - 1) * 2; while (current) { diff --git a/src/executor/executor_create_pipes.c b/src/executor/executor_create_pipes.c index 4a17eec..4a9eb45 100644 --- a/src/executor/executor_create_pipes.c +++ b/src/executor/executor_create_pipes.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:22 by willem #+# #+# */ -/* Updated: 2025/02/25 14:19:57 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:10:19 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ diff --git a/src/executor/executor_create_redirects.c b/src/executor/executor_create_redirects.c index 86388e1..eb8087b 100644 --- a/src/executor/executor_create_redirects.c +++ b/src/executor/executor_create_redirects.c @@ -6,18 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/21 13:00:00 by whaffman #+# #+# */ -/* Updated: 2025/02/21 13:16:03 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:10:35 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void executor_create_redirects(t_minishell *minishell) +void executor_create_redirects(t_minishell *msh) { t_list *current; t_command *cmd; - current = minishell->commands; + current = msh->commands; while (current) { cmd = (t_command *)current->content; diff --git a/src/executor/executor_execute_pipeline.c b/src/executor/executor_execute_pipeline.c index 7e3335b..623a29a 100644 --- a/src/executor/executor_execute_pipeline.c +++ b/src/executor/executor_execute_pipeline.c @@ -6,28 +6,28 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:02 by willem #+# #+# */ -/* Updated: 2025/02/25 13:52:35 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:10:39 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -int executor_execute_pipeline(t_minishell *minishell) +int executor_execute_pipeline(t_minishell *msh) { t_list *current; t_command *command; pid_t last_pid; int exit_status; - executor_create_pipes(minishell); - executor_create_redirects(minishell); - current = minishell->commands; + executor_create_pipes(msh); + executor_create_redirects(msh); + current = msh->commands; last_pid = 0; while (current) { command = (t_command *)current->content; - command->environment = minishell->environment; - last_pid = executor_fork(minishell, command); + command->environment = msh->environment; + last_pid = executor_fork(msh, command); current = current->next; } waitpid(last_pid, &exit_status, 0); diff --git a/src/executor/executor_fork.c b/src/executor/executor_fork.c index 2c025a3..2af4345 100644 --- a/src/executor/executor_fork.c +++ b/src/executor/executor_fork.c @@ -6,14 +6,14 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:24:52 by willem #+# #+# */ -/* Updated: 2025/02/26 15:21:42 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:10:40 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" //TODO should parent close the fds? -pid_t executor_fork(t_minishell *minishell, t_command *command) +pid_t executor_fork(t_minishell *msh, t_command *command) { pid_t pid; @@ -29,7 +29,7 @@ pid_t executor_fork(t_minishell *minishell, t_command *command) else if (pid == 0) { signal_init_child(); - executor_child(minishell, command); + executor_child(msh, command); exit(127); } else diff --git a/src/expander/expander_allocate_memory.c b/src/expander/expander_allocate_memory.c index a323e4c..317466c 100644 --- a/src/expander/expander_allocate_memory.c +++ b/src/expander/expander_allocate_memory.c @@ -6,14 +6,14 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/19 13:57:19 by qmennen #+# #+# */ -/* Updated: 2025/02/26 15:22:11 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:10:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" char *expander_allocate_memory( - t_minishell *minishell, + t_minishell *msh, const char *s, t_list *variables) { @@ -36,6 +36,6 @@ char *expander_allocate_memory( current = current->next; } size += ft_strlen(s); - string = malloc_safe(minishell, size); + string = malloc_safe(msh, size); return (string); } diff --git a/src/expander/expander_get_variable.c b/src/expander/expander_get_variable.c index a899083..00012a3 100644 --- a/src/expander/expander_get_variable.c +++ b/src/expander/expander_get_variable.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/19 13:59:03 by qmennen #+# #+# */ -/* Updated: 2025/02/25 15:26:36 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:12:29 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_environment *expander_get_var(const char *s, int idx, t_minishell *minishell) +t_environment *expander_get_var(const char *s, int idx, t_minishell *msh) { int i; t_environment *env; @@ -24,7 +24,7 @@ t_environment *expander_get_var(const char *s, int idx, t_minishell *minishell) name = ft_substr(s, idx, i); if (!name || !*name) return (NULL); - env = environment_get(minishell, name); - free_safe(minishell, (void **)&name); + env = environment_get(msh, name); + free_safe(msh, (void **)&name); return (env); } diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c index 6546950..42a1bbd 100644 --- a/src/expander/expander_parse_string.c +++ b/src/expander/expander_parse_string.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/26 15:22:54 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:13:40 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -static void free_variables(t_minishell *minishell, t_list *variables) +static void free_variables(t_minishell *msh, t_list *variables) { t_list *current; t_list *last; @@ -22,12 +22,12 @@ static void free_variables(t_minishell *minishell, t_list *variables) { last = current; current = current->next; - free_safe(minishell, (void **)&last); + free_safe(msh, (void **)&last); } } //TODO: Figure out why echo "> echo "\as"" breaks -char *expander_parse_string(char *s, t_minishell *minishell) +char *expander_parse_string(char *s, t_minishell *msh) { t_list *variables; t_list *current; @@ -35,8 +35,8 @@ char *expander_parse_string(char *s, t_minishell *minishell) int i; int j; - variables = expander_parse_variables(s, minishell); - string = expander_allocate_memory(minishell, s, variables); + variables = expander_parse_variables(s, msh); + string = expander_allocate_memory(msh, s, variables); i = 0; j = 0; current = variables; @@ -53,6 +53,6 @@ char *expander_parse_string(char *s, t_minishell *minishell) string[j++] = s[i++]; } string[j] = 0; - free_variables(minishell, variables); + free_variables(msh, variables); return (string); } diff --git a/src/expander/expander_parse_variables.c b/src/expander/expander_parse_variables.c index 69c6c5c..302966a 100644 --- a/src/expander/expander_parse_variables.c +++ b/src/expander/expander_parse_variables.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/19 13:58:13 by qmennen #+# #+# */ -/* Updated: 2025/02/26 15:23:17 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:13:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_list *expander_parse_variables(const char *s, t_minishell *minishell) +t_list *expander_parse_variables(const char *s, t_minishell *msh) { int i; t_list *var_list; @@ -24,11 +24,11 @@ t_list *expander_parse_variables(const char *s, t_minishell *minishell) { if (s[i] == '$') { - env = expander_get_var(s, i + 1, minishell); + env = expander_get_var(s, i + 1, msh); if (env) - ft_lstadd_back(&var_list, ft_lstnew_safe(minishell, env)); + ft_lstadd_back(&var_list, ft_lstnew_safe(msh, env)); else - ft_lstadd_back(&var_list, ft_lstnew_safe(minishell, NULL)); + ft_lstadd_back(&var_list, ft_lstnew_safe(msh, NULL)); } i++; } diff --git a/src/lexer/lexer_new.c b/src/lexer/lexer_new.c index 8bb3a0d..062d8c9 100644 --- a/src/lexer/lexer_new.c +++ b/src/lexer/lexer_new.c @@ -6,20 +6,20 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:03:01 by qmennen #+# #+# */ -/* Updated: 2025/02/26 15:23:52 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:13:50 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_lexer *ft_lexer_new(t_minishell *minishell) +t_lexer *ft_lexer_new(t_minishell *msh) { char *input; t_lexer *lexer; - input = minishell->line; - lexer = malloc_safe(minishell, sizeof(t_lexer)); - lexer->input = ft_strdup_safe(minishell, input); + input = msh->line; + lexer = malloc_safe(msh, sizeof(t_lexer)); + lexer->input = ft_strdup_safe(msh, input); lexer->pos = 0; lexer->n_pos = 1; lexer->current_char = '\0'; diff --git a/src/lexer/lexer_parse_input.c b/src/lexer/lexer_parse_input.c index fb4dc94..1fd02a1 100644 --- a/src/lexer/lexer_parse_input.c +++ b/src/lexer/lexer_parse_input.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:09:20 by qmennen #+# #+# */ -/* Updated: 2025/02/26 15:24:39 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:13:54 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -24,21 +24,21 @@ * the input to be parsed. * @return A linked list of tokens parsed from the input. */ -t_list *ft_parse_input(t_minishell *minishell) +t_list *ft_parse_input(t_minishell *msh) { t_list *list; t_token *token; t_lexer *lexer; - lexer = minishell->lexer; + lexer = msh->lexer; list = NULL; while (TRUE) { - token = ft_token_next(minishell, lexer); + token = ft_token_next(msh, lexer); if (token->type == T_EOF || token->type == T_ERROR) break ; - ft_lstadd_back(&list, ft_lstnew_safe(minishell, token)); + ft_lstadd_back(&list, ft_lstnew_safe(msh, token)); } - ft_token_free(minishell, token); + ft_token_free(msh, token); return (list); } diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 4befd32..78c50f4 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/25 15:27:01 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:13:59 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -static char *parse_quotes(t_minishell *minishell, t_lexer *lexer) +static char *parse_quotes(t_minishell *msh, t_lexer *lexer) { int start; int len; @@ -26,19 +26,19 @@ static char *parse_quotes(t_minishell *minishell, t_lexer *lexer) while (lexer->current_char != '\0' && lexer->current_char != qc) lexer_readchar(lexer); len = lexer->pos - start; - word = malloc_safe(minishell, sizeof(char) * len + 1); + word = malloc_safe(msh, sizeof(char) * len + 1); ft_strlcpy(word, lexer->input + start, len + 1); if (lexer->current_char == qc) lexer_readchar(lexer); else { - free_safe(minishell, (void **)&word); + free_safe(msh, (void **)&word); return (NULL); } return (word); } -char *lexer_readword(t_minishell *minishell, t_lexer *lexer) +char *lexer_readword(t_minishell *msh, t_lexer *lexer) { int start; int len; @@ -47,7 +47,7 @@ char *lexer_readword(t_minishell *minishell, t_lexer *lexer) start = lexer->pos; if (lexer->current_char == '"' || lexer->current_char == '\'') { - return (parse_quotes(minishell, lexer)); + return (parse_quotes(msh, lexer)); } while (ft_isprint(lexer->current_char) && lexer->current_char != '<' && lexer->current_char != '>' && lexer->current_char != '|' @@ -57,7 +57,7 @@ char *lexer_readword(t_minishell *minishell, t_lexer *lexer) lexer_readchar(lexer); } len = lexer->pos - start; - word = malloc_safe(minishell, sizeof(char) * len + 1); + word = malloc_safe(msh, sizeof(char) * len + 1); ft_strlcpy(word, lexer->input + start, len + 1); return (word); } diff --git a/src/lexer/lexer_token_next.c b/src/lexer/lexer_token_next.c index 04b728a..d3c1181 100644 --- a/src/lexer/lexer_token_next.c +++ b/src/lexer/lexer_token_next.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/25 15:27:11 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:14:10 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -42,7 +42,7 @@ static t_token_type get_word_type(char c) * - If it is a printable character, reads the word and creates a word token. * - Otherwise, creates an error token. */ -t_token *ft_token_next(t_minishell *minishell, t_lexer *lexer) +t_token *ft_token_next(t_minishell *msh, t_lexer *lexer) { t_token *token; t_token_type word_type; @@ -54,22 +54,22 @@ t_token *ft_token_next(t_minishell *minishell, t_lexer *lexer) lexer_readchar(lexer); current_pos = lexer->pos; if (lexer->current_char == '\0') - token = token_new(minishell, T_EOF, NULL, current_pos); + token = token_new(msh, T_EOF, NULL, current_pos); else if (lexer->current_char == '<' || lexer->current_char == '>' || lexer->current_char == '|') - token = token_parse(minishell, lexer); + token = token_parse(msh, lexer); else if (ft_isprint(lexer->current_char)) { word_type = get_word_type(lexer->current_char); - word = lexer_readword(minishell, lexer); + word = lexer_readword(msh, lexer); if (!word) - return (token_new(minishell, T_ERROR, &lexer->current_char, current_pos)); - token = token_new(minishell, word_type, word, current_pos); - free_safe(minishell, (void **)&word); + return (token_new(msh, T_ERROR, &lexer->current_char, current_pos)); + token = token_new(msh, word_type, word, current_pos); + free_safe(msh, (void **)&word); } else { - token = token_new(minishell, T_ERROR, NULL, current_pos); + token = token_new(msh, T_ERROR, NULL, current_pos); printf("token->type: %d\n", token->type); } return (token); diff --git a/src/main.c b/src/main.c index 238519d..515c243 100644 --- a/src/main.c +++ b/src/main.c @@ -16,29 +16,29 @@ int main(int argc, char **argv, char **envp) { - t_minishell *minishell; + t_minishell *msh; (void)argc; (void)argv; print_banner(); history_load(); - minishell = init_minishell(); + msh = init_minishell(); signal_init_minishell(); - environment_parse(minishell, envp); + environment_parse(msh, envp); while (TRUE) { - minishell->line = ft_prompt(minishell); - if (minishell->line == NULL) + msh->line = ft_prompt(msh); + if (msh->line == NULL) break ; - minishell->lexer = ft_lexer_new(minishell); - minishell->tokens = ft_parse_input(minishell); - ft_lstiter(minishell->tokens, token_print); - minishell->commands = parser_get_commands(minishell); - simple_builtins(minishell); - free_minishell_line(minishell); + msh->lexer = ft_lexer_new(msh); + msh->tokens = ft_parse_input(msh); + ft_lstiter(msh->tokens, token_print); + msh->commands = parser_get_commands(msh); + simple_builtins(msh); + free_minishell_line(msh); } - ft_lstclear_safe(minishell, &minishell->commands, free_command_list); - free_minishell(&minishell); + ft_lstclear_safe(msh, &msh->commands, free_command_list); + free_minishell(&msh); rl_clear_history(); return (EXIT_SUCCESS); } diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index 1881561..25b298f 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ -/* Updated: 2025/02/26 15:26:32 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:14:14 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -44,7 +44,7 @@ static int parser_should_expand(t_list *value) && token->value[1])); } -char **parser_get_arguments(t_list *list, t_minishell *minishell) +char **parser_get_arguments(t_list *list, t_minishell *msh) { t_list *current; char **args; @@ -52,17 +52,17 @@ char **parser_get_arguments(t_list *list, t_minishell *minishell) int i; cmds = count_cmds(list); - args = malloc_safe(minishell, (cmds + 1) * sizeof(char *)); + args = malloc_safe(msh, (cmds + 1) * sizeof(char *)); current = list; i = -1; while ((++i) < cmds && current) { if (parser_should_expand(current)) args[i] = expander_parse_string( - ((t_token *)current->content)->value, minishell); + ((t_token *)current->content)->value, msh); else if (((t_token *)current->content)->type == T_WORD || ((t_token *)current->content)->type == T_SQWORD) - args[i] = ft_strdup_safe(minishell, + args[i] = ft_strdup_safe(msh, ((t_token *)current->content)->value); current = current->next; } diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 7d67d06..c8bb8d9 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -17,7 +17,7 @@ static int is_command_token(t_token *token) return (token->type < 3 || redirect_token_type(token)); } -t_list *parser_get_commands(t_minishell *minishell) +t_list *parser_get_commands(t_minishell *msh) { t_list *command_list; t_list *current; @@ -25,18 +25,18 @@ t_list *parser_get_commands(t_minishell *minishell) t_token *token; command_list = NULL; - if (!minishell->tokens) + if (!msh->tokens) return (NULL); - current = minishell->tokens; + current = msh->tokens; while (current) { token = (t_token *) current->content; - command = parser_command_new(minishell, - ft_strdup_safe(minishell, token->value)); - command->args = parser_get_arguments(current, minishell); - command->redirect_in = redirect_get_inputs(minishell, current); - command->redirect_out = redirect_get_outputs(minishell, current); - ft_lstadd_back(&command_list, ft_lstnew_safe(minishell, command)); + command = parser_command_new(msh, + ft_strdup_safe(msh, token->value)); + command->args = parser_get_arguments(current, msh); + command->redirect_in = redirect_get_inputs(msh, current); + command->redirect_out = redirect_get_outputs(msh, current); + ft_lstadd_back(&command_list, ft_lstnew_safe(msh, command)); while (current && is_command_token((t_token *)current->content)) current = current->next; if (current && ((t_token *)current->content)->type >= 3) diff --git a/src/parser/parser_new_command.c b/src/parser/parser_new_command.c index f162d67..3599cba 100644 --- a/src/parser/parser_new_command.c +++ b/src/parser/parser_new_command.c @@ -6,17 +6,17 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/11 16:18:21 by qmennen #+# #+# */ -/* Updated: 2025/02/26 15:32:45 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:14:31 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_command *parser_command_new(t_minishell *minishell, char *cmd) +t_command *parser_command_new(t_minishell *msh, char *cmd) { t_command *command; - command = malloc_safe(minishell, sizeof(t_command)); + command = malloc_safe(msh, sizeof(t_command)); command->args = NULL; command->fd_in = 0; command->fd_out = 1; diff --git a/src/prompt/prompt.c b/src/prompt/prompt.c index e0f9195..45a5e2e 100644 --- a/src/prompt/prompt.c +++ b/src/prompt/prompt.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ -/* Updated: 2025/02/26 15:33:15 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:15:04 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -char *get_user(t_minishell *minishell) +char *get_user(t_minishell *msh) { const char guest[] = "guest"; int len; @@ -20,32 +20,32 @@ char *get_user(t_minishell *minishell) char *username; char *result; - user = environment_get(minishell, "USER"); + user = environment_get(msh, "USER"); if (user == NULL) username = (char *)guest; else username = user->value; len = ft_strlen(username) + ft_strlen(PROMPT GREEN) + 1; - result = (char *)malloc_safe(minishell, len); + result = (char *)malloc_safe(msh, len); ft_strlcpy(result, GREEN, ft_strlen(GREEN) + 1); ft_strlcat(result, username, ft_strlen(GREEN) + ft_strlen(username) + 1); ft_strlcat(result, PROMPT, len); return (result); } -int get_home_len(t_minishell *minishell, char *cwd) +int get_home_len(t_minishell *msh, char *cwd) { t_environment *home; int home_len; - home = environment_get(minishell, "HOME"); + home = environment_get(msh, "HOME"); home_len = 0; if (home && !ft_strncmp(cwd, home->value, ft_strlen(home->value))) home_len = ft_strlen(home->value) - 1; return (home_len); } -char *get_path_with_home(t_minishell *minishell) +char *get_path_with_home(t_minishell *msh) { char *result; char *cwd; @@ -55,9 +55,9 @@ char *get_path_with_home(t_minishell *minishell) cwd = getcwd(NULL, 0); if (cwd == NULL) return (perror("getcwd"), NULL); - home_len = get_home_len(minishell, cwd); + home_len = get_home_len(msh, cwd); len = ft_strlen(cwd) - home_len + 1; - result = malloc_safe(minishell, len); + result = malloc_safe(msh, len); if (home_len) { ft_strlcpy(result, "~", 2); @@ -69,43 +69,43 @@ char *get_path_with_home(t_minishell *minishell) return (result); } -char *get_path(t_minishell *minishell) +char *get_path(t_minishell *msh) { char *result; char *cwd; int len; - cwd = get_path_with_home(minishell); + cwd = get_path_with_home(msh); if (cwd == NULL) return (NULL); len = ft_strlen(cwd) + ft_strlen(BLUE RESET "> ") + 1; - result = malloc_safe(minishell, len); + result = malloc_safe(msh, len); ft_strlcpy(result, BLUE, len); ft_strlcat(result, cwd, len); ft_strlcat(result, RESET "> ", len); - free_safe(minishell, (void **) &cwd); + free_safe(msh, (void **) &cwd); return (result); } -char *ft_prompt(t_minishell *minishell) +char *ft_prompt(t_minishell *msh) { char *line; char *cwd; char *prompt; char *user; - cwd = get_path(minishell); + cwd = get_path(msh); if (cwd == NULL) return (NULL); - user = get_user(minishell); + user = get_user(msh); if (user == NULL) return (free(cwd), NULL); - prompt = ft_strjoin_safe(minishell, user, cwd); - free_safe(minishell, (void **)&user); - free_safe(minishell, (void **)&cwd); + prompt = ft_strjoin_safe(msh, user, cwd); + free_safe(msh, (void **)&user); + free_safe(msh, (void **)&cwd); rl_on_new_line(); line = readline(prompt); - free_safe(minishell, (void **)&prompt); + free_safe(msh, (void **)&prompt); if (line == NULL) return (NULL); history_write(line); diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index 6e298fb..8ea31b3 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -35,7 +35,7 @@ static void process_heredoc(t_minishell *msh, t_token *heredoc, t_token *delim) delim->value = ft_strdup_safe(msh, ".ms_heredoc"); } -t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) +t_list *redirect_get_inputs(t_minishell *msh, t_list *list) { t_list *current; t_list *redirects; @@ -54,19 +54,19 @@ t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) continue ; } if (token->type == T_HEREDOC && redirect_is_valid(current, token)) - process_heredoc(minishell, token, current->next->content); + process_heredoc(msh, token, current->next->content); if (redirect_is_valid(current, token)) { - ft_lstadd_back(&redirects, ft_lstnew_safe(minishell, - redirect_new(minishell, token->type, - ft_strdup_safe(minishell, + ft_lstadd_back(&redirects, ft_lstnew_safe(msh, + redirect_new(msh, token->type, + ft_strdup_safe(msh, ((t_token *)current->next->content)->value)))); current = current->next; continue ; } else { - ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, T_ERROR, NULL))); + ft_lstadd_front(&redirects, ft_lstnew_safe(msh, redirect_new(msh, T_ERROR, NULL))); break ; } current = current->next; diff --git a/src/token/token_new.c b/src/token/token_new.c index 778191f..24a7a4c 100644 --- a/src/token/token_new.c +++ b/src/token/token_new.c @@ -6,21 +6,21 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:10:49 by qmennen #+# #+# */ -/* Updated: 2025/02/25 16:42:52 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:15:17 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_token *token_new(t_minishell *minishell, t_token_type type, char *c, int pos) +t_token *token_new(t_minishell *msh, t_token_type type, char *c, int pos) { t_token *token; - token = malloc_safe(minishell, sizeof(t_token)); + token = malloc_safe(msh, sizeof(t_token)); token->type = type; token->position = pos; if (c) - token->value = ft_strdup_safe(minishell, c); + token->value = ft_strdup_safe(msh, c); else token->value = NULL; return (token); diff --git a/src/token/token_parse.c b/src/token/token_parse.c index 2031eda..f18eb52 100644 --- a/src/token/token_parse.c +++ b/src/token/token_parse.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:10:17 by qmennen #+# #+# */ -/* Updated: 2025/02/25 14:45:08 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:15:19 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -56,7 +56,7 @@ static char *char_from_type(t_token_type type) return (NULL); } -t_token *token_parse(t_minishell *minishell, t_lexer *lexer) +t_token *token_parse(t_minishell *msh, t_lexer *lexer) { int is_double; char c; @@ -66,7 +66,7 @@ t_token *token_parse(t_minishell *minishell, t_lexer *lexer) c = lexer->current_char; is_double = lexer->input[lexer->pos + 1] == c; type = token_from_char(c, is_double); - token = token_new(minishell, type, char_from_type(type), lexer->pos); + token = token_new(msh, type, char_from_type(type), lexer->pos); if (is_double) lexer_readchar(lexer); lexer_readchar(lexer); diff --git a/src/utils/check_malloc.c b/src/utils/check_malloc.c index 72cff69..eaa1504 100644 --- a/src/utils/check_malloc.c +++ b/src/utils/check_malloc.c @@ -12,14 +12,14 @@ #include "minishell.h" -void check_malloc(t_minishell *minishell, void *ptr) +void check_malloc(t_minishell *msh, void *ptr) { t_list *new; if (ptr == NULL) { error_msg("malloc", "can't allocate memory"); - ft_lstclear(&(minishell->freelist), free); + ft_lstclear(&(msh->freelist), free); exit(1); } else @@ -28,10 +28,10 @@ void check_malloc(t_minishell *minishell, void *ptr) if (new == NULL) { error_msg("malloc", "can't allocate memory"); - ft_lstclear(&(minishell->freelist), free); + ft_lstclear(&(msh->freelist), free); exit(1); } else - ft_lstadd_front(&(minishell->freelist), new); + ft_lstadd_front(&(msh->freelist), new); } } diff --git a/src/utils/error_msg.c b/src/utils/error_msg.c index 2ce1ed1..e781c10 100644 --- a/src/utils/error_msg.c +++ b/src/utils/error_msg.c @@ -15,10 +15,10 @@ void error_msg(char *func, char *msg) { if (errno) - perror(RED BOLD "minishell" RESET); + perror(RED BOLD "msh" RESET); else { - ft_putstr_fd(RED BOLD "minishell" RESET ": ", 2); + ft_putstr_fd(RED BOLD "msh" RESET ": ", 2); if (func != NULL) { ft_putstr_fd(func, 2); diff --git a/src/utils/free_command_list.c b/src/utils/free_command_list.c index 6d2b06c..2ca7ce8 100644 --- a/src/utils/free_command_list.c +++ b/src/utils/free_command_list.c @@ -12,20 +12,20 @@ #include "minishell.h" -static void free_args(t_minishell *minishell, char **args) +static void free_args(t_minishell *msh, char **args) { int i; i = 0; while (args[i]) { - free_safe(minishell, (void **)&args[i]); + free_safe(msh, (void **)&args[i]); i++; } - free_safe(minishell, (void **)&args); + free_safe(msh, (void **)&args); } -static void free_redirects(t_minishell *minishell, t_list *lst) +static void free_redirects(t_minishell *msh, t_list *lst) { t_redirect *redir; t_list *current; @@ -37,26 +37,26 @@ static void free_redirects(t_minishell *minishell, t_list *lst) last = current; redir = (t_redirect *)current->content; if (redir && redir->value) - free_safe(minishell, (void **)&redir->value); + free_safe(msh, (void **)&redir->value); if (redir) - free_safe(minishell, (void **)&redir); + free_safe(msh, (void **)&redir); current = current->next; - free_safe(minishell, (void **)&last); + free_safe(msh, (void **)&last); } } -void free_command_list(t_minishell *minishell, void *content) +void free_command_list(t_minishell *msh, void *content) { t_command *command; command = (t_command *)content; if (command->command) - free_safe(minishell, (void **)&(command->command)); + free_safe(msh, (void **)&(command->command)); if (command->args) - free_args(minishell, command->args); + free_args(msh, command->args); if (command->redirect_in) - free_redirects(minishell, command->redirect_in); + free_redirects(msh, command->redirect_in); if (command->redirect_out) - free_redirects(minishell, command->redirect_out); - free_safe(minishell, (void **)&command); + free_redirects(msh, command->redirect_out); + free_safe(msh, (void **)&command); } diff --git a/src/utils/free_freelist.c b/src/utils/free_freelist.c index b974dd7..34f5048 100644 --- a/src/utils/free_freelist.c +++ b/src/utils/free_freelist.c @@ -6,18 +6,18 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 13:23:30 by whaffman #+# #+# */ -/* Updated: 2025/02/25 15:56:40 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:15:29 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void free_freelist(t_minishell *minishell) +void free_freelist(t_minishell *msh) { t_list *freelist; t_list *next; - freelist = minishell->freelist; + freelist = msh->freelist; while (freelist) { next = freelist->next; @@ -25,5 +25,5 @@ void free_freelist(t_minishell *minishell) free(freelist); freelist = next; } - minishell->freelist = NULL; + msh->freelist = NULL; } diff --git a/src/utils/free_lexer.c b/src/utils/free_lexer.c index d42e3b4..5c88980 100644 --- a/src/utils/free_lexer.c +++ b/src/utils/free_lexer.c @@ -6,15 +6,15 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:07:01 by qmennen #+# #+# */ -/* Updated: 2025/02/25 16:16:01 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:15:31 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_lexer_free(t_minishell *minishell, t_lexer *lexer) +void ft_lexer_free(t_minishell *msh, t_lexer *lexer) { if (lexer->input) - free_safe(minishell, (void **)&(lexer->input)); - free_safe(minishell, (void **)&lexer); + free_safe(msh, (void **)&(lexer->input)); + free_safe(msh, (void **)&lexer); } diff --git a/src/utils/free_minishell.c b/src/utils/free_minishell.c index fc4db5a..3044ee9 100644 --- a/src/utils/free_minishell.c +++ b/src/utils/free_minishell.c @@ -6,15 +6,15 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:03:57 by whaffman #+# #+# */ -/* Updated: 2025/02/26 15:43:00 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:15:42 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void free_minishell(t_minishell **minishell) +void free_minishell(t_minishell **msh) { - free_freelist(*minishell); - free(*minishell); - *minishell = NULL; + free_freelist(*msh); + free(*msh); + *msh = NULL; } diff --git a/src/utils/free_minishell_line.c b/src/utils/free_minishell_line.c index 693b953..88e80eb 100644 --- a/src/utils/free_minishell_line.c +++ b/src/utils/free_minishell_line.c @@ -6,20 +6,20 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:01:44 by whaffman #+# #+# */ -/* Updated: 2025/02/25 17:40:32 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:15:38 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void free_minishell_line(t_minishell *minishell) +void free_minishell_line(t_minishell *msh) { - if (minishell->line) - free(minishell->line); - if (minishell->lexer) - ft_lexer_free(minishell, minishell->lexer); - if (minishell->tokens) - ft_lstclear_safe(minishell, &minishell->tokens, ft_clear_tokenlist); - if (minishell->commands) - ft_lstclear_safe(minishell, &minishell->commands, free_command_list); + if (msh->line) + free(msh->line); + if (msh->lexer) + ft_lexer_free(msh, msh->lexer); + if (msh->tokens) + ft_lstclear_safe(msh, &msh->tokens, ft_clear_tokenlist); + if (msh->commands) + ft_lstclear_safe(msh, &msh->commands, free_command_list); } diff --git a/src/utils/free_safe.c b/src/utils/free_safe.c index 53faa28..7cbe602 100644 --- a/src/utils/free_safe.c +++ b/src/utils/free_safe.c @@ -6,20 +6,20 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 15:09:34 by whaffman #+# #+# */ -/* Updated: 2025/02/26 15:43:08 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:15:46 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void free_safe(t_minishell *minishell, void **ptr) +void free_safe(t_minishell *msh, void **ptr) { t_list *prev; t_list *current; prev = NULL; - current = minishell->freelist; + current = msh->freelist; if (*ptr) { while (current) @@ -29,7 +29,7 @@ void free_safe(t_minishell *minishell, void **ptr) if (prev) prev->next = current->next; else - minishell->freelist = current->next; + msh->freelist = current->next; free(*ptr); free(current); return ; diff --git a/src/utils/free_token.c b/src/utils/free_token.c index 46b8e72..7c295f6 100644 --- a/src/utils/free_token.c +++ b/src/utils/free_token.c @@ -6,15 +6,15 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:07:45 by qmennen #+# #+# */ -/* Updated: 2025/02/25 16:17:52 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:16:01 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_token_free(t_minishell *minishell, t_token *token) +void ft_token_free(t_minishell *msh, t_token *token) { if (token->value) - free_safe(minishell, (void **)&token->value); - free_safe(minishell, (void **)&token); + free_safe(msh, (void **)&token->value); + free_safe(msh, (void **)&token); } diff --git a/src/utils/free_token_list.c b/src/utils/free_token_list.c index e179f55..0e7b501 100644 --- a/src/utils/free_token_list.c +++ b/src/utils/free_token_list.c @@ -6,16 +6,16 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 19:08:14 by qmennen #+# #+# */ -/* Updated: 2025/02/25 16:18:44 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:15:58 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_clear_tokenlist(t_minishell *minishell, void *content) +void ft_clear_tokenlist(t_minishell *msh, void *content) { t_token *token; token = (t_token *)content; - ft_token_free(minishell, token); + ft_token_free(msh, token); } diff --git a/src/utils/ft_lstclear_safe.c b/src/utils/ft_lstclear_safe.c index dfdca13..5aa5913 100644 --- a/src/utils/ft_lstclear_safe.c +++ b/src/utils/ft_lstclear_safe.c @@ -1,19 +1,19 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* minishell_lstclear.c :+: :+: */ +/* ft_lstclear_safe.c :+: :+: */ /* +:+ */ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 16:21:16 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:48:43 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:16:21 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_lstclear_safe(t_minishell *minishell, t_list **lst, - void (*del)(t_minishell *minishell, void *)) +void ft_lstclear_safe(t_minishell *msh, t_list **lst, + void (*del)(t_minishell *msh, void *)) { t_list *current; t_list *next; @@ -22,8 +22,8 @@ void ft_lstclear_safe(t_minishell *minishell, t_list **lst, while (current) { next = current->next; - del(minishell, current->content); - free_safe(minishell, (void **)¤t); + del(msh, current->content); + free_safe(msh, (void **)¤t); current = next; } *lst = NULL; diff --git a/src/utils/ft_lstnew_safe.c b/src/utils/ft_lstnew_safe.c index bd0ba5d..f83d6b6 100644 --- a/src/utils/ft_lstnew_safe.c +++ b/src/utils/ft_lstnew_safe.c @@ -1,22 +1,22 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* minishell_lstnew.c :+: :+: */ +/* ft_lstnew_safe.c :+: :+: */ /* +:+ */ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 16:47:09 by whaffman #+# #+# */ -/* Updated: 2025/02/25 16:49:11 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:16:29 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_list *ft_lstnew_safe(t_minishell *minishell, void *content) +t_list *ft_lstnew_safe(t_minishell *msh, void *content) { t_list *new; - new = malloc_safe(minishell, sizeof(t_list)); + new = malloc_safe(msh, sizeof(t_list)); new->content = content; new->next = NULL; return (new); diff --git a/src/utils/ft_strdup_safe.c b/src/utils/ft_strdup_safe.c index 581d3ce..99bbf95 100644 --- a/src/utils/ft_strdup_safe.c +++ b/src/utils/ft_strdup_safe.c @@ -12,11 +12,11 @@ #include "minishell.h" -char *ft_strdup_safe(t_minishell *minishell, const char *str) +char *ft_strdup_safe(t_minishell *msh, const char *str) { char *new_str; new_str = ft_strdup(str); - check_malloc(minishell, new_str); + check_malloc(msh, new_str); return (new_str); } diff --git a/src/utils/ft_strjoin_safe.c b/src/utils/ft_strjoin_safe.c index cf596c8..cae7585 100644 --- a/src/utils/ft_strjoin_safe.c +++ b/src/utils/ft_strjoin_safe.c @@ -12,11 +12,11 @@ #include "minishell.h" -char *ft_strjoin_safe(t_minishell *minishell, const char *s1, const char *s2) +char *ft_strjoin_safe(t_minishell *msh, const char *s1, const char *s2) { char *new_str; new_str = ft_strjoin(s1, s2); - check_malloc(minishell, new_str); + check_malloc(msh, new_str); return (new_str); } diff --git a/src/utils/init_minishell.c b/src/utils/init_minishell.c index bc2cb13..d248dc8 100644 --- a/src/utils/init_minishell.c +++ b/src/utils/init_minishell.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:03:03 by whaffman #+# #+# */ -/* Updated: 2025/02/25 14:50:19 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:16:37 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,19 +14,19 @@ t_minishell *init_minishell(void) { - t_minishell *minishell; + t_minishell *msh; - minishell = malloc(sizeof(t_minishell)); - if (!minishell) + msh = malloc(sizeof(t_minishell)); + if (!msh) { - perror("failed assigning minishell memory"); + perror("failed assigning msh memory"); exit(EXIT_FAILURE); } - minishell->environment = NULL; - minishell->line = NULL; - minishell->lexer = NULL; - minishell->tokens = NULL; - minishell->commands = NULL; - minishell->freelist = NULL; - return (minishell); + msh->environment = NULL; + msh->line = NULL; + msh->lexer = NULL; + msh->tokens = NULL; + msh->commands = NULL; + msh->freelist = NULL; + return (msh); } diff --git a/src/utils/malloc_safe.c b/src/utils/malloc_safe.c index af46370..5485afd 100644 --- a/src/utils/malloc_safe.c +++ b/src/utils/malloc_safe.c @@ -12,11 +12,11 @@ #include "minishell.h" -void *malloc_safe(t_minishell *minishell, size_t size) +void *malloc_safe(t_minishell *msh, size_t size) { void *ptr; ptr = malloc(size); - check_malloc(minishell, ptr); + check_malloc(msh, ptr); return (ptr); } From 3292030e6e4190eb812a6c9314d3c644b240ca31 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 26 Feb 2025 16:20:55 +0100 Subject: [PATCH 060/103] norm 3 --- pipetester.c | 99 ---------------------------------------------------- 1 file changed, 99 deletions(-) delete mode 100644 pipetester.c diff --git a/pipetester.c b/pipetester.c deleted file mode 100644 index 35409af..0000000 --- a/pipetester.c +++ /dev/null @@ -1,99 +0,0 @@ - -#include -#include -#include -#include - -void error(char *msg) -{ - write(2, msg, strlen(msg)); -} - -int main(void) -{ - int fd_in = STDIN_FILENO; - int fd_out = STDOUT_FILENO; - struct stat statbuf_in; - struct stat statbuf_out; - - char c; - - if (fstat(fd_in, &statbuf_in) == -1) - { - perror("fstat"); - return (1); - } - error("STDIN File type: "); - - switch (statbuf_in.st_mode & S_IFMT) - { - case S_IFBLK: - error("block device\n"); - break; - case S_IFCHR: - error("character device\n"); - break; - case S_IFDIR: - error("directory\n"); - break; - case S_IFIFO: - error("FIFO/pipe\n"); - break; - case S_IFLNK: - error("symlink\n"); - break; - case S_IFREG: - error("regular file\n"); - break; - case S_IFSOCK: - error("socket\n"); - break; - default: - error("unknown?\n"); - break; - } - - error("\n"); - - if (fstat(fd_out, &statbuf_out) == -1) - { - perror("fstat"); - return (1); - } - - error("STDOUT File type: "); - - switch (statbuf_out.st_mode & S_IFMT) - { - case S_IFBLK: - error("block device\n"); - break; - case S_IFCHR: - error("character device\n"); - break; - case S_IFDIR: - error("directory\n"); - break; - case S_IFIFO: - error("FIFO/pipe\n"); - break; - case S_IFLNK: - error("symlink\n"); - break; - case S_IFREG: - error("regular file\n"); - break; - case S_IFSOCK: - error("socket\n"); - break; - default: - error("unknown?\n"); - break; - } - - while (read(fd_in, &c, 1) > 0) - { - write(fd_out, &c, 1); - } - return (0); -} From c366ddd6d63b628442b0cc05e048f77159b6dbd3 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 26 Feb 2025 16:21:17 +0100 Subject: [PATCH 061/103] norm 4 --- inc/parser.h | 2 +- inc/redirect.h | 12 ++++++------ inc/typedef.h | 4 +--- lib/libft | 2 +- src/redirect/redirect_valid_type.c | 2 +- src/utils/free_safe.c | 3 +-- 6 files changed, 11 insertions(+), 14 deletions(-) diff --git a/inc/parser.h b/inc/parser.h index c2aff32..c07368f 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -18,6 +18,6 @@ t_command *parser_command_new(t_minishell *msh, char *cmd); char **parser_get_arguments(t_list *list, t_minishell *msh); t_list *parser_get_commands(t_minishell *msh); -t_list *parser_get_input_redirects(t_list *list); +t_list *parser_get_input_redirects(t_list *list); #endif diff --git a/inc/redirect.h b/inc/redirect.h index 2068b97..25c15fe 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -14,11 +14,11 @@ # define REDIRECT_H # include "minishell.h" -t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value); -t_list *redirect_get_inputs(t_minishell *msh, t_list *list); -t_list *redirect_get_outputs(t_minishell *msh, t_list *list); -int redirect_is_valid(t_list *lst, t_token *token); -int redirect_token_type(t_token *token); -int redirect_is_delimiter(t_token *token); +t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value); +t_list *redirect_get_inputs(t_minishell *msh, t_list *list); +t_list *redirect_get_outputs(t_minishell *msh, t_list *list); +int redirect_is_valid(t_list *lst, t_token *token); +int redirect_token_type(t_token *token); +int redirect_is_delimiter(t_token *token); #endif diff --git a/inc/typedef.h b/inc/typedef.h index 53d848c..7fb44a4 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -6,15 +6,13 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/25 13:23:12 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:19:13 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #ifndef TYPEDEF_H # define TYPEDEF_H - - typedef enum e_token_type { T_WORD, diff --git a/lib/libft b/lib/libft index de8a369..0ebb29a 160000 --- a/lib/libft +++ b/lib/libft @@ -1 +1 @@ -Subproject commit de8a369a6264465d4cb2979ff6d6938048a2857d +Subproject commit 0ebb29a9187cd7b77ac2372cdd1dee21d1e7873e diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c index 5f5f9de..28e2185 100644 --- a/src/redirect/redirect_valid_type.c +++ b/src/redirect/redirect_valid_type.c @@ -39,4 +39,4 @@ int redirect_is_delimiter(t_token *token) || token->type == T_OR || token->type == T_EOF || token->type == T_ERROR); -} \ No newline at end of file +} diff --git a/src/utils/free_safe.c b/src/utils/free_safe.c index 7cbe602..58f5a48 100644 --- a/src/utils/free_safe.c +++ b/src/utils/free_safe.c @@ -6,13 +6,12 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/25 15:09:34 by whaffman #+# #+# */ -/* Updated: 2025/02/26 16:15:46 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 16:20:46 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" - void free_safe(t_minishell *msh, void **ptr) { t_list *prev; From 52c46ed40a621f639ba855e8a34d6a7f3f98a5da Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 16:24:09 +0100 Subject: [PATCH 062/103] ignore heredoc --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2ec1726..9d1f841 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ a.out *.o obj/ .minishell_history +.ms_heredoc pipetester.c pipetest From 46a39c17cb1e0d9525378ff9bcd18bca0b243e85 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 16:24:30 +0100 Subject: [PATCH 063/103] validating redirects WIP --- inc/redirect.h | 2 +- inc/utils.h | 2 + sources.mk | 40 +++---- src/expander/expander_get_variable.c | 16 +-- src/parser/parser_get_commands.c | 109 +++++++++-------- src/redirect/redirect_get_inputs.c | 169 +++++++++++++++------------ src/redirect/redirect_get_outputs.c | 2 +- src/redirect/redirect_valid_type.c | 78 +++++++------ src/utils/free_minishell_line.c | 14 +-- src/utils/ft_substr_safe.c | 23 ++++ 10 files changed, 259 insertions(+), 196 deletions(-) create mode 100644 src/utils/ft_substr_safe.c diff --git a/inc/redirect.h b/inc/redirect.h index d9b5911..720e2d8 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -17,7 +17,7 @@ t_redirect *redirect_new(t_minishell *minishell, t_token_type type, char *value); t_list *redirect_get_inputs(t_minishell *minishell, t_list *list); t_list *redirect_get_outputs(t_minishell *minishell, t_list *list); -int redirect_is_valid(t_list *lst, t_token *token); +int redirect_is_valid(t_list *lst, t_token *token, int mode); int redirect_token_type(t_token *token); int redirect_is_delimiter(t_token *token); diff --git a/inc/utils.h b/inc/utils.h index 274ba80..a3d77af 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -23,6 +23,8 @@ void simple_builtins(t_minishell *minishell); void error_msg(char *func, char *msg); void check_malloc(t_minishell *minishell, void *ptr); char *ft_strdup_safe(t_minishell *minishell, const char *str); +char *ft_substr_safe(t_minishell *minishell, const char *str, + unsigned int start, size_t len); char *ft_strjoin_safe(t_minishell *minishell, const char *s1, const char *s2); void *malloc_safe(t_minishell *minishell, size_t size); diff --git a/sources.mk b/sources.mk index 3fa9ed9..5ee83b6 100644 --- a/sources.mk +++ b/sources.mk @@ -1,23 +1,23 @@ VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/debug:src/expander:src/builtin:src/signal:src/redirect: -SOURCES = history_load.c history_write.c prompt.c error_msg.c \ -ft_lstclear_safe.c ft_lstnew_safe.c ft_strdup_safe.c \ -ft_strjoin_safe.c init_minishell.c malloc_safe.c print_banner.c \ -check_malloc.c free_command_list.c free_freelist.c free_lexer.c \ -free_minishell.c free_minishell_line.c free_safe.c free_token.c \ -free_token_list.c lexer_read_char.c lexer_new.c lexer_parse_input.c \ -lexer_read_word.c lexer_token_next.c token_new.c token_parse.c \ -environment_add.c environment_del.c environment_free.c \ -environment_free_list.c environment_get.c environment_get_arr.c \ -environment_parse.c environment_print.c executor_close_fds.c \ -executor_absolute_path.c executor_child.c executor_count_fds.c \ -executor_create_pipes.c executor_create_redirects.c \ -executor_execute_pipeline.c executor_fork.c executor_open_fds.c \ -parser_get_arguments.c parser_get_commands.c parser_new_command.c \ -print_commands.c print_freelist.c expander_is_character.c \ -expander_expand_dollar.c expander_allocate_memory.c \ -expander_get_variable.c expander_parse_string.c \ -expander_parse_variables.c builtin_echo.c builtin_router.c \ -simple_builtins.c is_builtin.c builtin_cd.c builtin_env.c \ +SOURCES = history_load.c history_write.c prompt.c ft_lstclear_safe.c \ +ft_lstnew_safe.c init_minishell.c malloc_safe.c print_banner.c \ +free_minishell_line.c error_msg.c free_command_list.c \ +ft_strdup_safe.c ft_strjoin_safe.c ft_substr_safe.c check_malloc.c \ +free_freelist.c free_lexer.c free_minishell.c free_safe.c \ +free_token.c free_token_list.c lexer_parse_input.c lexer_read_word.c \ +lexer_token_next.c lexer_read_char.c lexer_new.c token_parse.c \ +token_new.c environment_free.c environment_free_list.c \ +environment_print.c environment_add.c environment_del.c \ +environment_get.c environment_get_arr.c environment_parse.c \ +executor_close_fds.c executor_count_fds.c executor_create_pipes.c \ +executor_create_redirects.c executor_execute_pipeline.c \ +executor_fork.c executor_open_fds.c executor_absolute_path.c \ +executor_child.c parser_get_commands.c parser_get_arguments.c \ +parser_new_command.c print_commands.c print_freelist.c \ +expander_is_character.c expander_allocate_memory.c \ +expander_expand_dollar.c expander_get_variable.c \ +expander_parse_string.c expander_parse_variables.c builtin_echo.c \ +builtin_router.c simple_builtins.c builtin_cd.c builtin_env.c \ builtin_exit.c builtin_export.c builtin_pwd.c builtin_unset.c \ -signal.c redirect_valid_type.c redirect_get_inputs.c \ +is_builtin.c signal.c redirect_valid_type.c redirect_get_inputs.c \ redirect_get_outputs.c redirect_new.c main.c \ diff --git a/src/expander/expander_get_variable.c b/src/expander/expander_get_variable.c index a899083..014448d 100644 --- a/src/expander/expander_get_variable.c +++ b/src/expander/expander_get_variable.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* expander_get_variable.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/19 13:59:03 by qmennen #+# #+# */ -/* Updated: 2025/02/25 15:26:36 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* expander_get_variable.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/19 13:59:03 by qmennen #+# #+# */ +/* Updated: 2025/02/26 14:10:53 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ t_environment *expander_get_var(const char *s, int idx, t_minishell *minishell) i = 0; while (expander_character_valid(s[idx + i])) i++; - name = ft_substr(s, idx, i); + name = ft_substr_safe(minishell, s, idx, i); if (!name || !*name) return (NULL); env = environment_get(minishell, name); diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 724db81..34a77e7 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -1,46 +1,63 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parser_get_commands.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:36:01 by qmennen ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -static int is_command_token(t_token *token) -{ - return (token->type < 3 || redirect_token_type(token)); -} - -t_list *parser_get_commands(t_minishell *minishell) -{ - t_list *command_list; - t_list *current; - t_command *command; - t_token *token; - - command_list = NULL; - if (!minishell->tokens) - return (NULL); - current = minishell->tokens; - while (current) - { - token = (t_token *) current->content; - command = parser_command_new(minishell, ft_strdup_safe(minishell, token->value)); - command->args = parser_get_arguments(current, minishell); - command->redirect_in = redirect_get_inputs(minishell, current); - command->redirect_out = redirect_get_outputs(minishell, current); - ft_lstadd_back(&command_list, ft_lstnew_safe(minishell, command)); - while (current && is_command_token((t_token *)current->content)) - current = current->next; - if (current && ((t_token *)current->content)->type >= 3) - current = current->next; - } - ft_lstiter(command_list, print_commands); - return (command_list); -} +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_get_commands.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ +/* Updated: 2025/02/18 20:36:01 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" +#include "utils.h" + +static int is_command_token(t_token *token) +{ + return (token->type < 3 || redirect_token_type(token)); +} + +/* +static int validate_redirects(t_list *lst) +{ + t_list *token; + + token = lst; + while (token) + { + if (((t_token *)token)->type == T_ERROR) + return (0); + token = token->next; + } + return (1); +} +*/ + +t_list *parser_get_commands(t_minishell *minishell) +{ + t_list *command_list; + t_list *current; + t_command *command; + t_token *token; + + command_list = NULL; + if (!minishell->tokens) + return (NULL); + current = minishell->tokens; + while (current) + { + token = (t_token *) current->content; + command = parser_command_new(minishell, ft_strdup_safe(minishell, token->value)); + command->args = parser_get_arguments(current, minishell); + command->redirect_in = redirect_get_inputs(minishell, current); + command->redirect_out = redirect_get_outputs(minishell, current); + ft_lstadd_back(&command_list, ft_lstnew_safe(minishell, command)); + while (current && is_command_token((t_token *)current->content)) + current = current->next; + if (current && ((t_token *)current->content)->type >= 3) + current = current->next; + } + ft_lstiter(command_list, print_commands); + return (command_list); +} diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index f68d9af..68aed2c 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -1,76 +1,93 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* redirect_get_inputs.c :+: :+: */ -/* +:+ */ -/* By: Quinten +#+ */ -/* +#+ */ -/* Created: 2025/02/23 12:29:05 by Quinten #+# #+# */ -/* Updated: 2025/02/23 12:29:05 by Quinten ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "redirect.h" - -static void process_heredoc(t_minishell *ms, t_token *heredoc, t_token *delim) -{ - char *line; - int fd; - - fd = open(".ms_heredoc", O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd < 0) //TODO: Will this work? - return ; - - while (TRUE) - { - line = readline(">"); - if ((*line && ft_strcmp(line, delim->value) == 0) || !line) //TODO: What if not line? - break ; - if (!*line) - ft_putendl_fd("", fd); - else - ft_putendl_fd(line, fd); - } - close(fd); - heredoc->type = T_REDIRECT_IN; - delim->value = ft_strdup_safe(ms, ".ms_heredoc"); -} - -t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) -{ - t_list *current; - t_list *redirects; - t_token *token; - - redirects = NULL; - current = list; - while (current) - { - token = (t_token *)current->content; - if (redirect_is_delimiter(token)) - break ; - if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) - { - current = current->next; - continue ; - } - if (token->type == T_HEREDOC && redirect_is_valid(current, token)) - process_heredoc(minishell, token, current->next->content); - if (redirect_is_valid(current, token)) - { - ft_lstadd_back(&redirects, ft_lstnew_safe(minishell, - redirect_new(minishell, token->type, - ft_strdup_safe(minishell, - ((t_token *)current->next->content)->value)))); - current = current->next; - continue ; - } - else - { - ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, T_ERROR, NULL))); - break ; - } - current = current->next; - } - return (redirects); -} +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* redirect_get_inputs.c :+: :+: */ +/* +:+ */ +/* By: Quinten +#+ */ +/* +#+ */ +/* Created: 2025/02/23 12:29:05 by Quinten #+# #+# */ +/* Updated: 2025/02/23 12:29:05 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "redirect.h" + +static int process_heredoc(t_minishell *msh, t_token *heredoc, t_token *delim) +{ + char *line; + char *expand; + int fd; + + fd = open(".ms_heredoc", O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) // TODO: Will this work? + { + error_msg("heredoc", "unable to write to temp file"); + return (fd); + } + + while (TRUE && fd > 0) + { + line = readline(">"); + if ((*line && ft_strcmp(line, delim->value) == 0) || !line) // TODO: What if not line? + break; + if (!*line) + ft_putendl_fd("", fd); + else + { + expand = expander_parse_string(line, msh); + ft_putendl_fd(expand, fd); + free_safe(msh, (void **)&expand); + } + free(line); + } + close(fd); + free(line); + heredoc->type = T_REDIRECT_IN; + delim->value = ft_strdup_safe(msh, ".ms_heredoc"); + return (1); +} + +t_list *redirect_get_inputs(t_minishell *minishell, t_list *list) +{ + t_list *current; + t_list *redirects; + t_token *token; + int result; + + redirects = NULL; + current = list; + result = 1; + while (current && result) + { + token = (t_token *)current->content; + if (redirect_is_delimiter(token)) + break ; + if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) + { + current = current->next; + continue ; + } + if (token->type == T_HEREDOC && redirect_is_valid(current, token, F_OK | W_OK)) + result = process_heredoc(minishell, token, current->next->content); + if (redirect_is_valid(current, token, F_OK | R_OK)) + { + ft_lstadd_back(&redirects, ft_lstnew_safe(minishell, + redirect_new(minishell, token->type, + ft_strdup_safe(minishell, + ((t_token *)current->next->content)->value)))); + current = current->next; + continue; + } + else + { + ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, T_ERROR, NULL))); + break; + } + current = current->next; + } + if (result < 0) + { + ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, T_ERROR, NULL))); + } + return (redirects); +} diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index f1f884c..813d39b 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -30,7 +30,7 @@ t_list *redirect_get_outputs(t_minishell *minishell, t_list *list) current = current->next; continue ; } - if (redirect_is_valid(current, token)) + if (redirect_is_valid(current, token, F_OK | W_OK)) { ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, token->type, ft_strdup_safe(minishell, ((t_token *)current->next->content)->value)))); diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c index 2554d32..493aff3 100644 --- a/src/redirect/redirect_valid_type.c +++ b/src/redirect/redirect_valid_type.c @@ -1,37 +1,41 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* redirect_valid_type.c :+: :+: */ -/* +:+ */ -/* By: Quinten +#+ */ -/* +#+ */ -/* Created: 2025/02/23 12:30:18 by Quinten #+# #+# */ -/* Updated: 2025/02/23 12:30:18 by Quinten ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -int redirect_token_type(t_token *token) -{ - return (token->type == T_REDIRECT_IN || token->type == T_HEREDOC || - token->type == T_REDIRECT_OUT || token->type == T_APPEND_OUT); -} - -int redirect_is_valid(t_list *lst, t_token *token) -{ - t_token *next; - - if (!lst->next) - return (0); - next = (t_token *)lst->next->content; - if (!next) - return (0); - return (redirect_token_type(token) && next->type < 3); -} - -int redirect_is_delimiter(t_token *token) -{ - return (token->type == T_PIPE || token->type == T_AND || - token->type == T_OR || token->type == T_EOF || token->type == T_ERROR); -} \ No newline at end of file +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* redirect_valid_type.c :+: :+: */ +/* +:+ */ +/* By: Quinten +#+ */ +/* +#+ */ +/* Created: 2025/02/23 12:30:18 by Quinten #+# #+# */ +/* Updated: 2025/02/23 12:30:18 by Quinten ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int redirect_token_type(t_token *token) +{ + return (token->type == T_REDIRECT_IN || token->type == T_HEREDOC || + token->type == T_REDIRECT_OUT || token->type == T_APPEND_OUT); +} + +int redirect_is_valid(t_list *lst, t_token *token, int mode) +{ + t_token *next; + + if (!lst->next) + return (0); + next = (t_token *)lst->next->content; + if (!next) + { + return (0); + } + if (!access(next->value, mode)) + return (0); + return (redirect_token_type(token) && next->type < 3); +} + +int redirect_is_delimiter(t_token *token) +{ + return (token->type == T_PIPE || token->type == T_AND || + token->type == T_OR || token->type == T_EOF || token->type == T_ERROR); +} diff --git a/src/utils/free_minishell_line.c b/src/utils/free_minishell_line.c index 693b953..c7a6102 100644 --- a/src/utils/free_minishell_line.c +++ b/src/utils/free_minishell_line.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* free_minishell_line.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/02/05 16:01:44 by whaffman #+# #+# */ -/* Updated: 2025/02/25 17:40:32 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* free_minishell_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 16:01:44 by whaffman #+# #+# */ +/* Updated: 2025/02/26 14:24:20 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/utils/ft_substr_safe.c b/src/utils/ft_substr_safe.c new file mode 100644 index 0000000..2c50548 --- /dev/null +++ b/src/utils/ft_substr_safe.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* ft_strdup_safe.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/02/20 18:01:27 by whaffman #+# #+# */ +/* Updated: 2025/02/20 18:04:53 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *ft_substr_safe(t_minishell *minishell, const char *str, + unsigned int start, size_t len) +{ + char *new_str; + + new_str = ft_substr(str, start, len); + check_malloc(minishell, new_str); + return (new_str); +} From 12ab3f5e12f272b2e1922880f980466fc92a749c Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 16:42:50 +0100 Subject: [PATCH 064/103] check file availability --- sources.mk | 44 ++++++++++++++-------------- src/expander/expander_get_variable.c | 2 +- src/parser/parser_get_commands.c | 12 ++++---- src/redirect/redirect_get_inputs.c | 6 ++-- src/redirect/redirect_valid_type.c | 17 ++++++----- 5 files changed, 43 insertions(+), 38 deletions(-) diff --git a/sources.mk b/sources.mk index 5ee83b6..cc0c5a1 100644 --- a/sources.mk +++ b/sources.mk @@ -1,23 +1,23 @@ VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/debug:src/expander:src/builtin:src/signal:src/redirect: -SOURCES = history_load.c history_write.c prompt.c ft_lstclear_safe.c \ -ft_lstnew_safe.c init_minishell.c malloc_safe.c print_banner.c \ -free_minishell_line.c error_msg.c free_command_list.c \ -ft_strdup_safe.c ft_strjoin_safe.c ft_substr_safe.c check_malloc.c \ -free_freelist.c free_lexer.c free_minishell.c free_safe.c \ -free_token.c free_token_list.c lexer_parse_input.c lexer_read_word.c \ -lexer_token_next.c lexer_read_char.c lexer_new.c token_parse.c \ -token_new.c environment_free.c environment_free_list.c \ -environment_print.c environment_add.c environment_del.c \ -environment_get.c environment_get_arr.c environment_parse.c \ -executor_close_fds.c executor_count_fds.c executor_create_pipes.c \ -executor_create_redirects.c executor_execute_pipeline.c \ -executor_fork.c executor_open_fds.c executor_absolute_path.c \ -executor_child.c parser_get_commands.c parser_get_arguments.c \ -parser_new_command.c print_commands.c print_freelist.c \ -expander_is_character.c expander_allocate_memory.c \ -expander_expand_dollar.c expander_get_variable.c \ -expander_parse_string.c expander_parse_variables.c builtin_echo.c \ -builtin_router.c simple_builtins.c builtin_cd.c builtin_env.c \ -builtin_exit.c builtin_export.c builtin_pwd.c builtin_unset.c \ -is_builtin.c signal.c redirect_valid_type.c redirect_get_inputs.c \ -redirect_get_outputs.c redirect_new.c main.c \ +SOURCES = history_load.c history_write.c prompt.c print_banner.c \ +init_minishell.c ft_substr_safe.c check_malloc.c error_msg.c \ +free_command_list.c free_freelist.c free_lexer.c free_minishell.c \ +free_minishell_line.c free_safe.c free_token.c free_token_list.c \ +ft_lstclear_safe.c ft_lstnew_safe.c ft_strdup_safe.c \ +ft_strjoin_safe.c malloc_safe.c lexer_read_char.c lexer_new.c \ +lexer_parse_input.c lexer_read_word.c lexer_token_next.c token_new.c \ +token_parse.c environment_add.c environment_del.c environment_free.c \ +environment_free_list.c environment_get.c environment_get_arr.c \ +environment_parse.c environment_print.c executor_close_fds.c \ +executor_absolute_path.c executor_child.c executor_count_fds.c \ +executor_create_pipes.c executor_create_redirects.c \ +executor_execute_pipeline.c executor_fork.c executor_open_fds.c \ +parser_get_arguments.c parser_new_command.c parser_get_commands.c \ +print_commands.c print_freelist.c expander_is_character.c \ +expander_expand_dollar.c expander_allocate_memory.c \ +expander_parse_string.c expander_parse_variables.c \ +expander_get_variable.c builtin_cd.c builtin_echo.c builtin_env.c \ +builtin_exit.c builtin_export.c builtin_pwd.c builtin_router.c \ +builtin_unset.c is_builtin.c simple_builtins.c signal.c \ +signal_init.c.c redirect_get_outputs.c redirect_new.c \ +redirect_valid_type.c redirect_get_inputs.c main.c \ diff --git a/src/expander/expander_get_variable.c b/src/expander/expander_get_variable.c index 980189d..79ff55c 100644 --- a/src/expander/expander_get_variable.c +++ b/src/expander/expander_get_variable.c @@ -21,7 +21,7 @@ t_environment *expander_get_var(const char *s, int idx, t_minishell *msh) i = 0; while (expander_character_valid(s[idx + i])) i++; - name = ft_substr_safe(minishell, s, idx, i); + name = ft_substr_safe(msh, s, idx, i); if (!name || !*name) return (NULL); env = environment_get(msh, name); diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 6503c23..44e182f 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -18,7 +18,6 @@ static int is_command_token(t_token *token) return (token->type < 3 || redirect_token_type(token)); } -/* static int validate_redirects(t_list *lst) { t_list *token; @@ -26,13 +25,12 @@ static int validate_redirects(t_list *lst) token = lst; while (token) { - if (((t_token *)token)->type == T_ERROR) + if (((t_redirect *)token->content)->type == T_ERROR) return (0); token = token->next; } return (1); } -*/ t_list *parser_get_commands(t_minishell *msh) { @@ -42,9 +40,9 @@ t_list *parser_get_commands(t_minishell *msh) t_token *token; command_list = NULL; - if (!minishell->tokens) + if (!msh->tokens) return (NULL); - current = minishell->tokens; + current = msh->tokens; while (current) { token = (t_token *) current->content; @@ -52,6 +50,10 @@ t_list *parser_get_commands(t_minishell *msh) command->args = parser_get_arguments(current, msh); command->redirect_in = redirect_get_inputs(msh, current); command->redirect_out = redirect_get_outputs(msh, current); + if (!validate_redirects(command->redirect_in)) + { + break ; + } ft_lstadd_back(&command_list, ft_lstnew_safe(msh, command)); while (current && is_command_token((t_token *)current->content)) current = current->next; diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index ab494b6..e368e2f 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -19,7 +19,7 @@ static int process_heredoc(t_minishell *msh, t_token *heredoc, t_token *delim) int fd; fd = open(".ms_heredoc", O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd < 0) // TODO: Will this work? + if (fd < 0) { error_msg("heredoc", "unable to write to temp file"); return (fd); @@ -67,11 +67,11 @@ t_list *redirect_get_inputs(t_minishell *msh, t_list *list) current = current->next; continue ; } - if (token->type == T_HEREDOC && redirect_is_valid(current, token, F_OK | W_OK)) + if (token->type == T_HEREDOC && redirect_is_valid(current, token, -1)) result = process_heredoc(msh, token, current->next->content); if (redirect_is_valid(current, token, F_OK | R_OK)) { - ft_lstadd_back(&redirects, ft_lstnew_safe(minishell, + ft_lstadd_back(&redirects, ft_lstnew_safe(msh, redirect_new(msh, token->type, ft_strdup_safe(msh, ((t_token *)current->next->content)->value)))); diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c index 064ba53..dc0e50e 100644 --- a/src/redirect/redirect_valid_type.c +++ b/src/redirect/redirect_valid_type.c @@ -9,17 +9,17 @@ /* Updated: 2025/02/23 12:30:18 by Quinten ######## odam.nl */ /* */ /* ************************************************************************** */ - + #include "minishell.h" - + int redirect_token_type(t_token *token) -{ +{ return (token->type == T_REDIRECT_IN || token->type == T_HEREDOC || token->type == T_REDIRECT_OUT || token->type == T_APPEND_OUT); -} - +} + int redirect_is_valid(t_list *lst, t_token *token, int mode) { t_token *next; @@ -31,8 +31,11 @@ int redirect_is_valid(t_list *lst, t_token *token, int mode) { return (0); } - if (!access(next->value, mode)) + if (mode >= 0 && access(next->value, mode) != 0) + { + error_msg("minishell", "unable to write to temp file"); return (0); + } return (redirect_token_type(token) && next->type < 3); } @@ -43,4 +46,4 @@ int redirect_is_delimiter(t_token *token) || token->type == T_OR || token->type == T_EOF || token->type == T_ERROR); -} +} From 910a4dcf7f40dc221430730f968bd1576713d934 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 16:45:28 +0100 Subject: [PATCH 065/103] I can't check for a file that doesn't exist --- src/redirect/redirect_get_outputs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index ec854b5..8384e02 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -30,7 +30,7 @@ t_list *redirect_get_outputs(t_minishell *msh, t_list *list) current = current->next; continue ; } - if (redirect_is_valid(current, token, F_OK | W_OK)) + if (redirect_is_valid(current, token, -1)) { ft_lstadd_front(&redirects, ft_lstnew_safe(msh, redirect_new(msh, token->type, ft_strdup_safe(msh, ((t_token *)current->next->content)->value)))); From c8806e22c6b40d351e99e6af4c5dbe1b67616015 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 16:54:33 +0100 Subject: [PATCH 066/103] process heredoc new structure --- inc/redirect.h | 1 + sources.mk | 3 +- src/redirect/redirect_get_inputs.c | 49 ++++------------------ src/redirect/redirect_process_heredoc.c | 56 +++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 43 deletions(-) create mode 100644 src/redirect/redirect_process_heredoc.c diff --git a/inc/redirect.h b/inc/redirect.h index 40d315b..4a0cdbb 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -20,5 +20,6 @@ t_list *redirect_get_outputs(t_minishell *msh, t_list *list); int redirect_is_valid(t_list *lst, t_token *token, int mode); int redirect_token_type(t_token *token); int redirect_is_delimiter(t_token *token); +int process_heredoc(t_minishell *msh, t_token *heredoc, t_token *delim); #endif diff --git a/sources.mk b/sources.mk index cc0c5a1..b632b98 100644 --- a/sources.mk +++ b/sources.mk @@ -20,4 +20,5 @@ expander_get_variable.c builtin_cd.c builtin_echo.c builtin_env.c \ builtin_exit.c builtin_export.c builtin_pwd.c builtin_router.c \ builtin_unset.c is_builtin.c simple_builtins.c signal.c \ signal_init.c.c redirect_get_outputs.c redirect_new.c \ -redirect_valid_type.c redirect_get_inputs.c main.c \ +redirect_get_inputs.c redirect_valid_type.c \ +redirect_process_heredoc.c main.c \ diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index e368e2f..5b8654b 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -1,52 +1,17 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* redirect_get_inputs.c :+: :+: */ -/* +:+ */ -/* By: Quinten +#+ */ -/* +#+ */ -/* Created: 2025/02/23 12:29:05 by Quinten #+# #+# */ -/* Updated: 2025/02/23 12:29:05 by Quinten ######## odam.nl */ +/* ::: :::::::: */ +/* redirect_get_inputs.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/23 12:29:05 by Quinten #+# #+# */ +/* Updated: 2025/02/26 16:46:44 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "redirect.h" -static int process_heredoc(t_minishell *msh, t_token *heredoc, t_token *delim) -{ - char *line; - char *expand; - int fd; - - fd = open(".ms_heredoc", O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd < 0) - { - error_msg("heredoc", "unable to write to temp file"); - return (fd); - } - - while (TRUE && fd > 0) - { - line = readline(">"); - if ((*line && ft_strcmp(line, delim->value) == 0) || !line) // TODO: What if not line? - break; - if (!*line) - ft_putendl_fd("", fd); - else - { - expand = expander_parse_string(line, msh); - ft_putendl_fd(expand, fd); - free_safe(msh, (void **)&expand); - } - free(line); - } - close(fd); - free(line); - heredoc->type = T_REDIRECT_IN; - delim->value = ft_strdup_safe(msh, ".ms_heredoc"); - return (1); -} - t_list *redirect_get_inputs(t_minishell *msh, t_list *list) { t_list *current; diff --git a/src/redirect/redirect_process_heredoc.c b/src/redirect/redirect_process_heredoc.c new file mode 100644 index 0000000..d13aaab --- /dev/null +++ b/src/redirect/redirect_process_heredoc.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* redirect_process_heredoc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/26 16:46:32 by qmennen #+# #+# */ +/* Updated: 2025/02/26 16:54:09 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +/** + * process_heredoc - Handles the processing of a heredoc in a minishell. + * @msh: Pointer to the minishell structure. + * @heredoc: Pointer to the token representing the heredoc. + * @delim: Pointer to the token representing the delimiter. + * + * This function reads lines from the standard input until a line matching + * the delimiter is encountered or an end-of-file (EOF) is reached. Each + * line is expanded and written to a temporary file named ".ms_heredoc". + * The function sets the type of the heredoc token to T_REDIRECT_IN and + * updates the delimiter token's value to the temporary file's name. + * + * Return: 1 on success, or a negative value on failure. + */ +int process_heredoc(t_minishell *msh, t_token *heredoc, t_token *delim) +{ + char *line; + char *expand; + const int fd = open(".ms_heredoc", O_WRONLY | O_CREAT | O_TRUNC, 0644); + + if (fd < 0) + { + error_msg("heredoc", "unable to write to temp file"); + return (fd); + } + while (TRUE) + { + line = readline(">"); + if ((*line && ft_strcmp(line, delim->value) == 0) || !line) + break ; + if (!*line) + ft_strlcat(line, "\n", 1); + expand = expander_parse_string(line, msh); + ft_putendl_fd(expand, fd); + free_safe(msh, (void **)&expand); + free(line); + } + close(fd); + heredoc->type = T_REDIRECT_IN; + delim->value = ft_strdup_safe(msh, ".ms_heredoc"); + return (free(line), 1); +} From 4cb8ca86b91726ff2f419d89decddff73cd51ea6 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 16:56:24 +0100 Subject: [PATCH 067/103] fix error title --- src/utils/error_msg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/error_msg.c b/src/utils/error_msg.c index e781c10..2ce1ed1 100644 --- a/src/utils/error_msg.c +++ b/src/utils/error_msg.c @@ -15,10 +15,10 @@ void error_msg(char *func, char *msg) { if (errno) - perror(RED BOLD "msh" RESET); + perror(RED BOLD "minishell" RESET); else { - ft_putstr_fd(RED BOLD "msh" RESET ": ", 2); + ft_putstr_fd(RED BOLD "minishell" RESET ": ", 2); if (func != NULL) { ft_putstr_fd(func, 2); From abb2e8563a3ee66477d88635e93c6c8e291a8920 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 16:57:17 +0100 Subject: [PATCH 068/103] space replace tab --- src/redirect/redirect_get_inputs.c | 2 +- src/redirect/redirect_valid_type.c | 58 +++++++++++++++--------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index 5b8654b..cb864bf 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/23 12:29:05 by Quinten #+# #+# */ -/* Updated: 2025/02/26 16:46:44 by qmennen ### ########.fr */ +/* Updated: 2025/02/26 16:57:02 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c index dc0e50e..7824a23 100644 --- a/src/redirect/redirect_valid_type.c +++ b/src/redirect/redirect_valid_type.c @@ -1,49 +1,49 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* redirect_valid_type.c :+: :+: */ -/* +:+ */ -/* By: Quinten +#+ */ -/* +#+ */ -/* Created: 2025/02/23 12:30:18 by Quinten #+# #+# */ -/* Updated: 2025/02/23 12:30:18 by Quinten ######## odam.nl */ -/* */ -/* ************************************************************************** */ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* redirect_valid_type.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/23 12:30:18 by Quinten #+# #+# */ +/* Updated: 2025/02/26 16:56:51 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ -#include "minishell.h" +#include "minishell.h" -int redirect_token_type(t_token *token) +int redirect_token_type(t_token *token) { - return (token->type == T_REDIRECT_IN - || token->type == T_HEREDOC - || token->type == T_REDIRECT_OUT - || token->type == T_APPEND_OUT); + return (token->type == T_REDIRECT_IN + || token->type == T_HEREDOC + || token->type == T_REDIRECT_OUT + || token->type == T_APPEND_OUT); } int redirect_is_valid(t_list *lst, t_token *token, int mode) { - t_token *next; + t_token *next; - if (!lst->next) - return (0); - next = (t_token *)lst->next->content; - if (!next) + if (!lst->next) + return (0); + next = (t_token *)lst->next->content; + if (!next) { - return (0); + return (0); } if (mode >= 0 && access(next->value, mode) != 0) { error_msg("minishell", "unable to write to temp file"); return (0); } - return (redirect_token_type(token) && next->type < 3); + return (redirect_token_type(token) && next->type < 3); } int redirect_is_delimiter(t_token *token) { - return (token->type == T_PIPE - || token->type == T_AND - || token->type == T_OR - || token->type == T_EOF - || token->type == T_ERROR); + return (token->type == T_PIPE + || token->type == T_AND + || token->type == T_OR + || token->type == T_EOF + || token->type == T_ERROR); } From 46bea87309a619b65e83fc645cc0e9ce0005936e Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 17:25:22 +0100 Subject: [PATCH 069/103] get inputs is done --- inc/redirect.h | 3 +- src/redirect/redirect_get_inputs.c | 48 ++++++++++++------------------ 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/inc/redirect.h b/inc/redirect.h index 4a0cdbb..3c4c63f 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -14,7 +14,8 @@ # define REDIRECT_H # include "minishell.h" -t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value); +t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value); +void redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, t_token_type type); t_list *redirect_get_inputs(t_minishell *msh, t_list *list); t_list *redirect_get_outputs(t_minishell *msh, t_list *list); int redirect_is_valid(t_list *lst, t_token *token, int mode); diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index cb864bf..8b4b383 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -6,53 +6,43 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/23 12:29:05 by Quinten #+# #+# */ -/* Updated: 2025/02/26 16:57:02 by qmennen ### ########.fr */ +/* Updated: 2025/02/26 17:24:53 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "redirect.h" -t_list *redirect_get_inputs(t_minishell *msh, t_list *list) +static void check_heredoc(t_minishell *msh, t_list *current, t_token *token) { - t_list *current; - t_list *redirects; - t_token *token; - int result; + if (token->type == T_HEREDOC && redirect_is_valid(current, token, -1)) + process_heredoc(msh, token, current->next->content); +} + +t_list *redirect_get_inputs(t_minishell *msh, t_list *list) +{ + t_list *current; + t_list *redirects; + t_token *token; + int flag; redirects = NULL; current = list; - result = 1; - while (current && result) + flag = 1; + token = (t_token *)current->content; + while (current && flag && !redirect_is_delimiter(token)) { token = (t_token *)current->content; - if (redirect_is_delimiter(token)) - break ; if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) { current = current->next; continue ; } - if (token->type == T_HEREDOC && redirect_is_valid(current, token, -1)) - result = process_heredoc(msh, token, current->next->content); - if (redirect_is_valid(current, token, F_OK | R_OK)) - { - ft_lstadd_back(&redirects, ft_lstnew_safe(msh, - redirect_new(msh, token->type, - ft_strdup_safe(msh, - ((t_token *)current->next->content)->value)))); - current = current->next; - continue; - } - else - { - ft_lstadd_front(&redirects, ft_lstnew_safe(msh, redirect_new(msh, T_ERROR, NULL))); - break; - } + check_heredoc(msh, current, token); + flag = redirect_is_valid(current, token, F_OK | R_OK); + redirect_create(msh, ¤t, &redirects, token->type); current = current->next; } - if (result < 0) - { + if (flag <= 0) ft_lstadd_front(&redirects, ft_lstnew_safe(msh, redirect_new(msh, T_ERROR, NULL))); - } return (redirects); } From d96b23ca028fc30a8eb2cc59d476623312a00736 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 17:27:38 +0100 Subject: [PATCH 070/103] redirect out --- src/redirect/redirect_get_outputs.c | 23 ++++++++--------------- src/redirect/redirect_new.c | 14 ++++++++++++++ src/redirect/redirect_valid_type.c | 2 +- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index 8384e02..7183617 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -17,32 +17,25 @@ t_list *redirect_get_outputs(t_minishell *msh, t_list *list) t_list *current; t_list *redirects; t_token *token; + int flag; + flag = 1; redirects = NULL; current = list; - while (current) + token = (t_token *)current->content; + while (current && flag && !redirect_is_delimiter(token)) { token = (t_token *)current->content; - if (redirect_is_delimiter(token)) - break ; if (token->type != T_REDIRECT_OUT && token->type != T_APPEND_OUT) { current = current->next; continue ; } - if (redirect_is_valid(current, token, -1)) - { - ft_lstadd_front(&redirects, - ft_lstnew_safe(msh, redirect_new(msh, token->type, ft_strdup_safe(msh, ((t_token *)current->next->content)->value)))); - current = current->next; - continue ; - } - else - { - ft_lstadd_front(&redirects, ft_lstnew_safe(msh, redirect_new(msh, T_ERROR, NULL))); - break ; - } + flag = redirect_is_valid(current, token, -1); + redirect_create(msh, ¤t, &redirects, token->type); current = current->next; } + if (flag <= 0) + ft_lstadd_front(&redirects, ft_lstnew_safe(msh, redirect_new(msh, T_ERROR, NULL))); return (redirects); } diff --git a/src/redirect/redirect_new.c b/src/redirect/redirect_new.c index 662d337..98bd6a4 100644 --- a/src/redirect/redirect_new.c +++ b/src/redirect/redirect_new.c @@ -23,3 +23,17 @@ t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value) result->value = value; return (result); } +void redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, t_token_type type) +{ + t_list *new; + t_redirect *redir; + t_token *file_token; + char *file_name; + + file_token = (t_token *)((*tokens)->next->content); + file_name = ft_strdup_safe(msh, file_token->value); + redir = redirect_new(msh, type, file_name); + new = ft_lstnew_safe(msh, redir); + ft_lstadd_back(redirects, new); + *tokens = (*tokens)->next; +} \ No newline at end of file diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c index 7824a23..b95746d 100644 --- a/src/redirect/redirect_valid_type.c +++ b/src/redirect/redirect_valid_type.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/23 12:30:18 by Quinten #+# #+# */ -/* Updated: 2025/02/26 16:56:51 by qmennen ### ########.fr */ +/* Updated: 2025/02/26 17:12:40 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ From 23e987b5bfc462a461de6194e08a883dfeacade6 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 26 Feb 2025 17:44:59 +0100 Subject: [PATCH 071/103] parse $? --- inc/typedef.h | 3 ++- src/executor/executor_execute_pipeline.c | 3 ++- src/executor/executor_fork.c | 4 ++-- src/expander/expander_parse_string.c | 2 +- src/expander/expander_parse_variables.c | 28 ++++++++++++++++++++++-- src/utils/init_minishell.c | 3 ++- 6 files changed, 35 insertions(+), 8 deletions(-) diff --git a/inc/typedef.h b/inc/typedef.h index 7fb44a4..292ed84 100644 --- a/inc/typedef.h +++ b/inc/typedef.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/05 12:36:08 by whaffman #+# #+# */ -/* Updated: 2025/02/26 16:19:13 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 17:26:27 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -77,6 +77,7 @@ typedef struct s_minishell t_list *tokens; t_list *commands; t_list *freelist; + int exit_status; } t_minishell; typedef int (*t_builtin_fn)(t_minishell *, t_command *); diff --git a/src/executor/executor_execute_pipeline.c b/src/executor/executor_execute_pipeline.c index 623a29a..166eece 100644 --- a/src/executor/executor_execute_pipeline.c +++ b/src/executor/executor_execute_pipeline.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:25:02 by willem #+# #+# */ -/* Updated: 2025/02/26 16:10:39 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 17:42:46 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -31,6 +31,7 @@ int executor_execute_pipeline(t_minishell *msh) current = current->next; } waitpid(last_pid, &exit_status, 0); + msh->exit_status = ((exit_status) & 0xff00) >> 8; signal_init_minishell(); return (((exit_status) & 0xff00) >> 8); } diff --git a/src/executor/executor_fork.c b/src/executor/executor_fork.c index 2af4345..4b359e6 100644 --- a/src/executor/executor_fork.c +++ b/src/executor/executor_fork.c @@ -6,7 +6,7 @@ /* By: willem +#+ */ /* +#+ */ /* Created: 2025/02/12 21:24:52 by willem #+# #+# */ -/* Updated: 2025/02/26 16:10:40 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 17:44:36 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -33,6 +33,6 @@ pid_t executor_fork(t_minishell *msh, t_command *command) exit(127); } else - perror("fork"); + error_msg("minishell", "fork failed"); return (pid); } diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c index 42a1bbd..827cb30 100644 --- a/src/expander/expander_parse_string.c +++ b/src/expander/expander_parse_string.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/26 16:13:40 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 17:23:30 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ diff --git a/src/expander/expander_parse_variables.c b/src/expander/expander_parse_variables.c index 302966a..7bb70b6 100644 --- a/src/expander/expander_parse_variables.c +++ b/src/expander/expander_parse_variables.c @@ -6,12 +6,31 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/02/19 13:58:13 by qmennen #+# #+# */ -/* Updated: 2025/02/26 16:13:42 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 17:41:14 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "minishell.h" +static char *ft_itoa_safe(t_minishell *msh, int n) +{ + char *str; + + str = ft_itoa(n); + check_malloc(msh, str); + return (str); +} + +static t_list *create_exit_status_env(t_minishell *msh) +{ + t_environment *env; + + env = malloc_safe(msh, sizeof(t_environment)); + env->name = ft_strdup_safe(msh, "?"); + env->value = ft_itoa_safe(msh, msh->exit_status); + return (ft_lstnew_safe(msh, env)); +} + t_list *expander_parse_variables(const char *s, t_minishell *msh) { int i; @@ -28,7 +47,12 @@ t_list *expander_parse_variables(const char *s, t_minishell *msh) if (env) ft_lstadd_back(&var_list, ft_lstnew_safe(msh, env)); else - ft_lstadd_back(&var_list, ft_lstnew_safe(msh, NULL)); + { + if (s[i + 1] == '?') + ft_lstadd_back(&var_list, create_exit_status_env(msh)); + else + ft_lstadd_back(&var_list, ft_lstnew_safe(msh, NULL)); + } } i++; } diff --git a/src/utils/init_minishell.c b/src/utils/init_minishell.c index d248dc8..016be86 100644 --- a/src/utils/init_minishell.c +++ b/src/utils/init_minishell.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/05 16:03:03 by whaffman #+# #+# */ -/* Updated: 2025/02/26 16:16:37 by whaffman ######## odam.nl */ +/* Updated: 2025/02/26 17:39:41 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -28,5 +28,6 @@ t_minishell *init_minishell(void) msh->tokens = NULL; msh->commands = NULL; msh->freelist = NULL; + msh->exit_status = 0; return (msh); } From ce2c50e753570b0b79f337af22e752f1a6bf130e Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 17:45:05 +0100 Subject: [PATCH 072/103] redirect norminette --- inc/redirect.h | 1 + sources.mk | 24 ------------------------ src/redirect/redirect_get_inputs.c | 4 ++-- src/redirect/redirect_get_outputs.c | 4 ++-- src/redirect/redirect_new.c | 13 +++++++++---- src/redirect/redirect_new_error.c | 23 +++++++++++++++++++++++ src/redirect/redirect_valid_type.c | 8 ++++---- 7 files changed, 41 insertions(+), 36 deletions(-) delete mode 100644 sources.mk create mode 100644 src/redirect/redirect_new_error.c diff --git a/inc/redirect.h b/inc/redirect.h index 3c4c63f..2da3c94 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -15,6 +15,7 @@ # include "minishell.h" t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value); +void redirect_new_error(t_minishell *msh, t_list **redirects); void redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, t_token_type type); t_list *redirect_get_inputs(t_minishell *msh, t_list *list); t_list *redirect_get_outputs(t_minishell *msh, t_list *list); diff --git a/sources.mk b/sources.mk deleted file mode 100644 index b632b98..0000000 --- a/sources.mk +++ /dev/null @@ -1,24 +0,0 @@ -VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/debug:src/expander:src/builtin:src/signal:src/redirect: -SOURCES = history_load.c history_write.c prompt.c print_banner.c \ -init_minishell.c ft_substr_safe.c check_malloc.c error_msg.c \ -free_command_list.c free_freelist.c free_lexer.c free_minishell.c \ -free_minishell_line.c free_safe.c free_token.c free_token_list.c \ -ft_lstclear_safe.c ft_lstnew_safe.c ft_strdup_safe.c \ -ft_strjoin_safe.c malloc_safe.c lexer_read_char.c lexer_new.c \ -lexer_parse_input.c lexer_read_word.c lexer_token_next.c token_new.c \ -token_parse.c environment_add.c environment_del.c environment_free.c \ -environment_free_list.c environment_get.c environment_get_arr.c \ -environment_parse.c environment_print.c executor_close_fds.c \ -executor_absolute_path.c executor_child.c executor_count_fds.c \ -executor_create_pipes.c executor_create_redirects.c \ -executor_execute_pipeline.c executor_fork.c executor_open_fds.c \ -parser_get_arguments.c parser_new_command.c parser_get_commands.c \ -print_commands.c print_freelist.c expander_is_character.c \ -expander_expand_dollar.c expander_allocate_memory.c \ -expander_parse_string.c expander_parse_variables.c \ -expander_get_variable.c builtin_cd.c builtin_echo.c builtin_env.c \ -builtin_exit.c builtin_export.c builtin_pwd.c builtin_router.c \ -builtin_unset.c is_builtin.c simple_builtins.c signal.c \ -signal_init.c.c redirect_get_outputs.c redirect_new.c \ -redirect_get_inputs.c redirect_valid_type.c \ -redirect_process_heredoc.c main.c \ diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index 8b4b383..2eaabd3 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/23 12:29:05 by Quinten #+# #+# */ -/* Updated: 2025/02/26 17:24:53 by qmennen ### ########.fr */ +/* Updated: 2025/02/26 17:38:59 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,6 +43,6 @@ t_list *redirect_get_inputs(t_minishell *msh, t_list *list) current = current->next; } if (flag <= 0) - ft_lstadd_front(&redirects, ft_lstnew_safe(msh, redirect_new(msh, T_ERROR, NULL))); + redirect_new_error(msh, &redirects); return (redirects); } diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index 7183617..19a4a4e 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -31,11 +31,11 @@ t_list *redirect_get_outputs(t_minishell *msh, t_list *list) current = current->next; continue ; } - flag = redirect_is_valid(current, token, -1); + flag = redirect_is_valid(current, token, -1); redirect_create(msh, ¤t, &redirects, token->type); current = current->next; } if (flag <= 0) - ft_lstadd_front(&redirects, ft_lstnew_safe(msh, redirect_new(msh, T_ERROR, NULL))); + redirect_new_error(msh, &redirects); return (redirects); } diff --git a/src/redirect/redirect_new.c b/src/redirect/redirect_new.c index 98bd6a4..ee11cf9 100644 --- a/src/redirect/redirect_new.c +++ b/src/redirect/redirect_new.c @@ -23,7 +23,9 @@ t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value) result->value = value; return (result); } -void redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, t_token_type type) + +void redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, +t_token_type type) { t_list *new; t_redirect *redir; @@ -31,9 +33,12 @@ void redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, t_to char *file_name; file_token = (t_token *)((*tokens)->next->content); - file_name = ft_strdup_safe(msh, file_token->value); + file_name = NULL; + if (file_token) + file_name = ft_strdup_safe(msh, file_token->value); redir = redirect_new(msh, type, file_name); new = ft_lstnew_safe(msh, redir); ft_lstadd_back(redirects, new); - *tokens = (*tokens)->next; -} \ No newline at end of file + if (tokens) + *tokens = (*tokens)->next; +} diff --git a/src/redirect/redirect_new_error.c b/src/redirect/redirect_new_error.c new file mode 100644 index 0000000..076e062 --- /dev/null +++ b/src/redirect/redirect_new_error.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* redirect_new_error.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/26 17:37:12 by qmennen #+# #+# */ +/* Updated: 2025/02/26 17:44:49 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void redirect_new_error(t_minishell *msh, t_list **redirects) +{ + t_list *new; + t_redirect *redir; + + redir = redirect_new(msh, T_ERROR, NULL); + new = ft_lstnew_safe(msh, redir); + ft_lstadd_back(redirects, new); +} diff --git a/src/redirect/redirect_valid_type.c b/src/redirect/redirect_valid_type.c index b95746d..8d232d0 100644 --- a/src/redirect/redirect_valid_type.c +++ b/src/redirect/redirect_valid_type.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/23 12:30:18 by Quinten #+# #+# */ -/* Updated: 2025/02/26 17:12:40 by qmennen ### ########.fr */ +/* Updated: 2025/02/26 17:40:44 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,9 +20,9 @@ int redirect_token_type(t_token *token) || token->type == T_APPEND_OUT); } -int redirect_is_valid(t_list *lst, t_token *token, int mode) +int redirect_is_valid(t_list *lst, t_token *token, int mode) { - t_token *next; + t_token *next; if (!lst->next) return (0); @@ -39,7 +39,7 @@ int redirect_is_valid(t_list *lst, t_token *token, int mode) return (redirect_token_type(token) && next->type < 3); } -int redirect_is_delimiter(t_token *token) +int redirect_is_delimiter(t_token *token) { return (token->type == T_PIPE || token->type == T_AND From 5f30d2b650910a57bc4cc4822954b871ae68a405 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 18:36:06 +0100 Subject: [PATCH 073/103] fix: only parse dqword with $ --- src/parser/parser_get_arguments.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index 25b298f..b0f2033 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* parser_get_arguments.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ -/* Updated: 2025/02/26 16:14:14 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* parser_get_arguments.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ +/* Updated: 2025/02/26 18:35:27 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,7 +38,7 @@ static int parser_should_expand(t_list *value) token = (t_token *)value->content; if (!token) return (0); - return (token->type == T_DQWORD + return ((token->type == T_DQWORD && ft_strchr(token->value, '$')) || (token->type == T_WORD && token->value[0] == '$' && token->value[1])); @@ -60,8 +60,7 @@ char **parser_get_arguments(t_list *list, t_minishell *msh) if (parser_should_expand(current)) args[i] = expander_parse_string( ((t_token *)current->content)->value, msh); - else if (((t_token *)current->content)->type == T_WORD - || ((t_token *)current->content)->type == T_SQWORD) + else if (((t_token *)current->content)->type < 3) args[i] = ft_strdup_safe(msh, ((t_token *)current->content)->value); current = current->next; From 2059f7d634b2c744f53082b8c0ce4eb58d34e8c5 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 18:36:16 +0100 Subject: [PATCH 074/103] norminette parse string --- src/expander/expander_parse_string.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c index 42a1bbd..a8752ac 100644 --- a/src/expander/expander_parse_string.c +++ b/src/expander/expander_parse_string.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* expander_parse_string.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ -/* Updated: 2025/02/26 16:13:40 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* expander_parse_string.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/18 19:00:35 by qmennen #+# #+# */ +/* Updated: 2025/02/26 18:33:41 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,17 +37,16 @@ char *expander_parse_string(char *s, t_minishell *msh) variables = expander_parse_variables(s, msh); string = expander_allocate_memory(msh, s, variables); + current = variables; i = 0; j = 0; - current = variables; - while (s[i]) + while (s[i] && current) { if (s[i] == '$' && s[i + 1]) { i++; i += expander_expand_dollar(s + i, string, &j, current); - if (current) - current = current->next; + current = current->next; } else string[j++] = s[i++]; From 5b3d446b750220b550780407224480a14a125e25 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 18:36:33 +0100 Subject: [PATCH 075/103] null terminate exapnd string mem --- src/expander/expander_allocate_memory.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/expander/expander_allocate_memory.c b/src/expander/expander_allocate_memory.c index 317466c..bd92a16 100644 --- a/src/expander/expander_allocate_memory.c +++ b/src/expander/expander_allocate_memory.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* expander_allocate_memory.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/19 13:57:19 by qmennen #+# #+# */ -/* Updated: 2025/02/26 16:10:42 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* expander_allocate_memory.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/19 13:57:19 by qmennen #+# #+# */ +/* Updated: 2025/02/26 18:05:17 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,5 +37,6 @@ char *expander_allocate_memory( } size += ft_strlen(s); string = malloc_safe(msh, size); + string[0] = 0; return (string); } From 11b19749f0109b01b57414cd1dd56a1e21fff4a2 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 26 Feb 2025 18:36:45 +0100 Subject: [PATCH 076/103] print correct command output --- src/executor/executor_child.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 27f1d7c..904bedd 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* executor_child.c :+: :+: */ -/* +:+ */ -/* By: willem +#+ */ -/* +#+ */ -/* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/26 16:09:44 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* executor_child.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/12 21:25:10 by willem #+# #+# */ +/* Updated: 2025/02/26 18:20:34 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,11 +21,11 @@ void executor_child(t_minishell *msh, t_command *command) if (command->fd_out != 1) dup2(command->fd_out, 1); executor_close_fds(command->n_fds); - path = executor_absolute_path(msh, command->command); + path = executor_absolute_path(msh, command->args[0]); if (path == NULL) { ft_putstr_fd(RED BOLD, 2); - ft_putstr_fd(command->command, 2); + ft_putstr_fd(command->args[0], 2); ft_putstr_fd(": " RESET "command not found\n", 2); return ; } From 3b1ad5500b726e7990da6f19ce895d584a78ba16 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 13:06:44 +0100 Subject: [PATCH 077/103] fix expanding --- src/expander/expander_parse_string.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/expander/expander_parse_string.c b/src/expander/expander_parse_string.c index a8752ac..42253bf 100644 --- a/src/expander/expander_parse_string.c +++ b/src/expander/expander_parse_string.c @@ -40,9 +40,9 @@ char *expander_parse_string(char *s, t_minishell *msh) current = variables; i = 0; j = 0; - while (s[i] && current) + while (s[i]) { - if (s[i] == '$' && s[i + 1]) + if (s[i] == '$' && s[i + 1] && current) { i++; i += expander_expand_dollar(s + i, string, &j, current); From 90678d8f0f26729e7dde98b7d044884e285975b9 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 13:09:30 +0100 Subject: [PATCH 078/103] check if the path found is executable --- src/executor/executor_child.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 904bedd..299b77c 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -22,7 +22,7 @@ void executor_child(t_minishell *msh, t_command *command) dup2(command->fd_out, 1); executor_close_fds(command->n_fds); path = executor_absolute_path(msh, command->args[0]); - if (path == NULL) + if (path == NULL || !access(path, F_OK | X_OK)) { ft_putstr_fd(RED BOLD, 2); ft_putstr_fd(command->args[0], 2); From 13adfc5a0740f244aff4cb278f168c96f9b740a0 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 15:58:18 +0100 Subject: [PATCH 079/103] fix: check if path is a dir --- src/executor/executor_child.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 299b77c..cebe4c9 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,11 +6,24 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/26 18:20:34 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 13:50:26 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +#include + +static int is_dir(char *path) +{ + struct stat path_stats; + + if (stat(path, &path_stats) < 0) + { + error_msg("is_dir", "path could not be read"); + return (0); + } + return S_ISDIR(path_stats.st_mode); +} void executor_child(t_minishell *msh, t_command *command) { @@ -22,7 +35,14 @@ void executor_child(t_minishell *msh, t_command *command) dup2(command->fd_out, 1); executor_close_fds(command->n_fds); path = executor_absolute_path(msh, command->args[0]); - if (path == NULL || !access(path, F_OK | X_OK)) + // TODO: If the path variable points to a dir, it exists so the command won't fail (while ofc it should?) + if (is_dir(path)) + { + ft_putstr_fd(RED BOLD, 2); + ft_putstr_fd(command->args[0], 2); + ft_putstr_fd(": " RESET "is a directory\n", 2); + } + if (path == NULL || access(path, F_OK | X_OK) != 0) { ft_putstr_fd(RED BOLD, 2); ft_putstr_fd(command->args[0], 2); From bceabcb382f55b13d64d9de276b09bd90f736707 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:01:11 +0100 Subject: [PATCH 080/103] fix: message --- src/executor/executor_child.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index cebe4c9..41afdb5 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -39,6 +39,7 @@ void executor_child(t_minishell *msh, t_command *command) if (is_dir(path)) { ft_putstr_fd(RED BOLD, 2); + ft_putstr_fd("minishell: ", 2); ft_putstr_fd(command->args[0], 2); ft_putstr_fd(": " RESET "is a directory\n", 2); } From 859b9c181a1069558491ec654e2a0036ec487490 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:02:41 +0100 Subject: [PATCH 081/103] fix: dir check after path confirmed --- src/executor/executor_child.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 41afdb5..fde3237 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -36,13 +36,6 @@ void executor_child(t_minishell *msh, t_command *command) executor_close_fds(command->n_fds); path = executor_absolute_path(msh, command->args[0]); // TODO: If the path variable points to a dir, it exists so the command won't fail (while ofc it should?) - if (is_dir(path)) - { - ft_putstr_fd(RED BOLD, 2); - ft_putstr_fd("minishell: ", 2); - ft_putstr_fd(command->args[0], 2); - ft_putstr_fd(": " RESET "is a directory\n", 2); - } if (path == NULL || access(path, F_OK | X_OK) != 0) { ft_putstr_fd(RED BOLD, 2); @@ -50,5 +43,12 @@ void executor_child(t_minishell *msh, t_command *command) ft_putstr_fd(": " RESET "command not found\n", 2); return ; } + if (is_dir(path)) + { + ft_putstr_fd(RED BOLD, 2); + ft_putstr_fd("minishell: ", 2); + ft_putstr_fd(command->args[0], 2); + ft_putstr_fd(": " RESET "is a directory\n", 2); + } execve(path, command->args, environment_get_arr(msh)); } From e5569d9b0b6dd1abfce7fcb5f56687d6df15af00 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:05:15 +0100 Subject: [PATCH 082/103] refactor: creating commands --- inc/parser.h | 47 ++++++++++--------- ...r_new_command.c => parser_alloc_command.c} | 2 +- src/parser/parser_create_command.c | 20 ++++++++ src/parser/parser_get_commands.c | 17 +++---- 4 files changed, 51 insertions(+), 35 deletions(-) rename src/parser/{parser_new_command.c => parser_alloc_command.c} (95%) create mode 100644 src/parser/parser_create_command.c diff --git a/inc/parser.h b/inc/parser.h index c07368f..beba406 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -1,23 +1,24 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* parser.h :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/11 14:03:03 by qmennen #+# #+# */ -/* Updated: 2025/02/11 17:19:01 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#ifndef PARSER_H -# define PARSER_H - -# include "minishell.h" - -t_command *parser_command_new(t_minishell *msh, char *cmd); -char **parser_get_arguments(t_list *list, t_minishell *msh); -t_list *parser_get_commands(t_minishell *msh); -t_list *parser_get_input_redirects(t_list *list); - -#endif +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* parser.h :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/02/11 14:03:03 by qmennen #+# #+# */ +/* Updated: 2025/02/11 17:19:01 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#ifndef PARSER_H +# define PARSER_H + +# include "minishell.h" + +t_command *parser_alloc_command(t_minishell *msh, char *cmd); +void parser_create_command(t_minishell *msh, t_command *cmd, t_list **l_tkn); +char **parser_get_arguments(t_list *list, t_minishell *msh); +t_list *parser_get_commands(t_minishell *msh); +t_list *parser_get_input_redirects(t_list *list); + +#endif diff --git a/src/parser/parser_new_command.c b/src/parser/parser_alloc_command.c similarity index 95% rename from src/parser/parser_new_command.c rename to src/parser/parser_alloc_command.c index 3599cba..fc49925 100644 --- a/src/parser/parser_new_command.c +++ b/src/parser/parser_alloc_command.c @@ -12,7 +12,7 @@ #include "minishell.h" -t_command *parser_command_new(t_minishell *msh, char *cmd) +t_command *parser_alloc_command(t_minishell *msh, char *cmd) { t_command *command; diff --git a/src/parser/parser_create_command.c b/src/parser/parser_create_command.c new file mode 100644 index 0000000..723f860 --- /dev/null +++ b/src/parser/parser_create_command.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_create_command.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/27 13:35:02 by qmennen #+# #+# */ +/* Updated: 2025/02/27 13:36:48 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void parser_create_command(t_minishell *msh, t_command *cmd, t_list **l_tkn) +{ + cmd->args = parser_get_arguments(*l_tkn, msh); + cmd->redirect_in = redirect_get_inputs(msh, *l_tkn); + cmd->redirect_out = redirect_get_outputs(msh, *l_tkn); +} diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 44e182f..68bbe5a 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -6,19 +6,18 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ -/* Updated: 2025/02/18 20:36:01 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 13:38:56 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -#include "utils.h" -static int is_command_token(t_token *token) +static int is_command_token(t_token *token) { return (token->type < 3 || redirect_token_type(token)); } -static int validate_redirects(t_list *lst) +static int validate_redirects(t_list *lst) { t_list *token; @@ -46,14 +45,10 @@ t_list *parser_get_commands(t_minishell *msh) while (current) { token = (t_token *) current->content; - command = parser_command_new(msh, ft_strdup_safe(msh, token->value)); - command->args = parser_get_arguments(current, msh); - command->redirect_in = redirect_get_inputs(msh, current); - command->redirect_out = redirect_get_outputs(msh, current); - if (!validate_redirects(command->redirect_in)) - { + command = parser_alloc_command(msh, ft_strdup_safe(msh, token->value)); + parser_create_command(msh, command, ¤t); + if (!validate_redirects(command->redirect_in) || !validate_redirects(command->redirect_out)) break ; - } ft_lstadd_back(&command_list, ft_lstnew_safe(msh, command)); while (current && is_command_token((t_token *)current->content)) current = current->next; From 4cdc9c35304ee3d1d062ee10443973d2713bc6cd Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:09:36 +0100 Subject: [PATCH 083/103] more refactor for parser --- inc/parser.h | 5 ++-- sources.mk | 24 ++++++++++++++++++ src/parser/parser_get_commands.c | 18 ++------------ src/parser/parser_validate_command.c | 37 ++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 18 deletions(-) create mode 100644 sources.mk create mode 100644 src/parser/parser_validate_command.c diff --git a/inc/parser.h b/inc/parser.h index beba406..a3d0483 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -16,9 +16,10 @@ # include "minishell.h" t_command *parser_alloc_command(t_minishell *msh, char *cmd); -void parser_create_command(t_minishell *msh, t_command *cmd, t_list **l_tkn); -char **parser_get_arguments(t_list *list, t_minishell *msh); t_list *parser_get_commands(t_minishell *msh); t_list *parser_get_input_redirects(t_list *list); +void parser_create_command(t_minishell *msh, t_command *cmd, t_list **l_tkn); +char **parser_get_arguments(t_list *list, t_minishell *msh); +int parser_validate_command(t_command *command); #endif diff --git a/sources.mk b/sources.mk new file mode 100644 index 0000000..e85d1ea --- /dev/null +++ b/sources.mk @@ -0,0 +1,24 @@ +VPATH = src:src/prompt:src/utils:src/lexer:src/token:src/environment:src/executor:src/parser:src/debug:src/expander:src/builtin:src/signal:src/redirect: +SOURCES = history_load.c history_write.c prompt.c print_banner.c check_malloc.c \ +free_command_list.c free_freelist.c free_lexer.c free_minishell.c \ +free_safe.c free_token.c free_token_list.c ft_lstclear_safe.c \ +ft_lstnew_safe.c ft_strdup_safe.c ft_strjoin_safe.c malloc_safe.c \ +error_msg.c free_minishell_line.c ft_substr_safe.c init_minishell.c \ +lexer_read_char.c lexer_new.c lexer_parse_input.c lexer_read_word.c \ +lexer_token_next.c token_new.c token_parse.c environment_add.c \ +environment_del.c environment_free.c environment_free_list.c \ +environment_get.c environment_get_arr.c environment_parse.c \ +environment_print.c executor_close_fds.c executor_absolute_path.c \ +executor_count_fds.c executor_create_pipes.c \ +executor_create_redirects.c executor_open_fds.c \ +executor_execute_pipeline.c executor_fork.c executor_child.c \ +parser_create_command.c parser_get_arguments.c parser_alloc_command.c \ +parser_get_commands.c parser_validate_command.c print_commands.c \ +print_freelist.c expander_is_character.c expander_expand_dollar.c \ +expander_allocate_memory.c expander_get_variable.c \ +expander_parse_variables.c expander_parse_string.c is_builtin.c \ +simple_builtins.c builtin_cd.c builtin_echo.c builtin_env.c \ +builtin_exit.c builtin_export.c builtin_pwd.c builtin_router.c \ +builtin_unset.c signal.c signal_init.c.c redirect_get_inputs.c \ +redirect_get_outputs.c redirect_new.c redirect_new_error.c \ +redirect_process_heredoc.c redirect_valid_type.c main.c \ diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 68bbe5a..31ec57d 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/11 14:06:02 by qmennen #+# #+# */ -/* Updated: 2025/02/27 13:38:56 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 16:07:54 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,20 +17,6 @@ static int is_command_token(t_token *token) return (token->type < 3 || redirect_token_type(token)); } -static int validate_redirects(t_list *lst) -{ - t_list *token; - - token = lst; - while (token) - { - if (((t_redirect *)token->content)->type == T_ERROR) - return (0); - token = token->next; - } - return (1); -} - t_list *parser_get_commands(t_minishell *msh) { t_list *command_list; @@ -47,7 +33,7 @@ t_list *parser_get_commands(t_minishell *msh) token = (t_token *) current->content; command = parser_alloc_command(msh, ft_strdup_safe(msh, token->value)); parser_create_command(msh, command, ¤t); - if (!validate_redirects(command->redirect_in) || !validate_redirects(command->redirect_out)) + if (! parser_validate_command(command)) break ; ft_lstadd_back(&command_list, ft_lstnew_safe(msh, command)); while (current && is_command_token((t_token *)current->content)) diff --git a/src/parser/parser_validate_command.c b/src/parser/parser_validate_command.c new file mode 100644 index 0000000..e15e38d --- /dev/null +++ b/src/parser/parser_validate_command.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_validate_command.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/27 16:06:33 by qmennen #+# #+# */ +/* Updated: 2025/02/27 16:08:49 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int validate_redirects(t_list *lst) +{ + t_list *token; + + token = lst; + while (token) + { + if (((t_redirect *)token->content)->type == T_ERROR) + return (0); + token = token->next; + } + return (1); +} + +int parser_validate_command(t_command *command) +{ + int r_in; + int r_out; + + r_in = validate_redirects(command->redirect_in); + r_out = validate_redirects(command->redirect_out); + return (r_in && r_out); +} From c2f062c6716bb84705e7da2741c4e78f2c753281 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:18:57 +0100 Subject: [PATCH 084/103] refactor: lexer --- src/lexer/lexer_token_next.c | 39 ++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/lexer/lexer_token_next.c b/src/lexer/lexer_token_next.c index d3c1181..12d571c 100644 --- a/src/lexer/lexer_token_next.c +++ b/src/lexer/lexer_token_next.c @@ -11,7 +11,6 @@ /* ************************************************************************** */ #include "minishell.h" -#include "typedef.h" static t_token_type get_word_type(char c) { @@ -23,6 +22,21 @@ static t_token_type get_word_type(char c) return (T_WORD); } +static t_token *process_word(t_minishell *msh, t_lexer *lexer, int pos) +{ + t_token_type word_type; + t_token *token; + char *word; + + word_type = get_word_type(lexer->current_char); + word = lexer_readword(msh, lexer); + if (!word) + return (token_new(msh, T_ERROR, &(lexer->current_char), pos)); + token = token_new(msh, word_type, word, pos); + free_safe(msh, (void **)&word); + return (token); +} + /** * @brief Retrieves the next token from the lexer. * @@ -45,32 +59,23 @@ static t_token_type get_word_type(char c) t_token *ft_token_next(t_minishell *msh, t_lexer *lexer) { t_token *token; - t_token_type word_type; - char *word; int current_pos; + char c; token = NULL; while (ft_isspace(lexer->current_char)) lexer_readchar(lexer); current_pos = lexer->pos; - if (lexer->current_char == '\0') + c = lexer->current_char; + if (c == '\0') token = token_new(msh, T_EOF, NULL, current_pos); - else if (lexer->current_char == '<' || lexer->current_char == '>' - || lexer->current_char == '|') + else if (c == '<' || c == '>' + || c == '|') token = token_parse(msh, lexer); else if (ft_isprint(lexer->current_char)) - { - word_type = get_word_type(lexer->current_char); - word = lexer_readword(msh, lexer); - if (!word) - return (token_new(msh, T_ERROR, &lexer->current_char, current_pos)); - token = token_new(msh, word_type, word, current_pos); - free_safe(msh, (void **)&word); - } + token = process_word(msh, lexer, current_pos); else - { token = token_new(msh, T_ERROR, NULL, current_pos); - printf("token->type: %d\n", token->type); - } + c = lexer->current_char; return (token); } From e5b30c87966581755fde97e529dc8d92dba03d5a Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:21:44 +0100 Subject: [PATCH 085/103] func explains itself really --- src/executor/executor_child.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index fde3237..2d05faa 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/27 13:50:26 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 16:20:00 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ static int is_dir(char *path) error_msg("is_dir", "path could not be read"); return (0); } - return S_ISDIR(path_stats.st_mode); + return (S_ISDIR(path_stats.st_mode)); } void executor_child(t_minishell *msh, t_command *command) @@ -35,7 +35,6 @@ void executor_child(t_minishell *msh, t_command *command) dup2(command->fd_out, 1); executor_close_fds(command->n_fds); path = executor_absolute_path(msh, command->args[0]); - // TODO: If the path variable points to a dir, it exists so the command won't fail (while ofc it should?) if (path == NULL || access(path, F_OK | X_OK) != 0) { ft_putstr_fd(RED BOLD, 2); From dd76e2c521e87fc3a71fef5b0ce6452494470e93 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:21:49 +0100 Subject: [PATCH 086/103] norminette --- src/builtin/builtin_export.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c index 8b1120b..74714c7 100644 --- a/src/builtin/builtin_export.c +++ b/src/builtin/builtin_export.c @@ -18,8 +18,8 @@ int builtin_export(t_minishell *msh, t_command *cmd) char **arr; int i; - i = 1; - while (cmd->args[i] != NULL) + i = 0; + while (cmd->args[++i] != NULL) { arr = ft_split(cmd->args[i], '='); if (arr[1] == NULL) @@ -37,7 +37,6 @@ int builtin_export(t_minishell *msh, t_command *cmd) else environment_add(msh, arr[0], arr[1]); ft_free_arr(arr); - i++; } return (SUCCESS); } From abdab3156ce29d2d7f3f9ed5aba42770a0d39109 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:46:34 +0100 Subject: [PATCH 087/103] error message instead of putstrfd --- src/executor/executor_child.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 2d05faa..d80ae8d 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/27 16:20:00 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 16:46:21 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,9 +37,7 @@ void executor_child(t_minishell *msh, t_command *command) path = executor_absolute_path(msh, command->args[0]); if (path == NULL || access(path, F_OK | X_OK) != 0) { - ft_putstr_fd(RED BOLD, 2); - ft_putstr_fd(command->args[0], 2); - ft_putstr_fd(": " RESET "command not found\n", 2); + error_msg("minishell", "command not found"); return ; } if (is_dir(path)) From e366689f91d5543e430a267f7e18e97921c41b72 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:46:47 +0100 Subject: [PATCH 088/103] extract into helper for norminette --- src/executor/executor_absolute_path.c | 50 +++++++++++++++++---------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/src/executor/executor_absolute_path.c b/src/executor/executor_absolute_path.c index a193c46..a876e87 100644 --- a/src/executor/executor_absolute_path.c +++ b/src/executor/executor_absolute_path.c @@ -12,6 +12,34 @@ #include "minishell.h" +static char *resolve_relative(t_minishell *msh, char *cmd) +{ + char *executable; + + if (access(cmd, F_OK) == 0) + { + executable = ft_strdup_safe(msh, cmd); + if (!executable) + return (NULL); + return (executable); + } + return (NULL); +} + +static char *resolve_path(t_minishell *msh, char *path, char *cmd) +{ + char *executable; + + executable = malloc_safe(msh, ft_strlen(path) + ft_strlen(cmd) + 2); + ft_strlcpy(executable, path, ft_strlen(path) + 1); + ft_strlcat(executable, "/", ft_strlen(path) + 2); + ft_strlcat(executable, cmd, ft_strlen(path) + ft_strlen(cmd) + 2); + if (access(executable, F_OK) == 0) + return (executable); + free_safe(msh, (void **)&executable); + return (NULL); +} + char *executor_absolute_path(t_minishell *msh, char *cmd) { char **path; @@ -20,16 +48,7 @@ char *executor_absolute_path(t_minishell *msh, char *cmd) int i; if (cmd[0] == '/' || cmd[0] == '.') - { - if (access(cmd, F_OK) == 0) - { - executable = ft_strdup_safe(msh, cmd); - if (!executable) - return (NULL); - return (executable); - } - return (NULL); - } + return (resolve_relative(msh, cmd)); path_env = environment_get(msh, "PATH"); if (!path_env) return (NULL); @@ -37,16 +56,9 @@ char *executor_absolute_path(t_minishell *msh, char *cmd) i = 0; while (path[i] != NULL) { - executable = malloc_safe(msh, ft_strlen(path[i]) + ft_strlen(cmd) + 2); - ft_strlcpy(executable, path[i], ft_strlen(path[i]) + 1); - ft_strlcat(executable, "/", ft_strlen(path[i]) + 2); - ft_strlcat(executable, cmd, ft_strlen(path[i]) + ft_strlen(cmd) + 2); - if (access(executable, F_OK) == 0) - { - ft_free_arr(path); + executable = resolve_path(msh, path[i], cmd); + if (executable) return (executable); - } - free_safe(msh, (void **)&executable); i++; } return (ft_free_arr(path), NULL); From 9de806e64875842a1d4dc806a49e39b4574c6d45 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:46:54 +0100 Subject: [PATCH 089/103] limits --- inc/allowed.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/inc/allowed.h b/inc/allowed.h index e562c19..7b2859f 100644 --- a/inc/allowed.h +++ b/inc/allowed.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:13:11 by whaffman #+# #+# */ -/* Updated: 2025/02/06 16:14:44 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 16:36:39 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,6 +26,7 @@ # include # include # include +# include # include # include From 74f29f1f482008cb516aa51555652d4d3dee5e84 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:51:26 +0100 Subject: [PATCH 090/103] Updated readme for reference on eveyrthing changed --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index deeb689..918b5f2 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,14 @@ A lot of amazing shell stuff - libreadline-dev - libncurses-dev +## Comments on work +- Checked if path is a directory and send appropriate message +- `executor_absolute_path` => extracted some code into helpers to make it norminette compliant +- `executor_child` => refactored putstr_fd into error_msg | checked if file on path is exectuable to show permission denied where applicable +- `lexer_token_next` => extracted code for norminette +- `parser` => **A LOT** of work in all files for norminette compliancy +- `expander_parse_string` => Fixed so that $HOME/test.txt returns the correct path and file + ## TODO - [x] Find absolute path for command input ('/', './', 'cmd') - [x]Add heredoc to tokenizer From ae010a33f6748a501d5e0bdf1f835d75c685a91c Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 16:51:59 +0100 Subject: [PATCH 091/103] sys stat already included in allowed.h --- src/executor/executor_child.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index d80ae8d..7f88381 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,12 +6,11 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/27 16:46:21 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 16:51:43 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -#include static int is_dir(char *path) { From 05b7ae3a6aedb8c9a6aeb143bca79aa24ceae21a Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 18:11:44 +0100 Subject: [PATCH 092/103] norminette made me do it --- inc/redirect.h | 54 ++++++++--------- src/redirect/redirect_get_inputs.c | 7 +-- src/redirect/redirect_get_outputs.c | 81 +++++++++++++------------- src/redirect/redirect_new.c | 89 +++++++++++++++-------------- src/redirect/redirect_new_error.c | 6 +- 5 files changed, 119 insertions(+), 118 deletions(-) diff --git a/inc/redirect.h b/inc/redirect.h index 2da3c94..3a1e568 100644 --- a/inc/redirect.h +++ b/inc/redirect.h @@ -1,27 +1,27 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* redirect.h :+: :+: */ -/* +:+ */ -/* By: Quinten +#+ */ -/* +#+ */ -/* Created: 2025/02/23 12:26:29 by Quinten #+# #+# */ -/* Updated: 2025/02/23 12:26:29 by Quinten ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#ifndef REDIRECT_H -# define REDIRECT_H -# include "minishell.h" - -t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value); -void redirect_new_error(t_minishell *msh, t_list **redirects); -void redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, t_token_type type); -t_list *redirect_get_inputs(t_minishell *msh, t_list *list); -t_list *redirect_get_outputs(t_minishell *msh, t_list *list); -int redirect_is_valid(t_list *lst, t_token *token, int mode); -int redirect_token_type(t_token *token); -int redirect_is_delimiter(t_token *token); -int process_heredoc(t_minishell *msh, t_token *heredoc, t_token *delim); - -#endif +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* redirect.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/23 12:26:29 by Quinten #+# #+# */ +/* Updated: 2025/02/27 18:09:47 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef REDIRECT_H +# define REDIRECT_H +# include "minishell.h" + +t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value); +void redirect_new_error(t_minishell *msh, t_list **redirects, int flag); +int redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, t_token_type type); +t_list *redirect_get_inputs(t_minishell *msh, t_list *list); +t_list *redirect_get_outputs(t_minishell *msh, t_list *list); +int redirect_is_valid(t_list *lst, t_token *token, int mode); +int redirect_token_type(t_token *token); +int redirect_is_delimiter(t_token *token); +int process_heredoc(t_minishell *msh, t_token *heredoc, t_token *delim); + +#endif diff --git a/src/redirect/redirect_get_inputs.c b/src/redirect/redirect_get_inputs.c index 2eaabd3..75d0a10 100644 --- a/src/redirect/redirect_get_inputs.c +++ b/src/redirect/redirect_get_inputs.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/23 12:29:05 by Quinten #+# #+# */ -/* Updated: 2025/02/26 17:38:59 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 18:09:15 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,10 +39,9 @@ t_list *redirect_get_inputs(t_minishell *msh, t_list *list) } check_heredoc(msh, current, token); flag = redirect_is_valid(current, token, F_OK | R_OK); - redirect_create(msh, ¤t, &redirects, token->type); + flag && (redirect_create(msh, ¤t, &redirects, token->type)); current = current->next; } - if (flag <= 0) - redirect_new_error(msh, &redirects); + redirect_new_error(msh, &redirects, flag); return (redirects); } diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index 19a4a4e..cc4e4f5 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -1,41 +1,40 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* redirect_get_outputs.c :+: :+: */ -/* +:+ */ -/* By: Quinten +#+ */ -/* +#+ */ -/* Created: 2025/02/23 12:37:24 by Quinten #+# #+# */ -/* Updated: 2025/02/23 12:37:24 by Quinten ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -t_list *redirect_get_outputs(t_minishell *msh, t_list *list) -{ - t_list *current; - t_list *redirects; - t_token *token; - int flag; - - flag = 1; - redirects = NULL; - current = list; - token = (t_token *)current->content; - while (current && flag && !redirect_is_delimiter(token)) - { - token = (t_token *)current->content; - if (token->type != T_REDIRECT_OUT && token->type != T_APPEND_OUT) - { - current = current->next; - continue ; - } - flag = redirect_is_valid(current, token, -1); - redirect_create(msh, ¤t, &redirects, token->type); - current = current->next; - } - if (flag <= 0) - redirect_new_error(msh, &redirects); - return (redirects); -} +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* redirect_get_outputs.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/23 12:37:24 by Quinten #+# #+# */ +/* Updated: 2025/02/27 18:10:57 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_list *redirect_get_outputs(t_minishell *msh, t_list *list) +{ + t_list *current; + t_list *redirects; + t_token *token; + int flag; + + flag = 1; + redirects = NULL; + current = list; + token = (t_token *)current->content; + while (current && !redirect_is_delimiter(token)) + { + token = (t_token *)current->content; + if (token->type != T_REDIRECT_OUT && token->type != T_APPEND_OUT) + { + current = current->next; + continue; + } + flag = redirect_is_valid(current, token, -1); + flag && (redirect_create(msh, ¤t, &redirects, token->type)); + current = current->next; + } + redirect_new_error(msh, &redirects, flag); + return (redirects); +} diff --git a/src/redirect/redirect_new.c b/src/redirect/redirect_new.c index ee11cf9..79c0951 100644 --- a/src/redirect/redirect_new.c +++ b/src/redirect/redirect_new.c @@ -1,44 +1,45 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* redirect_new.c :+: :+: */ -/* +:+ */ -/* By: Quinten +#+ */ -/* +#+ */ -/* Created: 2025/02/23 12:27:33 by Quinten #+# #+# */ -/* Updated: 2025/02/23 12:27:33 by Quinten ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value) -{ - t_redirect *result; - - result = malloc_safe(msh, sizeof(t_redirect)); - result->type = type; - result->value = NULL; - if (value) - result->value = value; - return (result); -} - -void redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, -t_token_type type) -{ - t_list *new; - t_redirect *redir; - t_token *file_token; - char *file_name; - - file_token = (t_token *)((*tokens)->next->content); - file_name = NULL; - if (file_token) - file_name = ft_strdup_safe(msh, file_token->value); - redir = redirect_new(msh, type, file_name); - new = ft_lstnew_safe(msh, redir); - ft_lstadd_back(redirects, new); - if (tokens) - *tokens = (*tokens)->next; -} +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* redirect_new.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/23 12:27:33 by Quinten #+# #+# */ +/* Updated: 2025/02/27 18:11:25 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_redirect *redirect_new(t_minishell *msh, t_token_type type, char *value) +{ + t_redirect *result; + + result = malloc_safe(msh, sizeof(t_redirect)); + result->type = type; + result->value = NULL; + if (value) + result->value = value; + return (result); +} + +int redirect_create(t_minishell *msh, t_list **tokens, t_list **redirects, +t_token_type type) +{ + t_list *new; + t_redirect *redir; + t_token *file_token; + char *file_name; + + file_token = (t_token *)((*tokens)->next->content); + file_name = NULL; + if (file_token) + file_name = ft_strdup_safe(msh, file_token->value); + redir = redirect_new(msh, type, file_name); + new = ft_lstnew_safe(msh, redir); + ft_lstadd_back(redirects, new); + if (tokens) + *tokens = (*tokens)->next; + return (1); +} diff --git a/src/redirect/redirect_new_error.c b/src/redirect/redirect_new_error.c index 076e062..24cf75c 100644 --- a/src/redirect/redirect_new_error.c +++ b/src/redirect/redirect_new_error.c @@ -6,17 +6,19 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/26 17:37:12 by qmennen #+# #+# */ -/* Updated: 2025/02/26 17:44:49 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 18:07:25 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void redirect_new_error(t_minishell *msh, t_list **redirects) +void redirect_new_error(t_minishell *msh, t_list **redirects, int flag) { t_list *new; t_redirect *redir; + if (flag) + return ; redir = redirect_new(msh, T_ERROR, NULL); new = ft_lstnew_safe(msh, redir); ft_lstadd_back(redirects, new); From 0d555a5480ea48789d528a89c5fc21f3215d9707 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 18:12:13 +0100 Subject: [PATCH 093/103] norminette okay again --- src/redirect/redirect_get_outputs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/redirect/redirect_get_outputs.c b/src/redirect/redirect_get_outputs.c index cc4e4f5..0ad2f2d 100644 --- a/src/redirect/redirect_get_outputs.c +++ b/src/redirect/redirect_get_outputs.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/23 12:37:24 by Quinten #+# #+# */ -/* Updated: 2025/02/27 18:10:57 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 18:12:04 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ t_list *redirect_get_outputs(t_minishell *msh, t_list *list) if (token->type != T_REDIRECT_OUT && token->type != T_APPEND_OUT) { current = current->next; - continue; + continue ; } flag = redirect_is_valid(current, token, -1); flag && (redirect_create(msh, ¤t, &redirects, token->type)); From f33d88642d36a06b8b93f0934b205ee6a2cb8df1 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 18:12:53 +0100 Subject: [PATCH 094/103] details --- src/executor/executor_child.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/executor/executor_child.c b/src/executor/executor_child.c index 7f88381..1e64f47 100644 --- a/src/executor/executor_child.c +++ b/src/executor/executor_child.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/12 21:25:10 by willem #+# #+# */ -/* Updated: 2025/02/27 16:51:43 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 18:12:48 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,7 +44,7 @@ void executor_child(t_minishell *msh, t_command *command) ft_putstr_fd(RED BOLD, 2); ft_putstr_fd("minishell: ", 2); ft_putstr_fd(command->args[0], 2); - ft_putstr_fd(": " RESET "is a directory\n", 2); + ft_putstr_fd(": " RESET "Is a directory\n", 2); } execve(path, command->args, environment_get_arr(msh)); } From 15b7de994e4059bd07799964d84b8a20d833dcac Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 18:48:41 +0100 Subject: [PATCH 095/103] WAY better quote handling --- src/lexer/lexer_read_word.c | 51 ++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 78c50f4..9a601b5 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -1,17 +1,33 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* lexer_read_word.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/26 16:13:59 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* lexer_read_word.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ +/* Updated: 2025/02/27 18:47:33 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +static int match_quotes(t_minishell *msh, t_lexer *lexer) +{ + int i; + int qts; + + i = lexer->pos; + qts = 0; + while (lexer->input[i]) + { + if (lexer->input[i] == '\'' || lexer->input[i] == '"') + qts++; + i++; + } + return ((qts % 2) == 0); +} + static char *parse_quotes(t_minishell *msh, t_lexer *lexer) { int start; @@ -28,13 +44,7 @@ static char *parse_quotes(t_minishell *msh, t_lexer *lexer) len = lexer->pos - start; word = malloc_safe(msh, sizeof(char) * len + 1); ft_strlcpy(word, lexer->input + start, len + 1); - if (lexer->current_char == qc) - lexer_readchar(lexer); - else - { - free_safe(msh, (void **)&word); - return (NULL); - } + lexer_readchar(lexer); return (word); } @@ -43,18 +53,19 @@ char *lexer_readword(t_minishell *msh, t_lexer *lexer) int start; int len; char *word; + char c; start = lexer->pos; + if (!match_quotes(msh, lexer)) + return (NULL); if (lexer->current_char == '"' || lexer->current_char == '\'') - { return (parse_quotes(msh, lexer)); - } - while (ft_isprint(lexer->current_char) && lexer->current_char != '<' - && lexer->current_char != '>' && lexer->current_char != '|' - && lexer->current_char != '\0' && !ft_isspace(lexer->current_char) - && lexer->current_char != '"' && lexer->current_char != '\'') + c = lexer->current_char; + while (ft_isprint(c) && c != '<' &&c != '>' && c != '|' && c != '\0' + && !ft_isspace(lexer->current_char)) { lexer_readchar(lexer); + c = lexer->current_char; } len = lexer->pos - start; word = malloc_safe(msh, sizeof(char) * len + 1); From efd4d3f751fa6541cae4a53d018cbadc585af80d Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 18:49:04 +0100 Subject: [PATCH 096/103] extract token conversion funcs --- inc/tokenizer.h | 26 +++++++------- src/token/token_char_convert.c | 38 +++++++++++++++++++++ src/token/token_parse.c | 62 +++++----------------------------- src/token/token_type_convert.c | 32 ++++++++++++++++++ 4 files changed, 93 insertions(+), 65 deletions(-) create mode 100644 src/token/token_char_convert.c create mode 100644 src/token/token_type_convert.c diff --git a/inc/tokenizer.h b/inc/tokenizer.h index cfd415e..42ed9e1 100644 --- a/inc/tokenizer.h +++ b/inc/tokenizer.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* tokenizer.h :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ -/* Updated: 2025/02/26 15:45:26 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* tokenizer.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ +/* Updated: 2025/02/27 18:27:33 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,10 +24,12 @@ t_list *ft_parse_input(t_minishell *msh); /** * Token */ -t_token *ft_token_next(t_minishell *msh, t_lexer *lexer); -t_token *token_new(t_minishell *msh, t_token_type type, char *c, int pos); -void ft_token_free(t_minishell *msh, t_token *token); -void ft_clear_tokenlist(t_minishell *msh, void *content); -t_token *token_parse(t_minishell *msh, t_lexer *lexer); +t_token *ft_token_next(t_minishell *msh, t_lexer *lexer); +t_token *token_new(t_minishell *msh, t_token_type type, char *c, int pos); +void ft_token_free(t_minishell *msh, t_token *token); +void ft_clear_tokenlist(t_minishell *msh, void *content); +t_token *token_parse(t_minishell *msh, t_lexer *lexer); +char *token_type_convert(t_token_type type); +t_token_type token_char_convert(char c, int is_double); #endif // TOKENIZER_H diff --git a/src/token/token_char_convert.c b/src/token/token_char_convert.c new file mode 100644 index 0000000..fbfd1f5 --- /dev/null +++ b/src/token/token_char_convert.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* token_char_convert.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/27 18:25:34 by qmennen #+# #+# */ +/* Updated: 2025/02/27 18:28:13 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +# include "minishell.h" + +t_token_type token_char_convert(char c, int is_double) +{ + if (c == '<') + { + if (is_double) + return (T_HEREDOC); + return (T_REDIRECT_IN); + } + else if (c == '>') + { + if (is_double) + return (T_APPEND_OUT); + return (T_REDIRECT_OUT); + } + else if (c == '&' && is_double) + return (T_AND); + else if (c == '|') + { + if (is_double) + return (T_OR); + return (T_PIPE); + } + return (T_ERROR); +} diff --git a/src/token/token_parse.c b/src/token/token_parse.c index f18eb52..5974479 100644 --- a/src/token/token_parse.c +++ b/src/token/token_parse.c @@ -1,61 +1,17 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* token_parse.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/02/05 19:10:17 by qmennen #+# #+# */ -/* Updated: 2025/02/26 16:15:19 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* token_parse.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 19:10:17 by qmennen #+# #+# */ +/* Updated: 2025/02/27 18:27:40 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -static t_token_type token_from_char(char c, int is_double) -{ - if (c == '<') - { - if (is_double) - return (T_HEREDOC); - return (T_REDIRECT_IN); - } - else if (c == '>') - { - if (is_double) - return (T_APPEND_OUT); - return (T_REDIRECT_OUT); - } - else if (c == '&' && is_double) - return (T_AND); - else if (c == '|') - { - if (is_double) - return (T_OR); - return (T_PIPE); - } - return (T_ERROR); -} - -static char *char_from_type(t_token_type type) -{ - if (type == T_HEREDOC) - return ("<<"); - else if (type == T_REDIRECT_IN) - return ("<"); - else if (type == T_APPEND_OUT) - return (">>"); - else if (type == T_REDIRECT_OUT) - return (">"); - else if (type == T_AND) - return ("&&"); - else if (type == T_OR) - return ("||"); - else if (type == T_PIPE) - return ("|"); - return (NULL); -} - t_token *token_parse(t_minishell *msh, t_lexer *lexer) { int is_double; @@ -65,8 +21,8 @@ t_token *token_parse(t_minishell *msh, t_lexer *lexer) c = lexer->current_char; is_double = lexer->input[lexer->pos + 1] == c; - type = token_from_char(c, is_double); - token = token_new(msh, type, char_from_type(type), lexer->pos); + type = token_char_convert(c, is_double); + token = token_new(msh, type, token_type_convert(type), lexer->pos); if (is_double) lexer_readchar(lexer); lexer_readchar(lexer); diff --git a/src/token/token_type_convert.c b/src/token/token_type_convert.c new file mode 100644 index 0000000..c42e681 --- /dev/null +++ b/src/token/token_type_convert.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* token_type_convert.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/27 18:25:34 by qmennen #+# #+# */ +/* Updated: 2025/02/27 18:26:40 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +# include "minishell.h" + +char *token_type_convert(t_token_type type) +{ + if (type == T_HEREDOC) + return ("<<"); + else if (type == T_REDIRECT_IN) + return ("<"); + else if (type == T_APPEND_OUT) + return (">>"); + else if (type == T_REDIRECT_OUT) + return (">"); + else if (type == T_AND) + return ("&&"); + else if (type == T_OR) + return ("||"); + else if (type == T_PIPE) + return ("|"); + return (NULL); +} From 547dacc0ba445dac7c95d711e4dc4443d0794879 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 18:59:00 +0100 Subject: [PATCH 097/103] small fix --- src/parser/parser_get_arguments.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/parser/parser_get_arguments.c b/src/parser/parser_get_arguments.c index b0f2033..1ce6230 100644 --- a/src/parser/parser_get_arguments.c +++ b/src/parser/parser_get_arguments.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/11 16:20:09 by qmennen #+# #+# */ -/* Updated: 2025/02/26 18:35:27 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 18:58:48 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,13 +34,23 @@ static int count_cmds(t_list *list) static int parser_should_expand(t_list *value) { t_token *token; + int i; token = (t_token *)value->content; if (!token) return (0); - return ((token->type == T_DQWORD && ft_strchr(token->value, '$')) - || (token->type == T_WORD - && token->value[0] == '$' + i = 0; + if (token->type == T_DQWORD) + { + while (token->value[i]) + { + if (token->value[i] == '$' && !expander_character_valid(token->value[i + 1])) + return (0); + i++; + } + return (1); + } + return ((token->type == T_WORD && token->value[0] == '$' && token->value[1])); } From 48256b2c814713763502152873bb7dbe00f0905d Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 19:04:02 +0100 Subject: [PATCH 098/103] extracting more --- inc/tokenizer.h | 3 ++- src/lexer/lexer_parse_quotes.c | 33 +++++++++++++++++++++++++++++++++ src/lexer/lexer_read_word.c | 24 ++---------------------- 3 files changed, 37 insertions(+), 23 deletions(-) create mode 100644 src/lexer/lexer_parse_quotes.c diff --git a/inc/tokenizer.h b/inc/tokenizer.h index 42ed9e1..bab22bf 100644 --- a/inc/tokenizer.h +++ b/inc/tokenizer.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ -/* Updated: 2025/02/27 18:27:33 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 19:03:09 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,7 @@ void ft_lexer_free(t_minishell *msh, t_lexer *lexer); void lexer_readchar(t_lexer *lexer); char *lexer_readword(t_minishell *msh, t_lexer *lexer); t_list *ft_parse_input(t_minishell *msh); +char *lexer_parse_quotes(t_minishell *msh, t_lexer *lexer); /** * Token */ diff --git a/src/lexer/lexer_parse_quotes.c b/src/lexer/lexer_parse_quotes.c new file mode 100644 index 0000000..0edf290 --- /dev/null +++ b/src/lexer/lexer_parse_quotes.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_parse_quotes.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/27 19:02:37 by qmennen #+# #+# */ +/* Updated: 2025/02/27 19:02:54 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *lexer_parse_quotes(t_minishell *msh, t_lexer *lexer) +{ + int start; + int len; + char qc; + char *word; + + qc = lexer->current_char; + word = NULL; + lexer_readchar(lexer); + start = lexer->pos; + while (lexer->current_char != '\0' && lexer->current_char != qc) + lexer_readchar(lexer); + len = lexer->pos - start; + word = malloc_safe(msh, sizeof(char) * len + 1); + ft_strlcpy(word, lexer->input + start, len + 1); + lexer_readchar(lexer); + return (word); +} diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 9a601b5..8c0b996 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/27 18:47:33 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 19:03:15 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,26 +28,6 @@ static int match_quotes(t_minishell *msh, t_lexer *lexer) return ((qts % 2) == 0); } -static char *parse_quotes(t_minishell *msh, t_lexer *lexer) -{ - int start; - int len; - char qc; - char *word; - - qc = lexer->current_char; - word = NULL; - lexer_readchar(lexer); - start = lexer->pos; - while (lexer->current_char != '\0' && lexer->current_char != qc) - lexer_readchar(lexer); - len = lexer->pos - start; - word = malloc_safe(msh, sizeof(char) * len + 1); - ft_strlcpy(word, lexer->input + start, len + 1); - lexer_readchar(lexer); - return (word); -} - char *lexer_readword(t_minishell *msh, t_lexer *lexer) { int start; @@ -59,7 +39,7 @@ char *lexer_readword(t_minishell *msh, t_lexer *lexer) if (!match_quotes(msh, lexer)) return (NULL); if (lexer->current_char == '"' || lexer->current_char == '\'') - return (parse_quotes(msh, lexer)); + return (lexer_parse_quotes(msh, lexer)); c = lexer->current_char; while (ft_isprint(c) && c != '<' &&c != '>' && c != '|' && c != '\0' && !ft_isspace(lexer->current_char)) From e07d4b4d79a91b6a3c8075ab50476e3af0918a27 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 19:21:05 +0100 Subject: [PATCH 099/103] last rework for the day, hello""world now read helloworld correctly --- src/lexer/lexer_read_word.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 8c0b996..7eb8a2a 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/27 19:03:15 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 19:20:22 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,22 @@ static int match_quotes(t_minishell *msh, t_lexer *lexer) return ((qts % 2) == 0); } +static int calculate_word_len(t_minishell *msh, t_lexer *lexer) +{ + int i; + int len; + + len = 1; + i = lexer->pos; + while (ft_isprint(lexer->input[i]) && lexer->input[i] != '<' && lexer->input[i]!= '>' && lexer->input[i] != '|' && lexer->input[i] != '\0' && !ft_isspace(lexer->input[i])) + { + if(lexer->input[i] != '\'' && lexer->input[i] != '"') + len++; + i++; + } + return (len); +} + char *lexer_readword(t_minishell *msh, t_lexer *lexer) { int start; @@ -40,15 +56,17 @@ char *lexer_readword(t_minishell *msh, t_lexer *lexer) return (NULL); if (lexer->current_char == '"' || lexer->current_char == '\'') return (lexer_parse_quotes(msh, lexer)); + len = calculate_word_len(msh, lexer); + word = malloc_safe(msh, sizeof(char) * len); c = lexer->current_char; - while (ft_isprint(c) && c != '<' &&c != '>' && c != '|' && c != '\0' - && !ft_isspace(lexer->current_char)) + len = 0; + while (ft_isprint(c) && c != '<' && c != '>' && c != '|' && c != '\0' && !ft_isspace(c)) { + if(c != '\'' && c != '"') + word[len++] = lexer->current_char; lexer_readchar(lexer); c = lexer->current_char; } - len = lexer->pos - start; - word = malloc_safe(msh, sizeof(char) * len + 1); - ft_strlcpy(word, lexer->input + start, len + 1); + word[len] = 0; return (word); } From 2d9b35d12784292e56e30a332bcc80b877f04092 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 19:22:23 +0100 Subject: [PATCH 100/103] ofc last minute bug --- src/lexer/lexer_read_word.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 7eb8a2a..23404fc 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/27 19:20:22 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 19:22:09 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,17 +15,21 @@ static int match_quotes(t_minishell *msh, t_lexer *lexer) { int i; - int qts; + int d_qts; + int s_qts; i = lexer->pos; - qts = 0; + d_qts = 0; + s_qts = 0; while (lexer->input[i]) { - if (lexer->input[i] == '\'' || lexer->input[i] == '"') - qts++; + if (lexer->input[i] == '\'') + s_qts++; + if (lexer->input[i] == '\'') + d_qts++; i++; } - return ((qts % 2) == 0); + return ((s_qts % 2) == 0 && (d_qts % 2) == 0); } static int calculate_word_len(t_minishell *msh, t_lexer *lexer) From d13fb174c5b11afa59db6f5348bc33572f316088 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 19:29:49 +0100 Subject: [PATCH 101/103] quote parsing, love it --- src/lexer/lexer_parse_quotes.c | 10 ++++++++-- src/lexer/lexer_read_word.c | 21 ++++++++++++++------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/lexer/lexer_parse_quotes.c b/src/lexer/lexer_parse_quotes.c index 0edf290..09010f9 100644 --- a/src/lexer/lexer_parse_quotes.c +++ b/src/lexer/lexer_parse_quotes.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/27 19:02:37 by qmennen #+# #+# */ -/* Updated: 2025/02/27 19:02:54 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 19:26:35 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,12 @@ char *lexer_parse_quotes(t_minishell *msh, t_lexer *lexer) len = lexer->pos - start; word = malloc_safe(msh, sizeof(char) * len + 1); ft_strlcpy(word, lexer->input + start, len + 1); - lexer_readchar(lexer); + if (lexer->current_char == qc) + lexer_readchar(lexer); + else + { + free_safe(msh, (void **)&word); + return (NULL); + } return (word); } diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 23404fc..45d234f 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/27 19:22:09 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 19:28:50 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,20 +14,23 @@ static int match_quotes(t_minishell *msh, t_lexer *lexer) { - int i; - int d_qts; - int s_qts; + char c; + int i; + int d_qts; + int s_qts; i = lexer->pos; + c = lexer->input[i]; d_qts = 0; s_qts = 0; - while (lexer->input[i]) + while (ft_isprint(c) && c != '<' && c != '>' && c != '|' && c != '\0' && !ft_isspace(c)) { if (lexer->input[i] == '\'') s_qts++; if (lexer->input[i] == '\'') d_qts++; i++; + c = lexer->input[i]; } return ((s_qts % 2) == 0 && (d_qts % 2) == 0); } @@ -56,10 +59,14 @@ char *lexer_readword(t_minishell *msh, t_lexer *lexer) char c; start = lexer->pos; + + if (lexer->current_char == '"' || lexer->current_char == '\'') + { + return (lexer_parse_quotes(msh, lexer)); + + } if (!match_quotes(msh, lexer)) return (NULL); - if (lexer->current_char == '"' || lexer->current_char == '\'') - return (lexer_parse_quotes(msh, lexer)); len = calculate_word_len(msh, lexer); word = malloc_safe(msh, sizeof(char) * len); c = lexer->current_char; From 20e71efa5f7749c536f791a1408cab2786dc9af8 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Thu, 27 Feb 2025 19:30:16 +0100 Subject: [PATCH 102/103] quick todo --- src/lexer/lexer_read_word.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lexer/lexer_read_word.c b/src/lexer/lexer_read_word.c index 45d234f..bb12c8d 100644 --- a/src/lexer/lexer_read_word.c +++ b/src/lexer/lexer_read_word.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/05 19:03:47 by qmennen #+# #+# */ -/* Updated: 2025/02/27 19:28:50 by qmennen ### ########.fr */ +/* Updated: 2025/02/27 19:30:09 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,7 @@ static int match_quotes(t_minishell *msh, t_lexer *lexer) c = lexer->input[i]; d_qts = 0; s_qts = 0; + //TODO: Normalize this validation. Happens a lot while (ft_isprint(c) && c != '<' && c != '>' && c != '|' && c != '\0' && !ft_isspace(c)) { if (lexer->input[i] == '\'') From 8d6a2795c40529a8c665de56cbc18fcc366183e5 Mon Sep 17 00:00:00 2001 From: whaffman Date: Fri, 28 Feb 2025 01:10:40 +0100 Subject: [PATCH 103/103] README --- README.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index deeb689..249e0c5 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,14 @@ A lot of amazing shell stuff - libreadline-dev - libncurses-dev +## Edge Cases +- `cat $PWD/test` should expand, +- `cd -` : `bash: cd: OLDPWD not set` +- `cd ~` : does not expand ? + + + + ## TODO - [x] Find absolute path for command input ('/', './', 'cmd') - [x]Add heredoc to tokenizer @@ -27,15 +35,15 @@ A lot of amazing shell stuff ) - [x] Make the `executor`, run a command - [x] Make a parser to create a command list -- Add redirects, appends, pipe etc. File descriptor functions +- [x] Add redirects, appends, pipe etc. File descriptor functions a command can have multiple redirects but only the last is used for stdout Redirects take precedence over pipes, but pipes are still created and managed. should it close the unused pipe-end? all redirects are opened and closed, but only last fd is used. multiple HEREDOCs can be nested, only last is used. -- Expand \$ vars & support \$? - * $var [x] - * $? [0] +- [x] Expand \$ vars & support \$? + * [x] $var + * [0] $? - CB command to change banner - __Bonus:__ Command tree for &&, ||, *