From 3631e127e4b8085de880fb437f53116b6cbcdf2a Mon Sep 17 00:00:00 2001 From: whaffman Date: Fri, 21 Feb 2025 13:03:49 +0100 Subject: [PATCH 01/12] 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 02/12] 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 03/12] 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 e83df82dc344595b7765c75bf8bcce8121a8f3cd Mon Sep 17 00:00:00 2001 From: whaffman Date: Sun, 23 Feb 2025 11:59:59 +0100 Subject: [PATCH 04/12] 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 05/12] 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 757aea646414e21dd0d56540928034b38b229dd0 Mon Sep 17 00:00:00 2001 From: whaffman Date: Sun, 23 Feb 2025 13:33:09 +0100 Subject: [PATCH 06/12] 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 07/12] 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 08/12] 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 09/12] 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 10/12] 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 11/12] 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 12/12] 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();