Free_safe implemented, ft_lstnew_safe and ft_lstclear_safe added

ft_strdup_safe added
ft_strjoin_safe added
This commit is contained in:
whaffman 2025-02-25 16:55:13 +01:00
parent 07f48cfc62
commit 91cb0af6ef
31 changed files with 285 additions and 177 deletions

View File

@ -18,5 +18,6 @@
void print_commands(void *param); void print_commands(void *param);
void token_print(void *param); void token_print(void *param);
void print_redirects(void *param); void print_redirects(void *param);
void print_freelist(t_minishell *minishell);
#endif #endif

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/05 12:36:00 by whaffman #+# #+# */ /* 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 * Lexer
*/ */
t_lexer *ft_lexer_new(t_minishell *minishell); 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); void lexer_readchar(t_lexer *lexer);
char *lexer_readword(t_minishell *minishell, t_lexer *lexer); char *lexer_readword(t_minishell *minishell, t_lexer *lexer);
t_list *ft_parse_input(t_minishell *minishell); 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 *ft_token_next(t_minishell *minishell, t_lexer *lexer);
t_token *token_new(t_minishell *minishell, t_token_type type, char *c, int pos); t_token *token_new(t_minishell *minishell, t_token_type type, char *c, int pos);
void ft_token_free(t_token *token); void ft_token_free(t_minishell *minishell, t_token *token);
void ft_clear_tokenlist(void *content); void ft_clear_tokenlist(t_minishell *minishell, void *content);
t_token *token_parse(t_minishell *minishell, t_lexer *lexer); t_token *token_parse(t_minishell *minishell, t_lexer *lexer);
#endif // TOKENIZER_H #endif // TOKENIZER_H

View File

@ -15,7 +15,7 @@
void free_minishell_line(t_minishell *minishell); 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); void free_command_list(t_minishell *minishell, void *content);
t_minishell *init_minishell(void); t_minishell *init_minishell(void);
void print_banner(void); void print_banner(void);
void print_list(void *content); void print_list(void *content);
@ -23,8 +23,13 @@ void simple_builtins(t_minishell *minishell);
void error_msg(char *func, char *msg); void error_msg(char *func, char *msg);
void check_malloc(t_minishell *minishell, void *ptr); void check_malloc(t_minishell *minishell, void *ptr);
char *ft_strdup_safe(t_minishell *minishell, const char *str); 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 *malloc_safe(t_minishell *minishell, size_t size);
void free_safe(t_minishell *minishell, void **ptr); 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 #endif // UTILS_H

View File

@ -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 \ free_token_list.c free_minishell.c free_minishell_line.c \
init_minishell.c check_malloc.c error_msg.c free_command_list.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 \ 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 \ malloc_safe.c free_safe.c ft_lstclear_safe.c ft_lstnew_safe.c \
lexer_parse_input.c lexer_new.c lexer_read_word.c token_new.c \ lexer_read_char.c lexer_token_next.c lexer_parse_input.c lexer_new.c \
token_parse.c environment_free.c environment_del.c \ lexer_read_word.c token_new.c token_parse.c environment_free.c \
environment_free_list.c environment_get.c environment_parse.c \ environment_del.c environment_free_list.c environment_get.c \
environment_add.c environment_get_arr.c environment_print.c \ environment_parse.c environment_add.c environment_get_arr.c \
executor_close_fds.c executor_child.c executor_fork.c \ environment_print.c executor_close_fds.c executor_child.c \
executor_absolute_path.c executor_execute_pipeline.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_count_fds.c executor_create_redirects.c executor_open_fds.c \
executor_create_pipes.c parser_get_arguments.c parser_new_command.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_expand_dollar.c expander_get_variable.c \
expander_is_character.c expander_parse_variables.c \ expander_is_character.c expander_parse_variables.c \
expander_parse_string.c expander_allocate_memory.c builtin_cd.c \ expander_parse_string.c expander_allocate_memory.c builtin_cd.c \

View File

@ -6,7 +6,7 @@
/* By: whaffman <whaffman@student.codam.nl> +#+ */ /* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/20 11:32:59 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]); exit_status = ft_atoi(cmd->args[1]);
} }
//free_minishell(&minishell); //print_freelist(minishell);
free_minishell(&minishell);
exit(exit_status); exit(exit_status);
return (FAILURE); return (FAILURE);
} }

View File

@ -6,7 +6,7 @@
/* By: whaffman <whaffman@student.codam.nl> +#+ */ /* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/20 11:32:53 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) if (env != NULL)
{ {
free_safe(minishell, (void **)&(env->value)); free_safe(minishell, (void **)&(env->value));
env->value = ft_strdup(arr[1]); //TODO: malloc check env->value = ft_strdup_safe(minishell, arr[1]);
} }
else else
environment_add(minishell, arr[0], arr[1]); environment_add(minishell, arr[0], arr[1]);

View File

@ -0,0 +1,28 @@
/* ************************************************************************** */
/* */
/* :::::::: */
/* print_freelist.c :+: :+: */
/* +:+ */
/* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */
/* 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;
}
}

View File

@ -6,7 +6,7 @@
/* By: whaffman <whaffman@student.codam.nl> +#+ */ /* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/04 16:13:33 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)); new_environment = malloc_safe(minishell, sizeof(t_environment));
if (new_environment == NULL) if (new_environment == NULL)
return (perror("malloc")); return (perror("malloc"));
new_environment->name = ft_strdup(name); new_environment->name = ft_strdup_safe(minishell, name);
new_environment->value = ft_strdup(value); new_environment->value = ft_strdup_safe(minishell, value);
new_node = ft_lstnew(new_environment); new_node = ft_lstnew_safe(minishell, new_environment);
if (new_node == NULL if (new_node == NULL
|| new_environment->name == NULL || new_environment->name == NULL
|| new_environment->value == NULL) || new_environment->value == NULL)

View File

@ -6,7 +6,7 @@
/* By: willem <willem@student.codam.nl> +#+ */ /* By: willem <willem@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/08 17:00:24 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) if (access(cmd, F_OK) == 0)
{ {
executable = ft_strdup(cmd); executable = ft_strdup_safe(minishell, cmd);
if (!executable) if (!executable)
return (NULL); return (NULL);
return (executable); return (executable);

View File

@ -6,13 +6,13 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/18 19:00:35 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" #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 *current;
t_list *last; t_list *last;
@ -22,7 +22,7 @@ static void free_variables(t_list *variables)
{ {
last = current; last = current;
current = current->next; 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 //TODO: Figure out why echo "> echo "\as"" breaks
string[j] = 0; string[j] = 0;
free_variables(variables); free_variables(minishell, variables);
return (string); return (string);
} }

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */ /* ************************************************************************** */
/* */ /* */
/* ::: :::::::: */ /* :::::::: */
/* expander_parse_variables.c :+: :+: :+: */ /* expander_parse_variables.c :+: :+: */
/* +:+ +:+ +:+ */ /* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+ */
/* Created: 2025/02/19 13:58:13 by qmennen #+# #+# */ /* Created: 2025/02/19 13:58:13 by qmennen #+# #+# */
/* Updated: 2025/02/19 15:07:23 by qmennen ### ########.fr */ /* 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); env = expander_get_var(s, i + 1, minishell);
if (env) if (env)
ft_lstadd_back(&var_list, ft_lstnew(env)); ft_lstadd_back(&var_list, ft_lstnew_safe(minishell, env));
else else
ft_lstadd_back(&var_list, ft_lstnew(NULL)); ft_lstadd_back(&var_list, ft_lstnew_safe(minishell, NULL));
} }
i++; i++;
} }

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/05 19:03:01 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; t_lexer *lexer;
input = minishell->line; input = minishell->line;
lexer = malloc_safe(minishell, sizeof(t_lexer)); lexer = malloc_safe(minishell, sizeof(t_lexer));
lexer->input = ft_strdup(input); lexer->input = ft_strdup_safe(minishell, input);
lexer->pos = 0; lexer->pos = 0;
lexer->n_pos = 1; lexer->n_pos = 1;
lexer->current_char = '\0'; lexer->current_char = '\0';

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/05 19:09:20 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); 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) //TODO T_ERROR removes the inf loop
break ; 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); return (list);
} }

View File

@ -37,7 +37,7 @@ int main(int argc, char **argv, char **envp)
simple_builtins(minishell); simple_builtins(minishell);
free_minishell_line(minishell); free_minishell_line(minishell);
} }
ft_lstclear(&minishell->commands, free_command_list); ft_lstclear_safe(minishell, &minishell->commands, free_command_list);
free_minishell(&minishell); free_minishell(&minishell);
return (EXIT_SUCCESS); return (EXIT_SUCCESS);
} }

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/11 16:20:09 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 || else if (((t_token *)current->content)->type == T_WORD ||
((t_token *)current->content)->type == T_SQWORD) ((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; current = current->next;
} }
args[i] = 0; args[i] = 0;

View File

@ -31,11 +31,11 @@ t_list *parser_get_commands(t_minishell *minishell)
while (current) while (current)
{ {
token = (t_token *) current->content; 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->args = parser_get_arguments(current, minishell);
command->redirect_in = redirect_get_inputs(minishell, current); command->redirect_in = redirect_get_inputs(minishell, current);
command->redirect_out = redirect_get_outputs(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)) while (current && is_command_token((t_token *)current->content))
current = current->next; current = current->next;
if (current && ((t_token *)current->content)->type >= 3) if (current && ((t_token *)current->content)->type >= 3)

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/04 16:13:08 by whaffman #+# #+# */ /* 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 else
ft_strlcpy(result, cwd, len); ft_strlcpy(result, cwd, len);
free_safe(minishell, (void **)&cwd); free(cwd);
return (result); return (result);
} }
@ -80,15 +80,10 @@ char *get_path(t_minishell *minishell)
return (NULL); return (NULL);
len = ft_strlen(cwd) + ft_strlen(BLUE RESET "> ") + 1; len = ft_strlen(cwd) + ft_strlen(BLUE RESET "> ") + 1;
result = malloc_safe(minishell, len); result = malloc_safe(minishell, len);
if (result == NULL)
{
perror("malloc");
return (free(cwd), NULL);
}
ft_strlcpy(result, BLUE, len); ft_strlcpy(result, BLUE, len);
ft_strlcat(result, cwd, len); ft_strlcat(result, cwd, len);
ft_strlcat(result, RESET "> ", len); ft_strlcat(result, RESET "> ", len);
free(cwd); free_safe(minishell,(void **) &cwd);
return (result); return (result);
} }
@ -105,7 +100,7 @@ char *ft_prompt(t_minishell *minishell)
user = get_user(minishell); user = get_user(minishell);
if (user == NULL) if (user == NULL)
return (free(cwd), NULL); return (free(cwd), NULL);
prompt = ft_strjoin(user, cwd); prompt = ft_strjoin_safe(minishell, user, cwd);
if (prompt == NULL) if (prompt == NULL)
{ {
perror("malloc"); perror("malloc");

View File

@ -32,15 +32,16 @@ t_list *redirect_get_inputs(t_minishell *minishell, t_list *list)
} }
if (redirect_is_valid(current, token)) if (redirect_is_valid(current, token))
{ {
ft_lstadd_front(&redirects, ft_lstnew( ft_lstadd_front(&redirects, ft_lstnew_safe(minishell,
redirect_new(minishell, token->type, redirect_new(minishell, token->type,
ft_strdup(((t_token *)current->next->content)->value)))); ft_strdup_safe(minishell,
((t_token *)current->next->content)->value))));
current = current->next; current = current->next;
continue ; continue ;
} }
else else
{ {
ft_lstadd_front(&redirects, ft_lstnew(redirect_new(minishell, T_ERROR, NULL))); ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, T_ERROR, NULL)));
break ; break ;
} }
current = current->next; current = current->next;

View File

@ -32,13 +32,14 @@ t_list *redirect_get_outputs(t_minishell *minishell, t_list *list)
} }
if (redirect_is_valid(current, token)) 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)))); 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; current = current->next;
continue ; continue ;
} }
else else
{ {
ft_lstadd_front(&redirects, ft_lstnew(redirect_new(minishell, T_ERROR, NULL))); ft_lstadd_front(&redirects, ft_lstnew_safe(minishell, redirect_new(minishell, T_ERROR, NULL)));
break ; break ;
} }
current = current->next; current = current->next;

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/05 19:10:49 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->type = type;
token->position = pos; token->position = pos;
if (c) if (c)
token->value = ft_strdup(c); token->value = ft_strdup_safe(minishell, c);
else else
token->value = NULL; token->value = NULL;
return (token); return (token);

View File

@ -15,6 +15,8 @@
void check_malloc(t_minishell *minishell, void *ptr) void check_malloc(t_minishell *minishell, void *ptr)
{ {
t_list *new;
if (ptr == NULL) if (ptr == NULL)
{ {
error_msg("malloc", "can't allocate memory"); error_msg("malloc", "can't allocate memory");
@ -23,6 +25,14 @@ void check_malloc(t_minishell *minishell, void *ptr)
} }
else 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);
} }
} }

View File

@ -12,20 +12,20 @@
#include "minishell.h" #include "minishell.h"
static void free_args(char **args) static void free_args(t_minishell *minishell, char **args)
{ {
int i; int i;
i = 0; i = 0;
while (args[i]) while (args[i])
{ {
free(args[i]); free_safe(minishell, (void **)&args[i]);
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_redirect *redir;
t_list *current; t_list *current;
@ -37,26 +37,26 @@ static void free_redirects(t_list *lst)
last = current; last = current;
redir = (t_redirect *)current->content; redir = (t_redirect *)current->content;
if (redir && redir->value) if (redir && redir->value)
free(redir->value); free_safe(minishell, (void **)&redir->value);
if (redir) if (redir)
free(redir); free_safe(minishell, (void **)&redir);
current = current->next; 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; t_command *command;
command = (t_command *)content; command = (t_command *)content;
if (command->command) if (command->command)
free(command->command); free_safe(minishell, (void **)&(command->command));
if (command->args) if (command->args)
free_args(command->args); free_args(minishell, command->args);
if (command->redirect_in) if (command->redirect_in)
free_redirects(command->redirect_in); free_redirects(minishell, command->redirect_in);
if (command->redirect_out) if (command->redirect_out)
free_redirects(command->redirect_out); free_redirects(minishell, command->redirect_out);
free(command); free_safe(minishell, (void **)&command);
} }

View File

@ -6,7 +6,7 @@
/* By: whaffman <whaffman@student.codam.nl> +#+ */ /* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/25 13:23:30 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) 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;
} }

View File

@ -1,20 +1,20 @@
/* ************************************************************************** */ /* ************************************************************************** */
/* */ /* */
/* ::: :::::::: */ /* :::::::: */
/* free_lexer.c :+: :+: :+: */ /* free_lexer.c :+: :+: */
/* +:+ +:+ +:+ */ /* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+ */
/* Created: 2025/02/05 19:07:01 by qmennen #+# #+# */ /* Created: 2025/02/05 19:07:01 by qmennen #+# #+# */
/* Updated: 2025/02/05 19:07:18 by qmennen ### ########.fr */ /* Updated: 2025/02/25 16:16:01 by whaffman ######## odam.nl */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "minishell.h" #include "minishell.h"
void ft_lexer_free(t_lexer *lexer) void ft_lexer_free(t_minishell *minishell, t_lexer *lexer)
{ {
if (lexer->input) if (lexer->input)
free(lexer->input); free_safe(minishell, (void **)&(lexer->input));
free(lexer); free_safe(minishell, (void **)&lexer);
} }

View File

@ -6,7 +6,7 @@
/* By: whaffman <whaffman@student.codam.nl> +#+ */ /* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/05 16:03:57 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) void free_minishell(t_minishell **minishell)
{ {
if ((*minishell)->line) // if ((*minishell)->line)
free_minishell_line(*minishell); // free_minishell_line(*minishell);
if ((*minishell)->environment) // if ((*minishell)->environment)
environment_free_list(*minishell); // environment_free_list(*minishell);
free(minishell); free_freelist(*minishell);
free(*minishell);
*minishell = NULL; *minishell = NULL;
} }

View File

@ -6,7 +6,7 @@
/* By: whaffman <whaffman@student.codam.nl> +#+ */ /* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/05 16:01:44 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) if (minishell->line)
free_safe(minishell, (void **)&(minishell->line)); free_safe(minishell, (void **)&(minishell->line));
if (minishell->lexer) if (minishell->lexer)
ft_lexer_free(minishell->lexer); ft_lexer_free(minishell, minishell->lexer);
if (minishell->tokens) if (minishell->tokens)
ft_lstclear(&minishell->tokens, ft_clear_tokenlist); ft_lstclear_safe(minishell, &minishell->tokens, ft_clear_tokenlist);
if (minishell->commands) if (minishell->commands)
ft_lstclear(&minishell->commands, free_command_list); ft_lstclear_safe(minishell, &minishell->commands, free_command_list);
} }

View File

@ -6,7 +6,7 @@
/* By: whaffman <whaffman@student.codam.nl> +#+ */ /* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */ /* +#+ */
/* Created: 2025/02/25 15:09:34 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; minishell->freelist = current->next;
free(*ptr); free(*ptr);
free(current); free(current);
break ; return;
} }
prev = current; prev = current;
current = current->next; current = current->next;
} }
error_msg("free_safe", "pointer not found in freelist");
} }
*ptr = NULL; *ptr = NULL;
} }

View File

@ -1,20 +1,20 @@
/* ************************************************************************** */ /* ************************************************************************** */
/* */ /* */
/* ::: :::::::: */ /* :::::::: */
/* free_token.c :+: :+: :+: */ /* free_token.c :+: :+: */
/* +:+ +:+ +:+ */ /* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+ */
/* Created: 2025/02/05 19:07:45 by qmennen #+# #+# */ /* Created: 2025/02/05 19:07:45 by qmennen #+# #+# */
/* Updated: 2025/02/05 19:07:54 by qmennen ### ########.fr */ /* Updated: 2025/02/25 16:17:52 by whaffman ######## odam.nl */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "minishell.h" #include "minishell.h"
void ft_token_free(t_token *token) void ft_token_free(t_minishell *minishell, t_token *token)
{ {
if (token->value) if (token->value)
free(token->value); free_safe(minishell, (void **)&token->value);
free(token); free_safe(minishell, (void **)&token);
} }

View File

@ -1,21 +1,21 @@
/* ************************************************************************** */ /* ************************************************************************** */
/* */ /* */
/* ::: :::::::: */ /* :::::::: */
/* free_token_list.c :+: :+: :+: */ /* free_token_list.c :+: :+: */
/* +:+ +:+ +:+ */ /* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+ */
/* Created: 2025/02/05 19:08:14 by qmennen #+# #+# */ /* Created: 2025/02/05 19:08:14 by qmennen #+# #+# */
/* Updated: 2025/02/05 19:08:31 by qmennen ### ########.fr */ /* Updated: 2025/02/25 16:18:44 by whaffman ######## odam.nl */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "minishell.h" #include "minishell.h"
void ft_clear_tokenlist(void *content) void ft_clear_tokenlist(t_minishell *minishell, void *content)
{ {
t_token *token; t_token *token;
token = (t_token *)content; token = (t_token *)content;
ft_token_free(token); ft_token_free(minishell, token);
} }

View File

@ -0,0 +1,30 @@
/* ************************************************************************** */
/* */
/* :::::::: */
/* minishell_lstclear.c :+: :+: */
/* +:+ */
/* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */
/* 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 **)&current);
current = next;
}
*lst = NULL;
}

View File

@ -0,0 +1,23 @@
/* ************************************************************************** */
/* */
/* :::::::: */
/* minishell_lstnew.c :+: :+: */
/* +:+ */
/* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */
/* 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);
}