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); +}